@@ -40,6 +40,7 @@ import { useEffect, useRef, useState } from 'react';
4040import { useTaskDialogKeyboard } from './UseTaskDialogKeyboard' ;
4141import { FIELDS } from './constants' ;
4242import { useTaskDialogFocusMap } from './UseTaskDialogFocusMap' ;
43+ import { TagMultiSelect } from './TagMultiSelect' ;
4344
4445export const TaskDialog = ( {
4546 index,
@@ -56,6 +57,7 @@ export const TaskDialog = ({
5657 isCreatingNewProject,
5758 setIsCreatingNewProject,
5859 uniqueProjects,
60+ uniqueTags,
5961 onSaveDescription,
6062 onSaveTags,
6163 onSavePriority,
@@ -1213,104 +1215,41 @@ export const TaskDialog = ({
12131215 < TableCell > Tags:</ TableCell >
12141216 < TableCell >
12151217 { editState . isEditingTags ? (
1216- < div >
1217- < div className = "flex items-center w-full" >
1218- < Input
1219- ref = { ( element ) =>
1220- ( inputRefs . current . tags = element )
1221- }
1222- type = "text"
1223- value = { editState . editTagInput }
1224- onChange = { ( e ) => {
1225- // For allowing only alphanumeric characters
1226- if ( e . target . value . length > 1 ) {
1227- / ^ [ a - z A - Z 0 - 9 ] * $ / . test ( e . target . value . trim ( ) )
1228- ? onUpdateState ( {
1229- editTagInput : e . target . value . trim ( ) ,
1230- } )
1231- : '' ;
1232- } else {
1233- / ^ [ a - z A - Z ] * $ / . test ( e . target . value . trim ( ) )
1234- ? onUpdateState ( {
1235- editTagInput : e . target . value . trim ( ) ,
1236- } )
1237- : '' ;
1238- }
1239- } }
1240- placeholder = "Add a tag (press enter to add)"
1241- className = "flex-grow mr-2"
1242- onKeyDown = { ( e ) => {
1243- if (
1244- e . key === 'Enter' &&
1245- editState . editTagInput . trim ( )
1246- ) {
1247- onUpdateState ( {
1248- editedTags : [
1249- ...editState . editedTags ,
1250- editState . editTagInput . trim ( ) ,
1251- ] ,
1252- editTagInput : '' ,
1253- } ) ;
1254- }
1255- } }
1256- />
1218+ < div className = "space-y-2" >
1219+ < TagMultiSelect
1220+ availableTags = { uniqueTags }
1221+ selectedTags = { editState . editedTags }
1222+ onTagsChange = { ( tags ) =>
1223+ onUpdateState ( { editedTags : tags } )
1224+ }
1225+ placeholder = "Select or create tags"
1226+ />
1227+ < div className = "flex items-center gap-2 whitespace-nowrap" >
12571228 < Button
12581229 variant = "ghost"
12591230 size = "icon"
1260- aria-label = "Save tags "
1231+ aria-label = "save "
12611232 onClick = { ( ) => {
12621233 onSaveTags ( task , editState . editedTags ) ;
1263- onUpdateState ( {
1264- isEditingTags : false ,
1265- editTagInput : '' ,
1266- } ) ;
1234+ onUpdateState ( { isEditingTags : false } ) ;
12671235 } }
12681236 >
12691237 < CheckIcon className = "h-4 w-4 text-green-500" />
12701238 </ Button >
12711239 < Button
12721240 variant = "ghost"
12731241 size = "icon"
1274- aria-label = "Cancel editing tags "
1275- onClick = { ( ) => {
1242+ aria-label = "cancel "
1243+ onClick = { ( ) =>
12761244 onUpdateState ( {
12771245 isEditingTags : false ,
12781246 editedTags : task . tags || [ ] ,
1279- editTagInput : '' ,
1280- } ) ;
1281- } }
1247+ } )
1248+ }
12821249 >
12831250 < XIcon className = "h-4 w-4 text-red-500" />
12841251 </ Button >
12851252 </ div >
1286- < div className = "mt-2" >
1287- { editState . editedTags != null &&
1288- editState . editedTags . length > 0 && (
1289- < div >
1290- < div className = "flex flex-wrap gap-2 col-span-3" >
1291- { editState . editedTags . map ( ( tag , index ) => (
1292- < Badge key = { index } >
1293- < span > { tag } </ span >
1294- < button
1295- type = "button"
1296- className = "ml-2 text-red-500"
1297- onClick = { ( ) =>
1298- onUpdateState ( {
1299- editedTags :
1300- editState . editedTags . filter (
1301- ( t ) => t !== tag
1302- ) ,
1303- } )
1304- }
1305- >
1306- ✖
1307- </ button >
1308- </ Badge >
1309- ) ) }
1310- </ div >
1311- </ div >
1312- ) }
1313- </ div >
13141253 </ div >
13151254 ) : (
13161255 < div className = "flex items-center flex-wrap" >
0 commit comments