From 46cd01deb499f579796a9ae4128d9f3e07bf214e Mon Sep 17 00:00:00 2001 From: Shiva Gupta Date: Tue, 30 Dec 2025 22:46:40 +0530 Subject: [PATCH] feat(tags): implement multi-select tag component for Add/Edit Task dialogs - Create SearchAndAddSelector component with search, select, and create functionality - Use local Popover (no Portal) to fix click-through issue in Dialog without modifying global popover.tsx - Display selected tags as removable chips with X buttons - Add search filtering for existing tags - Add inline "Create new tag" option for non-existing tags - Integrate SearchAndAddSelector into TaskDialog and AddTaskDialog Bug fix: - Fix tag removal not persisting: now sends tags with "-" prefix to backend for removals - Updated handleSaveTags to calculate tag additions and removals correctly Tests: - Add comprehensive tests for SearchAndAddSelector component - Update AddTaskDialog tests for new tag selection flow - Update TaskDialog tests for tag editing with SearchAndAddSelector - Mock SearchAndAddSelector in tests Fixes: #210 --- .../HomeComponents/Tasks/AddTaskDialog.tsx | 63 +--- .../Tasks/SearchAndAddSelector.tsx | 166 ++++++++ .../HomeComponents/Tasks/TaskDialog.tsx | 146 ++------ .../components/HomeComponents/Tasks/Tasks.tsx | 37 +- .../HomeComponents/Tasks/UseEditTask.tsx | 2 - .../Tasks/__tests__/AddTaskDialog.test.tsx | 113 +++--- .../__tests__/SearchAndAddSelector.test.tsx | 353 ++++++++++++++++++ .../Tasks/__tests__/TaskDialog.test.tsx | 125 ++++--- .../Tasks/__tests__/Tasks.test.tsx | 107 +++--- .../Tasks/__tests__/UseEditTask.test.ts | 1 - frontend/src/components/utils/types.ts | 7 +- 11 files changed, 775 insertions(+), 345 deletions(-) create mode 100644 frontend/src/components/HomeComponents/Tasks/SearchAndAddSelector.tsx create mode 100644 frontend/src/components/HomeComponents/Tasks/__tests__/SearchAndAddSelector.test.tsx diff --git a/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx b/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx index bbaad655..8f2c1353 100644 --- a/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx +++ b/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx @@ -24,18 +24,18 @@ import { } from '@/components/ui/select'; import { AddTaskDialogProps } from '@/components/utils/types'; import { format } from 'date-fns'; +import { SearchAndAddSelector } from './SearchAndAddSelector'; export const AddTaskdialog = ({ isOpen, setIsOpen, newTask, setNewTask, - tagInput, - setTagInput, onSubmit, isCreatingNewProject, setIsCreatingNewProject, uniqueProjects = [], + uniqueTags = [], allTasks = [], }: AddTaskDialogProps) => { const [annotationInput, setAnnotationInput] = useState(''); @@ -102,20 +102,6 @@ export const AddTaskdialog = ({ }); }; - const handleAddTag = () => { - if (tagInput && !newTask.tags.includes(tagInput, 0)) { - setNewTask({ ...newTask, tags: [...newTask.tags, tagInput] }); - setTagInput(''); - } - }; - - const handleRemoveTag = (tagToRemove: string) => { - setNewTask({ - ...newTask, - tags: newTask.tags.filter((tag) => tag !== tagToRemove), - }); - }; - return ( @@ -194,6 +180,7 @@ export const AddTaskdialog = ({
setTagInput(e.target.value)} - onKeyDown={(e) => e.key === 'Enter' && handleAddTag()} - required - className="col-span-6" +
+ setNewTask({ ...newTask, tags })} + placeholder="Search or create tag.." />
- -
- {newTask.tags.length > 0 && ( -
-
-
- {newTask.tags.map((tag, index) => ( - - {tag} - - - ))} -
-
- )} -