From d5d0040871d97ad1a64d7560ba3e9a9296270b0b Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 30 Nov 2025 00:13:52 +0000 Subject: [PATCH 01/11] Added scroll box for custom scroll bars. --- .../FilamentStocks/FilamentStockInfo.jsx | 5 +++-- .../DocumentJobs/DocumentJobInfo.jsx | 5 +++-- .../DocumentPrinters/DocumentPrinterInfo.jsx | 5 +++-- .../DocumentSizes/DocumentSizeInfo.jsx | 5 +++-- .../DocumentTemplateDesign.jsx | 5 +++-- .../DocumentTemplateInfo.jsx | 5 +++-- .../Management/Filaments/FilamentInfo.jsx | 5 +++-- .../Dashboard/Management/Files/FileInfo.jsx | 5 +++-- .../Dashboard/Management/Hosts/HostInfo.jsx | 5 +++-- .../Management/NoteTypes/NoteTypeInfo.jsx | 5 +++-- .../Dashboard/Management/Notes/NoteInfo.jsx | 5 +++-- .../Dashboard/Management/Parts/PartInfo.jsx | 5 +++-- .../Management/Products/ProductInfo.jsx | 5 +++-- .../Dashboard/Management/Users/UserInfo.jsx | 5 +++-- .../Management/Vendors/VendorInfo.jsx | 5 +++-- .../Production/GCodeFiles/GCodeFileInfo.jsx | 5 +++-- .../Dashboard/Production/Jobs/JobInfo.jsx | 5 +++-- .../Production/Printers/ControlPrinter.jsx | 5 +++-- .../Production/Printers/PrinterInfo.jsx | 5 +++-- src/components/Dashboard/common/ScrollBox.jsx | 20 +++++++++++++++++++ 20 files changed, 77 insertions(+), 38 deletions(-) create mode 100644 src/components/Dashboard/common/ScrollBox.jsx diff --git a/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx b/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx index ff6a44b..39cc9a9 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx @@ -18,6 +18,7 @@ import NoteIcon from '../../../Icons/NoteIcon' import AuditLogIcon from '../../../Icons/AuditLogIcon' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder' import DocumentPrintButton from '../../common/DocumentPrintButton' +import ScrollBox from '../../common/ScrollBox' const FilamentStockInfo = () => { const location = useLocation() @@ -117,7 +118,7 @@ const FilamentStockInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/DocumentJobs/DocumentJobInfo.jsx b/src/components/Dashboard/Management/DocumentJobs/DocumentJobInfo.jsx index 68672a3..e802967 100644 --- a/src/components/Dashboard/Management/DocumentJobs/DocumentJobInfo.jsx +++ b/src/components/Dashboard/Management/DocumentJobs/DocumentJobInfo.jsx @@ -20,6 +20,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('DocumentJobInfo') log.setLevel(config.logLevel) @@ -120,7 +121,7 @@ const DocumentJobInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/DocumentPrinters/DocumentPrinterInfo.jsx b/src/components/Dashboard/Management/DocumentPrinters/DocumentPrinterInfo.jsx index 1c92af7..57d6308 100644 --- a/src/components/Dashboard/Management/DocumentPrinters/DocumentPrinterInfo.jsx +++ b/src/components/Dashboard/Management/DocumentPrinters/DocumentPrinterInfo.jsx @@ -20,6 +20,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('DocumentPrinterInfo') log.setLevel(config.logLevel) @@ -129,7 +130,7 @@ const DocumentPrinterInfo = () => { -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/DocumentSizes/DocumentSizeInfo.jsx b/src/components/Dashboard/Management/DocumentSizes/DocumentSizeInfo.jsx index 2ca40a4..62ba2c3 100644 --- a/src/components/Dashboard/Management/DocumentSizes/DocumentSizeInfo.jsx +++ b/src/components/Dashboard/Management/DocumentSizes/DocumentSizeInfo.jsx @@ -20,6 +20,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('DocumentSizeInfo') log.setLevel(config.logLevel) @@ -120,7 +121,7 @@ const DocumentSizeInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateDesign.jsx b/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateDesign.jsx index 071a9d8..91e1f52 100644 --- a/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateDesign.jsx +++ b/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateDesign.jsx @@ -13,6 +13,7 @@ import EditButtons from '../../common/EditButtons.jsx' import LockIndicator from '../../common/LockIndicator.jsx' import ActionHandler from '../../common/ActionHandler.jsx' import ObjectActions from '../../common/ObjectActions.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' import TemplateEditor from '../../common/TemplateEditor.jsx' @@ -122,7 +123,7 @@ const DocumentTemplateDesign = () => { -
+ { -
+ ) } diff --git a/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateInfo.jsx b/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateInfo.jsx index c339114..06967a9 100644 --- a/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateInfo.jsx +++ b/src/components/Dashboard/Management/DocumentTemplates/DocumentTemplateInfo.jsx @@ -20,6 +20,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('DocumentTemplateInfo') log.setLevel(config.logLevel) @@ -126,7 +127,7 @@ const DocumentTemplateInfo = () => { -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx b/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx index e061ac3..d6dcfc5 100644 --- a/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx +++ b/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx @@ -21,6 +21,7 @@ import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import FilamentIcon from '../../../Icons/FilamentIcon.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('FilamentInfo') log.setLevel(config.logLevel) @@ -126,7 +127,7 @@ const FilamentInfo = () => { -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Files/FileInfo.jsx b/src/components/Dashboard/Management/Files/FileInfo.jsx index e45eebc..b5ad68b 100644 --- a/src/components/Dashboard/Management/Files/FileInfo.jsx +++ b/src/components/Dashboard/Management/Files/FileInfo.jsx @@ -23,6 +23,7 @@ import FileIcon from '../../../Icons/FileIcon.jsx' import FilePreview from '../../common/FilePreview.jsx' import MissingPlaceholder from '../../common/MissingPlaceholder.jsx' import { ApiServerContext } from '../../context/ApiServerContext.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('FileInfo') log.setLevel(config.logLevel) @@ -130,7 +131,7 @@ const FileInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Hosts/HostInfo.jsx b/src/components/Dashboard/Management/Hosts/HostInfo.jsx index 8ee402a..95b2490 100644 --- a/src/components/Dashboard/Management/Hosts/HostInfo.jsx +++ b/src/components/Dashboard/Management/Hosts/HostInfo.jsx @@ -23,6 +23,7 @@ import HostOTP from './HostOtp.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' import PrinterIcon from '../../../Icons/PrinterIcon.jsx' import DocumentPrinterIcon from '../../../Icons/DocumentPrinterIcon.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('HostInfo') log.setLevel(config.logLevel) @@ -132,7 +133,7 @@ const HostInfo = () => { -
+ { )} -
+ { const location = useLocation() @@ -109,7 +110,7 @@ const NoteTypeInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Notes/NoteInfo.jsx b/src/components/Dashboard/Management/Notes/NoteInfo.jsx index 95753df..c8206f7 100644 --- a/src/components/Dashboard/Management/Notes/NoteInfo.jsx +++ b/src/components/Dashboard/Management/Notes/NoteInfo.jsx @@ -19,6 +19,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('NoteInfo') log.setLevel(config.logLevel) @@ -118,7 +119,7 @@ const NoteInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Parts/PartInfo.jsx b/src/components/Dashboard/Management/Parts/PartInfo.jsx index 4576449..99eceea 100644 --- a/src/components/Dashboard/Management/Parts/PartInfo.jsx +++ b/src/components/Dashboard/Management/Parts/PartInfo.jsx @@ -17,6 +17,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const PartInfo = () => { const location = useLocation() @@ -109,7 +110,7 @@ const PartInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Products/ProductInfo.jsx b/src/components/Dashboard/Management/Products/ProductInfo.jsx index d8c1380..86283c6 100644 --- a/src/components/Dashboard/Management/Products/ProductInfo.jsx +++ b/src/components/Dashboard/Management/Products/ProductInfo.jsx @@ -18,6 +18,7 @@ import ActionHandler from '../../common/ActionHandler.jsx' import ObjectActions from '../../common/ObjectActions.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const ProductInfo = () => { const location = useLocation() @@ -111,7 +112,7 @@ const ProductInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Users/UserInfo.jsx b/src/components/Dashboard/Management/Users/UserInfo.jsx index 87f79ce..c8595af 100644 --- a/src/components/Dashboard/Management/Users/UserInfo.jsx +++ b/src/components/Dashboard/Management/Users/UserInfo.jsx @@ -18,6 +18,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const UserInfo = () => { const location = useLocation() @@ -110,7 +111,7 @@ const UserInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Management/Vendors/VendorInfo.jsx b/src/components/Dashboard/Management/Vendors/VendorInfo.jsx index b525f82..b77721d 100644 --- a/src/components/Dashboard/Management/Vendors/VendorInfo.jsx +++ b/src/components/Dashboard/Management/Vendors/VendorInfo.jsx @@ -19,6 +19,7 @@ import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('VendorInfo') log.setLevel(config.logLevel) @@ -118,7 +119,7 @@ const VendorInfo = () => { /> -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Production/GCodeFiles/GCodeFileInfo.jsx b/src/components/Dashboard/Production/GCodeFiles/GCodeFileInfo.jsx index e4b9c7b..42daae2 100644 --- a/src/components/Dashboard/Production/GCodeFiles/GCodeFileInfo.jsx +++ b/src/components/Dashboard/Production/GCodeFiles/GCodeFileInfo.jsx @@ -23,6 +23,7 @@ import EyeIcon from '../../../Icons/EyeIcon.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' import MissingPlaceholder from '../../common/MissingPlaceholder.jsx' import FilePreview from '../../common/FilePreview.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('GCodeFileInfo') log.setLevel(config.logLevel) @@ -128,7 +129,7 @@ const GCodeFileInfo = () => { -
+ { )} -
+ ) diff --git a/src/components/Dashboard/Production/Jobs/JobInfo.jsx b/src/components/Dashboard/Production/Jobs/JobInfo.jsx index 1f20c7d..24799d1 100644 --- a/src/components/Dashboard/Production/Jobs/JobInfo.jsx +++ b/src/components/Dashboard/Production/Jobs/JobInfo.jsx @@ -22,6 +22,7 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx' import JobIcon from '../../../Icons/JobIcon.jsx' import DocumentPrintButton from '../../common/DocumentPrintButton.jsx' import DeployJob from './DeployJob.jsx' +import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('JobInfo') log.setLevel(config.logLevel) @@ -132,7 +133,7 @@ const JobInfo = () => { -
+ { )} -
+ { -
+ { -
+ { -
+ { )} -
+ ) diff --git a/src/components/Dashboard/common/ScrollBox.jsx b/src/components/Dashboard/common/ScrollBox.jsx new file mode 100644 index 0000000..b738f11 --- /dev/null +++ b/src/components/Dashboard/common/ScrollBox.jsx @@ -0,0 +1,20 @@ +import PropTypes from 'prop-types' +import SimpleBar from 'simplebar-react' +import 'simplebar-react/dist/simplebar.min.css' + +const ScrollBox = ({ children, style, ...rest }) => { + return ( +
+ + {children} + +
+ ) +} + +ScrollBox.propTypes = { + children: PropTypes.node, + style: PropTypes.object +} + +export default ScrollBox From ba1bba1a24630c08a55c0a3fd05a49fd0bb5d37c Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 30 Nov 2025 00:15:34 +0000 Subject: [PATCH 02/11] Add 'unconsumed' state to StateTag component with corresponding success status --- src/components/Dashboard/common/StateTag.jsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/Dashboard/common/StateTag.jsx b/src/components/Dashboard/common/StateTag.jsx index cc8a320..331f292 100644 --- a/src/components/Dashboard/common/StateTag.jsx +++ b/src/components/Dashboard/common/StateTag.jsx @@ -92,6 +92,10 @@ const StateTag = ({ state, showBadge = true, style = {} }) => { status = 'warning' text = 'Used' break + case 'unconsumed': + status = 'success' + text = 'Unconsumed' + break default: status = 'default' text = state || 'Unknown' From 59632c30605d5c980ec1dc14003d3d836d4c6f69 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 30 Nov 2025 00:15:44 +0000 Subject: [PATCH 03/11] Set FilamentStockInfo component's disabled prop to true --- .../Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx b/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx index 39cc9a9..d1f80c2 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx @@ -113,7 +113,7 @@ const FilamentStockInfo = () => { }} editLoading={objectFormState.editLoading} formValid={objectFormState.formValid} - disabled={objectFormState.lock?.locked || objectFormState.loading} + disabled={true} loading={objectFormState.editLoading} /> From 5ac11dc59e2d92a7c4c188c75b0fcf2fab909f60 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 30 Nov 2025 00:17:13 +0000 Subject: [PATCH 04/11] Small macOS fix. --- src/components/Dashboard/common/DashboardWindowButtons.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Dashboard/common/DashboardWindowButtons.jsx b/src/components/Dashboard/common/DashboardWindowButtons.jsx index 39158ab..fc90f08 100644 --- a/src/components/Dashboard/common/DashboardWindowButtons.jsx +++ b/src/components/Dashboard/common/DashboardWindowButtons.jsx @@ -36,7 +36,7 @@ const DashboardWindowButtons = () => { {platform == 'darwin' ? ( isFullScreen == false ? ( -
+
) : null ) : (
From 15a9764762b5dda5e054d0352ba77288384094d8 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 30 Nov 2025 00:17:29 +0000 Subject: [PATCH 05/11] More small macOS fixes. --- src/components/Dashboard/common/DashboardNavigation.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Dashboard/common/DashboardNavigation.jsx b/src/components/Dashboard/common/DashboardNavigation.jsx index 670fe75..3cbf9f6 100644 --- a/src/components/Dashboard/common/DashboardNavigation.jsx +++ b/src/components/Dashboard/common/DashboardNavigation.jsx @@ -153,7 +153,7 @@ const DashboardNavigation = () => { fontSize: '46px', height: '16px', marginLeft: '15px', - marginRight: '5px' + marginRight: '8px' }} /> )} @@ -313,7 +313,7 @@ const DashboardNavigation = () => { {isElectron ? ( {navigationContents} From 05d7864da8222397d9beb8d3913abb690e6c17e8 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Tue, 2 Dec 2025 18:29:09 +0000 Subject: [PATCH 06/11] A lot of UI fixes updated packages etc. --- assets/icons/controlicon.svg | 7 +- assets/icons/purchaseordericon.svg | 11 + assets/stylesheets/App.css | 27 + package.json | 1 + src/App.jsx | 75 +- .../FilamentStocks/LoadFilamentStock.jsx | 2 +- .../Inventory/PartStocks/NewPartStock.jsx | 202 ++- .../Inventory/PartStocks/PartStockInfo.jsx | 209 +++ .../Dashboard/Inventory/StockAudits.jsx | 194 +-- .../Inventory/StockAudits/NewStockAudit.jsx | 107 ++ .../Inventory/StockAudits/StockAuditInfo.jsx | 387 +++--- .../Management/Products/ProductInfo.jsx | 96 +- .../Production/GCodeFiles/GCodeFileInfo.jsx | 27 +- .../Production/Printers/ControlPrinter.jsx | 9 +- .../Production/SubJobs/SubJobInfo.jsx | 208 +++ .../Dashboard/common/AlertsDisplay.jsx | 201 ++- .../Dashboard/common/FileUpload.jsx | 36 +- src/components/Dashboard/common/MiscId.jsx | 43 + .../Dashboard/common/NewObjectForm.jsx | 6 +- .../Dashboard/common/ObjectActions.jsx | 35 +- .../Dashboard/common/ObjectChildTable.jsx | 469 +++++++ .../Dashboard/common/ObjectForm.jsx | 54 +- .../Dashboard/common/ObjectProperty.jsx | 54 +- .../Dashboard/common/ObjectTypeSelect.jsx | 12 +- .../common/PrinterTemperaturePanel.jsx | 2 +- .../Dashboard/common/PropertyChanges.jsx | 2 + .../Dashboard/common/StateDisplay.jsx | 14 +- .../Dashboard/common/TemplateEditor.jsx | 4 +- .../Dashboard/context/ActionsModalContext.jsx | 316 +++++ .../Dashboard/context/ApiServerContext.jsx | 28 +- .../Dashboard/context/MessageContext.jsx | 58 + src/components/Icons/PurchaseOrderIcon.jsx | 8 + src/database/ObjectModels.js | 3 + src/database/models/DocumentJob.js | 28 +- src/database/models/DocumentPrinter.js | 43 +- src/database/models/DocumentSize.js | 28 +- src/database/models/DocumentTemplate.js | 28 +- src/database/models/Filament.js | 28 +- src/database/models/File.js | 28 +- src/database/models/GCodeFile.js | 77 +- src/database/models/Host.js | 62 +- src/database/models/Job.js | 67 +- src/database/models/NoteType.js | 28 +- src/database/models/Part.js | 45 +- src/database/models/PartStock.js | 122 +- src/database/models/Printer.js | 69 +- src/database/models/Product.js | 73 +- src/database/models/PurchaseOrder.js | 21 + src/database/models/StockAudit.js | 37 +- src/database/models/SubJob.js | 107 +- src/database/models/Vendor.js | 28 +- src/routes/InventoryRoutes.jsx | 6 + src/routes/ProductionRoutes.jsx | 6 + yarn.lock | 1228 ++++------------- 54 files changed, 3439 insertions(+), 1627 deletions(-) create mode 100644 assets/icons/purchaseordericon.svg create mode 100644 src/components/Dashboard/Inventory/PartStocks/PartStockInfo.jsx create mode 100644 src/components/Dashboard/Inventory/StockAudits/NewStockAudit.jsx create mode 100644 src/components/Dashboard/Production/SubJobs/SubJobInfo.jsx create mode 100644 src/components/Dashboard/common/MiscId.jsx create mode 100644 src/components/Dashboard/common/ObjectChildTable.jsx create mode 100644 src/components/Dashboard/context/ActionsModalContext.jsx create mode 100644 src/components/Dashboard/context/MessageContext.jsx create mode 100644 src/components/Icons/PurchaseOrderIcon.jsx create mode 100644 src/database/models/PurchaseOrder.js diff --git a/assets/icons/controlicon.svg b/assets/icons/controlicon.svg index 8658e38..58005da 100644 --- a/assets/icons/controlicon.svg +++ b/assets/icons/controlicon.svg @@ -1,10 +1,7 @@ - - - - - + + diff --git a/assets/icons/purchaseordericon.svg b/assets/icons/purchaseordericon.svg new file mode 100644 index 0000000..237395f --- /dev/null +++ b/assets/icons/purchaseordericon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css index 6150195..15667e1b 100644 --- a/assets/stylesheets/App.css +++ b/assets/stylesheets/App.css @@ -318,3 +318,30 @@ body { .ant-badge.ant-badge-status { line-height: 18.5px; } + +.simplebar-track.simplebar-vertical { + right: -16px; + width: 8px !important; +} + +.simplebar-scrollbar:before { + background: #78787854 !important; +} + +.printer-alerts-display-popover .ant-popover-inner { + padding: 0 !important; + margin: 0 24px !important; +} + +.child-table-rollups *::-webkit-scrollbar:horizontal { + height: 0px; +} + +.rollup-table .ant-table-container { + border-start-start-radius: 0px !important; + border-start-end-radius: 0px !important; +} + +.rollup-table .ant-table { + border-radius: 0px !important; +} diff --git a/package.json b/package.json index db2c347..28c88f8 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "react-responsive": "^10.0.1", "react-router-dom": "^7.8.2", "remark-gfm": "^4.0.1", + "simplebar-react": "^3.3.2", "socket.io-client": "*", "standard": "^17.1.2", "styled-components": "^6.1.19", diff --git a/src/App.jsx b/src/App.jsx index 96a5dde..7e87bd7 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -13,6 +13,7 @@ import '../assets/stylesheets/App.css' import { PrintServerProvider } from './components/Dashboard/context/PrintServerContext.jsx' import { AuthProvider } from './components/Dashboard/context/AuthContext.jsx' import { SpotlightProvider } from './components/Dashboard/context/SpotlightContext.jsx' +import { ActionsModalProvider } from './components/Dashboard/context/ActionsModalContext.jsx' import { ThemeProvider, @@ -21,6 +22,7 @@ import { import AppError from './components/App/AppError' import { ApiServerProvider } from './components/Dashboard/context/ApiServerContext.jsx' import { ElectronProvider } from './components/Dashboard/context/ElectronContext.jsx' +import { MessageProvider } from './components/Dashboard/context/MessageContext.jsx' import AuthCallback from './components/App/AuthCallback.jsx' import { @@ -53,42 +55,49 @@ const AppContent = () => { - - ( - + + + ( + + )} /> - )} + } /> - } - /> - } /> - } /> - } - > - {ProductionRoutes} - {InventoryRoutes} - {ManagementRoutes} - {DeveloperRoutes} - - } /> - } - /> - + } /> + } + > + {ProductionRoutes} + {InventoryRoutes} + {ManagementRoutes} + {DeveloperRoutes} + + + } + /> + + + diff --git a/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx b/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx index 72e69dd..d67ca90 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx @@ -202,7 +202,7 @@ const LoadFilamentStock = ({ ) : null} {targetTemperature > 0 && - currentTemperature >= targetTemperature && + currentTemperature >= targetTemperature - 2 && filamentSensorDetected == false ? ( { - const [form] = Form.useForm() - const [parts, setParts] = useState([]) - const [loading, setLoading] = useState(false) - - useEffect(() => { - // Reset form when reset prop changes - if (reset) { - form.resetFields() - } - }, [reset, form]) - - useEffect(() => { - // Fetch parts for the select dropdown - const fetchParts = async () => { - try { - const response = await axios.get(`${config.backendUrl}/parts`, { - headers: { - Accept: 'application/json' - }, - withCredentials: true - }) - setParts(response.data) - } catch (error) { - console.error('Error fetching parts:', error) - } - } - - fetchParts() - }, []) - - const onFinish = async (values) => { - setLoading(true) - try { - await axios.post( - `${config.backendUrl}/partstocks`, - { - part: values.part, - startingLots: values.startingLots, - currentLots: values.startingLots, // Initially current lots equals starting lots - notes: values.notes - }, - { - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json' - }, - withCredentials: true - } - ) - onOk() - } catch (error) { - console.error('Error creating part stock:', error) - } finally { - setLoading(false) - } - } + const [currentStep, setCurrentStep] = useState(0) + const isMobile = useMediaQuery({ maxWidth: 768 }) return ( -
- - + + + } + placeholder='Search actions...' + size='large' + value={query} + onChange={(e) => setQuery(e.target.value)} + onKeyDown={handleKeyDown} + /> + + {filteredActions.length > 0 && ( +
+ + getVisibleDisabled(action) + )} + renderItem={(action, index) => { + const Icon = action.icon + const disabled = getActionDisabled(action) + + let shortcutText = '' + if (index === 0) { + shortcutText = 'ENTER' + } else if (index <= 9) { + shortcutText = index.toString() + } + + return ( + !disabled && runAction(action)} + style={{ + cursor: disabled ? 'not-allowed' : 'pointer', + opacity: disabled ? 0.5 : 1 + }} + > + + + {Icon ? : null} + + + {action.fullLabel || action.label || action.name} + + + + + {action.danger && Danger} + {shortcutText && {shortcutText}} + + + + ) + }} + /> +
+ )} + + + {children} + + ) +} + +ActionsModalProvider.propTypes = { + children: PropTypes.node.isRequired +} + +const useActionsModal = () => useContext(ActionsModalContext) + +// eslint-disable-next-line react-refresh/only-export-components +export { ActionsModalProvider, ActionsModalContext, useActionsModal } diff --git a/src/components/Dashboard/context/ApiServerContext.jsx b/src/components/Dashboard/context/ApiServerContext.jsx index 3f09ee6..5a1dcdf 100644 --- a/src/components/Dashboard/context/ApiServerContext.jsx +++ b/src/components/Dashboard/context/ApiServerContext.jsx @@ -70,6 +70,11 @@ const ApiServerProvider = ({ children }) => { [userProfile?._id] ) + const clearSubscriptions = useCallback(() => { + subscribedCallbacksRef.current.clear() + subscribedLockCallbacksRef.current.clear() + }, []) + const connectToServer = useCallback(() => { if (token && authenticated == true) { logger.debug('Token is available, connecting to api server...') @@ -101,6 +106,7 @@ const ApiServerProvider = ({ children }) => { newSocket.on('disconnect', () => { logger.debug('Api Server disconnected') setError('Api Server disconnected') + clearSubscriptions() setConnected(false) }) @@ -108,16 +114,10 @@ const ApiServerProvider = ({ children }) => { logger.error('Api Server connection error:', err) messageApi.error('Api Server connection error: ' + err.message) setError('Api Server connection error') + clearSubscriptions() setConnected(false) }) - newSocket.on('bridge.notification', (data) => { - notificationApi[data.type]({ - title: data.title, - message: data.message - }) - }) - newSocket.on('error', (err) => { logger.error('Api Server error:', err) setError('Api Server error') @@ -445,6 +445,7 @@ const ApiServerProvider = ({ children }) => { (id, objectType, eventType, callback) => { if (socketRef.current && socketRef.current.connected == true) { const callbacksRefKey = `${objectType}:${id}:events:${eventType}` + // Remove callback from the subscribed callbacks map if (subscribedCallbacksRef.current.has(callbacksRefKey)) { const callbacks = subscribedCallbacksRef.current @@ -452,6 +453,7 @@ const ApiServerProvider = ({ children }) => { .filter((cb) => cb !== callback) if (callbacks.length === 0) { subscribedCallbacksRef.current.delete(callbacksRefKey) + console.log('Unsubscribing from object event:', callbacksRefKey) socketRef.current.emit('unsubscribeObjectEvent', { _id: id, objectType, @@ -479,6 +481,7 @@ const ApiServerProvider = ({ children }) => { subscribedCallbacksRef.current.get(callbacksRefKey).length if (callbacksLength <= 0) { + console.log('Subscribing to object event:', callbacksRefKey) socketRef.current.emit( 'subscribeToObjectEvent', { @@ -932,7 +935,11 @@ const ApiServerProvider = ({ children }) => { } // Upload file to the API - const uploadFile = async (file, additionalData = {}) => { + const uploadFile = async ( + file, + additionalData = {}, + progressCallback = null + ) => { const uploadUrl = `${config.backendUrl}/files` logger.debug('Uploading file:', file.name, 'to:', uploadUrl) @@ -955,6 +962,9 @@ const ApiServerProvider = ({ children }) => { (progressEvent.loaded * 100) / progressEvent.total ) logger.debug(`Upload progress: ${percentCompleted}%`) + if (progressCallback) { + progressCallback(percentCompleted) + } } }) @@ -963,7 +973,7 @@ const ApiServerProvider = ({ children }) => { } catch (err) { console.error('File upload error:', err) showError(err, () => { - uploadFile(file, additionalData) + uploadFile(file, additionalData, progressCallback) }) return null } diff --git a/src/components/Dashboard/context/MessageContext.jsx b/src/components/Dashboard/context/MessageContext.jsx new file mode 100644 index 0000000..5f0cfd5 --- /dev/null +++ b/src/components/Dashboard/context/MessageContext.jsx @@ -0,0 +1,58 @@ +import { createContext, useContext } from 'react' +import PropTypes from 'prop-types' +import { message } from 'antd' + +const MessageContext = createContext() + +export const MessageProvider = ({ children }) => { + const [msgApi, contextHolder] = message.useMessage() + + const showMessage = (type, content, options = {}) => { + return msgApi.open({ + type, + content, + ...options + }) + } + + const showSuccess = (content, options = {}) => + showMessage('success', content, options) + const showInfo = (content, options = {}) => + showMessage('info', content, options) + const showWarning = (content, options = {}) => + showMessage('warning', content, options) + const showError = (content, options = {}) => + showMessage('error', content, options) + const showLoading = (content, options = {}) => + showMessage('loading', content, options) + + return ( + + {contextHolder} + {children} + + ) +} + +MessageProvider.propTypes = { + children: PropTypes.node.isRequired +} + +export const useMessageContext = () => { + const context = useContext(MessageContext) + if (!context) { + throw new Error('useMessageContext must be used within a MessageProvider') + } + return context +} + +export { MessageContext } diff --git a/src/components/Icons/PurchaseOrderIcon.jsx b/src/components/Icons/PurchaseOrderIcon.jsx new file mode 100644 index 0000000..25bdb16 --- /dev/null +++ b/src/components/Icons/PurchaseOrderIcon.jsx @@ -0,0 +1,8 @@ +import Icon from '@ant-design/icons' +import CustomIconSvg from '../../../assets/icons/purchaseordericon.svg?react' + +const PurchaseOrderIcon = (props) => ( + +) + +export default PurchaseOrderIcon diff --git a/src/database/ObjectModels.js b/src/database/ObjectModels.js index f0e7ded..5833024 100644 --- a/src/database/ObjectModels.js +++ b/src/database/ObjectModels.js @@ -15,6 +15,7 @@ import { StockEvent } from './models/StockEvent' import { StockAudit } from './models/StockAudit' import { PartStock } from './models/PartStock' import { ProductStock } from './models/ProductStock' +import { PurchaseOrder } from './models/PurchaseOrder' import { AuditLog } from './models/AuditLog' import { User } from './models/User' import { NoteType } from './models/NoteType' @@ -43,6 +44,7 @@ export const objectModels = [ StockAudit, PartStock, ProductStock, + PurchaseOrder, AuditLog, User, NoteType, @@ -72,6 +74,7 @@ export { StockAudit, PartStock, ProductStock, + PurchaseOrder, AuditLog, User, NoteType, diff --git a/src/database/models/DocumentJob.js b/src/database/models/DocumentJob.js index 0e67654..68d8732 100644 --- a/src/database/models/DocumentJob.js +++ b/src/database/models/DocumentJob.js @@ -1,6 +1,8 @@ import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import DocumentJobIcon from '../../components/Icons/DocumentJobIcon' import dayjs from 'dayjs' @@ -33,7 +35,31 @@ export const DocumentJob = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=edit` + `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: ['name', '_id', 'state', 'createdAt', 'updatedAt'], diff --git a/src/database/models/DocumentPrinter.js b/src/database/models/DocumentPrinter.js index ac34d60..eb723af 100644 --- a/src/database/models/DocumentPrinter.js +++ b/src/database/models/DocumentPrinter.js @@ -2,6 +2,8 @@ import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' import DocumentPrinterIcon from '../../components/Icons/DocumentPrinterIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' export const DocumentPrinter = { name: 'documentPrinter', @@ -32,7 +34,31 @@ export const DocumentPrinter = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=edit` + `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: [ @@ -101,6 +127,21 @@ export const DocumentPrinter = { type: 'bool', required: true }, + { + name: 'vendor', + label: 'Vendor', + type: 'object', + objectType: 'vendor', + required: false + }, + { + name: 'vendor._id', + label: 'Vendor ID', + type: 'id', + objectType: 'vendor', + showHyperlink: true, + readOnly: true + }, { name: 'host', label: 'Host', diff --git a/src/database/models/DocumentSize.js b/src/database/models/DocumentSize.js index d6bc273..8ad4d4b 100644 --- a/src/database/models/DocumentSize.js +++ b/src/database/models/DocumentSize.js @@ -1,6 +1,8 @@ import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import DocumentSizeIcon from '../../components/Icons/DocumentSizeIcon' export const DocumentSize = { @@ -32,7 +34,31 @@ export const DocumentSize = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=edit` + `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: [ diff --git a/src/database/models/DocumentTemplate.js b/src/database/models/DocumentTemplate.js index babcffe..04decd8 100644 --- a/src/database/models/DocumentTemplate.js +++ b/src/database/models/DocumentTemplate.js @@ -1,6 +1,8 @@ import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import DesignIcon from '../../components/Icons/DesignIcon' import DocumentTemplateIcon from '../../components/Icons/DocumentTemplateIcon' @@ -41,7 +43,31 @@ export const DocumentTemplate = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=edit` + `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: [ diff --git a/src/database/models/Filament.js b/src/database/models/Filament.js index 55032b9..63003be 100644 --- a/src/database/models/Filament.js +++ b/src/database/models/Filament.js @@ -2,6 +2,8 @@ import EditIcon from '../../components/Icons/EditIcon' import FilamentIcon from '../../components/Icons/FilamentIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' export const Filament = { name: 'filament', @@ -30,7 +32,31 @@ export const Filament = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/filaments/info?filamentId=${_id}&action=edit` + `/dashboard/management/filaments/info?filamentId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/filaments/info?filamentId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/filaments/info?filamentId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: [ diff --git a/src/database/models/File.js b/src/database/models/File.js index 279759b..06a6033 100644 --- a/src/database/models/File.js +++ b/src/database/models/File.js @@ -2,6 +2,8 @@ import DownloadIcon from '../../components/Icons/DownloadIcon' import FileIcon from '../../components/Icons/FileIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import BinIcon from '../../components/Icons/BinIcon' @@ -31,7 +33,31 @@ export const File = { label: 'Edit', row: true, icon: EditIcon, - url: (_id) => `/dashboard/management/files/info?fileId=${_id}&action=edit` + url: (_id) => `/dashboard/management/files/info?fileId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/files/info?fileId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/files/info?fileId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } }, { name: 'download', diff --git a/src/database/models/GCodeFile.js b/src/database/models/GCodeFile.js index c6baf7a..db83212 100644 --- a/src/database/models/GCodeFile.js +++ b/src/database/models/GCodeFile.js @@ -1,5 +1,7 @@ import DownloadIcon from '../../components/Icons/DownloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import GCodeFileIcon from '../../components/Icons/GCodeFileIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' @@ -39,7 +41,31 @@ export const GCodeFile = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=edit` + `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], @@ -127,9 +153,11 @@ export const GCodeFile = { name: 'cost', label: 'Cost', type: 'number', + roundNumber: 2, value: (objectData) => { return ( - objectData?.file?.metaData?.filamentUsedG * objectData?.filament?.cost + objectData?.file?.metaData?.filamentUsedG * + (objectData?.filament?.cost / 1000) ) }, readOnly: true, @@ -196,6 +224,51 @@ export const GCodeFile = { label: 'Print Profile', type: 'text', readOnly: true + }, + { + name: 'parts', + label: 'Parts', + type: 'objectChildren', + objectType: 'part', + properties: [ + { + name: 'part', + label: 'Part', + type: 'object', + objectType: 'part', + required: true + }, + { + name: 'part._id', + label: 'Part ID', + type: 'id', + objectType: 'part', + showHyperlink: true, + value: (objectData) => { + return objectData?.part?._id + } + }, + { + name: 'quantity', + label: 'Quantity', + type: 'number', + required: true + } + ], + rollups: [ + { + name: 'totalQuantity', + label: 'Total', + type: 'number', + property: 'quantity', + value: (objectData) => { + return objectData?.parts?.reduce( + (acc, part) => acc + part.quantity, + 0 + ) + } + } + ] } ] } diff --git a/src/database/models/Host.js b/src/database/models/Host.js index 16b6006..551c6ab 100644 --- a/src/database/models/Host.js +++ b/src/database/models/Host.js @@ -2,6 +2,8 @@ import HostIcon from '../../components/Icons/HostIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import OTPIcon from '../../components/Icons/OTPIcon' export const Host = { @@ -38,7 +40,32 @@ export const Host = { label: 'Edit', row: true, icon: EditIcon, - url: (_id) => `/dashboard/management/hosts/info?hostId=${_id}&action=edit` + url: (_id) => + `/dashboard/management/hosts/info?hostId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/hosts/info?hostId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/hosts/info?hostId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: ['name', '_id', 'state', 'tags', 'connectedAt'], @@ -54,8 +81,8 @@ export const Host = { showCopy: true }, { - name: 'connectedAt', - label: 'Connected At', + name: 'createdAt', + label: 'Created At', type: 'dateTime', readOnly: true }, @@ -67,6 +94,12 @@ export const Host = { columnWidth: 200, columnFixed: 'left' }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + }, { name: 'state', label: 'State', @@ -76,10 +109,10 @@ export const Host = { readOnly: true }, { - name: 'active', - label: 'Active', - type: 'bool', - required: true + name: 'connectedAt', + label: 'Connected At', + type: 'dateTime', + readOnly: true }, { name: 'online', @@ -87,6 +120,13 @@ export const Host = { type: 'bool', readOnly: true }, + { + name: 'active', + label: 'Active', + type: 'bool', + required: true + }, + { name: 'deviceInfo.os', label: 'Operating System', @@ -158,6 +198,14 @@ export const Host = { label: 'Tags', type: 'tags', required: false + }, + { + name: 'files', + label: 'Files', + type: 'objectList', + objectType: 'file', + required: false, + readOnly: true } ] } diff --git a/src/database/models/Job.js b/src/database/models/Job.js index 7569e08..a953596 100644 --- a/src/database/models/Job.js +++ b/src/database/models/Job.js @@ -56,6 +56,12 @@ export const Job = { objectType: 'job', showCopy: true }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true + }, { name: 'state', label: 'State', @@ -65,7 +71,39 @@ export const Job = { showProgress: true, showId: false, showQuantity: false, - columnWidth: 150, + columnWidth: 250, + readOnly: true + }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + }, + { + name: 'quantity', + label: 'Quantity', + type: 'number', + columnWidth: 125, + required: true + }, + { + name: 'startedAt', + label: 'Started At', + type: 'dateTime', + readOnly: true + }, + { + name: 'printers', + label: 'Printers', + type: 'objectList', + objectType: 'printer', + required: true + }, + { + name: 'finishedAt', + label: 'Finished At', + type: 'dateTime', readOnly: true }, { @@ -82,33 +120,6 @@ export const Job = { type: 'id', objectType: 'gcodeFile', showHyperlink: true - }, - { - name: 'quantity', - label: 'Quantity', - type: 'number', - columnWidth: 125, - required: true - }, - { - name: 'createdAt', - label: 'Created At', - type: 'dateTime', - readOnly: true - }, - { - name: 'startedAt', - label: 'Started At', - type: 'dateTime', - readOnly: true - }, - { - name: 'printers', - label: 'Printers', - type: 'objectList', - objectType: 'printer', - required: true, - span: 2 } ] } diff --git a/src/database/models/NoteType.js b/src/database/models/NoteType.js index 6a2cd27..8fc67e3 100644 --- a/src/database/models/NoteType.js +++ b/src/database/models/NoteType.js @@ -2,6 +2,8 @@ import NoteTypeIcon from '../../components/Icons/NoteTypeIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' export const NoteType = { name: 'noteType', @@ -30,7 +32,31 @@ export const NoteType = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=edit` + `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: ['name', '_id', 'color', 'active', 'createdAt', 'updatedAt'], diff --git a/src/database/models/Part.js b/src/database/models/Part.js index 0c56a38..b8f3978 100644 --- a/src/database/models/Part.js +++ b/src/database/models/Part.js @@ -2,6 +2,8 @@ import EditIcon from '../../components/Icons/EditIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import PartIcon from '../../components/Icons/PartIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' export const Part = { name: 'part', @@ -29,7 +31,32 @@ export const Part = { label: 'Edit', row: true, icon: EditIcon, - url: (_id) => `/dashboard/management/parts/info?partId=${_id}&action=edit` + url: (_id) => + `/dashboard/management/parts/info?partId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/parts/info?partId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/parts/info?partId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: [ @@ -71,22 +98,6 @@ export const Part = { type: 'dateTime', readOnly: true }, - - { - name: 'product', - label: 'Product', - type: 'object', - required: true, - objectType: 'product' - }, - { - name: 'product._id', - label: 'Product ID', - type: 'id', - readOnly: true, - showHyperlink: true, - objectType: 'product' - }, { name: 'vendor', label: 'Vendor', diff --git a/src/database/models/PartStock.js b/src/database/models/PartStock.js index 9355acd..0c1ea3a 100644 --- a/src/database/models/PartStock.js +++ b/src/database/models/PartStock.js @@ -2,7 +2,7 @@ import PartStockIcon from '../../components/Icons/PartStockIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' export const PartStock = { - name: 'partstock', + name: 'partStock', label: 'Part Stock', prefix: 'PTS', icon: PartStockIcon, @@ -13,8 +13,124 @@ export const PartStock = { default: true, row: true, icon: InfoCircleIcon, - url: (_id) => `/dashboard/management/partstocks/info?partStockId=${_id}` + url: (_id) => `/dashboard/inventory/partstocks/info?partStockId=${_id}` } ], - url: (id) => `/dashboard/management/partstocks/info?partStockId=${id}` + url: (id) => `/dashboard/inventory/partstocks/info?partStockId=${id}`, + filters: ['_id', 'part', 'startingQuantity', 'currentQuantity'], + sorters: ['part', 'startingQuantity', 'currentQuantity'], + columns: [ + '_id', + 'state', + 'startingQuantity', + 'currentQuantity', + 'part', + 'part._id', + 'createdAt', + 'updatedAt' + ], + properties: [ + { + name: '_id', + label: 'ID', + type: 'id', + objectType: 'partStock', + showCopy: true, + readOnly: true + }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true + }, + { + name: 'state', + label: 'State', + type: 'state', + readOnly: true, + columnWidth: 120 + }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + }, + { + name: 'sourceType', + label: 'Source Type', + type: 'objectType', + readOnly: false, + columnWidth: 200, + required: true, + masterFilter: ['subJob'] + }, + + { + name: 'consumedAt', + label: 'Consumed At', + type: 'dateTime', + readOnly: true + }, + { + name: 'part', + label: 'Part', + type: 'object', + objectType: 'part', + required: true + }, + { + name: 'part._id', + label: 'Part ID', + type: 'id', + objectType: 'part', + readOnly: true, + showHyperlink: true + }, + + { + name: 'source', + label: 'Source', + type: 'object', + readOnly: false, + required: true, + columnWidth: 200, + objectType: (objectData) => { + return objectData?.sourceType + } + }, + { + name: 'source._id', + label: 'Source ID', + type: 'id', + readOnly: true, + columnWidth: 200, + objectType: (objectData) => { + return objectData?.sourceType + } + }, + { + name: 'currentQuantity', + label: 'Current Quantity', + type: 'number', + readOnly: true, + columnWidth: 200, + required: true, + value: (objectData) => { + if (objectData?.state?.type === 'new') { + return objectData?.startingQuantity + } else { + return objectData.currentQuantity + } + } + }, + { + name: 'startingQuantity', + label: 'Starting Quantity', + type: 'number', + columnWidth: 200, + required: true + } + ] } diff --git a/src/database/models/Printer.js b/src/database/models/Printer.js index b1fcf43..094c4d9 100644 --- a/src/database/models/Printer.js +++ b/src/database/models/Printer.js @@ -2,10 +2,14 @@ import PrinterIcon from '../../components/Icons/PrinterIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import PlayCircleIcon from '../../components/Icons/PlayCircleIcon' import PauseCircleIcon from '../../components/Icons/PauseCircleIcon' import StopCircleIcon from '../../components/Icons/StopCircleIcon' import FilamentStockIcon from '../../components/Icons/FilamentStockIcon' +import ControlIcon from '../../components/Icons/ControlIcon' + export const Printer = { name: 'printer', label: 'Printer', @@ -32,7 +36,7 @@ export const Printer = { name: 'control', label: 'Control', row: true, - icon: PlayCircleIcon, + icon: ControlIcon, url: (_id) => `/dashboard/production/printers/control?printerId=${_id}` }, { @@ -41,7 +45,31 @@ export const Printer = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/production/printers/info?printerId=${_id}&action=edit` + `/dashboard/production/printers/info?printerId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/production/printers/info?printerId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/production/printers/info?printerId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } }, { type: 'divider' }, { @@ -98,12 +126,13 @@ export const Printer = { label: 'Start Queue', icon: PlayCircleIcon, disabled: (objectData) => { - console.log(objectData?.subJobs?.length) + console.log(objectData?.queue?.length) return ( objectData?.state?.type == 'error' || objectData?.state?.type == 'printing' || - objectData?.subJobs?.length == 0 || - objectData?.subJobs?.length == undefined + objectData?.state?.type == 'paused' || + objectData?.queue?.length == 0 || + objectData?.queue?.length == undefined ) }, url: (_id) => @@ -125,7 +154,7 @@ export const Printer = { label: 'Resume Job', icon: PlayCircleIcon, disabled: (objectData) => { - return objectData?.state?.type != 'printing' + return objectData?.state?.type != 'paused' }, url: (_id) => `/dashboard/production/printers/control?printerId=${_id}&action=resumeJob` @@ -137,7 +166,7 @@ export const Printer = { disabled: (objectData) => { return ( objectData?.state?.type != 'printing' && - objectData?.state?.type != 'error' + objectData?.state?.type != 'paused' ) }, url: (_id) => @@ -149,20 +178,37 @@ export const Printer = { name: 'filamentStock', label: 'Filament Stock', icon: FilamentStockIcon, + disabled: (objectData) => { + return objectData?.online == false + }, children: [ { name: 'loadFilamentStock', label: 'Load Filament Stock', icon: FilamentStockIcon, url: (_id) => - `/dashboard/production/printers/control?printerId=${_id}&action=loadFilamentStock` + `/dashboard/production/printers/control?printerId=${_id}&action=loadFilamentStock`, + disabled: (objectData) => { + return ( + objectData?.state?.type == 'printing' || + objectData?.state?.type == 'error' || + objectData?.currentFilamentStock != null + ) + } }, { name: 'unloadFilamentStock', label: 'Unload Filament Stock', icon: FilamentStockIcon, url: (_id) => - `/dashboard/production/printers/control?printerId=${_id}&action=unloadFilamentStock` + `/dashboard/production/printers/control?printerId=${_id}&action=unloadFilamentStock`, + disabled: (objectData) => { + return ( + objectData?.state?.type == 'printing' || + objectData?.state?.type == 'error' || + objectData?.currentFilamentStock == null + ) + } } ] } @@ -214,7 +260,8 @@ export const Printer = { type: 'state', objectType: 'printer', showName: false, - readOnly: true + readOnly: true, + columnWidth: 250 }, { name: 'connectedAt', @@ -354,7 +401,7 @@ export const Printer = { required: false }, { - name: 'subJobs', + name: 'queue', label: 'Queue', type: 'objectList', objectType: 'subJob', diff --git a/src/database/models/Product.js b/src/database/models/Product.js index 827f001..2aad532 100644 --- a/src/database/models/Product.js +++ b/src/database/models/Product.js @@ -2,6 +2,8 @@ import ProductIcon from '../../components/Icons/ProductIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' export const Product = { name: 'product', @@ -30,7 +32,31 @@ export const Product = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/products/info?productId=${_id}&action=edit` + `/dashboard/management/products/info?productId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/products/info?productId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/products/info?productId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } } ], columns: [ @@ -129,6 +155,51 @@ export const Product = { prefix: '£', min: 0, step: 0.1 + }, + { + name: 'parts', + label: 'Parts', + type: 'objectChildren', + objectType: 'part', + properties: [ + { + name: 'part', + label: 'Part', + type: 'object', + objectType: 'part', + required: true + }, + { + name: 'part._id', + label: 'Part ID', + type: 'id', + objectType: 'part', + showHyperlink: true, + value: (objectData) => { + return objectData?.part?._id + } + }, + { + name: 'quantity', + label: 'Quantity', + type: 'number', + required: true + } + ], + rollups: [ + { + name: 'totalQuantity', + label: 'Total', + type: 'number', + property: 'quantity', + value: (objectData) => { + return objectData?.parts?.reduce( + (acc, part) => acc + part.quantity, + 0 + ) + } + } + ] } ] } diff --git a/src/database/models/PurchaseOrder.js b/src/database/models/PurchaseOrder.js new file mode 100644 index 0000000..6321824 --- /dev/null +++ b/src/database/models/PurchaseOrder.js @@ -0,0 +1,21 @@ +import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon' +import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' + +export const PurchaseOrder = { + name: 'purchaseorder', + label: 'Product Stock', + prefix: 'PDS', + icon: PurchaseOrderIcon, + actions: [ + { + name: 'info', + label: 'Info', + default: true, + row: true, + icon: InfoCircleIcon, + url: (_id) => + `/dashboard/management/purchaseorders/info?purchaseOrderId=${_id}` + } + ], + url: (id) => `/dashboard/management/purchaseorders/info?purchaseOrderId=${id}` +} diff --git a/src/database/models/StockAudit.js b/src/database/models/StockAudit.js index 0c95b1b..3b2eb19 100644 --- a/src/database/models/StockAudit.js +++ b/src/database/models/StockAudit.js @@ -2,7 +2,7 @@ import StockAuditIcon from '../../components/Icons/StockAuditIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' export const StockAudit = { - name: 'stockaudit', + name: 'stockAudit', label: 'Stock Audit', prefix: 'SAU', icon: StockAuditIcon, @@ -16,5 +16,38 @@ export const StockAudit = { url: (_id) => `/dashboard/inventory/stockaudits/info?stockAuditId=${_id}` } ], - url: (id) => `/dashboard/inventory/stockaudits/info?stockAuditId=${id}` + url: (id) => `/dashboard/inventory/stockaudits/info?stockAuditId=${id}`, + columns: ['_id', 'state', 'createdAt', 'updatedAt'], + filters: ['_id'], + sorters: ['createdAt', 'updatedAt'], + group: ['state'], + properties: [ + { + name: '_id', + label: 'ID', + type: 'id', + objectType: 'stockAudit', + showCopy: true, + readOnly: true + }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true + }, + { + name: 'state', + label: 'State', + type: 'state', + readOnly: true, + columnWidth: 120 + }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + } + ] } diff --git a/src/database/models/SubJob.js b/src/database/models/SubJob.js index 5364768..defc9ae 100644 --- a/src/database/models/SubJob.js +++ b/src/database/models/SubJob.js @@ -1,11 +1,33 @@ import SubJobIcon from '../../components/Icons/SubJobIcon' +import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' export const SubJob = { name: 'subJob', label: 'Sub Job', prefix: 'SJB', icon: SubJobIcon, - actions: [], + actions: [ + { + name: 'info', + label: 'Info', + default: true, + row: true, + icon: InfoCircleIcon, + url: (_id) => `/dashboard/production/subjobs/info?subJobId=${_id}` + }, + { + name: 'cancel', + label: 'Cancel Sub Job', + row: true, + icon: XMarkIcon, + url: (_id) => + `/dashboard/production/subjobs/info?subJobId=${_id}&action=cancel`, + disabled: (objectData) => { + return objectData?.state?.type !== 'queued' + } + } + ], columns: ['_id', 'printer', 'printer._id', 'job._id', 'state', 'createdAt'], filters: ['state', '_id', 'job._id', 'printer._id'], sorters: ['createdAt', 'state'], @@ -19,6 +41,62 @@ export const SubJob = { columnWidth: 140, showCopy: true }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true, + columnWidth: 175 + }, + { + name: 'state', + label: 'State', + type: 'state', + objectType: 'subJob', + showStatus: true, + showProgress: true, + showId: false, + showQuantity: false, + columnWidth: 250, + readOnly: true + }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true, + columnWidth: 175 + }, + { + name: 'job._id', + label: 'Job ID', + type: 'id', + columnWidth: 140, + showHyperlink: true, + objectType: 'job' + }, + + { + name: 'startedAt', + label: 'Started At', + type: 'dateTime', + readOnly: true + }, + + { + name: 'moonrakerJobId', + label: 'Moonraker Job ID', + type: 'miscId', + columnWidth: 140, + showCopy: true + }, + + { + name: 'finishedAt', + label: 'Finished At', + type: 'dateTime', + readOnly: true + }, { name: 'printer', label: 'Printer', @@ -34,33 +112,6 @@ export const SubJob = { columnFixed: 'left', showHyperlink: true, objectType: 'printer' - }, - { - name: 'job._id', - label: 'Job ID', - type: 'id', - columnWidth: 140, - showHyperlink: true, - objectType: 'job' - }, - { - name: 'state', - label: 'State', - type: 'state', - objectType: 'subJob', - showStatus: true, - showProgress: true, - showId: false, - showQuantity: false, - columnWidth: 125, - readOnly: true - }, - { - name: 'createdAt', - label: 'Created At', - type: 'dateTime', - readOnly: true, - columnWidth: 175 } ] } diff --git a/src/database/models/Vendor.js b/src/database/models/Vendor.js index cc9499e..9dac988 100644 --- a/src/database/models/Vendor.js +++ b/src/database/models/Vendor.js @@ -1,6 +1,8 @@ import VendorIcon from '../../components/Icons/VendorIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' import ReloadIcon from '../../components/Icons/ReloadIcon' import BinIcon from '../../components/Icons/BinIcon' @@ -31,7 +33,31 @@ export const Vendor = { row: true, icon: EditIcon, url: (_id) => - `/dashboard/management/vendors/info?vendorId=${_id}&action=edit` + `/dashboard/management/vendors/info?vendorId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/vendors/info?vendorId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/vendors/info?vendorId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } }, { type: 'divider' }, { diff --git a/src/routes/InventoryRoutes.jsx b/src/routes/InventoryRoutes.jsx index 7517557..0883769 100644 --- a/src/routes/InventoryRoutes.jsx +++ b/src/routes/InventoryRoutes.jsx @@ -3,6 +3,7 @@ import { Route } from 'react-router-dom' import FilamentStocks from '../components/Dashboard/Inventory/FilamentStocks.jsx' import FilamentStockInfo from '../components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx' import PartStocks from '../components/Dashboard/Inventory/PartStocks.jsx' +import PartStockInfo from '../components/Dashboard/Inventory/PartStocks/PartStockInfo.jsx' import StockEvents from '../components/Dashboard/Inventory/StockEvents.jsx' import StockAudits from '../components/Dashboard/Inventory/StockAudits.jsx' import StockAuditInfo from '../components/Dashboard/Inventory/StockAudits/StockAuditInfo.jsx' @@ -23,6 +24,11 @@ const InventoryRoutes = [ path='inventory/partstocks' element={} />, + } + />, , } />, } />, + } + />, } />, =6.0.0": +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0": version "6.38.1" resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.38.1.tgz" integrity sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ== @@ -993,24 +998,6 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@electron/asar@^3.2.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz" - integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA== - dependencies: - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - -"@electron/asar@^3.2.7": - version "3.4.1" - resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz" - integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA== - dependencies: - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - "@electron/asar@3.2.18": version "3.2.18" resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz" @@ -1020,6 +1007,15 @@ glob "^7.1.6" minimatch "^3.0.4" +"@electron/asar@^3.2.1", "@electron/asar@^3.2.7": + version "3.4.1" + resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz" + integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + "@electron/fuses@^1.8.0": version "1.8.0" resolved "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz" @@ -1060,14 +1056,6 @@ tar "^6.2.1" which "^2.0.2" -"@electron/notarize@^1.2.3": - version "1.2.4" - resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz" - integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg== - dependencies: - debug "^4.1.1" - fs-extra "^9.0.1" - "@electron/notarize@2.5.0": version "2.5.0" resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz" @@ -1077,10 +1065,18 @@ fs-extra "^9.0.1" promise-retry "^2.0.1" -"@electron/osx-sign@^1.0.5": - version "1.3.3" - resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz" - integrity sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg== +"@electron/notarize@^1.2.3": + version "1.2.4" + resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz" + integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +"@electron/osx-sign@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz" + integrity sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw== dependencies: compare-version "^0.1.2" debug "^4.3.4" @@ -1089,10 +1085,10 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/osx-sign@1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz" - integrity sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw== +"@electron/osx-sign@^1.0.5": + version "1.3.3" + resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz" + integrity sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg== dependencies: compare-version "^0.1.2" debug "^4.3.4" @@ -1121,19 +1117,6 @@ tar "^6.0.5" yargs "^17.0.1" -"@electron/universal@^1.3.2": - version "1.5.1" - resolved "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz" - integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== - dependencies: - "@electron/asar" "^3.2.1" - "@malept/cross-spawn-promise" "^1.1.0" - debug "^4.3.1" - dir-compare "^3.0.0" - fs-extra "^9.0.1" - minimatch "^3.0.4" - plist "^3.0.4" - "@electron/universal@2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz" @@ -1147,16 +1130,18 @@ minimatch "^9.0.3" plist "^3.1.0" -"@electron/windows-sign@^1.1.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz" - integrity sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ== +"@electron/universal@^1.3.2": + version "1.5.1" + resolved "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz" + integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== dependencies: - cross-dirname "^0.1.0" - debug "^4.3.4" - fs-extra "^11.1.1" - minimist "^1.2.8" - postject "^1.0.0-alpha.6" + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" "@emotion/babel-plugin@^11.13.5": version "11.13.5" @@ -1254,6 +1239,11 @@ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== +"@emotion/unitless@0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + "@emotion/unitless@^0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz" @@ -1264,11 +1254,6 @@ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/unitless@0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - "@emotion/use-insertion-effect-with-fallbacks@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz" @@ -1294,16 +1279,16 @@ resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz" integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== -"@esbuild/android-arm@0.25.9": - version "0.25.9" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz" - integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== - "@esbuild/android-arm64@0.25.9": version "0.25.9" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz" integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== +"@esbuild/android-arm@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz" + integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== + "@esbuild/android-x64@0.25.9": version "0.25.9" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz" @@ -1329,16 +1314,16 @@ resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz" integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== -"@esbuild/linux-arm@0.25.9": - version "0.25.9" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz" - integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== - "@esbuild/linux-arm64@0.25.9": version "0.25.9" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz" integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== +"@esbuild/linux-arm@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz" + integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== + "@esbuild/linux-ia32@0.25.9": version "0.25.9" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz" @@ -1596,20 +1581,12 @@ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/source-map@^0.3.3": - version "0.3.11" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz" - integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.5" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": version "0.3.30" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz" integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== @@ -1794,7 +1771,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2124,7 +2101,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" "@svgr/babel-plugin-transform-svg-component" "8.0.0" -"@svgr/core@*", "@svgr/core@^8.1.0": +"@svgr/core@^8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== @@ -2198,7 +2175,7 @@ "@tsparticles/updater-out-modes" "3.9.1" "@tsparticles/updater-size" "3.9.1" -"@tsparticles/engine@^3.0.2", "@tsparticles/engine@3.9.1": +"@tsparticles/engine@3.9.1": version "3.9.1" resolved "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.9.1.tgz" integrity sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ== @@ -2434,7 +2411,7 @@ dependencies: "@tsparticles/engine" "3.9.1" -"@tsparticles/slim@^3.9.1", "@tsparticles/slim@3.9.1": +"@tsparticles/slim@3.9.1", "@tsparticles/slim@^3.9.1": version "3.9.1" resolved "https://registry.npmjs.org/@tsparticles/slim/-/slim-3.9.1.tgz" integrity sha512-CL5cDmADU7sDjRli0So+hY61VMbdroqbArmR9Av+c1Fisa5ytr6QD7Jv62iwU2S6rvgicEe9OyRmSy5GIefwZw== @@ -2705,15 +2682,7 @@ dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*", "@types/eslint@^8.4.5", "@types/eslint@>=8.0.0": +"@types/eslint@^8.4.5": version "8.56.12" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz" integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== @@ -2728,12 +2697,12 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8", "@types/estree@1.0.8": +"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.8" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/fs-extra@^9.0.11", "@types/fs-extra@9.0.13": +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": version "9.0.13" resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz" integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== @@ -2757,7 +2726,7 @@ resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2786,7 +2755,7 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@*", "@types/node@^20.19.0 || >=22.12.0": +"@types/node@*": version "24.3.0" resolved "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz" integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow== @@ -2813,13 +2782,6 @@ "@types/node" "*" xmlbuilder ">=11.0.1" -"@types/react@>=18": - version "19.1.12" - resolved "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz" - integrity sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w== - dependencies: - csstype "^3.0.2" - "@types/responselike@^1.0.0": version "1.0.3" resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz" @@ -2942,152 +2904,16 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.17.0" -"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - "@xmldom/xmldom@^0.8.8": version "0.8.11" resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz" integrity sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw== -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - "@zeit/schemas@2.36.0": version "2.36.0" resolved "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz" integrity sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg== -"7zip-bin@~5.2.0": - version "5.2.0" - resolved "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz" - integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== - abbrev@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" @@ -3109,34 +2935,24 @@ accepts@~1.3.5: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.15.0, acorn@^8.9.0: +acorn@^8.15.0, acorn@^8.9.0: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== -agent-base@^6.0.2, agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -agent-base@^7.1.0: - version "7.1.4" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" - integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== - -agent-base@^7.1.2: +agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.4" resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== @@ -3156,55 +2972,11 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.4.1: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@^8.8.2, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - ajv@8.12.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" @@ -3215,6 +2987,16 @@ ajv@8.12.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-align@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" @@ -3273,7 +3055,7 @@ antd-style@^3.7.1: "@emotion/utils" "^1.2.1" use-merge-value "^1.2.0" -antd@^5.27.1, antd@>=5.8.1: +antd@^5.27.1: version "5.27.1" resolved "https://registry.npmjs.org/antd/-/antd-5.27.1.tgz" integrity sha512-jGMSdBN7hAMvPV27B4RhzZfL6n6yu8yDbo7oXrlJasaOqB7bSDPcjdEy1kXy3JPsny/Qazb1ykzRI4EfcByAPQ== @@ -3563,11 +3345,6 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - bl@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" @@ -3643,7 +3420,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.24.0, "browserslist@>= 4.21.0": +browserslist@^4.24.0: version "4.25.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz" integrity sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ== @@ -3694,8 +3471,8 @@ builder-util@26.0.11: resolved "https://registry.npmjs.org/builder-util/-/builder-util-26.0.11.tgz" integrity sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA== dependencies: - "@types/debug" "^4.1.6" "7zip-bin" "~5.2.0" + "@types/debug" "^4.1.6" app-builder-bin "5.0.0-alpha.12" builder-util-runtime "9.3.1" chalk "^4.1.2" @@ -3719,17 +3496,12 @@ builtins@^5.0.1: dependencies: semver "^7.0.0" -bytes@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - bytes@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: +bytes@3.1.2, bytes@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -3839,6 +3611,19 @@ chalk-template@0.4.0: dependencies: chalk "^4.1.2" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + chalk@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" @@ -3850,24 +3635,11 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2, chalk@4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^5.0.1: version "5.6.0" resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz" integrity sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ== -chalk@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz" - integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== - character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" @@ -3893,11 +3665,6 @@ chownr@^2.0.0: resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz" @@ -3908,7 +3675,7 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1, classnames@2.x: +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: version "2.5.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== @@ -4023,31 +3790,21 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@^5.0.0: version "5.1.0" resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0, commander@7: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^9.4.0: - version "9.5.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - common-tags@^1.8.2: version "1.8.2" resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" @@ -4108,6 +3865,11 @@ config-file-ts@0.2.8-rc1: glob "^10.3.12" typescript "^5.4.3" +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + content-disposition@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz" @@ -4115,11 +3877,6 @@ content-disposition@^1.0.0: dependencies: safe-buffer "5.2.1" -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - content-type@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" @@ -4205,11 +3962,6 @@ crelt@^1.0.5, crelt@^1.0.6: resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cross-dirname@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz" - integrity sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q== - cross-env@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz" @@ -4302,12 +4054,12 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" -csstype@^3.0.2, csstype@^3.0.8, csstype@^3.1.3, csstype@3.1.3: +csstype@3.1.3, csstype@^3.0.2, csstype@^3.0.8, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -d3-array@^3.2.4, "d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3": +"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== @@ -4319,17 +4071,17 @@ d3-binarytree@1: resolved "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz" integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw== -d3-color@^3.1.0, "d3-color@1 - 3": +"d3-color@1 - 3", d3-color@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== -d3-dispatch@^3.0.1, "d3-dispatch@1 - 3": +"d3-dispatch@1 - 3", d3-dispatch@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -d3-dsv@^3.0.1, "d3-dsv@1 - 3": +"d3-dsv@1 - 3", d3-dsv@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== @@ -4370,7 +4122,7 @@ d3-force@^3.0.0: d3-quadtree "1 - 3" d3-timer "1 - 3" -d3-format@^3.1.0, "d3-format@1 - 3": +"d3-format@1 - 3", d3-format@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== @@ -4384,7 +4136,7 @@ d3-geo-projection@^4.0.0: d3-array "1 - 3" d3-geo "1.12.0 - 3" -d3-geo@^3.1.1, "d3-geo@1.12.0 - 3": +"d3-geo@1.12.0 - 3", d3-geo@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz" integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== @@ -4396,14 +4148,14 @@ d3-hierarchy@^3.1.2: resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== -d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" -d3-octree@^1.0.2, d3-octree@1: +d3-octree@1, d3-octree@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz" integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A== @@ -4413,7 +4165,7 @@ d3-path@^3.1.0: resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== -d3-quadtree@^3.0.1, "d3-quadtree@1 - 3": +"d3-quadtree@1 - 3", d3-quadtree@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== @@ -4461,14 +4213,14 @@ d3-shape@^3.2.0: dependencies: d3-time "1 - 3" -d3-time@^3.1.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -d3-timer@^3.0.1, "d3-timer@1 - 3": +"d3-timer@1 - 3", d3-timer@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== @@ -4508,7 +4260,7 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -dayjs@^1.11.11, "dayjs@>= 1.x": +dayjs@^1.11.11: version "1.11.13" resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== @@ -4518,13 +4270,20 @@ dayjs@^1.11.18: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz" integrity sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA== -debug@^2.2.0: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: + version "4.4.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -4532,34 +4291,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@4: - version "4.4.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -debug@~4.3.1: +debug@~4.3.1, debug@~4.3.2: version "4.3.7" resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" -debug@~4.3.2: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - decode-named-character-reference@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz" @@ -4619,7 +4357,7 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@^2.0.0, depd@2.0.0: +depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -4797,15 +4535,6 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder-squirrel-windows@26.0.12: - version "26.0.12" - resolved "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.12.tgz" - integrity sha512-kpwXM7c/ayRUbYVErQbsZ0nQZX4aLHQrPEG9C4h9vuJCXylwFH8a7Jgi2VpKIObzCXO7LKHiCw4KdioFLFOgqA== - dependencies: - app-builder-lib "26.0.12" - builder-util "26.0.11" - electron-winstaller "5.4.0" - electron-builder@^26.0.12: version "26.0.12" resolved "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.12.tgz" @@ -4866,19 +4595,6 @@ electron-to-chromium@^1.5.204: resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz" integrity sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg== -electron-winstaller@5.4.0: - version "5.4.0" - resolved "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz" - integrity sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg== - dependencies: - "@electron/asar" "^3.2.1" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.21" - temp "^0.9.0" - optionalDependencies: - "@electron/windows-sign" "^1.1.2" - electron@^38.7.1: version "38.7.1" resolved "https://registry.npmjs.org/electron/-/electron-38.7.1.tgz" @@ -4898,11 +4614,6 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - encodeurl@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" @@ -4938,14 +4649,6 @@ engine.io-parser@~5.2.1: resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz" integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== -enhanced-resolve@^5.17.3: - version "5.18.3" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" @@ -5060,11 +4763,6 @@ es-iterator-helpers@^1.2.1: iterator.prototype "^1.1.4" safe-array-concat "^1.1.3" -es-module-lexer@^1.2.1: - version "1.7.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" @@ -5160,7 +4858,7 @@ escape-string-regexp@^5.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-config-prettier@^10.1.8, "eslint-config-prettier@>= 7.0.0 <10.0.0 || >=10.1.0": +eslint-config-prettier@^10.1.8: version "10.1.8" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz" integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== @@ -5199,7 +4897,7 @@ eslint-plugin-es@^4.1.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.27.5: +eslint-plugin-import@^2.27.5: version "2.32.0" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== @@ -5224,7 +4922,7 @@ eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.27.5: string.prototype.trimend "^1.0.9" tsconfig-paths "^3.15.0" -"eslint-plugin-n@^15.0.0 || ^16.0.0 ", eslint-plugin-n@^15.7.0: +eslint-plugin-n@^15.7.0: version "15.7.0" resolved "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz" integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== @@ -5246,7 +4944,7 @@ eslint-plugin-prettier@^5.5.4: prettier-linter-helpers "^1.0.0" synckit "^0.11.7" -eslint-plugin-promise@^6.0.0, eslint-plugin-promise@^6.1.1: +eslint-plugin-promise@^6.1.1: version "6.6.0" resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz" integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== @@ -5261,7 +4959,7 @@ eslint-plugin-react-refresh@^0.4.20: resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz" integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== -eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.36.1, eslint-plugin-react@^7.37.5: +eslint-plugin-react@^7.36.1, eslint-plugin-react@^7.37.5: version "7.37.5" resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== @@ -5301,14 +4999,6 @@ eslint-scope@^8.4.0: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-utils@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" @@ -5343,7 +5033,7 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^7.0.0 || ^8.0.0 || ^9.0.0", eslint@^8.0.1, eslint@^8.41.0, eslint@^8.8.0, eslint@>=4.19.1, eslint@>=5: +eslint@^8.41.0, eslint@^8.57.1: version "8.57.1" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== @@ -5387,7 +5077,7 @@ eslint-visitor-keys@^4.2.1: strip-ansi "^6.0.1" text-table "^0.2.0" -"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.34.0, eslint@>=7, eslint@>=7.0.0, eslint@>=8.0.0, eslint@>=8.40: +eslint@^9.34.0: version "9.34.0" resolved "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz" integrity sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg== @@ -5428,60 +5118,7 @@ eslint-visitor-keys@^4.2.1: natural-compare "^1.4.0" optionator "^0.9.3" -"eslint@^7.0.0 || ^8.0.0", eslint@^8.57.1, eslint@>=6.0.0: - version "8.57.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^10.0.1: - version "10.4.0" - resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" - integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== - dependencies: - acorn "^8.15.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.1" - -espree@^10.4.0: +espree@^10.0.1, espree@^10.4.0: version "10.4.0" resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== @@ -5513,11 +5150,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" @@ -5548,11 +5180,6 @@ eventemitter3@^5.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - execa@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -5658,11 +5285,6 @@ fast-levenshtein@^2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-uri@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz" - integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== - fastq@^1.6.0: version "1.19.1" resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" @@ -5858,7 +5480,7 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.1.0: +fs-extra@^11.1.0, fs-extra@^11.1.1: version "11.3.1" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz" integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g== @@ -5867,24 +5489,6 @@ fs-extra@^11.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.1.1: - version "11.3.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz" - integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -5894,17 +5498,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6059,11 +5653,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@^10.3.12: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" @@ -6088,18 +5677,7 @@ glob@^7.1.3, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@^8.1.0: +glob@^8.0.1, glob@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -6176,7 +5754,7 @@ got@^11.7.0, got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -6300,7 +5878,7 @@ http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== -http-errors@^2.0.0, http-errors@2.0.0: +http-errors@2.0.0, http-errors@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== @@ -6377,7 +5955,7 @@ iconv-corefoundation@^1.1.7: cli-truncate "^2.1.0" node-addon-api "^1.6.3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6, iconv-lite@0.6.3: +iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -6425,7 +6003,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@^2.0.4, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6798,15 +6376,6 @@ jake@^10.8.5: filelist "^1.0.4" picocolors "^1.1.1" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -6834,7 +6403,7 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -6873,7 +6442,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -6965,20 +6534,6 @@ load-json-file@^5.2.0: strip-bom "^3.0.0" type-fest "^0.3.0" -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" @@ -7002,6 +6557,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.get@^4.0.0: version "4.4.2" resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" @@ -7628,7 +7188,12 @@ micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -mime-db@^1.54.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: version "1.54.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== @@ -7638,19 +7203,14 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: - mime-db "1.52.0" + mime-db "~1.33.0" -mime-types@^2.1.27: +mime-types@^2.1.12, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -7664,20 +7224,6 @@ mime-types@^3.0.0, mime-types@^3.0.1: dependencies: mime-db "^1.54.0" -mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - mime@^2.5.2: version "2.6.0" resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" @@ -7698,41 +7244,13 @@ mimic-response@^3.1.0: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^10.0.0: - version "10.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz" - integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@3.1.2: +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.3: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - minimatch@9.0.3: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" @@ -7740,7 +7258,28 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimatch@^10.0.0: + version "10.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz" + integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== + dependencies: + "@isaacs/brace-expansion" "^5.0.0" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7791,17 +7330,12 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: dependencies: yallist "^4.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - minipass@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== @@ -7814,13 +7348,6 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" @@ -7857,21 +7384,21 @@ ml-matrix@^6.10.4: is-any-array "^2.0.1" ml-array-rescale "^1.3.7" -moment@^2.30.1, "moment@>= 2.x": +moment@^2.30.1: version "2.30.1" resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanoid@^3.3.11, nanoid@^3.3.7: version "3.3.11" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" @@ -7887,6 +7414,11 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + negotiator@^0.6.3: version "0.6.4" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" @@ -7897,16 +7429,6 @@ negotiator@^1.0.0: resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -8276,16 +7798,16 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@^8.0.0: - version "8.2.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz" - integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== - path-to-regexp@3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz" integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== +path-to-regexp@^8.0.0: + version "8.2.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + path-type@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" @@ -8318,17 +7840,12 @@ picocolors@^1.0.0, picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.2.2: +picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -8351,7 +7868,7 @@ pkg-conf@^3.1.0: find-up "^3.0.0" load-json-file "^5.2.0" -plist@^3.0.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0, plist@3.1.0: +plist@3.1.0, plist@^3.0.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz" integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== @@ -8370,15 +7887,6 @@ postcss-value-parser@^4.0.2: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.5.6: - version "8.5.6" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - postcss@8.4.49: version "8.4.49" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" @@ -8388,12 +7896,14 @@ postcss@8.4.49: picocolors "^1.1.1" source-map-js "^1.2.1" -postject@^1.0.0-alpha.6: - version "1.0.0-alpha.6" - resolved "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz" - integrity sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A== +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: - commander "^9.4.0" + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@^1.2.1: version "1.2.1" @@ -8425,7 +7935,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.5.3, prettier@^3.6.2, prettier@>=3.0.0: +prettier@^3.5.3, prettier@^3.6.2: version "3.6.2" resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz" integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== @@ -8524,23 +8034,16 @@ quickselect@^2.0.0: resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== range-parser@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - raw-body@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz" @@ -8931,7 +8434,7 @@ react-country-flag@^3.1.0: resolved "https://registry.npmjs.org/react-country-flag/-/react-country-flag-3.1.0.tgz" integrity sha512-JWQFw1efdv9sTC+TGQvTKXQg1NKbDU2mBiAiRWcKM9F1sK+/zjhP2yGmm8YDddWyZdXVkR8Md47rPMJmo4YO5g== -react-dom@*, "react-dom@^18.0.0 || ^19.1.0", react-dom@^19.1.1, "react-dom@>= 16.8.0", react-dom@>=16.0.0, react-dom@>=16.11.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.8.4, react-dom@>=16.9.0, react-dom@>=17.0.0, react-dom@>=18: +react-dom@^19.1.1: version "19.1.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz" integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== @@ -8943,12 +8446,7 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react-is@^18.2.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.3.1" resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== @@ -9000,7 +8498,7 @@ react-router@7.8.2: cookie "^1.0.1" set-cookie-parser "^2.6.0" -react@*, "react@^18 || ^19", "react@^18.0.0 || ^19.1.0", react@^19.1.1, "react@>= 16.8.0", "react@>= 16.x", react@>=16, react@>=16.0.0, react@>=16.11.0, react@>=16.8, react@>=16.8.0, react@>=16.8.4, react@>=16.9.0, react@>=17.0.0, react@>=18: +react@^19.1.1: version "19.1.1" resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz" integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== @@ -9213,13 +8711,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - roarr@^2.15.3: version "2.15.4" resolved "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz" @@ -9232,7 +8723,7 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.77.2: +rollup@^2.77.2: version "2.79.2" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz" integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== @@ -9309,16 +8800,16 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-push-apply@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" @@ -9358,16 +8849,6 @@ scheduler@^0.26.0: resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== -schema-utils@^4.3.0, schema-utils@^4.3.2: - version "4.3.2" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz" - integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - scroll-into-view-if-needed@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz" @@ -9380,17 +8861,12 @@ semver-compare@^1.0.0: resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.2.0: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.1: +semver@^6.2.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -9400,11 +8876,6 @@ semver@^7.0.0, semver@^7.1.3, semver@^7.3.2, semver@^7.3.5, semver@^7.3.6, semve resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - send@^1.1.0, send@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz" @@ -9429,13 +8900,6 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - serve-handler@6.1.6: version "6.1.6" resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz" @@ -9608,6 +9072,21 @@ simple-update-notifier@2.0.0: dependencies: semver "^7.5.3" +simplebar-core@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/simplebar-core/-/simplebar-core-1.3.2.tgz#e249caf38625afb7c316b2d219b66afd6227e301" + integrity sha512-qKgTTuTqapjsFGkNhCjyPhysnbZGpQqNmjk0nOYjFN5ordC/Wjvg+RbYCyMSnW60l/Z0ZS82GbNltly6PMUH1w== + dependencies: + lodash "^4.17.21" + lodash-es "^4.17.21" + +simplebar-react@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/simplebar-react/-/simplebar-react-3.3.2.tgz#699c9837f4ada71335b3eca9f8a2b788a559bda1" + integrity sha512-ZsgcQhKLtt5ra0BRIJeApfkTBQCa1vUPA/WXI4HcYReFt+oCEOvdVz6rR/XsGJcKxTlCRPmdGx1uJIUChupo+A== + dependencies: + simplebar-core "^1.3.2" + slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -9675,7 +9154,7 @@ source-map-js@^1.0.1, source-map-js@^1.2.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map-support@^0.5.19, source-map-support@~0.5.20: +source-map-support@^0.5.19: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9766,16 +9245,16 @@ stat-mode@^1.0.0: resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz" integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== -statuses@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + stop-iteration-iterator@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" @@ -9784,13 +9263,6 @@ stop-iteration-iterator@^1.1.0: es-errors "^1.3.0" internal-slot "^1.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - string-convert@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz" @@ -9814,16 +9286,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string-width@^5.1.2: +string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -9891,6 +9354,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" @@ -9988,11 +9458,6 @@ styled-components@^6.1.15, styled-components@^6.1.19: stylis "4.3.2" tslib "2.6.2" -stylis@^4.3.4: - version "4.3.6" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz" - integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== - stylis@4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" @@ -10003,6 +9468,11 @@ stylis@4.3.2: resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz" integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== +stylis@^4.3.4: + version "4.3.6" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== + sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz" @@ -10010,6 +9480,13 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" @@ -10022,13 +9499,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -10051,7 +9521,7 @@ svgo-loader@^4.0.0: dependencies: svgo "^3.0.0" -svgo@^3.0.0: +svgo@3.3.2, svgo@^3.0.0: version "3.3.2" resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz" integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== @@ -10077,19 +9547,6 @@ svgo@^4.0.0: picocolors "^1.1.1" sax "^1.4.1" -svgo@3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz" - integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^5.1.0" - css-tree "^2.3.1" - css-what "^6.1.0" - csso "^5.0.5" - picocolors "^1.0.0" - synckit@^0.11.7: version "0.11.11" resolved "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz" @@ -10097,11 +9554,6 @@ synckit@^0.11.7: dependencies: "@pkgr/core" "^0.2.9" -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz" - integrity sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg== - tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" @@ -10122,40 +9574,16 @@ temp-file@^3.4.0: async-exit-hook "^2.0.1" fs-extra "^10.0.0" -temp@^0.9.0: - version "0.9.4" - resolved "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz" - integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== - dependencies: - mkdirp "^0.5.1" - rimraf "~2.6.2" - -terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.16.0, terser@^5.31.1: - version "5.44.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz" - integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.15.0" - commander "^2.20.0" - source-map-support "~0.5.20" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +three@0.176.0: + version "0.176.0" + resolved "https://registry.npmjs.org/three/-/three-0.176.0.tgz" + integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA== + three@^0.159.0: version "0.159.0" resolved "https://registry.npmjs.org/three/-/three-0.159.0.tgz" @@ -10166,11 +9594,6 @@ three@^0.179.1: resolved "https://registry.npmjs.org/three/-/three-0.179.1.tgz" integrity sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw== -three@0.176.0: - version "0.176.0" - resolved "https://registry.npmjs.org/three/-/three-0.176.0.tgz" - integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA== - throttle-debounce@^5.0.0, throttle-debounce@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz" @@ -10264,16 +9687,16 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.5.3, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tslib@2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.5.3, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsparticles@^3.9.1: version "3.9.1" resolved "https://registry.npmjs.org/tsparticles/-/tsparticles-3.9.1.tgz" @@ -10374,7 +9797,7 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typescript@^5.4.3, typescript@>=4.2.0, typescript@>=4.9.4, typescript@>=4.9.5: +typescript@^5.4.3: version "5.9.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== @@ -10585,7 +10008,7 @@ vite-plugin-svgr@^4.5.0: "@svgr/core" "^8.1.0" "@svgr/plugin-jsx" "^8.1.0" -"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^7.1.3, vite@>=2, vite@>=2.6.0, vite@>=4.0.2: +vite@^7.1.3: version "7.1.3" resolved "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz" integrity sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw== @@ -10617,14 +10040,6 @@ w3c-keyname@^2.2.4: resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== -watchpack@^2.4.1: - version "2.4.4" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" @@ -10637,42 +10052,6 @@ web-vitals@^5.1.0: resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-5.1.0.tgz" integrity sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg== -webpack-sources@^3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== - -webpack@*, webpack@^5.1.0: - version "5.101.3" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz" - integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.3" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" - which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" @@ -10745,13 +10124,6 @@ word-wrap@^1.2.5: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workerize-loader@*: - version "2.0.2" - resolved "https://registry.npmjs.org/workerize-loader/-/workerize-loader-2.0.2.tgz" - integrity sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ== - dependencies: - loader-utils "^2.0.0" - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -10794,7 +10166,7 @@ xdg-basedir@^4.0.0: resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xmlbuilder@^15.1.1, xmlbuilder@>=11.0.1: +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: version "15.1.1" resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== @@ -10829,7 +10201,7 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.0.1, yargs@^17.6.2, yargs@17.7.2: +yargs@17.7.2, yargs@^17.0.1, yargs@^17.6.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 2e8f627c83a62540a6f35bc5b4afef1feb338af7 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 00:06:43 +0000 Subject: [PATCH 07/11] Updated object select to use better child handling with API mods. --- assets/stylesheets/App.css | 5 + .../Dashboard/common/ObjectSelect.jsx | 220 +++++++++++++----- .../Dashboard/context/ApiServerContext.jsx | 7 +- 3 files changed, 175 insertions(+), 57 deletions(-) diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css index 15667e1b..0dae3b8 100644 --- a/assets/stylesheets/App.css +++ b/assets/stylesheets/App.css @@ -345,3 +345,8 @@ body { .rollup-table .ant-table { border-radius: 0px !important; } + +.ant-select-selection-item .ant-tag, +.ant-select-tree-title .ant-tag { + background: transparent !important; +} diff --git a/src/components/Dashboard/common/ObjectSelect.jsx b/src/components/Dashboard/common/ObjectSelect.jsx index ecfc994..3666554 100644 --- a/src/components/Dashboard/common/ObjectSelect.jsx +++ b/src/components/Dashboard/common/ObjectSelect.jsx @@ -14,8 +14,16 @@ import { AuthContext } from '../context/AuthContext' import ObjectProperty from './ObjectProperty' import { getModelByName } from '../../../database/ObjectModels' import merge from 'lodash/merge' +import { getModelProperty } from '../../../database/ObjectModels' const { SHOW_CHILD } = TreeSelect +// Helper to check if two values are equal (handling objects/ids) +const areValuesEqual = (v1, v2) => { + const id1 = v1 && typeof v1 === 'object' && v1._id ? v1._id : v1 + const id2 = v2 && typeof v2 === 'object' && v2._id ? v2._id : v2 + return String(id1) === String(id2) +} + const ObjectSelect = ({ type = 'unknown', showSearch = false, @@ -31,7 +39,7 @@ const ObjectSelect = ({ const { token } = useContext(AuthContext) // --- State --- const [treeData, setTreeData] = useState([]) - const [objectPropertiesTree, setObjectPropertiesTree] = useState({}) + const [objectPropertiesTree, setObjectPropertiesTree] = useState([]) const [initialized, setInitialized] = useState(false) const [error, setError] = useState(false) const properties = useMemo(() => getModelByName(type).group || [], [type]) @@ -69,6 +77,50 @@ const ObjectSelect = ({ [isMinimalObject, fetchObject, type] ) + const mergeGroups = useCallback((current, incoming) => { + if (!current) return incoming + if (!incoming) return current + if (!Array.isArray(current) || !Array.isArray(incoming)) return incoming + + const merged = [...current] + + // Helper to generate a unique key for a group node + const getGroupKey = (item) => { + const val = item.value + const valPart = + val && typeof val === 'object' && val._id + ? val._id + : JSON.stringify(val) + return `${item.property}:${valPart}` + } + + for (const item of incoming) { + if (item.property && item.value !== undefined) { + // It's a group node + const itemKey = getGroupKey(item) + const existingIdx = merged.findIndex( + (x) => + x.property && x.value !== undefined && getGroupKey(x) === itemKey + ) + + if (existingIdx > -1) { + merged[existingIdx] = { + ...merged[existingIdx], + children: mergeGroups(merged[existingIdx].children, item.children) + } + } else { + merged.push(item) + } + } else { + // It's a leaf object + if (!merged.some((x) => String(x._id) === String(item._id))) { + merged.push(item) + } + } + } + return merged + }, []) + // Fetch the object properties tree from the API const handleFetchObjectsProperties = useCallback( async (customFilter = filter) => { @@ -78,11 +130,14 @@ const ObjectSelect = ({ filter: customFilter, masterFilter }) + if (Array.isArray(data)) { - setObjectPropertiesTree((prev) => merge([], prev, data)) + setObjectPropertiesTree((prev) => mergeGroups(prev, data)) } else { - setObjectPropertiesTree((prev) => merge({}, prev, data)) + // Fallback if API returns something unexpected + setObjectPropertiesTree((prev) => merge([], prev, data)) } + setInitialLoading(false) setError(false) return data @@ -92,24 +147,31 @@ const ObjectSelect = ({ return null } }, - [type, fetchObjectsByProperty, properties, filter, masterFilter] + [ + type, + fetchObjectsByProperty, + properties, + filter, + masterFilter, + mergeGroups + ] ) // Convert the API response to AntD TreeSelect treeData const buildTreeData = useCallback( (data, pIdx = 0, parentKeys = [], filterPath = []) => { - if (!data) return [] - if (Array.isArray(data)) { + if (!data || !Array.isArray(data)) return [] + console.log(data, pIdx, properties.length) + // If we are past the grouping properties, these are leaf objects + if (pIdx >= properties.length) { return data.map((object) => { setObjectList((prev) => { - const filtered = prev.filter( - (prevObject) => prevObject._id != object._id - ) - return [...filtered, object] + if (prev.some((p) => p._id === object._id)) return prev + return [...prev, object] }) return { title: ( -
+
{ - if (property != null && typeof value === 'object') { - const newFilterPath = filterPath.concat({ property, value: key }) - return { - title: , - value: parentKeys.concat(key).join('-'), - filterValue: key, - key: parentKeys.concat(key).join('-'), - property, - parentKeys: parentKeys.concat(key || '-'), - filterPath: newFilterPath, - selectable: false, - children: buildTreeData( - value, - pIdx + 1, - parentKeys.concat(key), - newFilterPath - ), - isLeaf: false - } - } + // Group Nodes + return data + .map((group) => { + // Only process if it looks like a group + if (!group.property) return null + + const { property, value, children } = group + var valueString = value + if (value && typeof value === 'object' && value._id) { + valueString = value._id + } + if (Array.isArray(valueString)) { + valueString = valueString.join(',') + } + const nodeKey = parentKeys + .concat(property + ':' + valueString) + .join('-') + const newFilterPath = filterPath.concat({ + property, + value: valueString }) - .filter(Boolean) - } + + const modelProperty = getModelProperty(type, property) + return { + title: , + value: nodeKey, + key: nodeKey, + property, + filterValue: valueString, + parentKeys: parentKeys.concat(valueString), + filterPath: newFilterPath, + selectable: false, + isLeaf: false, + children: buildTreeData( + children, + pIdx + 1, + parentKeys.concat(valueString), + newFilterPath + ) + } + }) + .filter(Boolean) }, [properties, type] ) // --- loadData for async loading on expand --- const loadData = async (node) => { - // node.property is the property name, node.value is the value + // node.property is the property name, node.value is the value key if (!node.property) return + if (type == 'unknown') return // Build filter for this node by merging all parent property-value pairs const customFilter = { ...filter } if (Array.isArray(node.filterPath)) { @@ -172,26 +249,40 @@ const ObjectSelect = ({ customFilter[property] = value }) } + // Ensure current node is in filter (should be covered by filterPath, but redundancy is safe) customFilter[node.property] = node.filterValue // Fetch children for this node const data = await handleFetchObjectsProperties(customFilter) if (!data) return - // Extract only the children for the specific node that was expanded - let nodeSpecificData = data - if (typeof data === 'object' && !Array.isArray(data)) { - // If the API returns an object with multiple keys, get only the data for this node - nodeSpecificData = data[node.value] || {} + + // Navigate to the specific node's children in the response + let nodeSpecificChildren = data + + if (node.filterPath && Array.isArray(node.filterPath)) { + for (const pathItem of node.filterPath) { + if (!Array.isArray(nodeSpecificChildren)) break + const match = nodeSpecificChildren.find( + (g) => + g.property === pathItem.property && + areValuesEqual(g.value, pathItem.value) + ) + if (match) { + nodeSpecificChildren = match.children + } else { + nodeSpecificChildren = [] + break + } + } } + // Build new tree children only for this specific node const children = buildTreeData( - nodeSpecificData, + nodeSpecificChildren, properties.indexOf(node.property) + 1, node.parentKeys || [], - (node.filterPath || []).concat({ - property: node.property, - value: node.filterValue - }) + node.filterPath ) + // Update treeData with new children for this node only setTreeData((prevTreeData) => { // Helper to recursively update the correct node @@ -250,7 +341,8 @@ const ObjectSelect = ({ value && typeof value === 'object' && value !== null && - !initialized + !initialized && + type != 'unknown' ) { // Check if value is a minimal object and fetch full object if needed const fullValue = await fetchFullObjectIfNeeded(value) @@ -260,7 +352,13 @@ const ObjectSelect = ({ properties.forEach((prop) => { if (Object.prototype.hasOwnProperty.call(fullValue, prop)) { const filterValue = fullValue[prop] - if (filterValue?.name) { + if ( + filterValue && + typeof filterValue === 'object' && + filterValue._id + ) { + valueFilter[prop] = filterValue._id + } else if (filterValue?.name) { valueFilter[prop] = filterValue.name } else if (Array.isArray(filterValue)) { valueFilter[prop] = filterValue.join(',') @@ -275,12 +373,13 @@ const ObjectSelect = ({ setInitialized(true) return } - if (!initialized && token != null) { + if (!initialized && token != null && type != 'unknown') { handleFetchObjectsProperties() setInitialized(true) } - if (value == null) { + if (value == null || type == 'unknown') { setTreeSelectValue(null) + setInitialLoading(false) setInitialized(true) } } @@ -292,7 +391,8 @@ const ObjectSelect = ({ handleFetchObjectsProperties, initialized, token, - fetchFullObjectIfNeeded + fetchFullObjectIfNeeded, + type ]) const prevValuesRef = useRef({ type, masterFilter }) @@ -341,6 +441,14 @@ const ObjectSelect = ({ } }, [value]) + const placeholder = useMemo( + () => + type == 'unknown' + ? 'n/a' + : `Select a ${getModelByName(type).label.toLowerCase()}...`, + [type] + ) + // --- Error UI --- if (error) { return ( @@ -373,12 +481,12 @@ const ObjectSelect = ({ multiple={multiple} loadData={loadData} showCheckedStrategy={SHOW_CHILD} - placeholder={`Select a ${getModelByName(type).label.toLowerCase()}...`} + placeholder={placeholder} {...treeSelectProps} {...rest} value={treeSelectValue} onChange={onTreeSelectChange} - disabled={disabled} + disabled={disabled || type == 'unknown'} /> ) } diff --git a/src/components/Dashboard/context/ApiServerContext.jsx b/src/components/Dashboard/context/ApiServerContext.jsx index 5a1dcdf..cf39a72 100644 --- a/src/components/Dashboard/context/ApiServerContext.jsx +++ b/src/components/Dashboard/context/ApiServerContext.jsx @@ -665,7 +665,12 @@ const ApiServerProvider = ({ children }) => { `${config.backendUrl}/${type.toLowerCase()}s/properties`, { params: { - ...filter, + ...Object.keys(filter).reduce((acc, key) => { + acc[key] = Array.isArray(filter[key]) + ? filter[key].join(',') + : filter[key] + return acc + }, {}), properties: properties.join(','), // Convert array to comma-separated string masterFilter: JSON.stringify(masterFilter) }, From 10a4b33620e178b967eb372abb1e422c58050f14 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 00:08:43 +0000 Subject: [PATCH 08/11] Group subjobs by job. --- src/database/models/SubJob.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/database/models/SubJob.js b/src/database/models/SubJob.js index defc9ae..2f856a4 100644 --- a/src/database/models/SubJob.js +++ b/src/database/models/SubJob.js @@ -31,6 +31,7 @@ export const SubJob = { columns: ['_id', 'printer', 'printer._id', 'job._id', 'state', 'createdAt'], filters: ['state', '_id', 'job._id', 'printer._id'], sorters: ['createdAt', 'state'], + group: ['job'], properties: [ { name: '_id', @@ -67,6 +68,12 @@ export const SubJob = { readOnly: true, columnWidth: 175 }, + { + name: 'job', + label: 'Job', + type: 'object', + objectType: 'job' + }, { name: 'job._id', label: 'Job ID', From f2bdb973d17b1103de7ff1e09c5af2cfd3348a14 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 00:09:01 +0000 Subject: [PATCH 09/11] Fixed masterFilter being present. --- src/components/Dashboard/common/ObjectTypeSelect.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Dashboard/common/ObjectTypeSelect.jsx b/src/components/Dashboard/common/ObjectTypeSelect.jsx index aad4d78..4c3cb1d 100644 --- a/src/components/Dashboard/common/ObjectTypeSelect.jsx +++ b/src/components/Dashboard/common/ObjectTypeSelect.jsx @@ -17,7 +17,7 @@ const ObjectTypeSelect = ({ const options = objectModels .sort((a, b) => a.label.localeCompare(b.label)) .filter((model) => { - if (masterFilter == null) { + if (masterFilter == null || Object.keys(masterFilter).length == 0) { return true } return masterFilter.includes(model?.name) From 735826bdb9bbaf503cd99706b23d87e236ea14ff Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 00:15:34 +0000 Subject: [PATCH 10/11] Use wizard view for "new" windows. --- .../FilamentStocks/NewFilamentStock.jsx | 59 ++++--------------- .../Inventory/PartStocks/NewPartStock.jsx | 59 ++++--------------- .../Inventory/StockAudits/NewStockAudit.jsx | 59 ++++--------------- .../DocumentSizes/NewDocumentSize.jsx | 59 ++++--------------- 4 files changed, 44 insertions(+), 192 deletions(-) diff --git a/src/components/Dashboard/Inventory/FilamentStocks/NewFilamentStock.jsx b/src/components/Dashboard/Inventory/FilamentStocks/NewFilamentStock.jsx index 838cd9a..3524160 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks/NewFilamentStock.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks/NewFilamentStock.jsx @@ -1,18 +1,9 @@ import PropTypes from 'prop-types' -import { useState } from 'react' -import { useMediaQuery } from 'react-responsive' -import { Typography, Flex, Steps, Divider } from 'antd' - import ObjectInfo from '../../common/ObjectInfo' import NewObjectForm from '../../common/NewObjectForm' -import NewObjectButtons from '../../common/NewObjectButtons' - -const { Title } = Typography +import WizardView from '../../common/WizardView' const NewFilamentStock = ({ onOk, reset }) => { - const [currentStep, setCurrentStep] = useState(0) - const isMobile = useMediaQuery({ maxWidth: 768 }) - return ( { column={1} bordered={false} isEditing={true} - initial={true} required={true} objectData={objectData} /> @@ -56,43 +46,16 @@ const NewFilamentStock = ({ onOk, reset }) => { } ] return ( - - {!isMobile && ( -
- -
- )} - - {!isMobile && ( - - )} - - - - New Filament Stock - -
- {steps[currentStep].content} -
- setCurrentStep((prev) => prev - 1)} - onNext={() => setCurrentStep((prev) => prev + 1)} - onSubmit={() => { - handleSubmit() - onOk() - }} - formValid={formValid} - submitLoading={submitLoading} - /> -
-
+ { + handleSubmit() + onOk() + }} + /> ) }}
diff --git a/src/components/Dashboard/Inventory/PartStocks/NewPartStock.jsx b/src/components/Dashboard/Inventory/PartStocks/NewPartStock.jsx index 41c244f..69b2dd4 100644 --- a/src/components/Dashboard/Inventory/PartStocks/NewPartStock.jsx +++ b/src/components/Dashboard/Inventory/PartStocks/NewPartStock.jsx @@ -1,18 +1,9 @@ import PropTypes from 'prop-types' -import { useState } from 'react' -import { useMediaQuery } from 'react-responsive' -import { Typography, Flex, Steps, Divider } from 'antd' - import ObjectInfo from '../../common/ObjectInfo' import NewObjectForm from '../../common/NewObjectForm' -import NewObjectButtons from '../../common/NewObjectButtons' - -const { Title } = Typography +import WizardView from '../../common/WizardView' const NewPartStock = ({ onOk, reset }) => { - const [currentStep, setCurrentStep] = useState(0) - const isMobile = useMediaQuery({ maxWidth: 768 }) - return ( { column={1} bordered={false} isEditing={true} - initial={true} required={true} objectData={objectData} /> @@ -56,43 +46,16 @@ const NewPartStock = ({ onOk, reset }) => { } ] return ( - - {!isMobile && ( -
- -
- )} - - {!isMobile && ( - - )} - - - - New Part Stock - -
- {steps[currentStep].content} -
- setCurrentStep((prev) => prev - 1)} - onNext={() => setCurrentStep((prev) => prev + 1)} - onSubmit={() => { - handleSubmit() - onOk() - }} - formValid={formValid} - submitLoading={submitLoading} - /> -
-
+ { + handleSubmit() + onOk() + }} + /> ) }}
diff --git a/src/components/Dashboard/Inventory/StockAudits/NewStockAudit.jsx b/src/components/Dashboard/Inventory/StockAudits/NewStockAudit.jsx index d18dc9d..9422e8c 100644 --- a/src/components/Dashboard/Inventory/StockAudits/NewStockAudit.jsx +++ b/src/components/Dashboard/Inventory/StockAudits/NewStockAudit.jsx @@ -1,18 +1,9 @@ import PropTypes from 'prop-types' -import { useState } from 'react' -import { useMediaQuery } from 'react-responsive' -import { Typography, Flex, Steps, Divider } from 'antd' - import ObjectInfo from '../../common/ObjectInfo' import NewObjectForm from '../../common/NewObjectForm' -import NewObjectButtons from '../../common/NewObjectButtons' - -const { Title } = Typography +import WizardView from '../../common/WizardView' const NewStockAudit = ({ onOk, reset }) => { - const [currentStep, setCurrentStep] = useState(0) - const isMobile = useMediaQuery({ maxWidth: 768 }) - return ( { column={1} bordered={false} isEditing={true} - initial={true} required={true} objectData={objectData} /> @@ -56,43 +46,16 @@ const NewStockAudit = ({ onOk, reset }) => { } ] return ( - - {!isMobile && ( -
- -
- )} - - {!isMobile && ( - - )} - - - - New Stock audit - -
- {steps[currentStep].content} -
- setCurrentStep((prev) => prev - 1)} - onNext={() => setCurrentStep((prev) => prev + 1)} - onSubmit={() => { - handleSubmit() - onOk() - }} - formValid={formValid} - submitLoading={submitLoading} - /> -
-
+ { + handleSubmit() + onOk() + }} + /> ) }}
diff --git a/src/components/Dashboard/Management/DocumentSizes/NewDocumentSize.jsx b/src/components/Dashboard/Management/DocumentSizes/NewDocumentSize.jsx index 51a0c68..972bf97 100644 --- a/src/components/Dashboard/Management/DocumentSizes/NewDocumentSize.jsx +++ b/src/components/Dashboard/Management/DocumentSizes/NewDocumentSize.jsx @@ -1,19 +1,9 @@ import PropTypes from 'prop-types' -import { useState } from 'react' -import { useMediaQuery } from 'react-responsive' -import { Typography, Flex, Steps, Divider } from 'antd' - import ObjectInfo from '../../common/ObjectInfo' import NewObjectForm from '../../common/NewObjectForm' -import NewObjectButtons from '../../common/NewObjectButtons' - -const { Title } = Typography +import WizardView from '../../common/WizardView' const NewDocumentSize = ({ onOk }) => { - const [currentStep, setCurrentStep] = useState(0) - - const isMobile = useMediaQuery({ maxWidth: 768 }) - return ( {({ handleSubmit, submitLoading, objectData, formValid }) => { @@ -52,43 +42,16 @@ const NewDocumentSize = ({ onOk }) => { } ] return ( - - {!isMobile && ( -
- -
- )} - - {!isMobile && ( - - )} - - - - New Document Size - -
- {steps[currentStep].content} -
- setCurrentStep((prev) => prev - 1)} - onNext={() => setCurrentStep((prev) => prev + 1)} - onSubmit={() => { - handleSubmit() - onOk() - }} - formValid={formValid} - submitLoading={submitLoading} - /> -
-
+ { + handleSubmit() + onOk() + }} + /> ) }}
From 17a4a5abd59c37371ba55d07ed444ff87d76a48a Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 03:40:00 +0000 Subject: [PATCH 11/11] Added purchase orders and couriers. --- assets/icons/couriericon.svg | 7 + assets/icons/courierserviceicon.svg | 14 ++ assets/icons/orderitemsicon.svg | 7 + assets/icons/purchaseordericon.svg | 4 +- assets/icons/salesordericon.svg | 13 + .../Dashboard/Developer/DeveloperSidebar.jsx | 12 +- .../Dashboard/Inventory/InventorySidebar.jsx | 25 +- .../Dashboard/Inventory/PurchaseOrders.jsx | 101 ++++++++ .../PurchaseOrders/NewPurchaseOrder.jsx | 89 +++++++ .../PurchaseOrders/PurchaseOrderInfo.jsx | 231 ++++++++++++++++++ .../Dashboard/Management/CourierServices.jsx | 98 ++++++++ .../CourierServices/CourierServiceInfo.jsx | 198 +++++++++++++++ .../CourierServices/NewCourierService.jsx | 86 +++++++ .../Dashboard/Management/Couriers.jsx | 97 ++++++++ .../Management/Couriers/CourierInfo.jsx | 216 ++++++++++++++++ .../Management/Couriers/NewCourier.jsx | 80 ++++++ .../Management/ManagementSidebar.jsx | 29 ++- .../Production/ProductionSidebar.jsx | 12 +- .../Dashboard/common/NewObjectForm.jsx | 144 ++++++++--- .../Dashboard/common/ObjectChildTable.jsx | 15 +- .../Dashboard/common/ObjectForm.jsx | 169 +++++++++---- .../Dashboard/common/WizardView.jsx | 6 +- src/components/Icons/CourierIcon.jsx | 6 + src/components/Icons/CourierServiceIcon.jsx | 7 + src/components/Icons/OrderItemsIcon.jsx | 6 + src/database/ObjectModels.js | 6 + src/database/models/Courier.js | 142 +++++++++++ src/database/models/CourierService.js | 170 +++++++++++++ src/database/models/Part.js | 28 ++- src/database/models/PurchaseOrder.js | 169 ++++++++++++- src/database/models/Vendor.js | 1 - src/routes/InventoryRoutes.jsx | 12 + src/routes/ManagementRoutes.jsx | 20 ++ 33 files changed, 2109 insertions(+), 111 deletions(-) create mode 100644 assets/icons/couriericon.svg create mode 100644 assets/icons/courierserviceicon.svg create mode 100644 assets/icons/orderitemsicon.svg create mode 100644 assets/icons/salesordericon.svg create mode 100644 src/components/Dashboard/Inventory/PurchaseOrders.jsx create mode 100644 src/components/Dashboard/Inventory/PurchaseOrders/NewPurchaseOrder.jsx create mode 100644 src/components/Dashboard/Inventory/PurchaseOrders/PurchaseOrderInfo.jsx create mode 100644 src/components/Dashboard/Management/CourierServices.jsx create mode 100644 src/components/Dashboard/Management/CourierServices/CourierServiceInfo.jsx create mode 100644 src/components/Dashboard/Management/CourierServices/NewCourierService.jsx create mode 100644 src/components/Dashboard/Management/Couriers.jsx create mode 100644 src/components/Dashboard/Management/Couriers/CourierInfo.jsx create mode 100644 src/components/Dashboard/Management/Couriers/NewCourier.jsx create mode 100644 src/components/Icons/CourierIcon.jsx create mode 100644 src/components/Icons/CourierServiceIcon.jsx create mode 100644 src/components/Icons/OrderItemsIcon.jsx create mode 100644 src/database/models/Courier.js create mode 100644 src/database/models/CourierService.js diff --git a/assets/icons/couriericon.svg b/assets/icons/couriericon.svg new file mode 100644 index 0000000..26bfd21 --- /dev/null +++ b/assets/icons/couriericon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/courierserviceicon.svg b/assets/icons/courierserviceicon.svg new file mode 100644 index 0000000..0047f95 --- /dev/null +++ b/assets/icons/courierserviceicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/icons/orderitemsicon.svg b/assets/icons/orderitemsicon.svg new file mode 100644 index 0000000..bcb55f4 --- /dev/null +++ b/assets/icons/orderitemsicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/purchaseordericon.svg b/assets/icons/purchaseordericon.svg index 237395f..db04b34 100644 --- a/assets/icons/purchaseordericon.svg +++ b/assets/icons/purchaseordericon.svg @@ -1,11 +1,13 @@ - + + + diff --git a/assets/icons/salesordericon.svg b/assets/icons/salesordericon.svg new file mode 100644 index 0000000..c1bea56 --- /dev/null +++ b/assets/icons/salesordericon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/components/Dashboard/Developer/DeveloperSidebar.jsx b/src/components/Dashboard/Developer/DeveloperSidebar.jsx index 244af1b..5c7fe04 100644 --- a/src/components/Dashboard/Developer/DeveloperSidebar.jsx +++ b/src/components/Dashboard/Developer/DeveloperSidebar.jsx @@ -34,9 +34,15 @@ const routeKeyMap = { const DeveloperSidebar = (props) => { const location = useLocation() const selectedKey = (() => { - const match = Object.keys(routeKeyMap).find((path) => - location.pathname.startsWith(path) - ) + const match = Object.keys(routeKeyMap).find((path) => { + const pathSplit = path.split('/') + const locationPathSplit = location.pathname.split('/') + if (pathSplit.length > locationPathSplit.length) return false + for (let i = 0; i < pathSplit.length; i++) { + if (pathSplit[i] !== locationPathSplit[i]) return false + } + return true + }) return match ? routeKeyMap[match] : 'sessionstorage' })() diff --git a/src/components/Dashboard/Inventory/InventorySidebar.jsx b/src/components/Dashboard/Inventory/InventorySidebar.jsx index db8ea3c..f222a65 100644 --- a/src/components/Dashboard/Inventory/InventorySidebar.jsx +++ b/src/components/Dashboard/Inventory/InventorySidebar.jsx @@ -6,6 +6,7 @@ import PartStockIcon from '../../Icons/PartStockIcon' import ProductStockIcon from '../../Icons/ProductStockIcon' import StockEventIcon from '../../Icons/StockEventIcon' import StockAuditIcon from '../../Icons/StockAuditIcon' +import PurchaseOrderIcon from '../../Icons/PurchaseOrderIcon' const items = [ { @@ -34,6 +35,13 @@ const items = [ path: '/dashboard/inventory/productstocks' }, { type: 'divider' }, + { + key: 'purchaseorders', + label: 'Purchase Orders', + icon: , + path: '/dashboard/inventory/purchaseorders' + }, + { type: 'divider' }, { key: 'stockevents', label: 'Stock Events', @@ -54,16 +62,23 @@ const routeKeyMap = { '/dashboard/inventory/partstocks': 'partstocks', '/dashboard/inventory/productstocks': 'productstocks', '/dashboard/inventory/stockevents': 'stockevents', - '/dashboard/inventory/stockaudits': 'stockaudits' + '/dashboard/inventory/stockaudits': 'stockaudits', + '/dashboard/inventory/purchaseorders': 'purchaseorders' } const InventorySidebar = (props) => { const location = useLocation() const selectedKey = (() => { - const match = Object.keys(routeKeyMap).find((path) => - location.pathname.startsWith(path) - ) - return match ? routeKeyMap[match] : 'filaments' + const match = Object.keys(routeKeyMap).find((path) => { + const pathSplit = path.split('/') + const locationPathSplit = location.pathname.split('/') + if (pathSplit.length > locationPathSplit.length) return false + for (let i = 0; i < pathSplit.length; i++) { + if (pathSplit[i] !== locationPathSplit[i]) return false + } + return true + }) + return match ? routeKeyMap[match] : 'overview' })() return diff --git a/src/components/Dashboard/Inventory/PurchaseOrders.jsx b/src/components/Dashboard/Inventory/PurchaseOrders.jsx new file mode 100644 index 0000000..25e5977 --- /dev/null +++ b/src/components/Dashboard/Inventory/PurchaseOrders.jsx @@ -0,0 +1,101 @@ +import { useState, useRef } from 'react' +import { Button, Flex, Space, Modal, Dropdown, message } from 'antd' +import NewPurchaseOrder from './PurchaseOrders/NewPurchaseOrder' +import ObjectTable from '../common/ObjectTable' +import PlusIcon from '../../Icons/PlusIcon' +import ReloadIcon from '../../Icons/ReloadIcon' +import useColumnVisibility from '../hooks/useColumnVisibility' +import GridIcon from '../../Icons/GridIcon' +import ListIcon from '../../Icons/ListIcon' +import useViewMode from '../hooks/useViewMode' +import ColumnViewButton from '../common/ColumnViewButton' + +const PurchaseOrders = () => { + const [messageApi, contextHolder] = message.useMessage() + const [newPurchaseOrderOpen, setNewPurchaseOrderOpen] = useState(false) + const tableRef = useRef() + + const [viewMode, setViewMode] = useViewMode('purchaseOrders') + + const [columnVisibility, setColumnVisibility] = + useColumnVisibility('purchaseOrders') + + const actionItems = { + items: [ + { + label: 'New Purchase Order', + key: 'newPurchaseOrder', + icon: + }, + { type: 'divider' }, + { + label: 'Reload List', + key: 'reloadList', + icon: + } + ], + onClick: ({ key }) => { + if (key === 'reloadList') { + tableRef.current?.reload() + } else if (key === 'newPurchaseOrder') { + setNewPurchaseOrderOpen(true) + } + } + } + + return ( + <> + + {contextHolder} + + + + + + + + + + + + + + + + + + +
@@ -313,15 +317,15 @@ const ObjectChildTable = ({
}} - pagination={false} size={size} rowKey={resolvedRowKey} scroll={scrollConfig} locale={{ emptyText }} + pagination={false} className={hasRollups ? 'child-table-rollups' : 'child-table'} {...tableProps} /> @@ -382,6 +386,7 @@ const ObjectChildTable = ({ scroll={scrollConfig} locale={{ emptyText }} className={hasRollups ? 'child-table-rollups' : 'child-table'} + style={{ maxWidth, minWidth: 0 }} {...tableProps} /> @@ -400,7 +405,7 @@ const ObjectChildTable = ({ } return ( - + diff --git a/src/components/Dashboard/common/ObjectForm.jsx b/src/components/Dashboard/common/ObjectForm.jsx index 8ba7f3b..a1885c6 100644 --- a/src/components/Dashboard/common/ObjectForm.jsx +++ b/src/components/Dashboard/common/ObjectForm.jsx @@ -13,8 +13,20 @@ import { AuthContext } from '../context/AuthContext' import PropTypes from 'prop-types' import DeleteObjectModal from './DeleteObjectModal' import merge from 'lodash/merge' +import set from 'lodash/set' import { getModelByName } from '../../../database/ObjectModels' +const buildObjectFromEntries = (entries = []) => { + return entries.reduce((acc, entry) => { + const { namePath, value } = entry || {} + if (!Array.isArray(namePath) || value === undefined) { + return acc + } + set(acc, namePath, value) + return acc + }, {}) +} + /** * ObjectForm is a reusable form component for editing any object type. * It handles fetching, updating, locking, unlocking, and validation logic. @@ -116,30 +128,93 @@ const ObjectForm = forwardRef( }) // Function to calculate computed values from model properties - const calculateComputedValues = useCallback((currentData, model) => { - if (!model || !model.properties) return {} + const calculateComputedValues = useCallback( + (currentData, modelDefinition) => { + if (!modelDefinition || !Array.isArray(modelDefinition.properties)) { + return [] + } - const computedValues = {} + const normalizedPath = (name, parentPath = []) => { + if (Array.isArray(name)) { + return [...parentPath, ...name] + } + if (typeof name === 'number') { + return [...parentPath, name] + } + if (typeof name === 'string' && name.length > 0) { + return [...parentPath, ...name.split('.')] + } + return parentPath + } - model.properties.forEach((property) => { - // Check if this property has a computed value function - if (property.value && typeof property.value === 'function') { - try { - const computedValue = property.value(currentData) - if (computedValue !== undefined) { - computedValues[property.name] = computedValue + const getValueAtPath = (dataSource, path) => { + if (!Array.isArray(path) || path.length === 0) { + return dataSource + } + return path.reduce((acc, key) => { + if (acc == null) return acc + return acc[key] + }, dataSource) + } + + const computedEntries = [] + + const processProperty = (property, scopeData, parentPath = []) => { + if (!property?.name) return + + const propertyPath = normalizedPath(property.name, parentPath) + + if (property.value && typeof property.value === 'function') { + try { + const computedValue = property.value(scopeData || {}) + if (computedValue !== undefined) { + computedEntries.push({ + namePath: propertyPath, + value: computedValue + }) + } + } catch (error) { + console.warn( + `Error calculating value for property ${property.name}:`, + error + ) + } + } + + if ( + Array.isArray(property.properties) && + property.properties.length > 0 + ) { + if (property.type === 'objectChildren') { + const childValues = getValueAtPath(currentData, propertyPath) + if (Array.isArray(childValues)) { + childValues.forEach((childData = {}, index) => { + property.properties.forEach((childProperty) => { + processProperty(childProperty, childData || {}, [ + ...propertyPath, + index + ]) + }) + }) + } + } else { + const nestedScope = + getValueAtPath(currentData, propertyPath) || {} + property.properties.forEach((childProperty) => { + processProperty(childProperty, nestedScope || {}, propertyPath) + }) } - } catch (error) { - console.warn( - `Error calculating value for property ${property.name}:`, - error - ) } } - }) - return computedValues - }, []) + modelDefinition.properties.forEach((property) => { + processProperty(property, currentData) + }) + + return computedEntries + }, + [] + ) // Validate form on change (debounced to avoid heavy work on every keystroke) useEffect(() => { @@ -204,8 +279,9 @@ const ObjectForm = forwardRef( serverObjectData.current = data // Calculate and set computed values on initial load - const computedValues = calculateComputedValues(data, model) - const initialFormData = { ...data, ...computedValues } + const computedEntries = calculateComputedValues(data, model) + const computedValuesObject = buildObjectFromEntries(computedEntries) + const initialFormData = merge({}, data, computedValuesObject) form.setFieldsValue(initialFormData) setFetchLoading(false) @@ -290,11 +366,16 @@ const ObjectForm = forwardRef( const cancelEditing = () => { if (serverObjectData.current) { // Recalculate computed values when canceling - const computedValues = calculateComputedValues( + const computedEntries = calculateComputedValues( serverObjectData.current, model ) - const resetFormData = { ...serverObjectData.current, ...computedValues } + const computedValuesObject = buildObjectFromEntries(computedEntries) + const resetFormData = merge( + {}, + serverObjectData.current, + computedValuesObject + ) setIsEditing(false) isEditingRef.current = false form.setFieldsValue(resetFormData) @@ -403,34 +484,38 @@ const ObjectForm = forwardRef( ...(serverObjectData.current || {}), ...allFormValues } - const computedValues = calculateComputedValues( + const computedEntries = calculateComputedValues( currentFormData, model ) - // Update form with computed values if any were calculated and they changed - if (Object.keys(computedValues).length > 0) { - const currentComputedValues = form.getFieldsValue( - Object.keys(computedValues) - ) - const hasDiff = Object.keys(computedValues).some( - (key) => currentComputedValues[key] !== computedValues[key] - ) - - if (hasDiff) { - form.setFieldsValue(computedValues) - } + if (Array.isArray(computedEntries) && computedEntries.length > 0) { + computedEntries.forEach(({ namePath, value }) => { + if (!Array.isArray(namePath) || value === undefined) return + const currentValue = form.getFieldValue(namePath) + if (currentValue !== value) { + if (typeof form.setFieldValue === 'function') { + form.setFieldValue(namePath, value) + } else { + const fallbackPayload = buildObjectFromEntries([ + { namePath, value } + ]) + form.setFieldsValue(fallbackPayload) + } + } + }) } - // Merge all values (user input + computed values) and keep editing flag - const allValues = { - ...allFormValues, - ...computedValues, - _isEditing: isEditingRef.current - } + const computedValuesObject = buildObjectFromEntries(computedEntries) + const mergedFormValues = merge( + {}, + allFormValues, + computedValuesObject + ) + mergedFormValues._isEditing = isEditingRef.current setObjectData((prev) => { - return { ...prev, ...allValues } + return { ...prev, ...mergedFormValues } }) }} > diff --git a/src/components/Dashboard/common/WizardView.jsx b/src/components/Dashboard/common/WizardView.jsx index 3136f97..a9b4873 100644 --- a/src/components/Dashboard/common/WizardView.jsx +++ b/src/components/Dashboard/common/WizardView.jsx @@ -58,10 +58,10 @@ const WizardView = ({ gap={'middle'} style={ sideBarGrow == false - ? { width: '100%' } + ? { width: '100%', minWidth: 0 } : isMobile - ? { width: '100%' } - : { width: '400px' } + ? { width: '100%', minWidth: 0 } + : { width: '400px', minWidth: 0 } } > diff --git a/src/components/Icons/CourierIcon.jsx b/src/components/Icons/CourierIcon.jsx new file mode 100644 index 0000000..5cbe2a5 --- /dev/null +++ b/src/components/Icons/CourierIcon.jsx @@ -0,0 +1,6 @@ +import Icon from '@ant-design/icons' +import CustomIconSvg from '../../../assets/icons/couriericon.svg?react' + +const CourierIcon = (props) => + +export default CourierIcon diff --git a/src/components/Icons/CourierServiceIcon.jsx b/src/components/Icons/CourierServiceIcon.jsx new file mode 100644 index 0000000..71f705f --- /dev/null +++ b/src/components/Icons/CourierServiceIcon.jsx @@ -0,0 +1,7 @@ +import Icon from '@ant-design/icons' +import CustomIconSvg from '../../../assets/icons/courierserviceicon.svg?react' + +const CourierServiceIcon = (props) => + +export default CourierServiceIcon + diff --git a/src/components/Icons/OrderItemsIcon.jsx b/src/components/Icons/OrderItemsIcon.jsx new file mode 100644 index 0000000..068468b --- /dev/null +++ b/src/components/Icons/OrderItemsIcon.jsx @@ -0,0 +1,6 @@ +import Icon from '@ant-design/icons' +import CustomIconSvg from '../../../assets/icons/orderitemsicon.svg?react' + +const OrderItemsIcon = (props) => + +export default OrderItemsIcon diff --git a/src/database/ObjectModels.js b/src/database/ObjectModels.js index 5833024..6ea58f0 100644 --- a/src/database/ObjectModels.js +++ b/src/database/ObjectModels.js @@ -7,6 +7,8 @@ import { Job } from './models/Job' import { Product } from './models/Product' import { Part } from './models/Part.js' import { Vendor } from './models/Vendor' +import { Courier } from './models/Courier' +import { CourierService } from './models/CourierService' import { File } from './models/File' import { SubJob } from './models/SubJob' import { Initial } from './models/Initial' @@ -36,6 +38,8 @@ export const objectModels = [ Product, Part, Vendor, + Courier, + CourierService, File, SubJob, Initial, @@ -66,6 +70,8 @@ export { Product, Part, Vendor, + Courier, + CourierService, File, SubJob, Initial, diff --git a/src/database/models/Courier.js b/src/database/models/Courier.js new file mode 100644 index 0000000..28b40c0 --- /dev/null +++ b/src/database/models/Courier.js @@ -0,0 +1,142 @@ +import CourierIcon from '../../components/Icons/CourierIcon' +import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' +import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' +import ReloadIcon from '../../components/Icons/ReloadIcon' +import BinIcon from '../../components/Icons/BinIcon' + +export const Courier = { + name: 'courier', + label: 'Courier', + prefix: 'COR', + icon: CourierIcon, + actions: [ + { + name: 'info', + label: 'Info', + default: true, + row: true, + icon: InfoCircleIcon, + url: (_id) => `/dashboard/management/couriers/info?courierId=${_id}` + }, + { + name: 'reload', + label: 'Reload', + icon: ReloadIcon, + url: (_id) => + `/dashboard/management/couriers/info?courierId=${_id}&action=reload` + }, + { + name: 'edit', + label: 'Edit', + row: true, + icon: EditIcon, + url: (_id) => + `/dashboard/management/couriers/info?courierId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/couriers/info?courierId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/couriers/info?courierId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { type: 'divider' }, + { + name: 'delete', + label: 'Delete', + icon: BinIcon, + danger: true, + url: (_id) => + `/dashboard/management/couriers/info?courierId=${_id}&action=delete` + } + ], + columns: ['name', '_id', 'country', 'email', 'website', 'createdAt'], + filters: ['name', '_id', 'country', 'email'], + sorters: ['name', 'country', 'email', 'createdAt', '_id'], + group: ['country'], + properties: [ + { + name: '_id', + label: 'ID', + columnFixed: 'left', + type: 'id', + objectType: 'courier', + showCopy: true + }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true + }, + { + name: 'name', + label: 'Name', + columnFixed: 'left', + required: true, + type: 'text' + }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + }, + { + name: 'contact', + label: 'Contact', + type: 'text', + readOnly: false, + required: false + }, + { + name: 'country', + label: 'Country', + type: 'country', + readOnly: false, + required: false + }, + { + name: 'email', + label: 'Email', + columnWidth: 300, + type: 'email', + readOnly: false, + required: false + }, + { + name: 'phone', + label: 'Phone', + type: 'phone', + readOnly: false, + required: false + }, + { + name: 'website', + label: 'Website', + columnWidth: 300, + type: 'url', + readOnly: false, + required: false + } + ] +} diff --git a/src/database/models/CourierService.js b/src/database/models/CourierService.js new file mode 100644 index 0000000..8869cf9 --- /dev/null +++ b/src/database/models/CourierService.js @@ -0,0 +1,170 @@ +import CourierServiceIcon from '../../components/Icons/CourierServiceIcon' +import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' +import EditIcon from '../../components/Icons/EditIcon' +import CheckIcon from '../../components/Icons/CheckIcon' +import XMarkIcon from '../../components/Icons/XMarkIcon' +import ReloadIcon from '../../components/Icons/ReloadIcon' +import BinIcon from '../../components/Icons/BinIcon' + +export const CourierService = { + name: 'courierService', + label: 'Courier Service', + prefix: 'COS', + icon: CourierServiceIcon, + actions: [ + { + name: 'info', + label: 'Info', + default: true, + row: true, + icon: InfoCircleIcon, + url: (_id) => + `/dashboard/management/courierservices/info?courierServiceId=${_id}` + }, + { + name: 'reload', + label: 'Reload', + icon: ReloadIcon, + url: (_id) => + `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=reload` + }, + { + name: 'edit', + label: 'Edit', + row: true, + icon: EditIcon, + url: (_id) => + `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=edit`, + visible: (objectData) => { + return !(objectData?._isEditing && objectData?._isEditing == true) + } + }, + { + name: 'finishEdit', + label: 'Save Edits', + icon: CheckIcon, + url: (_id) => + `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=finishEdit`, + visible: (objectData) => { + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { + name: 'cancelEdit', + label: 'Cancel Edits', + icon: XMarkIcon, + url: (_id) => + `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=cancelEdit`, + visible: (objectData) => { + console.log(objectData?._isEditing) + return objectData?._isEditing && objectData?._isEditing == true + } + }, + { type: 'divider' }, + { + name: 'delete', + label: 'Delete', + icon: BinIcon, + danger: true, + url: (_id) => + `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=delete` + } + ], + columns: [ + 'name', + '_id', + 'courier', + 'courier._id', + 'tracked', + 'deliveryTime', + 'active' + ], + filters: ['name', '_id', 'courier._id', 'active', 'deliveryTime', 'tracked'], + sorters: [ + 'name', + 'courier._id', + 'active', + 'tracked', + 'estimatedDeliveryTime', + 'createdAt', + '_id' + ], + group: ['courier'], + properties: [ + { + name: '_id', + label: 'ID', + columnFixed: 'left', + type: 'id', + objectType: 'courierService', + showCopy: true + }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true + }, + { + name: 'name', + label: 'Name', + columnFixed: 'left', + required: true, + type: 'text' + }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + }, + { + name: 'courier', + label: 'Courier', + type: 'object', + objectType: 'courier', + showHyperlink: true, + required: true + }, + { + name: 'courier._id', + label: 'Courier ID', + type: 'id', + objectType: 'courier', + showHyperlink: true + }, + { + name: 'deliveryTime', + label: 'Delivery Time', + type: 'number', + readOnly: false, + required: false, + suffix: 'days', + columnWidth: 175 + }, + { + name: 'active', + label: 'Active', + type: 'bool', + readOnly: false, + required: true, + columnWidth: 150 + }, + { + name: 'tracked', + label: 'Tracked', + type: 'bool', + readOnly: false, + required: true, + columnWidth: 150 + }, + { + name: 'website', + label: 'Website', + columnWidth: 300, + type: 'url', + readOnly: false, + required: false + } + ] +} diff --git a/src/database/models/Part.js b/src/database/models/Part.js index b8f3978..e87d080 100644 --- a/src/database/models/Part.js +++ b/src/database/models/Part.js @@ -122,11 +122,14 @@ export const Part = { objectType: 'vendor' }, { - name: 'globalPricing', - label: 'Global Price', + name: 'cost', + label: 'Cost', columnWidth: 150, required: true, - type: 'bool' + type: 'number', + prefix: '£', + min: 0, + step: 0.01 }, { name: 'priceMode', @@ -153,18 +156,21 @@ export const Part = { step: 0.01 }, { - name: 'amount', - label: 'Amount', + name: 'price', + label: 'Price', required: true, - disabled: (objectData) => { - return ( - objectData.globalPricing == true || objectData.priceMode == 'margin' - ) - }, type: 'number', prefix: '£', min: 0, - step: 0.1 + step: 0.1, + roundNumber: 2, + value: (objectData) => { + if (objectData?.priceMode == 'margin') { + return objectData?.cost * (1 + objectData?.margin / 100) || undefined + } else { + return objectData?.price || undefined + } + } }, { name: 'file', diff --git a/src/database/models/PurchaseOrder.js b/src/database/models/PurchaseOrder.js index 6321824..865d0ed 100644 --- a/src/database/models/PurchaseOrder.js +++ b/src/database/models/PurchaseOrder.js @@ -2,9 +2,9 @@ import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' export const PurchaseOrder = { - name: 'purchaseorder', - label: 'Product Stock', - prefix: 'PDS', + name: 'purchaseOrder', + label: 'Purchase Order', + prefix: 'POR', icon: PurchaseOrderIcon, actions: [ { @@ -14,8 +14,167 @@ export const PurchaseOrder = { row: true, icon: InfoCircleIcon, url: (_id) => - `/dashboard/management/purchaseorders/info?purchaseOrderId=${_id}` + `/dashboard/inventory/purchaseorders/info?purchaseOrderId=${_id}` } ], - url: (id) => `/dashboard/management/purchaseorders/info?purchaseOrderId=${id}` + group: ['vendor'], + filters: ['vendor', 'vendor._id'], + sorters: ['createdAt', 'state', 'updatedAt'], + columns: ['_id', 'createdAt', 'state', 'updatedAt', 'vendor', 'vendor._id'], + properties: [ + { + name: '_id', + label: 'ID', + type: 'id', + columnFixed: 'left', + objectType: 'purchaseOrder', + columnWidth: 140, + showCopy: true + }, + { + name: 'createdAt', + label: 'Created At', + type: 'dateTime', + readOnly: true + }, + { name: 'state', label: 'State', type: 'state', readOnly: true }, + { + name: 'updatedAt', + label: 'Updated At', + type: 'dateTime', + readOnly: true + }, + { + name: 'vendor', + label: 'Vendor', + required: true, + type: 'object', + objectType: 'vendor' + }, + { + name: 'vendor._id', + label: 'Vendor ID', + readOnly: true, + type: 'id', + showHyperlink: true, + objectType: 'vendor' + }, + { + name: 'courierService', + label: 'Courier Service', + required: true, + type: 'object', + objectType: 'courierService' + }, + { + name: 'courierService._id', + label: 'Courier Service ID', + readOnly: true, + type: 'id', + showHyperlink: true, + objectType: 'courierService' + }, + { + name: 'items', + label: 'Order Items', + type: 'objectChildren', + required: true, + properties: [ + { + name: 'itemType', + label: 'Item Type', + type: 'objectType', + masterFilter: ['part', 'packaging'], + required: true + }, + { + name: 'item', + label: 'Item', + type: 'object', + objectType: (objectData) => { + return objectData?.itemType + }, + required: true + }, + { + name: 'item._id', + label: 'Item ID', + type: 'id', + objectType: (objectData) => { + return objectData?.itemType + }, + showHyperlink: true, + value: (objectData) => { + return objectData?.item?._id + } + }, + { + name: 'quantity', + label: 'Quantity', + type: 'number', + required: true + }, + { + name: 'price', + label: 'Price', + type: 'number', + required: true, + prefix: '£', + min: 0, + step: 0.01, + value: (objectData) => { + if (objectData?.price == undefined) { + console.log('PurchaseOrder.js', objectData) + return ( + (objectData?.item?.cost || 0) * (objectData?.quantity || 0) || + undefined + ) + } else { + return objectData?.part?.price || undefined + } + } + } + ], + rollups: [ + { + name: 'totalQuantity', + label: 'Total', + type: 'number', + property: 'quantity', + value: (objectData) => { + return objectData?.items?.reduce( + (acc, item) => acc + item.quantity, + 0 + ) + } + }, + { + name: 'totalPrice', + label: 'Total', + type: 'number', + prefix: '£', + property: 'price', + value: (objectData) => { + return objectData?.items?.reduce((acc, item) => acc + item.price, 0) + } + } + ] + }, + { + name: 'cost', + label: 'Cost', + type: 'netGross', + required: true, + prefix: '£', + min: 0, + step: 0.01, + value: (objectData) => { + const net = objectData?.items?.reduce( + (acc, item) => acc + item.price, + 0 + ) + return { net: net, gross: net } + } + } + ] } diff --git a/src/database/models/Vendor.js b/src/database/models/Vendor.js index 9dac988..ffef6a8 100644 --- a/src/database/models/Vendor.js +++ b/src/database/models/Vendor.js @@ -69,7 +69,6 @@ export const Vendor = { `/dashboard/management/vendors/info?vendorId=${_id}&action=delete` } ], - url: (id) => `/dashboard/management/vendors/info?vendorId=${id}`, columns: ['name', '_id', 'country', 'email', 'website', 'createdAt'], filters: ['name', '_id', 'country', 'email'], sorters: ['name', 'country', 'email', 'createdAt', '_id'], diff --git a/src/routes/InventoryRoutes.jsx b/src/routes/InventoryRoutes.jsx index 0883769..c76ad5a 100644 --- a/src/routes/InventoryRoutes.jsx +++ b/src/routes/InventoryRoutes.jsx @@ -7,6 +7,8 @@ import PartStockInfo from '../components/Dashboard/Inventory/PartStocks/PartStoc import StockEvents from '../components/Dashboard/Inventory/StockEvents.jsx' import StockAudits from '../components/Dashboard/Inventory/StockAudits.jsx' import StockAuditInfo from '../components/Dashboard/Inventory/StockAudits/StockAuditInfo.jsx' +import PurchaseOrders from '../components/Dashboard/Inventory/PurchaseOrders.jsx' +import PurchaseOrderInfo from '../components/Dashboard/Inventory/PurchaseOrders/PurchaseOrderInfo.jsx' const InventoryRoutes = [ } + />, + } + />, + } /> ] diff --git a/src/routes/ManagementRoutes.jsx b/src/routes/ManagementRoutes.jsx index e9504d9..5ceb824 100644 --- a/src/routes/ManagementRoutes.jsx +++ b/src/routes/ManagementRoutes.jsx @@ -9,6 +9,10 @@ import ProductInfo from '../components/Dashboard/Management/Products/ProductInfo import Vendors from '../components/Dashboard/Management/Vendors' import VendorInfo from '../components/Dashboard/Management/Vendors/VendorInfo' import Materials from '../components/Dashboard/Management/Materials' +import Couriers from '../components/Dashboard/Management/Couriers' +import CourierInfo from '../components/Dashboard/Management/Couriers/CourierInfo.jsx' +import CourierServices from '../components/Dashboard/Management/CourierServices' +import CourierServiceInfo from '../components/Dashboard/Management/CourierServices/CourierServiceInfo.jsx' import Settings from '../components/Dashboard/Management/Settings' import AuditLogs from '../components/Dashboard/Management/AuditLogs.jsx' import NoteTypes from '../components/Dashboard/Management/NoteTypes.jsx' @@ -73,6 +77,22 @@ const ManagementRoutes = [ element={} />, } />, + } />, + } + />, + } + />, + } + />, } />,