diff --git a/src/frontend/src/tables/bom/BomTable.tsx b/src/frontend/src/tables/bom/BomTable.tsx
index 401b0c109b..1f4694fff4 100644
--- a/src/frontend/src/tables/bom/BomTable.tsx
+++ b/src/frontend/src/tables/bom/BomTable.tsx
@@ -1,19 +1,3 @@
-import { t } from '@lingui/core/macro';
-import { ActionIcon, Alert, Group, Stack, Text, Tooltip } from '@mantine/core';
-import { showNotification } from '@mantine/notifications';
-import {
- IconArrowRight,
- IconCircleCheck,
- IconExclamationCircle,
- IconFileArrowLeft,
- IconLock,
- IconSwitch3
-} from '@tabler/icons-react';
-import { type ReactNode, useCallback, useMemo, useState } from 'react';
-import { useNavigate } from 'react-router-dom';
-
-import { ActionButton } from '@lib/components/ActionButton';
-import { AddItemButton } from '@lib/components/AddItemButton';
import {
type RowAction,
RowDeleteAction,
@@ -27,8 +11,23 @@ import { apiUrl } from '@lib/functions/Api';
import { navigateToLink } from '@lib/functions/Navigation';
import type { TableFilter } from '@lib/types/Filters';
import type { TableColumn } from '@lib/types/Tables';
+import { t } from '@lingui/core/macro';
+import { ActionIcon, Alert, Group, Stack, Text, Tooltip } from '@mantine/core';
+import { showNotification } from '@mantine/notifications';
+import {
+ IconArrowRight,
+ IconCircleCheck,
+ IconExclamationCircle,
+ IconFileUpload,
+ IconLock,
+ IconPlus,
+ IconSwitch3
+} from '@tabler/icons-react';
+import { type ReactNode, useCallback, useMemo, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
import { Thumbnail } from '../../components/images/Thumbnail';
import ImporterDrawer from '../../components/importer/ImporterDrawer';
+import { ActionDropdown } from '../../components/items/ActionDropdown';
import { RenderPart } from '../../components/render/Part';
import { useApi } from '../../contexts/ApiContext';
import { formatDecimal, formatPriceRange } from '../../defaults/formatters';
@@ -613,18 +612,26 @@ export function BomTable({
const tableActions = useMemo(() => {
return [
- }
hidden={partLocked || !user.hasAddRole(UserRoles.part)}
- tooltip={t`Import BOM Data`}
- icon={}
- onClick={() => importBomItem.open()}
- />,
- newBomItem.open()}
+ actions={[
+ {
+ name: t`Add BOM Item`,
+ icon: ,
+ tooltip: t`Add a single BOM item`,
+ onClick: () => newBomItem.open()
+ },
+ {
+ name: t`Import from File`,
+ icon: ,
+ tooltip: t`Import BOM items from a file`,
+ onClick: () => importBomItem.open()
+ }
+ ]}
/>
];
}, [partLocked, user]);
diff --git a/src/frontend/tests/pages/pui_part.spec.ts b/src/frontend/tests/pages/pui_part.spec.ts
index 0f92cc61e4..96cdbdf35b 100644
--- a/src/frontend/tests/pages/pui_part.spec.ts
+++ b/src/frontend/tests/pages/pui_part.spec.ts
@@ -175,8 +175,12 @@ test('Part - Editing', async ({ browser }) => {
test('Parts - Locking', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'part/104/bom' });
+
await loadTab(page, 'Bill of Materials');
- await page.getByLabel('action-button-add-bom-item').waitFor();
+ await page
+ .getByRole('button', { name: 'action-menu-add-bom-items' })
+ .waitFor();
+
await loadTab(page, 'Parameters');
await page.getByLabel('action-button-add-parameter').waitFor();
diff --git a/src/frontend/tests/pui_importing.spec.ts b/src/frontend/tests/pui_importing.spec.ts
index 868a3b857c..32c5ca9006 100644
--- a/src/frontend/tests/pui_importing.spec.ts
+++ b/src/frontend/tests/pui_importing.spec.ts
@@ -80,8 +80,13 @@ test('Importing - BOM', async ({ browser }) => {
url: 'part/109/bom'
});
+ // Open the BOM importer wizard
+ await page.getByRole('button', { name: 'action-menu-add-bom-items' }).click();
+
await page
- .getByRole('button', { name: 'action-button-import-bom-data' })
+ .getByRole('menuitem', {
+ name: 'action-menu-add-bom-items-import-from-file'
+ })
.click();
// Select BOM file fixture for import