IO-3325 Additional ImEX log Events.
This commit is contained in:
@@ -16,4 +16,5 @@ TEST_USERNAME="test@imex.dev"
|
|||||||
TEST_PASSWORD="test123"
|
TEST_PASSWORD="test123"
|
||||||
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
||||||
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||||
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
||||||
|
VITE_APP_AMP_KEY=6228a598e57cd66875cfd41604f1f891
|
||||||
@@ -18,4 +18,5 @@ TEST_USERNAME="test@imex.dev"
|
|||||||
TEST_PASSWORD="test123"
|
TEST_PASSWORD="test123"
|
||||||
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
||||||
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||||
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
||||||
|
VITE_APP_AMP_KEY=46b1193a867d4e3131ae4c3a64a3fc78
|
||||||
@@ -15,4 +15,5 @@ VITE_APP_SPLIT_API=et9pjkik6bn67he5evpmpr1agoo7gactphgk
|
|||||||
VITE_APP_INSTANCE=IMEX
|
VITE_APP_INSTANCE=IMEX
|
||||||
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
||||||
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||||
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
||||||
|
VITE_APP_AMP_KEY=6228a598e57cd66875cfd41604f1f891
|
||||||
@@ -15,4 +15,5 @@ VITE_APP_SPLIT_API=et9pjkik6bn67he5evpmpr1agoo7gactphgk
|
|||||||
VITE_APP_INSTANCE=ROME
|
VITE_APP_INSTANCE=ROME
|
||||||
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
||||||
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||||
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
||||||
|
VITE_APP_AMP_KEY=46b1193a867d4e3131ae4c3a64a3fc78
|
||||||
@@ -15,4 +15,5 @@ VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
|
|||||||
VITE_APP_INSTANCE=IMEX
|
VITE_APP_INSTANCE=IMEX
|
||||||
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
||||||
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||||
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
||||||
|
VITE_APP_AMP_KEY=6228a598e57cd66875cfd41604f1f891
|
||||||
@@ -15,4 +15,5 @@ VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
|
|||||||
VITE_APP_INSTANCE=ROME
|
VITE_APP_INSTANCE=ROME
|
||||||
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
|
||||||
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||||
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
|
||||||
|
VITE_APP_AMP_KEY=46b1193a867d4e3131ae4c3a64a3fc78
|
||||||
@@ -142,7 +142,16 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
|
|||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
<Link to={`/manage/jobs/${record.id}/close`}>
|
<Link to={`/manage/jobs/${record.id}/close`}>
|
||||||
<Button>{t("jobs.labels.viewallocations")}</Button>
|
<Button
|
||||||
|
style={{
|
||||||
|
overflow: "hidden",
|
||||||
|
textOverflow: "ellipsis",
|
||||||
|
whiteSpace: "nowrap",
|
||||||
|
verticalAlign: "middle"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t("jobs.labels.viewallocations")}
|
||||||
|
</Button>
|
||||||
</Link>
|
</Link>
|
||||||
</Space>
|
</Space>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { FaTasks } from "react-icons/fa";
|
import { FaTasks } from "react-icons/fa";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
@@ -75,6 +76,7 @@ export function BillsListTableComponent({
|
|||||||
<Button
|
<Button
|
||||||
title={t("tasks.buttons.create")}
|
title={t("tasks.buttons.create")}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
logImEXEvent("bills_create_task", {});
|
||||||
setTaskUpsertContext({
|
setTaskUpsertContext({
|
||||||
context: {
|
context: {
|
||||||
jobid: job.id,
|
jobid: job.id,
|
||||||
@@ -167,6 +169,7 @@ export function BillsListTableComponent({
|
|||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
||||||
|
logImEXEvent("bills_list_sort_filter", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const filteredBills = bills
|
const filteredBills = bills
|
||||||
@@ -208,6 +211,7 @@ export function BillsListTableComponent({
|
|||||||
<Button
|
<Button
|
||||||
disabled={!hasBillsAccess}
|
disabled={!hasBillsAccess}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
logImEXEvent("bills_reconcile", {});
|
||||||
setReconciliationContext({
|
setReconciliationContext({
|
||||||
actions: { refetch: billsQuery.refetch },
|
actions: { refetch: billsQuery.refetch },
|
||||||
context: {
|
context: {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
|
|||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||||
import CurrencyFormItemComponent from "../form-items-formatted/currency-form-item.component";
|
import CurrencyFormItemComponent from "../form-items-formatted/currency-form-item.component";
|
||||||
import JobSearchSelectComponent from "../job-search-select/job-search-select.component";
|
import JobSearchSelectComponent from "../job-search-select/job-search-select.component";
|
||||||
import { getCurrentUser } from "../../firebase/firebase.utils";
|
import { getCurrentUser, logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -124,6 +124,7 @@ const CardPaymentModalComponent = ({
|
|||||||
const { payments } = form.getFieldsValue();
|
const { payments } = form.getFieldsValue();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
logImEXEvent("payment_cc_lightbox");
|
||||||
const response = await axios.post("/intellipay/lightbox_credentials", {
|
const response = await axios.post("/intellipay/lightbox_credentials", {
|
||||||
bodyshop,
|
bodyshop,
|
||||||
refresh: !!window.intellipay,
|
refresh: !!window.intellipay,
|
||||||
@@ -171,6 +172,7 @@ const CardPaymentModalComponent = ({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const { payments } = form.getFieldsValue();
|
const { payments } = form.getFieldsValue();
|
||||||
|
logImEXEvent("payment_cc_shortlink");
|
||||||
const response = await axios.post("/intellipay/generate_payment_url", {
|
const response = await axios.post("/intellipay/generate_payment_url", {
|
||||||
bodyshop,
|
bodyshop,
|
||||||
amount: payments.reduce((acc, val) => acc + (val?.amount || 0), 0),
|
amount: payments.reduce((acc, val) => acc + (val?.amount || 0), 0),
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ export function ContractsFindModalContainer({ contractFinderModal, toggleModalVi
|
|||||||
logImEXEvent("contract_finder_search");
|
logImEXEvent("contract_finder_search");
|
||||||
|
|
||||||
//Execute contract find
|
//Execute contract find
|
||||||
|
|
||||||
callSearch({
|
callSearch({
|
||||||
variables: {
|
variables: {
|
||||||
plate: (values.plate && values.plate !== "" && values.plate) || undefined,
|
plate: (values.plate && values.plate !== "" && values.plate) || undefined,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { Link, useNavigate } from "react-router-dom";
|
|||||||
import PhoneNumberFormatter from "../../utils/PhoneFormatter";
|
import PhoneNumberFormatter from "../../utils/PhoneFormatter";
|
||||||
import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
|
||||||
import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component";
|
import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
export default function GlobalSearchOs() {
|
export default function GlobalSearchOs() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -19,6 +20,8 @@ export default function GlobalSearchOs() {
|
|||||||
if (v && v && v !== "" && v.length >= 3) {
|
if (v && v && v !== "" && v.length >= 3) {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("global_search", { search: v });
|
||||||
|
|
||||||
const searchData = await axios.post("/search", {
|
const searchData = await axios.post("/search", {
|
||||||
search: v
|
search: v
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { Button, Card, Col, Row, Table, Tag } from "antd";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import { QUERY_AUDIT_TRAIL } from "../../graphql/audit_trail.queries";
|
import { QUERY_AUDIT_TRAIL } from "../../graphql/audit_trail.queries";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
||||||
@@ -125,6 +126,7 @@ export function JobAuditTrail({ bodyshop, jobId }) {
|
|||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
logImEXEvent("jobs_audit_view_email", {});
|
||||||
var win = window.open(
|
var win = window.open(
|
||||||
"",
|
"",
|
||||||
"Title",
|
"Title",
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.con
|
|||||||
import JobLinesExpander from "./job-lines-expander.component";
|
import JobLinesExpander from "./job-lines-expander.component";
|
||||||
import JobLinesPartPriceChange from "./job-lines-part-price-change.component";
|
import JobLinesPartPriceChange from "./job-lines-part-price-change.component";
|
||||||
import JobLinesExpanderSimple from "./jobs-lines-expander-simple.component";
|
import JobLinesExpanderSimple from "./jobs-lines-expander-simple.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -397,6 +398,7 @@ export function JobLinesComponent({
|
|||||||
filteredInfo: filters,
|
filteredInfo: filters,
|
||||||
sortedInfo: sorter
|
sortedInfo: sorter
|
||||||
}));
|
}));
|
||||||
|
logImEXEvent("joblines_table_change", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleMark = (e) => {
|
const handleMark = (e) => {
|
||||||
@@ -413,6 +415,7 @@ export function JobLinesComponent({
|
|||||||
])
|
])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
logImEXEvent("joblines_mark_lines", {});
|
||||||
};
|
};
|
||||||
|
|
||||||
const markMenu = {
|
const markMenu = {
|
||||||
@@ -616,12 +619,18 @@ export function JobLinesComponent({
|
|||||||
expanded ? (
|
expanded ? (
|
||||||
<MinusCircleTwoTone onClick={(e) => onExpand(record, e)} />
|
<MinusCircleTwoTone onClick={(e) => onExpand(record, e)} />
|
||||||
) : (
|
) : (
|
||||||
<PlusCircleTwoTone onClick={(e) => onExpand(record, e)} />
|
<PlusCircleTwoTone
|
||||||
|
onClick={(e) => {
|
||||||
|
onExpand(record, e);
|
||||||
|
logImEXEvent("joblines_expander", {});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
onRow={(record) => {
|
onRow={(record) => {
|
||||||
return {
|
return {
|
||||||
onDoubleClick: () => {
|
onDoubleClick: () => {
|
||||||
|
logImEXEvent("joblines_double_click_select", {});
|
||||||
const notMatchingLines = selectedLines.filter((i) => i.id !== record.id);
|
const notMatchingLines = selectedLines.filter((i) => i.id !== record.id);
|
||||||
notMatchingLines.length !== selectedLines.length
|
notMatchingLines.length !== selectedLines.length
|
||||||
? setSelectedLines(notMatchingLines)
|
? setSelectedLines(notMatchingLines)
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
import { useCallback, useEffect, useState } from "react";
|
|
||||||
import dayjs from "../../utils/day";
|
|
||||||
import axios from "axios";
|
|
||||||
import { Badge, Card, Space, Table, Tag } from "antd";
|
|
||||||
import { gql, useQuery } from "@apollo/client";
|
import { gql, useQuery } from "@apollo/client";
|
||||||
import { DateTimeFormatterFunction } from "../../utils/DateFormatter";
|
import { Badge, Card, Space, Table, Tag } from "antd";
|
||||||
|
import axios from "axios";
|
||||||
import { isEmpty } from "lodash";
|
import { isEmpty } from "lodash";
|
||||||
|
import { useCallback, useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import "./job-lifecycle.styles.scss";
|
|
||||||
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
|
|
||||||
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component";
|
|
||||||
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
import { DateTimeFormatterFunction } from "../../utils/DateFormatter";
|
||||||
|
import dayjs from "../../utils/day";
|
||||||
|
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
|
||||||
|
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
||||||
|
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component";
|
||||||
|
import "./job-lifecycle.styles.scss";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -57,6 +58,7 @@ export function JobLifecycleComponent({ bodyshop, job, statuses }) {
|
|||||||
jobids: job.id,
|
jobids: job.id,
|
||||||
statuses: statuses.statuses
|
statuses: statuses.statuses
|
||||||
});
|
});
|
||||||
|
logImEXEvent("jobs_lifecycle_data", {});
|
||||||
const data = response.data.transition[job.id];
|
const data = response.data.transition[job.id];
|
||||||
setLifecycleData(data);
|
setLifecycleData(data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
|
|||||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -32,6 +33,7 @@ export function JoblineBulkAssign({ setSelectedLines, selectedLines, insertAudit
|
|||||||
const handleConvert = async (values) => {
|
const handleConvert = async (values) => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("joblines_bulk_assign", {});
|
||||||
const result = await assignLines({
|
const result = await assignLines({
|
||||||
variables: {
|
variables: {
|
||||||
jobline: {
|
jobline: {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selecto
|
|||||||
import { GenerateDocument } from "../../utils/RenderTemplate";
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -46,6 +47,7 @@ export function JobLineDispatchButton({
|
|||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
//THIS HAS NOT YET BEEN TESTED. START BY FINISHING THIS FUNCTION.
|
//THIS HAS NOT YET BEEN TESTED. START BY FINISHING THIS FUNCTION.
|
||||||
|
logImEXEvent("joblines_dispatch", {});
|
||||||
const result = await dispatchLines({
|
const result = await dispatchLines({
|
||||||
variables: {
|
variables: {
|
||||||
partsDispatch: {
|
partsDispatch: {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { useState } from "react";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { UPDATE_JOB } from "../../graphql/jobs.queries";
|
import { UPDATE_JOB } from "../../graphql/jobs.queries";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
export default function JobRemoveFromPartsQueue({ checked, jobId }) {
|
export default function JobRemoveFromPartsQueue({ checked, jobId }) {
|
||||||
const [updateJob] = useMutation(UPDATE_JOB);
|
const [updateJob] = useMutation(UPDATE_JOB);
|
||||||
@@ -13,6 +14,8 @@ export default function JobRemoveFromPartsQueue({ checked, jobId }) {
|
|||||||
|
|
||||||
const handleChange = async (e) => {
|
const handleChange = async (e) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("parts_queue_toggle", { estimators: e });
|
||||||
|
|
||||||
const result = await updateJob({
|
const result = await updateJob({
|
||||||
variables: { jobId: jobId, job: { queued_for_parts: e.target.checked } }
|
variables: { jobId: jobId, job: { queued_for_parts: e.target.checked } }
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
import { selectPartnerVersion } from "../../redux/application/application.selectors";
|
import { selectPartnerVersion } from "../../redux/application/application.selectors";
|
||||||
import { alphaSort } from "../../utils/sorters";
|
import { alphaSort } from "../../utils/sorters";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -30,11 +31,15 @@ export function JobsAvailableScan({ partnerVersion, refetch }) {
|
|||||||
const notification = useNotification();
|
const notification = useNotification();
|
||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
|
logImEXEvent("available_jobs_scan_sort_filter", { pagination, filters, sorter });
|
||||||
|
|
||||||
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleImport = async (filepath) => {
|
const handleImport = async (filepath) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("available_jobs_scan", {});
|
||||||
|
|
||||||
const response = await axios.post("http://localhost:1337/import/", {
|
const response = await axios.post("http://localhost:1337/import/", {
|
||||||
filepath
|
filepath
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
|||||||
import { TimeAgoFormatter } from "../../utils/DateFormatter";
|
import { TimeAgoFormatter } from "../../utils/DateFormatter";
|
||||||
import { alphaSort } from "../../utils/sorters";
|
import { alphaSort } from "../../utils/sorters";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -34,6 +35,7 @@ export function JobsAvailableComponent({ bodyshop, loading, data, refetch, addJo
|
|||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
||||||
|
logImEXEvent("available_jobs_sort_filter", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
|||||||
import { DateTimeFormatterFunction } from "../../utils/DateFormatter";
|
import { DateTimeFormatterFunction } from "../../utils/DateFormatter";
|
||||||
import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component";
|
import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component.jsx";
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser,
|
//currentUser: selectCurrentUser,
|
||||||
@@ -108,6 +109,9 @@ export function JobsDetailHeaderActionsToggleProduction({
|
|||||||
DateTimeFormatterFunction(values.actual_completion)
|
DateTimeFormatterFunction(values.actual_completion)
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
logImEXEvent(scenario === "pre" ? "job_intake_quick" : "job-deliver-quick", {});
|
||||||
|
|
||||||
setPopOverVisible(false);
|
setPopOverVisible(false);
|
||||||
closeParentMenu();
|
closeParentMenu();
|
||||||
refetch();
|
refetch();
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { alphaSort, statusSort } from "../../utils/sorters";
|
|||||||
import useLocalStorage from "../../utils/useLocalStorage";
|
import useLocalStorage from "../../utils/useLocalStorage";
|
||||||
import StartChatButton from "../chat-open-button/chat-open-button.component";
|
import StartChatButton from "../chat-open-button/chat-open-button.component";
|
||||||
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -177,6 +178,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
|
|||||||
}
|
}
|
||||||
setFilter(filters);
|
setFilter(filters);
|
||||||
history({ search: queryString.stringify(search) });
|
history({ search: queryString.stringify(search) });
|
||||||
|
logImEXEvent("jobs_all_list_sort_filter", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import AlertComponent from "../alert/alert.component";
|
|||||||
import ChatOpenButton from "../chat-open-button/chat-open-button.component";
|
import ChatOpenButton from "../chat-open-button/chat-open-button.component";
|
||||||
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
||||||
import { OwnerNameDisplayFunction } from "./../owner-name-display/owner-name-display.component";
|
import { OwnerNameDisplayFunction } from "./../owner-name-display/owner-name-display.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -67,6 +68,7 @@ export function JobsList({ bodyshop }) {
|
|||||||
: [];
|
: [];
|
||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
|
logImEXEvent("jobs_list_sort_filter", { pagination, filters, sorter });
|
||||||
setState({ ...state, sortedInfo: sorter });
|
setState({ ...state, sortedInfo: sorter });
|
||||||
setFilter(filters);
|
setFilter(filters);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
import { Button, Form, Popconfirm } from "antd";
|
|
||||||
import { PageHeader } from "@ant-design/pro-layout";
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { useNavigate } from "react-router-dom";
|
|
||||||
import { useApolloClient, useMutation } from "@apollo/client";
|
import { useApolloClient, useMutation } from "@apollo/client";
|
||||||
|
import { Button, Form, Popconfirm } from "antd";
|
||||||
|
import { phone } from "phone"; // Import phone utility for formatting
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
import { DELETE_OWNER, UPDATE_OWNER } from "../../graphql/owners.queries";
|
import { DELETE_OWNER, UPDATE_OWNER } from "../../graphql/owners.queries";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors"; // Adjust path
|
import { selectBodyshop } from "../../redux/user/user.selectors"; // Adjust path
|
||||||
import { phoneNumberOptOutService } from "../../utils/phoneOptOutService.js"; // Adjust path
|
import { phoneNumberOptOutService } from "../../utils/phoneOptOutService.js"; // Adjust path
|
||||||
import OwnerDetailFormComponent from "./owner-detail-form.component";
|
import OwnerDetailFormComponent from "./owner-detail-form.component";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
|
||||||
import { phone } from "phone"; // Import phone utility for formatting
|
|
||||||
|
|
||||||
// Connect to Redux to access bodyshop
|
// Connect to Redux to access bodyshop
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -55,6 +56,7 @@ function OwnerDetailFormContainer({ owner, refetch, bodyshop }) {
|
|||||||
|
|
||||||
const handleDelete = async () => {
|
const handleDelete = async () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("owner_delete", {});
|
||||||
try {
|
try {
|
||||||
const result = await deleteOwner({
|
const result = await deleteOwner({
|
||||||
variables: { id: owner.id }
|
variables: { id: owner.id }
|
||||||
@@ -84,6 +86,7 @@ function OwnerDetailFormContainer({ owner, refetch, bodyshop }) {
|
|||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("owner_update", {});
|
||||||
try {
|
try {
|
||||||
const result = await updateOwner({
|
const result = await updateOwner({
|
||||||
variables: { ownerId: owner.id, owner: values }
|
variables: { ownerId: owner.id, owner: values }
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { DownOutlined } from "@ant-design/icons";
|
import { DownOutlined } from "@ant-design/icons";
|
||||||
import { Dropdown, InputNumber, Space } from "antd";
|
import { Dropdown, InputNumber, Space } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
export default function PartsOrderModalPriceChange({ form, field }) {
|
export default function PartsOrderModalPriceChange({ form, field }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const menu = {
|
const menu = {
|
||||||
@@ -63,6 +63,7 @@ export default function PartsOrderModalPriceChange({ form, field }) {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
onClick: ({ key }) => {
|
onClick: ({ key }) => {
|
||||||
|
logImEXEvent("parts_order_manual_discount", {});
|
||||||
if (key === "custom") return;
|
if (key === "custom") return;
|
||||||
const values = form.getFieldsValue();
|
const values = form.getFieldsValue();
|
||||||
const { parts_order_lines } = values;
|
const { parts_order_lines } = values;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import AlertComponent from "../alert/alert.component";
|
|||||||
import JobsDetailHeader from "../jobs-detail-header/jobs-detail-header.component";
|
import JobsDetailHeader from "../jobs-detail-header/jobs-detail-header.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
import PartsQueueJobLinesComponent from "./parts-queue-job-lines.component";
|
import PartsQueueJobLinesComponent from "./parts-queue-job-lines.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
export default function PartsQueueDetailCard() {
|
export default function PartsQueueDetailCard() {
|
||||||
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
|
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
|
||||||
@@ -37,6 +38,8 @@ export default function PartsQueueDetailCard() {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const handleDrawerClose = () => {
|
const handleDrawerClose = () => {
|
||||||
delete searchParams.selected;
|
delete searchParams.selected;
|
||||||
|
logImEXEvent("parts_queue_drawer", {});
|
||||||
|
|
||||||
history({
|
history({
|
||||||
search: queryString.stringify({
|
search: queryString.stringify({
|
||||||
...searchParams
|
...searchParams
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.c
|
|||||||
import JobRemoveFromPartsQueue from "../job-remove-from-parst-queue/job-remove-from-parts-queue.component";
|
import JobRemoveFromPartsQueue from "../job-remove-from-parst-queue/job-remove-from-parts-queue.component";
|
||||||
import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
|
||||||
import ProductionListColumnComment from "../production-list-columns/production-list-columns.comment.component";
|
import ProductionListColumnComment from "../production-list-columns/production-list-columns.comment.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -73,6 +74,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
}
|
}
|
||||||
setFilter(filters);
|
setFilter(filters);
|
||||||
history({ search: queryString.stringify(searchParams) });
|
history({ search: queryString.stringify(searchParams) });
|
||||||
|
logImEXEvent("parts_queue_sort_filter", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOnRowClick = (record) => {
|
const handleOnRowClick = (record) => {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
} from "@ant-design/icons";
|
} from "@ant-design/icons";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component";
|
import EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -26,10 +27,12 @@ export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading })
|
|||||||
|
|
||||||
const toggleAlertFilter = () => {
|
const toggleAlertFilter = () => {
|
||||||
setFilter({ ...filter, alert: !filter.alert });
|
setFilter({ ...filter, alert: !filter.alert });
|
||||||
|
logImEXEvent("visual_board_filter_alert", {});
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleUnassignedFilter = () => {
|
const toggleUnassignedFilter = () => {
|
||||||
setFilter({ ...filter, unassigned: !filter.unassigned });
|
setFilter({ ...filter, unassigned: !filter.unassigned });
|
||||||
|
logImEXEvent("visual_board_filter_unassigned", {});
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -40,6 +43,7 @@ export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading })
|
|||||||
placeholder={t("general.labels.search")}
|
placeholder={t("general.labels.search")}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setFilter({ ...filter, search: e.target.value });
|
setFilter({ ...filter, search: e.target.value });
|
||||||
|
logImEXEvent("visual_board_filter_search", { search: e.target.value });
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<EmployeeSearchSelectComponent
|
<EmployeeSearchSelectComponent
|
||||||
@@ -47,7 +51,10 @@ export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading })
|
|||||||
options={bodyshop.employees.filter((e) => e.active)}
|
options={bodyshop.employees.filter((e) => e.active)}
|
||||||
value={filter.employeeId}
|
value={filter.employeeId}
|
||||||
placeholder={t("production.labels.employeesearch")}
|
placeholder={t("production.labels.employeesearch")}
|
||||||
onChange={(emp) => setFilter({ ...filter, employeeId: emp })}
|
onChange={(emp) => {
|
||||||
|
setFilter({ ...filter, employeeId: emp });
|
||||||
|
logImEXEvent("visual_board_filter_alert", { employeeId: emp });
|
||||||
|
}}
|
||||||
allowClear
|
allowClear
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { useState } from "react";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { FaRegStickyNote } from "react-icons/fa";
|
import { FaRegStickyNote } from "react-icons/fa";
|
||||||
import { UPDATE_JOB } from "../../graphql/jobs.queries";
|
import { UPDATE_JOB } from "../../graphql/jobs.queries";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
export default function ProductionListColumnComment({ record }) {
|
export default function ProductionListColumnComment({ record }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -28,6 +29,7 @@ export default function ProductionListColumnComment({ record }) {
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
if (record.refetch) record.refetch();
|
if (record.refetch) record.refetch();
|
||||||
});
|
});
|
||||||
|
logImEXEvent("job_add_comment", { estimators: e });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import ProductionListDetail from "../production-list-detail/production-list-deta
|
|||||||
import { ProductionListConfigManager } from "./production-list-config-manager.component.jsx";
|
import { ProductionListConfigManager } from "./production-list-config-manager.component.jsx";
|
||||||
import ProductionListPrint from "./production-list-print.component";
|
import ProductionListPrint from "./production-list-print.component";
|
||||||
import ResizeableTitle from "./production-list-table.resizeable.component";
|
import ResizeableTitle from "./production-list-table.resizeable.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -114,6 +115,7 @@ export function ProductionListTable({ loading, data, refetch, bodyshop, technici
|
|||||||
setState(newState);
|
setState(newState);
|
||||||
setHasUnsavedChanges(true);
|
setHasUnsavedChanges(true);
|
||||||
}
|
}
|
||||||
|
logImEXEvent("production_list_sort_filter", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDragEnd = (fromIndex, toIndex) => {
|
const onDragEnd = (fromIndex, toIndex) => {
|
||||||
@@ -134,6 +136,7 @@ export function ProductionListTable({ loading, data, refetch, bodyshop, technici
|
|||||||
setColumns(newColumns);
|
setColumns(newColumns);
|
||||||
setHasUnsavedChanges(true);
|
setHasUnsavedChanges(true);
|
||||||
}
|
}
|
||||||
|
logImEXEvent("production_list_remove_column", { key });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleResize =
|
const handleResize =
|
||||||
@@ -156,6 +159,7 @@ export function ProductionListTable({ loading, data, refetch, bodyshop, technici
|
|||||||
setColumns(updatedColumns);
|
setColumns(updatedColumns);
|
||||||
setHasUnsavedChanges(true);
|
setHasUnsavedChanges(true);
|
||||||
}
|
}
|
||||||
|
logImEXEvent("production_list_add_column", { key: newColumn.key });
|
||||||
};
|
};
|
||||||
|
|
||||||
const headerItem = (col) => {
|
const headerItem = (col) => {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { useEffect } from "react";
|
|||||||
import { useCookies } from "react-cookie";
|
import { useCookies } from "react-cookie";
|
||||||
import { useLocation, useNavigate } from "react-router-dom";
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
import QboSignIn from "../../assets/qbo/C2QB_green_btn_med_default.svg";
|
import QboSignIn from "../../assets/qbo/C2QB_green_btn_med_default.svg";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
export default function QboAuthorizeComponent() {
|
export default function QboAuthorizeComponent() {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
@@ -12,6 +13,7 @@ export default function QboAuthorizeComponent() {
|
|||||||
const [setCookie] = useCookies(["access_token", "refresh_token"]);
|
const [setCookie] = useCookies(["access_token", "refresh_token"]);
|
||||||
|
|
||||||
const handleQbSignIn = async () => {
|
const handleQbSignIn = async () => {
|
||||||
|
logImEXEvent("qbo_sign_in_clicked");
|
||||||
const result = await Axios.post("/qbo/authorize");
|
const result = await Axios.post("/qbo/authorize");
|
||||||
window.location.href = result.data;
|
window.location.href = result.data;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
|
|||||||
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
|
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
|
||||||
import { upsellEnum, UpsellMaskWrapper } from "../upsell/upsell.component";
|
import { upsellEnum, UpsellMaskWrapper } from "../upsell/upsell.component";
|
||||||
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -79,7 +80,12 @@ export function ScheduleCalendarHeaderGraph({ bodyshop, loadData }) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover trigger="hover" placement="bottom" content={popContent}>
|
<Popover
|
||||||
|
trigger="hover"
|
||||||
|
placement="bottom"
|
||||||
|
onOpenChange={(open) => open && logImEXEvent("schedule_spider_graph", {})}
|
||||||
|
content={popContent}
|
||||||
|
>
|
||||||
<RadarChartOutlined />
|
<RadarChartOutlined />
|
||||||
</Popover>
|
</Popover>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import OwnerNameDisplay from "../owner-name-display/owner-name-display.component
|
|||||||
import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component";
|
import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component";
|
||||||
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component";
|
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component";
|
||||||
import ScheduleCalendarHeaderGraph from "./schedule-calendar-header-graph.component";
|
import ScheduleCalendarHeaderGraph from "./schedule-calendar-header-graph.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -142,6 +143,7 @@ export function ScheduleCalendarHeaderComponent({ bodyshop, label, refetch, date
|
|||||||
content={jobsInPopup}
|
content={jobsInPopup}
|
||||||
trigger="hover"
|
trigger="hover"
|
||||||
title={t("appointments.labels.arrivingjobs")}
|
title={t("appointments.labels.arrivingjobs")}
|
||||||
|
onOpenChange={(open) => open && logImEXEvent("schedule_popover_arriving_jobs", {})}
|
||||||
>
|
>
|
||||||
<Space size="small">
|
<Space size="small">
|
||||||
<Icon component={MdFileDownload} style={{ color: "green" }} />
|
<Icon component={MdFileDownload} style={{ color: "green" }} />
|
||||||
@@ -159,6 +161,7 @@ export function ScheduleCalendarHeaderComponent({ bodyshop, label, refetch, date
|
|||||||
content={jobsOutPopup}
|
content={jobsOutPopup}
|
||||||
trigger="hover"
|
trigger="hover"
|
||||||
title={t("appointments.labels.completingjobs")}
|
title={t("appointments.labels.completingjobs")}
|
||||||
|
onOpenChange={(open) => open && logImEXEvent("schedule_popover_departing_jobs", {})}
|
||||||
>
|
>
|
||||||
<Space size="small">
|
<Space size="small">
|
||||||
<Icon component={MdFileUpload} style={{ color: "red" }} />
|
<Icon component={MdFileUpload} style={{ color: "red" }} />
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import Event from "../job-at-change/schedule-event.container";
|
|||||||
import JobDetailCards from "../job-detail-cards/job-detail-cards.component";
|
import JobDetailCards from "../job-detail-cards/job-detail-cards.component";
|
||||||
import local from "./localizer";
|
import local from "./localizer";
|
||||||
import HeaderComponent from "./schedule-calendar-header.component";
|
import HeaderComponent from "./schedule-calendar-header.component";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import "./schedule-calendar.styles.scss";
|
import "./schedule-calendar.styles.scss";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -139,6 +140,8 @@ export function ScheduleCalendarWrapperComponent({
|
|||||||
}}
|
}}
|
||||||
onView={(view) => {
|
onView={(view) => {
|
||||||
search.view = view;
|
search.view = view;
|
||||||
|
logImEXEvent("schedule_change_view", { view });
|
||||||
|
|
||||||
history({ search: queryString.stringify(search) });
|
history({ search: queryString.stringify(search) });
|
||||||
}}
|
}}
|
||||||
step={15}
|
step={15}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { connect } from "react-redux";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -80,6 +81,7 @@ export function ScheduleCalendarComponent({ data, refetch, bodyshop }) {
|
|||||||
value={[...estimatorsFilter]}
|
value={[...estimatorsFilter]}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setEstimatiorsFilter(e);
|
setEstimatiorsFilter(e);
|
||||||
|
logImEXEvent("schedule_filter_by_estimator", { estimators: e });
|
||||||
}}
|
}}
|
||||||
options={estimators.map((e) => ({
|
options={estimators.map((e) => ({
|
||||||
label: e,
|
label: e,
|
||||||
@@ -95,6 +97,7 @@ export function ScheduleCalendarComponent({ data, refetch, bodyshop }) {
|
|||||||
value={filter?.ins_co_nm ? filter.ins_co_nm : []}
|
value={filter?.ins_co_nm ? filter.ins_co_nm : []}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setFilter({ ...filter, ins_co_nm: e });
|
setFilter({ ...filter, ins_co_nm: e });
|
||||||
|
logImEXEvent("schedule_filter_by_ins_co_nm", { ins_co_nm: e });
|
||||||
}}
|
}}
|
||||||
options={bodyshop.md_ins_cos.map((i) => ({
|
options={bodyshop.md_ins_cos.map((i) => ({
|
||||||
label: i.name,
|
label: i.name,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { UPDATE_SCOREBOARD_ENTRY } from "../../graphql/scoreboard.queries";
|
import { UPDATE_SCOREBOARD_ENTRY } from "../../graphql/scoreboard.queries";
|
||||||
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
|
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
export default function ScoreboardEntryEdit({ entry }) {
|
export default function ScoreboardEntryEdit({ entry }) {
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
@@ -16,6 +17,7 @@ export default function ScoreboardEntryEdit({ entry }) {
|
|||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("scoreboard_edit_job", {});
|
||||||
values.date = dayjs(values.date).format("YYYY-MM-DD");
|
values.date = dayjs(values.date).format("YYYY-MM-DD");
|
||||||
const result = await updateScoreboardentry({
|
const result = await updateScoreboardentry({
|
||||||
variables: { sbId: entry.id, sbInput: values }
|
variables: { sbId: entry.id, sbInput: values }
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors.js";
|
import { selectBodyshop } from "../../redux/user/user.selectors.js";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -52,6 +53,7 @@ const ShareToTeamsComponent = ({
|
|||||||
const teamsShareUrl = `https://teams.microsoft.com/share?href=${currentUrl}&preText=${messageText}&title=${pageTitle}`;
|
const teamsShareUrl = `https://teams.microsoft.com/share?href=${currentUrl}&preText=${messageText}&title=${pageTitle}`;
|
||||||
// Function to open the centered share link in a new window/tab
|
// Function to open the centered share link in a new window/tab
|
||||||
const handleShare = () => {
|
const handleShare = () => {
|
||||||
|
logImEXEvent("share_to_teams", {});
|
||||||
const screenWidth = window.screen.width;
|
const screenWidth = window.screen.width;
|
||||||
const screenHeight = window.screen.height;
|
const screenHeight = window.screen.height;
|
||||||
const windowWidth = 600;
|
const windowWidth = 600;
|
||||||
|
|||||||
@@ -96,14 +96,14 @@ export function SimplifiedPartsJobsListComponent({
|
|||||||
|
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
sorter: search?.search
|
sorter: search?.search
|
||||||
? (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.parts_active_statuses)
|
? (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses?.parts_active_statuses)
|
||||||
: true,
|
: true,
|
||||||
sortOrder: sortcolumn === "status" && sortorder,
|
sortOrder: sortcolumn === "status" && sortorder,
|
||||||
render: (text, record) => {
|
render: (text, record) => {
|
||||||
return record.status || t("general.labels.na");
|
return record.status || t("general.labels.na");
|
||||||
},
|
},
|
||||||
filteredValue: filter?.status || null,
|
filteredValue: filter?.status || null,
|
||||||
filters: bodyshop.md_ro_statuses.parts_statuses.map((s) => {
|
filters: bodyshop.md_ro_statuses?.parts_statuses.map((s) => {
|
||||||
return { text: s, value: [s] };
|
return { text: s, value: [s] };
|
||||||
}),
|
}),
|
||||||
onFilter: (value, record) => value.includes(record.status)
|
onFilter: (value, record) => value.includes(record.status)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter.jsx"
|
|||||||
import dayjs from "../../utils/day";
|
import dayjs from "../../utils/day";
|
||||||
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx";
|
||||||
import PriorityLabel from "../../utils/tasksPriorityLabel.jsx";
|
import PriorityLabel from "../../utils/tasksPriorityLabel.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task List Component
|
* Task List Component
|
||||||
@@ -289,6 +290,7 @@ function TaskListComponent({
|
|||||||
} else {
|
} else {
|
||||||
delete search[param];
|
delete search[param];
|
||||||
}
|
}
|
||||||
|
logImEXEvent("tasks_filter", { key: param });
|
||||||
history({ search: queryString.stringify(search) });
|
history({ search: queryString.stringify(search) });
|
||||||
},
|
},
|
||||||
[history, search]
|
[history, search]
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js";
|
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js";
|
||||||
import dayjs from "../../utils/day";
|
import dayjs from "../../utils/day";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -107,6 +108,7 @@ export function TaskListContainer({
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
logImEXEvent("task_completed", {});
|
||||||
|
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("tasks.successes.completed")
|
message: t("tasks.successes.completed")
|
||||||
@@ -160,6 +162,7 @@ export function TaskListContainer({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logImEXEvent("task_deleted", {});
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("tasks.successes.deleted")
|
message: t("tasks.successes.deleted")
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import AuditTrailMapping from "../../utils/AuditTrailMappings.js";
|
|||||||
import { isEqual } from "lodash";
|
import { isEqual } from "lodash";
|
||||||
import refetchRouteMappings from "./task-upsert-modal.route.mappings";
|
import refetchRouteMappings from "./task-upsert-modal.route.mappings";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
currentUser: selectCurrentUser,
|
currentUser: selectCurrentUser,
|
||||||
@@ -180,7 +181,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("tasks.successes.updated")
|
message: t("tasks.successes.updated")
|
||||||
});
|
});
|
||||||
|
logImEXEvent("task_update", {});
|
||||||
toggleModalVisible();
|
toggleModalVisible();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -217,7 +218,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
|
|
||||||
form.resetFields();
|
form.resetFields();
|
||||||
toggleModalVisible();
|
toggleModalVisible();
|
||||||
|
logImEXEvent("task_insert", {});
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("tasks.successes.created")
|
message: t("tasks.successes.created")
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import { useState } from "react";
|
|
||||||
import { Button, Form, Popconfirm } from "antd";
|
|
||||||
import { PageHeader } from "@ant-design/pro-layout";
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import { useMutation } from "@apollo/client";
|
import { useMutation } from "@apollo/client";
|
||||||
import VehicleDetailFormComponent from "./vehicle-detail-form.component";
|
import { Button, Form, Popconfirm } from "antd";
|
||||||
|
import { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import dayjs from "../../utils/day";
|
|
||||||
import { DELETE_VEHICLE, UPDATE_VEHICLE } from "../../graphql/vehicles.queries";
|
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
import { DELETE_VEHICLE, UPDATE_VEHICLE } from "../../graphql/vehicles.queries";
|
||||||
|
import dayjs from "../../utils/day";
|
||||||
|
import VehicleDetailFormComponent from "./vehicle-detail-form.component";
|
||||||
|
|
||||||
function VehicleDetailFormContainer({ vehicle, refetch }) {
|
function VehicleDetailFormContainer({ vehicle, refetch }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -20,6 +21,7 @@ function VehicleDetailFormContainer({ vehicle, refetch }) {
|
|||||||
|
|
||||||
const handleDelete = async () => {
|
const handleDelete = async () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("vehicle_delete", {});
|
||||||
const result = await deleteVehicle({
|
const result = await deleteVehicle({
|
||||||
variables: { id: vehicle.id }
|
variables: { id: vehicle.id }
|
||||||
});
|
});
|
||||||
@@ -42,6 +44,7 @@ function VehicleDetailFormContainer({ vehicle, refetch }) {
|
|||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
logImEXEvent("vehicle_update", {});
|
||||||
const result = await updateVehicle({
|
const result = await updateVehicle({
|
||||||
variables: { vehId: vehicle.id, vehicle: values }
|
variables: { vehId: vehicle.id, vehicle: values }
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -76,9 +76,11 @@ export const logImEXEvent = (eventName, additionalParams, stateProp = null) => {
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
const state = stateProp || store.getState();
|
const state = stateProp || store.getState();
|
||||||
|
|
||||||
const eventParams = {
|
const eventParams = {
|
||||||
shop: (state.user && state.user.bodyshop && state.user.bodyshop.shopname) || null,
|
shop: (state.user && state.user.bodyshop && state.user.bodyshop.shopname) || null,
|
||||||
user: (state.user && state.user.currentUser && state.user.currentUser.email) || null,
|
user: (state.user && state.user.currentUser && state.user.currentUser.email) || null,
|
||||||
|
partsManagementOnly: state?.user?.partsManagementOnly,
|
||||||
...additionalParams
|
...additionalParams
|
||||||
};
|
};
|
||||||
// axios.post("/ioevent", {
|
// axios.post("/ioevent", {
|
||||||
@@ -89,12 +91,12 @@ export const logImEXEvent = (eventName, additionalParams, stateProp = null) => {
|
|||||||
// dbevent: false,
|
// dbevent: false,
|
||||||
// env: `master-AIO|${import.meta.env.VITE_APP_GIT_SHA_DATE}`
|
// env: `master-AIO|${import.meta.env.VITE_APP_GIT_SHA_DATE}`
|
||||||
// });
|
// });
|
||||||
// console.log(
|
console.log(
|
||||||
// "%c[Analytics]",
|
"%c[Analytics]",
|
||||||
// "background-color: green ;font-weight:bold;",
|
"background-color: green ;font-weight:bold;",
|
||||||
// eventName,
|
eventName,
|
||||||
// eventParams
|
eventParams
|
||||||
// );
|
);
|
||||||
logEvent(analytics, eventName, eventParams);
|
logEvent(analytics, eventName, eventParams);
|
||||||
amplitude.track(eventName, eventParams);
|
amplitude.track(eventName, eventParams);
|
||||||
posthog.capture(eventName, eventParams);
|
posthog.capture(eventName, eventParams);
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ registerSW({ immediate: true });
|
|||||||
// Dinero.globalLocale = "en-CA";
|
// Dinero.globalLocale = "en-CA";
|
||||||
Dinero.globalRoundingMode = "HALF_EVEN";
|
Dinero.globalRoundingMode = "HALF_EVEN";
|
||||||
|
|
||||||
amplitude.init("6228a598e57cd66875cfd41604f1f891", {
|
amplitude.init(import.meta.env.VITE_APP_AMP_KEY, {
|
||||||
defaultTracking: true,
|
defaultTracking: true,
|
||||||
serverUrl: import.meta.env.VITE_APP_AMP_URL
|
serverUrl: import.meta.env.VITE_APP_AMP_URL
|
||||||
// {
|
// {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { pageLimit } from "../../utils/config";
|
|||||||
import { alphaSort, dateSort } from "../../utils/sorters";
|
import { alphaSort, dateSort } from "../../utils/sorters";
|
||||||
import useLocalStorage from "../../utils/useLocalStorage";
|
import useLocalStorage from "../../utils/useLocalStorage";
|
||||||
import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries";
|
import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBillEnterContext: (context) => dispatch(setModalContext({ context: context, modal: "billEnter" }))
|
setBillEnterContext: (context) => dispatch(setModalContext({ context: context, modal: "billEnter" }))
|
||||||
@@ -167,6 +168,7 @@ export function BillsListPage({ loading, data, refetch, total, setBillEnterConte
|
|||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
// Persist filters (including vendorname) and sorting
|
// Persist filters (including vendorname) and sorting
|
||||||
setState({ ...state, filteredInfo: { ...state.filteredInfo, ...filters }, sortedInfo: sorter });
|
setState({ ...state, filteredInfo: { ...state.filteredInfo, ...filters }, sortedInfo: sorter });
|
||||||
|
|
||||||
search.page = pagination.current;
|
search.page = pagination.current;
|
||||||
if (sorter && sorter.column && sorter.column.sortObject) {
|
if (sorter && sorter.column && sorter.column.sortObject) {
|
||||||
search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order));
|
search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order));
|
||||||
@@ -177,6 +179,7 @@ export function BillsListPage({ loading, data, refetch, total, setBillEnterConte
|
|||||||
}
|
}
|
||||||
search.sort = JSON.stringify({ [sorter.columnKey]: sorter.order });
|
search.sort = JSON.stringify({ [sorter.columnKey]: sorter.order });
|
||||||
history({ search: queryString.stringify(search) });
|
history({ search: queryString.stringify(search) });
|
||||||
|
logImEXEvent("bills_list_sort_filter", { pagination, filters, sorter });
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -192,6 +195,7 @@ export function BillsListPage({ loading, data, refetch, total, setBillEnterConte
|
|||||||
search: value || search.search,
|
search: value || search.search,
|
||||||
index: "bills"
|
index: "bills"
|
||||||
});
|
});
|
||||||
|
logImEXEvent("bills_search", { search: value || search.search, results: searchData?.data?.hits?.hits?.length });
|
||||||
setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source));
|
setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("Error while fetching search results", error);
|
console.log("Error while fetching search results", error);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
|||||||
import ContractCreatePageComponent from "./contract-create.page.component";
|
import ContractCreatePageComponent from "./contract-create.page.component";
|
||||||
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component";
|
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils.js";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -57,6 +58,7 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs, setSelec
|
|||||||
|
|
||||||
if (!result.errors) {
|
if (!result.errors) {
|
||||||
//Update the courtesy car to have the damage.
|
//Update the courtesy car to have the damage.
|
||||||
|
logImEXEvent("courtesy_car_contract_created", {});
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("contracts.successes.saved")
|
message: t("contracts.successes.saved")
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
|||||||
import JobsCreateComponent from "./jobs-create.component";
|
import JobsCreateComponent from "./jobs-create.component";
|
||||||
import JobCreateContext from "./jobs-create.context";
|
import JobCreateContext from "./jobs-create.context";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
});
|
});
|
||||||
@@ -70,6 +70,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
|
|||||||
label: t("titles.bc.jobs-new")
|
label: t("titles.bc.jobs-new")
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
logImEXEvent("manual_job_create_start", {});
|
||||||
}, [t, setBreadcrumbs, setSelectedHeader]);
|
}, [t, setBreadcrumbs, setSelectedHeader]);
|
||||||
|
|
||||||
const runInsertJob = (job) => {
|
const runInsertJob = (job) => {
|
||||||
@@ -81,6 +82,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
|
|||||||
error: null,
|
error: null,
|
||||||
newJobId: resp.data.insert_jobs.returning[0].id
|
newJobId: resp.data.insert_jobs.returning[0].id
|
||||||
});
|
});
|
||||||
|
logImEXEvent("manual_job_create_completed", {});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
notification["error"]({
|
notification["error"]({
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ export default defineConfig({
|
|||||||
|
|
||||||
// Strip console/debugger in prod to shrink bundles
|
// Strip console/debugger in prod to shrink bundles
|
||||||
esbuild: {
|
esbuild: {
|
||||||
drop: ["console", "debugger"]
|
//drop: ["console", "debugger"]
|
||||||
},
|
},
|
||||||
|
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
|
|||||||
Reference in New Issue
Block a user