diff --git a/src/frontend/package.json b/src/frontend/package.json
index 8502fd209f..cade6cd0a5 100644
--- a/src/frontend/package.json
+++ b/src/frontend/package.json
@@ -54,6 +54,7 @@
"embla-carousel-react": "^8.3.0",
"fuse.js": "^7.0.0",
"html5-qrcode": "^2.3.8",
+ "mantine-contextmenu": "^7.11.3",
"mantine-datatable": "^7.12.4",
"qrcode": "^1.5.4",
"react": "^18.3.1",
diff --git a/src/frontend/src/contexts/ThemeContext.tsx b/src/frontend/src/contexts/ThemeContext.tsx
index 39fcfecd1d..ef7853e145 100644
--- a/src/frontend/src/contexts/ThemeContext.tsx
+++ b/src/frontend/src/contexts/ThemeContext.tsx
@@ -2,6 +2,7 @@ import { t } from '@lingui/macro';
import { MantineProvider, createTheme } from '@mantine/core';
import { ModalsProvider } from '@mantine/modals';
import { Notifications } from '@mantine/notifications';
+import { ContextMenuProvider } from 'mantine-contextmenu';
import { AboutInvenTreeModal } from '../components/modals/AboutInvenTreeModal';
import { LicenseModal } from '../components/modals/LicenseModal';
@@ -40,20 +41,22 @@ export function ThemeContext({
return (
-
-
-
- {children}
-
-
+
+
+
+
+ {children}
+
+
+
);
}
diff --git a/src/frontend/src/main.tsx b/src/frontend/src/main.tsx
index e1dc08cc98..b8377c396c 100644
--- a/src/frontend/src/main.tsx
+++ b/src/frontend/src/main.tsx
@@ -5,6 +5,7 @@ import '@mantine/dates/styles.css';
import '@mantine/notifications/styles.css';
import '@mantine/spotlight/styles.css';
import * as Sentry from '@sentry/react';
+import 'mantine-contextmenu/styles.css';
import 'mantine-datatable/styles.css';
import React from 'react';
import ReactDOM from 'react-dom/client';
diff --git a/src/frontend/src/tables/InvenTreeTable.tsx b/src/frontend/src/tables/InvenTreeTable.tsx
index e131b9f9d7..7ca2aeca88 100644
--- a/src/frontend/src/tables/InvenTreeTable.tsx
+++ b/src/frontend/src/tables/InvenTreeTable.tsx
@@ -1,6 +1,7 @@
import { t } from '@lingui/macro';
import { Box, Stack } from '@mantine/core';
import { useQuery } from '@tanstack/react-query';
+import { useContextMenu } from 'mantine-contextmenu';
import {
DataTable,
type DataTableCellClickHandler,
@@ -87,6 +88,7 @@ export type InvenTreeTableProps = {
modelType?: ModelType;
rowStyle?: (record: T, index: number) => any;
modelField?: string;
+ onRowContextMenu?: (record: T, event: any) => void;
minHeight?: number;
noHeader?: boolean;
};
@@ -137,6 +139,7 @@ export function InvenTreeTable>({
const [fieldNames, setFieldNames] = useState>({});
const navigate = useNavigate();
+ const { showContextMenu } = useContextMenu();
// Construct table filters - note that we can introspect filter labels from column names
const filters: TableFilter[] = useMemo(() => {
@@ -565,6 +568,31 @@ export function InvenTreeTable>({
[props.onRowClick, props.onCellClick]
);
+ // Callback when a row is right-clicked
+ const handleRowContextMenu = ({
+ record,
+ event
+ }: {
+ record: any;
+ event: any;
+ }) => {
+ if (props.onRowContextMenu) {
+ return props.onRowContextMenu(record, event);
+ } else if (props.rowActions) {
+ const empty = () => {};
+ const items = props.rowActions(record).map((action) => ({
+ key: action.title ?? '',
+ title: action.title ?? '',
+ color: action.color,
+ icon: action.icon,
+ onClick: action.onClick ?? empty,
+ hidden: action.hidden,
+ disabled: action.disabled
+ }));
+ return showContextMenu(items)(event);
+ }
+ };
+
// pagination refresth table if pageSize changes
function updatePageSize(newData: number) {
tableState.setPageSize(newData);
@@ -663,6 +691,7 @@ export function InvenTreeTable>({
overflow: 'hidden'
})
}}
+ onRowContextMenu={handleRowContextMenu}
{...optionalParams}
/>
diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock
index 90656d2646..f3821f88ab 100644
--- a/src/frontend/yarn.lock
+++ b/src/frontend/yarn.lock
@@ -3389,6 +3389,11 @@ make-dir@^4.0.0:
dependencies:
semver "^7.5.3"
+mantine-contextmenu@^7.11.3:
+ version "7.12.2"
+ resolved "https://registry.yarnpkg.com/mantine-contextmenu/-/mantine-contextmenu-7.12.2.tgz#60eb6b1aade5136737e894c1c2f3fa8dad22b1c0"
+ integrity sha512-HD/xrGTGkq51WIVOh97gG1C0Z+PgV6gBPzALrPmv14R4t8iBUEJEY1A9CUvnV/yNjxBas+AA+2flXMAc0wyBxw==
+
mantine-datatable@^7.12.4:
version "7.12.4"
resolved "https://registry.yarnpkg.com/mantine-datatable/-/mantine-datatable-7.12.4.tgz#68e5b0ab4dc7e32b505139bf2b4d05fbb1922c0f"