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} + + + + + + + + +