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 {
|
|
|
|
// TODO: Implement unrestrained text input
|
2024-05-12 20:54:34 +02:00
|
|
|
return (<div>string, unrestrained text input is not implemented</div>)
|
|
|
|
}
|
|
|
|
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-05-17 19:40:12 +02:00
|
|
|
case "alternatives":
|
|
|
|
return (
|
|
|
|
<Fragment>
|
|
|
|
<label htmlFor={fieldName}>{flags.label}:</label>
|
|
|
|
<input type="text" 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-02-25 20:55:48 +01:00
|
|
|
}
|
|
|
|
}
|