This repository has been archived by the owner on Jan 9, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
AddRelatedPersonModal.tsx
124 lines (112 loc) · 4.03 KB
/
AddRelatedPersonModal.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { Modal, Alert, Typeahead, Label } from '@hospitalrun/components'
import format from 'date-fns/format'
import React, { useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import TextInputWithLabelFormGroup from '../../shared/components/input/TextInputWithLabelFormGroup'
import PatientRepository from '../../shared/db/PatientRepository'
import useTranslator from '../../shared/hooks/useTranslator'
import Patient from '../../shared/model/Patient'
import RelatedPerson from '../../shared/model/RelatedPerson'
import { RootState } from '../../shared/store'
import { addRelatedPerson } from '../patient-slice'
interface Props {
show: boolean
toggle: () => void
onCloseButtonClick: () => void
}
const AddRelatedPersonModal = (props: Props) => {
const dispatch = useDispatch()
const { t } = useTranslator()
const { patient, relatedPersonError } = useSelector((state: RootState) => state.patient)
const { show, toggle, onCloseButtonClick } = props
const [relatedPerson, setRelatedPerson] = useState({
patientId: '',
type: '',
})
const onFieldChange = (key: string, value: string) => {
setRelatedPerson({
...relatedPerson,
[key]: value,
})
}
const onInputElementChange = (event: React.ChangeEvent<HTMLInputElement>, fieldName: string) => {
onFieldChange(fieldName, event.target.value)
}
const onPatientSelect = (p: Patient[]) => {
setRelatedPerson({ ...relatedPerson, patientId: p[0].id })
}
const onSearch = async (query: string) => {
const patients: Patient[] = await PatientRepository.search(query)
return patients.filter((p: Patient) => p.id !== patient.id)
}
const formattedDate = (date: string) => (date ? format(new Date(date), 'yyyy-MM-dd') : '')
const body = (
<form>
{relatedPersonError?.message && (
<Alert color="danger" title={t('states.error')} message={t(relatedPersonError?.message)} />
)}
<div className="row">
<div className="col-md-12">
<div className="form-group">
<Label text={t('patient.relatedPerson')} htmlFor="relatedPersonTypeAhead" isRequired />
<Typeahead
id="relatedPersonTypeAhead"
searchAccessor="fullName"
placeholder={t('patient.relatedPerson')}
onChange={onPatientSelect}
isInvalid={!!relatedPersonError?.relatedPerson}
onSearch={onSearch}
renderMenuItemChildren={(p: Patient) => (
<div>{`${p.fullName} - ${formattedDate(p.dateOfBirth)} (${p.code})`}</div>
)}
/>
{relatedPersonError?.relatedPerson && (
<div className="text-left ml-3 mt-1 text-small text-danger invalid-feedback d-block related-person-feedback">
{t(relatedPersonError?.relatedPerson)}
</div>
)}
</div>
</div>
</div>
<div className="row">
<div className="col-md-12">
<TextInputWithLabelFormGroup
name="type"
label={t('patient.relatedPersons.relationshipType')}
value={relatedPerson.type}
isEditable
isInvalid={!!relatedPersonError?.relationshipType}
feedback={t(relatedPersonError?.relationshipType || '')}
isRequired
onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
onInputElementChange(event, 'type')
}}
/>
</div>
</div>
</form>
)
return (
<Modal
show={show}
toggle={toggle}
title={t('patient.relatedPersons.add')}
body={body}
closeButton={{
children: t('actions.cancel'),
color: 'danger',
onClick: onCloseButtonClick,
}}
successButton={{
children: t('patient.relatedPersons.add'),
color: 'success',
icon: 'add',
iconLocation: 'left',
onClick: () => {
dispatch(addRelatedPerson(patient.id, relatedPerson as RelatedPerson))
},
}}
/>
)
}
export default AddRelatedPersonModal