2024-02-25 20:55:48 +01:00
import Joi from "@stirling-tools/joi" ;
import { Fragment } from "react" ;
interface GenericFieldProps {
2024-05-12 20:54:34 +02:00
fieldName : string ,
joiDefinition : Joi.Description
}
interface Flags {
label : string ,
description : string ,
2024-02-25 20:55:48 +01:00
}
export function GenericField ( { fieldName , joiDefinition } : GenericFieldProps ) {
2024-05-12 20:54:34 +02:00
const flags = joiDefinition . flags as Flags ;
2024-02-25 20:55:48 +01:00
switch ( joiDefinition . type ) {
case "number" :
var validValues = joiDefinition . allow ;
2024-05-12 20:54:34 +02:00
if ( validValues ) { // Restrained number input
2024-02-25 20:55:48 +01:00
return (
< Fragment >
2024-05-12 20:54:34 +02:00
< label htmlFor = { fieldName } > { flags . label } : < / label >
2024-02-25 20:55:48 +01:00
< input type = "number" list = { fieldName } name = { fieldName } / >
< datalist id = { fieldName } >
{ joiDefinition . allow . map ( ( e : string ) = > {
return ( < option key = { e } value = { e } / > )
} ) }
< / datalist >
< br / >
< / Fragment >
) ;
}
2024-05-12 20:54:34 +02:00
else { // Unrestrained number input
// TODO: Check if integer or not.
return (
< Fragment >
< label htmlFor = { fieldName } > { flags . label } : < / label >
< input type = "number" list = { fieldName } name = { fieldName } / >
< br / >
< / Fragment >
) ;
2024-02-25 20:55:48 +01:00
}
break ;
case "string" :
2024-05-12 20:54:34 +02:00
if ( joiDefinition . allow ) { // Restrained text input
2024-02-25 20:55:48 +01:00
return (
< Fragment >
2024-05-12 20:54:34 +02:00
< label htmlFor = { fieldName } > { flags . label } : < / label >
2024-02-25 20:55:48 +01:00
< input type = "text" list = { fieldName } name = { fieldName } / >
< datalist id = { fieldName } >
{ joiDefinition . allow . map ( ( e : string ) = > {
return ( < option key = { e } value = { e } / > )
} ) }
< / datalist >
< br / >
< / Fragment >
) ;
}
else {
2024-05-18 22:49:06 +02:00
return (
< Fragment >
< label htmlFor = { fieldName } > { flags . label } : < / label >
< input type = "text" list = { fieldName } name = { fieldName } / >
< br / >
< / Fragment >
)
2024-05-12 20:54:34 +02:00
}
break ;
case "comma_array" :
if ( joiDefinition . items . length == 1 ) {
const item : Joi.Description = joiDefinition . items [ 0 ] ;
if ( item . type == "number" ) {
2024-05-17 19:40:12 +02:00
const props : any = { } ;
item . rules . forEach ( ( rule : { args : any , name : string } ) = > {
switch ( rule . name ) {
case "integer" :
if ( props . pattern ) {
return ( < div > props . pattern was already set , this is not implemented . < / div > ) ;
}
props . pattern = ` ( \\ d+)(, \\ s* \\ d+)* ` ;
break ;
case "min" :
// TODO: Could validate this in frontend first.
break ;
case "max" :
// TODO: Could validate this in frontend first.
break ;
default :
return ( < div > comma_array , item rule { rule . name } is not implemented . < / div > ) ;
}
} ) ;
return (
< Fragment >
< label htmlFor = { fieldName } > { flags . label } : < / label >
< input type = "text" pattern = { props . pattern } list = { fieldName } name = { fieldName } / >
< br / >
< / Fragment >
) ;
2024-05-12 20:54:34 +02:00
}
else {
return ( < div > comma_array , other types than numbers are not implemented yet . < / div > ) ;
}
}
else {
// TODO: Implement multiple items if necessary
return ( < div > comma_array , joi items are empty or bigger than one , this is not implemented < / div > ) ;
2024-02-25 20:55:48 +01:00
}
break ;
2024-07-14 01:27:41 +02:00
case "alternatives" : // TODO: Better support this. It is currently used by ScaleContent (working) and SplitByPreset (incompatible, but with that operator it isn't even considered a field so we need a different schema for that)
2024-05-17 19:40:12 +02:00
return (
< Fragment >
< label htmlFor = { fieldName } > { flags . label } : < / label >
< input type = "text" list = { fieldName } name = { fieldName } / >
< br / >
< / Fragment >
) ;
2024-05-18 22:49:06 +02:00
case "boolean" :
return (
< Fragment >
< label htmlFor = { fieldName } > { flags . label } : < / label >
< input type = "checkbox" list = { fieldName } name = { fieldName } / >
< br / >
< / Fragment >
) ;
case "date" :
return (
< Fragment >
< label htmlFor = { fieldName } > { flags . label } : < / label >
< input type = "date" list = { fieldName } name = { fieldName } / >
< br / >
< / Fragment >
) ;
2024-02-25 20:55:48 +01:00
default :
2024-05-12 20:54:34 +02:00
console . log ( joiDefinition ) ;
return ( < div > GenericField . tsx : < br / > "{fieldName}" : requested type "{joiDefinition.type}" not found . Check console for further info . < / div > )
2024-07-14 01:27:41 +02:00
2024-02-25 20:55:48 +01:00
}
}