@@ -10,6 +10,7 @@ import { useSocket } from '@/socket/socketContext';
1010import { SocketEvents } from '@/shared/socket-events' ;
1111import { useAuthService } from '@/hooks/useAuth' ;
1212import { Button , Checkbox , Tag } from '@/components' ;
13+ import { sortLabelsBySelection , isLabelSelected } from '@/utils/labelUtils' ;
1314
1415interface LabelsSelectorProps {
1516 task : IProjectTask ;
@@ -30,12 +31,13 @@ const LabelsSelector: React.FC<LabelsSelectorProps> = ({ task, isDarkMode = fals
3031 const { t } = useTranslation ( 'task-list-table' ) ;
3132
3233 const filteredLabels = useMemo ( ( ) => {
33- return (
34- ( labels as ITaskLabel [ ] ) ?. filter ( label =>
35- label . name ?. toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) )
36- ) || [ ]
37- ) ;
38- } , [ labels , searchQuery ] ) ;
34+ const filtered = ( labels as ITaskLabel [ ] ) ?. filter ( label =>
35+ label . name ?. toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) )
36+ ) || [ ] ;
37+
38+ // Sort to show selected labels first using shared utility
39+ return sortLabelsBySelection ( filtered , task ?. labels || [ ] ) ;
40+ } , [ labels , searchQuery , task ?. labels ] ) ;
3941
4042 // Update dropdown position
4143 const updateDropdownPosition = useCallback ( ( ) => {
@@ -149,7 +151,8 @@ const LabelsSelector: React.FC<LabelsSelectorProps> = ({ task, isDarkMode = fals
149151 } ;
150152
151153 const checkLabelSelected = ( labelId : string ) => {
152- return task ?. all_labels ?. some ( existingLabel => existingLabel . id === labelId ) || false ;
154+ // Use task.labels (currently selected labels) instead of all_labels
155+ return isLabelSelected ( labelId , task ?. labels ) ;
153156 } ;
154157
155158 const handleKeyDown = ( e : React . KeyboardEvent ) => {
@@ -261,19 +264,24 @@ const LabelsSelector: React.FC<LabelsSelectorProps> = ({ task, isDarkMode = fals
261264 >
262265 < div className = "text-xs" > { t ( 'noLabelsFound' ) } </ div >
263266 { searchQuery . trim ( ) && (
264- < button
265- onClick = { handleCreateLabel }
266- className = { `
267- mt-2 px-3 py-1 text-xs rounded border transition-colors
268- ${
269- isDarkMode
270- ? 'border-gray-600 text-gray-300 hover:bg-gray-700'
271- : 'border-gray-300 text-gray-600 hover:bg-gray-50'
272- }
273- ` }
274- >
275- { t ( 'createLabelButton' , { name : searchQuery . trim ( ) } ) }
276- </ button >
267+ < >
268+ < button
269+ onClick = { handleCreateLabel }
270+ className = { `
271+ mt-2 px-3 py-1 text-xs rounded border transition-colors
272+ ${
273+ isDarkMode
274+ ? 'border-gray-600 text-gray-300 hover:bg-gray-700'
275+ : 'border-gray-300 text-gray-600 hover:bg-gray-50'
276+ }
277+ ` }
278+ >
279+ { t ( 'createLabelButton' , { name : searchQuery . trim ( ) } ) }
280+ </ button >
281+ < div className = { `mt-2 text-xs ${ isDarkMode ? 'text-gray-500' : 'text-gray-400' } ` } >
282+ { t ( 'labelsSelectorInputTip' ) }
283+ </ div >
284+ </ >
277285 ) }
278286 </ div >
279287 ) }
0 commit comments