import { Button, ButtonSet, Column, DatePicker, DatePickerInput, Dropdown, Form, Stack, TextInput, } from '@carbon/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { DefaultWorkspaceProps, parseDate, showModal, showSnackbar, useConfig, useLayoutType, } from '@openmrs/esm-framework'; import React from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { LabManifestConfig } from '../config-schema'; import { DRAFT_MANIFEST_STATUS, editableManifestStatus, LabManifestFilters, labManifestFormSchema, mutateManifestLinks, READY_TO_SEND_MANIFEST_STATUS, saveLabManifest, } from '../lab-manifest.resources'; import { County, MappedLabManifest } from '../types'; import styles from './lab-manifest-form.scss'; interface LabManifestFormProps extends DefaultWorkspaceProps { patientUuid: string; manifest?: MappedLabManifest; } type LabManifestFormType = z.infer; const LabManifestForm: React.FC = ({ closeWorkspace, manifest }) => { const { labmanifestTypes } = useConfig(); const counties = require('../counties.json') as County[]; const form = useForm({ defaultValues: { ...manifest, manifestType: manifest?.manifestType ? Number(manifest.manifestType) : undefined, dispatchDate: manifest?.dispatchDate ? parseDate(manifest.dispatchDate) : undefined, startDate: manifest?.startDate ? parseDate(manifest.startDate) : undefined, endDate: manifest?.endDate ? parseDate(manifest.endDate) : undefined, }, resolver: zodResolver(labManifestFormSchema), }); const { t } = useTranslation(); const observableSelectedCounty = form.watch('county'); const layout = useLayoutType(); const controlSize = layout === 'tablet' ? 'sm' : 'md'; const onSubmit = async (values: LabManifestFormType) => { try { const requireConfirmation = values.manifestStatus === READY_TO_SEND_MANIFEST_STATUS && manifest?.manifestStatus === DRAFT_MANIFEST_STATUS; if (requireConfirmation) { const dispose = showModal('manifest-status-change-confirm-dialog', { onClose: () => dispose(), onConfirm: async () => { try { await saveLabManifest(values, manifest?.uuid); mutateManifestLinks(manifest?.uuid, values?.manifestStatus, manifest?.manifestStatus); closeWorkspace(); showSnackbar({ title: 'Success', kind: 'success', subtitle: 'Lab manifest created successfully!' }); } catch (error) { showSnackbar({ title: 'Failure', kind: 'error', subtitle: 'Error creating lab manifest' }); } finally { dispose(); } }, manifest, }); return; } await saveLabManifest(values, manifest?.uuid); mutateManifestLinks(manifest?.uuid, values?.manifestStatus, manifest?.manifestStatus); closeWorkspace(); showSnackbar({ title: 'Success', kind: 'success', subtitle: 'Lab manifest created successfully!' }); } catch (error) { showSnackbar({ title: 'Failure', kind: 'error', subtitle: 'Error creating lab manifest' }); } }; return (
{t('manifestDateRange', 'Manifest Date range')} ( )} /> ( )} /> {t('manifestType', 'Manifest type')} ( { field.onChange(e.selectedItem); }} initialSelectedItem={field.value} label="Choose option" items={labmanifestTypes.map((r) => r.id)} itemToString={(item) => labmanifestTypes.find((r) => r.id === item)?.type ?? ''} /> )} /> {t('dispatchDetails', 'Dispatch Details')} ( )} /> ( )} /> ( )} /> {t('address', 'Address')} ( { field.onChange(e.selectedItem); form.setValue('subCounty', undefined); }} initialSelectedItem={field.value} label="Select county" items={counties.map((r) => r.name)} itemToString={(item) => item ?? ''} /> )} /> ( { field.onChange(e.selectedItem); }} label="Select subcounty" items={(counties.find((c) => c.name == observableSelectedCounty)?.constituencies ?? []).map( (r) => r.name, )} itemToString={(item) => (counties.find((c) => c.name == observableSelectedCounty)?.constituencies ?? []).find( (c) => c.name === item, )?.name ?? 'Select subcounty' } /> )} /> ( )} /> ( )} /> ( )} /> ( )} /> ( )} /> {t('manifestStatus', 'Manifest status')} ( { field.onChange(e.selectedItem); }} initialSelectedItem={field.value} label="Select status" items={LabManifestFilters.filter((lm) => editableManifestStatus.includes(lm.value)).map((r) => r.value)} itemToString={(item) => LabManifestFilters.filter((lm) => editableManifestStatus.includes(lm.value)).find( (r) => r.value === item, )?.label ?? '' } /> )} />
); }; export default LabManifestForm;