@ -153,6 +153,9 @@ function ModuleClients(props: { module: Module }) {
const [ assignPick , setAssignPick ] = useState < Client | undefined > ( )
const [ assignPick , setAssignPick ] = useState < Client | undefined > ( )
const [ assignKind , setAssignKind ] = useState < Kind > ( props . module .allowedKinds [ 0 ] ? ? 'yearly' )
const [ assignKind , setAssignKind ] = useState < Kind > ( props . module .allowedKinds [ 0 ] ? ? 'yearly' )
const [ assignEdition , setAssignEdition ] = useState ( 'standard' )
const [ assignEdition , setAssignEdition ] = useState ( 'standard' )
const [ assignUser , setAssignUser ] = useState ( '' )
const [ assignPass , setAssignPass ] = useState ( '' )
const needsCreds = props . module .code === 'SMS' // SMS gateway login required at assign
const saveEdit = ( ) = > {
const saveEdit = ( ) = > {
if ( edit === undefined || busy ) return
if ( edit === undefined || busy ) return
@ -172,9 +175,15 @@ function ModuleClients(props: { module: Module }) {
}
}
const doAssign = ( ) = > {
const doAssign = ( ) = > {
if ( assignPick === undefined || busy ) return
if ( assignPick === undefined || busy ) return
if ( needsCreds && ( assignUser . trim ( ) === '' || assignPass . trim ( ) === '' ) ) {
setErr ( 'SMS needs the gateway username and password' ) ; return
}
setBusy ( true ) ; setErr ( undefined )
setBusy ( true ) ; setErr ( undefined )
assignClientModule ( assignPick . id , { module Id : props . module .id , kind : assignKind , edition : assignEdition } )
assignClientModule ( assignPick . id , { module Id : props . module .id , kind : assignKind , edition : assignEdition } )
. then ( ( ) = > { setAssigning ( false ) ; setAssignQ ( '' ) ; setAssignPick ( undefined ) ; roster . reload ( ) } )
. then ( ( cm ) = > needsCreds
? patchClientModule ( cm . id , { username : assignUser.trim ( ) , password : assignPass.trim ( ) } )
: cm )
. then ( ( ) = > { setAssigning ( false ) ; setAssignQ ( '' ) ; setAssignPick ( undefined ) ; setAssignUser ( '' ) ; setAssignPass ( '' ) ; roster . reload ( ) } )
. catch ( ( e : Error ) = > setErr ( e . message ) )
. catch ( ( e : Error ) = > setErr ( e . message ) )
. finally ( ( ) = > setBusy ( false ) )
. finally ( ( ) = > setBusy ( false ) )
}
}
@ -233,6 +242,13 @@ function ModuleClients(props: { module: Module }) {
< Field label = "Edition / pack" >
< Field label = "Edition / pack" >
< input value = { assignEdition } onChange = { ( e ) = > setAssignEdition ( e . target . value ) } / >
< input value = { assignEdition } onChange = { ( e ) = > setAssignEdition ( e . target . value ) } / >
< / Field >
< / Field >
{ needsCreds && (
< div style = { { display : 'flex' , gap : 10 , flexWrap : 'wrap' , alignItems : 'flex-end' , marginBottom : 8 } } >
< Field label = "SMS username *" > < input className = "wf mono" style = { { width : 160 } } value = { assignUser } onChange = { ( e ) = > setAssignUser ( e . target . value ) } / > < / Field >
< Field label = "SMS password *" > < input className = "wf mono" style = { { width : 160 } } value = { assignPass } onChange = { ( e ) = > setAssignPass ( e . target . value ) } / > < / Field >
< span style = { { fontSize : 12 , color : 'var(--text-dim)' , alignSelf : 'center' } } > Required — the gateway login the balance pull uses . < / span >
< / div >
) }
< Button tone = "primary" onClick = { ( ) = > { if ( assignPick !== undefined && ! busy ) doAssign ( ) } } >
< Button tone = "primary" onClick = { ( ) = > { if ( assignPick !== undefined && ! busy ) doAssign ( ) } } >
{ busy ? 'Assigning…' : 'Assign to module' }
{ busy ? 'Assigning…' : 'Assign to module' }
< / Button >
< / Button >