import { Tag } from '@blueprintjs/core';
import { yupResolver } from '@hookform/resolvers/yup';
import { forwardRef } from 'react';
import { useForm } from 'react-hook-form';
import * as Yup from 'yup';
import type { PredictionOptions } from '../../../data/PredictionManager.js';
import { FREQUENCIES } from '../../../data/PredictionManager.js';
import generateNumbersPowerOfX from '../../../data/utilities/generateNumbersPowerOfX.js';
import { CheckController } from '../../elements/CheckController.js';
import { GroupPane } from '../../elements/GroupPane.js';
import { Input2Controller } from '../../elements/Input2Controller.js';
import IsotopesViewer from '../../elements/IsotopesViewer.js';
import type { LabelStyle } from '../../elements/Label.js';
import Label from '../../elements/Label.js';
import { NumberInput2Controller } from '../../elements/NumberInput2Controller.js';
import { Select2Controller } from '../../elements/Select2Controller.js';
import { useSettingImperativeHandle } from '../extra/utilities/settingImperativeHandle.js';
const NUMBER_OF_POINTS_1D = generateNumbersPowerOfX(12, 19);
const NUMBER_OF_POINTS_2D = generateNumbersPowerOfX(6, 12, {
format: String,
});
const getPredictionFormValidation = (isNameRequired = false) =>
Yup.object().shape({
name: Yup.string()
.when([], {
is: () => isNameRequired,
// eslint-disable-next-line unicorn/no-thenable
then: (nameSchema) => nameSchema.required('Name is required'),
otherwise: (nameSchema) => nameSchema.notRequired(),
})
.label('Name'),
frequency: Yup.number().integer().required().label('Frequency'),
autoExtendRange: Yup.boolean(),
'1d': Yup.object({
'1H': Yup.object({
from: Yup.number().required().label("1H ' From ' "),
to: Yup.number().required().label("1H ' To ' "),
}),
'13C': Yup.object().shape({
from: Yup.number().required().label("13C ' From ' "),
to: Yup.number().required().label("13C ' To ' "),
}),
lineWidth: Yup.number().integer().min(1).required().label('Line Width'),
nbPoints: Yup.number().integer().required().label('1D Number Of Points'),
}),
'2d': Yup.object({
nbPoints: Yup.object({
x: Yup.number().integer().required().label('2D Number Of Points'),
y: Yup.number().integer().required().label('2D Number Of Points'),
}),
}),
spectra: Yup.object({
proton: Yup.boolean(),
carbon: Yup.boolean(),
cosy: Yup.boolean(),
hsqc: Yup.boolean(),
hmbc: Yup.boolean(),
}).test(
'check-options',
'You must check one of the options to start prediction',
(obj) => {
if (Object.values(obj).includes(true)) {
return true;
}
return false;
},
),
});
const labelStyle: LabelStyle = {
label: { flex: 4, fontWeight: '500' },
wrapper: { flex: 8, display: 'flex', alignItems: 'center' },
container: { padding: '5px 0' },
};
const styles = {
select: {
width: '100%',
minWidth: '100px',
maxWidth: '280px',
height: 30,
margin: 0,
},
groupHeader: {
borderBottom: '1px solid #efefef',
paddingBottom: '5px',
fontWeight: '600',
color: '#005d9e',
},
};
interface PredictionOptionsPanelProps {
options: PredictionOptions;
hideName?: boolean;
onSave: (values: any) => void;
}
function PredictionOptionsPanel(props: PredictionOptionsPanelProps, ref: any) {
const { options, onSave, hideName = false } = props;
const { handleSubmit, control } = useForm({
defaultValues: options,
resolver: yupResolver(getPredictionFormValidation(!hideName) as any),
});
useSettingImperativeHandle(ref, handleSubmit, onSave);
return (
<>
{!hideName && (
)}
(
)}
style={labelStyle}
>
Hz}
/>
X
>
);
}
interface IsotopesOptionProps {
name: string;
title: string;
control: any;
}
function IsotopesOption(props: IsotopesOptionProps) {
const { name, title, control } = props;
return (
}
/>
);
}
export default forwardRef(PredictionOptionsPanel);