@@ -177,11 +177,17 @@ const BaseUserProfile: FC<BaseUserProfileProps> = ({
177177
178178 const mergedMappings = { ...defaultAttributeMappings , ...attributeMapping } ;
179179
180- const renderSchemaValue = ( schema : Schema ) : ReactElement | null => {
180+ // Combines label and value/field rendering for both view and edit modes
181+ const renderSchemaField = (
182+ schema : Schema ,
183+ isEditing : boolean ,
184+ onEditValue ?: ( value : any ) => void ,
185+ ) : ReactElement | null => {
181186 if ( ! schema ) return null ;
187+ const { value, displayName, description, name, type, required, mutability, subAttributes} = schema ;
188+ const label = displayName || description || name || '' ;
182189
183- const { value, displayName, description, type, subAttributes} = schema ;
184-
190+ // If complex or subAttributes, fallback to original renderSchemaValue
185191 if ( subAttributes && Array . isArray ( subAttributes ) ) {
186192 return (
187193 < >
@@ -202,83 +208,62 @@ const BaseUserProfile: FC<BaseUserProfileProps> = ({
202208 </ >
203209 ) ;
204210 }
205-
206211 if ( Array . isArray ( value ) ) {
207212 const displayValue = value
208213 . map ( item => ( typeof item === 'object' ? JSON . stringify ( item ) : String ( item ) ) )
209214 . join ( ', ' ) ;
210-
211215 return (
212216 < >
213- < span style = { styles . label } > { displayName || description || '' } </ span >
217+ < span style = { styles . label } > { label } </ span >
214218 < div style = { styles . value } > { displayValue } </ div >
215219 </ >
216220 ) ;
217221 }
218-
219222 if ( type === 'COMPLEX' && typeof value === 'object' ) {
220223 return < ObjectDisplay data = { value } /> ;
221224 }
222-
223- return (
224- < >
225- < span style = { styles . label } > { displayName || description || '' } </ span >
226- < div style = { styles . value } > { String ( value ) } </ div >
227- </ >
228- ) ;
229- } ;
230-
231- const renderEditableField = ( schema : Schema , onChange : ( value : any ) => void ) : ReactElement | null => {
232- if ( ! schema ) return null ;
233-
234- const { value, displayName, name, type, required, mutability} = schema ;
235-
236- if ( mutability === 'READ_ONLY' ) {
225+ // If editing, show field instead of value
226+ if ( isEditing && onEditValue && mutability !== 'READ_ONLY' ) {
227+ const commonProps = {
228+ label : undefined , // Don't show label in field, we render it outside
229+ required : required ,
230+ value : value || '' ,
231+ onChange : ( e : any ) => onEditValue ( e . target ? e . target . value : e ) ,
232+ style : {
233+ marginBottom : 0 ,
234+ } ,
235+ } ;
236+ let field : ReactElement ;
237+ switch ( type ) {
238+ case 'STRING' :
239+ field = < TextField { ...commonProps } /> ;
240+ break ;
241+ case 'DATE_TIME' :
242+ field = < DatePicker { ...commonProps } /> ;
243+ break ;
244+ case 'BOOLEAN' :
245+ field = < Checkbox { ...commonProps } checked = { value } onChange = { e => onEditValue ( e . target . checked ) } /> ;
246+ break ;
247+ case 'COMPLEX' :
248+ field = < TextField { ...commonProps } /> ;
249+ break ;
250+ default :
251+ field = < TextField { ...commonProps } /> ;
252+ }
237253 return (
238254 < >
239- < span style = { styles . label } > { displayName || name } </ span >
240- < div style = { styles . value } > { String ( value ) } </ div >
255+ < span style = { styles . label } > { label } </ span >
256+ < div style = { styles . value } > { field } </ div >
241257 </ >
242258 ) ;
243259 }
244-
245- const commonProps = {
246- label : displayName || name ,
247- required : required ,
248- value : value || '' ,
249- onChange : ( e : any ) => onChange ( e . target . value ) ,
250- } ;
251-
252- switch ( type ) {
253- case 'STRING' :
254- return < TextField { ...commonProps } /> ;
255- case 'DATE_TIME' :
256- return < DatePicker { ...commonProps } /> ;
257- case 'BOOLEAN' :
258- return < Checkbox { ...commonProps } checked = { value } onChange = { e => onChange ( e . target . checked ) } /> ;
259- case 'COMPLEX' :
260- if ( Array . isArray ( value ) ) {
261- return (
262- < >
263- { value . map ( ( item , index ) => (
264- < TextField
265- key = { index }
266- { ...commonProps }
267- value = { item }
268- onChange = { e => {
269- const newValue = [ ...value ] ;
270- newValue [ index ] = e . target . value ;
271- onChange ( newValue ) ;
272- } }
273- />
274- ) ) }
275- </ >
276- ) ;
277- }
278- return < TextField { ...commonProps } /> ;
279- default :
280- return < TextField { ...commonProps } /> ;
281- }
260+ // Default: view mode
261+ return (
262+ < >
263+ < span style = { styles . label } > { label } </ span >
264+ < div style = { styles . value } > { String ( value ) } </ div >
265+ </ >
266+ ) ;
282267 } ;
283268
284269 const renderUserInfo = ( schema : Schema ) => {
@@ -288,7 +273,7 @@ const BaseUserProfile: FC<BaseUserProfileProps> = ({
288273 const fieldStyle = {
289274 ...styles . field ,
290275 display : 'flex' ,
291- alignItems : 'flex-start ' ,
276+ alignItems : 'center ' ,
292277 gap : theme . spacing . unit + 'px' ,
293278 } ;
294279 const actionButtonStyle = {
@@ -300,17 +285,22 @@ const BaseUserProfile: FC<BaseUserProfileProps> = ({
300285
301286 return (
302287 < div style = { fieldStyle } >
303- < div style = { { flex : 1 } } >
304- { isFieldEditing
305- ? renderEditableField ( schema , value => {
306- const tempEditedUser = { ...editedUser } ;
307- tempEditedUser [ schema . name ! ] = value ;
308- setEditedUser ( tempEditedUser ) ;
309- } )
310- : renderSchemaValue ( schema ) }
288+ < div style = { { flex : 1 , display : 'flex' , alignItems : 'center' , gap : theme . spacing . unit + 'px' } } >
289+ { renderSchemaField ( schema , isFieldEditing , value => {
290+ const tempEditedUser = { ...editedUser } ;
291+ tempEditedUser [ schema . name ! ] = value ;
292+ setEditedUser ( tempEditedUser ) ;
293+ } ) }
311294 </ div >
312295 { editable && schema . mutability !== 'READ_ONLY' && (
313- < div style = { { display : 'flex' , gap : theme . spacing . unit / 2 + 'px' , alignSelf : 'center' } } >
296+ < div
297+ style = { {
298+ display : 'flex' ,
299+ gap : theme . spacing . unit / 2 + 'px' ,
300+ alignItems : 'center' ,
301+ marginLeft : theme . spacing . unit + 'px' ,
302+ } }
303+ >
314304 { isFieldEditing ? (
315305 < >
316306 < button
@@ -469,8 +459,9 @@ const useStyles = () => {
469459 field : {
470460 display : 'flex' ,
471461 alignItems : 'center' ,
472- padding : theme . spacing . unit * 0.5 + 'px 0' ,
462+ padding : theme . spacing . unit + 'px 0' ,
473463 borderBottom : `1px solid ${ theme . colors . border } ` ,
464+ minHeight : '32px' ,
474465 } as CSSProperties ,
475466 lastField : {
476467 borderBottom : 'none' ,
@@ -481,18 +472,25 @@ const useStyles = () => {
481472 color : theme . colors . text . secondary ,
482473 width : '120px' ,
483474 flexShrink : 0 ,
475+ lineHeight : '32px' ,
484476 } as CSSProperties ,
485477 value : {
486478 color : theme . colors . text . primary ,
487479 flex : 1 ,
480+ display : 'flex' ,
481+ alignItems : 'center' ,
482+ gap : theme . spacing . unit + 'px' ,
488483 overflow : 'hidden' ,
489- textOverflow : 'ellipsis' ,
490- whiteSpace : 'nowrap' ,
491- maxWidth : 'calc(100% - 120px)' , // Subtracting label width
484+ minHeight : '32px' ,
485+ '& input, & .MuiInputBase-root' : {
486+ height : '32px' ,
487+ margin : 0 ,
488+ } ,
489+ lineHeight : '32px' ,
492490 '& table' : {
493491 backgroundColor : theme . colors . background ,
494492 borderRadius : theme . borderRadius . small ,
495- whiteSpace : 'normal' , // Allow tables to wrap
493+ whiteSpace : 'normal' ,
496494 } ,
497495 '& td' : {
498496 borderColor : theme . colors . border ,
0 commit comments