11'use client' ;
22
3- import { use , useState } from 'react' ;
3+ import { use } from 'react' ;
44import { ChevronDown , Users } from 'lucide-react' ;
55import Image from 'next/image' ;
6- import { toast } from 'sonner' ;
76import AddTaskModal from '@/lib/components/modal/AddTaskModal' ;
87import AssessmentTemplateEditorSidebar from '@/lib/components/templates/AssessmentTemplateEditorSidebar' ;
98import AssessmentTaskTemplatePreviewPanel from '@/lib/components/templates/AssessmentTaskTemplatePreviewPanel' ;
109import Breadcrumbs from '@/lib/components/core/Breadcrumbs' ;
1110import useAssessmentTemplateEditPage from '@/lib/hooks/useAssessmentTemplateEditPage' ;
1211import { Combobox } from '@/lib/components/ui/Combobox' ;
12+ import { RemovableChip } from '@/lib/components/ui/RemovableChip' ;
1313
1414export default function AssessmentTemplateEditPage ( {
1515 params,
@@ -23,7 +23,7 @@ export default function AssessmentTemplateEditPage({
2323 error,
2424 title,
2525 positions,
26- selectedPositionId ,
26+ selectedPositionIds ,
2727 sections,
2828 notes,
2929 selectedSection,
@@ -35,22 +35,12 @@ export default function AssessmentTemplateEditPage({
3535 deleteSection,
3636 reorderSections,
3737 selectSection,
38- updateSelectedPosition,
39- save,
38+ updateSelectedPositions,
39+ onSave,
40+ addTaskOpen,
41+ setAddTaskOpen,
4042 } = useAssessmentTemplateEditPage ( id ) ;
4143
42- const [ addTaskOpen , setAddTaskOpen ] = useState ( false ) ;
43-
44- const onSave = async ( ) => {
45- const result = await save ( ) ;
46- if ( result . success ) {
47- toast . success ( 'Assessment template saved' ) ;
48- } else {
49- const message = result . errorMessage ?? 'Failed to save assessment template' ;
50- toast . error ( message ) ;
51- }
52- } ;
53-
5444 if ( isLoading ) {
5545 return (
5646 < div className = "flex h-full flex-col items-center justify-center gap-4" >
@@ -97,25 +87,55 @@ export default function AssessmentTemplateEditPage({
9787 < div className = "w-full max-w-[320px] shrink-0" >
9888 < Combobox
9989 options = { positionOptions }
100- value = { selectedPositionId ?? undefined }
101- onChange = { ( value ) => updateSelectedPosition ( ( value as string ) || null ) }
102- placeholder = "Assign to a position"
90+ value = { selectedPositionIds }
91+ onChange = { ( value ) => updateSelectedPositions ( value as string [ ] ) }
92+ multiple
93+ variant = "checkbox"
94+ showSelectAll
95+ placeholder = "Assign to position(s)"
10396 searchPlaceholder = "Search positions..."
10497 emptyText = "No positions found."
10598 showSearchIcon
106- triggerClassName = "h-14 rounded-xl border px-4"
99+ triggerClassName = "rounded-xl border px-4"
107100 contentClassName = "rounded-xl"
108101 trigger = {
109102 < button
110103 type = "button"
111- className = "border-sarge-gray-200 bg-sarge-gray-0 text-sarge-gray-800 flex h-14 w-full items-center gap-3 rounded-xl border px-4 text-left"
104+ className = "border-sarge-gray-200 bg-sarge-gray-0 text-sarge-gray-800 flex min- h-14 w-full items-center gap-3 rounded-xl border px-4 text-left"
112105 >
113106 < Users className = "text-sarge-gray-600 size-5 shrink-0" />
114- < span className = "text-label-s min-w-0 flex-1 truncate" >
115- { positions . find (
116- ( position ) => position . id === selectedPositionId
117- ) ?. title ?? 'Assign to a position' }
118- </ span >
107+ < div className = "flex min-w-0 flex-1 flex-nowrap items-center gap-2 overflow-hidden py-2" >
108+ { selectedPositionIds . length > 0 ? (
109+ < >
110+ { selectedPositionIds . slice ( 0 , 2 ) . map ( ( id ) => {
111+ const pos = positions . find ( ( p ) => p . id === id ) ;
112+ if ( ! pos ) return null ;
113+ return (
114+ < RemovableChip
115+ key = { id }
116+ label = { pos . title }
117+ onRemove = { ( ) =>
118+ updateSelectedPositions (
119+ selectedPositionIds . filter (
120+ ( x ) => x !== id
121+ )
122+ )
123+ }
124+ />
125+ ) ;
126+ } ) }
127+ { selectedPositionIds . length > 2 && (
128+ < span className = "text-label-s text-sarge-gray-500 shrink-0" >
129+ ...
130+ </ span >
131+ ) }
132+ </ >
133+ ) : (
134+ < span className = "text-label-s text-sarge-gray-500" >
135+ Assign to position(s)
136+ </ span >
137+ ) }
138+ </ div >
119139 < ChevronDown className = "text-sarge-gray-600 size-5 shrink-0" />
120140 </ button >
121141 }
0 commit comments