diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 8c1cb3ed7..9348a53a0 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -1369,6 +1369,69 @@ + + jobnoteadded + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + jobnotedeleted + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + jobnoteupdated + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + jobspartsorder false @@ -2779,6 +2842,27 @@ + + savewithdiscrepancy + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + state_tax false @@ -11095,6 +11179,27 @@ + + sold + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -11267,6 +11372,27 @@ + + created_at + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -33621,6 +33747,37 @@ + + subjects + + + jobs + + + parts_order + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + vendors @@ -34503,6 +34660,116 @@ + + groups + + + customers + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + jobs + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + payroll + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + purchases + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + sales + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + key false @@ -34569,6 +34836,27 @@ + + csi + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + exportlogs false @@ -34828,6 +35116,27 @@ + + csi + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + estimator_detail false diff --git a/client/package.json b/client/package.json index 8cdb60e5b..3ec7c8907 100644 --- a/client/package.json +++ b/client/package.json @@ -4,16 +4,16 @@ "private": true, "proxy": "http://localhost:5000", "dependencies": { - "@apollo/client": "^3.4.10", - "@craco/craco": "^6.2.0", + "@apollo/client": "^3.4.13", + "@craco/craco": "^6.3.0", "@fingerprintjs/fingerprintjs": "^3.3.0", "@lourenci/react-kanban": "^2.1.0", "@openreplay/tracker": "^3.3.1", "@openreplay/tracker-assist": "^3.1.1", "@openreplay/tracker-graphql": "^3.0.0", "@openreplay/tracker-redux": "^3.0.0", - "@sentry/react": "^6.11.0", - "@sentry/tracing": "^6.11.0", + "@sentry/react": "^6.13.0", + "@sentry/tracing": "^6.13.0", "@stripe/react-stripe-js": "^1.4.0", "@stripe/stripe-js": "^1.17.1", "@tanem/react-nprogress": "^3.0.79", @@ -26,17 +26,17 @@ "enquire-js": "^0.2.1", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "firebase": "^9.0.0", + "firebase": "^9.0.2", "graphql": "^15.5.3", - "i18next": "^20.4.0", + "i18next": "^21.0.0", "i18next-browser-languagedetector": "^6.1.2", "jsoneditor": "^9.5.4", "jsreport-browser-client-dist": "^1.3.0", - "libphonenumber-js": "^1.9.26", + "libphonenumber-js": "^1.9.34", "logrocket": "^2.0.0", "markerjs2": "^2.11.2", "moment-business-days": "^1.2.0", - "phone": "^3.1.6", + "phone": "^3.1.8", "preval.macro": "^5.0.0", "prop-types": "^15.7.2", "query-string": "^7.0.1", @@ -50,7 +50,7 @@ "react-drag-listview": "^0.1.8", "react-grid-gallery": "^0.5.5", "react-grid-layout": "^1.3.0", - "react-i18next": "^11.11.4", + "react-i18next": "^11.12.0", "react-icons": "^4.2.0", "react-number-format": "^4.7.3", "react-redux": "^7.2.5", @@ -59,29 +59,29 @@ "react-scripts": "^4.0.3", "react-sublime-video": "^0.2.5", "react-virtualized": "^9.22.3", - "recharts": "^2.1.2", + "recharts": "^2.1.3", "redux": "^4.1.1", "redux-persist": "^6.0.0", "redux-saga": "^1.1.3", "redux-state-sync": "^3.1.2", "reselect": "^4.0.0", - "sass": "^1.38.2", + "sass": "^1.41.1", "socket.io-client": "^4.2.0", "styled-components": "^5.3.1", "subscriptions-transport-ws": "^0.9.18", "web-vitals": "^2.1.0", - "workbox-background-sync": "^6.2.4", - "workbox-broadcast-update": "^6.2.4", - "workbox-cacheable-response": "^6.2.4", - "workbox-core": "^6.2.4", - "workbox-expiration": "^6.2.4", - "workbox-google-analytics": "^6.2.4", - "workbox-navigation-preload": "^6.2.4", - "workbox-precaching": "^6.2.4", - "workbox-range-requests": "^6.2.4", - "workbox-routing": "^6.2.4", - "workbox-strategies": "^6.2.4", - "workbox-streams": "^6.2.4" + "workbox-background-sync": "^6.3.0", + "workbox-broadcast-update": "^6.3.0", + "workbox-cacheable-response": "^6.3.0", + "workbox-core": "^6.3.0", + "workbox-expiration": "^6.3.0", + "workbox-google-analytics": "^6.3.0", + "workbox-navigation-preload": "^6.3.0", + "workbox-precaching": "^6.3.0", + "workbox-range-requests": "^6.3.0", + "workbox-routing": "^6.3.0", + "workbox-strategies": "^6.3.0", + "workbox-streams": "^6.3.0" }, "scripts": { "postinstall": "patch-package", diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index 8f60c0163..2f05560ef 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -11,7 +11,8 @@ import App from "./App"; import trackerGraphQL from "@openreplay/tracker-graphql"; //import trackerRedux from "@openreplay/tracker-redux"; import Tracker from "@openreplay/tracker"; -//import trackerAssist from "@openreplay/tracker-assist"; +import trackerAssist from "@openreplay/tracker-assist"; +import { getCurrentUser } from "../firebase/firebase.utils"; moment.locale("en-US"); export const tracker = new Tracker({ @@ -21,12 +22,16 @@ export const tracker = new Tracker({ ? { __DISABLE_SECURE_MODE: true } : {}), // beaconSize: 10485760, - onStart: ({ sessionID }) => console.log("ORS SESSION ", sessionID), + onStart: async ({ sessionID }) => { + const user = await getCurrentUser(); + tracker.setUserID(user.email); + console.log("ORS SESSION ", sessionID, user.email); + }, }); -// tracker.use( -// trackerAssist({ confirmText: "Technical support is about to assist you." }) -// ); // check the list of available options below +tracker.use( + trackerAssist({ confirmText: "Technical support is about to assist you." }) +); // check the list of available options below export const recordGraphQL = tracker.use(trackerGraphQL()); tracker.start(); if (process.env.NODE_ENV === "production") LogRocket.init("gvfvfw/bodyshopapp"); 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 bd45d8c5e..83ff2a7b2 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 @@ -18,8 +18,10 @@ import { selectBodyshop, selectCurrentUser, } from "../../redux/user/user.selectors"; +import confirmDialog from "../../utils/asyncConfirm"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import BillFormContainer from "../bill-form/bill-form.container"; +import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility"; import { handleUpload } from "../documents-upload/documents-upload.utility"; const mapStateToProps = createStructuredSelector({ @@ -48,7 +50,31 @@ function BillEnterModalContainer({ const [loading, setLoading] = useState(false); const client = useApolloClient(); + const formValues = useMemo(() => { + return { + ...billEnterModal.context.bill, + jobid: + (billEnterModal.context.job && billEnterModal.context.job.id) || null, + federal_tax_rate: + (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.federal_tax_rate) || + 0, + state_tax_rate: + (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.state_tax_rate) || + 0, + local_tax_rate: + (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.local_tax_rate) || + 0, + }; + }, [billEnterModal, bodyshop]); + const handleFinish = async (values) => { + let totals = CalculateBillTotal(values); + if (totals.discrepancy.getAmount() !== 0) { + if (!(await confirmDialog(t("bills.labels.savewithdiscrepancy")))) { + return; + } + } + setLoading(true); const { upload, location, ...remainingValues } = values; @@ -190,7 +216,7 @@ function BillEnterModalContainer({ if (enterAgain) { form.resetFields(); - form.setFieldsValue({ billlines: [] }); + form.setFieldsValue(formValues); } else { toggleModalVisible(); } @@ -208,23 +234,6 @@ function BillEnterModalContainer({ if (enterAgain) form.submit(); }, [enterAgain, form]); - const formValues = useMemo(() => { - return { - ...billEnterModal.context.bill, - jobid: - (billEnterModal.context.job && billEnterModal.context.job.id) || null, - federal_tax_rate: - (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.federal_tax_rate) || - 0, - state_tax_rate: - (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.state_tax_rate) || - 0, - local_tax_rate: - (bodyshop.bill_tax_rates && bodyshop.bill_tax_rates.local_tax_rate) || - 0, - }; - }, [billEnterModal, bodyshop]); - useEffect(() => { if (billEnterModal.visible) { form.setFieldsValue(formValues); diff --git a/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx b/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx index b13dad1c2..66a67c7d5 100644 --- a/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx +++ b/client/src/components/bill-line-search-select/bill-line-search-select.component.jsx @@ -13,6 +13,7 @@ const BillLineSearchSelect = ({ options, disabled, ...restProps }, ref) => { ref={ref} showSearch optionFilterProp="line_desc" + notFoundContent={"Removed."} {...restProps} > @@ -21,14 +22,18 @@ const BillLineSearchSelect = ({ options, disabled, ...restProps }, ref) => { {options ? options.map((item) => ( - {`${item.line_desc}${ + {`${item.removed ? `(REMOVED) ` : ""}${item.line_desc}${ item.oem_partno ? ` - ${item.oem_partno}` : "" }`} diff --git a/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx b/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx index 3d43a6f78..59d19cb85 100644 --- a/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx +++ b/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx @@ -8,6 +8,7 @@ import { selectSelectedConversation } from "../../redux/messaging/messaging.sele import PhoneFormatter from "../../utils/PhoneFormatter"; import "./chat-conversation-list.styles.scss"; import { useTranslation } from "react-i18next"; +import { TimeAgoFormatter } from "../../utils/DateFormatter"; const mapStateToProps = createStructuredSelector({ selectedConversation: selectSelectedConversation, @@ -60,13 +61,18 @@ export function ChatConversationListComponent({ ) : ( {item.phone_num} )} - {item.job_conversations.length > 0 - ? item.job_conversations.map((j, idx) => ( - - {j.job.ro_number} - - )) - : null} + + + {item.job_conversations.length > 0 + ? item.job_conversations.map((j, idx) => ( + + {j.job.ro_number} + + )) + : null} + + {item.updated_at} + )} diff --git a/client/src/components/chat-messages-list/chat-message-list.component.jsx b/client/src/components/chat-messages-list/chat-message-list.component.jsx index 2780f5441..d6460a89d 100644 --- a/client/src/components/chat-messages-list/chat-message-list.component.jsx +++ b/client/src/components/chat-messages-list/chat-message-list.component.jsx @@ -1,4 +1,5 @@ import Icon from "@ant-design/icons"; +import { Tooltip } from "antd"; import i18n from "i18next"; import moment from "moment"; import React, { useEffect, useRef } from "react"; @@ -9,6 +10,7 @@ import { CellMeasurerCache, List, } from "react-virtualized"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; import "./chat-message-list.styles.scss"; export default function ChatMessageListComponent({ messages }) { @@ -85,17 +87,22 @@ export default function ChatMessageListComponent({ messages }) { const MessageRender = (message) => { return ( - - {message.image_path && - message.image_path.map((i, idx) => ( - - - - - - ))} - {message.text} - + + + {message.image_path && + message.image_path.map((i, idx) => ( + + + + + + ))} + {message.text} + + ); }; diff --git a/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx b/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx index c9953a3e7..9516013d3 100644 --- a/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx +++ b/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx @@ -31,6 +31,9 @@ const CourtesyCarStatusComponent = ({ value, onChange }, ref) => { {t("courtesycars.status.out")} + + {t("courtesycars.status.sold")} + ); }; diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx index d531606e5..000f56a3a 100644 --- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx +++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx @@ -45,6 +45,10 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) { text: t("courtesycars.status.out"), value: "courtesycars.status.out", }, + { + text: t("courtesycars.status.sold"), + value: "courtesycars.status.sold", + }, ], onFilter: (value, record) => value.includes(record.status), sortOrder: diff --git a/client/src/components/dms-post-form/dms-post-form.component.jsx b/client/src/components/dms-post-form/dms-post-form.component.jsx index d018fe336..637a858af 100644 --- a/client/src/components/dms-post-form/dms-post-form.component.jsx +++ b/client/src/components/dms-post-form/dms-post-form.component.jsx @@ -21,6 +21,8 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; +import DmsCdkMakesRefetch from "../dms-cdk-makes/dms-cdk-makes.refetch.component"; + const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, }); @@ -142,7 +144,7 @@ export function DmsPostForm({ bodyshop, socket, job }) { - {/* */} + { diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx index 0d640fff1..b02b26663 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -400,7 +400,7 @@ export function JobLinesComponent({ setState({ ...state, filteredInfo: { - part_type: ["PAN,PAC,PAR,PAL,PAA,PAM,PAP,PAS,PASL"], + part_type: ["PAN,PAC,PAR,PAL,PAA,PAM,PAP,PAS,PASL,PAG"], }, }); }} @@ -435,7 +435,7 @@ export function JobLinesComponent({ columns={columns} rowKey="id" loading={loading} - pagination={{ position: "top", defaultPageSize: 50 }} + pagination={false} dataSource={jobLines} onChange={handleTableChange} scroll={{ diff --git a/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx b/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx index 40cd8120c..26ce3dd8e 100644 --- a/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx +++ b/client/src/components/job-reconciliation-bills-table/job-reconciliation-bills-table.component.jsx @@ -21,7 +21,8 @@ export default function JobReconciliationBillsTable({ title: t("billlines.fields.line_desc"), dataIndex: "line_desc", key: "line_desc", - width: "35%", + ellipsis: true, + minWidth: "65rem", sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), sortOrder: state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, @@ -30,7 +31,7 @@ export default function JobReconciliationBillsTable({ title: t("billlines.labels.from"), dataIndex: "from", key: "from", - width: "20%", + ellipsis: true, render: (text, record) => `${record.bill.vendor && record.bill.vendor.name} / ${ @@ -42,6 +43,7 @@ export default function JobReconciliationBillsTable({ dataIndex: "actual_price", key: "actual_price", sorter: (a, b) => a.actual_price - b.actual_price, + width: "7rem", sortOrder: state.sortedInfo.columnKey === "actual_price" && state.sortedInfo.order, render: (text, record) => ( @@ -53,6 +55,7 @@ export default function JobReconciliationBillsTable({ dataIndex: "actual_cost", key: "actual_cost", sorter: (a, b) => a.actual_cost - b.actual_cost, + width: "7rem", sortOrder: state.sortedInfo.columnKey === "actual_cost" && state.sortedInfo.order, render: (text, record) => ( @@ -64,6 +67,7 @@ export default function JobReconciliationBillsTable({ dataIndex: "quantity", key: "quantity", sorter: (a, b) => a.quantity - b.quantity, + width: "4rem", sortOrder: state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, }, @@ -72,9 +76,11 @@ export default function JobReconciliationBillsTable({ dataIndex: "is_credit_memo", key: "is_credit_memo", sorter: (a, b) => a.bill.is_credit_memo - b.bill.is_credit_memo, + width: "8rem", sortOrder: state.sortedInfo.columnKey === "is_credit_memo" && state.sortedInfo.order, + render: (text, record) => ( ), @@ -94,7 +100,7 @@ export default function JobReconciliationBillsTable({ alphaSort(a.line_desc, b.line_desc), + ellipses: true, sortOrder: state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, }, @@ -57,6 +58,7 @@ export default function JobReconcilitionPartsTable({ dataIndex: "act_price", key: "act_price", sorter: (a, b) => a.act_price - b.act_price, + width: "7rem", sortOrder: state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, @@ -68,10 +70,12 @@ export default function JobReconcilitionPartsTable({ title: t("joblines.fields.part_qty"), dataIndex: "part_qty", key: "part_qty", + width: "4rem", }, { title: t("joblines.fields.total"), dataIndex: "total", + width: "7rem", key: "total", sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, sortOrder: @@ -89,6 +93,7 @@ export default function JobReconcilitionPartsTable({ dataIndex: "status", key: "status", sorter: (a, b) => alphaSort(a.status, b.status), + width: "6rem", sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, }, @@ -108,7 +113,7 @@ export default function JobReconcilitionPartsTable({ pagination={false} columns={columns} size="small" - scroll={{ y: "80vh", x: true }} + scroll={{ y: "60vh" }} rowKey="id" dataSource={jobLineData} onChange={handleTableChange} diff --git a/client/src/components/jobs-available-table/jobs-available-table.container.jsx b/client/src/components/jobs-available-table/jobs-available-table.container.jsx index d77d5c1d3..b4758f361 100644 --- a/client/src/components/jobs-available-table/jobs-available-table.container.jsx +++ b/client/src/components/jobs-available-table/jobs-available-table.container.jsx @@ -29,6 +29,7 @@ import { selectBodyshop, selectCurrentUser, } from "../../redux/user/user.selectors"; +import confirmDialog from "../../utils/asyncConfirm"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import AlertComponent from "../alert/alert.component"; import JobsAvailableScan from "../jobs-available-scan/jobs-available-scan.component"; @@ -394,14 +395,6 @@ function replaceEmpty(someObj, replaceValue = null) { return JSON.parse(temp); } -function confirmDialog(msg) { - return new Promise(function (resolve, reject) { - let confirmed = window.confirm(msg); - - return confirmed ? resolve(true) : resolve(false); - }); -} - async function CheckTaxRates(estData, bodyshop) { //LKQ Check if ( diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx index 83ade9d5c..bb9afbf51 100644 --- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx +++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx @@ -76,6 +76,9 @@ export function JobsDetailHeader({ job, bodyshop, disabled }) { {job.ins_co_nm} {job.clm_no} + + {job.po_number} + {job.clm_total} / diff --git a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx index 6c186b6c9..18cd7b105 100644 --- a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -130,13 +130,10 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { ellipsis: true, sorter: true, //(a, b) => alphaSort(a.clm_no, b.clm_no), sortOrder: sortcolumn === "clm_no" && sortorder, - render: (text, record) => { - return record.clm_no ? ( - {record.clm_no} - ) : ( - t("general.labels.unknown") - ); - }, + render: (text, record) => + `${record.clm_no || ""}${ + record.po_number ? ` (PO: ${record.po_number})` : "" + }`, }, { title: t("jobs.fields.ins_co_nm"), diff --git a/client/src/components/jobs-list/jobs-list.component.jsx b/client/src/components/jobs-list/jobs-list.component.jsx index 04fb749f2..fe9077ae9 100644 --- a/client/src/components/jobs-list/jobs-list.component.jsx +++ b/client/src/components/jobs-list/jobs-list.component.jsx @@ -208,6 +208,10 @@ export function JobsList({ bodyshop }) { sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), sortOrder: state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + render: (text, record) => + `${record.clm_no || ""}${ + record.po_number ? ` (PO: ${record.po_number})` : "" + }`, }, { title: t("jobs.fields.ins_co_nm"), diff --git a/client/src/components/jobs-notes/jobs-notes.container.jsx b/client/src/components/jobs-notes/jobs-notes.container.jsx index 608c21ae4..7ac7af91c 100644 --- a/client/src/components/jobs-notes/jobs-notes.container.jsx +++ b/client/src/components/jobs-notes/jobs-notes.container.jsx @@ -10,8 +10,21 @@ import { QUERY_NOTES_BY_JOB_PK, } from "../../graphql/notes.queries"; import JobNotesComponent from "./jobs.notes.component"; +import { insertAuditTrail } from "../../redux/application/application.actions"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import AuditTrailMapping from "../../utils/AuditTrailMappings"; -export default function JobNotesContainer({ jobId }) { +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser +}); +const mapDispatchToProps = (dispatch) => ({ + insertAuditTrail: ({ jobid, operation }) => + dispatch(insertAuditTrail({ jobid, operation })), +}); +export default connect(mapStateToProps, mapDispatchToProps)(JobNotesContainer); + +export function JobNotesContainer({ jobId, insertAuditTrail }) { const { loading, error, data, refetch } = useQuery(QUERY_NOTES_BY_JOB_PK, { variables: { id: jobId }, fetchPolicy: "network-only", @@ -32,6 +45,10 @@ export default function JobNotesContainer({ jobId }) { notification["success"]({ message: t("notes.successes.deleted"), }); + insertAuditTrail({ + jobid: jobId, + operation: AuditTrailMapping.jobnotedeleted(), + }); }); setDeleteLoading(false); }; diff --git a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx index 487de84b4..38d83a302 100644 --- a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx +++ b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx @@ -10,6 +10,8 @@ import { selectNoteUpsert } from "../../redux/modals/modals.selectors"; import { selectCurrentUser } from "../../redux/user/user.selectors"; import NoteUpsertModalComponent from "./note-upsert-modal.component"; import { logImEXEvent } from "../../firebase/firebase.utils"; +import { insertAuditTrail } from "../../redux/application/application.actions"; +import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -17,12 +19,15 @@ const mapStateToProps = createStructuredSelector({ }); const mapDispatchToProps = (dispatch) => ({ toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")), + insertAuditTrail: ({ jobid, operation }) => + dispatch(insertAuditTrail({ jobid, operation })), }); export function NoteUpsertModalContainer({ currentUser, noteUpsertModal, toggleModalVisible, + insertAuditTrail, }) { const { t } = useTranslation(); const [insertNote] = useMutation(INSERT_NEW_NOTE); @@ -56,6 +61,10 @@ export function NoteUpsertModalContainer({ notification["success"]({ message: t("notes.successes.updated"), }); + insertAuditTrail({ + jobid: context.jobId, + operation: AuditTrailMapping.jobnoteupdated(), + }); }); if (refetch) refetch(); toggleModalVisible(); @@ -75,6 +84,10 @@ export function NoteUpsertModalContainer({ notification["success"]({ message: t("notes.successes.create"), }); + insertAuditTrail({ + jobid: context.jobId, + operation: AuditTrailMapping.jobnoteadded(), + }); }); } }; diff --git a/client/src/components/parts-order-modal/parts-order-modal.container.jsx b/client/src/components/parts-order-modal/parts-order-modal.container.jsx index c9e091780..02d2d7614 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.container.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.container.jsx @@ -176,7 +176,7 @@ export function PartsOrderModalContainer({ if (refetch) refetch(); toggleModalVisible(); - const Templates = TemplateList("partsorder"); + const Templates = TemplateList("partsorder", context); if (sendType === "e") { const matchingVendor = data.vendors.filter( diff --git a/client/src/components/report-center-modal/report-center-modal.component.jsx b/client/src/components/report-center-modal/report-center-modal.component.jsx index 536d5deed..d51a6333d 100644 --- a/client/src/components/report-center-modal/report-center-modal.component.jsx +++ b/client/src/components/report-center-modal/report-center-modal.component.jsx @@ -1,5 +1,16 @@ import { useLazyQuery } from "@apollo/client"; -import { Button, DatePicker, Form, Radio, Space } from "antd"; +import { + Button, + Card, + Col, + DatePicker, + Form, + Input, + Radio, + Row, + Typography, +} from "antd"; +import _ from "lodash"; import moment from "moment"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; @@ -14,7 +25,6 @@ import { TemplateList } from "../../utils/TemplateConstants"; import EmployeeSearchSelect from "../employee-search-select/employee-search-select.component"; import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; import "./report-center-modal.styles.scss"; - const mapStateToProps = createStructuredSelector({ reportCenterModal: selectReportCenter, }); @@ -28,9 +38,14 @@ export default connect( export function ReportCenterModalComponent({ reportCenterModal }) { const [form] = Form.useForm(); + const [search, setSearch] = useState(""); + const [loading, setLoading] = useState(false); const { t } = useTranslation(); const Templates = TemplateList("report_center"); + const ReportsList = Object.keys(Templates).map((key) => { + return Templates[key]; + }); const { visible } = reportCenterModal; const [callVendorQuery, { data: vendorData, called: vendorCalled }] = @@ -67,6 +82,9 @@ export function ReportCenterModalComponent({ reportCenterModal }) { ...(end ? { end: moment(end).endOf("day").format("YYYY-MM-DD") } : {}), + ...(start ? { starttz: moment(start).startOf("day") } : {}), + ...(end ? { endtz: moment(end).endOf("day") } : {}), + ...(id ? { id: id } : {}), }, }, @@ -80,6 +98,17 @@ export function ReportCenterModalComponent({ reportCenterModal }) { setLoading(false); }; + const FilteredReportsList = + search !== "" + ? ReportsList.filter((r) => + r.title.toLowerCase().includes(search.toLowerCase()) + ) + : ReportsList; + + //Group it, create cards, and then filter out. + + const grouped = _.groupBy(FilteredReportsList, "group"); + return ( + setSearch(e.target.value)} + value={search} + /> - - {Object.keys(Templates).map((key) => ( + {/* {Object.keys(Templates).map((key) => ( {Templates[key].title} + ))} */} + + + {Object.keys(grouped).map((key) => ( + + + + {t(`reportcenter.labels.groups.${key}`)} + + + {grouped[key].map((item) => ( + + + {item.title} + + + ))} + + + ))} - + - + {() => { const key = form.getFieldValue("key"); if (!key) return null; @@ -137,14 +189,14 @@ export function ReportCenterModalComponent({ reportCenterModal }) { shouldUpdate={(prev, cur) => Templates[prev.key]?.idtype !== Templates[cur.key]?.idtype } - style={{ display: "none" }} + style={{ display: "none", margin: 0, padding: 0 }} > {() => { form.setFieldsValue({ id: null }); return null; }} - + {() => { const key = form.getFieldValue("key"); if (!key) return null; @@ -204,7 +256,7 @@ export function ReportCenterModalComponent({ reportCenterModal }) { ]} > diff --git a/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx index c24bf9825..8ba00d309 100644 --- a/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx +++ b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx @@ -132,8 +132,8 @@ const JobRelatedTicketsTable = ({ return { id: `${item.jobKey}${costCenter}`, item, - actHrs, - prodHrs, + actHrs: actHrs.toFixed(1), + prodHrs: prodHrs.toFixed(1), clockHrs, }; }); diff --git a/client/src/components/vendors-form/vendors-form.component.jsx b/client/src/components/vendors-form/vendors-form.component.jsx index d9ab9b483..4f3e07b0f 100644 --- a/client/src/components/vendors-form/vendors-form.component.jsx +++ b/client/src/components/vendors-form/vendors-form.component.jsx @@ -153,7 +153,7 @@ export default function VendorsFormComponent({ - + diff --git a/client/src/firebase/firebase.utils.js b/client/src/firebase/firebase.utils.js index a9d562a3a..30828c71a 100644 --- a/client/src/firebase/firebase.utils.js +++ b/client/src/firebase/firebase.utils.js @@ -1,7 +1,8 @@ import { getAnalytics, logEvent } from "firebase/analytics"; import { initializeApp } from "firebase/app"; -import { getAuth } from "firebase/auth"; +import { getAuth, updatePassword, updateProfile } from "firebase/auth"; import { getFirestore } from "firebase/firestore"; +import { tracker } from "../App/App.container"; //import { getMessaging } from "firebase/messaging"; import { store } from "../redux/store"; @@ -25,7 +26,7 @@ export const getCurrentUser = () => { export const updateCurrentUser = (userDetails) => { return new Promise((resolve, reject) => { const unsubscribe = auth.onAuthStateChanged((userAuth) => { - userAuth.updateProfile(userDetails).then((r) => { + updateProfile(userAuth, userDetails).then((r) => { unsubscribe(); resolve(userAuth); }); @@ -36,19 +37,7 @@ export const updateCurrentUser = (userDetails) => { export const updateCurrentPassword = async (password) => { const currentUser = await getCurrentUser(); - return currentUser.updatePassword(password); - - // return new Promise((resolve, reject) => { - // const unsubscribe = auth.onAuthStateChanged( - // (userAuth) => { - // userAuth.updatePassword(password).then((r) => { - // unsubscribe(); - // resolve(userAuth); - // }); - // }, - // (error) => reject(error) - // ); - // }); + return updatePassword(currentUser, password); }; //let messaging; @@ -81,6 +70,9 @@ export const logImEXEvent = (eventName, additionalParams, stateProp = null) => { eventParams ); logEvent(analytics, eventName, eventParams); + + //Log event to OpenReplay server. + tracker.event(eventName, eventParams); }; // if (messaging) { diff --git a/client/src/graphql/conversations.queries.js b/client/src/graphql/conversations.queries.js index d6b0f4e71..bf54fca29 100644 --- a/client/src/graphql/conversations.queries.js +++ b/client/src/graphql/conversations.queries.js @@ -9,6 +9,7 @@ export const CONVERSATION_LIST_SUBSCRIPTION = gql` ) { phone_num id + updated_at job_conversations { job { id diff --git a/client/src/graphql/jobs-lines.queries.js b/client/src/graphql/jobs-lines.queries.js index 6aadff627..ef68fe3be 100644 --- a/client/src/graphql/jobs-lines.queries.js +++ b/client/src/graphql/jobs-lines.queries.js @@ -160,7 +160,8 @@ export const UPDATE_JOB_LINE = gql` export const GET_JOB_LINES_TO_ENTER_BILL = gql` query GET_JOB_LINES_TO_ENTER_BILL($id: uuid!) { - joblines(where: { jobid: { _eq: $id }, removed: { _eq: false } }) { + joblines(where: { jobid: { _eq: $id } }) { + removed id line_desc part_type diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index ed7307e45..ead399f68 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -31,6 +31,7 @@ export const QUERY_ALL_ACTIVE_JOBS = gql` id ins_co_nm clm_no + po_number clm_total owner_owing ro_number @@ -362,6 +363,7 @@ export const GET_JOB_BY_PK = gql` converted lbr_adjustments ro_number + po_number clm_total inproduction vehicleid @@ -440,6 +442,7 @@ export const GET_JOB_BY_PK = gql` job_totals ownr_fn ownr_ln + ownr_co_nm ownr_ea ownr_addr1 ownr_addr2 @@ -455,6 +458,7 @@ export const GET_JOB_BY_PK = gql` id ownr_fn ownr_ln + ownr_co_nm ownr_ea ownr_addr1 ownr_addr2 @@ -674,6 +678,7 @@ export const QUERY_JOB_CARD_DETAILS = gql` inproduction production_vars ownr_ln + ownr_co_nm ownr_ph1 ownr_ea ca_gst_registrant @@ -715,7 +720,7 @@ export const QUERY_JOB_CARD_DETAILS = gql` actual_completion actual_delivery actual_in - + po_number id ins_co_nm ins_ct_fn @@ -1660,6 +1665,7 @@ export const QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED = gql` clm_total owner_owing ro_number + po_number scheduled_completion scheduled_in scheduled_delivery diff --git a/client/src/redux/messaging/messaging.sagas.js b/client/src/redux/messaging/messaging.sagas.js index 40b1f6e53..73e56c37b 100644 --- a/client/src/redux/messaging/messaging.sagas.js +++ b/client/src/redux/messaging/messaging.sagas.js @@ -90,8 +90,6 @@ export function* onSendMessage() { } export function* sendMessage({ payload }) { try { - yield logImEXEvent("messaging_send_message"); - const response = yield call(axios.post, "/sms/send", payload); if (response.status === 200) { yield put(sendMessageSuccess(payload)); diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 696eebcb4..5d11c4007 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -96,6 +96,9 @@ "jobimported": "Job imported.", "jobinproductionchange": "Job production status set to {{inproduction}}", "jobmodifylbradj": "Labor adjustments modified.", + "jobnoteadded": "Note added to job.", + "jobnotedeleted": "Note deleted from job.", + "jobnoteupdated": "Note updated on job.", "jobspartsorder": "Parts order {{order_number}} added to job.", "jobspartsreturn": "Parts return {{order_number}} added to job.", "jobstatuschange": "Job status changed to {{status}}.", @@ -179,6 +182,7 @@ "noneselected": "No bill selected.", "onlycmforinvoiced": "Only credit memos can be entered for any job that has been invoiced, exported, or voided.", "retailtotal": "Bills Retail Total", + "savewithdiscrepancy": "You are about to save this bill with a discrepancy. The system will continue to use the calculated amount using the bill lines. Press cancel to return to the bill.", "state_tax": "Provincial/State Tax", "subtotal": "Subtotal", "totalreturns": "Total Returns" @@ -685,7 +689,8 @@ "status": { "in": "Available", "inservice": "In Service", - "out": "Rented" + "out": "Rented", + "sold": "Sold" }, "successes": { "saved": "Courtesy Car saved successfully." @@ -702,7 +707,8 @@ "notfoundtitle": "No survey found." }, "fields": { - "completedon": "Completed On" + "completedon": "Completed On", + "created_at": "Created At" }, "labels": { "nologgedinuser": "Please log out of ImEX Online", @@ -2008,6 +2014,11 @@ "payments": { "ca_bc_etf_table": "ICBC ETF Table" }, + "subjects": { + "jobs": { + "parts_order": "$t(printcenter.jobs.parts_order) PO: {{ro_number}}" + } + }, "vendors": { "purchases_by_vendor_detailed": "Purchases by Vendor - Detailed", "purchases_by_vendor_summary": "Purchases by Vendor - Summary" @@ -2072,10 +2083,18 @@ "employee": "Employee", "filterson": "Filters on {{object}}: {{field}}", "generateasemail": "Generate as Email?", + "groups": { + "customers": "Customers", + "jobs": "Jobs & Costing", + "payroll": "Payroll", + "purchases": "Purchases", + "sales": "Sales" + }, "key": "Report", "objects": { "appointments": "Appointments", "bills": "Bills", + "csi": "CSI", "exportlogs": "Export Logs", "jobs": "Jobs", "parts_orders": "Parts Orders", @@ -2091,6 +2110,7 @@ "attendance_employee": "Employee Attendance", "attendance_summary": "Attendance Summary (All Employees)", "credits_not_received_date": "Credits not Received by Date", + "csi": "CSI Responses", "estimator_detail": "Jobs by Estimator (Detail)", "estimator_summary": "Jobs by Estimator (Summary)", "export_payables": "Export Log - Payables", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 0c1427756..37a8f3555 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -96,6 +96,9 @@ "jobimported": "", "jobinproductionchange": "", "jobmodifylbradj": "", + "jobnoteadded": "", + "jobnotedeleted": "", + "jobnoteupdated": "", "jobspartsorder": "", "jobspartsreturn": "", "jobstatuschange": "", @@ -179,6 +182,7 @@ "noneselected": "", "onlycmforinvoiced": "", "retailtotal": "", + "savewithdiscrepancy": "", "state_tax": "", "subtotal": "", "totalreturns": "" @@ -685,7 +689,8 @@ "status": { "in": "", "inservice": "", - "out": "" + "out": "", + "sold": "" }, "successes": { "saved": "" @@ -702,7 +707,8 @@ "notfoundtitle": "" }, "fields": { - "completedon": "" + "completedon": "", + "created_at": "" }, "labels": { "nologgedinuser": "", @@ -2008,6 +2014,11 @@ "payments": { "ca_bc_etf_table": "" }, + "subjects": { + "jobs": { + "parts_order": "" + } + }, "vendors": { "purchases_by_vendor_detailed": "", "purchases_by_vendor_summary": "" @@ -2072,10 +2083,18 @@ "employee": "", "filterson": "", "generateasemail": "", + "groups": { + "customers": "", + "jobs": "", + "payroll": "", + "purchases": "", + "sales": "" + }, "key": "", "objects": { "appointments": "", "bills": "", + "csi": "", "exportlogs": "", "jobs": "", "parts_orders": "", @@ -2091,6 +2110,7 @@ "attendance_employee": "", "attendance_summary": "", "credits_not_received_date": "", + "csi": "", "estimator_detail": "", "estimator_summary": "", "export_payables": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index a965dbd39..a54e9e66d 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -96,6 +96,9 @@ "jobimported": "", "jobinproductionchange": "", "jobmodifylbradj": "", + "jobnoteadded": "", + "jobnotedeleted": "", + "jobnoteupdated": "", "jobspartsorder": "", "jobspartsreturn": "", "jobstatuschange": "", @@ -179,6 +182,7 @@ "noneselected": "", "onlycmforinvoiced": "", "retailtotal": "", + "savewithdiscrepancy": "", "state_tax": "", "subtotal": "", "totalreturns": "" @@ -685,7 +689,8 @@ "status": { "in": "", "inservice": "", - "out": "" + "out": "", + "sold": "" }, "successes": { "saved": "" @@ -702,7 +707,8 @@ "notfoundtitle": "" }, "fields": { - "completedon": "" + "completedon": "", + "created_at": "" }, "labels": { "nologgedinuser": "", @@ -2008,6 +2014,11 @@ "payments": { "ca_bc_etf_table": "" }, + "subjects": { + "jobs": { + "parts_order": "" + } + }, "vendors": { "purchases_by_vendor_detailed": "", "purchases_by_vendor_summary": "" @@ -2072,10 +2083,18 @@ "employee": "", "filterson": "", "generateasemail": "", + "groups": { + "customers": "", + "jobs": "", + "payroll": "", + "purchases": "", + "sales": "" + }, "key": "", "objects": { "appointments": "", "bills": "", + "csi": "", "exportlogs": "", "jobs": "", "parts_orders": "", @@ -2091,6 +2110,7 @@ "attendance_employee": "", "attendance_summary": "", "credits_not_received_date": "", + "csi": "", "estimator_detail": "", "estimator_summary": "", "export_payables": "", diff --git a/client/src/utils/AuditTrailMappings.js b/client/src/utils/AuditTrailMappings.js index 810c3ec86..e0d43b098 100644 --- a/client/src/utils/AuditTrailMappings.js +++ b/client/src/utils/AuditTrailMappings.js @@ -26,6 +26,9 @@ const AuditTrailMapping = { i18n.t("audit_trail.messages.jobinproductionchange", { inproduction }), jobchecklist: (type, inproduction, status) => i18n.t("audit_trail.messages.jobchecklist", { type, inproduction, status }), + jobnoteadded: () => i18n.t("audit_trail.messages.jobnoteadded"), + jobnoteupdated: () => i18n.t("audit_trail.messages.jobnoteupdated"), + jobnotedeleted: () => i18n.t("audit_trail.messages.jobnotedeleted"), }; export default AuditTrailMapping; diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index 6a6f8452d..8799a87ef 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -391,7 +391,9 @@ export const TemplateList = (type, context) => { title: i18n.t("printcenter.jobs.parts_order"), description: "Parts Order", key: "parts_order", - subject: i18n.t("printcenter.jobs.parts_order"), + subject: i18n.t("printcenter.subjects.jobs.parts_order", { + ro_number: context && context.job && context.job.ro_number, + }), disabled: false, }, parts_return_slip: { @@ -417,222 +419,6 @@ export const TemplateList = (type, context) => { ...(!type || type === "csi" ? {} : {}), ...(!type || type === "report_center" ? { - payments_by_date: { - title: i18n.t("reportcenter.templates.payments_by_date"), - subject: i18n.t("reportcenter.templates.payments_by_date"), - key: "payments_by_date", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.payments"), - field: i18n.t("payments.fields.date"), - }, - }, - payments_by_date_type: { - title: i18n.t("reportcenter.templates.payments_by_date_type"), - subject: i18n.t("reportcenter.templates.payments_by_date_type"), - key: "payments_by_date_type", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.payments"), - field: i18n.t("payments.fields.date"), - }, - }, - purchases_by_date_range_detail: { - title: i18n.t( - "reportcenter.templates.purchases_by_date_range_detail" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_date_range_detail" - ), - key: "purchases_by_date_range_detail", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_by_date_range_summary: { - title: i18n.t( - "reportcenter.templates.purchases_by_date_range_summary" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_date_range_summary" - ), - key: "purchases_by_date_range_summary", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_by_vendor_detailed_date_range: { - title: i18n.t( - "reportcenter.templates.purchases_by_vendor_detailed_date_range" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_vendor_detailed_date_range" - ), - key: "purchases_by_vendor_detailed_date_range", - idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_by_vendor_summary_date_range: { - title: i18n.t( - "reportcenter.templates.purchases_by_vendor_summary_date_range" - ), - subject: i18n.t( - "reportcenter.templates.purchases_by_vendor_summary_date_range" - ), - key: "purchases_by_vendor_summary_date_range", - idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_by_cost_center_detail: { - title: i18n.t( - "reportcenter.templates.purchases_by_cost_center_detail" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_by_cost_center_detail" - ), - key: "purchases_by_cost_center_detail", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_by_cost_center_summary: { - title: i18n.t( - "reportcenter.templates.purchases_by_cost_center_summary" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_by_cost_center_summary" - ), - key: "purchases_by_cost_center_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.bills"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_grouped_by_vendor_detailed: { - title: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_detailed" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_detailed" - ), - key: "purchases_grouped_by_vendor_detailed", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("bills.fields.date"), - }, - }, - purchases_grouped_by_vendor_summary: { - title: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_summary" - ), - description: "", - subject: i18n.t( - "reportcenter.templates.purchases_grouped_by_vendor_summary" - ), - key: "purchases_grouped_by_vendor_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("bills.fields.date"), - }, - }, - schedule: { - title: i18n.t("reportcenter.templates.schedule"), - subject: i18n.t("reportcenter.templates.schedule"), - key: "schedule", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.appointments"), - field: i18n.t("appointments.fields.time"), - }, - }, - - timetickets: { - title: i18n.t("reportcenter.templates.timetickets"), - subject: i18n.t("reportcenter.templates.timetickets"), - key: "timetickets", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - }, - timetickets_employee: { - title: i18n.t("reportcenter.templates.timetickets_employee"), - subject: i18n.t("reportcenter.templates.timetickets_employee"), - key: "timetickets_employee", - idtype: "employee", - disabled: false, - }, - attendance_detail: { - title: i18n.t("reportcenter.templates.attendance_detail"), - subject: i18n.t("reportcenter.templates.attendance_detail"), - key: "attendance_detail", - - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - }, - attendance_summary: { - title: i18n.t("reportcenter.templates.attendance_summary"), - subject: i18n.t("reportcenter.templates.attendance_summary"), - key: "attendance_summary", - - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - }, - attendance_employee: { - title: i18n.t("reportcenter.templates.attendance_employee"), - subject: i18n.t("reportcenter.templates.attendance_employee"), - key: "attendance_employee", - idtype: "employee", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - }, - - timetickets_summary: { - title: i18n.t("reportcenter.templates.timetickets_summary"), - subject: i18n.t("reportcenter.templates.timetickets_summary"), - key: "timetickets_summary", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.timetickets"), - field: i18n.t("timetickets.fields.date"), - }, - }, - hours_sold_detail_closed: { title: i18n.t("reportcenter.templates.hours_sold_detail_closed"), description: "", @@ -644,6 +430,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, hours_sold_detail_closed_ins_co: { @@ -661,6 +448,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, hours_sold_summary_closed: { @@ -674,6 +462,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, hours_sold_summary_closed_ins_co: { @@ -691,6 +480,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, hours_sold_detail_open: { @@ -704,6 +494,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "sales", }, hours_sold_detail_open_ins_co: { @@ -721,6 +512,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "sales", }, hours_sold_summary_open: { @@ -734,6 +526,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "sales", }, hours_sold_summary_open_ins_co: { @@ -751,6 +544,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "sales", }, hours_sold_detail_closed_csr: { @@ -768,6 +562,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, hours_sold_detail_open_csr: { title: i18n.t("reportcenter.templates.hours_sold_detail_open_csr"), @@ -782,6 +577,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "sales", }, hours_sold_summary_closed_csr: { title: i18n.t( @@ -798,6 +594,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, hours_sold_summary_open_csr: { title: i18n.t("reportcenter.templates.hours_sold_summary_open_csr"), @@ -812,54 +609,137 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, - estimator_detail: { - title: i18n.t("reportcenter.templates.estimator_detail"), + purchases_by_date_range_detail: { + title: i18n.t( + "reportcenter.templates.purchases_by_date_range_detail" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_date_range_detail" + ), + key: "purchases_by_date_range_detail", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_date_range_summary: { + title: i18n.t( + "reportcenter.templates.purchases_by_date_range_summary" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_date_range_summary" + ), + key: "purchases_by_date_range_summary", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_vendor_detailed_date_range: { + title: i18n.t( + "reportcenter.templates.purchases_by_vendor_detailed_date_range" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_vendor_detailed_date_range" + ), + key: "purchases_by_vendor_detailed_date_range", + idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_vendor_summary_date_range: { + title: i18n.t( + "reportcenter.templates.purchases_by_vendor_summary_date_range" + ), + subject: i18n.t( + "reportcenter.templates.purchases_by_vendor_summary_date_range" + ), + key: "purchases_by_vendor_summary_date_range", + idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_cost_center_detail: { + title: i18n.t( + "reportcenter.templates.purchases_by_cost_center_detail" + ), description: "", - subject: i18n.t("reportcenter.templates.estimator_detail"), - key: "estimator_detail", + subject: i18n.t( + "reportcenter.templates.purchases_by_cost_center_detail" + ), + key: "purchases_by_cost_center_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_by_cost_center_summary: { + title: i18n.t( + "reportcenter.templates.purchases_by_cost_center_summary" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.purchases_by_cost_center_summary" + ), + key: "purchases_by_cost_center_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.bills"), + field: i18n.t("bills.fields.date"), + }, + group: "purchases", + }, + purchases_grouped_by_vendor_detailed: { + title: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_detailed" + ), + description: "", + subject: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_detailed" + ), + key: "purchases_grouped_by_vendor_detailed", //idtype: "vendor", disabled: false, rangeFilter: { object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), + field: i18n.t("bills.fields.date"), }, + group: "purchases", }, - estimator_summary: { - title: i18n.t("reportcenter.templates.estimator_summary"), + purchases_grouped_by_vendor_summary: { + title: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_summary" + ), description: "", - subject: i18n.t("reportcenter.templates.estimator_summary"), - key: "estimator_summary", + subject: i18n.t( + "reportcenter.templates.purchases_grouped_by_vendor_summary" + ), + key: "purchases_grouped_by_vendor_summary", //idtype: "vendor", disabled: false, rangeFilter: { object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - }, - supplement_ratio_ins_co: { - title: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), - description: "", - subject: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), - key: "supplement_ratio_ins_co", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), - }, - }, - credits_not_received_date: { - title: i18n.t("reportcenter.templates.credits_not_received_date"), - description: "", - subject: i18n.t("reportcenter.templates.credits_not_received_date"), - key: "credits_not_received_date", - //idtype: "vendor", - disabled: false, - rangeFilter: { - object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), + field: i18n.t("bills.fields.date"), }, + group: "purchases", }, job_costing_ro_date_summary: { title: i18n.t("reportcenter.templates.job_costing_ro_date_summary"), @@ -874,6 +754,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "jobs", }, job_costing_ro_csr: { title: i18n.t("reportcenter.templates.job_costing_ro_csr"), @@ -886,6 +767,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, job_costing_ro_ins_co: { title: i18n.t("reportcenter.templates.job_costing_ro_ins_co"), @@ -898,6 +780,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "jobs", }, job_costing_ro_date_detail: { title: i18n.t("reportcenter.templates.job_costing_ro_date_detail"), @@ -912,6 +795,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "jobs", }, job_costing_ro_estimator: { title: i18n.t("reportcenter.templates.job_costing_ro_estimator"), @@ -924,7 +808,165 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "jobs", }, + payments_by_date: { + title: i18n.t("reportcenter.templates.payments_by_date"), + subject: i18n.t("reportcenter.templates.payments_by_date"), + key: "payments_by_date", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.payments"), + field: i18n.t("payments.fields.date"), + }, + group: "customers", + }, + payments_by_date_type: { + title: i18n.t("reportcenter.templates.payments_by_date_type"), + subject: i18n.t("reportcenter.templates.payments_by_date_type"), + key: "payments_by_date_type", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.payments"), + field: i18n.t("payments.fields.date"), + }, + group: "customers", + }, + + schedule: { + title: i18n.t("reportcenter.templates.schedule"), + subject: i18n.t("reportcenter.templates.schedule"), + key: "schedule", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.appointments"), + field: i18n.t("appointments.fields.time"), + }, + group: "customers", + }, + + timetickets: { + title: i18n.t("reportcenter.templates.timetickets"), + subject: i18n.t("reportcenter.templates.timetickets"), + key: "timetickets", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + timetickets_employee: { + title: i18n.t("reportcenter.templates.timetickets_employee"), + subject: i18n.t("reportcenter.templates.timetickets_employee"), + key: "timetickets_employee", + idtype: "employee", + disabled: false, + group: "payroll", + }, + attendance_detail: { + title: i18n.t("reportcenter.templates.attendance_detail"), + subject: i18n.t("reportcenter.templates.attendance_detail"), + key: "attendance_detail", + + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + attendance_summary: { + title: i18n.t("reportcenter.templates.attendance_summary"), + subject: i18n.t("reportcenter.templates.attendance_summary"), + key: "attendance_summary", + + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + attendance_employee: { + title: i18n.t("reportcenter.templates.attendance_employee"), + subject: i18n.t("reportcenter.templates.attendance_employee"), + key: "attendance_employee", + idtype: "employee", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + + timetickets_summary: { + title: i18n.t("reportcenter.templates.timetickets_summary"), + subject: i18n.t("reportcenter.templates.timetickets_summary"), + key: "timetickets_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, + group: "payroll", + }, + + estimator_detail: { + title: i18n.t("reportcenter.templates.estimator_detail"), + description: "", + subject: i18n.t("reportcenter.templates.estimator_detail"), + key: "estimator_detail", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + estimator_summary: { + title: i18n.t("reportcenter.templates.estimator_summary"), + description: "", + subject: i18n.t("reportcenter.templates.estimator_summary"), + key: "estimator_summary", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + supplement_ratio_ins_co: { + title: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), + description: "", + subject: i18n.t("reportcenter.templates.supplement_ratio_ins_co"), + key: "supplement_ratio_ins_co", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + credits_not_received_date: { + title: i18n.t("reportcenter.templates.credits_not_received_date"), + description: "", + subject: i18n.t("reportcenter.templates.credits_not_received_date"), + key: "credits_not_received_date", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_open"), + }, + group: "purchases", + }, + void_ros: { title: i18n.t("reportcenter.templates.void_ros"), description: "", @@ -936,6 +978,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "sales", }, gsr_by_csr: { title: i18n.t("reportcenter.templates.gsr_by_csr"), @@ -948,6 +991,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, gsr_by_make: { title: i18n.t("reportcenter.templates.gsr_by_make"), @@ -960,6 +1004,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, gsr_by_delivery_date: { title: i18n.t("reportcenter.templates.gsr_by_delivery_date"), @@ -972,6 +1017,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.actual_delivery"), }, + group: "sales", }, gsr_by_referral: { title: i18n.t("reportcenter.templates.gsr_by_referral"), @@ -984,6 +1030,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, gsr_by_ro: { title: i18n.t("reportcenter.templates.gsr_by_ro"), @@ -996,6 +1043,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, gsr_by_ins_co: { title: i18n.t("reportcenter.templates.gsr_by_ins_co"), @@ -1008,6 +1056,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, gsr_by_exported_date: { title: i18n.t("reportcenter.templates.gsr_by_exported_date"), @@ -1020,6 +1069,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_exported"), }, + group: "sales", }, gsr_by_estimator: { @@ -1033,6 +1083,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, gsr_labor_only: { title: i18n.t("reportcenter.templates.gsr_labor_only"), @@ -1045,6 +1096,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "sales", }, open_orders: { title: i18n.t("reportcenter.templates.open_orders"), @@ -1057,6 +1109,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, open_orders_csr: { title: i18n.t("reportcenter.templates.open_orders_csr"), @@ -1069,6 +1122,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, open_orders_estimator: { title: i18n.t("reportcenter.templates.open_orders_estimator"), @@ -1081,6 +1135,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, open_orders_ins_co: { title: i18n.t("reportcenter.templates.open_orders_ins_co"), @@ -1093,6 +1148,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, export_payables: { title: i18n.t("reportcenter.templates.export_payables"), @@ -1105,6 +1161,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.exportlogs"), field: i18n.t("exportlogs.fields.createdat"), }, + group: "purchases", }, export_payments: { title: i18n.t("reportcenter.templates.export_payments"), @@ -1117,6 +1174,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.exportlogs"), field: i18n.t("exportlogs.fields.createdat"), }, + group: "customers", }, export_receivables: { title: i18n.t("reportcenter.templates.export_receivables"), @@ -1129,6 +1187,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.exportlogs"), field: i18n.t("exportlogs.fields.createdat"), }, + group: "sales", }, parts_backorder: { title: i18n.t("reportcenter.templates.parts_backorder"), @@ -1141,6 +1200,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.actual_in"), }, + group: "purchases", }, thank_you_date: { title: i18n.t("reportcenter.templates.thank_you_date"), @@ -1153,6 +1213,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "customers", }, unclaimed_hrs: { title: i18n.t("reportcenter.templates.unclaimed_hrs"), @@ -1165,6 +1226,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "payroll", }, work_in_progress_labour: { title: i18n.t("reportcenter.templates.work_in_progress_labour"), @@ -1177,6 +1239,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, work_in_progress_payables: { title: i18n.t("reportcenter.templates.work_in_progress_payables"), @@ -1189,6 +1252,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_open"), }, + group: "jobs", }, lag_time: { title: i18n.t("reportcenter.templates.lag_time"), @@ -1201,6 +1265,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.date_invoiced"), }, + group: "jobs", }, parts_not_recieved: { title: i18n.t("reportcenter.templates.parts_not_recieved"), @@ -1213,6 +1278,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.parts_orders"), field: i18n.t("parts_orders.fields.order_date"), }, + group: "purchases", }, scoreboard_detail: { title: i18n.t("reportcenter.templates.scoreboard_detail"), @@ -1225,6 +1291,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.scoreboard"), field: i18n.t("scoreboard.fields.date"), }, + group: "payroll", }, scoreboard_summary: { title: i18n.t("reportcenter.templates.scoreboard_summary"), @@ -1237,6 +1304,7 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.scoreboard"), field: i18n.t("scoreboard.fields.date"), }, + group: "payroll", }, anticipated_revenue: { title: i18n.t("reportcenter.templates.anticipated_revenue"), @@ -1249,6 +1317,20 @@ export const TemplateList = (type, context) => { object: i18n.t("reportcenter.labels.objects.jobs"), field: i18n.t("jobs.fields.scheduled_completion"), // Also date invoice. }, + group: "sales", + }, + csi: { + title: i18n.t("reportcenter.templates.csi"), + description: "", + subject: i18n.t("reportcenter.templates.csi"), + key: "csi", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.csi"), + field: i18n.t("csi.fields.created_at"), // Also date invoice. + }, + group: "customers", }, } : {}), diff --git a/client/src/utils/asyncConfirm.js b/client/src/utils/asyncConfirm.js new file mode 100644 index 000000000..3969dda96 --- /dev/null +++ b/client/src/utils/asyncConfirm.js @@ -0,0 +1,9 @@ +function confirmDialog(msg) { + return new Promise(function (resolve, reject) { + let confirmed = window.confirm(msg); + + return confirmed ? resolve(true) : resolve(false); + }); +} + +export default confirmDialog; diff --git a/client/yarn.lock b/client/yarn.lock index 135f64c1a..4d60fc2b2 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -36,10 +36,10 @@ lodash "^4.17.21" resize-observer-polyfill "^1.5.0" -"@apollo/client@^3.4.10": - version "3.4.10" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.10.tgz#cee9ed75b1bb7f391c55d79300ecf87096e59792" - integrity sha512-b+8TT3jBM2BtEJi+V2FuLpvoYDZCY3baNYrgAgEyw4fjnuBCSRPY7qVjqriZAwMaGiTLtyVifGhmdeICQs4Eow== +"@apollo/client@^3.4.13": + version "3.4.13" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.13.tgz#81670c27b376e80e3845ecf6468e534d908fa5b5" + integrity sha512-/nH8z/0X6WJ+wtUREHTlKQGX4lo6u3XkF1hy+k4eCxLZzT5+VRw1rm92iIkj1H85vep/eE/KV3DdRq1x3t9NnQ== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@wry/context" "^0.6.0" @@ -52,7 +52,7 @@ symbol-observable "^4.0.0" ts-invariant "^0.9.0" tslib "^2.3.0" - zen-observable-ts "^1.1.0" + zen-observable-ts "~1.1.0" "@babel/code-frame@7.10.4": version "7.10.4" @@ -1261,10 +1261,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@craco/craco@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.2.0.tgz#93847ae20899f5e810359443f2055bcf2b1a584e" - integrity sha512-kLc4GSdgR9D5JiZmSxtzbvBKcUFSJqMXImRjjYf5pacwiyAs3XfQwai7T+pExfLQNUnytgkL8jRFUJeYrkVr7g== +"@craco/craco@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.3.0.tgz#157ff6387dab526390b47b12e890542c7e7c6437" + integrity sha512-SCnfEQxT/6NAbU/3sIWw7gQXtzjjiTp/EZFdJTd8inPURILIy0YajrC2p8qBG2KhFo5cwgOrEDyaGyAFvvuyuA== dependencies: cross-spawn "^7.0.0" lodash "^4.17.15" @@ -1409,12 +1409,12 @@ "@firebase/util" "1.3.0" tslib "^2.1.0" -"@firebase/auth-compat@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.1.1.tgz#9baf7b50395ea29a8c3bd20d1c1a3d3cf9004534" - integrity sha512-wEGEV+SluDt/SRyLJRG+s32EDHsyahlkp7kXTcRLUs5KGHmK0T0wNrWxdN5eeR4wR/tlrasPNveUeQDyoJVQzw== +"@firebase/auth-compat@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.1.2.tgz#a971cb7859eb4d45c233043bea102993376d9fca" + integrity sha512-0eqWSV4XoyOltT4HVJUzh8hBFNO5f78ZGDplRQImQ97/6wR45x6Q/9R19KTWOd109+3Axw6Orfq2cSNY0opgEA== dependencies: - "@firebase/auth" "0.17.1" + "@firebase/auth" "0.17.2" "@firebase/auth-types" "0.11.0" "@firebase/component" "0.5.6" "@firebase/util" "1.3.0" @@ -1432,10 +1432,10 @@ resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.11.0.tgz#b9c73c60ca07945b3bbd7a097633e5f78fa9e886" integrity sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw== -"@firebase/auth@0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.17.1.tgz#4c3dd24ca5a9c47c5e97a9fd1bd4129c46154764" - integrity sha512-+YQM0svb10Q1LwoTj+/unrdY/F/C89bgsjlanY14k2124fiOYVZv0M19t5i7nZx8VnsrgzkFaDfKahdcDxjdpA== +"@firebase/auth@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.17.2.tgz#54ad76cfdc2f6d1201fb780365cf7d362586f3c6" + integrity sha512-t1iHB5Eg7vAbyOEzMMarsyJNGiO2xP8Zag0hLRVXWVaWymXZnyVKp62sXqyonvz4eVT8+iGBjDySB9zKIb5Pqg== dependencies: "@firebase/component" "0.5.6" "@firebase/logger" "0.2.6" @@ -1484,13 +1484,13 @@ faye-websocket "0.11.3" tslib "^2.1.0" -"@firebase/firestore-compat@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.1.1.tgz#a990cd4b0aef5e0a18972de71d18c35065099f19" - integrity sha512-Ag95WVTSh5Q+GK3egd9HBvXerO/lrRulTO67ryYp4EPyoI/ZmnIoMhYgnOXvb1jCH0Ae01XoSxgU2M2SRvph/Q== +"@firebase/firestore-compat@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.1.2.tgz#af9e28735376ee04c147ea3ac11b592b3f7a68ac" + integrity sha512-xtjj2qOBN0+S5KlXmWa5UozGmYJ1OAGBNT0qkCSvzQitHED5/B2fNwKnpy7Em+Zu3Yc3r/eM94OGx93USFXifg== dependencies: "@firebase/component" "0.5.6" - "@firebase/firestore" "3.0.1" + "@firebase/firestore" "3.0.2" "@firebase/firestore-types" "2.5.0" "@firebase/util" "1.3.0" tslib "^2.1.0" @@ -1500,10 +1500,10 @@ resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.5.0.tgz#16fca40b6980fdb000de86042d7a96635f2bcdd7" integrity sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA== -"@firebase/firestore@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.0.1.tgz#0152c6a767e116382fb28a0e62b6ea7fa331cc20" - integrity sha512-HDnmweq9GOrk4AtCyQ50FBj/cRowb7IXeTGOx6/MSGYCodKv+9axviKqKPYlWH7cbyrw2Jf3GJTUdkVghMhn+w== +"@firebase/firestore@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.0.2.tgz#594130bb125803b6e28611075c2f396f59ba8186" + integrity sha512-AWh1pugDifwCXHaQalZHp+Hr/3o+cxYvlbgQrPB35bh1A3do4I1xim/8Pba7gtpTzlClDryd5pK/XbK0TC/2kg== dependencies: "@firebase/component" "0.5.6" "@firebase/logger" "0.2.6" @@ -1514,13 +1514,13 @@ node-fetch "2.6.1" tslib "^2.1.0" -"@firebase/functions-compat@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.1.1.tgz#b1afb89750ec4d1b9a1a9a188f20c30b75aa4a93" - integrity sha512-HELDScvKEP/tM6eW52u+5ilqweCB/cB8ONiQ0aHw2Hjdm20DQ/VsII2JEtbhnFQfuODdugvWLkWV0RPWTFwYqA== +"@firebase/functions-compat@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.1.2.tgz#557461ed4f2928747461c6b2d246ac328aea3248" + integrity sha512-eisJazUrqOL/pAZJPqamYiaAyV3ch6GQMx8Sso792tvRr8SFsNCFbN9eVun0U0ubWAON5qdLoruoc6npXg6FIg== dependencies: "@firebase/component" "0.5.6" - "@firebase/functions" "0.7.0" + "@firebase/functions" "0.7.1" "@firebase/functions-types" "0.5.0" "@firebase/util" "1.3.0" tslib "^2.1.0" @@ -1530,10 +1530,10 @@ resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.5.0.tgz#b50ba95ccce9e96f7cda453228ffe1684645625b" integrity sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA== -"@firebase/functions@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.7.0.tgz#d052d01aa6871f5cd518748963792bae94b2081d" - integrity sha512-H0krTllYh5eK7utKoUoNoVvoSdZqaPdqGSdIK7ltr1yWX9UhbRWYZv5B/tWTjQFfDfRQwpn9Q6svoJzYZQiusA== +"@firebase/functions@0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.7.1.tgz#aa95aaed34649d0656d50df0ed21802f117cca88" + integrity sha512-F6XZVVBpqupCX7/YXpdzyXKYCeLVmHO/jxAKbN9I4B+c8doDqVtGkO23DPzf4ppzR4FuXDiKEEU9ZZ85kqZ1QA== dependencies: "@firebase/app-check-interop-types" "0.1.0" "@firebase/auth-interop-types" "0.1.6" @@ -1650,13 +1650,13 @@ "@firebase/util" "1.3.0" tslib "^2.1.0" -"@firebase/storage-compat@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.1.1.tgz#9192cd26595a2a09ebef1bbd3da1b63f4716da37" - integrity sha512-W2ke6KcnrEY1zvlEZ8GOVt8wgUbIhW3ZCBUYMdpsLKB/uFmn/zgdiba+ojwerqlOH5zUe4CSULqBE1hXDm1pMw== +"@firebase/storage-compat@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.1.2.tgz#98e6b3516a70799935618c32e6b8937370587929" + integrity sha512-eff0e2qcDX188mqr7aKrqr4TIS25/cE6E7Xo9WRLe3c17nqGgmrYM4DDS3VDttNbf1j5XaoEnZVZafE9/BR3Rg== dependencies: "@firebase/component" "0.5.6" - "@firebase/storage" "0.8.1" + "@firebase/storage" "0.8.2" "@firebase/storage-types" "0.6.0" "@firebase/util" "1.3.0" tslib "^2.1.0" @@ -1666,10 +1666,10 @@ resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.6.0.tgz#0b1af64a2965af46fca138e5b70700e9b7e6312a" integrity sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA== -"@firebase/storage@0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.8.1.tgz#38959b5011df90de4041dbe7277093e010169eba" - integrity sha512-kq6biRi86JUNU3ZQc7UrUYJ+QmPmayER68sXtHmn8Kxw7p/V5MchTPVpE8iFAN5a5PhGTPKSD4cuNyUPU9C0Fg== +"@firebase/storage@0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.8.2.tgz#e08c05d070a468f0976a3d0cd32318655f0ae3b7" + integrity sha512-I9mVYhQ/DkWI1MKHhYvI4dnguXdXC50S5ryehOcR/JmSwyYjh1+T+IFQp0hHb1VWTixShzWoSGo1PhbrolFmIA== dependencies: "@firebase/component" "0.5.6" "@firebase/util" "1.3.0" @@ -2178,14 +2178,14 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@sentry/browser@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.12.0.tgz#970cd68fa117a1e1336fdb373e3b1fa76cd63e2d" - integrity sha512-wsJi1NLOmfwtPNYxEC50dpDcVY7sdYckzwfqz1/zHrede1mtxpqSw+7iP4bHADOJXuF+ObYYTHND0v38GSXznQ== +"@sentry/browser@6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.13.0.tgz#fddcf1997d47c166a86494a6ea594f4cc60e773d" + integrity sha512-Eh0k2qYhqWiEP3N04AwSrpl4VRD0pzt6SRgJxgiGzSvBT43EOjyNQ3xzMylAechfjSCTWmzZMvwcgT5fNM9cuw== dependencies: - "@sentry/core" "6.12.0" - "@sentry/types" "6.12.0" - "@sentry/utils" "6.12.0" + "@sentry/core" "6.13.0" + "@sentry/types" "6.13.0" + "@sentry/utils" "6.13.0" tslib "^1.9.3" "@sentry/cli@^1.68.0": @@ -2200,69 +2200,69 @@ progress "^2.0.3" proxy-from-env "^1.1.0" -"@sentry/core@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.12.0.tgz#bc7c5f0785b6a392d9ad47bd9b1fae3f5389996c" - integrity sha512-mU/zdjlzFHzdXDZCPZm8OeCw7c9xsbL49Mq0TrY0KJjLt4CJBkiq5SDTGfRsenBLgTedYhe5Z/J8Z+xVVq+MfQ== +"@sentry/core@6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.13.0.tgz#35df709bb5c1979cc05a4dd0bbe8b15fb973ad6f" + integrity sha512-Aw0ljRJx5tq4w6ZXxvcu2Lr9NwD+MJ1SLL5+oB1hh4OlcOJ7OLwDjtJ3+ZOwp75GCAp7phh4+s/Sql6roX3Lpw== dependencies: - "@sentry/hub" "6.12.0" - "@sentry/minimal" "6.12.0" - "@sentry/types" "6.12.0" - "@sentry/utils" "6.12.0" + "@sentry/hub" "6.13.0" + "@sentry/minimal" "6.13.0" + "@sentry/types" "6.13.0" + "@sentry/utils" "6.13.0" tslib "^1.9.3" -"@sentry/hub@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.12.0.tgz#29e323ab6a95e178fb14fffb684aa0e09707197f" - integrity sha512-yR/UQVU+ukr42bSYpeqvb989SowIXlKBanU0cqLFDmv5LPCnaQB8PGeXwJAwWhQgx44PARhmB82S6Xor8gYNxg== +"@sentry/hub@6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.13.0.tgz#076a5f9b6d0efb8c1832820e3eecd5e24b5e1706" + integrity sha512-BmKgrTyotF008KPfFt1ySyFg0AAMf/ha9Bz9Rmi+usSJjnOLsObzBJQNAozp4Cu6i1kGvj1/R+ymPCD61Gqozw== dependencies: - "@sentry/types" "6.12.0" - "@sentry/utils" "6.12.0" + "@sentry/types" "6.13.0" + "@sentry/utils" "6.13.0" tslib "^1.9.3" -"@sentry/minimal@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.12.0.tgz#cbe20e95056cedb9709d7d5b2119ef95206a9f8c" - integrity sha512-r3C54Q1KN+xIqUvcgX9DlcoWE7ezWvFk2pSu1Ojx9De81hVqR9u5T3sdSAP2Xma+um0zr6coOtDJG4WtYlOtsw== +"@sentry/minimal@6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.13.0.tgz#276fc0ee5355954c2a9d9292d914988391f8a1e1" + integrity sha512-eJQs44sGY2wFuVDznHMDeShR+ZbnM/KS+T5753nJ4QtMqCNTiG9WDlNXAxwFJ6Q3DORtaxcWHyFZdOMUusJiZQ== dependencies: - "@sentry/hub" "6.12.0" - "@sentry/types" "6.12.0" + "@sentry/hub" "6.13.0" + "@sentry/types" "6.13.0" tslib "^1.9.3" -"@sentry/react@^6.11.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.12.0.tgz#8ae2680d226fafb0da0f3d8366bb285004ba6c2e" - integrity sha512-E8Nw9PPzP/EyMy64ksr9xcyYYlBmUA5ROnkPQp7o5wF0xf5/J+nMS1tQdyPnLQe2KUgHlN4kVs2HHft1m7mSYQ== +"@sentry/react@^6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.13.0.tgz#110aada56a5f952b63f8ce94ce0c71792bcffd4a" + integrity sha512-Pkkq2YQn7uvqHX+OvoGrd9Nq0ixrQyixm2SI0BjptDXkZ6AqlI+fhhP8Mm+ezBgPT9WqO2+BUW/YivyTjVYwHg== dependencies: - "@sentry/browser" "6.12.0" - "@sentry/minimal" "6.12.0" - "@sentry/types" "6.12.0" - "@sentry/utils" "6.12.0" + "@sentry/browser" "6.13.0" + "@sentry/minimal" "6.13.0" + "@sentry/types" "6.13.0" + "@sentry/utils" "6.13.0" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/tracing@^6.11.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.12.0.tgz#a05c8985ee7fed7310b029b147d8f9f14f2a2e67" - integrity sha512-u10QHNknPBzbWSUUNMkvuH53sQd5NaBo6YdNPj4p5b7sE7445Sh0PwBpRbY3ZiUUiwyxV59fx9UQ4yVnPGxZQA== +"@sentry/tracing@^6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.13.0.tgz#3d9fac18c2d6829ba14178729d4a7ac770462e3e" + integrity sha512-nTY8UnVK6OUh4ocONtphoaK3WXBZqw0HOFyFpBSzhldo4O1jLad1OEkz8vAxrIE9sXPmLWta5CtKq6PIaFwQSg== dependencies: - "@sentry/hub" "6.12.0" - "@sentry/minimal" "6.12.0" - "@sentry/types" "6.12.0" - "@sentry/utils" "6.12.0" + "@sentry/hub" "6.13.0" + "@sentry/minimal" "6.13.0" + "@sentry/types" "6.13.0" + "@sentry/utils" "6.13.0" tslib "^1.9.3" -"@sentry/types@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.12.0.tgz#b7395688a79403c6df8d8bb8d81deb8222519853" - integrity sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA== +"@sentry/types@6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.13.0.tgz#a8ad870c6ecb407cbe9ca883b0688bacb30daacf" + integrity sha512-04ZVmz4txuI3w1KS81eByppvvMfOINj7jZYnO5zX/S3cjHiOpAJiZkN/k9tTi1Ua3td8bEkQLB6Cxrq9MSiH3Q== -"@sentry/utils@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.12.0.tgz#3de261e8d11bdfdc7add64a3065d43517802e975" - integrity sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA== +"@sentry/utils@6.13.0": + version "6.13.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.13.0.tgz#c75647890a5a9dfdb3df321517aa4886c8715b03" + integrity sha512-e82DBwjYqWkNmafIkHnbqirK4t7WCmqCGaoo1Et6vTRCBS4GthWvS6EzaozY7EKs/TzsfIiDdTLGTbYMQOq9Zw== dependencies: - "@sentry/types" "6.12.0" + "@sentry/types" "6.13.0" tslib "^1.9.3" "@sentry/webpack-plugin@^1.17.1": @@ -2472,29 +2472,41 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== -"@types/d3-path@^2": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.1.tgz#ca03dfa8b94d8add97ad0cd97e96e2006b4763cb" - integrity sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw== +"@types/d3-color@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.0.2.tgz#53f2d6325f66ee79afd707c05ac849e8ae0edbb0" + integrity sha512-WVx6zBiz4sWlboCy7TCgjeyHpNjMsoF36yaagny1uXfbadc9f+5BeBf7U+lRmQqY3EHbGQpP8UdW8AC+cywSwQ== -"@types/d3-scale@^3.0.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" - integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== +"@types/d3-interpolate@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== dependencies: - "@types/d3-time" "^2" + "@types/d3-color" "*" -"@types/d3-shape@^2.0.0": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3" - integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ== +"@types/d3-path@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" + integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + +"@types/d3-scale@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.1.tgz#fbe8238e2eff27af577d2b7d0b933ae50a546970" + integrity sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg== dependencies: - "@types/d3-path" "^2" + "@types/d3-time" "*" -"@types/d3-time@^2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" - integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== +"@types/d3-shape@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.0.2.tgz#4b1ca4ddaac294e76b712429726d40365cd1e8ca" + integrity sha512-5+ButCmIfNX8id5seZ7jKj3igdcxx+S9IDBiT35fQGTLZUfkFgTv+oBH34xgeoWDKpWcMITSzBILWQtBoN5Piw== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== "@types/eslint@^7.2.6": version "7.28.0" @@ -4988,76 +5000,76 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -d3-array@2, d3-array@^2.3.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" - integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== +"d3-array@2 - 3", "d3-array@2.10.0 - 3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.0.4.tgz#60550bcc9818be9ace88d269ccd97038fc399b55" + integrity sha512-ShFl90cxNqDaSynDF/Bik/kTzISqePqU3qo2fv6kSJEvF7y7tDCDpcU6WiT01rPO6zngZnrvJ/0j4q6Qg+5EQg== dependencies: - internmap "^1.0.0" + internmap "1 - 2" d3-array@^1.2.0: version "1.2.4" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== -"d3-color@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" - integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== +"d3-color@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a" + integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw== -"d3-format@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" - integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== +"d3-format@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.0.1.tgz#e41b81b2ab79277141ec1404aa5d05001da64084" + integrity sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA== -"d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" - integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== +"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: - d3-color "1 - 2" + d3-color "1 - 3" -"d3-path@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" - integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== +"d3-path@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" + integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== d3-polygon@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== -d3-scale@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" - integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== +d3-scale@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.1.tgz#c65aa7a357e4f58954a66e1edacc712bab4b1034" + integrity sha512-akUAsUujCFnw6Sf1dF7y/FXTxz+VvEIOB3ValKtLhNrzFp8q5wPO3VCAmsbCLJWRTxyJCZDoooodjOI1plFqlw== dependencies: - d3-array "^2.3.0" - d3-format "1 - 2" - d3-interpolate "1.2.0 - 2" - d3-time "^2.1.1" - d3-time-format "2 - 3" + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" -d3-shape@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" - integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== +d3-shape@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.0.1.tgz#9ccdfb28fd9b0d12f2d8aec234cd5c4a9ea27931" + integrity sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw== dependencies: - d3-path "1 - 2" + d3-path "1 - 3" -"d3-time-format@2 - 3": +"d3-time-format@2 - 4": + version "4.0.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.0.0.tgz#930ded86a9de761702344760d8a25753467f28b7" + integrity sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3": version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" - integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" + integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== dependencies: - d3-time "1 - 2" - -"d3-time@1 - 2", d3-time@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" - integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== - dependencies: - d3-array "2" + d3-array "2 - 3" d@1, d@^1.0.1: version "1.0.1" @@ -6360,10 +6372,10 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" -firebase@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.0.1.tgz#6bc5f9d7bdcd864ef98f2219fa0cd240f2e48b3c" - integrity sha512-RMpbXsVlxqMX+s/gYudnUZeSZXPiLCJMdaxbZ0WRiMjLuJc6ZkbpRy7yz7rZQpL0wRD6gN4K5C+JaKEQtN3jAQ== +firebase@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.0.2.tgz#092019326f1c9a67ec00ec78d50f80244581c705" + integrity sha512-+wdsD3Sk3fOgplzv4yzBmJ3Pdr01QiFF38Zq+8hzd+Dv6ZKMrgiq5CRljCaWenhZ/j8nuvHlq82u64ZARaXC+w== dependencies: "@firebase/analytics" "0.7.0" "@firebase/analytics-compat" "0.1.1" @@ -6372,14 +6384,14 @@ firebase@^9.0.0: "@firebase/app-check-compat" "0.1.1" "@firebase/app-compat" "0.1.1" "@firebase/app-types" "0.7.0" - "@firebase/auth" "0.17.1" - "@firebase/auth-compat" "0.1.1" + "@firebase/auth" "0.17.2" + "@firebase/auth-compat" "0.1.2" "@firebase/database" "0.12.0" "@firebase/database-compat" "0.1.0" - "@firebase/firestore" "3.0.1" - "@firebase/firestore-compat" "0.1.1" - "@firebase/functions" "0.7.0" - "@firebase/functions-compat" "0.1.1" + "@firebase/firestore" "3.0.2" + "@firebase/firestore-compat" "0.1.2" + "@firebase/functions" "0.7.1" + "@firebase/functions-compat" "0.1.2" "@firebase/installations" "0.5.0" "@firebase/messaging" "0.9.0" "@firebase/messaging-compat" "0.1.0" @@ -6388,8 +6400,8 @@ firebase@^9.0.0: "@firebase/polyfill" "0.3.36" "@firebase/remote-config" "0.2.0" "@firebase/remote-config-compat" "0.1.0" - "@firebase/storage" "0.8.1" - "@firebase/storage-compat" "0.1.1" + "@firebase/storage" "0.8.2" + "@firebase/storage-compat" "0.1.2" "@firebase/util" "1.3.0" flat-cache@^3.0.4: @@ -7081,10 +7093,10 @@ i18next-browser-languagedetector@^6.1.2: dependencies: "@babel/runtime" "^7.14.6" -i18next@^20.4.0: - version "20.6.0" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-20.6.0.tgz#1021e267c8760b03b1b9fbcc5ef734b28d83ea3c" - integrity sha512-sgt7AkvxUQbW5dsA7p5AYq7tBOIdm9K7c4wAppsbt5l0Hynqs7FTsa0bA0Exy+PUR17+IOcg3KVCaILc1OAOxQ== +i18next@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.0.0.tgz#ad730aced7df552515c92b318d16d847c6270612" + integrity sha512-17A00z5ASuOJkPUNSUMaZcfL3zOm2qYiN8UBIYhNYNmPbPrcP+IfabGEFEICv8CCStr/cbjF0Jk/IXNX9hj3ZA== dependencies: "@babel/runtime" "^7.12.0" @@ -7280,10 +7292,10 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== invariant@^2.2.4: version "2.2.4" @@ -8487,10 +8499,10 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libphonenumber-js@^1.9.26: - version "1.9.26" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.26.tgz#888aca88a4019d0b108e45db8e0509d55785ae45" - integrity sha512-j0brmDsZLSKJCrcli1HjzHYP29VOf5P/Yz+xxe7WmKTe+0XVnKa0J+UEAaT96D21w1mfLPhlm0ZXBQ13EVF+XQ== +libphonenumber-js@^1.9.34: + version "1.9.34" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.34.tgz#ddddc778a9b2f53c70500fcf10c9483596e3574f" + integrity sha512-gHTNU9xTtVgSp30IDX/57W4pETMXDIYXFfwEOJVXiYosiY7Hc7ogJwlBjOqlCcU04X0aA8DT57hdwUC1sJBJnA== lie@~3.3.0: version "3.3.0" @@ -9807,10 +9819,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -phone@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/phone/-/phone-3.1.6.tgz#eefff0be1ce4ce9f2ee028c67be6b58dc5616ef1" - integrity sha512-46WCdbDG32OKoPsntTg2l0VBaWVWg0A3zvH5dUhApwOupyn7owXRtDBz6vAjsJiZQGTft++WvTxEZeqxlCUv9g== +phone@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/phone/-/phone-3.1.8.tgz#6e348512539c9df81bf07fddb3ed3e2ec7e0c66e" + integrity sha512-eyneQKbBwhy6PLYgkioO4CcocMUrFHh4WEfYl1A3PpiQK9tiP0ABKU4yhs7F1URKDbp+oeI8rbJU0+8uMgWfBQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.0" @@ -11392,10 +11404,10 @@ react-grid-layout@^1.3.0: react-draggable "^4.0.0" react-resizable "^3.0.4" -react-i18next@^11.11.4: - version "11.11.4" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.11.4.tgz#f6f9a1c827e7a5271377de2bf14db04cb1c9e5ce" - integrity sha512-ayWFlu8Sc7GAxW1PzMaPtzq+yiozWMxs0P1WeITNVzXAVRhC0Httkzw/IiODBta6seJRBCLrtUeFUSXhAIxlRg== +react-i18next@^11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.12.0.tgz#2a053321b9b7a876d5baa7af55a12d986117bffc" + integrity sha512-M9BT+hqVG03ywrl+L7CK74ugK+4jIo7AeKJ17+g9BoqJz2+/aVbs8SIVXT4KMQ1rjIdcw+GcSRDy1CXjcz6tLQ== dependencies: "@babel/runtime" "^7.14.5" html-parse-stringify "^3.0.1" @@ -11771,17 +11783,18 @@ recharts-scale@^0.4.4: dependencies: decimal.js-light "^2.4.1" -recharts@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.1.2.tgz#ceeb01e53fb46da0d946a1e0f82d783ddf5b9d06" - integrity sha512-rwFQT6T4imhLzD1kYtg9ql8YOesbFRdSwZi95KWgi5udbBdLGRCR4SgaPO8kf0URHcC23mdRbLLTMYCnXng7zQ== +recharts@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.1.3.tgz#f7e82b274a569ca3c9665570bd6d4e78a0e8f24e" + integrity sha512-M0i8x+NKI2Bu/DTGm0LH3FzOhk0YJ4dmBY43YX/KIV82CXfkwkJ07obkje8yJbjdKMjEPZnS5K0XdP6VLx/hPw== dependencies: - "@types/d3-scale" "^3.0.0" - "@types/d3-shape" "^2.0.0" + "@types/d3-interpolate" "^3.0.0" + "@types/d3-scale" "^4.0.0" + "@types/d3-shape" "^3.0.0" classnames "^2.2.5" - d3-interpolate "^2.0.1" - d3-scale "^3.2.3" - d3-shape "^2.0.0" + d3-interpolate "^3.0.0" + d3-scale "^4.0.0" + d3-shape "^3.0.0" eventemitter3 "^4.0.1" lodash "^4.17.19" react-is "16.10.2" @@ -12245,10 +12258,10 @@ sass-loader@^10.0.5: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.38.2: - version "1.39.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.39.0.tgz#6c64695d1c437767c8f1a4e471288e831f81d035" - integrity sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg== +sass@^1.41.1: + version "1.41.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.41.1.tgz#bca5bed2154192779c29f48fca9c644c60c38d98" + integrity sha512-vIjX7izRxw3Wsiez7SX7D+j76v7tenfO18P59nonjr/nzCkZuoHuF7I/Fo0ZRZPKr88v29ivIdE9BqGDgQD/Nw== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -14205,13 +14218,13 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workbox-background-sync@6.2.4, workbox-background-sync@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.2.4.tgz#1e5a4241f985d566a4cba8c67d3a1f4933a96444" - integrity sha512-uoGgm1PZU6THRzXKlMEntrdA4Xkp6SCfxI7re4heN+yGrtAZq6zMKYhZmsdeW+YGnXS3y5xj7WV03b5TDgLh6A== +workbox-background-sync@6.3.0, workbox-background-sync@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.3.0.tgz#d661296b4662e40a7589f0308affc2c9096da001" + integrity sha512-79Wznt6oO8xMmLiErRS4zENUEldFHj1/5IiuHsY3NgGRN5rJdvGW6hz+RERhWzoB7rd/vXyAQdKYahGdsiYG1A== dependencies: idb "^6.0.0" - workbox-core "6.2.4" + workbox-core "6.3.0" workbox-background-sync@^5.1.4: version "5.1.4" @@ -14227,12 +14240,12 @@ workbox-broadcast-update@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-broadcast-update@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.2.4.tgz#4cae36f553e2ead833236df1b3c9b7cccaa3ae0c" - integrity sha512-0EpML2lbxNkiZUoap4BJDA0Hfz36MhtUd/rRhFvF6YWoRbTQ8tc6tMaRgM1EBIUmIN2OX9qQlkqe5SGGt4lfXQ== +workbox-broadcast-update@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.3.0.tgz#9dd87bb0642c892f8f88dcc9b32d48804fdc198f" + integrity sha512-hp7Du6GJzK99wak5cQFhcSBxvcS+2fkFcxiMmz/RsQ5GQNxVcbiovq74w5aNCzuv3muQvICyC1XELZhZ4GYRTQ== dependencies: - workbox-core "6.2.4" + workbox-core "6.3.0" workbox-build@^5.1.4: version "5.1.4" @@ -14283,17 +14296,17 @@ workbox-cacheable-response@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-cacheable-response@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.2.4.tgz#ea4cf588bbb16de9056ef968af878a275d739753" - integrity sha512-KZSzAOmgWsrk15Wu+geCUSGLIyyzHaORKjH5JnR6qcVZAsm0JXUu2m2OZGqjQ+/eyQwrGdXXqAMW+4wQvTXccg== +workbox-cacheable-response@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.3.0.tgz#9900980035ab8f70f2582711299d3c0ce09d9419" + integrity sha512-oYCRGF6PFEmJJkktdxYw/tcrU8N5u/2ihxVSHd+9sNqjNMDiXLqsewcEG544f1yx7gq5/u6VcvUA5N62KzN1GQ== dependencies: - workbox-core "6.2.4" + workbox-core "6.3.0" -workbox-core@6.2.4, workbox-core@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.2.4.tgz#0ffb4f0ce6d8e36f10bf4aabd96a6f55705ccd80" - integrity sha512-Nu8X4R4Is3g8uzEJ6qwbW2CGVpzntW/cSf8OfsQGIKQR0nt84FAKzP2cLDaNLp3L/iV9TuhZgCTZzkMiap5/OQ== +workbox-core@6.3.0, workbox-core@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.3.0.tgz#a7d82bae6f623f342e04028a0a2cef39af71af55" + integrity sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg== workbox-core@^5.1.4: version "5.1.4" @@ -14307,13 +14320,13 @@ workbox-expiration@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-expiration@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.2.4.tgz#80ff337795d5741ee0f84ae68eb25bcb6a54feb8" - integrity sha512-EdOBLunrE3+Ff50y7AYDbiwtiLDvB+oEIkL1Wd9G5d176YVqFfgPfMRzJQ7fN+Yy2NfmsFME0Bw+dQruYekWsQ== +workbox-expiration@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.3.0.tgz#1d36c456f9282c39cda6b59a32b99732da7c3535" + integrity sha512-teYuYfM3HFbwAD/nlZDw/dCMOrCKjsAiMRhz0uOy9IkfBb7vBynO3xf118lY62X6BfqjZdeahiHh10N0/aYICg== dependencies: idb "^6.0.0" - workbox-core "6.2.4" + workbox-core "6.3.0" workbox-google-analytics@^5.1.4: version "5.1.4" @@ -14325,15 +14338,15 @@ workbox-google-analytics@^5.1.4: workbox-routing "^5.1.4" workbox-strategies "^5.1.4" -workbox-google-analytics@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.2.4.tgz#dbf8812d2cd10b568945569407b3e19686bf0e1d" - integrity sha512-+PWmTouoGGcDupaxM193F2NmgrF597Pyt9eHIDxfed+x+JSSeUkETlbAKwB8rnBHkAjs8JQcvStEP/IpueNKpQ== +workbox-google-analytics@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.3.0.tgz#76eb44010d9059915b49fdded927429757907c29" + integrity sha512-6u0y21rtimnrCKpvayTkwh9y4Y5Xdn6X87x895WzwcOcWA2j/Nl7nmCpB0wjjhqU9pMj7B2lChqfypP+xUs5IA== dependencies: - workbox-background-sync "6.2.4" - workbox-core "6.2.4" - workbox-routing "6.2.4" - workbox-strategies "6.2.4" + workbox-background-sync "6.3.0" + workbox-core "6.3.0" + workbox-routing "6.3.0" + workbox-strategies "6.3.0" workbox-navigation-preload@^5.1.4: version "5.1.4" @@ -14342,12 +14355,12 @@ workbox-navigation-preload@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-navigation-preload@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.2.4.tgz#0fdfdb51814296a5a2b52701881cdba08fb91cad" - integrity sha512-y2dOSsaSdEimqhCmBIFR6kBp+GZbtNtWCBaMFwfKxTAul2uyllKcTKBHnZ9IzxULue6o6voV+I2U8Y8tO8n+eA== +workbox-navigation-preload@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.3.0.tgz#a2ae618a53e4941ec09146b94bb9947ac0bca2ff" + integrity sha512-D7bomh9SCn1u6n32FqAWfyHe2dkK6mWbwcTsoeBnFSD0p8Gr9Zq1Mpt/DitEfGIQHck90Zd024xcTFLkjczS/Q== dependencies: - workbox-core "6.2.4" + workbox-core "6.3.0" workbox-precaching@^5.1.4: version "5.1.4" @@ -14356,14 +14369,14 @@ workbox-precaching@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-precaching@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.2.4.tgz#6e8a616b0817a92be01108d260f1e8626b0627b7" - integrity sha512-7POznbVc8EG/mkbXzeb94x3B1VJruPgXvXFgS0NJ3GRugkO4ULs/DpIIb+ycs7uJIKY9EzLS7VXvElr3rMSozQ== +workbox-precaching@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.3.0.tgz#5dc34161ef03ef3cc23af6d78f0b1583f3d180d0" + integrity sha512-bND3rUxiuzFmDfeKywdvOqK0LQ5LLbOPk0eX22PlMQNOOduHRxzglMpgHo/MR6h+8cPJ3GpxT8hZ895/7bHMqQ== dependencies: - workbox-core "6.2.4" - workbox-routing "6.2.4" - workbox-strategies "6.2.4" + workbox-core "6.3.0" + workbox-routing "6.3.0" + workbox-strategies "6.3.0" workbox-range-requests@^5.1.4: version "5.1.4" @@ -14372,19 +14385,19 @@ workbox-range-requests@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-range-requests@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.2.4.tgz#f22b21a7e20d04a5532acb9dee5a1ae67613f3f3" - integrity sha512-q4jjTXD1QOKbrHnzV3nxdZtIpOiVoIP5QyVmjuJrybVnAZurtyKcqirTQcAcT/zlTvgwm07zcTTk9o/zIB6DmA== +workbox-range-requests@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.3.0.tgz#3202e8af6c8832db7788d482ab1d8db3d5b62fe7" + integrity sha512-AHnGtfSvc/fBt+8NCVT6jVcshv7oFkiuS94YsedQu2sIN1jKHkxLaj7qMBl818FoY6x7r0jw1WLmG/QDmI1/oA== dependencies: - workbox-core "6.2.4" + workbox-core "6.3.0" -workbox-routing@6.2.4, workbox-routing@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.2.4.tgz#ab169b3345a91119c0be262af385f4373589507f" - integrity sha512-jHnOmpeH4MOWR4eXv6l608npD2y6IFv7yFJ1bT9/RbB8wq2vXHXJQ0ExTZRTWGbVltSG22wEU+MQ8VebDDwDeg== +workbox-routing@6.3.0, workbox-routing@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.3.0.tgz#d21d39883baf66594fd8365af5c72aff44fc98b5" + integrity sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg== dependencies: - workbox-core "6.2.4" + workbox-core "6.3.0" workbox-routing@^5.1.4: version "5.1.4" @@ -14393,12 +14406,12 @@ workbox-routing@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-strategies@6.2.4, workbox-strategies@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.2.4.tgz#ccf28e91f5c00ab6d57b5080e46a0b840faa4e88" - integrity sha512-DKgGC3ruceDuu2o+Ae5qmJy0p0q21mFP+RrkdqKrjyf2u8cJvvtvt1eIt4nevKc5BESiKxmhC2h+TZpOSzUDvA== +workbox-strategies@6.3.0, workbox-strategies@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.3.0.tgz#1d004f42b309cbfa48812c6cc7a8da6458b928c6" + integrity sha512-SYZt40y+Iu5nA+UEPQOrAuAMMNTxtUBPLCIaMMb4lcADpBYrNP1CD+/s2QsrxzS651a8hfi06REKt+uTp1tqfw== dependencies: - workbox-core "6.2.4" + workbox-core "6.3.0" workbox-strategies@^5.1.4: version "5.1.4" @@ -14416,13 +14429,13 @@ workbox-streams@^5.1.4: workbox-core "^5.1.4" workbox-routing "^5.1.4" -workbox-streams@^6.2.4: - version "6.2.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.2.4.tgz#df235f877b82166b53a1421e0115ed99d3e697e1" - integrity sha512-yG6zV7S2NmYT6koyb7/DoPsyUAat9kD+rOmjP2SbBCtJdLu6ZIi1lgN4/rOkxEby/+Xb4OE4RmCSIZdMyjEmhQ== +workbox-streams@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.3.0.tgz#8a9db8016c2933edc8b6559207896da31b13a8dc" + integrity sha512-CiRsuoXJOytA7IQriRu6kVCa0L4OdNi0DdniiSageu/EZuxTswNXpgVzkGE4IDArU/5jlzgRtwqrqIWCJX+OMA== dependencies: - workbox-core "6.2.4" - workbox-routing "6.2.4" + workbox-core "6.3.0" + workbox-routing "6.3.0" workbox-sw@^5.1.4: version "5.1.4" @@ -14648,7 +14661,7 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zen-observable-ts@^1.1.0: +zen-observable-ts@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== diff --git a/hasura/migrations/1632265756746_run_sql_migration/down.yaml b/hasura/migrations/1632265756746_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1632265756746_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1632265756746_run_sql_migration/up.yaml b/hasura/migrations/1632265756746_run_sql_migration/up.yaml new file mode 100644 index 000000000..c752d0996 --- /dev/null +++ b/hasura/migrations/1632265756746_run_sql_migration/up.yaml @@ -0,0 +1,15 @@ +- type: run_sql + args: + cascade: false + read_only: false + sql: |- + CREATE OR REPLACE FUNCTION public.update_conversation_on_message() + RETURNS trigger + LANGUAGE plpgsql + AS $function$ + BEGIN + UPDATE conversations SET updated_at = now() WHERE id = NEW.conversationid; + RETURN NEW; + END; + $function$ + ; diff --git a/hasura/migrations/1632265816135_run_sql_migration/down.yaml b/hasura/migrations/1632265816135_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1632265816135_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1632265816135_run_sql_migration/up.yaml b/hasura/migrations/1632265816135_run_sql_migration/up.yaml new file mode 100644 index 000000000..98acb3742 --- /dev/null +++ b/hasura/migrations/1632265816135_run_sql_migration/up.yaml @@ -0,0 +1,15 @@ +- type: run_sql + args: + cascade: false + read_only: false + sql: |- + CREATE OR REPLACE FUNCTION public.update_conversation_on_message() + RETURNS trigger + LANGUAGE plpgsql + AS $function$ + BEGIN + UPDATE conversations SET updated_at = now() WHERE conversations.id = NEW.conversationid; + RETURN NEW; + END; + $function$ + ; diff --git a/package.json b/package.json index a858997f6..c5019de9d 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "start": "node server.js" }, "dependencies": { - "aws-sdk": "^2.979.0", + "aws-sdk": "^2.991.0", "bluebird": "^3.7.2", "body-parser": "^1.18.3", - "cloudinary": "^1.26.2", + "cloudinary": "^1.27.0", "compression": "^1.7.4", "cookie-parser": "^1.4.5", "cors": "2.8.5", @@ -40,13 +40,13 @@ "node-mailjet": "^3.3.4", "node-quickbooks": "^2.0.39", "nodemailer": "^6.6.3", - "phone": "^3.1.6", + "phone": "^3.1.8", "query-string": "^7.0.1", "soap": "^0.42.0", "socket.io": "^4.2.0", - "ssh2-sftp-client": "^7.0.3", - "stripe": "^8.171.0", - "twilio": "^3.67.1", + "ssh2-sftp-client": "^7.0.4", + "stripe": "^8.176.0", + "twilio": "^3.67.2", "xmlbuilder2": "^3.0.2" }, "devDependencies": { diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index a66ed3fdb..df1397caa 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -12,14 +12,24 @@ query FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID( } `; -exports.INSERT_MESSAGE = ` -mutation INSERT_MESSAGE($msg: [messages_insert_input!]!, $conversationid: uuid) { - update_conversations(where: {id: {_eq: $conversationid}}, _set: {archived: false}) { - affected_rows +exports.UNARCHIVE_CONVERSATION = ` +mutation UNARCHIVE_CONVERSATION($id: uuid!) { + update_conversations_by_pk(pk_columns: {id: $id}, _set: {archived: false}) { + id } - insert_messages(objects: $msg) { +} +`; + +exports.INSERT_MESSAGE = ` +mutation INSERT_MESSAGE($msg: [messages_insert_input!]!, $conversationid: uuid!) { + update_conversations_by_pk(pk_columns: {id: $conversationid}, _set: {archived: false}) { + id + } + insert_messages(objects: $msg) { returning { conversation { + id + archived bodyshop { associations(where: {active: {_eq: true}}) { user { diff --git a/server/sms/send.js b/server/sms/send.js index bad13ce9f..f19a51dfd 100644 --- a/server/sms/send.js +++ b/server/sms/send.js @@ -55,7 +55,7 @@ exports.send = (req, res) => { : [], }; gqlClient - .request(queries.INSERT_MESSAGE, { msg: newMessage }) + .request(queries.INSERT_MESSAGE, { msg: newMessage, conversationid }) .then((r2) => { //console.log("Responding GQL Message ID", JSON.stringify(r2)); logger.log("sms-outbound-success", "DEBUG", req.user.email, null, { diff --git a/yarn.lock b/yarn.lock index 47706165c..fea9ef8eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -581,10 +581,10 @@ atob@2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -aws-sdk@^2.979.0: - version "2.983.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.983.0.tgz#4c6d98d802b2cf159acbc105979b892b427b5fb3" - integrity sha512-i4QMJt5hEYzhoDzmbo0v+aAuHQPXM6ah15GBKObbxwYxmzK9wjMG+FH3DiWZZHdFsf3C+p1zDg4rIr63jmOeBw== +aws-sdk@^2.991.0: + version "2.991.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.991.0.tgz#ba858c65cb71e1eeea39523463cf5ef258a73e8f" + integrity sha512-TybluMJhRBZ0h5HGupHPTfamwtsJlW56HddJpMbsIjvmh4LGupajrkEwLQYW7osFXQ1S/xuE+0QIy6vWgOpT0g== dependencies: buffer "4.9.2" events "1.1.1" @@ -801,10 +801,10 @@ cloudinary-core@^2.10.2: resolved "https://registry.yarnpkg.com/cloudinary-core/-/cloudinary-core-2.11.4.tgz#1d191935bcdcd412d499a91b928a94b266fee49d" integrity sha512-F1BZczD6f5mB73D0c8gl/iuacVQQO+UhckNZxeeS9ZIVeIHbsfqwWiAZMQmIvEb7Wti/9MLU0xVwaWOak2THHA== -cloudinary@^1.26.2: - version "1.26.3" - resolved "https://registry.yarnpkg.com/cloudinary/-/cloudinary-1.26.3.tgz#dd79a1e50395abcf7abec970f5973200c77430cb" - integrity sha512-80ItEXYLbhOGPM42ksOsqG6320jbsU6kqszjVjl5QwDwzbjouktRlw/NdGva1beSu8sp/0lj1mtSGPymGsNiQA== +cloudinary@^1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/cloudinary/-/cloudinary-1.27.0.tgz#1939f4767c32d596c8cd74ea3db66094bf25fa96" + integrity sha512-3Slh8gTmEfaut+ZBIMByOXaD60QP5uw46zn3lyYYEA0mhTQ82FIrwfj98s0eZ6PciQJIJ+Ea4QPBl7Ji21TQEA== dependencies: cloudinary-core "^2.10.2" core-js "3.6.5" @@ -2994,10 +2994,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -phone@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/phone/-/phone-3.1.6.tgz#eefff0be1ce4ce9f2ee028c67be6b58dc5616ef1" - integrity sha512-46WCdbDG32OKoPsntTg2l0VBaWVWg0A3zvH5dUhApwOupyn7owXRtDBz6vAjsJiZQGTft++WvTxEZeqxlCUv9g== +phone@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/phone/-/phone-3.1.8.tgz#6e348512539c9df81bf07fddb3ed3e2ec7e0c66e" + integrity sha512-eyneQKbBwhy6PLYgkioO4CcocMUrFHh4WEfYl1A3PpiQK9tiP0ABKU4yhs7F1URKDbp+oeI8rbJU0+8uMgWfBQ== pick-util@^1.1.3: version "1.1.3" @@ -3684,19 +3684,19 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -ssh2-sftp-client@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ssh2-sftp-client/-/ssh2-sftp-client-7.0.3.tgz#6940c5fb7dad4c3a5199ee154775f66050ccfc0b" - integrity sha512-h2Zy0GNNOJ7ESyRwBXEdjWEnj7E5z1nVGxtZr7uE77UaIipHbGJ2aQwj7kDBXV/1Mq3YJNu38st8QC48f8ufoA== +ssh2-sftp-client@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/ssh2-sftp-client/-/ssh2-sftp-client-7.0.4.tgz#1e3182fa6a123f5d65429b2f62a76f1e9780907d" + integrity sha512-4fFSTgoYlzcAtGfEjiXN6N41s1jSUmPlI00f7uD7pQOjt9yK9susminINKTRvPp35dkrATrlNZVhUxNCt3z5+w== dependencies: concat-stream "^2.0.0" promise-retry "^2.0.1" - ssh2 "^1.2.0" + ssh2 "^1.4.0" -ssh2@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.3.0.tgz#bcd42ef7796250268b6ff6b0bbff2697029e91b9" - integrity sha512-OjBQ5FR+ClYav3fRnvkhycmd5co5qEfofBaZEqVO3I4tKJLZqu+Ku4LN4nJSckjhqQnomqBqlCdvD3iGV+6isA== +ssh2@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.4.0.tgz#e32e8343394364c922bad915a5a7fecd67d0f5c5" + integrity sha512-XvXwcXKvS452DyQvCa6Ct+chpucwc/UyxgliYz+rWXJ3jDHdtBb9xgmxJdMmnIn5bpgGAEV3KaEsH98ZGPHqwg== dependencies: asn1 "^0.2.4" bcrypt-pbkdf "^1.0.2" @@ -3801,10 +3801,10 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stripe@^8.171.0: - version "8.174.0" - resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.174.0.tgz#91d2e61b0217b1ee9fde2842582e0f1cf1dddc94" - integrity sha512-UFU5TuYH7XwUmSllUIcIKhhsvvhhjw9D6ZwVdfB74wU4VOOaWBiQqszkw6chaEFpdulUmbcAH5eZltV3HwOi7g== +stripe@^8.176.0: + version "8.176.0" + resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.176.0.tgz#2f4980ab49acbfe6d67ecaddd54c05e20de9532c" + integrity sha512-0KCDo8TWFgeNWU7cPaqdjO2u2OSth0cmWYZmA7xsuxRCk7/lgWbJ/UbeSphx74cCIjFCmGuzDoNuNxqon9lEbg== dependencies: "@types/node" ">=8.1.0" qs "^6.6.0" @@ -3968,10 +3968,10 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -twilio@^3.67.1: - version "3.67.1" - resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.67.1.tgz#7734c1c186b1309ca58555dd13ff7a2140f3d056" - integrity sha512-JpdPLqPyYpMyrW39ByUbHimqeHpcWuMv7DD1R215C5wf8dS9EzYfAHqFvrZCEOZkdpB3QeR0UZfvh96jb8FB7Q== +twilio@^3.67.2: + version "3.67.2" + resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.67.2.tgz#208f297c1a2e36f21b2c9b45537ad4ef2515071b" + integrity sha512-JOpnY+leRJIERFljSzKIIu80Kfj2QVIoldEjTDH1xiCEEwbmsMbZIzZwO/zDEhCpKcvpMTSuK2jl/xPmTxAkvA== dependencies: axios "^0.21.1" dayjs "^1.8.29"