From a0e528a5091118ce09c55d3f214ece31f5bd439e Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 20 May 2026 12:13:59 +0000 Subject: [PATCH] Create new notes --- .../src/components/editors/NotesEditor.tsx | 104 ++++++++++++++---- src/frontend/src/forms/CommonForms.tsx | 23 ++++ 2 files changed, 107 insertions(+), 20 deletions(-) diff --git a/src/frontend/src/components/editors/NotesEditor.tsx b/src/frontend/src/components/editors/NotesEditor.tsx index 9350da9150..8d775dcd7e 100644 --- a/src/frontend/src/components/editors/NotesEditor.tsx +++ b/src/frontend/src/components/editors/NotesEditor.tsx @@ -17,7 +17,19 @@ import '@blocknote/core/fonts/inter.css'; import { BlockNoteView } from '@blocknote/mantine'; import '@blocknote/mantine/style.css'; import { useCreateBlockNote } from '@blocknote/react'; -import { Box, Flex, Paper, Tabs } from '@mantine/core'; +import { + Box, + Button, + Flex, + Group, + Paper, + Stack, + Tabs, + Text +} from '@mantine/core'; +import { IconCirclePlus } from '@tabler/icons-react'; +import { useNoteFields } from '../../forms/CommonForms'; +import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useUserState } from '../../states/UserState'; export default function NotesEditor({ @@ -34,7 +46,8 @@ export default function NotesEditor({ const api = useApi(); const user = useUserState(); - const [selectedNote, setSelectedNote] = useState( + // The ID of the selected note + const [selectedNote, setSelectedNote] = useState( undefined ); @@ -57,6 +70,20 @@ export default function NotesEditor({ enabled: !!modelId && !!modelType }); + // Adjust the note selection + useEffect(() => { + // If the currently selected note is not in the list of available notes, then we need to adjust the selection + if ( + selectedNote && + notesQuery.data && + !notesQuery.data.some((note: any) => note.pk === selectedNote) + ) { + setSelectedNote( + notesQuery.data.length > 0 ? notesQuery.data[0].pk : undefined + ); + } + }, [notesQuery.data]); + const canEdit = useMemo( () => user.hasChangePermission(modelType) && @@ -67,25 +94,62 @@ export default function NotesEditor({ const editor = useCreateBlockNote(); + const noteFields = useNoteFields({ modelType: modelType, modelId: modelId }); + + const createNote = useCreateApiFormModal({ + title: t`Add Note`, + fields: noteFields, + url: apiUrl(ApiEndpoints.note_list), + method: 'POST', + successMessage: null, + onFormSuccess: (response: any) => { + notesQuery.refetch().then(() => { + // Select the newly created note + setSelectedNote(response.pk); + }); + } + }); + return ( - - - - - - - - - Manufacturing - Washing - - - + <> + {createNote.modal} + + + + + + + + + + + {notesQuery.data?.map((note: any) => ( + setSelectedNote(note.pk)} + > + + {note.title} + + + ))} + + + + + ); } diff --git a/src/frontend/src/forms/CommonForms.tsx b/src/frontend/src/forms/CommonForms.tsx index 71ae140ac3..2abd4ae649 100644 --- a/src/frontend/src/forms/CommonForms.tsx +++ b/src/frontend/src/forms/CommonForms.tsx @@ -283,3 +283,26 @@ export function useParameterFields({ user ]); } + +export function useNoteFields({ + modelType, + modelId +}: { + modelType: ModelType; + modelId: number; +}): ApiFormFieldSet { + return useMemo(() => { + return { + model_type: { + hidden: true, + value: modelType + }, + model_id: { + hidden: true, + value: modelId + }, + title: {}, + description: {} + }; + }, [modelType, modelId]); +}