@@ -33,7 +33,7 @@ import { toComboboxItems } from '~/ui/lib/Combobox'
3333import { FormDivider } from '~/ui/lib/Divider'
3434import { FieldLabel } from '~/ui/lib/FieldLabel'
3535import { Message } from '~/ui/lib/Message'
36- import * as MiniTable from '~/ui/lib/MiniTable'
36+ import { ClearAndAddButtons , MiniTable } from '~/ui/lib/MiniTable'
3737import { SideModal } from '~/ui/lib/SideModal'
3838import { TextInputHint } from '~/ui/lib/TextInput'
3939import { KEYS } from '~/ui/util/keys'
@@ -148,11 +148,12 @@ const TargetAndHostFilterSubform = ({
148148 subform . setValue ( 'value' , value )
149149 }
150150
151+ const noun = sectionType === 'target' ? 'target' : 'host filter'
152+ const nounTitle = capitalize ( noun ) + 's'
153+
151154 return (
152155 < >
153- < SideModal . Heading >
154- { sectionType === 'target' ? 'Targets' : 'Host filters' }
155- </ SideModal . Heading >
156+ < SideModal . Heading > { nounTitle } </ SideModal . Heading >
156157
157158 < Message variant = "info" content = { messageContent } />
158159 < ListboxField
@@ -209,48 +210,25 @@ const TargetAndHostFilterSubform = ({
209210 }
210211 />
211212 ) }
212- < MiniTable . ClearAndAddButtons
213- addButtonCopy = { `Add ${ sectionType === 'host' ? 'host filter' : 'target' } ` }
213+ < ClearAndAddButtons
214+ addButtonCopy = { `Add ${ noun } ` }
214215 disabled = { ! value }
215216 onClear = { ( ) => subform . reset ( ) }
216217 onSubmit = { submitSubform }
217218 />
218- { field . value . length > 0 && (
219- < MiniTable . Table
220- className = "mb-4"
221- aria-label = { sectionType === 'target' ? 'Targets' : 'Host filters' }
222- >
223- < MiniTable . Header >
224- < MiniTable . HeadCell > Type</ MiniTable . HeadCell >
225- < MiniTable . HeadCell > Value</ MiniTable . HeadCell >
226- { /* For remove button */ }
227- < MiniTable . HeadCell className = "w-12" />
228- </ MiniTable . Header >
229- < MiniTable . Body >
230- { field . value . map ( ( { type, value } , index ) => (
231- < MiniTable . Row
232- tabIndex = { 0 }
233- aria-rowindex = { index + 1 }
234- aria-label = { `Name: ${ value } , Type: ${ type } ` }
235- key = { `${ type } |${ value } ` }
236- >
237- < MiniTable . Cell >
238- < Badge > { type } </ Badge >
239- </ MiniTable . Cell >
240- < MiniTable . Cell > { value } </ MiniTable . Cell >
241- < MiniTable . RemoveCell
242- onClick = { ( ) =>
243- field . onChange (
244- field . value . filter ( ( i ) => ! ( i . value === value && i . type === type ) )
245- )
246- }
247- label = { `remove ${ sectionType } ${ value } ` }
248- />
249- </ MiniTable . Row >
250- ) ) }
251- </ MiniTable . Body >
252- </ MiniTable . Table >
253- ) }
219+ < MiniTable
220+ className = "mb-4"
221+ ariaLabel = { nounTitle }
222+ items = { field . value }
223+ columns = { [
224+ { header : 'Type' , cell : ( item ) => < Badge > { item . type } </ Badge > } ,
225+ { header : 'Value' , cell : ( item ) => item . value } ,
226+ ] }
227+ rowKey = { ( { type, value } ) => `${ type } |${ value } ` }
228+ onRemoveItem = { ( { type, value } ) => {
229+ field . onChange ( field . value . filter ( ( i ) => ! ( i . value === value && i . type === type ) ) )
230+ } }
231+ />
254232 </ >
255233 )
256234}
@@ -450,32 +428,24 @@ export const CommonFields = ({ control, nameTaken, error }: CommonFieldsProps) =
450428 } }
451429 />
452430 </ div >
453- < MiniTable . ClearAndAddButtons
431+ < ClearAndAddButtons
454432 addButtonCopy = "Add port filter"
455433 disabled = { ! portValue }
456434 onClear = { ( ) => portRangeForm . reset ( ) }
457435 onSubmit = { submitPortRange }
458436 />
459437 </ div >
460438 { ports . value . length > 0 && (
461- < MiniTable . Table className = "mb-4" aria-label = "Port filters" >
462- < MiniTable . Header >
463- < MiniTable . HeadCell > Port ranges</ MiniTable . HeadCell >
464- { /* For remove button */ }
465- < MiniTable . HeadCell className = "w-12" />
466- </ MiniTable . Header >
467- < MiniTable . Body >
468- { ports . value . map ( ( p ) => (
469- < MiniTable . Row tabIndex = { 0 } aria-label = { p } key = { p } >
470- < MiniTable . Cell > { p } </ MiniTable . Cell >
471- < MiniTable . RemoveCell
472- onClick = { ( ) => ports . onChange ( ports . value . filter ( ( p1 ) => p1 !== p ) ) }
473- label = { `remove port ${ p } ` }
474- />
475- </ MiniTable . Row >
476- ) ) }
477- </ MiniTable . Body >
478- </ MiniTable . Table >
439+ < MiniTable
440+ className = "mb-4"
441+ ariaLabel = "Port filters"
442+ items = { ports . value }
443+ columns = { [ { header : 'Port ranges' , cell : ( p ) => p } ] }
444+ rowKey = { ( port ) => port }
445+ emptyState = { { title : 'No ports' , body : 'Add a port to see it here' } }
446+ onRemoveItem = { ( p ) => ports . onChange ( ports . value . filter ( ( p1 ) => p1 !== p ) ) }
447+ removeLabel = { ( port ) => `remove port ${ port } ` }
448+ />
479449 ) }
480450
481451 < fieldset className = "space-y-0.5" >
0 commit comments