@@ -29,7 +29,6 @@ import { TableCell, TableRow } from "@codevs/ui/table";
2929
3030import { ProjectSelect } from "../shared/ProjectSelect" ;
3131
32- // Role interface for type safety
3332export interface Role {
3433 id : number ;
3534 name : string ;
@@ -43,11 +42,13 @@ interface EditableRowProps {
4342}
4443
4544/**
46- * ENHANCED EditableRow Component
47- * IMPROVEMENTS:
48- * - Consistent spacing with InHouseTable: px-3 py-2
49- * - Removed inconsistent p-2 pb-6 padding
50- * - Better visual alignment with read-only rows
45+ * ENHANCED EditableRow - Team Lead Feedback Applied
46+ *
47+ * CHANGES:
48+ * - Matching spacing with InHouseTable
49+ * - First 3 columns: px-6 py-3
50+ * - Email column: px-5 py-3
51+ * - Other columns: px-4 py-3
5152 */
5253export function EditableRow ( {
5354 data,
@@ -62,19 +63,14 @@ export function EditableRow({
6263 setSupabase ( supabaseClient ) ;
6364 } , [ ] ) ;
6465
65- // Local edit state - clone incoming data
6666 const [ editForm , setEditForm ] = useState < Codev > ( data ) ;
67-
68- // Local preview of image if user uploads a new one
6967 const [ uploadedImage , setUploadedImage ] = useState < string | null > (
7068 data . image_url || null ,
7169 ) ;
72-
7370 const [ positions , setPositions ] = useState < Position [ ] > ( [ ] ) ;
7471 const [ isSubmitting , setIsSubmitting ] = useState ( false ) ;
7572 const [ isUploading , setIsUploading ] = useState ( false ) ;
7673
77- // Fetch positions on mount
7874 useEffect ( ( ) => {
7975 if ( ! supabase ) return ;
8076
@@ -91,32 +87,27 @@ export function EditableRow({
9187 fetchPositions ( ) ;
9288 } , [ supabase ] ) ;
9389
94- // Local change handler - updates editForm state
9590 const handleLocalChange = ( key : keyof Codev , value : any ) => {
9691 setEditForm ( ( prev ) => ( {
9792 ...prev ,
9893 [ key ] : value ,
9994 } ) ) ;
10095 } ;
10196
102- // Image upload handler
10397 const handleImageUpload = async ( file : File ) => {
10498 try {
10599 setIsUploading ( true ) ;
106- // Preview
107100 const reader = new FileReader ( ) ;
108101 reader . onloadend = ( ) => {
109102 setUploadedImage ( reader . result as string ) ;
110103 } ;
111104 reader . readAsDataURL ( file ) ;
112105
113- // Upload to Supabase bucket
114106 const publicUrl = await uploadImage ( file , {
115107 bucket : "codebility" ,
116108 folder : "profileImage" ,
117109 } ) ;
118110
119- // Save URL to local form
120111 handleLocalChange ( "image_url" , publicUrl ) ;
121112 } catch ( error ) {
122113 console . error ( "Image upload failed:" , error ) ;
@@ -126,14 +117,12 @@ export function EditableRow({
126117 }
127118 } ;
128119
129- // Save changes - merges projects pivot + codev table updates
130120 const handleSave = async ( ) => {
131121 try {
132122 setIsSubmitting ( true ) ;
133123
134124 const { id, projects, ...rest } = editForm ;
135125
136- // 1) Clear + re-insert pivot if projects changed
137126 if ( projects ) {
138127 const { error : deleteError } = await supabase
139128 . from ( "project_members" )
@@ -153,7 +142,6 @@ export function EditableRow({
153142 }
154143 }
155144
156- // 2) Build update object for codev table
157145 const allowedFields : ( keyof Codev ) [ ] = [
158146 "first_name" ,
159147 "last_name" ,
@@ -181,7 +169,6 @@ export function EditableRow({
181169 }
182170 }
183171
184- // 3) Update codev table
185172 if ( Object . keys ( updateFields ) . length > 0 ) {
186173 const { error } = await supabase
187174 . from ( "codev" )
@@ -200,7 +187,6 @@ export function EditableRow({
200187 }
201188 } ;
202189
203- // Render function for each editable cell
204190 const renderCell = ( key : keyof Codev ) => {
205191 switch ( key ) {
206192 case "image_url" :
@@ -382,7 +368,6 @@ export function EditableRow({
382368 ) ;
383369
384370 default :
385- // Text inputs: first_name, last_name, portfolio_website, etc.
386371 return (
387372 < Input
388373 value = { String ( editForm [ key ] || "" ) }
@@ -396,24 +381,27 @@ export function EditableRow({
396381
397382 return (
398383 < TableRow className = "bg-light-200 dark:bg-dark-200 hover:bg-light-300 dark:hover:bg-dark-300" >
399- { /* ENHANCED: All cells now use consistent px-3 py-2 spacing */ }
400- < TableCell className = "px-3 py-2" > { renderCell ( "image_url" ) } </ TableCell >
401- < TableCell className = "px-3 py-2" > { renderCell ( "first_name" ) } </ TableCell >
402- < TableCell className = "px-3 py-2" > { renderCell ( "last_name" ) } </ TableCell >
403- < TableCell className = "px-3 py-2" > { renderCell ( "email_address" ) } </ TableCell >
404- < TableCell className = "px-3 py-2" > { renderCell ( "internal_status" ) } </ TableCell >
405- < TableCell className = "px-3 py-2" > { renderCell ( "role_id" ) } </ TableCell >
406- < TableCell className = "px-3 py-2" > { renderCell ( "display_position" ) } </ TableCell >
407- < TableCell className = "px-3 py-2" > { renderCell ( "projects" ) } </ TableCell >
408- < TableCell className = "px-3 py-2" > { renderCell ( "nda_status" ) } </ TableCell >
409- < TableCell className = "px-3 py-2" > { renderCell ( "portfolio_website" ) } </ TableCell >
410- < TableCell className = "px-3 py-2" > { renderCell ( "date_joined" ) } </ TableCell >
411- < TableCell className = "px-3 py-2" > { renderCell ( "availability_status" ) } </ TableCell >
412-
413- { /* Action buttons - ENHANCED spacing */ }
414- < TableCell className = "px-3 py-2" >
384+ { /* ENHANCED: First 3 columns px-6 py-3 */ }
385+ < TableCell className = "px-6 py-3" > { renderCell ( "image_url" ) } </ TableCell >
386+ < TableCell className = "px-6 py-3" > { renderCell ( "first_name" ) } </ TableCell >
387+ < TableCell className = "px-6 py-3" > { renderCell ( "last_name" ) } </ TableCell >
388+
389+ { /* ENHANCED: Email column px-5 py-3 */ }
390+ < TableCell className = "px-5 py-3" > { renderCell ( "email_address" ) } </ TableCell >
391+
392+ { /* ENHANCED: Other columns px-4 py-3 */ }
393+ < TableCell className = "px-4 py-3" > { renderCell ( "internal_status" ) } </ TableCell >
394+ < TableCell className = "px-4 py-3" > { renderCell ( "role_id" ) } </ TableCell >
395+ < TableCell className = "px-4 py-3" > { renderCell ( "display_position" ) } </ TableCell >
396+ < TableCell className = "px-4 py-3" > { renderCell ( "projects" ) } </ TableCell >
397+ < TableCell className = "px-4 py-3" > { renderCell ( "nda_status" ) } </ TableCell >
398+ < TableCell className = "px-4 py-3" > { renderCell ( "portfolio_website" ) } </ TableCell >
399+ < TableCell className = "px-4 py-3" > { renderCell ( "date_joined" ) } </ TableCell >
400+ < TableCell className = "px-4 py-3" > { renderCell ( "availability_status" ) } </ TableCell >
401+
402+ { /* Actions - px-4 py-3 */ }
403+ < TableCell className = "px-4 py-3" >
415404 < div className = "flex space-x-2" >
416- { /* Save button */ }
417405 < Button
418406 size = "sm"
419407 onClick = { handleSave }
@@ -422,7 +410,6 @@ export function EditableRow({
422410 >
423411 < Check className = "text-black-100 h-4 w-4 dark:text-white" />
424412 </ Button >
425- { /* Cancel button */ }
426413 < Button
427414 size = "sm"
428415 variant = "ghost"
0 commit comments