[UI] Add form submission shortcut (#12328)

- Ctrl + enter submits the form
This commit is contained in:
Oliver 2026-07-08 21:14:13 +10:00 committed by GitHub
parent 75f6960782
commit 8e555f6b37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 31 additions and 2 deletions

View File

@ -283,6 +283,14 @@ Example: Editing an existing purchase order via the "Edit Purchase Order" form:
{{ image("concepts/ui_form_edit_po.png", "Edit Purchase Order") }}
### Form Submission
A form can be submitted by clicking the "Submit" button located at the bottom-right corner of the form.
Alternatively, an open form can be submitted using the keyboard shortcut `Ctrl + Enter` (or `Cmd + Enter` on macOS). This shortcut works even while typing in a form field, providing a quick way to submit the form without needing to reach for the mouse. It is particularly useful in multi-line text fields, where pressing `Enter` inserts a new line rather than submitting the form.
The keyboard shortcut is only active while a form is open, and follows the same rules as the "Submit" button - for example, it has no effect while the form is loading, or when editing an existing item without any changes.
### Confirm Actions
Many actions within InvenTree require user confirmation before they can be executed. This is typically implemented through the use of confirmation dialogs, which prompt the user to confirm their intention before proceeding with the action.

View File

@ -17,7 +17,10 @@ export type InvenTreeHotkeyItem = [
HotkeyItemOptions?
];
export function useInvenTreeHotkeys(_keys: InvenTreeHotkeyItem[]) {
export function useInvenTreeHotkeys(
_keys: InvenTreeHotkeyItem[],
tagsToIgnore?: string[]
) {
const keyelems: [string, string][] = _keys.map(([key, description]) => [
key,
description
@ -29,7 +32,7 @@ export function useInvenTreeHotkeys(_keys: InvenTreeHotkeyItem[]) {
HotkeyItemOptions?
][] = _keys.map(([key, _, handler, options]) => [key, handler, options]);
// Register the hotkeys using the Mantine hook
useHotkeys(mappedHotkeys);
useHotkeys(mappedHotkeys, tagsToIgnore);
// register to helper state to store hotkeys
// This allows us to display the hotkeys in the UI

View File

@ -24,6 +24,7 @@ import { useNavigate } from 'react-router-dom';
import { Boundary } from '@lib/components/Boundary';
import { isTrue } from '@lib/functions/Conversion';
import { useInvenTreeHotkeys } from '@lib/functions/Events';
import {
type NestedDict,
constructFormUrl,
@ -599,6 +600,23 @@ export function ApiForm({
[props.onFormError]
);
// Submit the form with Ctrl+Enter (Cmd+Enter on Mac) while it is open.
// An empty tagsToIgnore list allows the hotkey to fire from within form inputs.
useInvenTreeHotkeys(
[
[
'mod+Enter',
t`Submit form`,
() => {
if (!isLoading && (!props.fetchInitialData || isDirty)) {
form.handleSubmit(submitForm, onFormError)();
}
}
]
],
[]
);
if (optionsLoading || initialDataQuery.isFetching) {
return (
<Paper mah={'65vh'}>