diff --git a/_reference/reportFiltersAndSorters.md b/_reference/reportFiltersAndSorters.md new file mode 100644 index 000000000..b7dfc508c --- /dev/null +++ b/_reference/reportFiltersAndSorters.md @@ -0,0 +1,126 @@ +# 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. + +## 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. + +### 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. diff --git a/client/package-lock.json b/client/package-lock.json index e5455a68a..fe03b8009 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.0", + "@sentry/cli": "^2.28.6", + "@sentry/react": "^7.101.0", + "@sentry/tracing": "^7.101.0", "@splitsoftware/splitio-react": "^1.11.0", "@tanem/react-nprogress": "^5.0.51", - "antd": "^5.14.0", + "antd": "^5.14.1", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^3.3.0", "axios": "^1.6.7", @@ -29,7 +29,7 @@ "dayjs": "^1.11.10", "dayjs-business-days2": "^1.2.2", "dinero.js": "^1.9.1", - "dotenv": "^16.4.1", + "dotenv": "^16.4.4", "enquire-js": "^0.2.1", "env-cmd": "^10.1.0", "exifr": "^7.1.3", @@ -37,10 +37,10 @@ "graphql": "^16.6.0", "i18next": "^23.8.2", "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", + "logrocket": "^8.0.1", "markerjs2": "^2.32.0", "normalize-url": "^8.0.0", "phone": "^3.1.42", @@ -50,17 +50,17 @@ "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.1", "react-color": "^2.19.3", "react-cookie": "^7.0.2", "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.0", "react-markdown": "^9.0.1", "react-number-format": "^5.1.4", "react-redux": "^9.1.0", @@ -70,7 +70,7 @@ "react-sticky": "^6.0.3", "react-sublime-video": "^0.2.5", "react-virtualized": "^9.22.5", - "recharts": "^2.11.0", + "recharts": "^2.12.0", "redux": "^5.0.1", "redux-persist": "^6.0.0", "redux-saga": "^1.3.0", @@ -4362,9 +4362,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.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.0.tgz", + "integrity": "sha512-ZvPYKfu4kDnAqPhJ1bsis8QFbiQRz3Q2HxW3tw9tVGusPzYKRG7ju1FA+34PGcwCoemjGGv+f/7fEygcRZIwmA==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -4500,36 +4500,99 @@ "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.101.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.101.0.tgz", + "integrity": "sha512-uQBMYhZp/qkBEA/GXRMm1OfSkRkZojxBrCrFmzkWhJzXT+YbL57/M1uCcwkKmorKlg393Soh7MLULInwmcwWkA==", "dependencies": { - "@sentry/core": "7.100.0", - "@sentry/types": "7.100.0", - "@sentry/utils": "7.100.0" + "@sentry/core": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" }, "engines": { "node": ">=12" } }, - "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==", + "node_modules/@sentry-internal/feedback/node_modules/@sentry/core": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz", + "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==", "dependencies": { - "@sentry/core": "7.100.0", - "@sentry/replay": "7.100.0", - "@sentry/types": "7.100.0", - "@sentry/utils": "7.100.0" + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/feedback/node_modules/@sentry/types": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz", + "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/feedback/node_modules/@sentry/utils": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz", + "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==", + "dependencies": { + "@sentry/types": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.101.0.tgz", + "integrity": "sha512-fiz4kPpz/j6ZaD+vOcUXuO1HqD49djs4QwyTsRwCCi77EKZOGAaijpqWckDWyZs0dOOnbGGGC5x3o+CfTJcjKA==", + "dependencies": { + "@sentry/core": "7.101.0", + "@sentry/replay": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" }, "engines": { "node": ">=12" } }, + "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/core": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz", + "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==", + "dependencies": { + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/types": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz", + "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/utils": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz", + "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==", + "dependencies": { + "@sentry/types": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, "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==", + "dev": true, "dependencies": { "@sentry/core": "7.100.0", "@sentry/types": "7.100.0", @@ -4549,17 +4612,61 @@ } }, "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.101.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.101.0.tgz", + "integrity": "sha512-wj9YLfS/caR20Yq0hdEjsZHuhnYLU7Ht0SlcJx5MNMnArtmW1k2CWZz3PCqcW/rTZe53npVTe6eMqMccB4aPrQ==", "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.101.0", + "@sentry-internal/replay-canvas": "7.101.0", + "@sentry-internal/tracing": "7.101.0", + "@sentry/core": "7.101.0", + "@sentry/replay": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry-internal/tracing": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.101.0.tgz", + "integrity": "sha512-rp9oOLQs6vMuzvAnAHRRCNu5Z0o/ZVRI3WPYedxpdMWKD1Z3G9o+0joP+ZIUqHsamWWYiIgPqXgL9AK6AWjFRg==", + "dependencies": { + "@sentry/core": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry/core": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz", + "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==", + "dependencies": { + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry/types": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz", + "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser/node_modules/@sentry/utils": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz", + "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==", + "dependencies": { + "@sentry/types": "7.101.0" }, "engines": { "node": ">=8" @@ -4632,9 +4739,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", @@ -4650,19 +4757,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" @@ -4672,9 +4779,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" ], @@ -4688,9 +4795,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" ], @@ -4704,9 +4811,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" @@ -4721,9 +4828,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" ], @@ -4737,9 +4844,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" @@ -4753,9 +4860,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" ], @@ -4771,6 +4878,7 @@ "version": "7.100.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.100.0.tgz", "integrity": "sha512-eWRPuP0Zdj4a2F7SybqNjf13LGOVgGwvW6sojweQp9oxGAfCPp/EMDGBhlpYbMJeLbzmqzJ4ZFHIedaiEC+7kg==", + "dev": true, "dependencies": { "@sentry/types": "7.100.0", "@sentry/utils": "7.100.0" @@ -4795,14 +4903,14 @@ } }, "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.101.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.101.0.tgz", + "integrity": "sha512-EjzkuUzLhE1glUsLPcLhmc8Wg7D5qfKQ08Vbcw+GsE7aLnhWrPTHexkf2NPNeTkgUxbWToJn6PWCodICo5YYbw==", "dependencies": { - "@sentry/browser": "7.100.0", - "@sentry/core": "7.100.0", - "@sentry/types": "7.100.0", - "@sentry/utils": "7.100.0", + "@sentry/browser": "7.101.0", + "@sentry/core": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -4812,26 +4920,145 @@ "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.101.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz", + "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==", "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.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/types": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz", + "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/utils": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz", + "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==", + "dependencies": { + "@sentry/types": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.101.0.tgz", + "integrity": "sha512-DSWkGKI/QhCAY+qm4mBnPob3/YsewisskVTak7KMDotJ75H85WFJhVwOMtvaEWIzVezCOItPv7ql51jTwhR3wA==", + "dependencies": { + "@sentry-internal/tracing": "7.101.0", + "@sentry/core": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" }, "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.101.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.101.0.tgz", + "integrity": "sha512-rp9oOLQs6vMuzvAnAHRRCNu5Z0o/ZVRI3WPYedxpdMWKD1Z3G9o+0joP+ZIUqHsamWWYiIgPqXgL9AK6AWjFRg==", "dependencies": { - "@sentry-internal/tracing": "7.100.0" + "@sentry/core": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay/node_modules/@sentry/core": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz", + "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==", + "dependencies": { + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay/node_modules/@sentry/types": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz", + "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay/node_modules/@sentry/utils": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz", + "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==", + "dependencies": { + "@sentry/types": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.101.0.tgz", + "integrity": "sha512-/TRn3KRuRAamCstw8rRVyL5nlXlL+zf9QNN4IxGFwc7lka8c4d7i5neIWaOrUQvrAlh2gbxbHwt7POIguoed2g==", + "dependencies": { + "@sentry-internal/tracing": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry-internal/tracing": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.101.0.tgz", + "integrity": "sha512-rp9oOLQs6vMuzvAnAHRRCNu5Z0o/ZVRI3WPYedxpdMWKD1Z3G9o+0joP+ZIUqHsamWWYiIgPqXgL9AK6AWjFRg==", + "dependencies": { + "@sentry/core": "7.101.0", + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/core": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz", + "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==", + "dependencies": { + "@sentry/types": "7.101.0", + "@sentry/utils": "7.101.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/types": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz", + "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/utils": { + "version": "7.101.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz", + "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==", + "dependencies": { + "@sentry/types": "7.101.0" }, "engines": { "node": ">=8" @@ -4841,6 +5068,7 @@ "version": "7.100.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.100.0.tgz", "integrity": "sha512-c+RHwZwpKeBk7h8sUX4nQcelxBz8ViCojifnbEe3tcn8O15HOLvZqRKgLLOiff3MoErxiv4oxs0sPbEFRm/IvA==", + "dev": true, "engines": { "node": ">=8" } @@ -4849,6 +5077,7 @@ "version": "7.100.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.100.0.tgz", "integrity": "sha512-LAhZMEGq3C125prZN/ShqeXpRfdfgJkl9RAKjfq8cmMFsF7nsF72dEHZgIwrZ0lgNmtaWAB83AwJcyN83RwOxQ==", + "dev": true, "dependencies": { "@sentry/types": "7.100.0" }, @@ -6214,9 +6443,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", @@ -6452,9 +6681,9 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.14.1.tgz", + "integrity": "sha512-P0Bwt9NKSZqnEJ0QAyAb13ay34FjOKsz+KEp/ts+feYsynhUxF7/Ay6d1jS6ZcNpcs+JWTlLKO59YFZ3tX07wQ==", "dependencies": { "@ant-design/colors": "^7.0.2", "@ant-design/cssinjs": "^1.18.4", @@ -6484,7 +6713,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.1", "rc-progress": "~3.5.1", "rc-rate": "~2.12.0", "rc-resize-observer": "^1.4.0", @@ -9479,14 +9708,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.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.4.tgz", + "integrity": "sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -10788,6 +11017,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", @@ -14282,16 +14519,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" @@ -14339,9 +14576,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" } @@ -14749,9 +14986,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", @@ -18395,9 +18632,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.1", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.1.1.tgz", + "integrity": "sha512-H99qaHUepHjHnAqMLiftJEATXRuHJZcUyFoRkyIqUvTHVGnx/uHxFFNm7QIu1valCpfwdsGWQxiWgn9CAxvlvA==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/trigger": "^1.5.0", @@ -18855,9 +19092,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.1", + "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.10.1.tgz", + "integrity": "sha512-VRa6FkjGDqGrO9A9hWqwtEq1x3hL7oz1JG8NCjdV0O7TZ8lCFef/tJNUbidjlWj9FS1PxA7y94sAYDSsGUDa1w==", "dependencies": { "@babel/runtime": "^7.20.7", "clsx": "^1.2.1", @@ -19033,9 +19270,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" @@ -19076,9 +19313,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.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.8.0.tgz", + "integrity": "sha512-wXHvMQUsTagh3X0Z6jDtGkIXc3VVCd2tjDRYR9kII3GKrZr0XF0xtpfdamo2n8BSF+zzfeeBVOTjxZWpBp9X0g==", "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" @@ -19343,48 +19580,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": { @@ -19427,6 +19633,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", @@ -19485,15 +19706,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.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.0.tgz", + "integrity": "sha512-rVNcdNQ5b7+40Ue7mcEKZJyEv+3SUk2bDEVvOyXPDXXVE7TU3lrvnJUgAvO36hSzhRP2DnAamKXvHLFIFOU0Ww==", "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.19", "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" @@ -19502,7 +19723,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" } diff --git a/client/package.json b/client/package.json index 20f03f8a6..532554bd6 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.0", + "@sentry/cli": "^2.28.6", + "@sentry/react": "^7.101.0", + "@sentry/tracing": "^7.101.0", "@splitsoftware/splitio-react": "^1.11.0", "@tanem/react-nprogress": "^5.0.51", - "antd": "^5.14.0", + "antd": "^5.14.1", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^3.3.0", "axios": "^1.6.7", @@ -25,7 +25,7 @@ "dayjs": "^1.11.10", "dayjs-business-days2": "^1.2.2", "dinero.js": "^1.9.1", - "dotenv": "^16.4.1", + "dotenv": "^16.4.4", "enquire-js": "^0.2.1", "env-cmd": "^10.1.0", "exifr": "^7.1.3", @@ -33,10 +33,10 @@ "graphql": "^16.6.0", "i18next": "^23.8.2", "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", + "logrocket": "^8.0.1", "markerjs2": "^2.32.0", "normalize-url": "^8.0.0", "phone": "^3.1.42", @@ -46,17 +46,17 @@ "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.1", "react-color": "^2.19.3", "react-cookie": "^7.0.2", "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.0", "react-markdown": "^9.0.1", "react-number-format": "^5.1.4", "react-redux": "^9.1.0", @@ -66,7 +66,7 @@ "react-sticky": "^6.0.3", "react-sublime-video": "^0.2.5", "react-virtualized": "^9.22.5", - "recharts": "^2.11.0", + "recharts": "^2.12.0", "redux": "^5.0.1", "redux-persist": "^6.0.0", "redux-saga": "^1.3.0", 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 ba905299a..fce736b16 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 Dinero from "dinero.js"; 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"; @@ -63,7 +63,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); @@ -187,8 +195,10 @@ export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail, notification["error"]({ message: t("jobs.errors.creating", {error: err.message}), }); - refetch().catch(e => { - console.error(`Something went wrong in jobs available table container - ${err.message || ''}`) + refetch().catch((e) => { + console.error(`Something went wrong in jobs available table container - ${err.message || "" + }` + ); }); setInsertLoading(false); setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle); @@ -217,6 +227,23 @@ export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail, //IO-539 Check for Parts Rate on PAL for SGI use case. await CheckTaxRates(supp, bodyshop); + if (updateSchComp.checked === true) { + if (updateSchComp.automatic === true) { + const job_hrs = supp.joblines.data.reduce( + (acc, val) => acc + val.mod_lb_hrs, + 0 + ); + const num_days = job_hrs / bodyshop.target_touchtime; + supp.actual_in = updateSchComp.actual_in; + supp.scheduled_completion = dayjs( + updateSchComp.actual_in + ).businessAdd(num_days, + "days" + ); + } else { + supp.scheduled_completion = updateSchComp.scheduled_completion; + } + } delete supp.owner; delete supp.vehicle; delete supp.ins_co_nm; @@ -389,7 +416,8 @@ export function JobsAvailableContainer({bodyshop, currentUser, insertAuditTrail, onCancel={onJobModalCancel} modalSearchState={modalSearchState} partsQueueToggle={partsQueueToggle} - setPartsQueueToggle={setPartsQueueToggle} + 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..0415f19b8 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 @@ -132,7 +132,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..656e9c553 --- /dev/null +++ b/client/src/components/report-center-modal/report-center-modal-filters-sorters-component.jsx @@ -0,0 +1,277 @@ +import {Button, Card, Checkbox, Col, Form, Input, InputNumber, Row, Select} from "antd"; +import React, {useEffect, useState} from "react"; +import {fetchFilterData} from "../../utils/RenderTemplate"; +import {DeleteFilled} from "@ant-design/icons"; +import {useTranslation} from "react-i18next"; +import {getOperatorsByType} from "../../utils/graphQLmodifier"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; + +export default function ReportCenterModalFiltersSortersComponent({form}) { + return ( + + {() => { + const key = form.getFieldValue("key"); + return ; + }} + + ); +} + +function RenderFilters({templateId, form}) { + const [state, setState] = useState(null); + const [visible, setVisible] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const {t} = useTranslation(); + + useEffect(() => { + const fetch = async () => { + setIsLoading(true); + const data = await fetchFilterData({name: templateId}); + if (data?.success) { + setState(data.data); + } else { + setState(null); + } + setIsLoading(false); + }; + + if (templateId) { + fetch(); + } + }, [templateId]); + + + // Conditional display of filters and sorters + if (!templateId) return null; + if (isLoading) return ; + if (!state) return null; + + // Filters and Sorters data available + return ( +
+ setVisible(e.target.checked)} + children={t('reportcenter.labels.advanced_filters')} + /> + {visible && ( +
+ {state.filters && state.filters.length > 0 && ( + + + {(fields, {add, remove, move}) => { + return ( +
+ {fields.map((field, index) => ( + + + + + + + } + } + + + + + + { + () => { + const name = form.getFieldValue(['filters', field.name, "field"]); + const type = state.filters.find(f => f.name === name)?.type; + + return + {type === 'number' ? + { + form.setFieldsValue({[field.name]: {value: parseInt(value)}}); + }} + /> + : + { + form.setFieldsValue({[field.name]: {value: value.toString()}}); + }} + /> + } + + } + } + + + + + { + remove(field.name); + }} + /> + + + + ))} + + + +
+ ); + }} +
+ +
+ )} + {state.sorters && state.sorters.length > 0 && ( + + + {(fields, {add, remove, move}) => { + return ( +
+ Sorters + {fields.map((field, index) => ( + + + + + + + + + + { + remove(field.name); + }} + /> + + + + ))} + + + +
+ ); + }} +
+
+ )} +
+ )} +
+ ); +} \ 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 f5ab4fdb5..51e268465 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 @@ -9,12 +9,13 @@ import {createStructuredSelector} from "reselect"; import {QUERY_ACTIVE_EMPLOYEES} from "../../graphql/employees.queries"; import {QUERY_ALL_VENDORS} from "../../graphql/vendors.queries"; import {selectReportCenter} from "../../redux/modals/modals.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, @@ -78,6 +79,8 @@ export function ReportCenterModalComponent({reportCenterModal}) { ...(id ? {id: id} : {}), }, + filters: values.filters, + sorters: values.sorters, }, { to: values.to, @@ -148,7 +151,7 @@ export function ReportCenterModalComponent({reportCenterModal}) { {t(`reportcenter.labels.groups.${key}`)} -
    +
      {grouped[key].map((item) => (
    • @@ -180,6 +183,7 @@ export function ReportCenterModalComponent({reportCenterModal}) { ); }} + {() => { const key = form.getFieldValue("key"); @@ -248,7 +252,7 @@ export function ReportCenterModalComponent({reportCenterModal}) { > ); @@ -304,3 +308,4 @@ export function ReportCenterModalComponent({reportCenterModal}) { ); } + diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 23a6015aa..56932ce7a 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1767,6 +1767,7 @@ "ca_gst_all_if_null": "If the Job is marked as a \"GST Registrant\" and this value is set to $0, the customer will be responsible for paying all of the GST by default. ", "calc_repair_days": "Calculated Repair Days", "calc_repair_days_tt": "This is the approximate number of days required to complete the repair according to the target touch time in your shop configuration (current set to {{target_touchtime}}).", + "calc_scheuled_completion": "Calculate Scheduled Completion", "cards": { "customer": "Customer Information", "damage": "Area of Damage", @@ -1926,6 +1927,7 @@ "total_sales": "Total Sales", "totals": "Totals", "unvoidnote": "This Job was unvoided.", + "update_scheduled_completion": "Update Scheduled Completion?", "vehicle_info": "Vehicle", "vehicleassociation": "Vehicle Association", "viewallocations": "View Allocations", @@ -2607,6 +2609,11 @@ "generate": "Generate" }, "labels": { + "advanced_filters": "Advanced Filters and Sorters", + "advanced_filters_show": "Show", + "advanced_filters_hide": "Hide", + "advanced_filters_filters": "Filters", + "advanced_filters_sorters": "Sorters", "dates": "Dates", "employee": "Employee", "filterson": "Filters on {{object}}: {{field}}", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 299364c1b..2c7d5d4b5 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -1767,6 +1767,7 @@ "ca_gst_all_if_null": "", "calc_repair_days": "", "calc_repair_days_tt": "", + "calc_scheuled_completion": "", "cards": { "customer": "Información al cliente", "damage": "Área de Daño", @@ -1926,6 +1927,7 @@ "total_sales": "", "totals": "", "unvoidnote": "", + "update_scheduled_completion": "", "vehicle_info": "Vehículo", "vehicleassociation": "", "viewallocations": "", @@ -2607,6 +2609,11 @@ "generate": "" }, "labels": { + "advanced_filters": "", + "advanced_filters_show": "", + "advanced_filters_hide": "", + "advanced_filters_filters": "", + "advanced_filters_sorters": "", "dates": "", "employee": "", "filterson": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index a6c7c9912..969b1772f 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -1767,6 +1767,7 @@ "ca_gst_all_if_null": "", "calc_repair_days": "", "calc_repair_days_tt": "", + "calc_scheuled_completion": "", "cards": { "customer": "Informations client", "damage": "Zone de dommages", @@ -1926,6 +1927,7 @@ "total_sales": "", "totals": "", "unvoidnote": "", + "update_scheduled_completion": "", "vehicle_info": "Véhicule", "vehicleassociation": "", "viewallocations": "", @@ -2607,6 +2609,11 @@ "generate": "" }, "labels": { + "advanced_filters": "", + "advanced_filters_show": "", + "advanced_filters_hide": "", + "advanced_filters_filters": "", + "advanced_filters_sorters": "", "dates": "", "employee": "", "filterson": "", diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index 242420395..075cade83 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -9,7 +9,7 @@ import {store} from "../redux/store"; import client from "../utils/GraphQLClient"; import cleanAxios from "./CleanAxios"; import {TemplateList} from "./TemplateConstants"; - +import {applyFilters, applySorters, parseQuery, printQuery, wrapFiltersInAnd} from "./graphQLmodifier"; const server = process.env.REACT_APP_REPORTS_SERVER_URL; jsreport.serverUrl = server; @@ -292,7 +292,7 @@ export const GenerateDocument = async ( }) ); } else if (sendType === "x") { - console.log("excel"); + await RenderTemplate(template, bodyshop, false, true); } else if (sendType === "text") { await RenderTemplate(template, bodyshop, false, false, true); @@ -306,6 +306,58 @@ export const GenerateDocuments = async (templates) => { 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 +396,16 @@ 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); + + + // We have no template filters or sorters, so we can just execute the query and return the data + if ((!templateObject?.filters && !templateObject?.filters?.length && !templateObject?.sorters && !templateObject?.sorters?.length)) { + let contextData = {}; if (templateQueryToExecute) { const {data} = await client.query({ query: gql(templateQueryToExecute), @@ -352,6 +413,37 @@ const fetchContextData = async (templateObject, jsrAuth) => { }); contextData = data; } + return {contextData, useShopSpecificTemplate}; + } + + // 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); + } + + 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}; }; @@ -406,4 +498,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..141f83ddd --- /dev/null +++ b/client/src/utils/graphQLmodifier.js @@ -0,0 +1,309 @@ +import {Kind, parse, print, visit} from "graphql"; + +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"} +]; + +export function getOperatorsByType(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); +} + +/** + * 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 6d7991402..b8a47e838 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,21 +9,21 @@ "version": "0.0.1", "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.513.0", + "@aws-sdk/client-ses": "^3.513.0", + "@aws-sdk/credential-provider-node": "^3.513.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.4", "express": "^4.18.2", "firebase-admin": "^12.0.0", "graphql": "^16.8.1", @@ -34,19 +34,19 @@ "json-2-csv": "^5.0.1", "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.9", "phone": "^3.1.42", "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.16.0", + "twilio": "^4.22.0", "uuid": "^9.0.1", "xml2js": "^0.6.2", "xmlbuilder2": "^3.1.1" @@ -152,27 +152,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.513.0.tgz", + "integrity": "sha512-6ZDYjjPqiF59Tm01wz9AqOUiZxcuDKFHvW0Vs2ugx/OoffEkguXdyYKieyykuUEFFT+Qh9oP38v/mQNRhRubEA==", "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.513.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/credential-provider-node": "3.513.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.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", @@ -191,8 +190,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", @@ -211,27 +211,26 @@ } }, "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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.513.0.tgz", + "integrity": "sha512-9pvzyCZGVO283OPAdUkSC4QPY7Sfk9jNqs0gzLQvqM1FggjS1jc6vbMqBcRCte87fXkSPyLo0IEX/kaMH4dEMQ==", "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.513.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/credential-provider-node": "3.513.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.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", @@ -250,8 +249,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", @@ -263,24 +263,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.513.0.tgz", + "integrity": "sha512-621Aj/KrgvKJXXViatb3zM+TdM3n+lodmMbSm+FH37RqYoj36s5FgmXan3Ebu9WBu1lUzKm+a3ZyRWVces52uQ==", "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.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.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", @@ -299,8 +299,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" @@ -310,26 +311,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.513.0.tgz", + "integrity": "sha512-DyncBVOR5aENL6vOeHPllIAwWUaDZdj1aRKVWiNECG4LuuwwjASX0wFLxTRe/4al3Ugob0OLqsrgC2hd59BLJA==", "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.513.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.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", @@ -348,8 +348,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" @@ -358,28 +359,28 @@ "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "*" + "@aws-sdk/credential-provider-node": "^3.513.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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.513.0.tgz", + "integrity": "sha512-reWhX5CO+XZhT8xIdDPnEws0KQNBuvcSY2W7niSPVYfq1mOLkQgYenP/sC/TyvnNuZDzgcmJQdbdAKHuZvMuUQ==", "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.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.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", @@ -398,7 +399,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", @@ -410,15 +411,15 @@ "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "*" + "@aws-sdk/credential-provider-node": "^3.513.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", @@ -430,11 +431,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.511.0.tgz", + "integrity": "sha512-4VUsnLRox8YzxnZwnFrfZM4bL5KKLhsjjjX7oiuLyzFkhauI4HFYt7rTB8YNGphpqAg/Wzw5DBZfO3Bw1iR1HA==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -443,17 +444,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.511.0.tgz", + "integrity": "sha512-y83Gt8GPpgMe/lMFxIq+0G2rbzLTC6lhrDocHUzqcApLD6wet8Esy2iYckSRlJgYY+qsVAzpLrSMtt85DwRPTw==", "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.511.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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.513.0.tgz", + "integrity": "sha512-J9FAmTVHm9RsXxXluXCmJ+crkZPDpdNQhiVrbmPPq989lfr0u33rf1aKFMF5AyHNcNEWeAYKKBQwJJkcsxStIA==", + "dependencies": { + "@aws-sdk/client-sts": "3.513.0", + "@aws-sdk/credential-provider-env": "3.511.0", + "@aws-sdk/credential-provider-process": "3.511.0", + "@aws-sdk/credential-provider-sso": "3.513.0", + "@aws-sdk/credential-provider-web-identity": "3.513.0", + "@aws-sdk/types": "3.511.0", "@smithy/credential-provider-imds": "^2.2.1", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", @@ -465,16 +485,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.513.0.tgz", + "integrity": "sha512-Cp6tYUJ+g8zJxI8vE0A9W6AxRLq3iR2zGGKsrPLNmZkUaHoVaJiNEd+2nL9RwCqDRve+N+Sh3mbZrLiqh3DO6A==", "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.511.0", + "@aws-sdk/credential-provider-http": "3.511.0", + "@aws-sdk/credential-provider-ini": "3.513.0", + "@aws-sdk/credential-provider-process": "3.511.0", + "@aws-sdk/credential-provider-sso": "3.513.0", + "@aws-sdk/credential-provider-web-identity": "3.513.0", + "@aws-sdk/types": "3.511.0", "@smithy/credential-provider-imds": "^2.2.1", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", @@ -486,11 +507,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.511.0.tgz", + "integrity": "sha512-88hLUPqcTwjSubPS+34ZfmglnKeLny8GbmZsyllk96l26PmDTAqo5RScSA8BWxL0l5pRRWGtcrFyts+oibHIuQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", "@smithy/types": "^2.9.1", @@ -501,13 +522,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.513.0.tgz", + "integrity": "sha512-q9rRwRWVut97+hnc0Yt77tGeKoPLLDpKKVpVGC6e+EQHlXM4H6oq2VGLgXYJPA9HpMJ3t5zmmgHxEafYeFZo+w==", "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.513.0", + "@aws-sdk/token-providers": "3.513.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", "@smithy/types": "^2.9.1", @@ -518,12 +539,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.513.0.tgz", + "integrity": "sha512-0EZUQhbDaV3jxvIjcWEGiGmioFS0vEvUxaJrMgeRLUo9njZfLZ4VaEMsqPnZ9rMz2w9CxfpDeObEQlDzYeGRgA==", "dependencies": { - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/client-sts": "3.513.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -533,11 +554,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.511.0.tgz", + "integrity": "sha512-DbBzQP/6woSHR/+g9dHN3YiYaLIqFw9u8lQFMxi3rT3hqITFVYLzzXtEaHjDD6/is56pNT84CIKbyJ6/gY5d1Q==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -547,11 +568,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.511.0.tgz", + "integrity": "sha512-EYU9dBlJXvQcCsM2Tfgi0NQoXrqovfDv/fDy8oGJgZFrgNuHDti8tdVVxeJTUJNEAF67xlDl5o+rWEkKthkYGQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, @@ -560,11 +581,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.511.0.tgz", + "integrity": "sha512-PlNPCV/6zpDVdNx1K69xDTh/wPNU4WyP4qa6hUo2/+4/PNG5HI9xbCWtpb4RjhdTRw6qDtkBNcPICHbtWx5aHg==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -573,30 +594,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.511.0.tgz", + "integrity": "sha512-eLs+CxP2QCXh3tCGYCdAml3oyWj8MSIwKbH+8rKw0k/5vmY1YJDBy526whOxx61ivhz2e0muuijN4X5EZZ2Pnw==", "dependencies": { - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -606,11 +610,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.511.0.tgz", + "integrity": "sha512-RzBLSNaRd4iEkQyEGfiSNvSnWU/x23rsiFgA9tqYFA0Vqx7YmzSWC8QBUxpwybB8HkbbL9wNVKQqTbhI3mYneQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/types": "^2.9.1", "@smithy/util-config-provider": "^2.2.1", @@ -622,12 +626,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.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.513.0.tgz", + "integrity": "sha512-S27iFzj3dVRw1q+xLtqTGZOfYG95OwvTN7crvS2daqSYfcWN+dhEPzQJdDvGaAnAI45bWm8rppH/EYzrlxeZoA==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.502.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/client-sso-oidc": "3.513.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", "@smithy/types": "^2.9.1", @@ -638,9 +642,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.511.0.tgz", + "integrity": "sha512-P03ufufxmkvd7nO46oOeEqYIMPJ8qMCKxAsfJk1JBVPQ1XctVntbail4/UFnrnzij8DTl4Mk/D62uGo7+RolXA==", "dependencies": { "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -650,11 +654,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.511.0.tgz", + "integrity": "sha512-J/5hsscJkg2pAOdLx1YKlyMCk5lFRxRxEtup9xipzOxVBlqOIE72Tuu31fbxSlF8XzO/AuCJcZL4m1v098K9oA==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "@smithy/util-endpoints": "^1.1.1", "tslib": "^2.5.0" @@ -675,22 +679,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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.511.0.tgz", + "integrity": "sha512-5LuESdwtIcA10aHcX7pde7aCIijcyTPBXFuXmFlDTgm/naAayQxelQDpvgbzuzGLgePf8eTyyhDKhzwPZ2EqiQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.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.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.511.0.tgz", + "integrity": "sha512-UopdlRvYY5mxlS4wwFv+QAWL6/T302wmoQj7i+RY+c/D3Ej3PKBb/mW3r2wEOgZLJmPpeeM1SYMk+rVmsW1rqw==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1230,9 +1234,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", @@ -1626,9 +1630,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", @@ -2408,11 +2412,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" }, @@ -2420,14 +2423,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", @@ -3023,14 +3018,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.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.4.tgz", + "integrity": "sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/duplexer": { @@ -4777,9 +4772,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" }, @@ -4920,9 +4915,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.9", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.9.tgz", + "integrity": "sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==", "engines": { "node": ">=6.0.0" } @@ -6319,9 +6314,9 @@ } }, "node_modules/stripe": { - "version": "14.14.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.14.0.tgz", - "integrity": "sha512-P6lvKHxgDzZXto9VMstG1ucv4Ls0U9nOoQhVZABXJ33kRD7zMwkBy5Y4c3BO59O230uSTkOFPLh87YxVzkp0Mg==", + "version": "14.16.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.16.0.tgz", + "integrity": "sha512-1gOr2LzafWV84cPIO5Md/QPh4XVPLKULVuRpBVOV3Plq3seiHmg/eeOktX+hDl8jpNZuORHYaUJGrNqrABLwdg==", "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" @@ -6614,9 +6609,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 ca1601618..c1dd793ed 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.513.0", + "@aws-sdk/client-ses": "^3.513.0", + "@aws-sdk/credential-provider-node": "^3.513.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.4", "express": "^4.18.2", "firebase-admin": "^12.0.0", "graphql": "^16.8.1", @@ -43,19 +43,19 @@ "json-2-csv": "^5.0.1", "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.9", "phone": "^3.1.42", "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.16.0", + "twilio": "^4.22.0", "uuid": "^9.0.1", "xml2js": "^0.6.2", "xmlbuilder2": "^3.1.1"