From 66e137fac27f70a97526b9a8fa36063ea7737df8 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 20 Jul 2025 18:29:48 +0100 Subject: [PATCH] Refactor LockIndicator imports to use common path across components, remove unused LockIndicator file, and update related components for consistency. Enhance DashboardBreadcrumb for improved path mapping and add Hosts section to ManagementSidebar. Adjust ObjectSelect for better object handling and update ObjectTable for improved loading behavior. --- src/components/App/AuthCallback.jsx | 75 +++ .../FilamentStocks/FilamentStockInfo.jsx | 2 +- .../FilamentStocks/LoadFilamentStock.jsx | 1 - .../Management/Filaments/FilamentInfo.jsx | 2 +- src/components/Dashboard/Management/Hosts.jsx | 105 ++++ .../Dashboard/Management/Hosts/HostInfo.jsx | 186 +++++++ .../Dashboard/Management/Hosts/NewHost.jsx | 117 ++++ .../Management/ManagementSidebar.jsx | 10 +- .../Management/NoteTypes/NoteTypeInfo.jsx | 2 +- .../Dashboard/Management/Parts/PartInfo.jsx | 2 +- .../Management/Products/ProductInfo.jsx | 2 +- .../Dashboard/Management/Users/UserInfo.jsx | 2 +- .../Management/Vendors/VendorInfo.jsx | 2 +- .../Production/GCodeFiles/GCodeFileInfo.jsx | 2 +- .../Dashboard/Production/Jobs/JobInfo.jsx | 9 +- .../Dashboard/Production/Jobs/NewJob.jsx | 19 +- .../Production/Printers/PrinterInfo.jsx | 2 +- .../Dashboard/common/CountryDisplay.jsx | 4 +- .../Dashboard/common/DashboardBreadcrumb.jsx | 89 ++- .../Dashboard/common/DashboardNavigation.jsx | 292 +++++----- .../Dashboard/common/DashboardSidebar.jsx | 8 +- .../common/DashboardWindowButtons.jsx | 50 ++ .../Dashboard/common/DeleteObjectModal.jsx | 15 +- .../Dashboard/common/EditObjectForm.jsx | 3 +- .../Dashboard/common/GCodeFileSelect.jsx | 4 +- .../Filaments => common}/LockIndicator.jsx | 4 +- .../Dashboard/common/NotesPanel.jsx | 6 +- .../Dashboard/common/ObjectDisplay.jsx | 27 + .../Dashboard/common/ObjectList.jsx | 43 +- .../Dashboard/common/ObjectProperty.jsx | 61 +-- .../Dashboard/common/ObjectSelect.jsx | 512 +++++++----------- .../Dashboard/common/ObjectTable.jsx | 43 +- .../Dashboard/common/PrinterMovementPanel.jsx | 2 - src/components/Icons/ContractIcon.jsx | 7 + src/components/Icons/ExpandIcon.jsx | 7 + src/components/Icons/HostIcon.jsx | 7 + src/components/Icons/MinusIcon.jsx | 7 + src/database/ObjectModels.js | 3 + src/database/models/Host.js | 90 +++ src/database/models/Job.js | 2 +- src/database/models/SubJob.js | 2 +- 41 files changed, 1163 insertions(+), 665 deletions(-) create mode 100644 src/components/App/AuthCallback.jsx create mode 100644 src/components/Dashboard/Management/Hosts.jsx create mode 100644 src/components/Dashboard/Management/Hosts/HostInfo.jsx create mode 100644 src/components/Dashboard/Management/Hosts/NewHost.jsx create mode 100644 src/components/Dashboard/common/DashboardWindowButtons.jsx rename src/components/Dashboard/{Management/Filaments => common}/LockIndicator.jsx (85%) create mode 100644 src/components/Dashboard/common/ObjectDisplay.jsx create mode 100644 src/components/Icons/ContractIcon.jsx create mode 100644 src/components/Icons/ExpandIcon.jsx create mode 100644 src/components/Icons/HostIcon.jsx create mode 100644 src/components/Icons/MinusIcon.jsx create mode 100644 src/database/models/Host.js diff --git a/src/components/App/AuthCallback.jsx b/src/components/App/AuthCallback.jsx new file mode 100644 index 0000000..ffc5ff1 --- /dev/null +++ b/src/components/App/AuthCallback.jsx @@ -0,0 +1,75 @@ +import React, { useState, useEffect, useContext, useCallback } from 'react' +import { Flex, Card, Alert } from 'antd' +import { LoadingOutlined } from '@ant-design/icons' +import AuthParticles from './AppParticles' +import FarmControlLogo from '../Logos/FarmControlLogo' +import { AuthContext } from '../Dashboard/context/AuthContext' +import { useLocation, useNavigate } from 'react-router-dom' + +const AuthCallback = () => { + const [isVisible, setIsVisible] = useState(false) + const [loading, setLoading] = useState(false) + const [initialized, setInitialized] = useState(false) + const { getLoginToken } = useContext(AuthContext) + const location = useLocation() + const navigate = useNavigate() + const code = new URLSearchParams(location.search).get('code') + const state = new URLSearchParams(location.search).get('state') + + const handleGetloginToken = useCallback(async () => { + await getLoginToken(code) + setLoading(false) + navigate(state) + }, [code, state, navigate, getLoginToken]) + + useEffect(() => { + const timer = setTimeout(() => { + setIsVisible(true) + }, 1000) + if (!initialized && !loading) { + handleGetloginToken() + setInitialized(true) + setLoading(true) + } + return () => clearTimeout(timer) + }, [handleGetloginToken, initialized, loading]) + + return ( +
+
+ + + + + + + + } + showIcon + /> + +
+
+ ) +} + +export default AuthCallback diff --git a/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx b/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx index 8dc0c38..b175b6c 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx @@ -11,7 +11,7 @@ import EditButtons from '../../common/EditButtons' import ActionHandler from '../../common/ActionHandler' import InfoCollapse from '../../common/InfoCollapse' import NotesPanel from '../../common/NotesPanel' -import LockIndicator from '../../Management/Filaments/LockIndicator' +import LockIndicator from '../../common/LockIndicator' import InfoCircleIcon from '../../../Icons/InfoCircleIcon' import FilamentStockIcon from '../../../Icons/FilamentStockIcon' import NoteIcon from '../../../Icons/NoteIcon' diff --git a/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx b/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx index b18685a..19d5ee1 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks/LoadFilamentStock.jsx @@ -90,7 +90,6 @@ const LoadFilamentStock = ({ ) ) } - logger.debug(statusUpdate) } printServer.emit('printer.objects.subscribe', params) diff --git a/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx b/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx index cf2fc4c..b7604b1 100644 --- a/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx +++ b/src/components/Dashboard/Management/Filaments/FilamentInfo.jsx @@ -14,7 +14,7 @@ import NoteIcon from '../../../Icons/NoteIcon.jsx' import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx' import EditObjectForm from '../../common/EditObjectForm' import EditButtons from '../../common/EditButtons' -import LockIndicator from './LockIndicator' +import LockIndicator from '../../common/LockIndicator.jsx' import ActionHandler from '../../common/ActionHandler' import ObjectActions from '../../common/ObjectActions.jsx' import ObjectTable from '../../common/ObjectTable.jsx' diff --git a/src/components/Dashboard/Management/Hosts.jsx b/src/components/Dashboard/Management/Hosts.jsx new file mode 100644 index 0000000..67108a0 --- /dev/null +++ b/src/components/Dashboard/Management/Hosts.jsx @@ -0,0 +1,105 @@ +// src/hosts.js + +import React, { useRef, useState } from 'react' +import { Button, Flex, Space, Modal, message, Dropdown } from 'antd' + +import NewHost from './Hosts/NewHost' + +import useColumnVisibility from '../hooks/useColumnVisibility' +import ColumnViewButton from '../common/ColumnViewButton' +import ObjectTable from '../common/ObjectTable' +import PlusIcon from '../../Icons/PlusIcon' +import ReloadIcon from '../../Icons/ReloadIcon' +import ListIcon from '../../Icons/ListIcon' +import GridIcon from '../../Icons/GridIcon' +import useViewMode from '../hooks/useViewMode' + +const Hosts = () => { + const [messageApi, contextHolder] = message.useMessage() + const [newHostOpen, setNewHostOpen] = useState(false) + const tableRef = useRef() + + // View mode state (cards/list), persisted in sessionStorage via custom hook + const [viewMode, setViewMode] = useViewMode('host') + + const [columnVisibility, setColumnVisibility] = useColumnVisibility('host') + + const actionItems = { + items: [ + { + label: 'New Host', + key: 'newHost', + icon: + }, + { type: 'divider' }, + { + label: 'Reload List', + key: 'reloadList', + icon: + } + ], + onClick: ({ key }) => { + if (key === 'reloadList') { + tableRef.current?.reload() + } else if (key === 'newHost') { + setNewHostOpen(true) + } + } + } + + return ( + <> + + {contextHolder} + + + + + + + + +