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 && ( )}
); } interface IsotopesOptionProps { name: string; title: string; control: any; } function IsotopesOption(props: IsotopesOptionProps) { const { name, title, control } = props; return ( } /> ); } export default forwardRef(PredictionOptionsPanel);