import { useQueryClient } from "@tanstack/react-query"; import { MoreVertical } from "lucide-react"; import { useDeleteWithUndoController, useNotify, useUpdate, useTranslate, } from "ra-core"; import { useEffect, useState } from "react"; import { Link } from "react-router"; import { ReferenceField } from "@/components/ds/admin/reference-field"; import { DateField } from "@/components/ds/admin/date-field"; import { Button } from "@/components/ds/ui/button"; import { Checkbox } from "@/components/ds/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ds/ui/dropdown-menu"; import { translateChoice } from "@/i18n/utils"; import type { Contact, Task as TData } from "../types"; import { TaskEdit } from "./TaskEdit"; export const Task = ({ task, showContact, }: { task: TData; showContact?: boolean; }) => { const notify = useNotify(); const translate = useTranslate(); const queryClient = useQueryClient(); const [openEdit, setOpenEdit] = useState(false); const handleCloseEdit = () => { setOpenEdit(false); }; const [update, { isPending: isUpdatePending, isSuccess, variables }] = useUpdate(); const { handleDelete } = useDeleteWithUndoController({ record: task, redirect: false, mutationOptions: { onSuccess() { notify(translate("crm.task.notification.deleted_success"), { undoable: true, }); }, }, }); const handleEdit = () => { setOpenEdit(true); }; const handleCheck = () => () => { update("tasks", { id: task.id, data: { done_date: task.done_date ? null : new Date().toISOString(), }, previousData: task, }); }; useEffect(() => { // We do not want to invalidate the query when a tack is checked or unchecked if ( isUpdatePending || !isSuccess || variables?.data?.done_date != undefined ) { return; } queryClient.invalidateQueries({ queryKey: ["tasks", "getList"] }); }, [queryClient, isUpdatePending, isSuccess, variables]); const labelId = `checkbox-list-label-${task.id}`; const hasType = typeof task.type === "string" && task.type.toLowerCase() !== "none"; const typeLabel = hasType ? translateChoice(translate, "crm.task.type", task.type, task.type) : ""; return ( <>
{hasType && ( <> {typeLabel}   )} {task.text}
{translate("crm.task.due.label")}  {showContact && ( source="contact_id" reference="contacts" record={task} link="show" className="inline text-sm text-muted-foreground" render={({ referenceRecord }) => { if (!referenceRecord) return null; return ( <> {" "} ({translate("crm.task.related.prefix")}  {referenceRecord?.first_name}{" "} {referenceRecord?.last_name}) ); }} /> )}
{translate("crm.task.action.show_details")} { update("tasks", { id: task.id, data: { due_date: new Date(Date.now() + 24 * 60 * 60 * 1000) .toISOString() .slice(0, 10), }, previousData: task, }); }} > {translate("crm.task.action.postpone_tomorrow")} { update("tasks", { id: task.id, data: { due_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) .toISOString() .slice(0, 10), }, previousData: task, }); }} > {translate("crm.task.action.postpone_next_week")} {translate("crm.task.action.edit")} {translate("ra.action.delete")}
{/* This part is for editing the Task directly via a Dialog */} {openEdit && ( )} ); };