in frontend/src/js/components/UtilComponents/ModalAction.tsx [33:148]
export default function ModalAction(props: React.PropsWithChildren<ConfirmProps | EditProps | SelectMultipleProps>) {
const [open, setOpen] = useState(false);
const [value, setValue] = useState<string | string[] | undefined>(undefined);
function onSubmit(e?: React.FormEvent) {
if(e) {
e.preventDefault();
}
switch(props.actionType) {
case 'confirm':
props.onConfirm();
break;
case 'edit':
if(value && value !== props.value) {
props.onConfirm((value as string));
}
break;
case 'select_multiple':
if(value && !_.isEqual(value, props.currentValues)) {
props.onConfirm((value as string[]));
}
break;
}
onDismiss();
}
function onDismiss() {
setOpen(false);
setValue(undefined);
}
const canSubmit = props.actionType === "edit" ? value !== undefined && value !== "" : true;
return <React.Fragment>
{/* The component that triggers the modal (pass-through rendering of children) */}
<button
className={props.className}
disabled={props.disabled}
onClick={() => setOpen(true)}
>
{props.children}
</button>
<Modal isOpen={open} dismiss={onDismiss} panelClassName="modal-action__panel">
<form onSubmit={onSubmit}>
<div className='modal-action__modal'>
<h2>{props.title}</h2>
{
props.text
?
<div className='modal-action__modal-text'>
{props.text}
</div>
:
false
}
{
props.actionType === "edit"
?
<input
type="text"
value={value || props.value}
onChange={(e) => setValue(e.target.value)}
autoFocus={props.actionType === "edit"}
/>
:
false
}
{
props.actionType === "select_multiple"
?
<Dropdown
fluid
multiple
selection
search
placeholder='Select'
options={props.possibleValues.map(value => { return { value, text: value } })}
defaultValue={value || props.currentValues}
onChange={(e, { value }) => setValue((value as string[]))}
/>
:
false
}
<div className='modal-action__buttons'>
<button
className='btn'
onClick={onSubmit}
disabled={!canSubmit}
autoFocus={props.actionType === 'confirm'}
>
{props.actionDescription}
</button>
<button
className='btn'
onClick={onDismiss}
>
Cancel
</button>
</div>
</div>
</form>
</Modal>
</React.Fragment>;
}