From f71fb632039ed1f0fdc5bb16d25e9a29bbef45fd Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 5 Dec 2025 20:24:14 +0000 Subject: [PATCH] feat: add due date to new card form --- .../views/board/components/NewCardForm.tsx | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/apps/web/src/views/board/components/NewCardForm.tsx b/apps/web/src/views/board/components/NewCardForm.tsx index 52a7c62e..b5f37579 100644 --- a/apps/web/src/views/board/components/NewCardForm.tsx +++ b/apps/web/src/views/board/components/NewCardForm.tsx @@ -1,6 +1,7 @@ import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; -import { useEffect } from "react"; +import { format } from "date-fns"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { HiOutlineBarsArrowDown, @@ -15,6 +16,7 @@ import type { WorkspaceMember } from "~/components/Editor"; import Avatar from "~/components/Avatar"; import Button from "~/components/Button"; import CheckboxDropdown from "~/components/CheckboxDropdown"; +import DateSelector from "~/components/DateSelector"; import Editor from "~/components/Editor"; import Input from "~/components/Input"; import LabelIcon from "~/components/LabelIcon"; @@ -27,6 +29,7 @@ import { formatMemberDisplayName, getAvatarUrl } from "~/utils/helpers"; type NewCardFormInput = NewCardInput & { isCreateAnotherEnabled: boolean; + dueDate?: Date | null; }; interface QueryParams { @@ -65,6 +68,7 @@ export function NewCardForm({ memberPublicIds: [], isCreateAnotherEnabled: false, position: "start", + dueDate: null, }, resetOnClose: true, }); @@ -80,6 +84,8 @@ export function NewCardForm({ const position = watch("position"); const title = watch("title"); const description = watch("description"); + const dueDate = watch("dueDate"); + const [isDateSelectorOpen, setIsDateSelectorOpen] = useState(false); // saving form state whenever form values change useEffect(() => { @@ -137,6 +143,7 @@ export function NewCardForm({ title: args.title, listId: 2, description: "", + dueDate: args.dueDate ?? null, labels: oldBoard.labels.filter((label) => args.labelPublicIds.includes(label.publicId), ), @@ -193,6 +200,7 @@ export function NewCardForm({ memberPublicIds: [], isCreateAnotherEnabled, position, + dueDate: null, }; reset(newFormState); saveFormState(newFormState); @@ -242,7 +250,7 @@ export function NewCardForm({ ), })) ?? []; - const onSubmit = (data: NewCardInput) => { + const onSubmit = (data: NewCardFormInput) => { createCard.mutate({ title: data.title, description: data.description, @@ -250,6 +258,7 @@ export function NewCardForm({ labelPublicIds: data.labelPublicIds, memberPublicIds: data.memberPublicIds, position: data.position, + dueDate: data.dueDate ?? null, }); }; @@ -448,6 +457,44 @@ export function NewCardForm({ +
+ + {isDateSelectorOpen && ( + <> +
setIsDateSelectorOpen(false)} + /> +
{ + e.stopPropagation(); + }} + onMouseDown={(e) => { + e.stopPropagation(); + }} + > + { + setValue("dueDate", date ?? null); + setIsDateSelectorOpen(false); + }} + /> +
+ + )} +