- "content": "import { CircleX, Edit, Save, Trash2 } from \"lucide-react\";\nimport {\n Form,\n useDelete,\n useNotify,\n useResourceContext,\n useUpdate,\n WithRecord,\n} from \"ra-core\";\nimport { useState } from \"react\";\nimport type { FieldValues, SubmitHandler } from \"react-hook-form\";\nimport { ReferenceField } from \"@/components/admin/reference-field\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nimport { CompanyAvatar } from \"../companies/CompanyAvatar\";\nimport { Avatar } from \"../contacts/Avatar\";\nimport { RelativeDate } from \"../misc/RelativeDate\";\nimport { Status } from \"../misc/Status\";\nimport { SaleName } from \"../sales/SaleName\";\nimport type { ContactNote, DealNote } from \"../types\";\nimport { NoteAttachments } from \"./NoteAttachments\";\nimport { NoteInputs } from \"./NoteInputs\";\n\nexport const Note = ({\n showStatus,\n note,\n}: {\n showStatus?: boolean;\n note: DealNote | ContactNote;\n isLast: boolean;\n}) => {\n const [isHover, setHover] = useState(false);\n const [isEditing, setEditing] = useState(false);\n const resource = useResourceContext();\n const notify = useNotify();\n\n const [update, { isPending }] = useUpdate();\n\n const [deleteNote] = useDelete(\n resource,\n { id: note.id, previousData: note },\n {\n mutationMode: \"undoable\",\n onSuccess: () => {\n notify(\"Note deleted\", { type: \"info\", undoable: true });\n },\n },\n );\n\n const handleDelete = () => {\n deleteNote();\n };\n\n const handleEnterEditMode = () => {\n setEditing(!isEditing);\n };\n\n const handleCancelEdit = () => {\n setEditing(false);\n setHover(false);\n };\n\n const handleNoteUpdate: SubmitHandler<FieldValues> = (values) => {\n update(\n resource,\n { id: note.id, data: values, previousData: note },\n {\n onSuccess: () => {\n setEditing(false);\n setHover(false);\n },\n },\n );\n };\n\n return (\n <div\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n <div className=\"flex items-center space-x-4 w-full\">\n {resource === \"contactNote\" ? (\n <Avatar width={20} height={20} />\n ) : (\n <ReferenceField source=\"company_id\" reference=\"companies\" link=\"show\">\n <CompanyAvatar width={20} height={20} />\n </ReferenceField>\n )}\n <div className=\"inline-flex h-full items-center text-sm text-muted-foreground\">\n <ReferenceField\n record={note}\n resource={resource}\n source=\"sales_id\"\n reference=\"sales\"\n link={false}\n >\n <WithRecord render={(record) => <SaleName sale={record} />} />\n </ReferenceField>{\" \"}\n added a note{\" \"}\n {showStatus && note.status && (\n <Status className=\"ml-2\" status={note.status} />\n )}\n </div>\n <span className={`${isHover ? \"visible\" : \"invisible\"}`}>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleEnterEditMode}\n className=\"p-1 h-auto cursor-pointer\"\n >\n <Edit className=\"w-4 h-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Edit note</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleDelete}\n className=\"p-1 h-auto cursor-pointer\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Delete note</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </span>\n <div className=\"flex-1\"></div>\n <span className=\"text-sm text-muted-foreground\">\n <RelativeDate date={note.date} />\n </span>\n </div>\n {isEditing ? (\n <Form onSubmit={handleNoteUpdate} record={note}>\n <NoteInputs showStatus={showStatus} />\n <div className=\"flex justify-end mt-4 space-x-4\">\n <Button\n variant=\"ghost\"\n onClick={handleCancelEdit}\n type=\"button\"\n className=\"cursor-pointer\"\n >\n <CircleX className=\"w-4 h-4\" />\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={isPending}\n className=\"flex items-center gap-2 cursor-pointer\"\n >\n <Save className=\"w-4 h-4\" />\n Update note\n </Button>\n </div>\n </Form>\n ) : (\n <div className=\"pt-2 [&_p:empty]:min-h-[0.75em]\">\n {note.text?.split(\"\\n\").map((paragraph: string, index: number) => (\n <p className=\"text-sm leading-6 m-0\" key={index}>\n {paragraph}\n </p>\n ))}\n\n {note.attachments && <NoteAttachments note={note} />}\n </div>\n )}\n </div>\n );\n};\n",
0 commit comments