@@ -120,8 +120,8 @@ interface SidebarSectionProps {
120120
121121interface ToggleFieldProps {
122122 field : FieldDefinition ;
123- value : unknown ;
124- onDraftChange : DraftChangeHandler ;
123+ value : boolean ;
124+ onDraftChange : DraftChangeHandler < boolean > ;
125125 headerOnly ?: boolean ;
126126}
127127
@@ -324,8 +324,10 @@ function formatStorageErrorForDisplay(storageError: string): string {
324324
325325
326326function formatFieldValue ( value : any ) : string {
327- if ( typeof value === "string" )
328- return value && value . trim ( ) ? value : "—" ;
327+ if ( typeof value === "string"
328+ || value instanceof IdString
329+ || value instanceof KeyString )
330+ return value . trim ( ) || "—" ;
329331 if ( Array . isArray ( value ) ) {
330332 if ( ! value . length ) return "—" ;
331333 if ( typeof value [ 0 ] === "string" )
@@ -462,18 +464,22 @@ function renderMetadataTableField(ctx: ReadonlyFieldContext<readonly string[]>)
462464function renderTableField ( ctx : ReadonlyFieldContext ) {
463465 const { field, value, itemsByTab } = ctx ;
464466 definitely < readonly string [ ] > ( value ) ;
467+ return renderLinesList ( value , field . key , itemsByTab )
468+ }
469+
470+ function renderLinesList ( value : readonly string [ ] , key : string , itemsByTab ?: AdminRecordStore ) {
465471 const missingCheck =
466472 itemsByTab ?
467- field . key === "effectiveReadonlyBags" ? new Set ( Array . from ( itemsByTab . availableBagNames , e => e . toString ( ) ) ) :
468- field . key === "effectivePluginSet" ? itemsByTab . availablePluginNames :
473+ key === "effectiveReadonlyBags" ? new Set ( Array . from ( itemsByTab . availableBagNames , e => e . toString ( ) ) ) :
474+ key === "effectivePluginSet" ? itemsByTab . availablePluginNames :
469475 null : null ;
470476 const lines = value . map ( line => ( { line, missing : missingCheck && ! missingCheck . has ( line ) , } ) ) ;
471477 return < ul class = "value-list" > { lines . map ( ( { line, missing } ) => < li >
472- { line }
478+ { line . split ( "/" ) . map ( ( e , i , a ) => < > { e } { ( i !== a . length - 1 ) ? "/" : "" } < wbr /> </ > ) }
473479 { missing ? < span class = "missing-marker" aria-label = "Missing dependency" title = "Missing dependency" > < MaterialSymbol icon = { warningIcon } /> </ span > : null }
474480 </ li > ) } </ ul > ;
475- }
476481
482+ }
477483function renderCalloutField ( ctx : ReadonlyFieldContext ) {
478484 definitely < string > ( ctx . value ) ;
479485 return < div class = "field-callout" > < p > { formatFieldValue ( ctx . value ) } </ p > </ div > ;
@@ -727,6 +733,7 @@ class PermissionTableFieldHandler extends FieldTypeHandler<readonly PermissionRo
727733 }
728734}
729735
736+ const defaultPrefixPill = < div class = "prefix-bag-sidebar-pill" > default</ div > ;
730737class PrefixTableFieldHandler extends FieldTypeHandler < WritablePrefixRow [ ] > {
731738 constructor ( ) {
732739 super ( ) ;
@@ -736,6 +743,15 @@ class PrefixTableFieldHandler extends FieldTypeHandler<WritablePrefixRow[]> {
736743 return [ ] ;
737744 }
738745
746+ public override renderSidebar ( ctx : ReadonlyFieldContext < WritablePrefixRow [ ] > ) : JSX . Node {
747+ return < dl class = "prefix-bag-sidebar" >
748+ { ctx . value . map ( e => < >
749+ < dt class = "prefix-bag-sidebar-term" > { e . prefix ? < span class = "prefix-bag-sidebar-prefix" > "{ e . prefix } "</ span > : defaultPrefixPill } </ dt >
750+ < dd class = "prefix-bag-sidebar-value" > { e . bagName . toString ( ) } </ dd >
751+ </ > ) }
752+ </ dl >
753+ }
754+
739755 public override renderEditor ( ctx : FieldEditorContext ) {
740756 const { field, value, disabled, modalState, itemsByTab, inputId, onDraftChange, onPendingRowsChange } = ctx ;
741757 const forDisplay = field . mode === "server" ;
@@ -820,7 +836,7 @@ class PrefixTableFieldHandler extends FieldTypeHandler<WritablePrefixRow[]> {
820836 return < table class = "value-table" >
821837 { displayedMappingRows . map ( ( row ) => (
822838 < tr >
823- < td > { row . prefix ? < code > { '"' + row . prefix + '"' } </ code > : < span class = "pill-value pill-value-small" > default </ span > } </ td >
839+ < td > { row . prefix ? < code > { '"' + row . prefix + '"' } </ code > : defaultPrefixPill } </ td >
824840 < td > { row . bagName . toString ( ) } </ td >
825841 </ tr >
826842 ) ) }
@@ -953,7 +969,7 @@ class ValueListFieldHandler extends FieldTypeHandler<string[]> {
953969 const lines = typeof ctx . value === "string"
954970 ? lineListCodec . parse ( ctx . value )
955971 : ctx . value as readonly string [ ] ;
956- return < ul class = "value-list" > { lines . map ( ( line ) => < li > { line } </ li > ) } </ ul > ;
972+ return renderLinesList ( lines , ctx . field . key , ctx . itemsByTab ) ;
957973 }
958974
959975 public override renderEditor ( ctx : FieldEditorContext ) {
@@ -1064,6 +1080,7 @@ class FallbackFieldHandler extends StringFieldTypeHandler {
10641080 }
10651081}
10661082
1083+
10671084const textInputFieldHandler = new TextInputFieldHandler ( "text" ) ;
10681085const numberInputFieldHandler = new TextInputFieldHandler ( "number" ) ;
10691086const textareaFieldHandler = new TextareaFieldHandler ( 4 ) ;
@@ -1116,7 +1133,7 @@ function renderFieldEditor(input: FieldEditorInput) {
11161133}
11171134
11181135@customElement ( "mws-field-block" )
1119- class FieldBlockElement extends JSXElement {
1136+ class FieldBlockElement < T > extends JSXElement {
11201137 useLightDOM : boolean = true ;
11211138
11221139 @state ( ) accessor props ! : FieldBlockProps ;
@@ -1136,6 +1153,7 @@ class FieldBlockElement extends JSXElement {
11361153) : null} */ }
11371154
11381155 { useToggleEditor ? (
1156+ definitely < boolean > ( value ) ,
11391157 < ToggleFieldElement field = { field } value = { value } onDraftChange = { this . props . onDraftChange } />
11401158 ) : (
11411159 < div class = "field-editor" >
@@ -1196,7 +1214,7 @@ class ToggleFieldElement extends JSXElement {
11961214
11971215 protected render ( ) {
11981216 const { field, value, onDraftChange, headerOnly } = this . props ;
1199- const checked = value === "enabled" ;
1217+ const checked = value === true ;
12001218
12011219 return (
12021220 < div class = "toggle-field-row" >
@@ -1215,7 +1233,7 @@ class ToggleFieldElement extends JSXElement {
12151233 ref = { ( element ) => {
12161234 if ( element . checked !== checked ) element . checked = checked ;
12171235 } }
1218- onchange = { ( event ) => onDraftChange ( field . key , ( event . currentTarget as HTMLInputElement ) . checked ? "enabled" : "disabled" ) }
1236+ onchange = { ( event ) => onDraftChange ( field . key , ( event . currentTarget as HTMLInputElement ) . checked ) }
12191237 />
12201238 < span class = { checked ? "header-switch-track is-checked" : "header-switch-track" } aria-hidden = "true" >
12211239 < span class = "header-switch-thumb" > </ span >
@@ -1262,14 +1280,14 @@ class RecordModalElement extends JSXElement {
12621280 } } >
12631281 < section class = "modal-card" role = "dialog" aria-modal = "true" aria-label = { `${ selectedTab . label } details` } >
12641282 < header class = "modal-header" >
1265- < div >
1283+ < div class = "modal-title" >
12661284 < p class = "eyebrow" > { selectedTab . eyebrow } </ p >
12671285 < h3 > { isModalLoading ? `Loading ${ selectedTab . label . slice ( 0 , - 1 ) . toLowerCase ( ) } ...` : modalState . mode === "create" ? `New ${ selectedTab . label . slice ( 0 , - 1 ) } ` : getPrimaryValue ( selectedTab , modalState . draft ) } </ h3 >
12681286 < p > { isModalLoading ? "Fetching record details from async storage before rendering the form." : selectedTab . description } </ p >
12691287 </ div >
1270- < button class = "close-button" type = " button" onclick = { onClose } aria-label = "Close details" >
1288+ < div class = "close-button" onclick = { onClose } aria-label = "Close details" >
12711289 < MaterialSymbol icon = { closeIcon } />
1272- </ button >
1290+ </ div >
12731291 </ header >
12741292
12751293 { isModalLoading ? (
0 commit comments