From ab299619dd1c81e61a5fc0b27ad15519334bb839 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Wed, 10 Jan 2024 13:32:07 -0500 Subject: [PATCH 01/17] Update Packages. Signed-off-by: Dave Richer --- client/src/App/App.styles.scss | 3 +++ client/src/components/header/header.component.jsx | 3 +++ 2 files changed, 6 insertions(+) diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index 50e656895..736093151 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -1,5 +1,8 @@ //Global Styles. @import "react-big-calendar/lib/sass/styles"; +.ant-menu-item-divider { + border-bottom: 1px solid #74695c !important; +} .imex-table-header { display: flex; diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index a1a567b9b..7955e6970 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -255,6 +255,9 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut icon: , label: ({t("menus.header.alljobs")}) }, + { + type: 'divider', + }, { key: 'productionlist', icon: , From d3654ec16e20f1554bda59ed9b77c8cad0269145 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 01:29:36 -0500 Subject: [PATCH 02/17] Progress Update. Signed-off-by: Dave Richer --- client/src/App/App.jsx | 44 ++-- .../chat-affix/chat-affix.container.jsx | 71 +++--- .../components/header/header.component.jsx | 40 +++- .../pages/manage/manage.page.component.jsx | 6 +- client/src/redux/store.js | 4 +- client/src/utils/betaHandler.js | 32 +++ client/src/utils/useKeyboardShortcut.jsx | 211 +++++++++--------- 7 files changed, 237 insertions(+), 171 deletions(-) create mode 100644 client/src/utils/betaHandler.js diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index faa8cc211..9243db625 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -1,7 +1,7 @@ import {useSplitClient} from "@splitsoftware/splitio-react"; import {Button, Result} from "antd"; import LogRocket from "logrocket"; -import React, {lazy, Suspense, useEffect} from "react"; +import React, {lazy, Suspense, useEffect, useState} from "react"; import {useTranslation} from "react-i18next"; import {connect} from "react-redux"; import {Route, Routes} from "react-router-dom"; @@ -19,6 +19,7 @@ import {checkUserSession} from "../redux/user/user.actions"; import {selectBodyshop, selectCurrentUser,} from "../redux/user/user.selectors"; import PrivateRoute from "../components/PrivateRoute"; import "./App.styles.scss"; +import handleBeta from "../utils/betaHandler"; const ResetPassword = lazy(() => import("../pages/reset-password/reset-password.component") @@ -40,14 +41,16 @@ const mapDispatchToProps = (dispatch) => ({ setOnline: (isOnline) => dispatch(setOnline(isOnline)), }); -export function App({ - bodyshop, - checkUserSession, - currentUser, - online, - setOnline, - }) { +export function App({bodyshop, checkUserSession, currentUser, online, setOnline}) { + const client = useSplitClient().client; + const [listenersAdded, setListenersAdded] = useState(false) + const {t} = useTranslation(); + + // Handle The Beta Switch. + useEffect(() => { + handleBeta(); + }, []) useEffect(() => { if (!navigator.onLine) { @@ -60,15 +63,28 @@ export function App({ //const b = Grid.useBreakpoint(); // console.log("Breakpoints:", b); - const {t} = useTranslation(); - - window.addEventListener("offline", function (e) { + const offlineListener = (e) => { setOnline(false); - }); + } - window.addEventListener("online", function (e) { + const onlineListener = (e) => { setOnline(true); - }); + } + + // Associate event listeners, memoize to prevent multiple listeners being added + useEffect(() => { + if (!listenersAdded) { + console.log('Added events for offline and online'); + window.addEventListener("offline", offlineListener); + window.addEventListener("online", onlineListener); + setListenersAdded(true); + } + + return () => { + window.removeEventListener("offline", offlineListener); + window.removeEventListener("online", onlineListener); + } + }, [listenersAdded]); useEffect(() => { if (currentUser.authorized && bodyshop) { diff --git a/client/src/components/chat-affix/chat-affix.container.jsx b/client/src/components/chat-affix/chat-affix.container.jsx index 55fab18bd..272028fe1 100644 --- a/client/src/components/chat-affix/chat-affix.container.jsx +++ b/client/src/components/chat-affix/chat-affix.container.jsx @@ -4,20 +4,11 @@ import { Button, notification, Space } from "antd"; import axios from "axios"; import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; import { messaging, requestForToken } from "../../firebase/firebase.utils"; -import { selectChatVisible } from "../../redux/messaging/messaging.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; import FcmHandler from "../../utils/fcm-handler"; import ChatPopupComponent from "../chat-popup/chat-popup.component"; import "./chat-affix.styles.scss"; -const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, - chatVisible: selectChatVisible, -}); - export function ChatAffixContainer({ bodyshop, chatVisible }) { const { t } = useTranslation(); const client = useApolloClient(); @@ -36,35 +27,34 @@ export function ChatAffixContainer({ bodyshop, chatVisible }) { console.log("FCM Topic Subscription", r.data); } catch (error) { console.log( - "Error attempting to subscribe to messaging topic: ", - error + "Error attempting to subscribe to messaging topic: ", + error ); notification.open({ type: "warning", message: t("general.errors.fcm"), btn: ( - - - - + + + + ), }); } @@ -81,16 +71,16 @@ export function ChatAffixContainer({ bodyshop, chatVisible }) { payload: (payload && payload.data && payload.data.data) || payload.data, }); } - let stopMessageListenr, channel; + let stopMessageListener, channel; try { - stopMessageListenr = onMessage(messaging, handleMessage); + stopMessageListener = onMessage(messaging, handleMessage); channel = new BroadcastChannel("imex-sw-messages"); channel.addEventListener("message", handleMessage); } catch (error) { console.log("Unable to set event listeners."); } return () => { - stopMessageListenr && stopMessageListenr(); + stopMessageListener && stopMessageListener(); channel && channel.removeEventListener("message", handleMessage); }; }, [client]); @@ -98,9 +88,10 @@ export function ChatAffixContainer({ bodyshop, chatVisible }) { if (!bodyshop || !bodyshop.messagingservicesid) return <>; return ( -
- {bodyshop && bodyshop.messagingservicesid ? : null} -
+
+ {bodyshop && bodyshop.messagingservicesid ? : null} +
); } -export default connect(mapStateToProps, null)(ChatAffixContainer); + +export default ChatAffixContainer; \ No newline at end of file diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index 7955e6970..21a719c2d 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -12,7 +12,7 @@ import Icon, { FileAddOutlined, FileFilled, HomeFilled, - ImportOutlined, + ImportOutlined, InfoCircleOutlined, LineChartOutlined, PaperClipOutlined, PhoneOutlined, @@ -25,8 +25,8 @@ import Icon, { UserOutlined, } from "@ant-design/icons"; import {useSplitTreatments} from "@splitsoftware/splitio-react"; -import {Layout, Menu} from "antd"; -import React from "react"; +import {Layout, Menu, Switch, Tooltip} from "antd"; +import React, {useEffect, useState} from "react"; import {useTranslation} from "react-i18next"; import {BsKanban} from "react-icons/bs"; import {FaCalendarAlt, FaCarCrash, FaCreditCard, FaFileInvoiceDollar,} from "react-icons/fa"; @@ -41,6 +41,7 @@ import {setModalContext} from "../../redux/modals/modals.actions"; import {signOutStart} from "../../redux/user/user.actions"; import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors"; import {FiLogOut} from "react-icons/fi"; +import handleBeta, {checkBeta, setBeta} from "../../utils/betaHandler"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -70,9 +71,21 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut names: ["ImEXPay", "DmsAp", "Simple_Inventory"], splitKey: bodyshop && bodyshop.imexshopid, }); - + const [betaSwitch, setBetaSwitch] = useState(false); const {t} = useTranslation(); + useEffect(() => { + const isBeta = checkBeta(); + setBetaSwitch(isBeta ); + }, []); + + + const betaSwitchChange = (checked) => { + setBeta(checked); + setBetaSwitch(checked); + handleBeta(); + } + const accountingChildren = [ { key: 'bills', @@ -451,13 +464,28 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut })), } - ] + ]; + + + menuItems.push({ + key: 'beta-switch', + style: { marginLeft: 'auto' }, + label: ( + + + Try the new ImEX Online + + + ) + }); return ( { const widgetId = "IABVNO4scRKY11XBQkNr"; @@ -360,7 +362,7 @@ export function Manage({conflict, bodyshop}) { return ( <> - + diff --git a/client/src/redux/store.js b/client/src/redux/store.js index 19d33bb38..b83b80ffa 100644 --- a/client/src/redux/store.js +++ b/client/src/redux/store.js @@ -42,9 +42,7 @@ if (process.env.NODE_ENV === "development") { export const store = configureStore({ reducer: rootReducer, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ - serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], - }, + serializableCheck: false, }).concat(middlewares), // middleware: middlewares, devTools: process.env.NODE_ENV !== 'production', diff --git a/client/src/utils/betaHandler.js b/client/src/utils/betaHandler.js new file mode 100644 index 000000000..195796175 --- /dev/null +++ b/client/src/utils/betaHandler.js @@ -0,0 +1,32 @@ +export const BETA_KEY = 'betaSwitchImex'; + +export const checkBeta = () => document.cookie.split('; ').find(row => row.startsWith(BETA_KEY)).split('=')[1] === 'true'; + + +export const setBeta = (value) => { + const domain = window.location.hostname.split('.').slice(-2).join('.'); + document.cookie = `${BETA_KEY}=${value}; path=/; domain=.${domain}`; +} + +export const handleBeta = () => { + // If the current host name does not start with beta or test, then we don't need to do anything. + if (window.location.hostname.startsWith('localhost')) { + console.log('Not on beta or test, so no need to handle beta.'); + return; + } + + const isBeta = checkBeta(); + + const currentHostName = window.location.hostname; + + // Beta is enabled, but the current host name does start with beta. + if (isBeta && !currentHostName.startsWith('beta')) { + window.location.href = `${window.location.protocol}//beta.${currentHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; + } + + // Beta is not enabled, but the current host name does start with beta. + else if (!isBeta && currentHostName.startsWith('beta')) { + window.location.href = `${window.location.protocol}//${currentHostName.replace('beta.', '')}${window.location.pathname}${window.location.search}${window.location.hash}`; + } +} +export default handleBeta; \ No newline at end of file diff --git a/client/src/utils/useKeyboardShortcut.jsx b/client/src/utils/useKeyboardShortcut.jsx index 1f31def21..32148b9ec 100644 --- a/client/src/utils/useKeyboardShortcut.jsx +++ b/client/src/utils/useKeyboardShortcut.jsx @@ -1,129 +1,128 @@ -import { useEffect, useCallback, useReducer } from "react"; +import {useCallback, useEffect, useReducer, useState} from "react"; //Based on https://www.fullstacklabs.co/blog/keyboard-shortcuts-with-react-hooks const blacklistedTargets = []; // ["INPUT", "TEXTAREA"]; export const useKeyboardSaveShortcut = (callback) => - useKeyboardShortcut(["Control", "S"], callback, { overrideSystem: true }); + useKeyboardShortcut(["Control", "S"], callback, {overrideSystem: true}); const keysReducer = (state, action) => { - switch (action.type) { - case "set-key-down": - const keydownState = { ...state, [action.key]: true }; - return keydownState; - case "set-key-up": - const keyUpState = { ...state, [action.key]: false }; - return keyUpState; - case "reset-keys": - const resetState = { ...action.data }; - return resetState; - default: - return state; - } + switch (action.type) { + case "set-key-down": + const keydownState = {...state, [action.key]: true}; + return keydownState; + case "set-key-up": + const keyUpState = {...state, [action.key]: false}; + return keyUpState; + case "reset-keys": + const resetState = {...action.data}; + return resetState; + default: + return state; + } }; const useKeyboardShortcut = (shortcutKeys, callback, options) => { - if (!Array.isArray(shortcutKeys)) - throw new Error( - "The first parameter to `useKeyboardShortcut` must be an ordered array of `KeyboardEvent.key` strings." + if (!Array.isArray(shortcutKeys)) + throw new Error( + "The first parameter to `useKeyboardShortcut` must be an ordered array of `KeyboardEvent.key` strings." + ); + + if (!shortcutKeys.length) + throw new Error( + "The first parameter to `useKeyboardShortcut` must contain atleast one `KeyboardEvent.key` string." + ); + + if (!callback || typeof callback !== "function") + throw new Error( + "The second parameter to `useKeyboardShortcut` must be a function that will be envoked when the keys are pressed." + ); + + const {overrideSystem} = options || {}; + const initalKeyMapping = shortcutKeys.reduce((currentKeys, key) => { + currentKeys[key.toLowerCase()] = false; + return currentKeys; + }, {}); + + const [keys, setKeys] = useReducer(keysReducer, initalKeyMapping); + const [listenersAdded, setListenersAdded] = useState(false); + + const keydownListener = useCallback( + (assignedKey) => (keydownEvent) => { + const loweredKey = assignedKey.toLowerCase(); + + if (keydownEvent.repeat) return; + if (blacklistedTargets.includes(keydownEvent.target.tagName)) return; + if (loweredKey !== keydownEvent.key.toLowerCase()) return; + if (keys[loweredKey] === undefined) return; + + if (overrideSystem) { + keydownEvent.preventDefault(); + disabledEventPropagation(keydownEvent); + } + + setKeys({type: "set-key-down", key: loweredKey}); + return false; + }, + [keys, overrideSystem] ); - if (!shortcutKeys.length) - throw new Error( - "The first parameter to `useKeyboardShortcut` must contain atleast one `KeyboardEvent.key` string." + const keyupListener = useCallback( + (assignedKey) => (keyupEvent) => { + const raisedKey = assignedKey.toLowerCase(); + + if (blacklistedTargets.includes(keyupEvent.target.tagName)) return; + if (keyupEvent.key.toLowerCase() !== raisedKey) return; + if (keys[raisedKey] === undefined) return; + + if (overrideSystem) { + keyupEvent.preventDefault(); + disabledEventPropagation(keyupEvent); + } + + setKeys({type: "set-key-up", key: raisedKey}); + return false; + }, + [keys, overrideSystem] ); - if (!callback || typeof callback !== "function") - throw new Error( - "The second parameter to `useKeyboardShortcut` must be a function that will be envoked when the keys are pressed." - ); + useEffect(() => { + if (!Object.values(keys).filter((value) => !value).length) { + callback(keys); + setKeys({type: "reset-keys", data: initalKeyMapping}); + } else { + setKeys({type: null}); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [callback, keys]); - const { overrideSystem } = options || {}; - const initalKeyMapping = shortcutKeys.reduce((currentKeys, key) => { - currentKeys[key.toLowerCase()] = false; - return currentKeys; - }, {}); + useEffect(() => { + if (!listenersAdded) { + console.log('Added events for keyup and keydown'); + shortcutKeys.forEach((k) => { + window.addEventListener("keydown", keydownListener(k)); + window.addEventListener("keyup", keyupListener(k)) + }); + } - const [keys, setKeys] = useReducer(keysReducer, initalKeyMapping); + setListenersAdded(true); - const keydownListener = useCallback( - (assignedKey) => (keydownEvent) => { - const loweredKey = assignedKey.toLowerCase(); + return () => { + shortcutKeys.forEach((k) => { + window.removeEventListener("keydown", keydownListener(k)); + window.removeEventListener("keyup", keyupListener(k)); + }); + } + }, [listenersAdded]); - if (keydownEvent.repeat) return; - if (blacklistedTargets.includes(keydownEvent.target.tagName)) return; - if (loweredKey !== keydownEvent.key.toLowerCase()) return; - if (keys[loweredKey] === undefined) return; - - if (overrideSystem) { - keydownEvent.preventDefault(); - disabledEventPropagation(keydownEvent); - } - - setKeys({ type: "set-key-down", key: loweredKey }); - return false; - }, - [keys, overrideSystem] - ); - - const keyupListener = useCallback( - (assignedKey) => (keyupEvent) => { - const raisedKey = assignedKey.toLowerCase(); - - if (blacklistedTargets.includes(keyupEvent.target.tagName)) return; - if (keyupEvent.key.toLowerCase() !== raisedKey) return; - if (keys[raisedKey] === undefined) return; - - if (overrideSystem) { - keyupEvent.preventDefault(); - disabledEventPropagation(keyupEvent); - } - - setKeys({ type: "set-key-up", key: raisedKey }); - return false; - }, - [keys, overrideSystem] - ); - - useEffect(() => { - if (!Object.values(keys).filter((value) => !value).length) { - callback(keys); - setKeys({ type: "reset-keys", data: initalKeyMapping }); - } else { - setKeys({ type: null }); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [callback, keys]); - - useEffect(() => { - shortcutKeys.forEach((k) => - window.addEventListener("keydown", keydownListener(k)) - ); - return () => - shortcutKeys.forEach((k) => - window.removeEventListener("keydown", keydownListener(k)) - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - shortcutKeys.forEach((k) => - window.addEventListener("keyup", keyupListener(k)) - ); - return () => - shortcutKeys.forEach((k) => - window.removeEventListener("keyup", keyupListener(k)) - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); }; export default useKeyboardShortcut; function disabledEventPropagation(e) { - if (e) { - if (e.stopPropagation) { - e.stopPropagation(); - } else if (window.event) { - window.event.cancelBubble = true; + if (e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else if (window.event) { + window.event.cancelBubble = true; + } } - } } From 05667dd322b8fd619fdd3fe20266ac69711ca473 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 12:19:20 -0500 Subject: [PATCH 03/17] Progress Update. Signed-off-by: Dave Richer --- client/src/utils/betaHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/utils/betaHandler.js b/client/src/utils/betaHandler.js index 195796175..efe8e3a07 100644 --- a/client/src/utils/betaHandler.js +++ b/client/src/utils/betaHandler.js @@ -1,6 +1,6 @@ export const BETA_KEY = 'betaSwitchImex'; -export const checkBeta = () => document.cookie.split('; ').find(row => row.startsWith(BETA_KEY)).split('=')[1] === 'true'; +export const checkBeta = () => document.cookie?.split('; ')?.find(row => row.startsWith(BETA_KEY)).split('=')[1] === 'true'; export const setBeta = (value) => { From 0635c651a212919b7611cf02a821e4b9883aa774 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 12:21:59 -0500 Subject: [PATCH 04/17] Progress Update. Signed-off-by: Dave Richer --- client/src/utils/betaHandler.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/utils/betaHandler.js b/client/src/utils/betaHandler.js index efe8e3a07..a5587d97a 100644 --- a/client/src/utils/betaHandler.js +++ b/client/src/utils/betaHandler.js @@ -1,6 +1,9 @@ export const BETA_KEY = 'betaSwitchImex'; -export const checkBeta = () => document.cookie?.split('; ')?.find(row => row.startsWith(BETA_KEY)).split('=')[1] === 'true'; +export const checkBeta = () => { + const cookie = document.cookie.split('; ').find(row => row.startsWith(BETA_KEY)); + return cookie ? cookie.split('=')[1] === 'true' : false; +} export const setBeta = (value) => { From c2dbdbd6cfff20cefb3724cb913ac1d69602934b Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 12:24:58 -0500 Subject: [PATCH 05/17] Progress Update. Signed-off-by: Dave Richer --- client/src/redux/store.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/client/src/redux/store.js b/client/src/redux/store.js index b83b80ffa..ae8a328d2 100644 --- a/client/src/redux/store.js +++ b/client/src/redux/store.js @@ -1,12 +1,6 @@ import { configureStore } from '@reduxjs/toolkit'; import { persistStore, - FLUSH, - REHYDRATE, - PAUSE, - PERSIST, - PURGE, - REGISTER } from "redux-persist"; import { createLogger } from "redux-logger"; import createSagaMiddleware from "redux-saga"; From 49131ba68bc898e1744d386b37198481d876114b Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 12:32:51 -0500 Subject: [PATCH 06/17] fix linting errors Signed-off-by: Dave Richer --- client/src/App/App.jsx | 18 +++++++++--------- .../src/pages/manage/manage.page.component.jsx | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index 9243db625..dd695863c 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -63,16 +63,16 @@ export function App({bodyshop, checkUserSession, currentUser, online, setOnline} //const b = Grid.useBreakpoint(); // console.log("Breakpoints:", b); - const offlineListener = (e) => { - setOnline(false); - } - - const onlineListener = (e) => { - setOnline(true); - } - // Associate event listeners, memoize to prevent multiple listeners being added useEffect(() => { + const offlineListener = (e) => { + setOnline(false); + } + + const onlineListener = (e) => { + setOnline(true); + } + if (!listenersAdded) { console.log('Added events for offline and online'); window.addEventListener("offline", offlineListener); @@ -84,7 +84,7 @@ export function App({bodyshop, checkUserSession, currentUser, online, setOnline} window.removeEventListener("offline", offlineListener); window.removeEventListener("online", onlineListener); } - }, [listenersAdded]); + }, [setOnline, listenersAdded]); useEffect(() => { if (currentUser.authorized && bodyshop) { diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index f8268142b..f3c71bed2 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -177,7 +177,7 @@ const mapStateToProps = createStructuredSelector({ export function Manage({conflict, bodyshop}) { const {t} = useTranslation(); - const [chatVisible, setChatVisible] = useState(false); + const [chatVisible] = useState(false); useEffect(() => { From 663dfe0441423c5ab8d1e84d57ec74c8fc7e4dbf Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 15:11:28 -0500 Subject: [PATCH 07/17] Misc Issues Signed-off-by: Dave Richer --- .../form-date-picker.component.jsx | 10 +-- .../components/header/header.component.jsx | 64 ++++++++++++------- .../jobs-admin-dates.component.jsx | 3 +- .../jobs-detail-header-actions.component.jsx | 10 +++ .../schedule-job-modal.container.jsx | 2 +- 5 files changed, 54 insertions(+), 35 deletions(-) diff --git a/client/src/components/form-date-picker/form-date-picker.component.jsx b/client/src/components/form-date-picker/form-date-picker.component.jsx index aba56a059..0f84fe68e 100644 --- a/client/src/components/form-date-picker/form-date-picker.component.jsx +++ b/client/src/components/form-date-picker/form-date-picker.component.jsx @@ -16,15 +16,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(FormDatePicker); const dateFormat = "MM/DD/YYYY"; -export function FormDatePicker({ - bodyshop, - value, - onChange, - onBlur, - onlyFuture, - isDateOnly = true, - ...restProps - }) { +export function FormDatePicker({bodyshop, value, onChange, onBlur, onlyFuture, isDateOnly = true, ...restProps }) { const ref = useRef(); const handleChange = (newDate) => { diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index 21a719c2d..8bf53c24d 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -12,7 +12,8 @@ import Icon, { FileAddOutlined, FileFilled, HomeFilled, - ImportOutlined, InfoCircleOutlined, + ImportOutlined, + InfoCircleOutlined, LineChartOutlined, PaperClipOutlined, PhoneOutlined, @@ -64,7 +65,19 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(setModalContext({context: context, modal: "cardPayment"})), }); -function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOutStart, setBillEnterContext, setTimeTicketContext, setPaymentContext, setReportCenterContext, recentItems, setCardPaymentContext}) { +function Header({ + handleMenuClick, + currentUser, + bodyshop, + selectedHeader, + signOutStart, + setBillEnterContext, + setTimeTicketContext, + setPaymentContext, + setReportCenterContext, + recentItems, + setCardPaymentContext + }) { const {treatments: {ImEXPay, DmsAp, Simple_Inventory}} = useSplitTreatments({ attributes: {}, @@ -76,7 +89,7 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut useEffect(() => { const isBeta = checkBeta(); - setBetaSwitch(isBeta ); + setBetaSwitch(isBeta); }, []); @@ -186,7 +199,7 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut { key: 'receivables', label: ({t("menus.header.accounting-receivables")}) - } + }, ] if (!((bodyshop && bodyshop.cdk_dealerid) || (bodyshop && bodyshop.pbs_serialnumber)) || DmsAp.treatment === "on") { @@ -206,17 +219,20 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut }); } - accountingExportChildren.push( - { - key: 'exportlogs', - label: ({t("menus.header.export-logs")}) - }, + accountingExportChildren.push({ + type: 'divider', + }, { + key: 'exportlogs', + label: ({t("menus.header.export-logs")}) + }); + + accountingChildren.push( { key: 'accountingexport', icon: , label: t("menus.header.export"), children: accountingExportChildren - } + }, ); const menuItems = [ @@ -467,20 +483,20 @@ function Header({handleMenuClick, currentUser, bodyshop, selectedHeader, signOut ]; - menuItems.push({ - key: 'beta-switch', - style: { marginLeft: 'auto' }, - label: ( - - - Try the new ImEX Online - - - ) - }); + menuItems.push({ + key: 'beta-switch', + style: {marginLeft: 'auto'}, + label: ( + + + Try the new ImEX Online + + + ) + }); return ( diff --git a/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx b/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx index 0ecb1128b..349a2a958 100644 --- a/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx +++ b/client/src/components/jobs-admin-dates/jobs-admin-dates.component.jsx @@ -69,8 +69,9 @@ export function JobsAdminDatesChange({ insertAuditTrail, job }) { }), }); } + form.resetFields(); - form.resetFields(); + setLoading(false); //Get the owner details, populate it all back into the job. }; diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index e8a286a15..0dd4e0b4d 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -588,6 +588,7 @@ export function JobsDetailHeaderActions({ const menuItems = [ { + key: 'schedule', disabled: !jobInPreProduction || !job.converted || jobRO, label: t("jobs.actions.schedule"), onClick: () => { @@ -603,6 +604,7 @@ export function JobsDetailHeaderActions({ }, }, { + key: 'cancelallappointments', disabled: job.status !== bodyshop.md_ro_statuses.default_scheduled, label: job.status !== bodyshop.md_ro_statuses.default_scheduled ? ( t("menus.jobsactions.cancelallappointments") @@ -648,6 +650,7 @@ export function JobsDetailHeaderActions({ ) }, { + key: 'intake', disabled: !!job.intakechecklist || !jobInPreProduction || !job.converted || jobRO, label: !!job.intakechecklist || !jobInPreProduction || !job.converted || jobRO ? ( t("jobs.actions.intake") @@ -658,6 +661,7 @@ export function JobsDetailHeaderActions({ ) }, { + key: 'deliver', disabled: !jobInProduction || jobRO, label: !jobInProduction ? ( t("jobs.actions.deliver") @@ -668,6 +672,7 @@ export function JobsDetailHeaderActions({ ) }, { + key: 'checklist', disabled: !job.converted, label: {t("jobs.actions.viewchecklist")} @@ -771,6 +776,7 @@ export function JobsDetailHeaderActions({ label: t("menus.jobsactions.duplicate"), children: [ { + key: 'duplicate', label: }, { + key: 'duplicatenolines', label: { setVisibility(true); }, @@ -974,6 +983,7 @@ export function JobsDetailHeaderActions({ if (!jobRO && job.converted) { menuItems.push({ + key: 'voidjob', label: Date: Thu, 11 Jan 2024 15:36:17 -0500 Subject: [PATCH 08/17] Misc Issues Signed-off-by: Dave Richer --- .../components/bill-detail-edit/bill-detail-edit-component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx index 36b1111f1..47037f5d6 100644 --- a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx +++ b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx @@ -178,7 +178,7 @@ export function BillDetailEditcontainer({setPartsOrderContext, insertAuditTrail, form.submit()} onCancel={() => setVisible(false)} okButtonProps={{ loading: updateLoading }} From 5aa3612e521abe38414a5cde3cc07a8ce959c454 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 11 Jan 2024 15:50:13 -0500 Subject: [PATCH 09/17] Misc Issues Signed-off-by: Dave Richer --- .../jobs-detail-header-actions.component.jsx | 2 -- .../owner-find-modal/owner-find-modal.container.jsx | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index 0dd4e0b4d..ddffba3f8 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -963,7 +963,6 @@ export function JobsDetailHeaderActions({ cancelText={t("general.labels.no")} onClick={(e) => e.stopPropagation()} onConfirm={handleDeleteJob} - getPopupContainer={(trigger) => trigger.parentNode} > {t("menus.jobsactions.deletejob")} @@ -991,7 +990,6 @@ export function JobsDetailHeaderActions({ cancelText="No" onClick={(e) => e.stopPropagation()} onConfirm={handleVoidJob} - getPopupContainer={(trigger) => trigger.parentNode} > {t("menus.jobsactions.void")} diff --git a/client/src/components/owner-find-modal/owner-find-modal.container.jsx b/client/src/components/owner-find-modal/owner-find-modal.container.jsx index f6c9453d7..788d552c8 100644 --- a/client/src/components/owner-find-modal/owner-find-modal.container.jsx +++ b/client/src/components/owner-find-modal/owner-find-modal.container.jsx @@ -32,13 +32,13 @@ export default function OwnerFindModalContainer({ ); useEffect(() => { - if (modalProps.visible && owner) { + if (modalProps.open && owner) { const s = OwnerNameDisplayFunction(owner, true); setSearchText(s.trim()); callSearchowners({ variables: { search: s.trim() } }); } - }, [callSearchowners, modalProps.visible, owner]); + }, [callSearchowners, modalProps.open, owner]); return ( Date: Thu, 11 Jan 2024 15:58:35 -0500 Subject: [PATCH 10/17] Job Close fixed Signed-off-by: Dave Richer --- .../jobs-close-auto-allocate.component.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx index fc81646da..a7bc4548c 100644 --- a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx +++ b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx @@ -62,13 +62,15 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) { ); }; - const menu = { + const menu =bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? { items: bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => ({ key: mapping.name, label: mapping.name, disabled: disabled, })), onClick: handleMenuClick, + } : { + items: [] } return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? ( From ef0bc8c3133de43a890ec0e9fb6da57f52b3d60d Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Fri, 12 Jan 2024 12:11:14 -0500 Subject: [PATCH 11/17] Fix Danger Buttons Signed-off-by: Dave Richer --- .../jobs-convert-button/jobs-convert-button.component.jsx | 5 +++-- .../owner-detail-form/owner-detail-form.container.jsx | 3 ++- .../components/phonebook-form/phonebook-form.component.jsx | 3 ++- .../production-list-save-config-button.component.jsx | 2 +- .../vehicle-detail-form/vehicle-detail-form.container.jsx | 3 ++- .../src/components/vendors-form/vendors-form.component.jsx | 3 ++- client/src/pages/jobs-close/jobs-close.component.jsx | 2 +- 7 files changed, 13 insertions(+), 8 deletions(-) diff --git a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx index 714b85fff..e1617ed60 100644 --- a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx +++ b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx @@ -243,7 +243,7 @@ export function JobsConvertButton({ - From 9fc586434eb54bb7701ed1d3daff4a0f577d1326 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Fri, 12 Jan 2024 13:58:05 -0500 Subject: [PATCH 12/17] - IO-2684 (Flex issues, taken care of here and a few other places) - Add Log Rocket on beta.imex.online - Updated Frontend and Backend npm packages, please do a NPM install on both Signed-off-by: Dave Richer --- client/package-lock.json | 277 ++++++++-------- client/package.json | 12 +- client/src/App/App.jsx | 5 +- .../chat-tag-ro/chat-tag-ro.component.jsx | 2 +- .../email-overlay/email-overlay.container.jsx | 1 - .../schedule-event.note.component.jsx | 2 +- .../vehicle-detail-form.container.jsx | 2 + package-lock.json | 312 +++++++++--------- package.json | 8 +- 9 files changed, 320 insertions(+), 301 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 2fa95fadb..5040547ae 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -16,8 +16,8 @@ "@fingerprintjs/fingerprintjs": "^4.2.1", "@jsreport/browser-client": "^3.1.0", "@reduxjs/toolkit": "^2.0.1", - "@sentry/react": "^7.92.0", - "@sentry/tracing": "^7.92.0", + "@sentry/react": "^7.93.0", + "@sentry/tracing": "^7.93.0", "@splitsoftware/splitio-react": "^1.10.2", "@tanem/react-nprogress": "^5.0.51", "antd": "^5.12.8", @@ -56,13 +56,13 @@ "react-grid-gallery": "^1.0.0", "react-grid-layout": "^1.3.4", "react-i18next": "^14.0.0", - "react-icons": "^4.7.1", + "react-icons": "^5.0.1", "react-image-lightbox": "^5.1.4", "react-intersection-observer": "^9.5.3", "react-number-format": "^5.1.4", - "react-redux": "^9.0.4", + "react-redux": "^9.1.0", "react-resizable": "^3.0.5", - "react-router-dom": "^6.21.1", + "react-router-dom": "^6.21.2", "react-scripts": "^5.0.1", "react-sticky": "^6.0.3", "react-sublime-video": "^0.2.5", @@ -74,7 +74,7 @@ "redux-state-sync": "^3.1.4", "reselect": "^5.1.0", "sass": "^1.69.7", - "socket.io-client": "^4.7.3", + "socket.io-client": "^4.7.4", "styled-components": "^6.1.8", "subscriptions-transport-ws": "^0.11.0", "terser-webpack-plugin": "^5.3.10", @@ -4402,9 +4402,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", - "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", + "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", "engines": { "node": ">=14.0.0" } @@ -4508,44 +4508,44 @@ "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==" }, "node_modules/@sentry-internal/feedback": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.92.0.tgz", - "integrity": "sha512-/jEALRtVqboxB9kcK2tag8QCO6XANTlGBb9RV3oeGXJe0DDNJXRq6wVZbfgztXJRrfgx4XVDcNt1pRVoGGG++g==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.93.0.tgz", + "integrity": "sha512-4G7rMeQbYGfCHxEoFroABX+UREYc2BSbFqjLmLbIcWowSpgzcwweLLphWHKOciqK6f7DnNDK0jZzx3u7NrkWHw==", "dependencies": { - "@sentry/core": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/feedback/node_modules/@sentry/core": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz", - "integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", "dependencies": { - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry-internal/feedback/node_modules/@sentry/types": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", - "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", "engines": { "node": ">=8" } }, "node_modules/@sentry-internal/feedback/node_modules/@sentry/utils": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", - "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", "dependencies": { - "@sentry/types": "7.92.0" + "@sentry/types": "7.93.0" }, "engines": { "node": ">=8" @@ -4566,60 +4566,60 @@ } }, "node_modules/@sentry/browser": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.92.0.tgz", - "integrity": "sha512-loMr02/zQ38u8aQhYLtIBg0i5n3ps2e3GUXrt3CdsJQdkRYfa62gcrE7SzvoEpMVHTk7VOI4fWGht8cWw/1k3A==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.93.0.tgz", + "integrity": "sha512-MtLTcQ7y3rfk+aIvnnwCfSJvYhTJnIJi+Mf6y/ap6SKObdlsKMbQoJLlRViglGLq+nKxHLAvU0fONiCEmKfV6A==", "dependencies": { - "@sentry-internal/feedback": "7.92.0", - "@sentry-internal/tracing": "7.92.0", - "@sentry/core": "7.92.0", - "@sentry/replay": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry-internal/feedback": "7.93.0", + "@sentry-internal/tracing": "7.93.0", + "@sentry/core": "7.93.0", + "@sentry/replay": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser/node_modules/@sentry-internal/tracing": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.92.0.tgz", - "integrity": "sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==", "dependencies": { - "@sentry/core": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser/node_modules/@sentry/core": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz", - "integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", "dependencies": { - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser/node_modules/@sentry/types": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", - "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", "engines": { "node": ">=8" } }, "node_modules/@sentry/browser/node_modules/@sentry/utils": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", - "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", "dependencies": { - "@sentry/types": "7.92.0" + "@sentry/types": "7.93.0" }, "engines": { "node": ">=8" @@ -4817,13 +4817,14 @@ } }, "node_modules/@sentry/react": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.92.0.tgz", - "integrity": "sha512-lTvrLuvxtGEZbkW6NHru03K6eyixKyBliwiLwO+k37FK7Ha8Bwat2m77weyizWCdQ6DKlVazJNppkNeAlACIvQ==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.93.0.tgz", + "integrity": "sha512-B0bzziV1lEyN7xd0orUPyJdpoK6CtcyodmQkfY0WsHLm/1d9xi95M05lObHnsMWO1js6c9B9d9kO8RlKFz947A==", "dependencies": { - "@sentry/browser": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0", + "@sentry/browser": "7.93.0", + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -4833,133 +4834,145 @@ "react": "15.x || 16.x || 17.x || 18.x" } }, + "node_modules/@sentry/react/node_modules/@sentry/core": { + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", + "dependencies": { + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sentry/react/node_modules/@sentry/types": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", - "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", "engines": { "node": ">=8" } }, "node_modules/@sentry/react/node_modules/@sentry/utils": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", - "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", "dependencies": { - "@sentry/types": "7.92.0" + "@sentry/types": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/replay": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.92.0.tgz", - "integrity": "sha512-G1t9Uvc9cR8VpNkElwvHIMGzykjIKikb10n0tfVd3e+rBPMCCjCPWOduwG6jZYxcvCjTpqmJh6NSLXxL/Mt4JA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.93.0.tgz", + "integrity": "sha512-dMlLU8v+OkUeGCrPvTu5NriH7BGj3el4rGHWWAYicfJ2QXqTTq50vfasQBP1JeVNcFqnf1y653TdEIvo4RH4tw==", "dependencies": { - "@sentry-internal/tracing": "7.92.0", - "@sentry/core": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry-internal/tracing": "7.93.0", + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/replay/node_modules/@sentry-internal/tracing": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.92.0.tgz", - "integrity": "sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==", "dependencies": { - "@sentry/core": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/replay/node_modules/@sentry/core": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz", - "integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", "dependencies": { - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/replay/node_modules/@sentry/types": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", - "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", "engines": { "node": ">=8" } }, "node_modules/@sentry/replay/node_modules/@sentry/utils": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", - "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", "dependencies": { - "@sentry/types": "7.92.0" + "@sentry/types": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/tracing": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.92.0.tgz", - "integrity": "sha512-1+TFFPVEdax4dNi68gin6MENiyGe9mOuNXfjulrP5eCzUEByus5HAxeDI/LLQ1hArfn048AzwSwKUsS2fO5sbg==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-n4XbAQ7e098Jzv4ZvpXAsFgM+XFfjhKci18r7s3UfDMnrB4FTCwhHZoeiygO8PZhB944mEFbNXNFhHkb8nTDbA==", "dependencies": { - "@sentry-internal/tracing": "7.92.0" + "@sentry-internal/tracing": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/tracing/node_modules/@sentry-internal/tracing": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.92.0.tgz", - "integrity": "sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.93.0.tgz", + "integrity": "sha512-DjuhmQNywPp+8fxC9dvhGrqgsUb6wI/HQp25lS2Re7VxL1swCasvpkg8EOYP4iBniVQ86QK0uITkOIRc5tdY1w==", "dependencies": { - "@sentry/core": "7.92.0", - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/core": "7.93.0", + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/tracing/node_modules/@sentry/core": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz", - "integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.93.0.tgz", + "integrity": "sha512-vZQSUiDn73n+yu2fEcH+Wpm4GbRmtxmnXnYCPgM6IjnXqkVm3awWAkzrheADblx3kmxrRiOlTXYHw9NTWs56fg==", "dependencies": { - "@sentry/types": "7.92.0", - "@sentry/utils": "7.92.0" + "@sentry/types": "7.93.0", + "@sentry/utils": "7.93.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/tracing/node_modules/@sentry/types": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", - "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", + "integrity": "sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==", "engines": { "node": ">=8" } }, "node_modules/@sentry/tracing/node_modules/@sentry/utils": { - "version": "7.92.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", - "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", + "version": "7.93.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.93.0.tgz", + "integrity": "sha512-Iovj7tUnbgSkh/WrAaMrd5UuYjW7AzyzZlFDIUrwidsyIdUficjCG2OIxYzh76H6nYIx9SxewW0R54Q6XoB4uA==", "dependencies": { - "@sentry/types": "7.92.0" + "@sentry/types": "7.93.0" }, "engines": { "node": ">=8" @@ -18327,9 +18340,9 @@ } }, "node_modules/react-icons": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", - "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", "peerDependencies": { "react": "*" } @@ -18416,9 +18429,9 @@ } }, "node_modules/react-redux": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.0.4.tgz", - "integrity": "sha512-9J1xh8sWO0vYq2sCxK2My/QO7MzUMRi3rpiILP/+tDr8krBHixC6JMM17fMK88+Oh3e4Ae6/sHIhNBgkUivwFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", + "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -18462,11 +18475,11 @@ } }, "node_modules/react-router": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", - "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.2.tgz", + "integrity": "sha512-jJcgiwDsnaHIeC+IN7atO0XiSRCrOsQAHHbChtJxmgqG2IaYQXSnhqGb5vk2CU/wBQA12Zt+TkbuJjIn65gzbA==", "dependencies": { - "@remix-run/router": "1.14.1" + "@remix-run/router": "1.14.2" }, "engines": { "node": ">=14.0.0" @@ -18476,12 +18489,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", - "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.2.tgz", + "integrity": "sha512-tE13UukgUOh2/sqYr6jPzZTzmzc70aGRP4pAjG2if0IP3aUT+sBtAKUJh0qMh0zylJHGLmzS+XWVaON4UklHeg==", "dependencies": { - "@remix-run/router": "1.14.1", - "react-router": "6.21.1" + "@remix-run/router": "1.14.2", + "react-router": "6.21.2" }, "engines": { "node": ">=14.0.0" @@ -19793,9 +19806,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.3.tgz", - "integrity": "sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz", + "integrity": "sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", diff --git a/client/package.json b/client/package.json index 4d5cf59e8..f50df71ea 100644 --- a/client/package.json +++ b/client/package.json @@ -12,8 +12,8 @@ "@fingerprintjs/fingerprintjs": "^4.2.1", "@jsreport/browser-client": "^3.1.0", "@reduxjs/toolkit": "^2.0.1", - "@sentry/react": "^7.92.0", - "@sentry/tracing": "^7.92.0", + "@sentry/react": "^7.93.0", + "@sentry/tracing": "^7.93.0", "@splitsoftware/splitio-react": "^1.10.2", "@tanem/react-nprogress": "^5.0.51", "antd": "^5.12.8", @@ -52,13 +52,13 @@ "react-grid-gallery": "^1.0.0", "react-grid-layout": "^1.3.4", "react-i18next": "^14.0.0", - "react-icons": "^4.7.1", + "react-icons": "^5.0.1", "react-image-lightbox": "^5.1.4", "react-intersection-observer": "^9.5.3", "react-number-format": "^5.1.4", - "react-redux": "^9.0.4", + "react-redux": "^9.1.0", "react-resizable": "^3.0.5", - "react-router-dom": "^6.21.1", + "react-router-dom": "^6.21.2", "react-scripts": "^5.0.1", "react-sticky": "^6.0.3", "react-sublime-video": "^0.2.5", @@ -70,7 +70,7 @@ "redux-state-sync": "^3.1.4", "reselect": "^5.1.0", "sass": "^1.69.7", - "socket.io-client": "^4.7.3", + "socket.io-client": "^4.7.4", "styled-components": "^6.1.8", "subscriptions-transport-ws": "^0.11.0", "terser-webpack-plugin": "^5.3.10", diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index dd695863c..4f8695240 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -90,7 +90,10 @@ export function App({bodyshop, checkUserSession, currentUser, online, setOnline} if (currentUser.authorized && bodyshop) { client.setAttribute("imexshopid", bodyshop.imexshopid); - if (client.getTreatment("LogRocket_Tracking") === "on") { + if ( + client.getTreatment("LogRocket_Tracking") === "on" || + window.location.hostname === 'beta.imex.online' + ) { console.log("LR Start"); LogRocket.init("gvfvfw/bodyshopapp"); } diff --git a/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx index b6d33962f..0fdb251c8 100644 --- a/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx +++ b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx @@ -14,7 +14,7 @@ export default function ChatTagRoComponent({ const { t } = useTranslation(); return ( - +
({ - label: lsr, - value: lsr, - }))} - /> - - - - } - > - {t("menus.jobsactions.cancelallappointments")} - - ) + label: t("menus.jobsactions.cancelallappointments") }, { key: 'intake', @@ -1004,6 +987,47 @@ export function JobsDetailHeaderActions({ return ( <> + + {t("general.actions.cancel")} + , + , + ]} + > +
{ + console.log(s); + handleLostSaleFinish(s); + }} + > + +