From fda763476ab7fcc51df49756cd554c5f477a136d Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Wed, 4 Jun 2025 17:34:23 -0700 Subject: [PATCH] IO-3256 Product Fruits IDs Signed-off-by: Allan Carr --- .../bill-enter-modal.container.jsx | 15 ++++++------- .../bills-list-table.component.jsx | 3 ++- .../jobs-available-scan.component.jsx | 7 ++++--- ...obs-create-owner-info.search.component.jsx | 7 ++++--- ...s-create-vehicle-info.search.component.jsx | 11 +++++----- .../jobs-find-modal.component.jsx | 14 ++++++++----- .../jobs-find-modal.container.jsx | 3 +-- .../owner-find-modal.container.jsx | 5 +++-- .../shop-info/shop-info.component.jsx | 21 +++++++++---------- .../shop-info/shop-info.general.component.jsx | 5 ++--- .../jobs-detail.page.component.jsx | 12 +++++------ 11 files changed, 55 insertions(+), 48 deletions(-) diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx index 5041f007a..8073cc2f0 100644 --- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx +++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx @@ -2,10 +2,11 @@ import { useApolloClient, useMutation } from "@apollo/client"; import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { Button, Checkbox, Form, Modal, Space } from "antd"; import _ from "lodash"; -import React, { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; import { INSERT_NEW_BILL } from "../../graphql/bills.queries"; import { UPDATE_INVENTORY_LINES } from "../../graphql/inventory.queries"; import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; @@ -24,7 +25,6 @@ import BillFormContainer from "../bill-form/bill-form.container"; import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility"; import { handleUpload as handleLocalUpload } from "../documents-local-upload/documents-local-upload.utility"; import { handleUpload } from "../documents-upload/documents-upload.utility"; -import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; const mapStateToProps = createStructuredSelector({ billEnterModal: selectBillEnterModal, @@ -196,7 +196,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, job: { lbr_adjustments: newAdjustments } } }); - if (!!jobUpdate.errors) { + if (jobUpdate.errors) { notification["error"]({ message: t("jobs.errors.saving", { message: JSON.stringify(jobUpdate.errors) @@ -213,7 +213,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, variables: { partsLineIds: markPolReceived.map((p) => p.id) }, refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"] }); - if (!!r2.errors) { + if (r2.errors) { setLoading(false); setEnterAgain(false); notification["error"]({ @@ -224,7 +224,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, } } - if (!!r1.errors) { + if (r1.errors) { setLoading(false); setEnterAgain(false); notification["error"]({ @@ -244,7 +244,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, consumedbybillid: billId } }); - if (!!r2.errors) { + if (r2.errors) { setLoading(false); setEnterAgain(false); notification["error"]({ @@ -396,7 +396,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, {t("bills.labels.generatepartslabel")} - {billEnterModal.context && billEnterModal.context.id ? null : ( @@ -406,6 +406,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, onClick={() => { setEnterAgain(true); }} + id="save-and-new-bill-enter-modal" > {t("general.actions.saveandnew")} diff --git a/client/src/components/bills-list-table/bills-list-table.component.jsx b/client/src/components/bills-list-table/bills-list-table.component.jsx index 89813d74f..4b46fad21 100644 --- a/client/src/components/bills-list-table/bills-list-table.component.jsx +++ b/client/src/components/bills-list-table/bills-list-table.component.jsx @@ -1,6 +1,6 @@ import { EditFilled, SyncOutlined } from "@ant-design/icons"; import { Button, Card, Checkbox, Input, Space, Table } from "antd"; -import React, { useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { FaTasks } from "react-icons/fa"; import { connect } from "react-redux"; @@ -209,6 +209,7 @@ export function BillsListTableComponent({ } }); }} + id="reconcile-bills-button" > {t("jobs.actions.reconcile")} diff --git a/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx b/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx index 96d1ab13b..91c39a6df 100644 --- a/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx +++ b/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx @@ -1,19 +1,19 @@ import { DownloadOutlined, SyncOutlined } from "@ant-design/icons"; import { Button, Card, Input, Space, Table } from "antd"; import axios from "axios"; -import React, { useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; import { selectPartnerVersion } from "../../redux/application/application.selectors"; import { alphaSort } from "../../utils/sorters"; -import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; const mapStateToProps = createStructuredSelector({ //currentUser: selectCurrentUser partnerVersion: selectPartnerVersion }); -const mapDispatchToProps = (dispatch) => ({ +const mapDispatchToProps = () => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(JobsAvailableScan); @@ -126,6 +126,7 @@ export function JobsAvailableScan({ partnerVersion, refetch }) { onClick={() => { scanEstimates(); }} + id="scan-estimates-button" > diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx index 442fe3f67..9f93f4362 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx @@ -1,5 +1,5 @@ import { Card, Input, Table } from "antd"; -import React, { useContext, useState } from "react"; +import { useContext, useState } from "react"; import { useTranslation } from "react-i18next"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import PhoneFormatter from "../../utils/PhoneFormatter"; @@ -91,6 +91,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ loading, owners }) }); }} enterButton + id="search-owner" /> } > @@ -112,9 +113,9 @@ export default function JobsCreateOwnerInfoSearchComponent({ loading, owners }) type: "radio", selectedRowKeys: [state.owner.selectedid] }} - onRow={(record, rowIndex) => { + onRow={(record) => { return { - onClick: (event) => { + onClick: () => { if (record) { if (record.id) { setState({ diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx index 124ae31f3..2e75bded8 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx @@ -1,9 +1,9 @@ -import React, { useContext, useState } from "react"; -import { useTranslation } from "react-i18next"; import { Card, Input, Space, Table } from "antd"; +import { useContext, useState } from "react"; +import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; -import { alphaSort } from "../../utils/sorters"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; +import { alphaSort } from "../../utils/sorters"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; export default function JobsCreateVehicleInfoSearchComponent({ loading, vehicles }) { @@ -63,6 +63,7 @@ export default function JobsCreateVehicleInfoSearchComponent({ loading, vehicles }); }} enterButton + id="search-vehicle" /> } @@ -91,9 +92,9 @@ export default function JobsCreateVehicleInfoSearchComponent({ loading, vehicles type: "radio", selectedRowKeys: [state.vehicle.selectedid] }} - onRow={(record, rowIndex) => { + onRow={(record) => { return { - onClick: (event) => { + onClick: () => { if (record) { if (record.id) { setState({ diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx index bd7cd9e0f..a70e3d118 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx @@ -1,9 +1,9 @@ import { SyncOutlined } from "@ant-design/icons"; import { Button, Checkbox, Divider, Input, Space, Table } from "antd"; -import dayjs from "../../utils/day"; -import React, { useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; +import dayjs from "../../utils/day"; import PhoneFormatter from "../../utils/PhoneFormatter"; import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; @@ -223,9 +223,9 @@ export default function JobsFindModalComponent({ type: "radio", selectedRowKeys: [selectedJob] }} - onRow={(record, rowIndex) => { + onRow={(record) => { return { - onClick: (event) => { + onClick: () => { handleOnRowClick(record); } }; @@ -241,15 +241,17 @@ export default function JobsFindModalComponent({ overrideHeaders: e.target.checked }) } + id="override_header" > {t("jobs.labels.override_header")} - setPartsQueueToggle(e.target.checked)}> + setPartsQueueToggle(e.target.checked)} id="parts_queue_toggle"> {t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")} setSchComp({ ...updateSchComp, checked: e.target.checked })} + id="update_scheduled_completion" > {t("jobs.labels.update_scheduled_completion")} @@ -261,6 +263,7 @@ export default function JobsFindModalComponent({ onChange={(e) => { setSchComp({ ...updateSchComp, scheduled_completion: e }); }} + id="scheduled_completion_date_time_picker" /> ) : null} {t("jobs.labels.calc_scheuled_completion")} diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx index a5fa7c325..320c484f2 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx @@ -1,6 +1,5 @@ import { useQuery } from "@apollo/client"; import { Modal } from "antd"; -import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -66,7 +65,7 @@ export default connect( title={t("jobs.labels.existing_jobs")} width={"80%"} destroyOnHidden - okButtonProps={{ disabled: selectedJob ? false : true }} + okButtonProps={{ disabled: selectedJob ? false : true, id: "jobs-find-modal-container-ok" }} {...modalProps} > {loading ? : null} 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 b208e6058..b00c70ed6 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 @@ -1,12 +1,12 @@ import { useLazyQuery } from "@apollo/client"; import { Input, Modal } from "antd"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import OwnerFindModalComponent from "./owner-find-modal.component"; import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; +import OwnerFindModalComponent from "./owner-find-modal.component"; export default function OwnerFindModalContainer({ loading, @@ -41,6 +41,7 @@ export default function OwnerFindModalContainer({ {t("owners.labels.existing_owners")}} width={"80%"} + okButtonProps={{ id: "owner-find-modal-ok-button" }} {...modalProps} > {loading ? : null} diff --git a/client/src/components/shop-info/shop-info.component.jsx b/client/src/components/shop-info/shop-info.component.jsx index c0e743528..55bbeaa95 100644 --- a/client/src/components/shop-info/shop-info.component.jsx +++ b/client/src/components/shop-info/shop-info.component.jsx @@ -1,35 +1,34 @@ import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { Button, Card, Tabs } from "antd"; -import React from "react"; +import queryString from "query-string"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; +import { useLocation, useNavigate } from "react-router-dom"; import { createStructuredSelector } from "reselect"; +import { useSocket } from "../../contexts/SocketIO/useSocket.js"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import InstanceRenderManager from "../../utils/instanceRenderMgr"; +import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; +import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component"; import ShopInfoGeneral from "./shop-info.general.component"; import ShopInfoIntakeChecklistComponent from "./shop-info.intake.component"; import ShopInfoLaborRates from "./shop-info.laborrates.component"; +import ShopInfoNotificationsAutoadd from "./shop-info.notifications-autoadd.component.jsx"; import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component"; import ShopInfoPartsScan from "./shop-info.parts-scan"; import ShopInfoRbacComponent from "./shop-info.rbac.component"; import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycenters.component"; +import ShopInfoRoGuard from "./shop-info.roguard.component"; import ShopInfoROStatusComponent from "./shop-info.rostatus.component"; import ShopInfoSchedulingComponent from "./shop-info.scheduling.component"; import ShopInfoSpeedPrint from "./shop-info.speedprint.component"; -import { useLocation, useNavigate } from "react-router-dom"; import ShopInfoTaskPresets from "./shop-info.task-presets.component"; -import queryString from "query-string"; -import InstanceRenderManager from "../../utils/instanceRenderMgr"; -import ShopInfoRoGuard from "./shop-info.roguard.component"; import ShopInfoIntellipay from "./shop-intellipay-config.component"; -import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; -import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component"; -import { useSocket } from "../../contexts/SocketIO/useSocket.js"; -import ShopInfoNotificationsAutoadd from "./shop-info.notifications-autoadd.component.jsx"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); -const mapDispatchToProps = (dispatch) => ({ +const mapDispatchToProps = () => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoComponent); @@ -158,7 +157,7 @@ export function ShopInfoComponent({ bodyshop, form, saveLoading }) { return ( form.submit()}> + } diff --git a/client/src/components/shop-info/shop-info.general.component.jsx b/client/src/components/shop-info/shop-info.general.component.jsx index 58bacb2aa..8d40f02d9 100644 --- a/client/src/components/shop-info/shop-info.general.component.jsx +++ b/client/src/components/shop-info/shop-info.general.component.jsx @@ -1,7 +1,6 @@ import { DeleteFilled } from "@ant-design/icons"; import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { Button, DatePicker, Form, Input, InputNumber, Radio, Select, Space, Switch } from "antd"; -import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -19,7 +18,7 @@ const timeZonesList = Intl.supportedValuesOf("timeZone"); const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); -const mapDispatchToProps = (dispatch) => ({ +const mapDispatchToProps = () => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoGeneral); @@ -823,7 +822,7 @@ export function ShopInfoGeneral({ form, bodyshop }) { }} - + {t("bodyshop.labels.insurancecos")} id="insurancecos"> {(fields, { add, remove, move }) => { return ( diff --git a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx index 6afe3ba15..8644e701c 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -14,7 +14,7 @@ import { Badge, Button, Divider, Form, Space, Tabs } from "antd"; import Axios from "axios"; import _ from "lodash"; import queryString from "query-string"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { FaHardHat, FaRegStickyNote, FaShieldAlt, FaTasks } from "react-icons/fa"; import { connect } from "react-redux"; @@ -28,6 +28,7 @@ import JobLineUpsertModalContainer from "../../components/job-lines-upsert-modal import JobProfileDataWarning from "../../components/job-profile-data-warning/job-profile-data-warning.component"; import JobReconciliationModal from "../../components/job-reconciliation-modal/job-reconciliation.modal.container"; import JobSyncButton from "../../components/job-sync-button/job-sync-button.component"; +import JobWatcherToggleContainer from "../../components/job-watcher-toggle/job-watcher-toggle.container.jsx"; import JobsChangeStatus from "../../components/jobs-change-status/jobs-change-status.component"; import JobsConvertButton from "../../components/jobs-convert-button/jobs-convert-button.component"; import JobsDetailDatesComponent from "../../components/jobs-detail-dates/jobs-detail-dates.component"; @@ -45,6 +46,8 @@ import LockWrapperComponent from "../../components/lock-wrapper/lock-wrapper.com import NoteUpsertModalComponent from "../../components/note-upsert-modal/note-upsert-modal.container"; import ScheduleJobModalContainer from "../../components/schedule-job-modal/schedule-job-modal.container"; import TaskListContainer from "../../components/task-list/task-list.container.jsx"; +import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; +import { useSocket } from "../../contexts/SocketIO/useSocket.js"; import { QUERY_PARTS_BILLS_BY_JOBID } from "../../graphql/bills.queries.js"; import { QUERY_JOB_TASKS_PAGINATED } from "../../graphql/tasks.queries.js"; import { insertAuditTrail } from "../../redux/application/application.actions"; @@ -55,9 +58,6 @@ import AuditTrailMapping from "../../utils/AuditTrailMappings"; import { DateTimeFormat } from "../../utils/DateFormatter"; import dayjs from "../../utils/day"; import UndefinedToNull from "../../utils/undefinedtonull"; -import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; -import { useSocket } from "../../contexts/SocketIO/useSocket.js"; -import JobWatcherToggleContainer from "../../components/job-watcher-toggle/job-watcher-toggle.container.jsx"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -322,11 +322,11 @@ export function JobsDetailPage({ > window.history.back()} - + id="job-detail-header" title={ {scenarioNotificationsOn && } - {job.ro_number || t("general.labels.na")} + {job.ro_number || t("general.labels.na")} } extra={menuExtra}