@@ -89,16 +89,16 @@ export function DocumentEdit({
8989 return s . replace ( / \s + / g, ' ' ) . trim ( )
9090 }
9191
92- const canonicalizeMetadata = ( meta ?: Record < string , any > ) => {
93- if ( ! meta ) return { }
94- const out : Record < string , string > = { }
95- Object . keys ( meta )
96- . sort ( )
97- . forEach ( ( k ) => {
98- out [ k ] = String ( meta [ k ] ?? '' ) . trim ( )
99- } )
100- return out
101- }
92+ // const canonicalizeMetadata = (meta?: Record<string, any>) => {
93+ // if (!meta) return {}
94+ // const out: Record<string, string> = {}
95+ // Object.keys(meta)
96+ // .sort()
97+ // .forEach((k) => {
98+ // out[k] = String(meta[k] ?? '').trim()
99+ // })
100+ // return out
101+ // }
102102
103103 const canonicalContent = ( ) => {
104104 // If richText, use stable JSON; if plain text, use normalized text
@@ -116,7 +116,7 @@ export function DocumentEdit({
116116 title : normalizeText ( editedDocument . title ) ,
117117 description : normalizeText ( editedDocument . description ) ,
118118 format : editedDocument . format ,
119- metadata : canonicalizeMetadata ( editedDocument . metadata ) ,
119+ // metadata: canonicalizeMetadata(editedDocument.metadata),
120120 content : canonicalContent ( ) ,
121121 }
122122 const s = stableStringify ( snapshot )
@@ -430,22 +430,12 @@ export function DocumentEdit({
430430 transition = { { duration : 0.2 , ease : 'easeInOut' } }
431431 className = "overflow-hidden h-full max-h-full"
432432 >
433- < div className = "pt-4 border-t border-border mt-4 h-screen max-h-full flex" >
433+ < div className = "pt-4 border-t border-border mt-4 max-h-full flex gap-2 " >
434434 < div className = "flex items-center justify-between mb-3" >
435435 < h3 className = "text-sm font-semibold text-foreground flex items-center gap-2" >
436436 < Info className = "h-4 w-4" />
437437 Document Metadata
438438 </ h3 >
439- < Button
440- type = "button"
441- variant = "outline"
442- size = "sm"
443- onClick = { handleAddMetadataField }
444- className = "gap-1 h-8"
445- >
446- < Plus className = "h-3 w-3" />
447- Add Field
448- </ Button >
449439 </ div >
450440
451441 { /* {suggestedKeys.contextKeys.length > 0 && (
@@ -456,88 +446,100 @@ export function DocumentEdit({
456446 </p>
457447 )} */ }
458448
459- < div className = "bg-muted rounded-lg p-4 border border-border" >
460- { editedDocument . metadata && Object . keys ( editedDocument . metadata ) . length > 0 ? (
461- < div className = "space-y-2" >
462- { Object . entries ( editedDocument . metadata ) . map ( ( [ key , value ] , index ) => {
463- const suggestedValues = getSuggestedValues ( key )
464- return (
465- < div key = { `metadata-key-${ index } ` } className = "flex gap-2 items-center" >
466- < Input
467- value = { key }
468- onChange = { ( e ) => {
469- const newKey = e . target . value || ''
470- const oldValue = editedDocument . metadata ?. [ key ]
471- setEditedDocument ( ( prev ) => {
472- const newMetadata = { ...prev . metadata }
473- delete newMetadata [ key ]
474- if ( newKey ) {
475- newMetadata [ newKey ] = oldValue || ''
476- }
477- return { ...prev , metadata : newMetadata }
478- } )
479- } }
480- placeholder = "Key"
481- className = "w-32 h-8 text-sm"
482- list = { `metadata-keys-${ key } ` }
483- />
484- < datalist id = { `metadata-keys-${ key } ` } >
485- { suggestedKeys . allKeys . map ( ( suggestedKey ) => (
486- < option key = { suggestedKey } value = { suggestedKey } />
487- ) ) }
488- </ datalist >
489-
490- < span className = "text-muted-foreground text-sm" > =</ span >
491-
492- { suggestedValues . length > 0 ? (
493- < Select
494- value = { String ( value || '' ) }
495- onValueChange = { ( newValue ) => handleMetadataValueSelect ( key , newValue ) }
496- >
497- < SelectTrigger className = "flex-1 h-8 text-sm" >
498- < SelectValue placeholder = "Value" />
499- </ SelectTrigger >
500- < SelectContent >
501- { suggestedValues . map ( ( suggestedValue ) => (
502- < SelectItem key = { suggestedValue } value = { suggestedValue } >
503- { suggestedValue }
504- </ SelectItem >
505- ) ) }
506- < SelectItem value = "__custom__" >
507- < span className = "text-muted-foreground text-xs" > Custom...</ span >
508- </ SelectItem >
509- </ SelectContent >
510- </ Select >
511- ) : (
449+ < div className = "flex flex-col gap-2" >
450+ < div className = "bg-muted rounded-lg p-4 border border-border" >
451+ { editedDocument . metadata && Object . keys ( editedDocument . metadata ) . length > 0 ? (
452+ < div className = "space-y-2" >
453+ { Object . entries ( editedDocument . metadata ) . map ( ( [ key , value ] , index ) => {
454+ const suggestedValues = getSuggestedValues ( key )
455+ return (
456+ < div key = { `metadata-key-${ index } ` } className = "flex gap-2 items-center" >
512457 < Input
513- value = { String ( value || '' ) }
514- onChange = { ( e ) => handleMetadataChange ( key , e . target . value ) }
515- placeholder = "Value"
516- className = "flex-1 h-8 text-sm"
458+ value = { key }
459+ onChange = { ( e ) => {
460+ const newKey = e . target . value || ''
461+ const oldValue = editedDocument . metadata ?. [ key ]
462+ setEditedDocument ( ( prev ) => {
463+ const newMetadata = { ...prev . metadata }
464+ delete newMetadata [ key ]
465+ if ( newKey ) {
466+ newMetadata [ newKey ] = oldValue || ''
467+ }
468+ return { ...prev , metadata : newMetadata }
469+ } )
470+ } }
471+ placeholder = "Key"
472+ className = "w-32 h-8 text-sm"
473+ list = { `metadata-keys-${ key } ` }
517474 />
518- ) }
519-
520- < Button
521- type = "button"
522- variant = "ghost"
523- size = "sm"
524- onClick = { ( ) => handleRemoveMetadataField ( key ) }
525- className = "h-8 w-8 p-0 text-muted-foreground hover:text-destructive"
526- >
527- < X className = "h-3 w-3" />
528- </ Button >
529- </ div >
530- )
531- } ) }
532- </ div >
533- ) : (
534- < div className = "text-center py-4" >
535- < p className = "text-sm text-muted-foreground mb-2" > No metadata fields</ p >
536- < p className = "text-xs text-muted-foreground" >
537- Click "Add Field" to create metadata
538- </ p >
539- </ div >
540- ) }
475+ < datalist id = { `metadata-keys-${ key } ` } >
476+ { suggestedKeys . allKeys . map ( ( suggestedKey ) => (
477+ < option key = { suggestedKey } value = { suggestedKey } />
478+ ) ) }
479+ </ datalist >
480+
481+ < span className = "text-muted-foreground text-sm" > =</ span >
482+
483+ { suggestedValues . length > 0 ? (
484+ < Select
485+ value = { String ( value || '' ) }
486+ onValueChange = { ( newValue ) => handleMetadataValueSelect ( key , newValue ) }
487+ >
488+ < SelectTrigger className = "flex-1 h-8 text-sm" >
489+ < SelectValue placeholder = "Value" />
490+ </ SelectTrigger >
491+ < SelectContent >
492+ { suggestedValues . map ( ( suggestedValue ) => (
493+ < SelectItem key = { suggestedValue } value = { suggestedValue } >
494+ { suggestedValue }
495+ </ SelectItem >
496+ ) ) }
497+ < SelectItem value = "__custom__" >
498+ < span className = "text-muted-foreground text-xs" > Custom...</ span >
499+ </ SelectItem >
500+ </ SelectContent >
501+ </ Select >
502+ ) : (
503+ < Input
504+ value = { String ( value || '' ) }
505+ onChange = { ( e ) => handleMetadataChange ( key , e . target . value ) }
506+ placeholder = "Value"
507+ className = "flex-1 h-8 text-sm"
508+ />
509+ ) }
510+
511+ < Button
512+ type = "button"
513+ variant = "ghost"
514+ size = "sm"
515+ onClick = { ( ) => handleRemoveMetadataField ( key ) }
516+ className = "h-8 w-8 p-0 text-muted-foreground hover:text-destructive"
517+ >
518+ < X className = "h-3 w-3" />
519+ </ Button >
520+ </ div >
521+ )
522+ } ) }
523+ </ div >
524+ ) : (
525+ < div className = "text-center py-4" >
526+ < p className = "text-sm text-muted-foreground mb-2" > No metadata fields</ p >
527+ < p className = "text-xs text-muted-foreground" >
528+ Click "Add Field" to create metadata
529+ </ p >
530+ </ div >
531+ ) }
532+ </ div >
533+ < Button
534+ type = "button"
535+ variant = "outline"
536+ size = "sm"
537+ onClick = { handleAddMetadataField }
538+ className = "gap-1 h-8"
539+ >
540+ < Plus className = "h-3 w-3" />
541+ Add Field
542+ </ Button >
541543 </ div >
542544 </ div >
543545 </ motion . div >
0 commit comments