2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00

[PUI] Machines table refactor (#8352)

* Reorganize MachineManagementPanel

- Use Accordion
- More consistent with PluginManagementPanel

* Code cleanup

* Refactor machine drawer display

* Refactor MachineTypeDetailDrawer
This commit is contained in:
Oliver 2024-10-24 15:24:52 +11:00 committed by GitHub
parent 9f9afa1593
commit 328472701d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 357 additions and 293 deletions

View File

@ -1,18 +1,20 @@
import { Trans } from '@lingui/macro';
import { t } from '@lingui/macro';
import {
Accordion,
ActionIcon,
Alert,
Code,
Group,
List,
Space,
Stack,
Text,
Title
Text
} from '@mantine/core';
import { IconRefresh } from '@tabler/icons-react';
import { IconInfoCircle, IconRefresh } from '@tabler/icons-react';
import { useQuery } from '@tanstack/react-query';
import { useMemo } from 'react';
import { api } from '../../../../App';
import { StylishText } from '../../../../components/items/StylishText';
import { ApiEndpoints } from '../../../../enums/ApiEndpoints';
import { apiUrl } from '../../../../states/ApiState';
import { MachineListTable } from '../../../../tables/machine/MachineListTable';
@ -32,36 +34,66 @@ export default function MachineManagementPanel() {
staleTime: 10 * 1000
});
const hasErrors = useMemo(() => {
return (
<Stack>
registryStatus?.registry_errors &&
registryStatus.registry_errors.length > 0
);
}, [registryStatus]);
return (
<Accordion multiple defaultValue={['machinelist', 'machinetypes']}>
<Accordion.Item value="machinelist">
<Accordion.Control>
<StylishText size="lg">{t`Machines`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<MachineListTable props={{}} />
<Space h="10px" />
<Stack gap={'xs'}>
<Title order={5}>
<Trans>Machine types</Trans>
</Title>
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item value="machinetypes">
<Accordion.Control>
<StylishText size="lg">{t`Machine Types`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<MachineTypeListTable props={{}} />
</Stack>
<Space h="10px" />
<Stack gap={'xs'}>
<Group>
<Title order={5}>
<Trans>Machine Error Stack</Trans>
</Title>
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item value="machineerrors">
<Accordion.Control>
<StylishText size="lg">{t`Machine Errors`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<Stack gap="xs">
<Group
justify="space-beteen"
wrap="nowrap"
style={{ width: '100%' }}
>
{hasErrors ? (
<Alert
flex={10}
color="red"
title={t`Registry Registry Errors`}
icon={<IconInfoCircle />}
>
<Text>{t`There are machine registry errors`}</Text>
</Alert>
) : (
<Alert
flex={10}
color="green"
title={t`Machine Registry Errors`}
icon={<IconInfoCircle />}
>
<Text>{t`There are no machine registry errors`}</Text>
</Alert>
)}
<ActionIcon variant="outline" onClick={() => refetch()}>
<IconRefresh />
</ActionIcon>
</Group>
{registryStatus?.registry_errors &&
registryStatus.registry_errors.length === 0 ? (
<Text style={{ fontStyle: 'italic' }}>
<Trans>There are no machine registry errors.</Trans>
</Text>
) : (
{hasErrors && (
<List>
{registryStatus?.registry_errors?.map((error, i) => (
<List.Item key={i}>
@ -71,6 +103,8 @@ export default function MachineManagementPanel() {
</List>
)}
</Stack>
</Stack>
</Accordion.Panel>
</Accordion.Item>
</Accordion>
);
}

View File

@ -1,6 +1,6 @@
import { Trans, t } from '@lingui/macro';
import {
ActionIcon,
Accordion,
Badge,
Box,
Card,
@ -10,7 +10,6 @@ import {
Indicator,
List,
LoadingOverlay,
Space,
Stack,
Text,
Title
@ -30,6 +29,7 @@ import {
OptionsActionDropdown
} from '../../components/items/ActionDropdown';
import { InfoItem } from '../../components/items/InfoItem';
import { StylishText } from '../../components/items/StylishText';
import { UnavailableIndicator } from '../../components/items/UnavailableIndicator';
import {
DetailDrawer,
@ -237,13 +237,12 @@ function MachineDrawer({
});
return (
<>
<Stack gap="xs">
{machineEditModal.modal}
{machineDeleteModal.modal}
<Group justify="space-between">
<Box></Box>
<Group>
{machine && <MachineStatusIndicator machine={machine} />}
<Title order={4}>{machine?.name}</Title>
@ -284,16 +283,17 @@ function MachineDrawer({
</Group>
</Group>
<Accordion
multiple
defaultValue={['machine-info', 'machine-settings', 'driver-settings']}
>
<Accordion.Item value="machine-info">
<Accordion.Control>
<StylishText size="lg">{t`Machine Information`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<Card withBorder>
<Stack gap="md">
<Group justify="space-between">
<Title order={4}>
<Trans>Machine information</Trans>
</Title>
<ActionIcon variant="outline" onClick={() => refetch()}>
<IconRefresh />
</ActionIcon>
</Group>
<Stack pos="relative" gap="xs">
<LoadingOverlay
visible={isFetching}
@ -322,7 +322,9 @@ function MachineDrawer({
) : (
<Text>{machine?.driver}</Text>
)}
{!machine?.is_driver_available && <UnavailableIndicator />}
{!machine?.is_driver_available && (
<UnavailableIndicator />
)}
</Group>
</InfoItem>
<InfoItem name={t`Initialized`}>
@ -368,34 +370,43 @@ function MachineDrawer({
</Stack>
</Stack>
</Card>
<Space h="10px" />
</Accordion.Panel>
</Accordion.Item>
{machine?.is_driver_available && (
<>
<Accordion.Item value="machine-settings">
<Accordion.Control>
<StylishText size="lg">{t`Machine Settings`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<Card withBorder>
<Title order={5} pb={4}>
<Trans>Machine Settings</Trans>
</Title>
<MachineSettingList
machinePk={machinePk}
configType="M"
onChange={refreshAll}
/>
</Card>
</Accordion.Panel>
</Accordion.Item>
)}
{machine?.is_driver_available && (
<Accordion.Item value="driver-settings">
<Accordion.Control>
<StylishText size="lg">{t`Driver Settings`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<Card withBorder>
<Title order={5} pb={4}>
<Trans>Driver Settings</Trans>
</Title>
<MachineSettingList
machinePk={machinePk}
configType="D"
onChange={refreshAll}
/>
</Card>
</>
</Accordion.Panel>
</Accordion.Item>
)}
</Accordion>
</Stack>
</>
);
}
@ -543,8 +554,8 @@ export function MachineListTable({
const tableActions = useMemo(() => {
return [
<AddItemButton
key="outline"
variant="outline"
key="add-machine"
tooltip={t`Add machine`}
onClick={() => {
setCreateFormMachineType(null);
createMachineForm.open();
@ -558,8 +569,8 @@ export function MachineListTable({
{createMachineForm.modal}
{renderMachineDrawer && (
<DetailDrawer
title={t`Machine detail`}
size={'lg'}
title={t`Machine Detail`}
size={'xl'}
renderContent={(id) => {
if (!id || !id.startsWith('machine-')) return false;
return (

View File

@ -1,6 +1,8 @@
import { Trans, t } from '@lingui/macro';
import {
Accordion,
ActionIcon,
Alert,
Badge,
Card,
Code,
@ -11,11 +13,12 @@ import {
Text,
Title
} from '@mantine/core';
import { IconRefresh } from '@tabler/icons-react';
import { IconExclamationCircle, IconRefresh } from '@tabler/icons-react';
import { useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { InfoItem } from '../../components/items/InfoItem';
import { StylishText } from '../../components/items/StylishText';
import { DetailDrawer } from '../../components/nav/DetailDrawer';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useTable } from '../../hooks/UseTable';
@ -79,37 +82,49 @@ function MachineTypeDrawer({
);
return (
<>
<Stack>
<Group justify="center">
<Group wrap="nowrap">
<Title order={4}>
{machineType ? machineType.name : machineTypeSlug}
</Title>
</Group>
{!machineType && (
<Text style={{ fontStyle: 'italic' }}>
<Trans>Machine type not found.</Trans>
</Text>
<Alert
color="red"
title={t`Not Found`}
icon={<IconExclamationCircle />}
>
<Text>{t`Machine type not found.`}</Text>
</Alert>
)}
<Accordion
multiple
defaultValue={['machine-type-info', 'machine-drivers']}
>
<Accordion.Item value="machine-type-info">
<Accordion.Control>
<StylishText size="lg">{t`Machine Type Information`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<Card withBorder>
<Stack gap="md">
<Group justify="space-between">
<Title order={4}>
<Trans>Machine type information</Trans>
</Title>
<ActionIcon variant="outline" onClick={() => refresh()}>
<IconRefresh />
</ActionIcon>
</Group>
<Stack pos="relative" gap="xs">
<LoadingOverlay
visible={isFetching}
overlayProps={{ opacity: 0 }}
/>
<InfoItem name={t`Name`} value={machineType?.name} type="text" />
<InfoItem name={t`Slug`} value={machineType?.slug} type="text" />
<InfoItem
name={t`Name`}
value={machineType?.name}
type="text"
/>
<InfoItem
name={t`Slug`}
value={machineType?.slug}
type="text"
/>
<InfoItem
name={t`Description`}
value={machineType?.description}
@ -139,15 +154,15 @@ function MachineTypeDrawer({
type="boolean"
/>
</Stack>
</Stack>
</Card>
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item value="machine-drivers">
<Accordion.Control>
<StylishText size="lg">{t`Available Drivers`}</StylishText>
</Accordion.Control>
<Accordion.Panel>
<Card withBorder>
<Stack gap="md">
<Title order={4}>
<Trans>Available drivers</Trans>
</Title>
<InvenTreeTable
url={apiUrl(ApiEndpoints.machine_driver_list)}
tableState={table}
@ -160,12 +175,16 @@ function MachineTypeDrawer({
},
enableDownload: false,
enableSearch: false,
onRowClick: (machine) => navigate(`../driver-${machine.slug}/`)
onRowClick: (machine) =>
navigate(`../driver-${machine.slug}/`)
}}
/>
</Stack>
</Card>
</Accordion.Panel>
</Accordion.Item>
</Accordion>
</Stack>
</>
);
}
@ -335,8 +354,8 @@ export function MachineTypeListTable({
return (
<>
<DetailDrawer
title={t`Machine type detail`}
size={'lg'}
title={t`Machine Type Detail`}
size={'xl'}
renderContent={(id) => {
if (!id || !id.startsWith('type-')) return false;
return (
@ -345,8 +364,8 @@ export function MachineTypeListTable({
}}
/>
<DetailDrawer
title={t`Machine driver detail`}
size={'lg'}
title={t`Machine Driver Detail`}
size={'xl'}
renderContent={(id) => {
if (!id || !id.startsWith('driver-')) return false;
return (