diff --git a/_reference/reportFiltersAndSorters.md b/_reference/reportFiltersAndSorters.md
new file mode 100644
index 000000000..3d680f387
--- /dev/null
+++ b/_reference/reportFiltersAndSorters.md
@@ -0,0 +1,175 @@
+# Filters and Sorters
+
+This documentation details the schema required for `.filters` files on the report server. It is used to dynamically
+modify the graphQL query and provide the user more power over their reports.
+
+# Special Notes
+- When passing the data to the template server, the property filters and sorters is added to the data object and will reflect the filters and sorters the user has selected
+
+## High level Schema Overview
+
+```javascript
+const schema = {
+ "filters": [
+ {
+ "name": "jobs.joblines.mod_lb_hrs", // Name and path of the field in the graphQL query
+ "translation": "jobs.joblines.mod_lb_hrs_1", // Translation key for the label used in the GUI
+ "label": "mod_lb_hrs_1", // Label used in the case the GUI does not contain a translation
+ "type": "number" // Type of field, can be number or string currently
+ },
+ // ... more filters
+ ],
+ "sorters": [
+ {
+ "name": "jobs.joblines.mod_lb_hrs", // Name and path of the field in the graphQL query
+ "translation": "jobs.joblines.mod_lb_hrs_1", // Translation key for the label used in the GUI
+ "label": "mod_lb_hrs_1", // Label used in the case the GUI does not contain a translation
+ "type": "number" // Type of field, can be number or string currently
+ },
+ // ... more sorters
+ ],
+ "dates": {
+ // This is not yet implemented and will be added in a future release
+ }
+}
+```
+
+## Filters
+
+Filters effect the where clause of the graphQL query. They are used to filter the data returned from the server.
+A note on special notation used in the `name` field.
+
+## Reflection
+Filters can make use of reflection to pre-fill select boxes, the following is an example of that in the filters file.
+
+```
+ {
+ "name": "jobs.status",
+ "translation": "jobs.fields.status",
+ "label": "Status",
+ "type": "string",
+ "reflector": {
+ "type": "internal",
+ "name": "special.job_statuses"
+ }
+ },
+```
+
+in this example, a reflector with the type 'internal' (all types at the moment require this, and it is used for future functionality), with a name of `special.job_statuses`
+
+The following cases are available
+
+- `special.job_statuses` - This will reflect the statuses of the jobs table `bodyshop.md_ro_statuses.statuses'`
+- `special.cost_centers` - This will reflect the cost centers `bodyshop.md_responsibility_centers.costs`
+- `special.categories` - This will reflect the categories `bodyshop.md_categories`
+- `special.insurance_companies` - This will reflect the insurance companies `bodyshop.md_ins_cos`'
+- `special.employee_teams` - This will reflect the employee teams `bodyshop.employee_teams`
+- `special.employees` - This will reflect the employees `bodyshop.employees`
+- `special.first_names` - This will reflect the first names `bodyshop.employees`
+- `special.last_names` - This will reflect the last names `bodyshop.employees`
+-
+### Path without brackets, multi level
+
+`"name": "jobs.joblines.mod_lb_hrs",`
+This will produce a where clause at the `joblines` level of the graphQL query,
+
+```graphql
+query gendoc_hours_sold_detail_open($starttz: timestamptz!, $endtz: timestamptz!) {
+ jobs(
+ where: {date_invoiced: {_is_null: true}, date_open: {_gte: $starttz, _lte: $endtz}, ro_number: {_is_null: false}, voided: {_eq: false}}
+ ) {
+ joblines(
+ order_by: {line_no: asc}
+ where: {removed: {_eq: false}, mod_lb_hrs: {_lt: 3}}
+ ) {
+ line_no
+ mod_lbr_ty
+ mod_lb_hrs
+ convertedtolbr
+ convertedtolbr_data
+ }
+ ownr_co_nm
+ ownr_fn
+ ownr_ln
+ plate_no
+ ro_number
+ status
+ v_make_desc
+ v_model_desc
+ v_model_yr
+ v_vin
+ v_color
+ }
+}
+```
+
+### Path with brackets,top level
+
+`"name": "[jobs].joblines.mod_lb_hrs",`
+This will produce a where clause at the `jobs` level of the graphQL query.
+
+```graphql
+query gendoc_hours_sold_detail_open($starttz: timestamptz!, $endtz: timestamptz!) {
+ jobs(
+ where: {date_invoiced: {_is_null: true}, date_open: {_gte: $starttz, _lte: $endtz}, ro_number: {_is_null: false}, voided: {_eq: false}, joblines: {mod_lb_hrs: {_gt: 4}}}
+ ) {
+ joblines(
+ order_by: {line_no: asc}
+ where: {removed: {_eq: false}}
+ ) {
+ line_no
+ mod_lbr_ty
+ mod_lb_hrs
+ convertedtolbr
+ convertedtolbr_data
+ }
+ ownr_co_nm
+ ownr_fn
+ ownr_ln
+ plate_no
+ ro_number
+ status
+ v_make_desc
+ v_model_desc
+ v_model_yr
+ v_vin
+ v_color
+ }
+}
+```
+
+## Known Caveats
+
+- Will only support two level of nesting in the graphQL query `jobs.joblines.mod_lb_hrs` vs `[jobs].joblines.mod_lb_hrs`
+ is fine, but `jobs.[joblines.].some_table.mod_lb_hrs` is not.
+- The `dates` object is not yet implemented and will be added in a future release.
+- The type object must be 'string' or 'number' and is case-sensitive.
+- The `translation` key is used to look up the label in the GUI, if it is not found, the `label` key is used.
+- Do not add the ability to filter things that are already filtered as part of the original query, this would be
+ redundant and could cause issues.
+- Do not add the ability to filter on things like FK constraints, must like the above example.
+
+## Sorters
+
+- Sorters follow the same schema as filters, however, they do not do square bracket wrapping to indicate level hoisting,
+ a filter added on `job.md_status` would be added at the top level, and a filter added on `jobs.joblines.mod_lb_hrs`
+ would be added at the `joblines` level.
+- Most of the reports currently do sorting on a template level, this will need to change to actually see the results
+ using the sorters.
+
+### Default Sorters
+- A sorter can be given a default object containing a `order` and `direction` key value. This will be used to sort the report if the user does not select any of the sorters themselves.
+- The `order` key is the order in which the sorters are applied, and the `direction` key is the direction of the sort, either `asc` or `desc`.
+
+```json
+{
+ "name": "jobs.joblines.mod_lb_hrs",
+ "translation": "jobs.joblines.mod_lb_hrs_1",
+ "label": "mod_lb_hrs_1",
+ "type": "number",
+ "default": {
+ "order": 1,
+ "direction": "asc"
+ }
+}
+```
\ No newline at end of file
diff --git a/client/package-lock.json b/client/package-lock.json
index 3aa7489a5..920313c96 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -15,13 +15,13 @@
"@craco/craco": "^7.1.0",
"@fingerprintjs/fingerprintjs": "^4.2.2",
"@jsreport/browser-client": "^3.1.0",
- "@reduxjs/toolkit": "^2.1.0",
- "@sentry/cli": "^2.28.0",
- "@sentry/react": "^7.100.0",
- "@sentry/tracing": "^7.100.0",
+ "@reduxjs/toolkit": "^2.2.1",
+ "@sentry/cli": "^2.28.6",
+ "@sentry/react": "^7.102.1",
+ "@sentry/tracing": "^7.102.1",
"@splitsoftware/splitio-react": "^1.11.0",
"@tanem/react-nprogress": "^5.0.51",
- "antd": "^5.14.0",
+ "antd": "^5.14.2",
"apollo-link-logger": "^2.0.1",
"apollo-link-sentry": "^3.3.0",
"axios": "^1.6.7",
@@ -29,18 +29,18 @@
"dayjs": "^1.11.10",
"dayjs-business-days2": "^1.2.2",
"dinero.js": "^1.9.1",
- "dotenv": "^16.4.1",
+ "dotenv": "^16.4.5",
"enquire-js": "^0.2.1",
"env-cmd": "^10.1.0",
"exifr": "^7.1.3",
"firebase": "^10.8.0",
"graphql": "^16.6.0",
- "i18next": "^23.8.2",
+ "i18next": "^23.10.0",
"i18next-browser-languagedetector": "^7.0.2",
- "jsoneditor": "^10.0.0",
+ "jsoneditor": "^10.0.1",
"jsreport-browser-client-dist": "^1.3.0",
- "libphonenumber-js": "^1.10.55",
- "logrocket": "^7.0.0",
+ "libphonenumber-js": "^1.10.57",
+ "logrocket": "^8.0.1",
"markerjs2": "^2.32.0",
"normalize-url": "^8.0.0",
"phone": "^3.1.42",
@@ -50,33 +50,33 @@
"rc-queue-anim": "^2.0.0",
"rc-scroll-anim": "^2.7.6",
"react": "^18.2.0",
- "react-big-calendar": "^1.8.7",
+ "react-big-calendar": "^1.10.3",
"react-color": "^2.19.3",
- "react-cookie": "^7.0.2",
+ "react-cookie": "^7.1.0",
"react-dom": "^18.2.0",
"react-drag-listview": "^2.0.0",
"react-grid-gallery": "^1.0.0",
"react-grid-layout": "1.3.4",
- "react-i18next": "^14.0.4",
+ "react-i18next": "^14.0.5",
"react-icons": "^5.0.1",
"react-image-lightbox": "^5.1.4",
- "react-intersection-observer": "^9.7.0",
+ "react-intersection-observer": "^9.8.1",
"react-markdown": "^9.0.1",
"react-number-format": "^5.1.4",
"react-redux": "^9.1.0",
"react-resizable": "^3.0.5",
- "react-router-dom": "^6.22.0",
+ "react-router-dom": "^6.22.1",
"react-scripts": "^5.0.1",
"react-sticky": "^6.0.3",
"react-sublime-video": "^0.2.5",
"react-virtualized": "^9.22.5",
- "recharts": "^2.11.0",
+ "recharts": "^2.12.1",
"redux": "^5.0.1",
"redux-persist": "^6.0.0",
"redux-saga": "^1.3.0",
"redux-state-sync": "^3.1.4",
"reselect": "^5.1.0",
- "sass": "^1.70.0",
+ "sass": "^1.71.1",
"socket.io-client": "^4.7.4",
"styled-components": "^6.1.8",
"subscriptions-transport-ws": "^0.11.0",
@@ -88,14 +88,14 @@
"workbox-precaching": "^7.0.0",
"workbox-routing": "^7.0.0",
"workbox-strategies": "^7.0.0",
- "yauzl": "^2.10.0"
+ "yauzl": "^3.1.0"
},
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@dotenvx/dotenvx": "^0.15.0",
- "@sentry/webpack-plugin": "^2.14.0",
+ "@sentry/webpack-plugin": "^2.14.2",
"@testing-library/cypress": "^10.0.1",
- "cypress": "^13.6.4",
+ "cypress": "^13.6.6",
"eslint-plugin-cypress": "^2.15.1",
"react-error-overlay": "6.0.11",
"redux-logger": "^3.0.6",
@@ -4500,9 +4500,9 @@
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"node_modules/@rc-component/color-picker": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.1.tgz",
- "integrity": "sha512-onyAFhWKXuG4P162xE+7IgaJkPkwM94XlOYnQuu69XdXWMfxpeFi6tpJBsieIMV7EnyLV5J3lDzdLiFeK0iEBA==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.2.tgz",
+ "integrity": "sha512-YJXujYzYFAEtlXJXy0yJUhwzUWPTcniBZto+wZ/vnACmFnUTNR7dH+NOeqSwMMsssh74e9H5Jfpr5LAH2PYqUw==",
"dependencies": {
"@babel/runtime": "^7.23.6",
"@ctrl/tinycolor": "^3.6.1",
@@ -4662,9 +4662,9 @@
"integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA=="
},
"node_modules/@reduxjs/toolkit": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.1.0.tgz",
- "integrity": "sha512-nfJ/b4ZhzUevQ1ZPKjlDL6CMYxO4o7ZL7OSsvSOxzT/EN11LsBDgTqP7aedHtBrFSVoK7oTP1SbMWUwGb30NLg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz",
+ "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==",
"dependencies": {
"immer": "^10.0.3",
"redux": "^5.0.1",
@@ -4694,9 +4694,9 @@
}
},
"node_modules/@remix-run/router": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz",
- "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==",
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz",
+ "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==",
"engines": {
"node": ">=14.0.0"
}
@@ -4800,82 +4800,173 @@
"integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA=="
},
"node_modules/@sentry-internal/feedback": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.100.0.tgz",
- "integrity": "sha512-SMW2QhNKOuSjw8oPtvryDlJjiwrNyAKljbgtMk057os/fd8QMp38Yt1ImqLCM4B2rTQZ6REJ6hRGRTRcfqoG+w==",
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.102.1.tgz",
+ "integrity": "sha512-vY4hpLLMNLjICtWiizc7KeGbWOTUMGrF7C+9dPCztZww3CLgzWy9A7DvPj5hodRiYzpdRnAMl8yQnMFbYXh7bA==",
"dependencies": {
- "@sentry/core": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
+ "@sentry/core": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
},
"engines": {
"node": ">=12"
}
},
+ "node_modules/@sentry-internal/feedback/node_modules/@sentry/core": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.102.1.tgz",
+ "integrity": "sha512-QjY+LSP3du3J/C8x/FfEbRxgZgsWd0jfTJ4P7s9f219I1csK4OeBMC3UA1HwEa0pY/9OF6H/egW2CjOcMM5Pdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry-internal/feedback/node_modules/@sentry/types": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.102.1.tgz",
+ "integrity": "sha512-htKorf3t/D0XYtM7foTcmG+rM47rDP6XdbvCcX5gBCuCYlzpM1vqCt2rl3FLktZC6TaIpFRJw1TLfx6m+x5jdA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry-internal/feedback/node_modules/@sentry/utils": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.102.1.tgz",
+ "integrity": "sha512-+8WcFjHVV/HROXSAwMuUzveElBFC43EiTG7SNEBNgOUeQzQVTmbUZXyTVgLrUmtoWqvnIxCacoLxtZo1o67kdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@sentry-internal/replay-canvas": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.100.0.tgz",
- "integrity": "sha512-DePinj5IgNiC4RZv0yX0DLccMZebfFdKl3zHwDeLBeZqtMz9VrPzchv57IWP+5MI1+iuOn+WOg4oTNBUG6hFRw==",
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.102.1.tgz",
+ "integrity": "sha512-GUX4RWI10uRjdjeyvCLtAAhWRVqnAnG6+yNxWfqUQ3qMA7B7XxG43KT2UhSnulmErNzODQ6hA68rGPwwYeRIww==",
"dependencies": {
- "@sentry/core": "7.100.0",
- "@sentry/replay": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
+ "@sentry/core": "7.102.1",
+ "@sentry/replay": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
},
"engines": {
"node": ">=12"
}
},
- "node_modules/@sentry-internal/tracing": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.100.0.tgz",
- "integrity": "sha512-qf4W1STXky9WOQYoPSw2AmCBDK4FzvAyq5yeD2sLU7OCUEfbRUcN0lQljUvmWRKv/jTIAyeU5icDLJPZuR50nA==",
+ "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/core": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.102.1.tgz",
+ "integrity": "sha512-QjY+LSP3du3J/C8x/FfEbRxgZgsWd0jfTJ4P7s9f219I1csK4OeBMC3UA1HwEa0pY/9OF6H/egW2CjOcMM5Pdg==",
"dependencies": {
- "@sentry/core": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/types": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.102.1.tgz",
+ "integrity": "sha512-htKorf3t/D0XYtM7foTcmG+rM47rDP6XdbvCcX5gBCuCYlzpM1vqCt2rl3FLktZC6TaIpFRJw1TLfx6m+x5jdA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/utils": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.102.1.tgz",
+ "integrity": "sha512-+8WcFjHVV/HROXSAwMuUzveElBFC43EiTG7SNEBNgOUeQzQVTmbUZXyTVgLrUmtoWqvnIxCacoLxtZo1o67kdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/babel-plugin-component-annotate": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.14.0.tgz",
- "integrity": "sha512-FWU4+Lx6fgxjAkwmc3S9j1Q/6pqKZyZzfi52B+8WMNw7a5QjGXgxc5ucBazZYgrcsJKCFBp4QG3PPxNAieFimQ==",
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.14.2.tgz",
+ "integrity": "sha512-mFBVnIZmdMrpxo61rG5yf0WFt5VrRpy8cpIpJtT3mYkX9vDmcUZaZaD1ctv73iZF3QwaieVdn05Na5mWzZ8h/A==",
"dev": true,
"engines": {
"node": ">= 14"
}
},
"node_modules/@sentry/browser": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.100.0.tgz",
- "integrity": "sha512-XpM0jEVe6DJWXjMSOjtJxsSNR/XnJKrlcuyoI4Re3qLG+noEF5QLc0r3VJkySXPRFnmdW05sLswQ6a/n9Sijmg==",
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.102.1.tgz",
+ "integrity": "sha512-7BOfPBiM7Kp6q/iy0JIbsBTxIASV+zWXByqqjuEMWGj3X2u4oRIfm3gv4erPU/l+CORQUVQZLSPGoIoM1gbB/A==",
"dependencies": {
- "@sentry-internal/feedback": "7.100.0",
- "@sentry-internal/replay-canvas": "7.100.0",
- "@sentry-internal/tracing": "7.100.0",
- "@sentry/core": "7.100.0",
- "@sentry/replay": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
+ "@sentry-internal/feedback": "7.102.1",
+ "@sentry-internal/replay-canvas": "7.102.1",
+ "@sentry-internal/tracing": "7.102.1",
+ "@sentry/core": "7.102.1",
+ "@sentry/replay": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/browser/node_modules/@sentry-internal/tracing": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.102.1.tgz",
+ "integrity": "sha512-RkFlFyAC0fQOvBbBqnq0CLmFW5m3JJz9pKbZd5vXPraWAlniKSb1bC/4DF9SlNx0FN1LWG+IU3ISdpzwwTeAGg==",
+ "dependencies": {
+ "@sentry/core": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/browser/node_modules/@sentry/core": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.102.1.tgz",
+ "integrity": "sha512-QjY+LSP3du3J/C8x/FfEbRxgZgsWd0jfTJ4P7s9f219I1csK4OeBMC3UA1HwEa0pY/9OF6H/egW2CjOcMM5Pdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/browser/node_modules/@sentry/types": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.102.1.tgz",
+ "integrity": "sha512-htKorf3t/D0XYtM7foTcmG+rM47rDP6XdbvCcX5gBCuCYlzpM1vqCt2rl3FLktZC6TaIpFRJw1TLfx6m+x5jdA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/browser/node_modules/@sentry/utils": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.102.1.tgz",
+ "integrity": "sha512-+8WcFjHVV/HROXSAwMuUzveElBFC43EiTG7SNEBNgOUeQzQVTmbUZXyTVgLrUmtoWqvnIxCacoLxtZo1o67kdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/bundler-plugin-core": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.14.0.tgz",
- "integrity": "sha512-jVM47EPs8Na2z5HOWgthLFhpHLU9hwL2wY4TzHEnS1Bj+ODgXFa8QcIxQR2SO+W+L8YhSbY7z+BpPsYTpeZWUg==",
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.14.2.tgz",
+ "integrity": "sha512-HgOFWYdq87lSmeVW1w8K2Vf2DGzRPvKzHTajZYLTPlrZ1jbajq9vwuqhrJ9AnDkjl0mjyzSPEy3ZTeG1Z7uRNA==",
"dev": true,
"dependencies": {
"@babel/core": "7.18.5",
- "@sentry/babel-plugin-component-annotate": "2.14.0",
+ "@sentry/babel-plugin-component-annotate": "2.14.2",
"@sentry/cli": "^2.22.3",
- "@sentry/node": "^7.60.0",
- "@sentry/utils": "^7.60.0",
"dotenv": "^16.3.1",
"find-up": "5.0.0",
"glob": "9.3.2",
@@ -4932,9 +5023,9 @@
}
},
"node_modules/@sentry/cli": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.28.0.tgz",
- "integrity": "sha512-0vdMTeN3Ip1wI9T7F6GupuaOocIrfyHpAN3iUztsO7PY2j7e/+m69DRkU99aPTlmUgQikZjtVaHkTsEMLt3lgA==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.28.6.tgz",
+ "integrity": "sha512-o2Ngz7xXuhwHxMi+4BFgZ4qjkX0tdZeOSIZkFAGnTbRhQe5T8bxq6CcQRLdPhqMgqvDn7XuJ3YlFtD3ZjHvD7g==",
"hasInstallScript": true,
"dependencies": {
"https-proxy-agent": "^5.0.0",
@@ -4950,19 +5041,19 @@
"node": ">= 10"
},
"optionalDependencies": {
- "@sentry/cli-darwin": "2.28.0",
- "@sentry/cli-linux-arm": "2.28.0",
- "@sentry/cli-linux-arm64": "2.28.0",
- "@sentry/cli-linux-i686": "2.28.0",
- "@sentry/cli-linux-x64": "2.28.0",
- "@sentry/cli-win32-i686": "2.28.0",
- "@sentry/cli-win32-x64": "2.28.0"
+ "@sentry/cli-darwin": "2.28.6",
+ "@sentry/cli-linux-arm": "2.28.6",
+ "@sentry/cli-linux-arm64": "2.28.6",
+ "@sentry/cli-linux-i686": "2.28.6",
+ "@sentry/cli-linux-x64": "2.28.6",
+ "@sentry/cli-win32-i686": "2.28.6",
+ "@sentry/cli-win32-x64": "2.28.6"
}
},
"node_modules/@sentry/cli-darwin": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.28.0.tgz",
- "integrity": "sha512-GgpayUQcGjT55Dc7oojjbqIYIUaBAr4za7D9yU5foMTJ6QjMTovmtE1bVj4bVKzK+0aIiZvZ2dg2g6jF0iGqfg==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.28.6.tgz",
+ "integrity": "sha512-KRf0VvTltHQ5gA7CdbUkaIp222LAk/f1+KqpDzO6nB/jC/tL4sfiy6YyM4uiH6IbVEudB8WpHCECiatmyAqMBA==",
"optional": true,
"os": [
"darwin"
@@ -4972,9 +5063,9 @@
}
},
"node_modules/@sentry/cli-linux-arm": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.28.0.tgz",
- "integrity": "sha512-hjCRyZBNri+gNoMO22g2qevKcUOnDGhTjmyq14q2rXT0KHb4LjyMpebSgE63YTLDj/qxq4MSq8kcjD/jDzSpLw==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.28.6.tgz",
+ "integrity": "sha512-ANG7U47yEHD1g3JrfhpT4/MclEvmDZhctWgSP5gVw5X4AlcI87E6dTqccnLgvZjiIAQTaJJAZuSHVVF3Jk403w==",
"cpu": [
"arm"
],
@@ -4988,9 +5079,9 @@
}
},
"node_modules/@sentry/cli-linux-arm64": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.28.0.tgz",
- "integrity": "sha512-QZtl4dyVMrsWEuRCN8h3RMQSjekM6LmdAWiEIxCgVMvTueau31EQz1jokGpaYotAsWK2GyzFALiCA3QwMCTtnA==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.28.6.tgz",
+ "integrity": "sha512-caMDt37FI752n4/3pVltDjlrRlPFCOxK4PHvoZGQ3KFMsai0ZhE/0CLBUMQqfZf0M0r8KB2x7wqLm7xSELjefQ==",
"cpu": [
"arm64"
],
@@ -5004,9 +5095,9 @@
}
},
"node_modules/@sentry/cli-linux-i686": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.28.0.tgz",
- "integrity": "sha512-fgT0G6b1OCBHtrIClNrFfO8w5pVw7yIqtVsq4Bf+FJOwkD2buaPx1Qt66aGP+3+AexXO5pXfagN4+ykSsKqKZA==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.28.6.tgz",
+ "integrity": "sha512-Tj1+GMc6lFsDRquOqaGKXFpW9QbmNK4TSfynkWKiJxdTEn5jSMlXXfr0r9OQrxu3dCCqEHkhEyU63NYVpgxIPw==",
"cpu": [
"x86",
"ia32"
@@ -5021,9 +5112,9 @@
}
},
"node_modules/@sentry/cli-linux-x64": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.28.0.tgz",
- "integrity": "sha512-mrqbxpo6dF8iC4nz0+TS8ymIeNKy6gngcmlRVfOBuVEP9+Ry8HAeIzuKwbt4QAA6lwKCbPsEwK5ZLsrJEJIC6A==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.28.6.tgz",
+ "integrity": "sha512-Dt/Xz784w/z3tEObfyJEMmRIzn0D5qoK53H9kZ6e0yNvJOSKNCSOq5cQk4n1/qeG0K/6SU9dirmvHwFUiVNyYg==",
"cpu": [
"x64"
],
@@ -5037,9 +5128,9 @@
}
},
"node_modules/@sentry/cli-win32-i686": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.28.0.tgz",
- "integrity": "sha512-yzji557eqz4XW7z8k0LF4LiIwFAqxPlpVnoeN8ntk8hi/ehXm9AdvPqA+bw7cRK5iu4/Tqr4OJeGPbcI5iKpgQ==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.28.6.tgz",
+ "integrity": "sha512-zkpWtvY3kt+ogVaAbfFr2MEkgMMHJNJUnNMO8Ixce9gh38sybIkDkZNFnVPBXMClJV0APa4QH0EwumYBFZUMuQ==",
"cpu": [
"x86",
"ia32"
@@ -5053,9 +5144,9 @@
}
},
"node_modules/@sentry/cli-win32-x64": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.28.0.tgz",
- "integrity": "sha512-5frag3uV+niuMVYQ3ME5Nwlv5uftV88xDUyaCe1UD9jfM8WqJPgvQYUNPgBQKynxwLAUp5zXII+47Vnn8mriOA==",
+ "version": "2.28.6",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.28.6.tgz",
+ "integrity": "sha512-TG2YzZ9JMeNFzbicdr5fbtsusVGACbrEfHmPgzWGDeLUP90mZxiMTjkXsE1X/5jQEQjB2+fyfXloba/Ugo51hA==",
"cpu": [
"x64"
],
@@ -5067,42 +5158,15 @@
"node": ">=10"
}
},
- "node_modules/@sentry/core": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.100.0.tgz",
- "integrity": "sha512-eWRPuP0Zdj4a2F7SybqNjf13LGOVgGwvW6sojweQp9oxGAfCPp/EMDGBhlpYbMJeLbzmqzJ4ZFHIedaiEC+7kg==",
- "dependencies": {
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@sentry/node": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.100.0.tgz",
- "integrity": "sha512-8cf9wFNo/9I++60MVAf6tuKn/N5JCZ/Z8NDUzutnWWdQBLSx+LhZYNPntN3WkHl6Q7PBHGw3mU1Bc+rF48MeSQ==",
- "dev": true,
- "dependencies": {
- "@sentry-internal/tracing": "7.100.0",
- "@sentry/core": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@sentry/react": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.100.0.tgz",
- "integrity": "sha512-IveXfTHUx9/fk4VvIL3htfmU4rynYHl+7R44UExbKcLOmUffgi6FscmI1otdd3tQvTE0OH85vCP6+ZR6kQgHQw==",
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.102.1.tgz",
+ "integrity": "sha512-X4j2DgbktlEifnd21YJKCayAmff5hnaS+9MNz9OonEwD0ARi0ks7bo0wtWHMjPK20992MO+JwczVg/1BXJYDdQ==",
"dependencies": {
- "@sentry/browser": "7.100.0",
- "@sentry/core": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0",
+ "@sentry/browser": "7.102.1",
+ "@sentry/core": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1",
"hoist-non-react-statics": "^3.3.2"
},
"engines": {
@@ -5112,57 +5176,157 @@
"react": "15.x || 16.x || 17.x || 18.x"
}
},
- "node_modules/@sentry/replay": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.100.0.tgz",
- "integrity": "sha512-6Yo56J+x+eedaMXri8pPlFxXOofnSXVdsUuFj+kJ7lC/qHrwIbgC5g1ONEK/WlYwpVH4gA0aNnCa5AOkMu+ZTg==",
+ "node_modules/@sentry/react/node_modules/@sentry/core": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.102.1.tgz",
+ "integrity": "sha512-QjY+LSP3du3J/C8x/FfEbRxgZgsWd0jfTJ4P7s9f219I1csK4OeBMC3UA1HwEa0pY/9OF6H/egW2CjOcMM5Pdg==",
"dependencies": {
- "@sentry-internal/tracing": "7.100.0",
- "@sentry/core": "7.100.0",
- "@sentry/types": "7.100.0",
- "@sentry/utils": "7.100.0"
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/react/node_modules/@sentry/types": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.102.1.tgz",
+ "integrity": "sha512-htKorf3t/D0XYtM7foTcmG+rM47rDP6XdbvCcX5gBCuCYlzpM1vqCt2rl3FLktZC6TaIpFRJw1TLfx6m+x5jdA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/react/node_modules/@sentry/utils": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.102.1.tgz",
+ "integrity": "sha512-+8WcFjHVV/HROXSAwMuUzveElBFC43EiTG7SNEBNgOUeQzQVTmbUZXyTVgLrUmtoWqvnIxCacoLxtZo1o67kdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/replay": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.102.1.tgz",
+ "integrity": "sha512-HR/j9dGIvbrId8fh8mQlODx7JrhRmawEd9e9P3laPtogWCg/5TI+XPb2VGSaXOX9VWtb/6Z2UjHsaGjgg6YcuA==",
+ "dependencies": {
+ "@sentry-internal/tracing": "7.102.1",
+ "@sentry/core": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
},
"engines": {
"node": ">=12"
}
},
- "node_modules/@sentry/tracing": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.100.0.tgz",
- "integrity": "sha512-k8Zzmqu/11MRiMZO8s/d41pcfdR5FNm/sZXB0e+0EWsFlXCLl1vYd67sK0yyll7UzTFd4x8+XqXlsXEp+ulUuA==",
+ "node_modules/@sentry/replay/node_modules/@sentry-internal/tracing": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.102.1.tgz",
+ "integrity": "sha512-RkFlFyAC0fQOvBbBqnq0CLmFW5m3JJz9pKbZd5vXPraWAlniKSb1bC/4DF9SlNx0FN1LWG+IU3ISdpzwwTeAGg==",
"dependencies": {
- "@sentry-internal/tracing": "7.100.0"
+ "@sentry/core": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/@sentry/types": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.100.0.tgz",
- "integrity": "sha512-c+RHwZwpKeBk7h8sUX4nQcelxBz8ViCojifnbEe3tcn8O15HOLvZqRKgLLOiff3MoErxiv4oxs0sPbEFRm/IvA==",
+ "node_modules/@sentry/replay/node_modules/@sentry/core": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.102.1.tgz",
+ "integrity": "sha512-QjY+LSP3du3J/C8x/FfEbRxgZgsWd0jfTJ4P7s9f219I1csK4OeBMC3UA1HwEa0pY/9OF6H/egW2CjOcMM5Pdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/@sentry/utils": {
- "version": "7.100.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.100.0.tgz",
- "integrity": "sha512-LAhZMEGq3C125prZN/ShqeXpRfdfgJkl9RAKjfq8cmMFsF7nsF72dEHZgIwrZ0lgNmtaWAB83AwJcyN83RwOxQ==",
+ "node_modules/@sentry/replay/node_modules/@sentry/types": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.102.1.tgz",
+ "integrity": "sha512-htKorf3t/D0XYtM7foTcmG+rM47rDP6XdbvCcX5gBCuCYlzpM1vqCt2rl3FLktZC6TaIpFRJw1TLfx6m+x5jdA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/replay/node_modules/@sentry/utils": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.102.1.tgz",
+ "integrity": "sha512-+8WcFjHVV/HROXSAwMuUzveElBFC43EiTG7SNEBNgOUeQzQVTmbUZXyTVgLrUmtoWqvnIxCacoLxtZo1o67kdg==",
"dependencies": {
- "@sentry/types": "7.100.0"
+ "@sentry/types": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/tracing": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.102.1.tgz",
+ "integrity": "sha512-9VQEox0R7ouhhUVHtBwlGlXG5beDCM/Uo0BY+G0M1H03aFJsLAwnxPNeWnK3WvPejxf94EgdimKMjDjv9l2Sbg==",
+ "dependencies": {
+ "@sentry-internal/tracing": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/tracing/node_modules/@sentry-internal/tracing": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.102.1.tgz",
+ "integrity": "sha512-RkFlFyAC0fQOvBbBqnq0CLmFW5m3JJz9pKbZd5vXPraWAlniKSb1bC/4DF9SlNx0FN1LWG+IU3ISdpzwwTeAGg==",
+ "dependencies": {
+ "@sentry/core": "7.102.1",
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/tracing/node_modules/@sentry/core": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.102.1.tgz",
+ "integrity": "sha512-QjY+LSP3du3J/C8x/FfEbRxgZgsWd0jfTJ4P7s9f219I1csK4OeBMC3UA1HwEa0pY/9OF6H/egW2CjOcMM5Pdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1",
+ "@sentry/utils": "7.102.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/tracing/node_modules/@sentry/types": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.102.1.tgz",
+ "integrity": "sha512-htKorf3t/D0XYtM7foTcmG+rM47rDP6XdbvCcX5gBCuCYlzpM1vqCt2rl3FLktZC6TaIpFRJw1TLfx6m+x5jdA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@sentry/tracing/node_modules/@sentry/utils": {
+ "version": "7.102.1",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.102.1.tgz",
+ "integrity": "sha512-+8WcFjHVV/HROXSAwMuUzveElBFC43EiTG7SNEBNgOUeQzQVTmbUZXyTVgLrUmtoWqvnIxCacoLxtZo1o67kdg==",
+ "dependencies": {
+ "@sentry/types": "7.102.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/webpack-plugin": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.14.0.tgz",
- "integrity": "sha512-6lYxabSSkoMqz+zsACamYfu8amLSIiYFj+CQBLvWKSW7N6wJvaZKfFVHj5bGlmU7K0X0eJyQdxdk6VfLg129Jw==",
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.14.2.tgz",
+ "integrity": "sha512-BEWF5qerGG/xX0ixEOCYh9gCkc+FHDzXxRMCFkM8yQNGH361ELF578KtuoZxXDy0kWa9QGZxSoP6/HZSnJEF9A==",
"dev": true,
"dependencies": {
- "@sentry/bundler-plugin-core": "2.14.0",
+ "@sentry/bundler-plugin-core": "2.14.2",
"unplugin": "1.0.1",
"uuid": "^9.0.0"
},
@@ -6556,9 +6720,9 @@
}
},
"node_modules/ace-builds": {
- "version": "1.32.2",
- "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.2.tgz",
- "integrity": "sha512-mnJAc803p+7eeDt07r6XI7ufV7VdkpPq4gJZT8Jb3QsowkaBTVy4tdBgPrVT0WbXLm0toyEQXURKSVNj/7dfJQ=="
+ "version": "1.32.6",
+ "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.6.tgz",
+ "integrity": "sha512-dO5BnyDOhCnznhOpILzXq4jqkbhRXxNkf3BuVTmyxGyRLrhddfdyk6xXgy+7A8LENrcYoFi/sIxMuH3qjNUN4w=="
},
"node_modules/acorn": {
"version": "8.11.2",
@@ -6803,16 +6967,16 @@
}
},
"node_modules/antd": {
- "version": "5.14.0",
- "resolved": "https://registry.npmjs.org/antd/-/antd-5.14.0.tgz",
- "integrity": "sha512-LdRJnYd8dTykR2xr483zNE0mBKmWHMLqmjkfcX4otQRD0kaZjOwSmN74vMC70jnMM8oqhWILFjWy3dEy/E1W6w==",
+ "version": "5.14.2",
+ "resolved": "https://registry.npmjs.org/antd/-/antd-5.14.2.tgz",
+ "integrity": "sha512-ur0oBI9U7hAeON4ZRs1cAF1suIpTR+uj3YliTZacWkiVxNTZYPaaTdnLuAZDRMT9P2IZ007dCQTqxn5t1Z+Dxw==",
"dependencies": {
"@ant-design/colors": "^7.0.2",
"@ant-design/cssinjs": "^1.18.4",
"@ant-design/icons": "^5.3.0",
"@ant-design/react-slick": "~1.0.2",
"@ctrl/tinycolor": "^3.6.1",
- "@rc-component/color-picker": "~1.5.1",
+ "@rc-component/color-picker": "~1.5.2",
"@rc-component/mutate-observer": "^1.1.0",
"@rc-component/tour": "~1.12.3",
"@rc-component/trigger": "^1.18.3",
@@ -6835,7 +6999,7 @@
"rc-motion": "^2.9.0",
"rc-notification": "~5.3.0",
"rc-pagination": "~4.0.4",
- "rc-picker": "~4.0.0-alpha.43",
+ "rc-picker": "~4.1.4",
"rc-progress": "~3.5.1",
"rc-rate": "~2.12.0",
"rc-resize-observer": "^1.4.0",
@@ -6851,7 +7015,7 @@
"rc-tree": "~5.8.5",
"rc-tree-select": "~5.17.0",
"rc-upload": "~4.5.2",
- "rc-util": "^5.38.1",
+ "rc-util": "^5.38.2",
"scroll-into-view-if-needed": "^3.1.0",
"throttle-debounce": "^5.0.0"
},
@@ -9488,9 +9652,9 @@
"integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw=="
},
"node_modules/cypress": {
- "version": "13.6.4",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.4.tgz",
- "integrity": "sha512-pYJjCfDYB+hoOoZuhysbbYhEmNW7DEDsqn+ToCLwuVowxUXppIWRr7qk4TVRIU471ksfzyZcH+mkoF0CQUKnpw==",
+ "version": "13.6.6",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.6.tgz",
+ "integrity": "sha512-S+2S9S94611hXimH9a3EAYt81QM913ZVA03pUmGDfLTFa5gyp85NJ8dJGSlEAEmyRsYkioS1TtnWtbv/Fzt11A==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
@@ -9501,7 +9665,7 @@
"arch": "^2.2.0",
"blob-util": "^2.0.2",
"bluebird": "^3.7.2",
- "buffer": "^5.6.0",
+ "buffer": "^5.7.1",
"cachedir": "^2.3.0",
"chalk": "^4.1.0",
"check-more-types": "^2.24.0",
@@ -9519,7 +9683,7 @@
"figures": "^3.2.0",
"fs-extra": "^9.1.0",
"getos": "^3.2.1",
- "is-ci": "^3.0.0",
+ "is-ci": "^3.0.1",
"is-installed-globally": "~0.4.0",
"lazy-ass": "^1.6.0",
"listr2": "^3.8.3",
@@ -9565,6 +9729,16 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/cypress/node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
"node_modules/d3-array": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
@@ -10331,14 +10505,14 @@
}
},
"node_modules/dotenv": {
- "version": "16.4.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz",
- "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==",
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
- "url": "https://github.com/motdotla/dotenv?sponsor=1"
+ "url": "https://dotenvx.com"
}
},
"node_modules/dotenv-expand": {
@@ -11694,6 +11868,16 @@
"@types/yauzl": "^2.9.1"
}
},
+ "node_modules/extract-zip/node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -11708,6 +11892,14 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
+ "node_modules/fast-equals": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
+ "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/fast-glob": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -11775,6 +11967,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
"dependencies": {
"pend": "~1.2.0"
}
@@ -13062,9 +13255,9 @@
}
},
"node_modules/i18next": {
- "version": "23.8.2",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.8.2.tgz",
- "integrity": "sha512-Z84zyEangrlERm0ZugVy4bIt485e/H8VecGUZkZWrH7BDePG6jT73QdL9EA1tRTTVVMpry/MgWIP1FjEn0DRXA==",
+ "version": "23.10.0",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
+ "integrity": "sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==",
"funding": [
{
"type": "individual",
@@ -15305,16 +15498,16 @@
}
},
"node_modules/jsoneditor": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-10.0.0.tgz",
- "integrity": "sha512-yh/kj/Ecxacj7ZG2ynmJvHcESgdHiAe1N7iKUVIYFpeP4/rwp87yua2y0BDayyY6uJz01KgRvdl4W1Wt94EkOQ==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-10.0.1.tgz",
+ "integrity": "sha512-a9eNs1XegXBrZSMakpDQTCx6z2GyjnbfxDJ9vd2Vn+lD2zORbQ7vyTqSZLI7Ihz8qel1C8KHFy7EFxtp3d++RA==",
"dependencies": {
- "ace-builds": "^1.32.2",
+ "ace-builds": "^1.32.6",
"ajv": "^6.12.6",
"javascript-natural-sort": "^0.7.1",
"jmespath": "^0.16.0",
"json-source-map": "^0.6.1",
- "jsonrepair": "3.5.0",
+ "jsonrepair": "^3.5.1",
"mobius1-selectr": "^2.4.13",
"picomodal": "^3.0.0",
"vanilla-picker": "^2.12.2"
@@ -15362,9 +15555,9 @@
}
},
"node_modules/jsonrepair": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.5.0.tgz",
- "integrity": "sha512-SavvDsUP9Xnqo2MoC6Wl6zNyX3f+I5199hRbXBtAITyP2NTPyAgyx5xM0bgcIljRjzsIvOBANbgfWe8XXlyeLA==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.6.0.tgz",
+ "integrity": "sha512-ZvOmoq35LhlDaf1W3uT7e17Bh2dYbln1+pdJ1KUIMkRAoUC4mvXX+dbr9Ih6dDmYvB0mdijAucyPk4xX1cEjww==",
"bin": {
"jsonrepair": "bin/cli.js"
}
@@ -15549,9 +15742,9 @@
}
},
"node_modules/libphonenumber-js": {
- "version": "1.10.55",
- "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.55.tgz",
- "integrity": "sha512-MrTg2JFLscgmTY6/oT9vopYETlgUls/FU6OaeeamGwk4LFxjIgOUML/ZSZICgR0LPYXaonVJo40lzMvaaTJlQA=="
+ "version": "1.10.57",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.57.tgz",
+ "integrity": "sha512-OjsEd9y4LgcX+Ig09SbxWqcGESxliDDFNVepFhB9KEsQZTrnk3UdEU+cO0sW1APvLprHstQpS23OQpZ3bwxy6Q=="
},
"node_modules/lilconfig": {
"version": "2.1.0",
@@ -15816,9 +16009,9 @@
}
},
"node_modules/logrocket": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/logrocket/-/logrocket-7.0.0.tgz",
- "integrity": "sha512-IvM4RKYTAByljKTWCx/Q+58Nvt4Dmf/0PIHLfall3kqDtxiDSVKSzu3/bvGb3riHE/C7xY3wzLxy6v+Wui1NUQ=="
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/logrocket/-/logrocket-8.0.1.tgz",
+ "integrity": "sha512-bksVbjcoNpJjwn3EfB4D0JxXBxozPTAwEkRzchfl/nnVuCMp9zlUz4pkp7DgA7FVi4rzjzH4zriam1u3vej+hg=="
},
"node_modules/long": {
"version": "5.2.3",
@@ -19614,9 +19807,9 @@
}
},
"node_modules/rc-picker": {
- "version": "4.0.0-alpha.44",
- "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.0.0-alpha.44.tgz",
- "integrity": "sha512-OvzzTS4UZDT1qRfv4PRK/+LDpXWJ6sD0zv5LPC7fvprihT/YVvjrOQPicWLlw5GqrrqP4hqbQkWB4KXDNlb5ag==",
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.1.4.tgz",
+ "integrity": "sha512-sAdgj1kW9wvuoS5p2Zw3pT52iUYxidYaqXVLooaKxTqgYbhe8cG8Ld3b8cgwYfKrIkm/j+qp9nDQlrFPSl16lQ==",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/trigger": "^1.5.0",
@@ -19941,9 +20134,9 @@
}
},
"node_modules/rc-util": {
- "version": "5.38.1",
- "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz",
- "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==",
+ "version": "5.38.2",
+ "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.2.tgz",
+ "integrity": "sha512-yRGRPKyi84H7NkRSP6FzEIYBdUt4ufdsmXUZ7qM2H5qoByPax70NnGPkfo36N+UKUnUBj2f2Q2eUbwYMuAsIOQ==",
"dependencies": {
"@babel/runtime": "^7.18.3",
"react-is": "^18.2.0"
@@ -20089,9 +20282,9 @@
}
},
"node_modules/react-big-calendar": {
- "version": "1.8.7",
- "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.8.7.tgz",
- "integrity": "sha512-qgxQyPIYoWM+TLbGNlEUIEyNE6USAAc7LEAhtUKzJgoP4XsgpnqXJ46Ub298mRzMRM6crRweh3AywDjl5GbHnQ==",
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.10.3.tgz",
+ "integrity": "sha512-LmIWlFfGUn8yt4RxcVkGNmjM3GcWynr1bfDwKrrz4KKj517+DH3OGmQzErURN6Zb0OB88HF4oH2dvDHpBQJgIw==",
"dependencies": {
"@babel/runtime": "^7.20.7",
"clsx": "^1.2.1",
@@ -20138,9 +20331,9 @@
}
},
"node_modules/react-cookie": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.0.2.tgz",
- "integrity": "sha512-UnW1rZw1VibRdTvV8Ksr0BKKZoajeUxYLE89sIygDeyQgtz6ik89RHOM+3kib36G9M7HxheORggPoLk5DxAK7Q==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.1.0.tgz",
+ "integrity": "sha512-n2+Gt07/xxuShXary+SImk1sw5l7a1UguQOQEN55YewEW5LoA0opbR4nbeo8sY6OYwR37iCFJtqJ0AGEywqAtg==",
"dependencies": {
"@types/hoist-non-react-statics": "^3.3.5",
"hoist-non-react-statics": "^3.3.2",
@@ -20267,9 +20460,9 @@
}
},
"node_modules/react-i18next": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.4.tgz",
- "integrity": "sha512-8a20OOCOcUiuM+FVfgOGVrgG6FdoRRzZvdPFdMJ0LX792myAfzZTbRoHchoSNZiXF488gOxaif19etlu71eAKg==",
+ "version": "14.0.5",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.5.tgz",
+ "integrity": "sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==",
"dependencies": {
"@babel/runtime": "^7.23.9",
"html-parse-stringify": "^3.0.1"
@@ -20310,9 +20503,9 @@
}
},
"node_modules/react-intersection-observer": {
- "version": "9.7.0",
- "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.7.0.tgz",
- "integrity": "sha512-euleEjBVaMRwSOMNVcMX5WGn74GfZ9I78nx9SUb5a0eXd0IhegjJcUliSO9Jd+xiaZ5rgFvbGoVln66lpMyUUg==",
+ "version": "9.8.1",
+ "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.8.1.tgz",
+ "integrity": "sha512-QzOFdROX8D8MH3wE3OVKH0f3mLjKTtEN1VX/rkNuECCff+aKky0pIjulDhr3Ewqj5el/L+MhBkM3ef0Tbt+qUQ==",
"peerDependencies": {
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
@@ -20454,11 +20647,11 @@
}
},
"node_modules/react-router": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz",
- "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==",
+ "version": "6.22.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz",
+ "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==",
"dependencies": {
- "@remix-run/router": "1.15.0"
+ "@remix-run/router": "1.15.1"
},
"engines": {
"node": ">=14.0.0"
@@ -20468,12 +20661,12 @@
}
},
"node_modules/react-router-dom": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz",
- "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==",
+ "version": "6.22.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz",
+ "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==",
"dependencies": {
- "@remix-run/router": "1.15.0",
- "react-router": "6.22.0"
+ "@remix-run/router": "1.15.1",
+ "react-router": "6.22.1"
},
"engines": {
"node": ">=14.0.0"
@@ -20577,48 +20770,17 @@
}
},
"node_modules/react-smooth": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz",
- "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.0.tgz",
+ "integrity": "sha512-2NMXOBY1uVUQx1jBeENGA497HK20y6CPGYL1ZnJLeoQ8rrc3UfmOM82sRxtzpcoCkUMy4CS0RGylfuVhuFjBgg==",
"dependencies": {
- "fast-equals": "^5.0.0",
- "react-transition-group": "2.9.0"
+ "fast-equals": "^5.0.1",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
},
"peerDependencies": {
- "prop-types": "^15.6.0",
- "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-smooth/node_modules/dom-helpers": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
- "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
- "dependencies": {
- "@babel/runtime": "^7.1.2"
- }
- },
- "node_modules/react-smooth/node_modules/fast-equals": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
- "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/react-smooth/node_modules/react-transition-group": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
- "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
- "dependencies": {
- "dom-helpers": "^3.4.0",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2",
- "react-lifecycles-compat": "^3.0.4"
- },
- "peerDependencies": {
- "react": ">=15.0.0",
- "react-dom": ">=15.0.0"
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-sticky": {
@@ -20661,6 +20823,21 @@
"resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.1.24.tgz",
"integrity": "sha512-MVZSKubpU/vIfpmOsi8/0ckWxb0WmGBmyNoEDGWZM9cM8n8sCL6DJftl3lEf8Uy5zKQ9+O1XdJxscWTDosCQpQ=="
},
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
"node_modules/react-virtualized": {
"version": "9.22.5",
"resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz",
@@ -20719,15 +20896,15 @@
}
},
"node_modules/recharts": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.11.0.tgz",
- "integrity": "sha512-5s+u1m5Hwxb2nh0LABkE3TS/lFqFHyWl7FnPbQhHobbQQia4ih1t3o3+ikPYr31Ns+kYe4FASIthKeKi/YYvMg==",
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.1.tgz",
+ "integrity": "sha512-35vUCEBPf+pM+iVgSgVTn86faKya5pc4JO6cYJL63qOK2zDEyzDn20Tdj+CDI/3z+VcpKyQ8ZBQ9OiQ+vuAbjg==",
"dependencies": {
"clsx": "^2.0.0",
"eventemitter3": "^4.0.1",
- "lodash": "^4.17.19",
+ "lodash": "^4.17.21",
"react-is": "^16.10.2",
- "react-smooth": "^2.0.5",
+ "react-smooth": "^4.0.0",
"recharts-scale": "^0.4.4",
"tiny-invariant": "^1.3.1",
"victory-vendor": "^36.6.8"
@@ -20736,7 +20913,6 @@
"node": ">=14"
},
"peerDependencies": {
- "prop-types": "^15.6.0",
"react": "^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
}
@@ -21450,9 +21626,9 @@
"integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA=="
},
"node_modules/sass": {
- "version": "1.70.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz",
- "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==",
+ "version": "1.71.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz",
+ "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
@@ -25473,12 +25649,15 @@
}
},
"node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.0.tgz",
+ "integrity": "sha512-zbff6SaAPyewVextulqeBjJm+1ZhS69vSN7cRpqVD7jMNSE9oXEdQ1SGF+ydfB+gKE2a3GiWfXf/pnwVZ1/tOA==",
"dependencies": {
"buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
+ "pend": "~1.2.0"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/yn": {
diff --git a/client/package.json b/client/package.json
index 77ff5f0c5..202ec93c5 100644
--- a/client/package.json
+++ b/client/package.json
@@ -11,13 +11,13 @@
"@craco/craco": "^7.1.0",
"@fingerprintjs/fingerprintjs": "^4.2.2",
"@jsreport/browser-client": "^3.1.0",
- "@reduxjs/toolkit": "^2.1.0",
- "@sentry/cli": "^2.28.0",
- "@sentry/react": "^7.100.0",
- "@sentry/tracing": "^7.100.0",
+ "@reduxjs/toolkit": "^2.2.1",
+ "@sentry/cli": "^2.28.6",
+ "@sentry/react": "^7.102.1",
+ "@sentry/tracing": "^7.102.1",
"@splitsoftware/splitio-react": "^1.11.0",
"@tanem/react-nprogress": "^5.0.51",
- "antd": "^5.14.0",
+ "antd": "^5.14.2",
"apollo-link-logger": "^2.0.1",
"apollo-link-sentry": "^3.3.0",
"axios": "^1.6.7",
@@ -25,18 +25,18 @@
"dayjs": "^1.11.10",
"dayjs-business-days2": "^1.2.2",
"dinero.js": "^1.9.1",
- "dotenv": "^16.4.1",
+ "dotenv": "^16.4.5",
"enquire-js": "^0.2.1",
"env-cmd": "^10.1.0",
"exifr": "^7.1.3",
"firebase": "^10.8.0",
"graphql": "^16.6.0",
- "i18next": "^23.8.2",
+ "i18next": "^23.10.0",
"i18next-browser-languagedetector": "^7.0.2",
- "jsoneditor": "^10.0.0",
+ "jsoneditor": "^10.0.1",
"jsreport-browser-client-dist": "^1.3.0",
- "libphonenumber-js": "^1.10.55",
- "logrocket": "^7.0.0",
+ "libphonenumber-js": "^1.10.57",
+ "logrocket": "^8.0.1",
"markerjs2": "^2.32.0",
"normalize-url": "^8.0.0",
"phone": "^3.1.42",
@@ -46,33 +46,33 @@
"rc-queue-anim": "^2.0.0",
"rc-scroll-anim": "^2.7.6",
"react": "^18.2.0",
- "react-big-calendar": "^1.8.7",
+ "react-big-calendar": "^1.10.3",
"react-color": "^2.19.3",
- "react-cookie": "^7.0.2",
+ "react-cookie": "^7.1.0",
"react-dom": "^18.2.0",
"react-drag-listview": "^2.0.0",
"react-grid-gallery": "^1.0.0",
"react-grid-layout": "1.3.4",
- "react-i18next": "^14.0.4",
+ "react-i18next": "^14.0.5",
"react-icons": "^5.0.1",
"react-image-lightbox": "^5.1.4",
- "react-intersection-observer": "^9.7.0",
+ "react-intersection-observer": "^9.8.1",
"react-markdown": "^9.0.1",
"react-number-format": "^5.1.4",
"react-redux": "^9.1.0",
"react-resizable": "^3.0.5",
- "react-router-dom": "^6.22.0",
+ "react-router-dom": "^6.22.1",
"react-scripts": "^5.0.1",
"react-sticky": "^6.0.3",
"react-sublime-video": "^0.2.5",
"react-virtualized": "^9.22.5",
- "recharts": "^2.11.0",
+ "recharts": "^2.12.1",
"redux": "^5.0.1",
"redux-persist": "^6.0.0",
"redux-saga": "^1.3.0",
"redux-state-sync": "^3.1.4",
"reselect": "^5.1.0",
- "sass": "^1.70.0",
+ "sass": "^1.71.1",
"socket.io-client": "^4.7.4",
"styled-components": "^6.1.8",
"subscriptions-transport-ws": "^0.11.0",
@@ -84,7 +84,7 @@
"workbox-precaching": "^7.0.0",
"workbox-routing": "^7.0.0",
"workbox-strategies": "^7.0.0",
- "yauzl": "^2.10.0"
+ "yauzl": "^3.1.0"
},
"scripts": {
"analyze": "source-map-explorer 'build/static/js/*.js'",
@@ -130,9 +130,9 @@
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@dotenvx/dotenvx": "^0.15.0",
- "@sentry/webpack-plugin": "^2.14.0",
+ "@sentry/webpack-plugin": "^2.14.2",
"@testing-library/cypress": "^10.0.1",
- "cypress": "^13.6.4",
+ "cypress": "^13.6.6",
"eslint-plugin-cypress": "^2.15.1",
"react-error-overlay": "6.0.11",
"redux-logger": "^3.0.6",
diff --git a/client/src/components/contract-form/contract-form.component.jsx b/client/src/components/contract-form/contract-form.component.jsx
index 8dbf991cd..ae983a6c6 100644
--- a/client/src/components/contract-form/contract-form.component.jsx
+++ b/client/src/components/contract-form/contract-form.component.jsx
@@ -66,7 +66,30 @@ export default function ContractFormComponent({
)}
-
+ {create && (
+
p.scheduledreturn !== c.scheduledreturn}
+ >
+ {() => {
+ const insuranceOver =
+ selectedCar &&
+ selectedCar.insuranceexpires &&
+ dayjs(selectedCar.insuranceexpires)
+ .endOf("day")
+ .isBefore(dayjs(form.getFieldValue("scheduledreturn")));
+ if (insuranceOver)
+ return (
+
+
+
+ {t("contracts.labels.insuranceexpired")}
+
+
+ );
+ return <>>;
+ }}
+
+ )}
{() => {
const mileageOver =
- selectedCar &&
- selectedCar.nextservicekm <= form.getFieldValue("kmstart");
-
+ selectedCar && selectedCar.nextservicekm
+ ? selectedCar.nextservicekm <= form.getFieldValue("kmstart")
+ : false;
const dueForService =
selectedCar &&
selectedCar.nextservicedate &&
- dayjs(selectedCar.nextservicedate).isBefore(
+ dayjs(selectedCar.nextservicedate)
+ .endOf("day")
+ .isSameOrBefore(
dayjs(form.getFieldValue("scheduledreturn"))
- );
-
+ );
if (mileageOver || dueForService)
return (
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 97e0a7979..e7cb3dc00 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
@@ -64,18 +64,29 @@ export default function CourtesyCarsList({loading, courtesycars, refetch}) {
sortOrder:
state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
render: (text, record) => {
- const {nextservicedate, nextservicekm, mileage} = record;
+ const {nextservicedate, nextservicekm, mileage, insuranceexpires} =
+ record;
const mileageOver = nextservicekm ? nextservicekm <= mileage : false;
const dueForService =
nextservicedate && dayjs(nextservicedate).endOf('day').isSameOrBefore(dayjs());
+ const insuranceOver =
+ insuranceexpires &&
+ dayjs(insuranceexpires).endOf("day").isBefore(dayjs());
return (
{t(record.status)}
- {(mileageOver || dueForService) && (
-
+ {(mileageOver || dueForService || insuranceOver) && (
+
)}
diff --git a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx
index e9977d934..5277ca0ec 100644
--- a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx
+++ b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx
@@ -1,221 +1,469 @@
-import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined,} from "@ant-design/icons";
-import {Card, Space, Table, Tooltip} from "antd";
-import dayjs from "../../../utils/day";
-import React, {useState} from "react";
-import {useTranslation} from "react-i18next";
-import {Link} from "react-router-dom";
+import {
+ BranchesOutlined,
+ ExclamationCircleFilled,
+ PauseCircleOutlined,
+} from "@ant-design/icons";
+import { Card, Space, Switch, Table, Tooltip, Typography } from "antd";
+import moment from "moment";
+import React, { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { Link } from "react-router-dom";
+import { TimeFormatter } from "../../../utils/DateFormatter";
+import { onlyUnique } from "../../../utils/arrayHelper";
+import { alphaSort, dateSort } from "../../../utils/sorters";
+import useLocalStorage from "../../../utils/useLocalStorage";
import ChatOpenButton from "../../chat-open-button/chat-open-button.component";
-import OwnerNameDisplay from "../../owner-name-display/owner-name-display.component";
+import OwnerNameDisplay, {
+ OwnerNameDisplayFunction,
+} from "../../owner-name-display/owner-name-display.component";
import DashboardRefreshRequired from "../refresh-required.component";
-import {pageLimit} from "../../../utils/config";
-export default function DashboardScheduledInToday({data, ...cardProps}) {
- const {t} = useTranslation();
- const [state, setState] = useState({
- sortedInfo: {},
- });
- if (!data) return null;
- if (!data.scheduled_in_today)
- return ;
+export default function DashboardScheduledInToday({ data, ...cardProps }) {
+ const { t } = useTranslation();
+ const [state, setState] = useState({
+ sortedInfo: {},
+ filteredInfo: {},
+ });
- const appt = []; // Flatten Data
- data.scheduled_in_today.forEach((item) => {
- if (item.job) {
- var i = {
- canceled: item.canceled,
- id: item.id,
- alt_transport: item.job.alt_transport,
- clm_no: item.job.clm_no,
- jobid: item.job.jobid,
- ins_co_nm: item.job.ins_co_nm,
- iouparent: item.job.iouparent,
- ownerid: item.job.ownerid,
- ownr_co_nm: item.job.ownr_co_nm,
- ownr_ea: item.job.ownr_ea,
- ownr_fn: item.job.ownr_fn,
- ownr_ln: item.job.ownr_ln,
- ownr_ph1: item.job.ownr_ph1,
- ownr_ph2: item.job.ownr_ph2,
- production_vars: item.job.production_vars,
- ro_number: item.job.ro_number,
- suspended: item.job.suspended,
- v_make_desc: item.job.v_make_desc,
- v_model_desc: item.job.v_model_desc,
- v_model_yr: item.job.v_model_yr,
- v_vin: item.job.v_vin,
- vehicleid: item.job.vehicleid,
- note: item.note,
- start: dayjs(item.start).format("hh:mm a"),
- title: item.title,
- };
- appt.push(i);
- }
- });
- appt.sort(function (a, b) {
- return new dayjs(a.start) - new dayjs(b.start);
- });
+ const [isTvModeScheduledIn, setIsTvModeScheduledIn] = useLocalStorage(
+ "isTvModeScheduledIn",
+ false
+ );
- const columns = [
- {
- title: t("jobs.fields.ro_number"),
- dataIndex: "ro_number",
- key: "ro_number",
- render: (text, record) => (
- e.stopPropagation()}
- >
-
- {record.ro_number || t("general.labels.na")}
- {record.production_vars && record.production_vars.alert ? (
-
- ) : null}
- {record.suspended && (
-
- )}
- {record.iouparent && (
-
-
-
- )}
-
-
- ),
- },
- {
- title: t("jobs.fields.owner"),
- dataIndex: "owner",
- key: "owner",
- ellipsis: true,
- responsive: ["md"],
- render: (text, record) => {
- return record.ownerid ? (
- e.stopPropagation()}
- >
-
-
- ) : (
-
-
-
- );
- },
- },
- {
- title: t("jobs.fields.ownr_ph1"),
- dataIndex: "ownr_ph1",
- key: "ownr_ph1",
- ellipsis: true,
- responsive: ["md"],
- render: (text, record) => (
-
- ),
- },
- {
- title: t("jobs.fields.ownr_ph2"),
- dataIndex: "ownr_ph2",
- key: "ownr_ph2",
- ellipsis: true,
- responsive: ["md"],
- render: (text, record) => (
-
- ),
- },
- {
- title: t("jobs.fields.ownr_ea"),
- dataIndex: "ownr_ea",
- key: "ownr_ea",
- ellipsis: true,
- responsive: ["md"],
- render: (text, record) => (
-
- ),
- },
- {
- title: t("jobs.fields.vehicle"),
- dataIndex: "vehicle",
- key: "vehicle",
- ellipsis: true,
- render: (text, record) => {
- return record.vehicleid ? (
- e.stopPropagation()}
- >
- {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
- record.v_model_desc || ""
- }`}
-
- ) : (
- {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
- record.v_model_desc || ""
- }`}
- );
- },
- },
- {
- title: t("jobs.fields.ins_co_nm"),
- dataIndex: "ins_co_nm",
- key: "ins_co_nm",
- ellipsis: true,
- responsive: ["md"],
- },
- {
- title: t("appointments.fields.time"),
- dataIndex: "start",
- key: "start",
- ellipsis: true,
- responsive: ["md"],
- },
- {
- title: t("appointments.fields.alt_transport"),
- dataIndex: "alt_transport",
- key: "alt_transport",
- ellipsis: true,
- responsive: ["md"],
- },
- ];
+ if (!data) return null;
+ if (!data.scheduled_in_today)
+ return ;
- const handleTableChange = (sorter) => {
- setState({...state, sortedInfo: sorter});
- };
+ const appt = []; // Flatten Data
+ data.scheduled_in_today.forEach((item) => {
+ if (item.job) {
+ var i = {
+ canceled: item.canceled,
+ id: item.id,
+ alt_transport: item.job.alt_transport,
+ clm_no: item.job.clm_no,
+ jobid: item.job.jobid,
+ joblines_body: item.job.joblines
+ .filter((l) => l.mod_lbr_ty !== "LAR")
+ .reduce((acc, val) => acc + val.mod_lb_hrs, 0),
+ joblines_ref: item.job.joblines
+ .filter((l) => l.mod_lbr_ty === "LAR")
+ .reduce((acc, val) => acc + val.mod_lb_hrs, 0),
+ ins_co_nm: item.job.ins_co_nm,
+ iouparent: item.job.iouparent,
+ ownerid: item.job.ownerid,
+ ownr_co_nm: item.job.ownr_co_nm,
+ ownr_ea: item.job.ownr_ea,
+ ownr_fn: item.job.ownr_fn,
+ ownr_ln: item.job.ownr_ln,
+ ownr_ph1: item.job.ownr_ph1,
+ ownr_ph2: item.job.ownr_ph2,
+ production_vars: item.job.production_vars,
+ ro_number: item.job.ro_number,
+ suspended: item.job.suspended,
+ v_make_desc: item.job.v_make_desc,
+ v_model_desc: item.job.v_model_desc,
+ v_model_yr: item.job.v_model_yr,
+ v_vin: item.job.v_vin,
+ vehicleid: item.job.vehicleid,
+ note: item.note,
+ start: item.start,
+ title: item.title,
+ };
+ appt.push(i);
+ }
+ });
+ appt.sort(function (a, b) {
+ return new moment(a.start) - new moment(b.start);
+ });
- return (
- dateSort(a.start, b.start),
+ sortOrder:
+ state.sortedInfo.columnKey === "start" && state.sortedInfo.order,
+ render: (text, record) => (
+
+ {record.start}
+
+ ),
+ },
+ {
+ title: t("jobs.fields.ro_number"),
+ dataIndex: "ro_number",
+ key: "ro_number",
+ sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
+ sortOrder:
+ state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
+ render: (text, record) => (
+ e.stopPropagation()}
>
-
-
- );
+
+
+ {record.ro_number || t("general.labels.na")}
+ {record.production_vars && record.production_vars.alert ? (
+
+ ) : null}
+ {record.suspended && (
+
+ )}
+ {record.iouparent && (
+
+
+
+ )}
+
+
+
+ ),
+ },
+ {
+ title: t("jobs.fields.owner"),
+ dataIndex: "owner",
+ key: "owner",
+ ellipsis: true,
+ sorter: (a, b) =>
+ alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
+ sortOrder:
+ state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
+ render: (text, record) => {
+ return record.ownerid ? (
+ e.stopPropagation()}
+ >
+
+
+
+
+ ) : (
+
+
+
+ );
+ },
+ },
+ {
+ title: t("jobs.fields.vehicle"),
+ dataIndex: "vehicle",
+ key: "vehicle",
+ ellipsis: true,
+ sorter: (a, b) =>
+ alphaSort(
+ `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${
+ a.v_model_desc || ""
+ }`,
+ `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
+ ),
+ sortOrder:
+ state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
+ render: (text, record) => {
+ return record.vehicleid ? (
+ e.stopPropagation()}
+ >
+
+ {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
+ record.v_model_desc || ""
+ }`}
+
+
+ ) : (
+ {`${
+ record.v_model_yr || ""
+ } ${record.v_make_desc || ""} ${record.v_model_desc || ""}`}
+ );
+ },
+ },
+ {
+ title: t("appointments.fields.alt_transport"),
+ dataIndex: "alt_transport",
+ key: "alt_transport",
+ ellipsis: true,
+ sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
+ sortOrder:
+ state.sortedInfo.columnKey === "alt_transport" &&
+ state.sortedInfo.order,
+ filters:
+ (appt &&
+ appt
+ .map((j) => j.alt_transport)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Alt. Transport",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],
+ onFilter: (value, record) => value.includes(record.alt_transport),
+ render: (text, record) => (
+
+ {record.alt_transport}
+
+ ),
+ },
+ {
+ title: t("jobs.fields.lab"),
+ dataIndex: "joblines_body",
+ key: "joblines_body",
+ sorter: (a, b) => a.joblines_body - b.joblines_body,
+ sortOrder:
+ state.sortedInfo.columnKey === "joblines_body" &&
+ state.sortedInfo.order,
+ align: "right",
+ render: (text, record) => (
+
+ {record.joblines_body.toFixed(1)}
+
+ ),
+ },
+ {
+ title: t("jobs.fields.lar"),
+ dataIndex: "joblines_ref",
+ key: "joblines_ref",
+ sorter: (a, b) => a.joblines_ref - b.joblines_ref,
+ sortOrder:
+ state.sortedInfo.columnKey === "joblines_ref" && state.sortedInfo.order,
+ align: "right",
+ render: (text, record) => (
+
+ {record.joblines_ref.toFixed(1)}
+
+ ),
+ },
+ ];
+
+ const columns = [
+ {
+ title: t("appointments.fields.time"),
+ dataIndex: "start",
+ key: "start",
+ ellipsis: true,
+ sorter: (a, b) => dateSort(a.start, b.start),
+ sortOrder:
+ state.sortedInfo.columnKey === "start" && state.sortedInfo.order,
+ render: (text, record) => {record.start},
+ },
+ {
+ title: t("jobs.fields.ro_number"),
+ dataIndex: "ro_number",
+ key: "ro_number",
+ sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
+ sortOrder:
+ state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
+ render: (text, record) => (
+ e.stopPropagation()}
+ >
+
+ {record.ro_number || t("general.labels.na")}
+ {record.production_vars && record.production_vars.alert ? (
+
+ ) : null}
+ {record.suspended && (
+
+ )}
+ {record.iouparent && (
+
+
+
+ )}
+
+
+ ),
+ },
+ {
+ title: t("jobs.fields.owner"),
+ dataIndex: "owner",
+ key: "owner",
+ ellipsis: true,
+ sorter: (a, b) =>
+ alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
+ sortOrder:
+ state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
+ render: (text, record) => {
+ return record.ownerid ? (
+ e.stopPropagation()}
+ >
+
+
+ ) : (
+
+
+
+ );
+ },
+ },
+ {
+ title: t("dashboard.labels.phone"),
+ dataIndex: "ownr_ph",
+ key: "ownr_ph",
+ ellipsis: true,
+ responsive: ["md"],
+ render: (text, record) => (
+
+
+
+
+ ),
+ },
+ {
+ title: t("jobs.fields.ownr_ea"),
+ dataIndex: "ownr_ea",
+ key: "ownr_ea",
+ ellipsis: true,
+ responsive: ["md"],
+ render: (text, record) => (
+ {record.ownr_ea}
+ ),
+ },
+ {
+ title: t("jobs.fields.vehicle"),
+ dataIndex: "vehicle",
+ key: "vehicle",
+ ellipsis: true,
+ sorter: (a, b) =>
+ alphaSort(
+ `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${
+ a.v_model_desc || ""
+ }`,
+ `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
+ ),
+ sortOrder:
+ state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
+ render: (text, record) => {
+ return record.vehicleid ? (
+ e.stopPropagation()}
+ >
+ {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
+ record.v_model_desc || ""
+ }`}
+
+ ) : (
+ {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
+ record.v_model_desc || ""
+ }`}
+ );
+ },
+ },
+ {
+ title: t("jobs.fields.ins_co_nm"),
+ dataIndex: "ins_co_nm",
+ key: "ins_co_nm",
+ ellipsis: true,
+ responsive: ["md"],
+ sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm),
+ sortOrder:
+ state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
+ filters:
+ (appt &&
+ appt
+ .map((j) => j.ins_co_nm)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Ins. Co.*",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],
+ onFilter: (value, record) => value.includes(record.ins_co_nm),
+ },
+ {
+ title: t("appointments.fields.alt_transport"),
+ dataIndex: "alt_transport",
+ key: "alt_transport",
+ ellipsis: true,
+ sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
+ sortOrder:
+ state.sortedInfo.columnKey === "alt_transport" &&
+ state.sortedInfo.order,
+ filters:
+ (appt &&
+ appt
+ .map((j) => j.alt_transport)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Alt. Transport",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],
+ onFilter: (value, record) => value.includes(record.alt_transport),
+ },
+ ];
+
+ const handleTableChange = (pagination, filters, sorter) => {
+ setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
+ };
+ return (
+
+ {t("general.labels.tvmode")}
+ setIsTvModeScheduledIn(!isTvModeScheduledIn)}
+ defaultChecked={isTvModeScheduledIn}
+ />
+
+ }
+ {...cardProps}
+ >
+
+
+ );
}
export const DashboardScheduledInTodayGql = `
- scheduled_in_today: appointments(where: {start: {_gte: "${dayjs()
+ scheduled_in_today: appointments(where: {start: {_gte: "${moment()
.startOf("day")
- .toISOString()}", _lte: "${dayjs()
- .endOf("day")
- .toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) {
+ .toISOString()}", _lte: "${moment()
+ .endOf("day")
+ .toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) {
canceled
id
job {
alt_transport
clm_no
jobid: id
+ joblines(where: {removed: {_eq: false}}) {
+ mod_lb_hrs
+ mod_lbr_ty
+ }
ins_co_nm
iouparent
ownerid
diff --git a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx
index 4d155d12a..1639c8fe9 100644
--- a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx
+++ b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx
@@ -1,37 +1,273 @@
import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined,} from "@ant-design/icons";
-import {Card, Space, Table, Tooltip} from "antd";
+import {Card, Space, Switch, Table, Tooltip, Typography} from "antd";
import dayjs from "../../../utils/day";
import React, {useState} from "react";
import {useTranslation} from "react-i18next";
import {Link} from "react-router-dom";
+import {TimeFormatter} from "../../../utils/DateFormatter";
+import {onlyUnique} from "../../../utils/arrayHelper";
+import {alphaSort, dateSort} from "../../../utils/sorters";
+import useLocalStorage from "../../../utils/useLocalStorage";
import ChatOpenButton from "../../chat-open-button/chat-open-button.component";
-import OwnerNameDisplay from "../../owner-name-display/owner-name-display.component";
+import OwnerNameDisplay, {OwnerNameDisplayFunction,} from "../../owner-name-display/owner-name-display.component";
import DashboardRefreshRequired from "../refresh-required.component";
-import {pageLimit} from "../../../utils/config";
export default function DashboardScheduledOutToday({data, ...cardProps}) {
const {t} = useTranslation();
const [state, setState] = useState({
sortedInfo: {},
- });
+ filteredInfo: {},});
+ const [isTvModeScheduledOut, setIsTvModeScheduledOut] = useLocalStorage(
+ "isTvModeScheduledOut",
+ false
+ );
if (!data) return null;
if (!data.scheduled_out_today)
return ;
- const filteredScheduledOutToday = data.scheduled_out_today.map((item) => {
+ const scheduledOutToday = data.scheduled_out_today.map((item) => {
+ const joblines_body = item.joblines
+ ? item.joblines
+ .filter((l) => l.mod_lbr_ty !== "LAR")
+ .reduce((acc, val) => acc + val.mod_lb_hrs, 0)
+ : 0;
+ const joblines_ref = item.joblines
+ ? item.joblines
+ .filter((l) => l.mod_lbr_ty === "LAR")
+ .reduce((acc, val) => acc + val.mod_lb_hrs, 0)
+ : 0;
return {
...item,
- scheduled_completion: dayjs(item.scheduled_completion).format("hh:mm a"),
- timestamp: dayjs(item.scheduled_completion).valueOf(),
- }
- }).sort((a, b) => a.timestamp - b.timestamp);
+ joblines_body,
+ joblines_ref,
+ };
+ });
- const columns = [
+ console.log('Scheduled Out Today')
+ console.dir(scheduledOutToday);
+
+ const tvFontSize = 18;
+ const tvFontWeight = "bold";
+
+ const tvColumns = [
+ {
+ title: t("jobs.fields.scheduled_completion"),
+ dataIndex: "scheduled_completion",
+ key: "scheduled_completion",
+ ellipsis: true,
+ sorter: (a, b) =>
+ dateSort(a.scheduled_completion, b.scheduled_completion),
+ sortOrder:
+ state.sortedInfo.columnKey === "scheduled_completion" &&
+ state.sortedInfo.order,
+ render: (text, record) => (
+
+ {record.scheduled_completion}
+
+ ),
+ },
{
title: t("jobs.fields.ro_number"),
dataIndex: "ro_number",
key: "ro_number",
+ sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
+ sortOrder:
+ state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
render: (text, record) => (
+ e.stopPropagation()}
+ >
+
+
+ {record.ro_number || t("general.labels.na")}
+ {record.production_vars && record.production_vars.alert ? (
+
+ ) : null}
+ {record.suspended && (
+
+ )}
+ {record.iouparent && (
+
+
+
+ )}
+
+
+
+ ),
+ },
+ {
+ title: t("jobs.fields.owner"),
+ dataIndex: "owner",
+ key: "owner",
+ ellipsis: true,
+ sorter: (a, b) =>
+ alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
+ sortOrder:
+ state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
+ render: (text, record) => {
+ console.log('Render record out today');
+ console.dir(record);
+ return record.ownerid ? (
+ e.stopPropagation()}
+ >
+
+
+
+
+ ) : (
+
+
+
+ );
+ },
+ },
+ {
+ title: t("jobs.fields.vehicle"),
+ dataIndex: "vehicle",
+ key: "vehicle",
+ ellipsis: true,
+ sorter: (a, b) =>
+ alphaSort(
+ `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${
+ a.v_model_desc || ""
+ }`,
+ `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
+ ),
+ sortOrder:
+ state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
+ render: (text, record) => {
+ return record.vehicleid ? (
+ e.stopPropagation()}
+ >
+
+ {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
+ record.v_model_desc || ""
+ }`}
+
+
+ ) : (
+ {`${
+ record.v_model_yr || ""} ${record.v_make_desc || ""} ${
+ record.v_model_desc || ""
+ }`}
+ );
+ },
+ },
+ {
+ title: t("appointments.fields.alt_transport"),
+ dataIndex: "alt_transport",
+ key: "alt_transport",
+ ellipsis: true,
+ sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
+ sortOrder:
+ state.sortedInfo.columnKey === "alt_transport" &&
+ state.sortedInfo.order,
+ filters:
+ (scheduledOutToday &&
+ scheduledOutToday
+ .map((j) => j.alt_transport)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Alt. Transport*",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],onFilter: (value, record) => value.includes(record.alt_transport),
+ render: (text, record) => (
+
+ {record.alt_transport}
+
+ ),
+ },
+ {
+ title: t("jobs.fields.status"),
+ dataIndex: "status",
+ key: "status",
+ ellipsis: true,
+ sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
+ sortOrder:
+ state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
+ filters:
+ (scheduledOutToday &&
+ scheduledOutToday
+ .map((j) => j.status)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Status*",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],
+ onFilter: (value, record) => value.includes(record.status),render: (text, record) => (
+
+ {record.status}
+
+ ),
+ },
+ {
+ title: t("jobs.fields.lab"),
+ dataIndex: "joblines_body",
+ key: "joblines_body",
+ sorter: (a, b) => a.joblines_body - b.joblines_body,
+ sortOrder:
+ state.sortedInfo.columnKey === "joblines_body" &&
+ state.sortedInfo.order,
+ align: "right",
+ render: (text, record) => (
+
+ {record.joblines_body.toFixed(1)}
+
+ ),
+ },
+ {
+ title: t("jobs.fields.lar"),
+ dataIndex: "joblines_ref",
+ key: "joblines_ref",
+ sorter: (a, b) => a.joblines_ref - b.joblines_ref,
+ sortOrder:
+ state.sortedInfo.columnKey === "joblines_ref" && state.sortedInfo.order,
+ align: "right",
+ render: (text, record) => (
+
+ {record.joblines_ref.toFixed(1)}
+
+ ),
+ },
+ ];
+
+ const columns = [
+ {
+ title: t("jobs.fields.scheduled_completion"),
+ dataIndex: "scheduled_completion",
+ key: "scheduled_completion",
+ ellipsis: true,
+ sorter: (a, b) =>
+ dateSort(a.scheduled_completion, b.scheduled_completion),
+ sortOrder:
+ state.sortedInfo.columnKey === "scheduled_completion" &&
+ state.sortedInfo.order,
+ render: (text, record) => (
+ {record.scheduled_completion}
+ ),
+ },
+ {
+ title: t("jobs.fields.ro_number"),
+ dataIndex: "ro_number",
+ key: "ro_number",
+ sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
+ sortOrder:
+ state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, render: (text, record) => (
e.stopPropagation()}
@@ -58,7 +294,10 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
dataIndex: "owner",
key: "owner",
ellipsis: true,
- responsive: ["md"],
+ sorter: (a, b) =>
+ alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
+ sortOrder:
+ state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
render: (text, record) => {
return record.ownerid ? (
(
+ render: (text, record) => (
- ),
- },
- {
- title: t("jobs.fields.ownr_ph2"),
- dataIndex: "ownr_ph2",
- key: "ownr_ph2",
- ellipsis: true,
- responsive: ["md"],
- render: (text, record) => (
+
- ),
+ ),
},
{
title: t("jobs.fields.ownr_ea"),
@@ -101,7 +332,7 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
ellipsis: true,
responsive: ["md"],
render: (text, record) => (
-
+ {record.ownr_ea}
),
},
{
@@ -109,7 +340,15 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
dataIndex: "vehicle",
key: "vehicle",
ellipsis: true,
- render: (text, record) => {
+ sorter: (a, b) =>
+ alphaSort(
+ `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${
+ a.v_model_desc || ""
+ }`,
+ `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
+ ),
+ sortOrder:
+ state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, render: (text, record) => {
return record.vehicleid ? (
alphaSort(a.ins_co_nm, b.ins_co_nm),
+ sortOrder:
+ state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
+ filters:
+ (scheduledOutToday &&
+ scheduledOutToday
+ .map((j) => j.ins_co_nm)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Ins. Co.*",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],
+ onFilter: (value, record) => value.includes(record.ins_co_nm),
},
{
title: t("appointments.fields.alt_transport"),
dataIndex: "alt_transport",
key: "alt_transport",
ellipsis: true,
- responsive: ["md"],
- },
+ sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
+ sortOrder:
+ state.sortedInfo.columnKey === "alt_transport" &&
+ state.sortedInfo.order,
+ filters:
+ (scheduledOutToday &&
+ scheduledOutToday
+ .map((j) => j.alt_transport)
+ .filter(onlyUnique)
+ .map((s) => {
+ return {
+ text: s || "No Alt. Transport*",
+ value: [s],
+ };
+ })
+ .sort((a, b) => alphaSort(a.text, b.text))) ||
+ [],
+ onFilter: (value, record) => value.includes(record.alt_transport),},
];
- const handleTableChange = (sorter) => {
- setState({...state, sortedInfo: sorter});
+ const handleTableChange = (pagination, filters, sorter) => {
+ setState({...state, filteredInfo: filters, sortedInfo: sorter});
};
return (
+ {t("general.labels.tvmode")}
+ setIsTvModeScheduledOut(!isTvModeScheduledOut)}
+ defaultChecked={isTvModeScheduledOut}
+ />
+
+ }{...cardProps}
>
@@ -185,6 +459,10 @@ export const DashboardScheduledOutTodayGql = `
alt_transport
clm_no
jobid: id
+ joblines(where: {removed: {_eq: false}}) {
+ mod_lb_hrs
+ mod_lbr_ty
+ }
ins_co_nm
iouparent
ownerid
@@ -197,6 +475,7 @@ export const DashboardScheduledOutTodayGql = `
production_vars
ro_number
scheduled_completion
+ status
suspended
v_make_desc
v_model_desc
diff --git a/client/src/components/dashboard-grid/dashboard-grid.component.jsx b/client/src/components/dashboard-grid/dashboard-grid.component.jsx
index fbeb7655b..3b21370ca 100644
--- a/client/src/components/dashboard-grid/dashboard-grid.component.jsx
+++ b/client/src/components/dashboard-grid/dashboard-grid.component.jsx
@@ -270,26 +270,22 @@ const componentList = {
h: 2,
},
ScheduleInToday: {
- label: i18next.t("dashboard.titles.scheduledintoday", {
- date: dayjs().startOf("day").format("MM/DD/YYYY"),
- }),
+ label: i18next.t("dashboard.titles.scheduledintoday"),
component: DashboardScheduledInToday,
gqlFragment: DashboardScheduledInTodayGql,
- minW: 10,
+ minW: 6,
minH: 2,
w: 10,
- h: 2,
+ h: 3,
},
ScheduleOutToday: {
- label: i18next.t("dashboard.titles.scheduledouttoday", {
- date: dayjs().startOf("day").format("MM/DD/YYYY"),
- }),
+ label: i18next.t("dashboard.titles.scheduledouttoday"),
component: DashboardScheduledOutToday,
gqlFragment: DashboardScheduledOutTodayGql,
- minW: 10,
+ minW: 6,
minH: 2,
w: 10,
- h: 2,
+ h: 3,
},
};
@@ -301,8 +297,7 @@ const createDashboardQuery = (state) => {
.map((item, index) => componentList[item.i].gqlFragment || "")
.join("");
return gql`
- query QUERY_DASHBOARD_DETAILS {
- ${componentBasedAdditions || ""}
+ query QUERY_DASHBOARD_DETAILS { ${componentBasedAdditions || ""}
monthly_sales: jobs(where: {_and: [
{ voided: {_eq: false}},
{date_invoiced: {_gte: "${dayjs()
@@ -312,7 +307,7 @@ const createDashboardQuery = (state) => {
.endOf("month")
.endOf("day")
.toISOString()}"}}]}) {
- id
+ id
ro_number
date_invoiced
job_totals
@@ -376,6 +371,5 @@ const createDashboardQuery = (state) => {
}
}
}
- }
- `;
+ }`;
};
diff --git a/client/src/components/dashboard-grid/dashboard-grid.styles.scss b/client/src/components/dashboard-grid/dashboard-grid.styles.scss
index ceedfbca9..4bd16a5e3 100644
--- a/client/src/components/dashboard-grid/dashboard-grid.styles.scss
+++ b/client/src/components/dashboard-grid/dashboard-grid.styles.scss
@@ -145,7 +145,7 @@
width: 100%;
.ant-card-body {
- height: 80%;
+ height: calc(100% - 2rem);
width: 100%;
// // background-color: red;
// height: 90%;
diff --git a/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx
index 8fb4b6607..e5a498ca8 100644
--- a/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx
+++ b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx
@@ -36,7 +36,7 @@ const DateTimePicker = (
disabledDate: (d) => dayjs().isAfter(d),
})}
onChange={onChange}
- showSecond={false}
+ disableSeconds={true}
minuteStep={15}
onBlur={onBlur}
format="hh:mm a"
diff --git a/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx b/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx
index 5287c3271..97e4436de 100644
--- a/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx
+++ b/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx
@@ -42,6 +42,7 @@ export default function ScoreboardAddButton({
const handleFinish = async (values) => {
logImEXEvent("job_close_add_to_scoreboard");
+ values.date = dayjs(values.date).format("YYYY-MM-DD");
setLoading(true);
let result;
@@ -169,7 +170,7 @@ export default function ScoreboardAddButton({
return acc + job.lbr_adjustments[val];
}, 0);
form.setFieldsValue({
- date: new dayjs(),
+ date: dayjs(),
bodyhrs: Math.round(v.bodyhrs * 10) / 10,
painthrs: Math.round(v.painthrs * 10) / 10,
});
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 7d6e4c779..ad6fc2c76 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
@@ -1,6 +1,6 @@
import {gql, useApolloClient, useLazyQuery, useMutation, useQuery,} from "@apollo/client";
import {useSplitTreatments} from "@splitsoftware/splitio-react";
-import {Col, notification, Row} from "antd";
+import {Col, Row, notification} from "antd";
import Axios from "axios";
import _ from "lodash";
import dayjs from "../../utils/day";
@@ -21,8 +21,8 @@ import {INSERT_NEW_NOTE} from "../../graphql/notes.queries";
import {SEARCH_VEHICLE_BY_VIN} from "../../graphql/vehicles.queries";
import {insertAuditTrail} from "../../redux/application/application.actions";
import {selectBodyshop, selectCurrentUser,} from "../../redux/user/user.selectors";
-import confirmDialog from "../../utils/asyncConfirm";
import AuditTrailMapping from "../../utils/AuditTrailMappings";
+import confirmDialog from "../../utils/asyncConfirm";
import CriticalPartsScan from "../../utils/criticalPartsScan";
import AlertComponent from "../alert/alert.component";
import JobsAvailableScan from "../jobs-available-scan/jobs-available-scan.component";
@@ -64,7 +64,15 @@ export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail,
const [selectedJob, setSelectedJob] = useState(null);
const [selectedOwner, setSelectedOwner] = useState(null);
- const [partsQueueToggle, setPartsQueueToggle] = useState(bodyshop.md_functionality_toggles.parts_queue_toggle);
+ const [partsQueueToggle, setPartsQueueToggle] = useState(
+ bodyshop.md_functionality_toggles.parts_queue_toggle
+ );
+ const [updateSchComp, setSchComp] = useState({
+ actual_in: dayjs(),
+ checked: false,
+ scheduled_completion: dayjs(),
+ automatic: false,
+ });
const [insertLoading, setInsertLoading] = useState(false);
@@ -202,7 +210,9 @@ export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail,
notification["error"]({
message: t("jobs.errors.creating", {error: r.message}),
});
- refetch();
+ refetch().catch(err => {
+ console.error(`Something went wrong in jobs available table container - ${err.message || ''}`)
+ });
setInsertLoading(false);
setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle);
}
@@ -404,6 +414,8 @@ export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail,
modalSearchState={modalSearchState}
partsQueueToggle={partsQueueToggle}
setPartsQueueToggle={setPartsQueueToggle}
+ updateSchComp={updateSchComp}
+ setSchComp={setSchComp}
/>
{
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 d3125752b..abab27521 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
@@ -119,11 +119,14 @@ export function JobsDetailHeader({job, bodyshop, disabled}) {
{job?.cccontracts?.length > 0 && (
- {job.cccontracts.map((c) => (
+ {job.cccontracts.map((c, index) => (
+
{`${c.agreementnumber} - ${c.courtesycar.fleetnumber} ${c.courtesycar.year} ${c.courtesycar.make} ${c.courtesycar.model}`}
+ >{`${c.agreementnumber} - ${c.courtesycar.fleetnumber} ${c.courtesycar.year} ${c.courtesycar.make} ${c.courtesycar.model}`}{index !== job.cccontracts.length - 1 ? "," : null}
+
+
))}
)}
@@ -132,7 +135,7 @@ export function JobsDetailHeader({job, bodyshop, disabled}) {
-
+
{job.special_coverage_policy && (
diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx
index a52988e1c..dc1527650 100644
--- a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx
+++ b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx
@@ -1,9 +1,11 @@
import {SyncOutlined} from "@ant-design/icons";
-import {Button, Checkbox, Divider, Input, Table} from "antd";
-import React from "react";
+import {Button, Checkbox, Divider, Input, Space, Table} from "antd";
+import dayjs from "../../utils/day";
+import React, {useState} from "react";
import {useTranslation} from "react-i18next";
import {Link} from "react-router-dom";
import PhoneFormatter from "../../utils/PhoneFormatter";
+import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
export default function JobsFindModalComponent({
@@ -16,11 +18,13 @@ export default function JobsFindModalComponent({
jobsListRefetch,
partsQueueToggle,
setPartsQueueToggle,
+ updateSchComp,
+ setSchComp,
}) {
const {t} = useTranslation();
const [modalSearch, setModalSearch] = modalSearchState;
const [importOptions, setImportOptions] = importOptionsState;
-
+ const [checkUTT, setCheckUTT] = useState(false);
const columns = [
{
title: t("jobs.fields.ro_number"),
@@ -142,6 +146,35 @@ export default function JobsFindModalComponent({
if (record) {
if (record.id) {
setSelectedJob(record.id);
+ if (record.actual_in && record.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: record.actual_in,
+ scheduled_completion: record.scheduled_completion,
+ });
+ } else {
+ if (record.actual_in && !record.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: record.actual_in,
+ scheduled_completion: dayjs(),
+ });
+ }
+ if (!record.actual_in && record.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: dayjs(),
+ scheduled_completion: dayjs(record.scheduled_completion),
+ });
+ }
+ if (!record.actual_in && !record.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: dayjs(),
+ scheduled_completion: dayjs(),
+ });
+ }
+ }
return;
}
}
@@ -177,6 +210,35 @@ export default function JobsFindModalComponent({
rowSelection={{
onSelect: (props) => {
setSelectedJob(props.id);
+ if (props.actual_in && props.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: props.actual_in,
+ scheduled_completion: props.scheduled_completion,
+ });
+ } else {
+ if (props.actual_in && !props.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: props.actual_in,
+ scheduled_completion: dayjs(),
+ });
+ }
+ if (!props.actual_in && props.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: dayjs(),
+ scheduled_completion: dayjs(props.scheduled_completion),
+ });
+ }
+ if (!props.actual_in && !props.scheduled_completion) {
+ setSchComp({
+ ...updateSchComp,
+ actual_in: dayjs(),
+ scheduled_completion: dayjs(),
+ });
+ }
+ }
},
type: "radio",
selectedRowKeys: [selectedJob],
@@ -189,7 +251,7 @@ export default function JobsFindModalComponent({
};
}}
/>
-
+
@@ -206,7 +268,40 @@ export default function JobsFindModalComponent({
onChange={(e) => setPartsQueueToggle(e.target.checked)}
>
{t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")}
-
+
+ setSchComp({...updateSchComp, checked: e.target.checked})
+ }
+ >
+ {t("jobs.labels.update_scheduled_completion")}
+
+ {updateSchComp.checked === true ? (
+ <>
+ {checkUTT === false ? (
+ {
+ setSchComp({...updateSchComp, scheduled_completion: e});
+ }}
+ />
+ ) : null}
+ {
+ setCheckUTT(e.target.checked);
+ setSchComp({
+ ...updateSchComp,
+ scheduled_completion: null,
+ automatic: true,
+ });
+ }}
+ >
+ {t("jobs.labels.calc_scheuled_completion")}
+
+ >
+ ) : null}
+
);
}
diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx
index d5857f1d4..0abe7904c 100644
--- a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx
+++ b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx
@@ -27,7 +27,8 @@ export default connect(
modalSearchState,
partsQueueToggle,
setPartsQueueToggle,
- ...modalProps
+ updateSchComp,
+ setSchComp, ...modalProps
}) {
const {t} = useTranslation();
@@ -95,7 +96,8 @@ export default connect(
modalSearchState={modalSearchState}
partsQueueToggle={partsQueueToggle}
setPartsQueueToggle={setPartsQueueToggle}
- />
+ updateSchComp={updateSchComp}
+ setSchComp={setSchComp}/>
);
});
diff --git a/client/src/components/report-center-modal/report-center-modal-filters-sorters-component.jsx b/client/src/components/report-center-modal/report-center-modal-filters-sorters-component.jsx
new file mode 100644
index 000000000..1fc7a4700
--- /dev/null
+++ b/client/src/components/report-center-modal/report-center-modal-filters-sorters-component.jsx
@@ -0,0 +1,373 @@
+import {Button, Card, Checkbox, Col, Form, Input, InputNumber, Row, Select} from "antd";
+import React, {useCallback, useEffect, useMemo, useState} from "react";
+import {fetchFilterData} from "../../utils/RenderTemplate";
+import {DeleteFilled} from "@ant-design/icons";
+import {useTranslation} from "react-i18next";
+import {getOrderOperatorsByType, getWhereOperatorsByType} from "../../utils/graphQLmodifier";
+import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component";
+import {generateInternalReflections} from "./report-center-modal-utils";
+
+
+export default function ReportCenterModalFiltersSortersComponent({form, bodyshop}) {
+ return (
+
+ {() => {
+ const key = form.getFieldValue("key");
+ return ;
+ }}
+
+ );
+}
+
+/**
+ * Filters Section
+ * @param filters
+ * @param form
+ * @param bodyshop
+ * @returns {JSX.Element}
+ * @constructor
+ */
+function FiltersSection({filters, form, bodyshop}) {
+ const {t} = useTranslation();
+
+ return (
+
+
+ {(fields, {add, remove, move}) => {
+ return (
+
+ {fields.map((field, index) => (
+
+
+
+
+
+
+
+
+ {
+ () => {
+ const name = form.getFieldValue(['filters', field.name, "field"]);
+ const type = filters.find(f => f.name === name)?.type;
+
+ return
+
+ }
+ }
+
+
+
+
+ {
+ () => {
+ const name = form.getFieldValue(['filters', field.name, "field"]);
+ const type = filters.find(f => f.name === name)?.type;
+ const reflector = filters.find(f => f.name === name)?.reflector;
+
+ return
+ {
+ (() => {
+ const generateReflections = (reflector) => {
+ if (!reflector) return [];
+
+ const {name} = reflector;
+ const path = name?.split('.');
+ const upperPath = path?.[0];
+ const finalPath = path?.slice(1).join('.');
+
+ return generateInternalReflections({
+ bodyshop,
+ upperPath,
+ finalPath
+ });
+ };
+
+ const reflections = reflector ? generateReflections(reflector) : [];
+ const fieldPath = [[field.name, "value"]];
+
+ if (reflections.length > 0) {
+ return (
+
+ }
+ }
+
+
+
+
+ {
+ remove(field.name);
+ }}
+ />
+
+
+
+ ))}
+
+
+
+
+ );
+ }}
+
+
+ );
+}
+
+/**
+ * Sorters Section
+ * @param sorters
+ * @param form
+ * @returns {JSX.Element}
+ * @constructor
+ */
+function SortersSection({sorters, form}) {
+ const {t} = useTranslation();
+ return (
+
+
+ {(fields, {add, remove, move}) => {
+ return (
+
+ Sorters
+ {fields.map((field, index) => (
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ remove(field.name);
+ }}
+ />
+
+
+
+ ))}
+
+
+
+
+ );
+ }}
+
+
+ );
+}
+
+/**
+ * Render Filters
+ * @param templateId
+ * @param form
+ * @param bodyshop
+ * @returns {JSX.Element|null}
+ * @constructor
+ */
+function RenderFilters({templateId, form, bodyshop}) {
+ const [state, setState] = useState(null);
+ const [visible, setVisible] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
+ const {t} = useTranslation();
+
+ const fetch = useCallback(async () => {
+ // Reset all the filters and Sorters.
+ form.resetFields(['filters']);
+ form.resetFields(['sorters']);
+ form.resetFields(['defaultSorters']);
+
+ setIsLoading(true);
+
+ const data = await fetchFilterData({name: templateId});
+
+ // We have Success
+ if (data?.success) {
+ if (data?.data?.sorters && data?.data?.sorters.length > 0) {
+ const defaultSorters = data?.data?.sorters.filter((sorter) => sorter.hasOwnProperty('default')).map((sorter) => {
+ return {
+ field: sorter.name,
+ direction: sorter.default.direction
+ };
+ }).sort((a, b) => a.default.order - b.default.order);
+
+ form.setFieldValue('defaultSorters', JSON.stringify(defaultSorters));
+ }
+ // Set the state
+ setState(data.data);
+ }
+ // Something went wrong fetching filter data
+ else {
+ setState(null);
+ }
+ setIsLoading(false);
+ }, [templateId, form]);
+
+ useEffect(() => {
+ if (templateId) {
+ fetch();
+
+ }
+ }, [templateId, fetch]);
+
+ const filters = useMemo(() => state?.filters || [], [state]);
+ const sorters = useMemo(() => state?.sorters || [], [state]);
+
+ if (!templateId) return null;
+ if (isLoading) return ;
+ if (!state) return null;
+
+ return (
+
+
setVisible(e.target.checked)}
+ children={t('reportcenter.labels.advanced_filters')}
+ />
+ {visible && (
+
+ {filters.length > 0 && (
+
+ )}
+ {sorters.length > 0 && (
+
+ )}
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/client/src/components/report-center-modal/report-center-modal-utils.js b/client/src/components/report-center-modal/report-center-modal-utils.js
new file mode 100644
index 000000000..2f9fc5e87
--- /dev/null
+++ b/client/src/components/report-center-modal/report-center-modal-utils.js
@@ -0,0 +1,121 @@
+import {uniqBy} from "lodash";
+
+/**
+ * Get value from path
+ * @param obj
+ * @param path
+ * @returns {*}
+ */
+const getValueFromPath = (obj, path) => path.split('.').reduce((prev, curr) => prev?.[curr], obj);
+
+/**
+ * Valid internal reflections
+ * Note: This is intended for future functionality
+ * @type {{special: string[], bodyshop: [{name: string, type: string}]}}
+ */
+const VALID_INTERNAL_REFLECTIONS = {
+ bodyshop: [
+ {
+ name: 'md_ro_statuses.statuses',
+ type: 'kv-to-v'
+ }
+ ],
+};
+
+/**
+ * Generate options
+ * @param bodyshop
+ * @param path
+ * @param labelPath
+ * @param valuePath
+ * @returns {{label: *, value: *}[]}
+ */
+const generateOptionsFromObject = (bodyshop, path, labelPath, valuePath) => {
+ const options = getValueFromPath(bodyshop, path);
+ return uniqBy(Object.values(options).map((value) => ({
+ label: value[labelPath],
+ value: value[valuePath],
+ })), 'value');
+}
+
+/**
+ * Generate special reflections
+ * @param bodyshop
+ * @param finalPath
+ * @returns {{label: *, value: *}[]|{label: *, value: *}[]|{label: string, value: *}[]|*[]}
+ */
+const generateSpecialReflections = (bodyshop, finalPath) => {
+ switch (finalPath) {
+ case 'cost_centers':
+ return generateOptionsFromObject(bodyshop, 'md_responsibility_centers.costs', 'name', 'name');
+ // Special case because Categories is an Array, not an Object.
+ case 'categories':
+ const catOptions = getValueFromPath(bodyshop, 'md_categories');
+ return uniqBy(catOptions.map((value) => ({
+ label: value,
+ value: value,
+ })), 'value');
+ case 'insurance_companies':
+ return generateOptionsFromObject(bodyshop, 'md_ins_cos', 'name', 'name');
+ case 'employee_teams':
+ return generateOptionsFromObject(bodyshop, 'employee_teams', 'name', 'id');
+ // Special case because Employees uses a concatenation of first_name and last_name
+ case 'employees':
+ const employeesOptions = getValueFromPath(bodyshop, 'employees');
+ return uniqBy(Object.values(employeesOptions).map((value) => ({
+ label: `${value.first_name} ${value.last_name}`,
+ value: value.id,
+ })), 'value');
+ case 'last_names':
+ return generateOptionsFromObject(bodyshop, 'employees', 'last_name', 'last_name');
+ case 'first_names':
+ return generateOptionsFromObject(bodyshop, 'employees', 'first_name', 'first_name');
+ case 'job_statuses':
+ const statusOptions = getValueFromPath(bodyshop, 'md_ro_statuses.statuses');
+ return Object.values(statusOptions).map((value) => ({
+ label: value,
+ value
+ }));
+ default:
+ console.error('Invalid Special reflection provided by Report Filters');
+ return [];
+ }
+}
+
+/**
+ * Generate bodyshop reflections
+ * @param bodyshop
+ * @param finalPath
+ * @returns {{label: *, value: *}[]|*[]}
+ */
+const generateBodyshopReflections = (bodyshop, finalPath) => {
+ const options = getValueFromPath(bodyshop, finalPath);
+ const reflectionRenderer = VALID_INTERNAL_REFLECTIONS.bodyshop.find(reflection => reflection.name === finalPath);
+ if (reflectionRenderer?.type === 'kv-to-v') {
+ return Object.values(options).map((value) => ({
+ label: value,
+ value
+ }));
+ }
+ return [];
+}
+
+/**
+ * Generate internal reflections based on the path and bodyshop
+ * @param bodyshop
+ * @param upperPath
+ * @param finalPath
+ * @returns {{label: *, value: *}[]|[]|{label: *, value: *}[]|{label: string, value: *}[]|{label: *, value: *}[]|*[]}
+ */
+const generateInternalReflections = ({bodyshop, upperPath, finalPath}) => {
+ switch (upperPath) {
+ case 'special':
+ return generateSpecialReflections(bodyshop, finalPath);
+ case 'bodyshop':
+ return generateBodyshopReflections(bodyshop, finalPath);
+ default:
+ return [];
+ }
+};
+
+export {generateInternalReflections,}
\ No newline at end of file
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 5140efdf5..85a2b5438 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
@@ -11,12 +11,13 @@ import {QUERY_ACTIVE_EMPLOYEES} from "../../graphql/employees.queries";
import {QUERY_ALL_VENDORS} from "../../graphql/vendors.queries";
import {selectReportCenter} from "../../redux/modals/modals.selectors";
import {selectBodyshop} from "../../redux/user/user.selectors";
-import DatePIckerRanges from "../../utils/DatePickerRanges";
+import DatePickerRanges from "../../utils/DatePickerRanges";
import {GenerateDocument} from "../../utils/RenderTemplate";
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";
+import ReportCenterModalFiltersSortersComponent from "./report-center-modal-filters-sorters-component";
const mapStateToProps = createStructuredSelector({
reportCenterModal: selectReportCenter,
@@ -89,7 +90,7 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
const end = values.dates ? values.dates[1] : null;
const {id} = values;
- await GenerateDocument(
+ const templateConfig =
{
name: values.key,
variables: {
@@ -104,7 +105,16 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
...(id ? {id: id} : {}),
},
- },
+ filters: values.filters,
+ sorters: values.sorters,
+ };
+
+ if (_.isString(values.defaultSorters) && !_.isEmpty(values.defaultSorters)) {
+ templateConfig.defaultSorters = JSON.parse(values.defaultSorters);
+ }
+
+ await GenerateDocument(
+ templateConfig,
{
to: values.to,
subject: Templates[values.key]?.subject,
@@ -142,6 +152,7 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
onChange={(e) => setSearch(e.target.value)}
value={search}
/>
+
{t(`reportcenter.labels.groups.${key}`)}
-
+
{grouped[key].map((item) => (
-
@@ -206,6 +217,7 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
);
}}
+
{() => {
const key = form.getFieldValue("key");
@@ -274,7 +286,7 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
>
);
@@ -330,3 +342,4 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
);
}
+
diff --git a/client/src/components/schedule-calendar/schedule-calendar.container.jsx b/client/src/components/schedule-calendar/schedule-calendar.container.jsx
index f0d0cfc6e..979f5f25c 100644
--- a/client/src/components/schedule-calendar/schedule-calendar.container.jsx
+++ b/client/src/components/schedule-calendar/schedule-calendar.container.jsx
@@ -48,7 +48,7 @@ export function ScheduleCalendarContainer({calculateScheduleLoad}) {
if (error) return ;
let normalizedData = [
...data.appointments.map((e) => {
- //Required becuase Hasura returns a string instead of a date object.
+ //Required because Hasura returns a string instead of a date object.
return Object.assign(
{},
e,
@@ -57,7 +57,7 @@ export function ScheduleCalendarContainer({calculateScheduleLoad}) {
);
}),
...data.employee_vacation.map((e) => {
- //Required becuase Hasura returns a string instead of a date object.
+ //Required because Hasura returns a string instead of a date object.
return {
...e,
title: `${
diff --git a/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx b/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx
index 1d20ea88d..a26beadd6 100644
--- a/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx
+++ b/client/src/components/scoreboard-entry-edit/scoreboard-entry-edit.component.jsx
@@ -1,5 +1,6 @@
import {useMutation} from "@apollo/client";
-import {Button, Card, Dropdown, Form, InputNumber, notification} from "antd";
+import {Button, Card, Dropdown, Form, InputNumber, notification, Space,} from "antd";
+import dayjs from "../../utils/day";
import React, {useState} from "react";
import {useTranslation} from "react-i18next";
import {UPDATE_SCOREBOARD_ENTRY} from "../../graphql/scoreboard.queries";
@@ -13,6 +14,7 @@ export default function ScoreboardEntryEdit({entry}) {
const handleFinish = async (values) => {
setLoading(true);
+ values.date = dayjs(values.date).format("YYYY-MM-DD");
const result = await updateScoreboardentry({
variables: {sbId: entry.id, sbInput: values},
});
@@ -82,13 +84,14 @@ export default function ScoreboardEntryEdit({entry}) {
>
-
+
+
)
diff --git a/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx b/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx
index 7799a5473..fa00ace09 100644
--- a/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx
+++ b/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx
@@ -1,3 +1,4 @@
+import {SyncOutlined} from "@ant-design/icons";
import {useQuery} from "@apollo/client";
import {Button, Card, Input, Modal, Space, Table, Typography} from "antd";
import React, {useState} from "react";
@@ -5,12 +6,13 @@ import {useTranslation} from "react-i18next";
import {Link} from "react-router-dom";
import {QUERY_SCOREBOARD_PAGINATED} from "../../graphql/scoreboard.queries";
import {DateFormatter} from "../../utils/DateFormatter";
+import {pageLimit} from "../../utils/config";
+import {alphaSort, dateSort} from "../../utils/sorters";
import AlertComponent from "../alert/alert.component";
-import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
+import OwnerNameDisplay, {OwnerNameDisplayFunction,} from "../owner-name-display/owner-name-display.component";
import ScoreboardEntryEdit from "../scoreboard-entry-edit/scoreboard-entry-edit.component";
import ScoreboardRemoveButton from "../scoreboard-remove-button/scorebard-remove-button.component";
-import {SyncOutlined} from "@ant-design/icons";
-import {pageLimit} from "../../utils/config";
+
export default function ScoreboardJobsList({scoreBoardlist}) {
const {t} = useTranslation();
@@ -45,7 +47,7 @@ export default function ScoreboardJobsList({scoreBoardlist}) {
title: t("jobs.fields.ro_number"),
dataIndex: "ro_number",
key: "ro_number",
- render: (text, record) => (
+ sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), render: (text, record) => (
{record.job.ro_number || t("general.labels.na")}
@@ -55,8 +57,11 @@ export default function ScoreboardJobsList({scoreBoardlist}) {
title: t("jobs.fields.owner"),
dataIndex: "owner",
key: "owner",
- ellipsis: true,
-
+ ellipsis: true, sorter: (a, b) =>
+ alphaSort(
+ OwnerNameDisplayFunction(a.job),
+ OwnerNameDisplayFunction(b.job)
+ ),
render: (text, record) => ,
},
{
@@ -64,7 +69,15 @@ export default function ScoreboardJobsList({scoreBoardlist}) {
dataIndex: "vehicle",
key: "vehicle",
ellipsis: true,
- render: (text, record) => (
+ sorter: (a, b) =>
+ alphaSort(
+ `${a.job.v_model_yr || ""} ${a.job.v_make_desc || ""} ${
+ a.job.v_model_desc || ""
+ }`,
+ `${b.job.v_model_yr || ""} ${b.job.v_make_desc || ""} ${
+ b.job.v_model_desc || ""
+ }`
+ ), render: (text, record) => (
{`${record.job.v_model_yr || ""} ${
record.job.v_make_desc || ""
} ${record.job.v_model_desc || ""}`}
@@ -74,17 +87,20 @@ export default function ScoreboardJobsList({scoreBoardlist}) {
title: t("scoreboard.fields.date"),
dataIndex: "date",
key: "date",
+ sorter: (a, b) => dateSort(a.date, b.date),
render: (text, record) => {record.date},
},
- {
- title: t("scoreboard.fields.painthrs"),
- dataIndex: "painthrs",
- key: "painthrs",
- },
{
title: t("scoreboard.fields.bodyhrs"),
dataIndex: "bodyhrs",
key: "bodyhrs",
+ sorter: (a, b) => Number(a.bodyhrs) - Number(b.bodyhrs),
+ },
+ {
+ title: t("scoreboard.fields.painthrs"),
+ dataIndex: "painthrs",
+ key: "painthrs",
+ sorter: (a, b) => Number(a.painthrs) - Number(b.painthrs),
},
{
title: t("general.labels.actions"),
@@ -105,11 +121,9 @@ export default function ScoreboardJobsList({scoreBoardlist}) {
open={state.open}
destroyOnClose
width="80%"
+ closable={false}
cancelButtonProps={{style: {display: "none"}}}
- onOk={() => {
- setState((state) => ({...state, open: false}));
- }}
- onCancel={() =>
+ onOk={() =>
setState((state) => ({
...state,
open: false,
@@ -161,9 +175,7 @@ export default function ScoreboardJobsList({scoreBoardlist}) {
diff --git a/client/src/components/shop-info/shop-info.scheduling.component.jsx b/client/src/components/shop-info/shop-info.scheduling.component.jsx
index 46f6d2336..04bd5de6d 100644
--- a/client/src/components/shop-info/shop-info.scheduling.component.jsx
+++ b/client/src/components/shop-info/shop-info.scheduling.component.jsx
@@ -35,7 +35,7 @@ export default function ShopInfoSchedulingComponent({form}) {
},
]}
>
-
+
-
+
{
await RenderTemplates(templates, bodyshop);
};
+export const fetchFilterData = async ({name}) => {
+ try {
+ const bodyshop = store.getState().user.bodyshop;
+ const jsrAuth = (await axios.post("/utils/jsr")).data;
+ jsreport.headers["FirebaseAuthorization"] =
+ "Bearer " + (await auth.currentUser.getIdToken());
+
+ const folders = await cleanAxios.get(`${server}/odata/folders`, {
+ headers: {Authorization: jsrAuth},
+ });
+ const shopSpecificFolder = folders.data.value.find(
+ (f) => f.name === bodyshop.imexshopid
+ );
+
+ const jsReportFilters = await cleanAxios.get(
+ `${server}/odata/assets?$filter=name eq '${name}.filters'`,
+ {headers: {Authorization: jsrAuth}}
+ );
+ console.log("🚀 ~ fetchFilterData ~ jsReportFilters:", jsReportFilters);
+
+ let parsedFilterData;
+ let useShopSpecificTemplate = false;
+ // let shopSpecificTemplate;
+
+ if (shopSpecificFolder) {
+ let shopSpecificTemplate = jsReportFilters.data.value.find(
+ (f) => f?.folder?.shortid === shopSpecificFolder.shortid
+ );
+ if (shopSpecificTemplate) {
+ useShopSpecificTemplate = true;
+ parsedFilterData = atob(shopSpecificTemplate.content);
+ }
+ }
+
+ if (!parsedFilterData) {
+ const generalTemplate = jsReportFilters.data.value.find((f) => !f.folder);
+ useShopSpecificTemplate = false;
+ if (generalTemplate) parsedFilterData = atob(generalTemplate.content);
+ }
+ const data = JSON.parse(parsedFilterData);
+ return {
+ data,
+ useShopSpecificTemplate,
+ success: true,
+ }
+ } catch {
+ return {
+ success: false,
+ }
+ }
+};
+
const fetchContextData = async (templateObject, jsrAuth) => {
const bodyshop = store.getState().user.bodyshop;
@@ -344,7 +400,19 @@ const fetchContextData = async (templateObject, jsrAuth) => {
templateQueryToExecute = atob(generalTemplate.content);
}
- let contextData = {};
+ // Commented out for future revision debugging
+ // console.log('Template Object');
+ // console.dir(templateObject);
+ // console.log('Unmodified Query');
+ // console.dir(templateQueryToExecute);
+
+ const hasFilters = templateObject?.filters?.length > 0;
+ const hasSorters = templateObject?.sorters?.length > 0;
+ const hasDefaultSorters = templateObject?.defaultSorters?.length > 0;
+
+ // We have no template filters or sorters, so we can just execute the query and return the data
+ if (!hasFilters && !hasSorters && !hasDefaultSorters) {
+ let contextData = {};
if (templateQueryToExecute) {
const {data} = await client.query({
query: gql(templateQueryToExecute),
@@ -352,8 +420,14 @@ const fetchContextData = async (templateObject, jsrAuth) => {
});
contextData = data;
}
+ return {contextData, useShopSpecificTemplate};
+ }
- return {contextData, useShopSpecificTemplate};
+ return await generateTemplate(
+ templateQueryToExecute,
+ templateObject,
+ useShopSpecificTemplate
+ );
};
//export const displayTemplateInWindow = (html) => {
@@ -406,4 +480,4 @@ function extend(o1, o2, o3) {
}
}
return result;
-}
+}
\ No newline at end of file
diff --git a/client/src/utils/graphQLmodifier.js b/client/src/utils/graphQLmodifier.js
new file mode 100644
index 000000000..77aa14036
--- /dev/null
+++ b/client/src/utils/graphQLmodifier.js
@@ -0,0 +1,373 @@
+import {Kind, parse, print, visit} from "graphql";
+import client from "./GraphQLClient";
+import {gql} from "@apollo/client";
+
+const STRING_OPERATORS = [
+ {value: "_eq", label: "equals"},
+ {value: "_neq", label: "does not equal"},
+ {value: "_like", label: "contains"},
+ {value: "_nlike", label: "does not contain"},
+ {value: "_ilike", label: "contains case-insensitive"},
+ {value: "_nilike", label: "does not contain case-insensitive"}
+];
+const NUMBER_OPERATORS = [
+ {value: "_eq", label: "equals"},
+ {value: "_neq", label: "does not equal"},
+ {value: "_gt", label: "greater than"},
+ {value: "_lt", label: "less than"},
+ {value: "_gte", label: "greater than or equal"},
+ {value: "_lte", label: "less than or equal"}
+];
+const ORDER_BY_OPERATORS = [
+ {value: "asc", label: "ascending"},
+ {value: "desc", label: "descending"}
+];
+
+/**
+ * Get the available operators for filtering
+ * @returns {[{label: string, value: string},{label: string, value: string}]}
+ */
+export function getOrderOperatorsByType() {
+ return ORDER_BY_OPERATORS;
+}
+
+
+/**
+ * Get the available operators for filtering
+ * @param type
+ * @returns {[{label: string, value: string},{label: string, value: string},{label: string, value: string},{label: string, value: string},{label: string, value: string},null]}
+ */
+export function getWhereOperatorsByType(type = 'string') {
+ const operators = {
+ string: STRING_OPERATORS,
+ number: NUMBER_OPERATORS
+ };
+ return operators[type];
+}
+
+/* eslint-disable no-loop-func */
+
+/**
+ * Parse a GraphQL query into an AST
+ * @param query
+ * @returns {DocumentNode}
+ */
+export function parseQuery(query) {
+ return parse(query);
+}
+
+/**
+ * Print an AST back into a GraphQL query
+ * @param query
+ * @returns {string}
+ */
+export function printQuery(query) {
+ return print(query);
+}
+
+/**
+ * Generate a template based on the query and object
+ * @param templateQueryToExecute
+ * @param templateObject
+ * @param useShopSpecificTemplate
+ * @returns {Promise<{contextData: {}, useShopSpecificTemplate}>}
+ */
+export async function generateTemplate(templateQueryToExecute, templateObject, useShopSpecificTemplate) {
+ // Advanced Filtering and Sorting modifications start here
+
+ // Parse the query and apply the filters and sorters
+ const ast = parseQuery(templateQueryToExecute);
+
+ let filterFields = [];
+
+ if (templateObject?.filters && templateObject?.filters?.length) {
+ applyFilters(ast, templateObject.filters, filterFields);
+ wrapFiltersInAnd(ast, filterFields);
+ }
+
+ if (templateObject?.sorters && templateObject?.sorters?.length) {
+ applySorters(ast, templateObject.sorters);
+ } else if (templateObject?.defaultSorters && templateObject?.defaultSorters?.length) {
+ applySorters(ast, templateObject.defaultSorters);
+ }
+
+ const finalQuery = printQuery(ast);
+
+ // commented out for future revision debugging
+ // console.log('Modified Query');
+ // console.log(finalQuery);
+
+ let contextData = {};
+ if (templateQueryToExecute) {
+ const {data} = await client.query({
+ query: gql(finalQuery),
+ variables: {...templateObject.variables},
+ });
+ contextData = data;
+ }
+
+ return {contextData, useShopSpecificTemplate};
+}
+
+
+/**
+ * Apply sorters to the AST
+ * @param ast
+ * @param sorters
+ */
+export function applySorters(ast, sorters) {
+ sorters.forEach((sorter) => {
+ const fieldPath = sorter.field.split('.');
+ visit(ast, {
+ OperationDefinition: {
+ enter(node) {
+ // Loop through each sorter to apply it
+ // noinspection DuplicatedCode
+
+ let currentSelection = node; // Start with the root operation
+
+ // Navigate down the field path to the correct location
+ for (let i = 0; i < fieldPath.length - 1; i++) {
+ let found = false;
+ visit(currentSelection, {
+ Field: {
+ enter(node) {
+ if (node.name.value === fieldPath[i]) {
+ currentSelection = node; // Move down to the next level
+ found = true;
+ }
+ }
+ }
+ });
+ if (!found) break; // Stop if we can't find the next field in the path
+ }
+
+ // Apply the sorter at the correct level
+ if (currentSelection) {
+ const targetFieldName = fieldPath[fieldPath.length - 1];
+ let orderByArg = currentSelection.arguments.find(arg => arg.name.value === 'order_by');
+ if (!orderByArg) {
+ orderByArg = {
+ kind: Kind.ARGUMENT,
+ name: {kind: Kind.NAME, value: 'order_by'},
+ value: {kind: Kind.OBJECT, fields: []},
+ };
+ currentSelection.arguments.push(orderByArg);
+ }
+
+ const sorterField = {
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: targetFieldName},
+ value: {kind: Kind.ENUM, value: sorter.direction}, // Adjust if your schema uses a different type for sorting directions
+ };
+
+ // Add the new sorter condition
+ orderByArg.value.fields.push(sorterField);
+ }
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Apply filters to the AST
+ * @param ast
+ * @param filters
+ */
+export function applyFilters(ast, filters) {
+ return visit(ast, {
+ OperationDefinition: {
+ enter(node) {
+ filters.forEach(filter => {
+ const fieldPath = filter.field.split('.');
+ let topLevel = false;
+
+ // Determine if the filter should be applied at the top level
+ if (fieldPath[0].startsWith('[') && fieldPath[0].endsWith(']')) {
+ fieldPath[0] = fieldPath[0].substring(1, fieldPath[0].length - 1); // Strip the brackets
+ topLevel = true;
+ }
+
+ if (topLevel) {
+ // Construct the filter for a top-level application
+ const targetFieldName = fieldPath[fieldPath.length - 1];
+ const filterValue = {
+ kind: getGraphQLKind(filter.value),
+ value: filter.value,
+ };
+
+ const nestedFilter = {
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: targetFieldName},
+ value: {
+ kind: Kind.OBJECT,
+ fields: [{
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: filter.operator},
+ value: filterValue,
+ }],
+ },
+ };
+
+ // Find or create the where argument for the top-level field
+ let whereArg = node.selectionSet.selections
+ .find(selection => selection.name.value === fieldPath[0])
+ ?.arguments.find(arg => arg.name.value === 'where');
+
+ if (!whereArg) {
+ whereArg = {
+ kind: Kind.ARGUMENT,
+ name: {kind: Kind.NAME, value: 'where'},
+ value: {kind: Kind.OBJECT, fields: []},
+ };
+ const topLevelSelection = node.selectionSet.selections.find(selection =>
+ selection.name.value === fieldPath[0]
+ );
+ if (topLevelSelection) {
+ topLevelSelection.arguments = topLevelSelection.arguments || [];
+ topLevelSelection.arguments.push(whereArg);
+ }
+ }
+
+ // Correctly position the nested filter without an extra 'where'
+ if (fieldPath.length > 2) { // More than one level deep
+ let currentField = whereArg.value;
+ fieldPath.slice(1, -1).forEach((path, index) => {
+ let existingField = currentField.fields.find(f => f.name.value === path);
+ if (!existingField) {
+ existingField = {
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: path},
+ value: {kind: Kind.OBJECT, fields: []}
+ };
+ currentField.fields.push(existingField);
+ }
+ currentField = existingField.value;
+ });
+ currentField.fields.push(nestedFilter);
+ } else { // Directly under the top level
+ whereArg.value.fields.push(nestedFilter);
+ }
+ } else {
+ // Initialize a reference to the current selection to traverse down the AST
+ let currentSelection = node;
+ let whereArgFound = false;
+
+ // Iterate over the fieldPath, except for the last entry, to navigate the structure
+ for (let i = 0; i < fieldPath.length - 1; i++) {
+ const fieldName = fieldPath[i];
+ let fieldFound = false;
+
+ // Check if the current selection has a selectionSet and selections
+ if (currentSelection.selectionSet && currentSelection.selectionSet.selections) {
+ // Look for the field in the current selection's selections
+ const selection = currentSelection.selectionSet.selections.find(sel => sel.name.value === fieldName);
+ if (selection) {
+ // Move down the AST to the found selection
+ currentSelection = selection;
+ fieldFound = true;
+ }
+ }
+
+ // If the field was not found in the current path, it's an issue
+ if (!fieldFound) {
+ console.error(`Field ${fieldName} not found in the current selection.`);
+ return; // Exit the loop and function due to error
+ }
+ }
+
+ // At this point, currentSelection should be the parent field where the filter needs to be applied
+ // Check if the 'where' argument already exists in the current selection
+ const whereArg = currentSelection.arguments.find(arg => arg.name.value === 'where');
+ if (whereArg) {
+ whereArgFound = true;
+ } else {
+ // If not found, create a new 'where' argument for the current selection
+ currentSelection.arguments.push({
+ kind: Kind.ARGUMENT,
+ name: {kind: Kind.NAME, value: 'where'},
+ value: {kind: Kind.OBJECT, fields: []} // Empty fields array to be populated with the filter
+ });
+ }
+
+ // Assuming the last entry in fieldPath is the field to apply the filter on
+ const targetField = fieldPath[fieldPath.length - 1];
+ const filterValue = {
+ kind: getGraphQLKind(filter.value),
+ value: filter.value,
+ };
+
+ // Construct the filter field object
+ const filterField = {
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: targetField},
+ value: {
+ kind: Kind.OBJECT,
+ fields: [{
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: filter.operator},
+ value: filterValue,
+ }],
+ },
+ };
+
+ // Add the filter field to the 'where' clause of the current selection
+ if (whereArgFound) {
+ whereArg.value.fields.push(filterField);
+ } else {
+ // If the whereArg was newly created, find it again (since we didn't store its reference) and add the filter
+ currentSelection.arguments.find(arg => arg.name.value === 'where').value.fields.push(filterField);
+ }
+ }
+
+ });
+ }
+ }
+ });
+}
+
+/**
+ * Get the GraphQL kind for a value
+ * @param value
+ * @returns {Kind|Kind.INT}
+ */
+function getGraphQLKind(value) {
+ if (typeof value === 'number') {
+ return value % 1 === 0 ? Kind.INT : Kind.FLOAT;
+ } else if (typeof value === 'boolean') {
+ return Kind.BOOLEAN;
+ } else if (typeof value === 'string') {
+ return Kind.STRING;
+ }
+ // Extend with more types as needed
+}
+
+/**
+ * Wrap filters in an 'and' object
+ * @param ast
+ * @param filterFields
+ */
+export function wrapFiltersInAnd(ast, filterFields) {
+ visit(ast, {
+ OperationDefinition: {
+ enter(node) {
+ node.selectionSet.selections.forEach((selection) => {
+ let whereArg = selection.arguments.find(arg => arg.name.value === 'where');
+ if (filterFields.length > 1) {
+ const andFilter = {
+ kind: Kind.OBJECT_FIELD,
+ name: {kind: Kind.NAME, value: '_and'},
+ value: {kind: Kind.LIST, values: filterFields}
+ };
+ whereArg.value.fields.push(andFilter);
+ } else if (filterFields.length === 1) {
+ whereArg.value.fields.push(filterFields[0].fields[0]);
+ }
+ });
+ }
+ }
+ });
+}
+
+/* eslint-enable no-loop-func */
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index fad4c5685..69079b48f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,21 +9,21 @@
"version": "0.2.0",
"license": "UNLICENSED",
"dependencies": {
- "@aws-sdk/client-secrets-manager": "^3.503.0",
- "@aws-sdk/client-ses": "^3.503.0",
- "@aws-sdk/credential-provider-node": "^3.503.0",
+ "@aws-sdk/client-secrets-manager": "^3.515.0",
+ "@aws-sdk/client-ses": "^3.515.0",
+ "@aws-sdk/credential-provider-node": "^3.515.0",
"@opensearch-project/opensearch": "^2.5.0",
"aws4": "^1.12.0",
"axios": "^1.6.5",
"bluebird": "^3.7.2",
"body-parser": "^1.20.2",
- "cloudinary": "^2.0.0",
+ "cloudinary": "^2.0.1",
"compression": "^1.7.4",
"cookie-parser": "^1.4.6",
"cors": "2.8.5",
"csrf": "^3.1.0",
"dinero.js": "^1.9.1",
- "dotenv": "^16.4.1",
+ "dotenv": "^16.4.5",
"express": "^4.18.2",
"firebase-admin": "^12.0.0",
"graphql": "^16.8.1",
@@ -31,23 +31,23 @@
"graylog2": "^0.2.1",
"inline-css": "^4.0.2",
"intuit-oauth": "^4.0.0",
- "json-2-csv": "^5.0.1",
+ "json-2-csv": "^5.2.0",
"lodash": "^4.17.21",
"moment": "^2.30.1",
- "moment-timezone": "^0.5.44",
+ "moment-timezone": "^0.5.45",
"multer": "^1.4.5-lts.1",
"node-mailjet": "^6.0.5",
"node-persist": "^4.0.1",
"node-quickbooks": "^2.0.43",
- "nodemailer": "^6.9.8",
+ "nodemailer": "^6.9.10",
"phone": "^3.1.42",
"recursive-diff": "^1.0.9",
"rimraf": "^5.0.5",
"soap": "^1.0.0",
"socket.io": "^4.7.4",
"ssh2-sftp-client": "^10.0.3",
- "stripe": "^14.11.0",
- "twilio": "^4.20.0",
+ "stripe": "^14.18.0",
+ "twilio": "^4.22.0",
"uuid": "^9.0.1",
"xml2js": "^0.6.2",
"xmlbuilder2": "^3.1.1"
@@ -153,27 +153,26 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@aws-sdk/client-secrets-manager": {
- "version": "3.503.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.503.0.tgz",
- "integrity": "sha512-wM+izwvHwPPaUxArLs3dVIyyTVlO4Au2DYqcy/OsuuiGFeSSrbWArPnLqH7tav+OINzWTD4qP9okKGtH/rEdtA==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.515.0.tgz",
+ "integrity": "sha512-YO7SVh0mQ55COP5LcKsXE+o6wsOBBn3beAqKDZIBdjXho5rNhTdvbtaGTiaZmv0ALtu7TxtPVixhbDE0y1QseA==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.502.0",
- "@aws-sdk/core": "3.496.0",
- "@aws-sdk/credential-provider-node": "3.503.0",
- "@aws-sdk/middleware-host-header": "3.502.0",
- "@aws-sdk/middleware-logger": "3.502.0",
- "@aws-sdk/middleware-recursion-detection": "3.502.0",
- "@aws-sdk/middleware-signing": "3.502.0",
- "@aws-sdk/middleware-user-agent": "3.502.0",
- "@aws-sdk/region-config-resolver": "3.502.0",
- "@aws-sdk/types": "3.502.0",
- "@aws-sdk/util-endpoints": "3.502.0",
- "@aws-sdk/util-user-agent-browser": "3.502.0",
- "@aws-sdk/util-user-agent-node": "3.502.0",
+ "@aws-sdk/client-sts": "3.515.0",
+ "@aws-sdk/core": "3.513.0",
+ "@aws-sdk/credential-provider-node": "3.515.0",
+ "@aws-sdk/middleware-host-header": "3.515.0",
+ "@aws-sdk/middleware-logger": "3.515.0",
+ "@aws-sdk/middleware-recursion-detection": "3.515.0",
+ "@aws-sdk/middleware-user-agent": "3.515.0",
+ "@aws-sdk/region-config-resolver": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
+ "@aws-sdk/util-endpoints": "3.515.0",
+ "@aws-sdk/util-user-agent-browser": "3.515.0",
+ "@aws-sdk/util-user-agent-node": "3.515.0",
"@smithy/config-resolver": "^2.1.1",
- "@smithy/core": "^1.3.1",
+ "@smithy/core": "^1.3.2",
"@smithy/fetch-http-handler": "^2.4.1",
"@smithy/hash-node": "^2.1.1",
"@smithy/invalid-dependency": "^2.1.1",
@@ -192,47 +191,39 @@
"@smithy/util-body-length-browser": "^2.1.1",
"@smithy/util-body-length-node": "^2.2.1",
"@smithy/util-defaults-mode-browser": "^2.1.1",
- "@smithy/util-defaults-mode-node": "^2.1.1",
+ "@smithy/util-defaults-mode-node": "^2.2.0",
"@smithy/util-endpoints": "^1.1.1",
+ "@smithy/util-middleware": "^2.1.1",
"@smithy/util-retry": "^2.1.1",
"@smithy/util-utf8": "^2.1.1",
"tslib": "^2.5.0",
- "uuid": "^8.3.2"
+ "uuid": "^9.0.1"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-secrets-manager/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/@aws-sdk/client-ses": {
- "version": "3.503.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.503.0.tgz",
- "integrity": "sha512-ppMy4sDHiFMxPsEKAE7G7v6Xtf4tsdXN2IhrML/SjrNmnSDvKMmcBHdnus1WyjKk0oev7sgYTbcVBryxTb/AhA==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.515.0.tgz",
+ "integrity": "sha512-X51TvcpqJ83ZOSUa/efWl+cj3cXBF6fCb2iNghjRD2McDvzGKoiR+Zaoy05doPdh/GZ7azTBqX0qKRIyUj//wg==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.502.0",
- "@aws-sdk/core": "3.496.0",
- "@aws-sdk/credential-provider-node": "3.503.0",
- "@aws-sdk/middleware-host-header": "3.502.0",
- "@aws-sdk/middleware-logger": "3.502.0",
- "@aws-sdk/middleware-recursion-detection": "3.502.0",
- "@aws-sdk/middleware-signing": "3.502.0",
- "@aws-sdk/middleware-user-agent": "3.502.0",
- "@aws-sdk/region-config-resolver": "3.502.0",
- "@aws-sdk/types": "3.502.0",
- "@aws-sdk/util-endpoints": "3.502.0",
- "@aws-sdk/util-user-agent-browser": "3.502.0",
- "@aws-sdk/util-user-agent-node": "3.502.0",
+ "@aws-sdk/client-sts": "3.515.0",
+ "@aws-sdk/core": "3.513.0",
+ "@aws-sdk/credential-provider-node": "3.515.0",
+ "@aws-sdk/middleware-host-header": "3.515.0",
+ "@aws-sdk/middleware-logger": "3.515.0",
+ "@aws-sdk/middleware-recursion-detection": "3.515.0",
+ "@aws-sdk/middleware-user-agent": "3.515.0",
+ "@aws-sdk/region-config-resolver": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
+ "@aws-sdk/util-endpoints": "3.515.0",
+ "@aws-sdk/util-user-agent-browser": "3.515.0",
+ "@aws-sdk/util-user-agent-node": "3.515.0",
"@smithy/config-resolver": "^2.1.1",
- "@smithy/core": "^1.3.1",
+ "@smithy/core": "^1.3.2",
"@smithy/fetch-http-handler": "^2.4.1",
"@smithy/hash-node": "^2.1.1",
"@smithy/invalid-dependency": "^2.1.1",
@@ -251,8 +242,9 @@
"@smithy/util-body-length-browser": "^2.1.1",
"@smithy/util-body-length-node": "^2.2.1",
"@smithy/util-defaults-mode-browser": "^2.1.1",
- "@smithy/util-defaults-mode-node": "^2.1.1",
+ "@smithy/util-defaults-mode-node": "^2.2.0",
"@smithy/util-endpoints": "^1.1.1",
+ "@smithy/util-middleware": "^2.1.1",
"@smithy/util-retry": "^2.1.1",
"@smithy/util-utf8": "^2.1.1",
"@smithy/util-waiter": "^2.1.1",
@@ -264,24 +256,24 @@
}
},
"node_modules/@aws-sdk/client-sso": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.502.0.tgz",
- "integrity": "sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.515.0.tgz",
+ "integrity": "sha512-4oGBLW476zmkdN98lAns3bObRNO+DLOfg4MDUSR6l6GYBV/zGAtoy2O/FhwYKgA2L5h2ZtElGopLlk/1Q0ePLw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/core": "3.496.0",
- "@aws-sdk/middleware-host-header": "3.502.0",
- "@aws-sdk/middleware-logger": "3.502.0",
- "@aws-sdk/middleware-recursion-detection": "3.502.0",
- "@aws-sdk/middleware-user-agent": "3.502.0",
- "@aws-sdk/region-config-resolver": "3.502.0",
- "@aws-sdk/types": "3.502.0",
- "@aws-sdk/util-endpoints": "3.502.0",
- "@aws-sdk/util-user-agent-browser": "3.502.0",
- "@aws-sdk/util-user-agent-node": "3.502.0",
+ "@aws-sdk/core": "3.513.0",
+ "@aws-sdk/middleware-host-header": "3.515.0",
+ "@aws-sdk/middleware-logger": "3.515.0",
+ "@aws-sdk/middleware-recursion-detection": "3.515.0",
+ "@aws-sdk/middleware-user-agent": "3.515.0",
+ "@aws-sdk/region-config-resolver": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
+ "@aws-sdk/util-endpoints": "3.515.0",
+ "@aws-sdk/util-user-agent-browser": "3.515.0",
+ "@aws-sdk/util-user-agent-node": "3.515.0",
"@smithy/config-resolver": "^2.1.1",
- "@smithy/core": "^1.3.1",
+ "@smithy/core": "^1.3.2",
"@smithy/fetch-http-handler": "^2.4.1",
"@smithy/hash-node": "^2.1.1",
"@smithy/invalid-dependency": "^2.1.1",
@@ -300,8 +292,9 @@
"@smithy/util-body-length-browser": "^2.1.1",
"@smithy/util-body-length-node": "^2.2.1",
"@smithy/util-defaults-mode-browser": "^2.1.1",
- "@smithy/util-defaults-mode-node": "^2.1.1",
+ "@smithy/util-defaults-mode-node": "^2.2.0",
"@smithy/util-endpoints": "^1.1.1",
+ "@smithy/util-middleware": "^2.1.1",
"@smithy/util-retry": "^2.1.1",
"@smithy/util-utf8": "^2.1.1",
"tslib": "^2.5.0"
@@ -311,26 +304,25 @@
}
},
"node_modules/@aws-sdk/client-sso-oidc": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.502.0.tgz",
- "integrity": "sha512-Yc9tZqTOMWtdgpkrdjKShgWb9oKNsFQrItfoiN1xWDllaFFRPi2KTiZiR0AbSTrNasJy13d210DOxrIdte+kWQ==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.515.0.tgz",
+ "integrity": "sha512-zACa8LNlPUdlNUBqQRf5a3MfouLNtcBfm84v2c8M976DwJrMGONPe1QjyLLsD38uESQiXiVQRruj/b000iMXNw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.502.0",
- "@aws-sdk/core": "3.496.0",
- "@aws-sdk/middleware-host-header": "3.502.0",
- "@aws-sdk/middleware-logger": "3.502.0",
- "@aws-sdk/middleware-recursion-detection": "3.502.0",
- "@aws-sdk/middleware-signing": "3.502.0",
- "@aws-sdk/middleware-user-agent": "3.502.0",
- "@aws-sdk/region-config-resolver": "3.502.0",
- "@aws-sdk/types": "3.502.0",
- "@aws-sdk/util-endpoints": "3.502.0",
- "@aws-sdk/util-user-agent-browser": "3.502.0",
- "@aws-sdk/util-user-agent-node": "3.502.0",
+ "@aws-sdk/client-sts": "3.515.0",
+ "@aws-sdk/core": "3.513.0",
+ "@aws-sdk/middleware-host-header": "3.515.0",
+ "@aws-sdk/middleware-logger": "3.515.0",
+ "@aws-sdk/middleware-recursion-detection": "3.515.0",
+ "@aws-sdk/middleware-user-agent": "3.515.0",
+ "@aws-sdk/region-config-resolver": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
+ "@aws-sdk/util-endpoints": "3.515.0",
+ "@aws-sdk/util-user-agent-browser": "3.515.0",
+ "@aws-sdk/util-user-agent-node": "3.515.0",
"@smithy/config-resolver": "^2.1.1",
- "@smithy/core": "^1.3.1",
+ "@smithy/core": "^1.3.2",
"@smithy/fetch-http-handler": "^2.4.1",
"@smithy/hash-node": "^2.1.1",
"@smithy/invalid-dependency": "^2.1.1",
@@ -349,8 +341,9 @@
"@smithy/util-body-length-browser": "^2.1.1",
"@smithy/util-body-length-node": "^2.2.1",
"@smithy/util-defaults-mode-browser": "^2.1.1",
- "@smithy/util-defaults-mode-node": "^2.1.1",
+ "@smithy/util-defaults-mode-node": "^2.2.0",
"@smithy/util-endpoints": "^1.1.1",
+ "@smithy/util-middleware": "^2.1.1",
"@smithy/util-retry": "^2.1.1",
"@smithy/util-utf8": "^2.1.1",
"tslib": "^2.5.0"
@@ -359,28 +352,28 @@
"node": ">=14.0.0"
},
"peerDependencies": {
- "@aws-sdk/credential-provider-node": "*"
+ "@aws-sdk/credential-provider-node": "^3.515.0"
}
},
"node_modules/@aws-sdk/client-sts": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.502.0.tgz",
- "integrity": "sha512-0q08gsvn6nuRqjK+i/e30PT/t7vvYwmGJS0PhJikZWv5yRDNSUxSYG0uDwKSbLDzmc2UX5+mLeyjPHlL4hbGlA==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.515.0.tgz",
+ "integrity": "sha512-ScYuvaIDgip3atOJIA1FU2n0gJkEdveu1KrrCPathoUCV5zpK8qQmO/n+Fj/7hKFxeKdFbB+4W4CsJWYH94nlg==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/core": "3.496.0",
- "@aws-sdk/middleware-host-header": "3.502.0",
- "@aws-sdk/middleware-logger": "3.502.0",
- "@aws-sdk/middleware-recursion-detection": "3.502.0",
- "@aws-sdk/middleware-user-agent": "3.502.0",
- "@aws-sdk/region-config-resolver": "3.502.0",
- "@aws-sdk/types": "3.502.0",
- "@aws-sdk/util-endpoints": "3.502.0",
- "@aws-sdk/util-user-agent-browser": "3.502.0",
- "@aws-sdk/util-user-agent-node": "3.502.0",
+ "@aws-sdk/core": "3.513.0",
+ "@aws-sdk/middleware-host-header": "3.515.0",
+ "@aws-sdk/middleware-logger": "3.515.0",
+ "@aws-sdk/middleware-recursion-detection": "3.515.0",
+ "@aws-sdk/middleware-user-agent": "3.515.0",
+ "@aws-sdk/region-config-resolver": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
+ "@aws-sdk/util-endpoints": "3.515.0",
+ "@aws-sdk/util-user-agent-browser": "3.515.0",
+ "@aws-sdk/util-user-agent-node": "3.515.0",
"@smithy/config-resolver": "^2.1.1",
- "@smithy/core": "^1.3.1",
+ "@smithy/core": "^1.3.2",
"@smithy/fetch-http-handler": "^2.4.1",
"@smithy/hash-node": "^2.1.1",
"@smithy/invalid-dependency": "^2.1.1",
@@ -399,7 +392,7 @@
"@smithy/util-body-length-browser": "^2.1.1",
"@smithy/util-body-length-node": "^2.2.1",
"@smithy/util-defaults-mode-browser": "^2.1.1",
- "@smithy/util-defaults-mode-node": "^2.1.1",
+ "@smithy/util-defaults-mode-node": "^2.2.0",
"@smithy/util-endpoints": "^1.1.1",
"@smithy/util-middleware": "^2.1.1",
"@smithy/util-retry": "^2.1.1",
@@ -411,15 +404,15 @@
"node": ">=14.0.0"
},
"peerDependencies": {
- "@aws-sdk/credential-provider-node": "*"
+ "@aws-sdk/credential-provider-node": "^3.515.0"
}
},
"node_modules/@aws-sdk/core": {
- "version": "3.496.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.496.0.tgz",
- "integrity": "sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==",
+ "version": "3.513.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.513.0.tgz",
+ "integrity": "sha512-L+9DL4apWuqNKVOMJ8siAuWoRM9rZf9w1iPv8S2o83WO2jVK7E/m+rNW1dFo9HsA5V1ccDl2H2qLXx24HiHmOw==",
"dependencies": {
- "@smithy/core": "^1.3.1",
+ "@smithy/core": "^1.3.2",
"@smithy/protocol-http": "^3.1.1",
"@smithy/signature-v4": "^2.1.1",
"@smithy/smithy-client": "^2.3.1",
@@ -431,11 +424,11 @@
}
},
"node_modules/@aws-sdk/credential-provider-env": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.502.0.tgz",
- "integrity": "sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.515.0.tgz",
+ "integrity": "sha512-45vxdyqhTAaUMERYVWOziG3K8L2TV9G4ryQS/KZ84o7NAybE9GMdoZRVmGHAO7mJJ1wQiYCM/E+i5b3NW9JfNA==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/property-provider": "^2.1.1",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -444,17 +437,36 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/credential-provider-ini": {
- "version": "3.503.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.503.0.tgz",
- "integrity": "sha512-sfmVLtUx+KDJ74jlbxW6dr1ysXh2EAESA+a5stFehgeXM1BeEdZc938wGcb8Mzm9w6li3IK0otXy8/R5TkQn3g==",
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.515.0.tgz",
+ "integrity": "sha512-Ba6FXK77vU4WyheiamNjEuTFmir0eAXuJGPO27lBaA8g+V/seXGHScsbOG14aQGDOr2P02OPwKGZrWWA7BFpfQ==",
"dependencies": {
- "@aws-sdk/client-sts": "3.502.0",
- "@aws-sdk/credential-provider-env": "3.502.0",
- "@aws-sdk/credential-provider-process": "3.502.0",
- "@aws-sdk/credential-provider-sso": "3.502.0",
- "@aws-sdk/credential-provider-web-identity": "3.502.0",
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
+ "@smithy/fetch-http-handler": "^2.4.1",
+ "@smithy/node-http-handler": "^2.3.1",
+ "@smithy/property-provider": "^2.1.1",
+ "@smithy/protocol-http": "^3.1.1",
+ "@smithy/smithy-client": "^2.3.1",
+ "@smithy/types": "^2.9.1",
+ "@smithy/util-stream": "^2.1.1",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.515.0.tgz",
+ "integrity": "sha512-ouDlNZdv2TKeVEA/YZk2+XklTXyAAGdbWnl4IgN9ItaodWI+lZjdIoNC8BAooVH+atIV/cZgoGTGQL7j2TxJ9A==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.515.0",
+ "@aws-sdk/credential-provider-env": "3.515.0",
+ "@aws-sdk/credential-provider-process": "3.515.0",
+ "@aws-sdk/credential-provider-sso": "3.515.0",
+ "@aws-sdk/credential-provider-web-identity": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/credential-provider-imds": "^2.2.1",
"@smithy/property-provider": "^2.1.1",
"@smithy/shared-ini-file-loader": "^2.3.1",
@@ -466,16 +478,17 @@
}
},
"node_modules/@aws-sdk/credential-provider-node": {
- "version": "3.503.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.503.0.tgz",
- "integrity": "sha512-jE+QpqWU7ESxbKtWmeerv4ze7HntGcfh4PFscsy+O3QZYXXntzkDAne9wRvT38rfI+uVOGGNdCtz+8zSS3MaZw==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.515.0.tgz",
+ "integrity": "sha512-Y4kHSpbxksiCZZNcvsiKUd8Fb2XlyUuONEwqWFNL82ZH6TCCjBGS31wJQCSxBHqYcOL3tiORUEJkoO7uS30uQA==",
"dependencies": {
- "@aws-sdk/credential-provider-env": "3.502.0",
- "@aws-sdk/credential-provider-ini": "3.503.0",
- "@aws-sdk/credential-provider-process": "3.502.0",
- "@aws-sdk/credential-provider-sso": "3.502.0",
- "@aws-sdk/credential-provider-web-identity": "3.502.0",
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/credential-provider-env": "3.515.0",
+ "@aws-sdk/credential-provider-http": "3.515.0",
+ "@aws-sdk/credential-provider-ini": "3.515.0",
+ "@aws-sdk/credential-provider-process": "3.515.0",
+ "@aws-sdk/credential-provider-sso": "3.515.0",
+ "@aws-sdk/credential-provider-web-identity": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/credential-provider-imds": "^2.2.1",
"@smithy/property-provider": "^2.1.1",
"@smithy/shared-ini-file-loader": "^2.3.1",
@@ -487,11 +500,11 @@
}
},
"node_modules/@aws-sdk/credential-provider-process": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.502.0.tgz",
- "integrity": "sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.515.0.tgz",
+ "integrity": "sha512-pSjiOA2FM63LHRKNDvEpBRp80FVGT0Mw/gzgbqFXP+sewk0WVonYbEcMDTJptH3VsLPGzqH/DQ1YL/aEIBuXFQ==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/property-provider": "^2.1.1",
"@smithy/shared-ini-file-loader": "^2.3.1",
"@smithy/types": "^2.9.1",
@@ -502,13 +515,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.502.0.tgz",
- "integrity": "sha512-/2Nyvo+cWQpH283lmZBimTJ9JDhES9FzQUkhUXZgxQo3Ez4sguLVi2V9xoFFyG0cMff5fuNivdKHfj4FeMGjZw==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.515.0.tgz",
+ "integrity": "sha512-j7vUkiSmuhpBvZYoPTRTI4ePnQbiZMFl6TNhg9b9DprC1zHkucsZnhRhqjOVlrw/H6J4jmcPGcHHTZ5WQNI5xQ==",
"dependencies": {
- "@aws-sdk/client-sso": "3.502.0",
- "@aws-sdk/token-providers": "3.502.0",
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/client-sso": "3.515.0",
+ "@aws-sdk/token-providers": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/property-provider": "^2.1.1",
"@smithy/shared-ini-file-loader": "^2.3.1",
"@smithy/types": "^2.9.1",
@@ -519,12 +532,12 @@
}
},
"node_modules/@aws-sdk/credential-provider-web-identity": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.502.0.tgz",
- "integrity": "sha512-veBAjDqjMMgA2Qxxf9ywDfHYLeJpaeHWLWCQ9XCHwJJ6ZIGWmAZPTq3he/UMr5JIQXooIccqqyqXMDIXPenXpA==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.515.0.tgz",
+ "integrity": "sha512-66+2g4z3fWwdoGReY8aUHvm6JrKZMTRxjuizljVmMyOBttKPeBYXvUTop/g3ZGUx1f8j+C5qsGK52viYBvtjuQ==",
"dependencies": {
- "@aws-sdk/client-sts": "3.502.0",
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/client-sts": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/property-provider": "^2.1.1",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -534,11 +547,11 @@
}
},
"node_modules/@aws-sdk/middleware-host-header": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.502.0.tgz",
- "integrity": "sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.515.0.tgz",
+ "integrity": "sha512-I1MwWPzdRKM1luvdDdjdGsDjNVPhj9zaIytEchjTY40NcKOg+p2evLD2y69ozzg8pyXK63r8DdvDGOo9QPuh0A==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/protocol-http": "^3.1.1",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -548,11 +561,11 @@
}
},
"node_modules/@aws-sdk/middleware-logger": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.502.0.tgz",
- "integrity": "sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.515.0.tgz",
+ "integrity": "sha512-qXomJzg2m/5seQOxHi/yOXOKfSjwrrJSmEmfwJKJyQgdMbBcjz3Cz0H/1LyC6c5hHm6a/SZgSTzDAbAoUmyL+Q==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
},
@@ -561,11 +574,11 @@
}
},
"node_modules/@aws-sdk/middleware-recursion-detection": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.502.0.tgz",
- "integrity": "sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.515.0.tgz",
+ "integrity": "sha512-dokHLbTV3IHRIBrw9mGoxcNTnQsjlm7TpkJhPdGT9T4Mq399EyQo51u6IsVMm07RXLl2Zw7u+u9p+qWBFzmFRA==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/protocol-http": "^3.1.1",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -574,30 +587,13 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/middleware-signing": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.502.0.tgz",
- "integrity": "sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==",
- "dependencies": {
- "@aws-sdk/types": "3.502.0",
- "@smithy/property-provider": "^2.1.1",
- "@smithy/protocol-http": "^3.1.1",
- "@smithy/signature-v4": "^2.1.1",
- "@smithy/types": "^2.9.1",
- "@smithy/util-middleware": "^2.1.1",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
"node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.502.0.tgz",
- "integrity": "sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.515.0.tgz",
+ "integrity": "sha512-nOqZjGA/GkjuJ5fUshec9Fv6HFd7ovOTxMJbw3MfAhqXuVZ6dKF41lpVJ4imNsgyFt3shUg9WDY8zGFjlYMB3g==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
- "@aws-sdk/util-endpoints": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
+ "@aws-sdk/util-endpoints": "3.515.0",
"@smithy/protocol-http": "^3.1.1",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -607,11 +603,11 @@
}
},
"node_modules/@aws-sdk/region-config-resolver": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.502.0.tgz",
- "integrity": "sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.515.0.tgz",
+ "integrity": "sha512-RIRx9loxMgEAc/r1wPfnfShOuzn4RBi8pPPv6/jhhITEeMnJe6enAh2k5y9DdiVDDgCWZgVFSv0YkAIfzAFsnQ==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/node-config-provider": "^2.2.1",
"@smithy/types": "^2.9.1",
"@smithy/util-config-provider": "^2.2.1",
@@ -623,12 +619,12 @@
}
},
"node_modules/@aws-sdk/token-providers": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.502.0.tgz",
- "integrity": "sha512-RQgMgIXYlSf0xGl6EUeD+pqIPBlb7e29dbqHOBFc66hJVYUC2ULZX7Y+jLvcGIEaMiIaTPyvntZRFip+U+9hag==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.515.0.tgz",
+ "integrity": "sha512-MQuf04rIcTXqwDzmyHSpFPF1fKEzRl64oXtCRUF3ddxTdK6wxXkePfK6wNCuL+GEbEcJAoCtIGIRpzGPJvQjHA==",
"dependencies": {
- "@aws-sdk/client-sso-oidc": "3.502.0",
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/client-sso-oidc": "3.515.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/property-provider": "^2.1.1",
"@smithy/shared-ini-file-loader": "^2.3.1",
"@smithy/types": "^2.9.1",
@@ -639,9 +635,9 @@
}
},
"node_modules/@aws-sdk/types": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.502.0.tgz",
- "integrity": "sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.515.0.tgz",
+ "integrity": "sha512-B3gUpiMlpT6ERaLvZZ61D0RyrQPsFYDkCncLPVkZOKkCOoFU46zi1o6T5JcYiz8vkx1q9RGloQ5exh79s5pU/w==",
"dependencies": {
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -651,11 +647,11 @@
}
},
"node_modules/@aws-sdk/util-endpoints": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.502.0.tgz",
- "integrity": "sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.515.0.tgz",
+ "integrity": "sha512-UJi+jdwcGFV/F7d3+e2aQn5yZOVpDiAgfgNhPnEtgV0WozJ5/ZUeZBgWvSc/K415N4A4D/9cbBc7+I+35qzcDQ==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/types": "^2.9.1",
"@smithy/util-endpoints": "^1.1.1",
"tslib": "^2.5.0"
@@ -676,22 +672,22 @@
}
},
"node_modules/@aws-sdk/util-user-agent-browser": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.502.0.tgz",
- "integrity": "sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.515.0.tgz",
+ "integrity": "sha512-pTWQb0JCafTmLHLDv3Qqs/nAAJghcPdGQIBpsCStb0YEzg3At/dOi2AIQ683yYnXmeOxLXJDzmlsovfVObJScw==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/types": "^2.9.1",
"bowser": "^2.11.0",
"tslib": "^2.5.0"
}
},
"node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.502.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.502.0.tgz",
- "integrity": "sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==",
+ "version": "3.515.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.515.0.tgz",
+ "integrity": "sha512-A/KJ+/HTohHyVXLH+t/bO0Z2mPrQgELbQO8tX+B2nElo8uklj70r5cT7F8ETsI9oOy+HDVpiL5/v45ZgpUOiPg==",
"dependencies": {
- "@aws-sdk/types": "3.502.0",
+ "@aws-sdk/types": "3.515.0",
"@smithy/node-config-provider": "^2.2.1",
"@smithy/types": "^2.9.1",
"tslib": "^2.5.0"
@@ -1231,9 +1227,9 @@
}
},
"node_modules/@smithy/core": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.1.tgz",
- "integrity": "sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.2.tgz",
+ "integrity": "sha512-tYDmTp0f2TZVE18jAOH1PnmkngLQ+dOGUlMd1u67s87ieueNeyqhja6z/Z4MxhybEiXKOWFOmGjfTZWFxljwJw==",
"dependencies": {
"@smithy/middleware-endpoint": "^2.4.1",
"@smithy/middleware-retry": "^2.1.1",
@@ -1627,9 +1623,9 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.1.1.tgz",
- "integrity": "sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.0.tgz",
+ "integrity": "sha512-iFJp/N4EtkanFpBUtSrrIbtOIBf69KNuve03ic1afhJ9/korDxdM0c6cCH4Ehj/smI9pDCfVv+bqT3xZjF2WaA==",
"dependencies": {
"@smithy/config-resolver": "^2.1.1",
"@smithy/credential-provider-imds": "^2.2.1",
@@ -2409,11 +2405,10 @@
}
},
"node_modules/cloudinary": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.0.0.tgz",
- "integrity": "sha512-NUbufckg2GiuJjB0DVGFBRNLt4jl+2nOA1KeZv1ub8FCduNFvkcdGF1t9JKeoVVM8Po9wYvjICcecMsjQVq1Jw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.0.1.tgz",
+ "integrity": "sha512-+j5GswtCwjAmLhjs/K26id4Zvh53zL/YWzgyenxgbdXdXmdFM8d5H1FV1sJCkpS77AqylJKBzyztySdILM+F+A==",
"dependencies": {
- "cloudinary-core": "^2.13.0",
"lodash": "^4.17.21",
"q": "^1.5.1"
},
@@ -2421,14 +2416,6 @@
"node": ">=9"
}
},
- "node_modules/cloudinary-core": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.13.0.tgz",
- "integrity": "sha512-Nt0Q5I2FtenmJghtC4YZ3MZZbGg1wLm84SsxcuVwZ83OyJqG9CNIGp86CiI6iDv3QobaqBUpOT7vg+HqY5HxEA==",
- "peerDependencies": {
- "lodash": ">=4.0"
- }
- },
"node_modules/color": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
@@ -3024,14 +3011,14 @@
}
},
"node_modules/dotenv": {
- "version": "16.4.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz",
- "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==",
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
- "url": "https://github.com/motdotla/dotenv?sponsor=1"
+ "url": "https://dotenvx.com"
}
},
"node_modules/duplexer": {
@@ -4373,9 +4360,9 @@
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
},
"node_modules/json-2-csv": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-5.0.1.tgz",
- "integrity": "sha512-rP9ChyMskS0angbvFdQ43SwEe72mEvqcY1/V2OeukQWxtlreUuZWhMlTdWjtd4L6kJxq+HPFTI06yqLvZiEVIA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/json-2-csv/-/json-2-csv-5.2.0.tgz",
+ "integrity": "sha512-C+XmSKRCS7zSTENm7Ha/lhLkO2ZE+fcSNC2kLiWSEGKy6ZwRCG2KakMJj0bvyfy2U8oZY+KFoU8F1isCgpUBYg==",
"dependencies": {
"deeks": "3.0.2",
"doc-path": "4.0.2"
@@ -4778,9 +4765,9 @@
}
},
"node_modules/moment-timezone": {
- "version": "0.5.44",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz",
- "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==",
+ "version": "0.5.45",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz",
+ "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
"dependencies": {
"moment": "^2.29.4"
},
@@ -4921,9 +4908,9 @@
}
},
"node_modules/nodemailer": {
- "version": "6.9.8",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz",
- "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==",
+ "version": "6.9.10",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.10.tgz",
+ "integrity": "sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==",
"engines": {
"node": ">=6.0.0"
}
@@ -6325,9 +6312,9 @@
}
},
"node_modules/stripe": {
- "version": "14.14.0",
- "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.14.0.tgz",
- "integrity": "sha512-P6lvKHxgDzZXto9VMstG1ucv4Ls0U9nOoQhVZABXJ33kRD7zMwkBy5Y4c3BO59O230uSTkOFPLh87YxVzkp0Mg==",
+ "version": "14.18.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.18.0.tgz",
+ "integrity": "sha512-yLqKPqYgGJbMxrQiE4+i2i00ZVA2NRIZbZ1rejzj5XR3F3Uc+1iy9QE133knZudhVGMw367b8vTpB8D9pYMETw==",
"dependencies": {
"@types/node": ">=8.1.0",
"qs": "^6.11.0"
@@ -6620,9 +6607,9 @@
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
},
"node_modules/twilio": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.21.0.tgz",
- "integrity": "sha512-+meDbJPOxs6vEysJ7xX7XMn6FLKmZFSeVzMKjzN9NWgDXssp713Kf1ukteZlXhnhd7/NtNiUv5OU17qVgBb/BQ==",
+ "version": "4.22.0",
+ "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.22.0.tgz",
+ "integrity": "sha512-Dn4x9FxhuCorz2ddJ8/Z8o3G0rLmrQo0frF1MMwWqtLrOwQzhL7Ca/Fup8jqbfjD+JSG1L8DE9a3MGBDETDrNg==",
"dependencies": {
"axios": "^1.6.0",
"dayjs": "^1.11.9",
diff --git a/package.json b/package.json
index 6b22e4cde..f538fcaba 100644
--- a/package.json
+++ b/package.json
@@ -18,21 +18,21 @@
"start": "node server.js"
},
"dependencies": {
- "@aws-sdk/client-secrets-manager": "^3.503.0",
- "@aws-sdk/client-ses": "^3.503.0",
- "@aws-sdk/credential-provider-node": "^3.503.0",
+ "@aws-sdk/client-secrets-manager": "^3.515.0",
+ "@aws-sdk/client-ses": "^3.515.0",
+ "@aws-sdk/credential-provider-node": "^3.515.0",
"@opensearch-project/opensearch": "^2.5.0",
"aws4": "^1.12.0",
"axios": "^1.6.5",
"bluebird": "^3.7.2",
"body-parser": "^1.20.2",
- "cloudinary": "^2.0.0",
+ "cloudinary": "^2.0.1",
"compression": "^1.7.4",
"cookie-parser": "^1.4.6",
"cors": "2.8.5",
"csrf": "^3.1.0",
"dinero.js": "^1.9.1",
- "dotenv": "^16.4.1",
+ "dotenv": "^16.4.5",
"express": "^4.18.2",
"firebase-admin": "^12.0.0",
"graphql": "^16.8.1",
@@ -40,23 +40,23 @@
"graylog2": "^0.2.1",
"inline-css": "^4.0.2",
"intuit-oauth": "^4.0.0",
- "json-2-csv": "^5.0.1",
+ "json-2-csv": "^5.2.0",
"lodash": "^4.17.21",
"moment": "^2.30.1",
- "moment-timezone": "^0.5.44",
+ "moment-timezone": "^0.5.45",
"multer": "^1.4.5-lts.1",
"node-mailjet": "^6.0.5",
"node-persist": "^4.0.1",
"node-quickbooks": "^2.0.43",
- "nodemailer": "^6.9.8",
+ "nodemailer": "^6.9.10",
"phone": "^3.1.42",
"recursive-diff": "^1.0.9",
"rimraf": "^5.0.5",
"soap": "^1.0.0",
"socket.io": "^4.7.4",
"ssh2-sftp-client": "^10.0.3",
- "stripe": "^14.11.0",
- "twilio": "^4.20.0",
+ "stripe": "^14.18.0",
+ "twilio": "^4.22.0",
"uuid": "^9.0.1",
"xml2js": "^0.6.2",
"xmlbuilder2": "^3.1.1"
diff --git a/server/job/job-costing.js b/server/job/job-costing.js
index 4c1170e08..b1706edfa 100644
--- a/server/job/job-costing.js
+++ b/server/job/job-costing.js
@@ -45,7 +45,6 @@ async function JobCostingMulti(req, res) {
logger.log("job-costing-multi-start", "DEBUG", req.user.email, jobids, null);
-
try {
const resp = await client
.setHeaders({Authorization: BearerToken})