{"version":3,"sources":["assets/beep-07.mp3","assets/error-beep.mp3","clients/client.ts","components/survey/SurveyEditButton.tsx","components/survey/GenerateLabelsButton.tsx","components/survey/BatchRecordTestResultsButton.tsx","components/survey/SurveyNotes.tsx","components/survey/AddSampleRow.tsx","components/survey/TestTitle.tsx","components/test_card/SampleRow.tsx","helpers/samples.ts","components/test_card/TestCard.tsx","components/survey/AddTestButton.tsx","models/Statuses.ts","components/survey/CopyToNewSurveyButton.tsx","components/survey/SurveyModal.tsx","components/survey/SurveyTable.tsx","components/population/PopulationTable.tsx","components/scanner/ScannerAddNewTestButton.tsx","components/scanner/Scanner.tsx","components/survey/CreateSurveyButton.tsx","components/home/Home.tsx","components/labels/Label.tsx","helpers/barcodes.ts","components/labels/Labels.tsx","components/login/LoginPage.tsx","components/population/PrintPopulation.tsx","components/labels/DriveByList.tsx","components/Routes.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["module","exports","backend","process","REACT_APP_ENVIRONMENT","serverUrl","retrieveSubjectNodes","fetch","credentials","headers","Authorization","then","response","a","json","retrieveSubjectsResponse","nodes","catch","window","location","pathname","retrievePeople","get","retrieveSurvey","surveyId","retrieveSurveyListings","retrieveTest","testId","retrieveSample","sampleId","processSample","post","toggleBadSample","toggleTestResult","testStatus","addTest","testName","endpoint","method","status","body","Accept","JSON","stringify","SurveyEditButton","props","useState","isOpen","setIsOpen","surveyName","setSurveyName","isConfirmOpen","setIsConfirmOpen","isDeleting","setIsDeleting","isTooltipOpen","setIsTooltipOpen","tooltipAnchor","setTooltipAnchor","useEffect","survey","name","handleClose","className","IconButton","onClick","onMouseEnter","event","currentTarget","onMouseLeave","Dialog","open","onClose","aria-labelledby","onSubmit","preventDefault","changeSurveyName","id","onSave","DialogTitle","DialogContent","DialogContentText","TextField","value","label","onChange","target","DialogActions","Button","color","disabled","CircularProgress","type","Popover","anchorEl","style","pointerEvents","anchorOrigin","vertical","horizontal","transformOrigin","disableRestoreFocus","Typography","GenerateLabelsButton","isDialogOpen","setIsDialogOpen","options","setOptions","selected","setSelected","testOptions","tests","map","test","variant","labelledBy","url","testOption","join","BatchRecordTestResultsButton","isLoading","setIsLoading","includeRecordedResults","setIncludeRecordedResults","handleRecord","testIds","recordTestResults","s","recordNewTestResults","aria-label","FormControlLabel","control","Switch","checked","SurveyNotes","isSaving","setIsSaving","note","setNote","updatedNote","setUpdatedNote","ButtonBase","Card","gutterBottom","component","split","line","multiline","defaultValue","e","updateSurveyNote","createFilterOptions","AddSampleRow","setValue","toggleOpen","subjects","setSubjects","isAdding","setIsAdding","person","title","apid","setDialogValue","React","dialogValue","Autocomplete","newValue","setTimeout","filterOptions","params","filtered","matchSorter","inputValue","keys","push","getOptionLabel","option","selectOnFocus","clearOnBlur","handleHomeEndKeys","renderOption","width","freeSolo","renderInput","personName","personId","onUpdateTest","autoFocus","margin","TestTitle","setTestName","podNames","setPodNames","population","podNodes","children","flatMap","school","grade","pod","node","role","changeTestName","length","undefined","handleSave","SampleRow","isSettingStatus","setIsSettingStatus","sample","setSample","handleUpdateSample","newSample","onUpdateSample","key","deleted","Select","renderValue","MenuItem","Divider","light","sortSamplesByLastName","samples","sort","b","componentsA","componentsB","toLowerCase","TestCard","isSettingPositive","setIsSettingPositive","isSettingNegative","setIsSettingNegative","isSettingInconclusive","setIsSettingInconclusive","filter","setDisabled","setTest","newTest","concat","getTestProcessedStatus","nonDeletedSamples","every","reload","openTests","includes","setOpenTests","AddTestButton","reloadSurveys","RECORDED_STATUSES","CopyToNewSurveyButton","moment","selectedDate","setSelectedDate","charAt","toLocaleLowerCase","substr","onOpen","utils","DateFnsUtils","format","date","Date","parse","toDateString","KeyboardButtonProps","find","copyTestsToNewSurvey","SurveyModal","setSurvey","handleEditSurvey","reloadSurveyListings","result","parseInt","numCreatedTests","t","numProcessedTests","numTestResultsRecorded","mode","startDate","driveBy","handleCloseModal","index","SurveyTable","tableHead","TableHead","TableRow","TableCell","align","TableContainer","Paper","surveyListings","Table","TableBody","surveyListing","handleOpenSurvey","hover","scope","samplesProcessed","testResultsRecorded","negativeTests","positiveTests","inconclusiveTests","useRowStyles","makeStyles","root","borderBottom","PopulationTable","history","useHistory","openRows","setOpenRows","pods","setPods","newPods","setNewPods","newPeopleNames","setNewPeopleNames","newPeopleApids","setNewPeopleApids","originalPodLabels","setOriginalPodLabels","podLabels","setPodLabels","editedPods","setEditedPods","originalPersonApids","setOriginalPersonApids","personApids","setPersonApids","originalPersonNames","setOriginalPersonNames","personNames","setPersonNames","editedPeople","setEditedPeople","classes","forEach","newEditedPeople","Object","nameChanged","apidChanged","toggleRow","rowValue","row","gradeSorter","gradeA","gradeB","gradeOrder","indexOf","schools","newOpenRows","size","paddingBottom","paddingTop","colSpan","Collapse","in","timeout","unmountOnExit","Box","editedPodsCopy","create","podId","newName","originalPodLabelsCopy","reloadPopulation","placeholder","personNamesCopy","personApidsCopy","newPodId","newApid","originalPersonApidsCopy","originalPersonNamesCopy","editedPeopleCopy","newPeopleCopy","newPeopleApidsCopy","newPeopleNamesCopy","newPodsCopy","gradeId","newPodName","ScannerAddNewTestButton","hasSelectAll","newSelected","addTestResult","onAddTest","Scanner","scanResult","setScanResult","isToastOpen","setIsToastOpen","toastMessage","setToastMessage","toastSeverity","setToastSeverity","isProcessingSample","setIsProcessingSample","numSamplesRemaining","setNumSamplesRemaining","isProcessingTest","setIsProcessingTest","nextTest","setNextTest","currentId","setCurrentId","shouldProcessSamplesOfAnyTest","setShouldProcessSamplesOfAnyTest","shouldMoveToCurrentTest","setShouldMoveToCurrentTest","useSound","successBeep","playSuccessBeep","errorBeep","playErrorBeep","scanBuffer","handleToastClose","makeToast","message","severity","handleProcessTest","some","handleContinueProcessTest","finishProcessing","scanTest","suppressSuccessBeep","scanSample","newTestId","Promise","resolve","addEventListener","labelId","upcToId","foundSample","Snackbar","autoHideDuration","Alert","action","upc","startsWith","substring","CreateSurveyButton","subjectNodes","setSubjectNodes","expanded","setExpanded","setChecked","setName","isDriveBy","setIsDriveBy","onCheck","newChecked","onExpand","newExpanded","showNodeIcon","createSurvey","ok","Home","isModalOpen","setIsModalOpen","modalMode","setModalMode","tabValue","setTabValue","selectedSurveyId","setSelectedSurveyId","setSurveyListings","setPopulation","loadSurveyListings","loadPopulation","AppBar","position","Toolbar","TabContext","TabList","Tab","TabPanel","Barcode","require","Label","useFitText","onFinish","onDone","fontSize","ref","text","height","barcode","displayValue","cdigit","generateEan8","numToPad","padded","i","withTypeDigit","luhn","generate","Labels","labels","setLabels","query","URLSearchParams","useLocation","search","handleFinishedLabel","labelContent","selectedTestIds","getAll","remainder","remainingLabelsOnLine","content","page","print","container","parentElement","useStyles","theme","paper","marginTop","spacing","display","flexDirection","alignItems","avatar","backgroundColor","palette","secondary","main","form","submit","LoginPage","username","setUsername","password","setPassword","failed","setIsFailed","attemptLogin","user","pass","myHeaders","Headers","token","btoa","append","requestOptions","redirect","login","Container","maxWidth","CssBaseline","Avatar","noValidate","required","fullWidth","autoComplete","onKeyPress","PrintPopulation","people","setPeople","personNodes","personArray","sortedPeople","DriveByList","setSamples","sortedSamples","Routes","path","exact","App","Boolean","hostname","match","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","registration","unregister","error","console"],"mappings":"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","file":"static/js/main.9ef17404.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/beep-07.d932c606.mp3\";","module.exports = __webpack_public_path__ + \"static/media/error-beep.883d553e.mp3\";","import { Moment } from 'moment';\nimport { SubjectNode } from '../models/SubjectNode';\nimport { Survey } from '../models/Survey';\nimport { Person } from '../models/Person';\nimport { TestStatus } from '../models/Statuses';\nimport { Test } from '../models/Test';\nimport { Sample } from '../models/Sample';\nimport { SurveyListing } from '../models/SurveyListing';\n\ninterface RetrieveSubjectsResponse {\n nodes: SubjectNode[];\n}\n\nlet backend = '/api';\nif (process.env.REACT_APP_ENVIRONMENT === 'local') {\n backend = 'http://localhost:8080';\n}\nexport const serverUrl = backend;\n\nexport const retrieveSubjectNodes = (): Promise => (\n fetch(`${serverUrl}/api/subject/nodes`, { credentials: 'include', headers: { Authorization: '' } })\n .then(async (response) => {\n const retrieveSubjectsResponse: RetrieveSubjectsResponse = await response.json();\n return retrieveSubjectsResponse.nodes;\n })\n .catch((response) => {\n window.location.pathname = '/login';\n return response;\n })\n);\n\nexport const retrievePeople = (): Promise => (\n get('subject')\n);\n\nexport const retrieveAllSurveys = (): Promise => (\n get('survey/all')\n);\n\nexport const retrieveSurvey = (surveyId: string): Promise => (\n get(`survey?id=${surveyId}`)\n);\n\nexport const retrieveSurveyListings = (): Promise => (\n get('survey/listing')\n);\n\nexport const retrieveTest = (testId: string): Promise => (\n get(`survey/test?id=${testId}`)\n);\n\nexport const retrieveSample = (sampleId: string): Promise => (\n get(`survey/sample?id=${sampleId}`)\n);\n\nexport const createSurvey = (name: string, selectedDate: Moment, checked: string[], driveBy: boolean, surveyId?: string): Promise => (\n post('survey', {\n name, selectedDate: selectedDate.format('yyyy-MM-DD'), checked, driveBy, surveyId,\n })\n);\n\nexport const processSample = (sampleId: string): Promise => (\n post('survey/process-sample', { sampleId })\n);\n\nexport const moveAndProcessSample = (sampleId: string, newTestId: string): Promise => (\n post('survey/move-and-process-sample', { sampleId, newTestId })\n);\n\nexport const toggleBadSample = (sampleId: string): Promise => (\n post('survey/toggle-bad-sample', { sampleId })\n);\n\nexport const toggleAbsentSample = (sampleId: string): Promise => (\n post('survey/toggle-absent-sample', { sampleId })\n);\n\nexport const toggleMissingSample = (sampleId: string): Promise => (\n post('survey/toggle-missing-sample', { sampleId })\n);\n\nexport const deleteSample = (sampleId: string): Promise => (\n post('survey/delete-sample', { sampleId })\n);\n\nexport const addSample = (testId: string, personName: string, personId?: string): Promise => (\n post('survey/add-sample', { testId, personName, personId })\n);\n\nexport const toggleTestResult = (testId: string, testStatus: TestStatus): Promise => (\n post('survey/toggle-test-result', { testId, testStatus })\n);\n\nexport const recordTestResult = (testId: string, testStatus: TestStatus): Promise => (\n post('survey/record-test-result', { testId, testStatus })\n);\n\nexport const recordTestResults = (testIds: string[], testStatus: TestStatus): Promise => (\n post('survey/record-test-results', { tests: testIds.map((testId) => ({ testId, testStatus })) })\n);\n\nexport const recordNewTestResults = (testIds: string[], testStatus: TestStatus): Promise => (\n post('survey/record-new-test-results', { tests: testIds.map((testId) => ({ testId, testStatus })) })\n);\n\nexport const copyTestsToNewSurvey = (testIds: string[], selectedDate: Moment): Promise => (\n post('survey/copy-tests-to-new-survey', { testIds, selectedDate: selectedDate.format('yyyy-MM-DD') })\n);\n\nexport const addTest = (surveyId: string, testName?: string): Promise => (\n post('survey/add-test', { surveyId, testName })\n);\n\nexport const processTest = (testId: string): Promise => (\n post('survey/process-test', { testId })\n);\n\nexport const changeTestName = (testId: string, testName?: string): Promise => (\n post('survey/change-test-name', { testId, testName })\n);\n\nexport const deleteTest = (testId: string): Promise => (\n post('survey/delete-test', { testId })\n);\n\nexport const changeSurveyName = (surveyId: string, surveyName?: string): Promise => (\n post('survey/change-survey-name', { surveyId, surveyName })\n);\n\nexport const deleteSurvey = (surveyId: string): Promise => (\n post('survey/delete-survey', { surveyId })\n);\n\nexport const retrieveSurveyNote = (surveyId: string): Promise<{note: string}> => (\n get(`survey/${surveyId}/note`)\n);\n\nexport const updateSurveyNote = (surveyId: string, updatedNote: string): Promise => (\n post(`survey/${surveyId}/note`, { updatedNote })\n);\n\nexport const changePodName = (podId: string, newName: string): Promise => (\n post('subject/change-pod-name', { podId, newName })\n);\n\nexport const deletePod = (podId: string): Promise => (\n post('subject/delete-pod', { podId })\n);\n\nexport const changePersonApidAndName = (personId: string, newApid: string, newName: string): Promise => (\n post('subject/change-person-apid-and-name', { personId, newApid, newName })\n);\n\nexport const switchPod = (personId: string, newPodId: string): Promise => (\n post('subject/switch-pod', { personId, newPodId })\n);\n\nexport const addPod = (gradeId: string, newPodName: string): Promise => (\n post('subject/add-pod', { gradeId, newPodName })\n);\n\nexport const addPerson = (podId: string, personName: string, personId?: string): Promise => (\n post('subject/add-person', { podId, personName, personId })\n);\n\nexport const login = (user: string, pass: string): Promise => {\n const myHeaders = new Headers();\n const token = btoa(`${user}:${pass}`);\n myHeaders.append('Authorization', `Basic ${token}`);\n myHeaders.append('Cache', 'no-cache');\n\n const requestOptions: RequestInit = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow',\n credentials: 'include',\n };\n\n return fetch(`${serverUrl}/login`, requestOptions)\n .then((response) => {\n if (response.status !== 200) return false;\n window.location.pathname = '/';\n return true;\n })\n .catch(() => false);\n};\n\nexport const logout = () => {\n fetch(`${serverUrl}/logout`, { credentials: 'include' });\n window.location.pathname = '/';\n};\n\nconst get = (endpoint: string): Promise => (\n fetch(`${serverUrl}/api/${endpoint}`, { method: 'GET', credentials: 'include', headers: { Authorization: '' } })\n .then((response) => response.json())\n .catch((response) => {\n if (response.status === 400) {\n window.location.pathname = '/login';\n }\n })\n);\n\nconst post = (endpoint: string, body: any): Promise => fetch(`${serverUrl}/api/${endpoint}`,\n {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: '',\n },\n credentials: 'include',\n body: JSON.stringify(body),\n })\n .then((response) => {\n if (response.status === 400) {\n window.location.pathname = '/login';\n }\n return response;\n });\n","import React, { FC, useEffect, useState } from 'react';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport TextField from '@material-ui/core/TextField';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport {\n CircularProgress, IconButton, Popover, Typography,\n} from '@material-ui/core';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { changeSurveyName, deleteSurvey } from '../../clients/client';\nimport { Survey } from '../../models/Survey';\n\ninterface Props {\n survey: Survey;\n onSave: () => void;\n onClose: () => void;\n}\n\nexport const SurveyEditButton: FC = (props) => {\n const [isOpen, setIsOpen] = useState(false);\n const [surveyName, setSurveyName] = useState();\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [tooltipAnchor, setTooltipAnchor] = useState();\n\n useEffect(() => {\n setSurveyName(props.survey.name);\n }, [isOpen]);\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n changeSurveyName(props.survey.id, surveyName || `Survey ${props.survey.id}`).then(() => {\n props.onSave();\n setIsOpen(false);\n });\n };\n\n const handleClose = () => setIsOpen(false);\n\n const handleDelete = () => {\n setIsDeleting(true);\n deleteSurvey(props.survey.id).then(() => {\n props.onSave();\n setIsOpen(false);\n props.onClose();\n });\n };\n\n return (\n
\n setIsOpen(true)}\n onMouseEnter={(event) => {\n setIsTooltipOpen(true);\n setTooltipAnchor(event.currentTarget);\n }}\n onMouseLeave={() => setIsTooltipOpen(false)}\n >\n \n \n \n
\n \n Edit survey:\n {' '}\n {props.survey.name}\n \n \n \n Change survey name or delete it from database.\n \n setSurveyName(event.target.value)} />\n \n Are you sure you want to delete the survey?\n \n \n Action cannot be undone.\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n \n Edit Survey\n \n
\n );\n};\n","import {\n Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle,\n} from '@material-ui/core';\nimport React, { FC, useEffect, useState } from 'react';\nimport MultiSelect from 'react-multi-select-component';\nimport { Option } from 'react-multi-select-component/dist/lib/interfaces';\nimport { Survey } from '../../models/Survey';\n\ninterface Props {\n survey?: Survey;\n}\n\nexport const GenerateLabelsButton: FC = (props) => {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [options, setOptions] = useState([]);\n const [selected, setSelected] = useState([]);\n\n const handleClose = () => {\n setIsDialogOpen(false);\n };\n\n const handleSubmit = () => {\n const url = `/labels?survey=${props.survey?.id}${selected.map((testOption) => `&test=${testOption.value}`).join('')}`;\n window.open(url, '_blank');\n setIsDialogOpen(false);\n };\n\n useEffect(() => {\n if (props.survey) {\n const testOptions = props.survey.tests.map((test) => ({ label: test.name, value: test.id }));\n setOptions(testOptions);\n setSelected(testOptions);\n }\n }, []);\n\n return (\n <>\n {\n setIsDialogOpen(true);\n }}\n >\n Generate Labels\n \n \n
\n \n Generate Labels\n \n \n \n
Select the tests to be included in the printed labels.
\n
Each test and sample will be assigned a unique barcode.
\n
\n \n
\n \n \n \n \n
\n \n \n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport {\n FormControlLabel, IconButton, Popover, Switch, Typography,\n} from '@material-ui/core';\nimport DoneAllIcon from '@material-ui/icons/DoneAll';\nimport MultiSelect from 'react-multi-select-component';\nimport { Option } from 'react-multi-select-component/dist/lib/interfaces';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { Survey } from '../../models/Survey';\nimport { recordNewTestResults, recordTestResults } from '../../clients/client';\nimport { TestStatus } from '../../models/Statuses';\n\ninterface Props {\n survey: Survey;\n onSave: () => void;\n}\n\nexport const BatchRecordTestResultsButton: FC = (props) => {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [tooltipAnchor, setTooltipAnchor] = useState();\n const [options, setOptions] = useState([]);\n const [selected, setSelected] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n const [includeRecordedResults, setIncludeRecordedResults] = useState(false);\n\n const handleMarkPositive = () => {\n handleRecord('POSITIVE');\n };\n\n const handleMarkNegative = () => {\n handleRecord('NEGATIVE');\n };\n\n const handleRecord = (testStatus: TestStatus) => {\n setIsLoading(true);\n if (includeRecordedResults) {\n recordTestResults(selected.map((s) => s.value), testStatus).then(() => {\n props.onSave();\n setIsLoading(false);\n handleClose();\n });\n } else {\n recordNewTestResults(selected.map((s) => s.value), testStatus).then(() => {\n props.onSave();\n setIsLoading(false);\n handleClose();\n });\n }\n };\n\n const handleClose = () => setIsDialogOpen(false);\n\n useEffect(() => {\n if (props.survey) {\n const testOptions = props.survey.tests.map((test) => ({ label: test.name, value: test.id }));\n setOptions(testOptions);\n setSelected(testOptions);\n }\n }, []);\n\n return (\n
\n setIsDialogOpen(true)}\n onMouseEnter={(event) => {\n setIsTooltipOpen(true);\n setTooltipAnchor(event.currentTarget);\n }}\n onMouseLeave={() => setIsTooltipOpen(false)}\n >\n \n \n \n
\n \n Batch Record Test Results\n \n \n \n \n \n \n
Select the test results to record
\n
Enable 'Include Recorded' to overwrite existing test results
\n
\n \n
\n \n ) => { setIncludeRecordedResults(event.target.checked); }}\n name=\"checkedA\"\n color=\"primary\"\n />\n )}\n label=\"Include recorded\"\n />\n \n \n \n
\n \n \n Batch Record Test Results\n \n
\n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport { ButtonBase, Card, Typography } from '@material-ui/core';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport TextField from '@material-ui/core/TextField';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { Survey } from '../../models/Survey';\nimport { retrieveSurveyNote, updateSurveyNote } from '../../clients/client';\n\ninterface Props {\n survey?: Survey;\n}\n\nexport const SurveyNotes: FC = (props) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [note, setNote] = useState('');\n const [updatedNote, setUpdatedNote] = useState('');\n\n useEffect(() => {\n if (props.survey) {\n retrieveSurveyNote(props.survey?.id).then((response) => {\n setNote(response.note);\n setUpdatedNote(response.note);\n });\n }\n }, [props.survey]);\n\n useEffect(() => {\n setUpdatedNote(note);\n }, [isOpen]);\n\n const saveNote = (event: React.MouseEvent) => {\n event.preventDefault();\n if (props.survey) {\n setIsSaving(true);\n updateSurveyNote(props.survey.id, updatedNote).then(() => {\n setNote(updatedNote);\n setIsSaving(false);\n handleClose();\n });\n }\n };\n\n const handleClose = () => setIsOpen(false);\n\n return (\n <>\n {\n setIsOpen(true);\n }}\n >\n \n \n Notes\n \n
\n {note.split('\\n').map((line) =>
{line}
)}\n
\n
\n \n\n \n
\n Edit survey notes\n \n {\n setUpdatedNote(e.target.value);\n }}\n />\n \n \n \n \n \n
\n
\n \n );\n};\n","import React, { useEffect, useState } from 'react';\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Autocomplete, { createFilterOptions } from '@material-ui/lab/Autocomplete';\nimport { matchSorter } from 'match-sorter';\nimport { Person } from '../../models/Person';\nimport { addSample } from '../../clients/client';\n\nconst filter = createFilterOptions();\n\ninterface Props {\n subjects: Person[];\n onUpdateTest: () => Promise;\n testId: string;\n}\n\ninterface OptionType {\n name?: string;\n apid?: string;\n title: string;\n id?: string;\n}\n\nexport default function AddSampleRow(props: Props) {\n const [value, setValue] = useState(null);\n const [open, toggleOpen] = useState(false);\n const [subjects, setSubjects] = useState([]);\n const [isAdding, setIsAdding] = useState(false);\n\n useEffect(() => {\n setSubjects(props.subjects.map((person) => ({\n title: `${person.name} (${person.apid})`,\n name: person.name,\n apid: person.apid,\n id: person.id,\n })));\n }, [props.subjects]);\n\n const handleClose = () => {\n setDialogValue({\n title: '',\n apid: '',\n id: '',\n });\n toggleOpen(false);\n };\n\n const [dialogValue, setDialogValue] = React.useState({\n title: '',\n apid: '',\n id: '',\n });\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n setValue({\n title: dialogValue.title,\n id: dialogValue.id,\n });\n setIsAdding(true);\n addSample(props.testId, dialogValue.title, dialogValue.id).then(() => {\n props.onUpdateTest().then(() => {\n setValue(null);\n setIsAdding(false);\n handleClose();\n });\n });\n };\n\n return (\n <>\n {\n if (typeof newValue === 'string') {\n // timeout to avoid instant validation of the dialog's form.\n setTimeout(() => {\n toggleOpen(true);\n setDialogValue({\n title: newValue,\n apid: '',\n id: '',\n });\n });\n } else if (newValue && newValue.name) {\n toggleOpen(true);\n setDialogValue({\n title: newValue.name,\n apid: newValue.apid || '',\n id: newValue.id!,\n });\n } else {\n setValue(newValue);\n }\n }}\n filterOptions={(options, params) => {\n // const filtered = filter(options, params) as OptionType[];\n const filtered = matchSorter(options, params.inputValue, { keys: ['title'] });\n\n if (params.inputValue !== '') {\n filtered.push({\n name: params.inputValue,\n title: `Add \"${params.inputValue}\"`,\n });\n }\n\n return filtered;\n }}\n id=\"free-solo-dialog-demo\"\n options={subjects}\n getOptionLabel={(option) => {\n // e.g value selected with enter, right from the input\n if (typeof option === 'string') {\n return option;\n }\n if (option.name) {\n return option.name;\n }\n return option.title;\n }}\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n renderOption={(option) => option.title}\n style={{ width: 300 }}\n freeSolo\n renderInput={(params) => (\n \n )}\n />\n \n
\n Add a sample\n \n \n If the subject does not have a student / faculty ID, please leave the ID field blank.\n \n setDialogValue({ ...dialogValue, title: event.target.value })}\n label=\"Name\"\n type=\"text\"\n />\n setDialogValue({ ...dialogValue, apid: event.target.value })}\n label=\"ID\"\n type=\"text\"\n />\n \n \n \n \n \n
\n
\n \n );\n}\n","import React, { FC, useEffect, useState } from 'react';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport TextField from '@material-ui/core/TextField';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { matchSorter } from 'match-sorter';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { Popover, Typography } from '@material-ui/core';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport { Test } from '../../models/Test';\nimport { changeTestName, deleteTest } from '../../clients/client';\n\ninterface Props {\n test: Test;\n handleSave: () => void;\n population?: SubjectNode[];\n}\n\nexport const TestTitle: FC = (props) => {\n const [isOpen, setIsOpen] = useState(false);\n const [testName, setTestName] = useState(props.test.name);\n const [podNames, setPodNames] = useState([]);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [tooltipAnchor, setTooltipAnchor] = useState();\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n changeTestName(props.test.id, testName?.length ? testName : undefined).then(() => {\n props.handleSave();\n setIsOpen(false);\n });\n };\n\n const handleClose = () => setIsOpen(false);\n\n const handleDelete = () => {\n deleteTest(props.test.id).then(() => {\n props.handleSave();\n setIsOpen(false);\n });\n };\n\n useEffect(() => {\n if (!props.population) return;\n const schools = props.population[0].children;\n const podNodes = schools!.flatMap((school) => school.children!.flatMap((grade) => grade.children!.flatMap((pod) => pod)));\n setPodNames(podNodes.map((node) => node.label));\n }, []);\n\n useEffect(() => {\n setTestName(props.test.name);\n }, [isOpen]);\n\n return (\n <>\n setIsOpen(true)}\n onMouseEnter={(event) => {\n setIsTooltipOpen(true);\n setTooltipAnchor(event.currentTarget);\n }}\n onMouseLeave={() => setIsTooltipOpen(false)}\n >\n {props.test.name}\n \n \n
\n \n Edit test:\n {' '}\n {props.test.name}\n \n \n \n
Changes will not affect pod in database or tests in other surveys.
\n
To let the test name be auto-generated, leave the Test Name field blank.
\n
\n {\n if (typeof newValue === 'string') {\n // timeout to avoid instant validation of the dialog's form.\n setTimeout(() => {\n setIsOpen(true);\n setTestName(newValue);\n });\n }\n }}\n filterOptions={(options, params) => {\n const filtered = matchSorter(options, params.inputValue);\n\n if (params.inputValue !== '') {\n filtered.push(params.inputValue);\n }\n\n return filtered;\n }}\n id=\"free-solo-dialog-demo\"\n options={podNames}\n getOptionLabel={(option) => option}\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n renderOption={(option) => option}\n style={{ width: 300 }}\n freeSolo\n renderInput={(params) => (\n setTestName(event.target.value)} />\n )}\n />\n \n Are you sure you want to delete the test?\n \n \n Action cannot be undone.\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n \n Edit Test\n \n \n );\n};\n","import {\n CircularProgress, Divider, MenuItem, Select, Typography,\n} from '@material-ui/core';\nimport IconButton from '@material-ui/core/IconButton';\nimport CircleChecked from '@material-ui/icons/CheckCircleOutline';\nimport CircleCheckedFilled from '@material-ui/icons/CheckCircle';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport DeleteOutlineIcon from '@material-ui/icons/DeleteOutline';\nimport NotListedLocationIcon from '@material-ui/icons/NotListedLocation';\nimport NotListedLocationOutlinedIcon from '@material-ui/icons/NotListedLocationOutlined';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport ErrorIcon from '@material-ui/icons/Error';\nimport HomeIcon from '@material-ui/icons/Home';\nimport HomeOutlinedIcon from '@material-ui/icons/HomeOutlined';\nimport React, { FC, useEffect, useState } from 'react';\nimport {\n deleteSample, processSample, retrieveSample, toggleAbsentSample, toggleBadSample, toggleMissingSample,\n} from '../../clients/client';\nimport { Sample } from '../../models/Sample';\n\ninterface Props {\n sample: Sample;\n onUpdateSample: (sample: Sample) => void;\n}\n\nexport const SampleRow: FC = (props) => {\n const [isSettingStatus, setIsSettingStatus] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [sample, setSample] = useState(props.sample);\n\n const handleUpdateSample = () => {\n retrieveSample(sample.id).then((newSample) => {\n setSample(newSample);\n setIsSettingStatus(false);\n setIsDeleting(false);\n props.onUpdateSample(newSample);\n });\n };\n\n useEffect(() => {\n setSample(props.sample);\n }, [props.sample]);\n\n return (\n
\n \n

\n {sample.person.name}\n

\n
\n {\n if (isSettingStatus) {\n return (\n \n );\n }\n if (sample.deleted) return '---';\n switch (value) {\n case 'PROCESSED':\n return ;\n case 'BAD_SAMPLE':\n return ;\n case 'MISSING':\n return ;\n case 'ABSENT':\n return ;\n default:\n return ;\n }\n }}\n >\n \n {\n setIsSettingStatus(true);\n processSample(sample.id).then(() => {\n handleUpdateSample();\n });\n }}\n >\n {isSettingStatus ? (\n \n ) : sample.status === 'PROCESSED'\n ? : }\n Processed\n \n \n \n {\n setIsSettingStatus(true);\n toggleBadSample(sample.id).then(() => {\n handleUpdateSample();\n });\n }}\n >\n {sample.status === 'BAD_SAMPLE'\n ? : }\n Bad Sample\n \n \n \n {\n setIsSettingStatus(true);\n toggleMissingSample(sample.id).then(() => {\n handleUpdateSample();\n });\n }}\n >\n {sample.status === 'MISSING'\n ? : }\n Missing Sample\n \n \n \n {\n setIsSettingStatus(true);\n toggleAbsentSample(sample.id).then(() => {\n handleUpdateSample();\n });\n }}\n >\n {sample.status === 'ABSENT'\n ? : }\n Absent Person\n \n \n \n {\n setIsDeleting(true);\n deleteSample(sample.id).then(() => {\n handleUpdateSample();\n });\n }}\n >\n {isDeleting\n ? : sample.deleted\n ? : }\n \n
\n \n \n
\n );\n};\n","import { Sample } from '../models/Sample';\n\nexport const sortSamplesByLastName = (samples: Sample[]) => samples.sort((a: Sample, b: Sample) => {\n const componentsA = a.person.name.split(' ');\n const componentsB = b.person.name.split(' ');\n\n const lastNameA = componentsA[componentsA.length - 1].toLowerCase();\n const lastNameB = componentsB[componentsB.length - 1].toLowerCase();\n\n if (lastNameA < lastNameB) return -1;\n return 1;\n});\n","import React, { FC, useEffect, useState } from 'react';\nimport { CircularProgress, Divider, Typography } from '@material-ui/core';\nimport IconButton from '@material-ui/core/IconButton';\nimport AddCircleOutlinedIcon from '@material-ui/icons/AddCircleOutlined';\nimport AddCircleOutlineOutlinedIcon from '@material-ui/icons/AddCircleOutlineOutlined';\nimport RemoveCircleOutlinedIcon from '@material-ui/icons/RemoveCircleOutlined';\nimport HelpIcon from '@material-ui/icons/Help';\nimport HelpOutlineOutlinedIcon from '@material-ui/icons/HelpOutlineOutlined';\nimport RemoveCircleOutlineOutlinedIcon from '@material-ui/icons/RemoveCircleOutlineOutlined';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport AddSampleRow from '../survey/AddSampleRow';\nimport { Sample } from '../../models/Sample';\nimport { retrieveTest, toggleTestResult } from '../../clients/client';\nimport { TestTitle } from '../survey/TestTitle';\nimport { Person } from '../../models/Person';\nimport { Test } from '../../models/Test';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport './TestCard.scss';\nimport { SampleRow } from './SampleRow';\nimport { sortSamplesByLastName } from '../../helpers/samples';\n\ninterface Props {\n test: Test;\n reload: () => void;\n population?: SubjectNode[];\n openTests: string[];\n setOpenTests: (updated: string[]) => void;\n subjects: Person[];\n}\n\nexport const TestCard: FC = (props) => {\n const [isSettingPositive, setIsSettingPositive] = useState(false);\n const [isSettingNegative, setIsSettingNegative] = useState(false);\n const [isSettingInconclusive, setIsSettingInconclusive] = useState(false);\n const [disabled, setDisabled] = useState(props.test.status === 'CREATED' || props.test.samples.filter((s) => s.status === 'PROCESSED').length === 0);\n const [test, setTest] = useState(props.test);\n\n const handleUpdateSample = (sample: Sample) => {\n const newTest = { ...test, samples: test.samples.filter((s) => s.id !== sample.id).concat([sample]) };\n setTest(newTest);\n getTestProcessedStatus(newTest);\n };\n\n const handleUpdateTest = (): Promise => retrieveTest(test.id).then((newTest) => {\n if (newTest) {\n setTest(newTest);\n getTestProcessedStatus(newTest);\n }\n return true;\n });\n\n const getTestProcessedStatus = (newTest: Test) => {\n if (test.status !== 'POSITIVE' && test.status !== 'NEGATIVE') {\n const nonDeletedSamples = newTest.samples.filter((s) => !s.deleted);\n if (nonDeletedSamples.length && nonDeletedSamples.every((s) => s.status !== 'CREATED')) {\n if (test.status !== 'PENDING_RESULTS') {\n setTest({ ...newTest, status: 'PENDING_RESULTS' });\n setDisabled(false);\n }\n } else if (test.status !== 'CREATED') {\n setTest({ ...newTest, status: 'CREATED' });\n setDisabled(true);\n }\n }\n };\n\n useEffect(() => {\n getTestProcessedStatus(props.test);\n setTest(props.test);\n }, [props.test]);\n\n return (\n
\n \n \n
\n {\n setIsSettingPositive(true);\n toggleTestResult(test.id, 'POSITIVE').then(() => {\n if (test.status === 'POSITIVE') {\n test.status = 'PENDING_RESULTS';\n } else {\n test.status = 'POSITIVE';\n }\n setIsSettingPositive(false);\n });\n }}\n >\n {isSettingPositive\n ? (\n \n ) : test.status === 'POSITIVE'\n ? \n : }\n \n {\n setIsSettingNegative(true);\n toggleTestResult(test.id, 'NEGATIVE').then(() => {\n if (test.status === 'NEGATIVE') {\n test.status = 'PENDING_RESULTS';\n } else {\n test.status = 'NEGATIVE';\n }\n setIsSettingNegative(false);\n });\n }}\n >\n {isSettingNegative\n ? (\n \n ) : test.status === 'NEGATIVE'\n ? \n : }\n \n {\n setIsSettingInconclusive(true);\n toggleTestResult(test.id, 'INCONCLUSIVE').then(() => {\n if (test.status === 'INCONCLUSIVE') {\n test.status = 'PENDING_RESULTS';\n } else {\n test.status = 'INCONCLUSIVE';\n }\n setIsSettingInconclusive(false);\n });\n }}\n >\n {isSettingInconclusive\n ? (\n \n ) : test.status === 'INCONCLUSIVE'\n ? \n : }\n \n
\n \n \n {`Processed ${test.samples.filter((s) => s.status === 'PROCESSED' && !s.deleted).length} / ${test.samples.filter((s) => !s.deleted).length}`}\n \n \n
\n {props.openTests.includes(test.id) && sortSamplesByLastName(test.samples).map((sample: Sample) => (\n \n ))}\n {props.openTests.includes(test.id) && (\n \n \n \n )}\n
\n
\n {props.openTests.includes(test.id) ? (\n {\n props.setOpenTests(props.openTests.filter((id) => id !== test.id));\n }}\n >\n \n \n ) : (\n {\n props.setOpenTests(props.openTests.concat(test.id));\n }}\n >\n \n \n )}\n
\n
\n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport { ButtonBase, Card, Typography } from '@material-ui/core';\nimport PostAddIcon from '@material-ui/icons/PostAdd';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport TextField from '@material-ui/core/TextField';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { matchSorter } from 'match-sorter';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { Survey } from '../../models/Survey';\nimport { addTest } from '../../clients/client';\nimport { SubjectNode } from '../../models/SubjectNode';\n\ninterface Props {\n survey?: Survey;\n reloadSurveys: () => void;\n population?: SubjectNode[];\n}\n\nexport const AddTestButton: FC = (props) => {\n const [isOpen, setIsOpen] = useState(false);\n const [testName, setTestName] = useState(null);\n const [podNames, setPodNames] = useState([]);\n\n useEffect(() => {\n if (!props.population) return;\n const schools = props.population[0].children;\n const podNodes = schools!.flatMap((school) => school.children!.flatMap((grade) => grade.children!.flatMap((pod) => pod)));\n setPodNames(podNodes.map((node) => node.label));\n }, []);\n\n useEffect(() => {\n setTestName('');\n }, [isOpen]);\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n addTest(props.survey?.id!, testName?.length ? testName : undefined).then(() => {\n props.reloadSurveys();\n setIsOpen(false);\n });\n };\n\n const handleClose = () => setIsOpen(false);\n\n return (\n <>\n {\n setIsOpen(true);\n }}\n >\n \n \n Add Test\n \n \n \n \n\n \n
\n Add a test\n \n \n
To let the test name be auto-generated, leave the Test Name field blank.
\n
\n {\n if (typeof newValue === 'string') {\n // timeout to avoid instant validation of the dialog's form.\n setTimeout(() => {\n setIsOpen(true);\n setTestName(newValue);\n });\n }\n }}\n filterOptions={(options, params) => {\n const filtered = matchSorter(options, params.inputValue);\n\n if (params.inputValue !== '') {\n filtered.push(params.inputValue);\n }\n\n return filtered;\n }}\n id=\"free-solo-dialog-demo\"\n options={podNames}\n getOptionLabel={(option) => option}\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n renderOption={(option) => option}\n style={{ width: 300 }}\n freeSolo\n renderInput={(params) => (\n setTestName(event.target.value)} />\n )}\n />\n
\n \n \n \n \n
\n
\n \n );\n};\n","export type TestStatus =\n | 'CREATED'\n | 'PROCESSING'\n | 'PENDING_RESULTS'\n | 'INCONCLUSIVE'\n | 'POSITIVE'\n | 'NEGATIVE';\n\nexport const RECORDED_STATUSES = ['INCONCLUSIVE', 'POSITIVE', 'NEGATIVE'];\n\nexport type SampleStatus =\n | 'CREATED'\n | 'COLLECTED'\n | 'BAD_SAMPLE'\n | 'ABSENT'\n | 'MISSING'\n | 'PROCESSED';\n","import React, { FC, useEffect, useState } from 'react';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { IconButton, Popover, Typography } from '@material-ui/core';\nimport RepeatIcon from '@material-ui/icons/Repeat';\nimport MultiSelect from 'react-multi-select-component';\nimport { Option } from 'react-multi-select-component/dist/lib/interfaces';\nimport CloseIcon from '@material-ui/icons/Close';\nimport DateFnsUtils from '@date-io/date-fns';\nimport { KeyboardDatePicker } from '@material-ui/pickers/DatePicker/DatePicker';\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\nimport moment from 'moment';\nimport MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';\nimport { RECORDED_STATUSES } from '../../models/Statuses';\nimport { copyTestsToNewSurvey } from '../../clients/client';\nimport { Survey } from '../../models/Survey';\n\ninterface Props {\n survey: Survey;\n onSave: () => void;\n onOpen: () => void;\n}\n\nexport const CopyToNewSurveyButton: FC = (props) => {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [tooltipAnchor, setTooltipAnchor] = useState();\n const [options, setOptions] = useState([]);\n const [selected, setSelected] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n const [selectedDate, setSelectedDate] = useState(moment());\n\n const handleSelectPositive = () => {\n setSelected([...selected, ...options.filter((option) => props.survey.tests.find((test) => test.id === option.value)?.status === 'POSITIVE')]);\n };\n\n const handleCopy = () => {\n setIsLoading(true);\n copyTestsToNewSurvey(selected.map((s) => s.value), selectedDate).then(() => {\n props.onSave();\n setIsLoading(false);\n handleClose();\n });\n };\n\n const handleClose = () => setIsDialogOpen(false);\n\n useEffect(() => {\n if (props.survey) {\n const testOptions = props.survey.tests.map((test) => ({\n label: `${test.name} - ${RECORDED_STATUSES.includes(test.status) ? test.status.charAt(0) + test.status.toLocaleLowerCase().substr(1) : 'Not recorded'}`,\n value: test.id,\n }));\n setOptions(testOptions);\n setSelected(testOptions.filter((option) => option.label.includes('Inconclusive')));\n }\n }, [props.survey]);\n\n return (\n
\n {\n props.onOpen();\n setIsDialogOpen(true);\n }}\n onMouseEnter={(event) => {\n setIsTooltipOpen(true);\n setTooltipAnchor(event.currentTarget);\n }}\n onMouseLeave={() => setIsTooltipOpen(false)}\n >\n \n \n \n
\n \n Copy Tests To New Survey\n \n \n \n \n \n \n
Select the tests to copy
\n
By default, only inconclusive tests are selected
\n
\n \n
\n \n \n date && setSelectedDate(moment(Date.parse(date.toDateString())))}\n KeyboardButtonProps={{\n 'aria-label': 'change date',\n }}\n />\n \n \n {isLoading ? 'Loading...' : 'Select Positive'}\n \n \n \n
\n \n \n Copy To New Survey\n \n
\n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport 'react-checkbox-tree/lib/react-checkbox-tree.css';\nimport './SurveyModal.scss';\nimport { Button, CircularProgress, Typography } from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport moment from 'moment';\nimport CircleChecked from '@material-ui/icons/CheckCircleOutline';\nimport NotListedLocationIcon from '@material-ui/icons/NotListedLocation';\nimport ErrorIcon from '@material-ui/icons/Error';\nimport CircleCheckedFilled from '@material-ui/icons/CheckCircle';\nimport RemoveCircleOutlinedIcon from '@material-ui/icons/RemoveCircleOutlined';\nimport AddCircleOutlinedIcon from '@material-ui/icons/AddCircleOutlined';\nimport { Survey } from '../../models/Survey';\nimport { retrievePeople, retrieveSurvey } from '../../clients/client';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport { SurveyEditButton } from './SurveyEditButton';\nimport { GenerateLabelsButton } from './GenerateLabelsButton';\nimport { BatchRecordTestResultsButton } from './BatchRecordTestResultsButton';\nimport { Person } from '../../models/Person';\nimport { SurveyNotes } from './SurveyNotes';\nimport { TestCard } from '../test_card/TestCard';\nimport { AddTestButton } from './AddTestButton';\nimport { CopyToNewSurveyButton } from './CopyToNewSurveyButton';\n\ninterface Props {\n handleCloseModal: () => void;\n reloadSurveyListings: () => void;\n surveyId?: string;\n mode?: 'edit' | 'view';\n population?: SubjectNode[];\n}\n\nexport const SurveyModal: FC = (props: Props) => {\n const [survey, setSurvey] = useState();\n const [isLoading, setIsLoading] = useState(false);\n const [openTests, setOpenTests] = useState([]);\n const [subjects, setSubjects] = useState([]);\n\n const handleEditSurvey = () => {\n props.reloadSurveyListings();\n if (props.surveyId) {\n retrieveSurvey(props.surveyId).then((response) => {\n setSurvey(response);\n });\n }\n };\n\n useEffect(() => {\n if (props.surveyId) {\n setIsLoading(true);\n retrieveSurvey(props.surveyId).then((response) => {\n setSurvey(response);\n setIsLoading(false);\n });\n retrievePeople().then((result) => {\n setSubjects(result);\n });\n }\n }, [props.surveyId]);\n\n const tests = survey?.tests.sort((a, b) => (parseInt(a.id) < parseInt(b.id) ? -11 : 1));\n const numCreatedTests = (survey?.tests.filter((t) => t.status === 'CREATED').length) || 0;\n const numProcessedTests = survey ? survey.tests.length - numCreatedTests : 0;\n const numTestResultsRecorded = survey ? survey.tests.filter((t) => t.status === 'POSITIVE' || t.status === 'NEGATIVE').length : 0;\n\n return (\n
\n
\n {!isLoading ? (\n
\n
\n \n {survey ? props.mode === 'view' ? (\n \n {`${survey.name} (${moment(survey.startDate).format('MM/DD/YY')})`}\n \n ) : 'Edit Population Survey' : 'Create Population Survey'}\n {props.mode === 'view' && (\n \n Processed\n \n {' '}\n {numProcessedTests}\n {' '}\n /\n {' '}\n {survey?.tests.length}\n \n {' '}\n tests. Recorded\n \n {' '}\n {numTestResultsRecorded}\n {' '}\n /\n {' '}\n {survey?.tests.length}\n \n {' '}\n results.\n \n )}\n \n
\n {survey && (\n <>\n \n {survey.driveBy && (\n {\n window.open(`/drive-by?survey=${survey?.id}`);\n }}\n >\n Print Check-list\n \n )}\n \n \n \n \n )}\n \n
\n
\n\n
\n
\n\n
\n
\n
\n \n
\n Unprocessed\n
\n
\n
\n \n
\n Missing Sample\n
\n
\n
\n \n
\n Bad Sample\n
\n
\n
\n \n
\n Processed\n
\n
\n
\n \n
\n Negative test\n
\n
\n
\n \n
\n Positive test\n
\n
\n
\n \n {tests?.map((test, index) => (\n \n ))}\n \n
\n
\n
\n
\n ) : (\n
\n \n
\n )}\n\n
\n );\n};\n","import React, { FC } from 'react';\nimport {\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n} from '@material-ui/core';\nimport moment from 'moment';\nimport './SurveyTable.scss';\nimport { SurveyListing } from '../../models/SurveyListing';\n\ninterface Props {\n surveyListings?: SurveyListing[];\n handleOpenSurvey: (surveyId: string) => void;\n}\n\nexport const SurveyTable: FC = (props) => {\n const tableHead = (\n \n \n Survey\n Start Date\n Samples Processed\n Test Results Recorded\n Negative Tests\n Positive Tests\n Inconcl. Tests\n \n \n );\n\n return (\n \n {props.surveyListings ? (\n \n {tableHead}\n \n {props.surveyListings?.map((surveyListing) => (\n {\n props.handleOpenSurvey(surveyListing.id);\n }}\n hover\n >\n \n {surveyListing.name}\n \n \n {moment(surveyListing.startDate).format('MMM D, yyyy')}\n \n \n {surveyListing.samplesProcessed}\n \n \n {surveyListing.testResultsRecorded}\n \n \n {surveyListing.negativeTests}\n \n \n {surveyListing.positiveTests}\n \n \n {surveyListing.inconclusiveTests}\n \n \n ))}\n\n \n
\n ) : (\n <>\n {tableHead}
\n
\n \n )}\n
\n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport {\n Box,\n Button,\n Collapse,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Typography,\n} from '@material-ui/core';\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';\nimport { makeStyles } from '@material-ui/core/styles';\nimport './PopulationTable.scss';\nimport '../survey/SurveyTable.scss';\nimport { useHistory } from 'react-router';\nimport DeleteOutlineIcon from '@material-ui/icons/DeleteOutline';\nimport TextField from '@material-ui/core/TextField';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport CircularProgress from '@material-ui/core/CircularProgress/CircularProgress';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport {\n addPerson,\n addPod, changePersonApidAndName, changePodName, deletePod, switchPod,\n} from '../../clients/client';\n\nconst useRowStyles = makeStyles({\n root: {\n '& > *': {\n borderBottom: 'unset',\n },\n },\n});\n\ninterface Props {\n population?: SubjectNode[];\n reloadPopulation: () => void;\n}\n\nexport const PopulationTable: FC = (props) => {\n const history = useHistory();\n const [openRows, setOpenRows] = useState([]);\n\n const [pods, setPods] = useState<{id: string; label: string}[]>([]);\n const [newPods, setNewPods] = useState<{[gradeId: string]: string}>({});\n const [newPeopleNames, setNewPeopleNames] = useState<{[podId: string]: string}>({});\n const [newPeopleApids, setNewPeopleApids] = useState<{[podId: string]: string}>({});\n const [originalPodLabels, setOriginalPodLabels] = useState<{[id: string]: string}>({});\n const [podLabels, setPodLabels] = useState<{[id: string]: string}>({});\n const [editedPods, setEditedPods] = useState<{[id: string]: boolean}>({});\n\n const [originalPersonApids, setOriginalPersonApids] = useState<{[id: string]: string}>({});\n const [personApids, setPersonApids] = useState<{[id: string]: string}>({});\n const [originalPersonNames, setOriginalPersonNames] = useState<{[id: string]: string}>({});\n const [personNames, setPersonNames] = useState<{[id: string]: string}>({});\n const [editedPeople, setEditedPeople] = useState<{[id: string]: boolean}>({});\n\n const classes = useRowStyles();\n\n useEffect(() => {\n if (!props.population) return;\n const schools = props.population[0].children;\n const podNodes = schools!.flatMap((school) => school.children!.flatMap((grade) => grade.children!.flatMap((pod) => pod)));\n setPods(podNodes.map((node) => ({\n label: node.label,\n id: node.value.split('-')[1],\n })));\n podNodes.forEach((pod) => {\n podLabels[pod.value] = pod.label;\n originalPodLabels[pod.value] = pod.label;\n editedPods[pod.value] = false;\n pod.children?.forEach((person) => {\n originalPersonApids[person.value] = person.apid || '';\n personApids[person.value] = person.apid || '';\n\n originalPersonNames[person.value] = person.label || '';\n personNames[person.value] = person.label || '';\n\n editedPeople[person.value] = false;\n });\n });\n setPodLabels(podLabels);\n setEditedPods(editedPods);\n }, [props.population]);\n\n useEffect(() => {\n const newEditedPeople: {[id: string]: boolean} = {};\n Object.keys(personNames).forEach((personId) => {\n const nameChanged = personNames[personId] !== originalPersonNames[personId];\n const apidChanged = personApids[personId] !== originalPersonApids[personId];\n newEditedPeople[personId] = nameChanged || apidChanged;\n });\n setEditedPeople(newEditedPeople);\n }, [personNames, personApids]);\n\n const toggleRow = (rowValue: string) => {\n if (openRows.includes(rowValue)) {\n setOpenRows(openRows.filter((row) => row !== rowValue));\n } else {\n setOpenRows(openRows.concat(rowValue));\n }\n };\n\n const expandAll = () => {\n const newOpenRows: string[] = [];\n props.population![0].children?.forEach((school) => {\n newOpenRows.push(school.value);\n school.children?.forEach((grade) => {\n newOpenRows.push(grade.value);\n grade.children?.forEach((pod) => {\n newOpenRows.push(pod.value);\n });\n });\n });\n setOpenRows(newOpenRows);\n };\n\n const closeAll = () => {\n setOpenRows([]);\n };\n\n const printPopulation = () => {\n history.push('/print-population');\n };\n\n const gradeSorter = (gradeA: SubjectNode, gradeB: SubjectNode): number => {\n const gradeOrder = ['N3', 'PK', '0K', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '15', '16'];\n return gradeOrder.indexOf(gradeA.label) - gradeOrder.indexOf(gradeB.label);\n };\n\n if (!props.population) return
;\n const schools = props.population[0].children;\n\n return (\n
\n
\n \n School Population\n \n
\n \n \n \n
\n
\n \n \n \n \n \n School\n Number of grades\n \n \n \n {schools?.map((school) => (\n <>\n \n \n toggleRow(school.value)}>\n {openRows.includes(school.value) ? : }\n \n \n {school.label}\n \n {school.children?.length || 0}\n {' '}\n Grades\n \n \n \n \n \n \n
\n \n \n \n Grade\n Number of pods\n \n \n \n {school.children?.sort(gradeSorter).map((grade) => (\n <>\n \n \n toggleRow(grade.value)}>\n {openRows.includes(grade.value) ? : }\n \n \n {grade.label}\n \n {!grade.children?.length ? '0 Pods' : grade.children.length === 1 ? '1 Pod' : `${grade.children.length} Pods`}\n \n \n \n \n \n \n
\n \n \n \n Pod\n Number of people\n \n \n \n \n \n {grade.children?.map((pod) => (\n <>\n \n \n toggleRow(pod.value)}>\n {openRows.includes(pod.value) ? : }\n \n \n \n {\n podLabels[pod.value] = e.target.value;\n setPodLabels(podLabels);\n\n const editedPodsCopy = Object.create(editedPods);\n editedPodsCopy[pod.value] = e.target.value !== originalPodLabels[pod.value];\n setEditedPods(editedPodsCopy);\n }}\n />\n \n \n {pod.children?.length || 0}\n {' '}\n People\n \n \n {\n changePodName(pod.value.split('-')[1], podLabels[pod.value]).then(() => {\n const originalPodLabelsCopy = Object.create(originalPodLabels);\n originalPodLabelsCopy[pod.value] = podLabels[pod.value];\n setOriginalPodLabels(originalPodLabelsCopy);\n const editedPodsCopy = Object.create(editedPods);\n editedPodsCopy[pod.value] = false;\n setEditedPods(editedPodsCopy);\n props.reloadPopulation();\n });\n }}\n >\n Save Changes\n \n \n \n deletePod(pod.value.split('-')[1]).then(() => props.reloadPopulation())}>\n \n \n \n \n \n \n \n \n
\n \n \n \n Name\n School ID\n \n \n \n \n \n {pod.children?.map((person) => (\n \n \n \n {\n const personNamesCopy = Object.create(personNames);\n personNamesCopy[person.value] = e.target.value;\n setPersonNames(personNamesCopy);\n }}\n />\n \n \n {\n const personApidsCopy = Object.create(personApids);\n personApidsCopy[person.value] = e.target.value;\n setPersonApids(personApidsCopy);\n }}\n />\n \n \n {\n if (typeof newValue !== 'string' && newValue?.id) {\n switchPod(person.value.split('-')[1], newValue.id).then(() => props.reloadPopulation());\n }\n }}\n id=\"free-solo-dialog-demo\"\n options={pods}\n getOptionLabel={(option) => option.label}\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n renderOption={(option) => option.label}\n style={{ width: 150 }}\n freeSolo\n renderInput={(params) => (\n \n )}\n />\n \n \n {\n changePersonApidAndName(person.value.split('-')[1], personApids[person.value], personNames[person.value]).then(() => {\n const originalPersonApidsCopy = Object.create(originalPersonApids);\n originalPersonApidsCopy[person.value] = personApids[person.value];\n setOriginalPersonApids(originalPersonApidsCopy);\n\n const originalPersonNamesCopy = Object.create(originalPersonNames);\n originalPersonNamesCopy[person.value] = personNames[person.value];\n setOriginalPersonNames(originalPersonNamesCopy);\n\n const editedPeopleCopy = Object.create(editedPeople);\n editedPeopleCopy[person.value] = false;\n setEditedPeople(editedPeopleCopy);\n\n props.reloadPopulation();\n });\n }}\n >\n Save Changes\n \n \n \n ))}\n \n \n \n {\n const newPeopleCopy = Object.create(newPeopleNames);\n newPeopleCopy[pod.value] = e.target.value;\n setNewPeopleNames(newPeopleCopy);\n }}\n />\n \n \n {\n const newPeopleApidsCopy = Object.create(newPeopleApids);\n newPeopleApidsCopy[pod.value] = e.target.value;\n setNewPeopleApids(newPeopleApidsCopy);\n }}\n />\n \n \n \n {\n addPerson(pod.value.split('-')[1], newPeopleNames[pod.value], newPeopleApids[pod.value]).then(() => {\n const newPeopleNamesCopy = Object.create(newPeopleNames);\n newPeopleNamesCopy[pod.value] = '';\n setNewPeopleNames(newPeopleNamesCopy);\n\n const newPeopleApidsCopy = Object.create(newPeopleApids);\n newPeopleApidsCopy[pod.value] = '';\n setNewPeopleApids(newPeopleApidsCopy);\n\n props.reloadPopulation();\n });\n }}\n >\n Add New Person\n \n \n \n \n
\n \n \n \n \n \n ))}\n \n \n \n {\n const newPodsCopy = Object.create(newPods);\n newPodsCopy[grade.value] = e.target.value;\n setNewPods(newPodsCopy);\n }}\n />\n \n \n \n {\n addPod(grade.value.split('-')[1], newPods[grade.value]).then(() => {\n const newPodsCopy = Object.create(newPods);\n newPodsCopy[grade.value] = '';\n setNewPods(newPodsCopy);\n props.reloadPopulation();\n });\n }}\n >\n Add New Pod\n \n \n \n \n \n \n \n \n \n \n ))}\n \n \n \n \n \n \n \n ))}\n \n \n
\n
\n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { IconButton, Popover, Typography } from '@material-ui/core';\nimport MultiSelect from 'react-multi-select-component';\nimport { Option } from 'react-multi-select-component/dist/lib/interfaces';\nimport CloseIcon from '@material-ui/icons/Close';\nimport TextField from '@material-ui/core/TextField';\nimport moment from 'moment';\nimport { addTest, retrieveSurveyListings } from '../../clients/client';\n\ninterface Props {\n onAddTest: (testId: string) => void;\n}\n\nexport const ScannerAddNewTestButton: FC = (props) => {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [tooltipAnchor, setTooltipAnchor] = useState();\n const [options, setOptions] = useState([]);\n const [selected, setSelected] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n const [testName, setTestName] = useState('');\n\n const handleAddTest = () => {\n if (selected.length > 0 && testName.length > 0) {\n setIsLoading(true);\n addTest(selected[0].value, testName).then((response) => {\n response.json().then((addTestResult) => {\n props.onAddTest(addTestResult.testId);\n setIsLoading(false);\n handleClose();\n });\n });\n }\n };\n\n const handleSelectSurvey = (newSelected: Option[]) => {\n setSelected(newSelected.filter((option) => !selected.includes(option)));\n };\n\n const handleClose = () => setIsDialogOpen(false);\n\n useEffect(() => {\n retrieveSurveyListings().then((surveyListings) => {\n setOptions(surveyListings.map((surveyListing) => ({\n label: `${moment(surveyListing.startDate).format('MM/DD/YY')} - ${surveyListing.name}`,\n value: surveyListing.id,\n })));\n });\n }, []);\n\n return (\n
\n setIsDialogOpen(true)}\n onMouseEnter={(event) => {\n setIsTooltipOpen(true);\n setTooltipAnchor(event.currentTarget);\n }}\n onMouseLeave={() => setIsTooltipOpen(false)}\n >\n Add new test\n \n \n
\n \n Scan samples into a new test\n \n \n \n \n \n \n
Add a test name, and select which survey should hold the test
\n
\n {\n setTestName(e.target.value);\n }}\n />\n \n
\n \n \n \n \n
\n \n \n Scan samples into a new test\n \n
\n );\n};\n","import React, { useEffect, useState } from 'react';\n\nimport {\n Button, FormControlLabel, Snackbar, Switch, Typography,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport useSound from 'use-sound';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport NotListedLocationIcon from '@material-ui/icons/NotListedLocation';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Dialog from '@material-ui/core/Dialog';\nimport {\n moveAndProcessSample,\n processSample, processTest, retrievePeople, retrieveSample, retrieveTest, toggleBadSample,\n} from '../../clients/client';\nimport './Scanner.scss';\nimport { Test } from '../../models/Test';\nimport { TestCard } from '../test_card/TestCard';\nimport { Person } from '../../models/Person';\nimport successBeep from '../../assets/beep-07.mp3';\nimport errorBeep from '../../assets/error-beep.mp3';\nimport { Sample } from '../../models/Sample';\nimport { ScannerAddNewTestButton } from './ScannerAddNewTestButton';\n\nexport const Scanner = () => {\n const [scanResult, setScanResult] = useState('');\n const [test, setTest] = useState();\n const [subjects, setSubjects] = useState([]);\n const [isToastOpen, setIsToastOpen] = useState(false);\n const [toastMessage, setToastMessage] = useState('');\n const [toastSeverity, setToastSeverity] = useState<'success' | 'info' | 'warning' | 'error'>();\n const [isProcessingSample, setIsProcessingSample] = useState(false);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const [numSamplesRemaining, setNumSamplesRemaining] = useState(0);\n const [isProcessingTest, setIsProcessingTest] = useState(false);\n const [nextTest, setNextTest] = useState();\n const [currentId, setCurrentId] = useState();\n const [shouldProcessSamplesOfAnyTest, setShouldProcessSamplesOfAnyTest] = useState(true);\n const [shouldMoveToCurrentTest, setShouldMoveToCurrentTest] = useState(false);\n const [playSuccessBeep] = useSound(successBeep);\n const [playErrorBeep] = useSound(errorBeep);\n let scanBuffer: string[] = [];\n\n const reload = () => {\n if (test) {\n retrieveTest(test.id).then((newTest) => {\n if (newTest !== test) {\n setTest(newTest);\n }\n });\n }\n };\n\n const handleToastClose = () => setIsToastOpen(false);\n\n const makeToast = (message: string, severity: 'success' | 'info' | 'warning' | 'error') => {\n handleToastClose();\n setToastMessage(message);\n setToastSeverity(severity);\n setIsToastOpen(true);\n };\n\n const handleBadSample = () => {\n setIsProcessingSample(false);\n if (currentId) {\n const sample = test?.samples.find((s) => s.id === currentId);\n if (sample?.status !== 'BAD_SAMPLE') {\n toggleBadSample(currentId).then(() => {\n makeToast('Marked as Bad Sample', 'warning');\n reload();\n });\n }\n }\n };\n\n const handleProcessTest = (newTest?: Test) => {\n if (test?.samples.some((s) => s.status === 'CREATED' && !s.deleted)) {\n setNumSamplesRemaining(test.samples.filter((s) => s.status === 'CREATED' && !s.deleted).length);\n setIsConfirmOpen(true);\n setNextTest(newTest);\n } else {\n handleContinueProcessTest(newTest);\n }\n };\n\n const handleContinueProcessTest = (newTest?: Test) => {\n const finishProcessing = () => {\n setIsProcessingTest(false);\n setIsConfirmOpen(false);\n setTest(newTest);\n setNextTest(undefined);\n if (newTest) makeToast(`Loaded test: ${newTest.name}`, 'success');\n };\n\n if (test?.samples.some((s) => s.status === 'CREATED' && !s.deleted)) {\n setIsProcessingTest(true);\n processTest(test?.id).then(() => { finishProcessing(); }).catch(() => { finishProcessing(); });\n } else {\n setTest(newTest);\n setNextTest(undefined);\n if (newTest) makeToast(`Loaded test: ${newTest.name}`, 'success');\n }\n };\n\n const scanTest = (testId: string, suppressSuccessBeep?: boolean): Promise => (\n retrieveTest(testId).then((newTest) => {\n if (newTest?.id) {\n if (newTest !== test) {\n if (!suppressSuccessBeep) playSuccessBeep();\n handleProcessTest(newTest);\n }\n } else {\n playErrorBeep();\n makeToast('Test not found!', 'error');\n }\n return true;\n }));\n\n const scanSample = (sample: Sample): Promise => {\n const { name } = sample.person;\n if (sample.status !== 'PROCESSED') {\n playSuccessBeep();\n makeToast(`${name}`, 'success');\n setIsProcessingSample(true);\n if (shouldMoveToCurrentTest && test) {\n return moveAndProcessSample(sample.id, test.id).then(() => {\n reload();\n return true;\n });\n }\n return processSample(sample.id).then(() => {\n reload();\n return true;\n });\n }\n playErrorBeep();\n makeToast(`Already processed sample: ${name}`, 'warning');\n return Promise.resolve();\n };\n\n const handleAddNewTest = (testId: string) => {\n scanTest(testId, true).then(() => {\n setShouldMoveToCurrentTest(true);\n });\n };\n\n useEffect(() => {\n window.addEventListener('keypress', (event) => {\n if (event.key === 'Enter' && scanBuffer.length) {\n setScanResult(scanBuffer.join(''));\n scanBuffer = [];\n } else if (scanBuffer.length || event.key === '1' || event.key === '0') {\n scanBuffer.push(event.key);\n }\n });\n }, []);\n\n useEffect(() => {\n setIsProcessingSample(false);\n const labelId = upcToId(scanResult);\n if (labelId) {\n setCurrentId(labelId.id);\n if (labelId.type === 'test') {\n scanTest(labelId.id);\n } else {\n const sample = test?.samples.find((s) => s.id === labelId.id);\n if (sample) {\n scanSample(sample);\n } else if (shouldMoveToCurrentTest) {\n retrieveSample(labelId.id).then((foundSample) => {\n scanSample(foundSample);\n });\n } else if (shouldProcessSamplesOfAnyTest) {\n retrieveSample(labelId.id).then((foundSample) => {\n scanTest(foundSample.testId, true).then(() => {\n scanSample(foundSample).then(() => {\n retrieveTest(foundSample.testId).then((newTest) => {\n if (newTest !== test) {\n setTest(newTest);\n }\n });\n });\n });\n });\n } else {\n playErrorBeep();\n makeToast('Sample does not belong to this test', 'error');\n }\n }\n }\n setScanResult('');\n }, [scanResult]);\n\n useEffect(() => {\n retrievePeople().then((result) => {\n setSubjects(result);\n });\n }, [test]);\n\n return (\n
\n
\n
\n ) => { setShouldProcessSamplesOfAnyTest(event.target.checked); }}\n name=\"checkedA\"\n color=\"primary\"\n />\n )}\n label=\"Process any sample\"\n />\n ) => { setShouldMoveToCurrentTest(event.target.checked); }}\n name=\"checkedA\"\n color=\"primary\"\n />\n )}\n label=\"Move to current test\"\n />\n \n
\n
\n {test ? (\n {}}\n subjects={subjects}\n />\n )\n : (\n \n {shouldProcessSamplesOfAnyTest\n ? 'Scan any label.' : 'Scan a test label to begin.'}\n \n )}\n {test && (\n handleProcessTest()}\n disabled={isProcessingTest}\n >\n {isProcessingTest ? 'Processing...' : 'Done'}\n \n )}\n
\n
\n \n \n BAD SAMPLE\n \n )}\n >\n {isProcessingSample &&
Processing Sample:
}\n {toastMessage}\n \n \n \n Process Test\n \n \n {numSamplesRemaining}\n {' '}\n sample(s) still not marked.\n \n \n They will be marked\n {' '}\n \n \n {' '}\n MISSING\n \n {' '}\n and moved to the\n {' '}\n RESAMPLE\n {' '}\n test.\n \n \n \n {\n setIsConfirmOpen(false);\n setScanResult('');\n }}\n color=\"primary\"\n >\n Cancel\n \n \n \n \n
\n );\n};\n\ntype LabelId = { type: 'test' | 'sample'; id: string };\nconst upcToId = (upc: string | null): LabelId | undefined => {\n if (upc) {\n const type = upc.startsWith('1') ? 'sample' : 'test';\n const id = parseInt(upc.substring(1, upc.length - 1), 10);\n return { type, id: `${id}` };\n }\n return undefined;\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport {\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle, FormControlLabel, Switch,\n TextField,\n} from '@material-ui/core';\nimport moment from 'moment';\nimport { KeyboardDatePicker } from '@material-ui/pickers/DatePicker/DatePicker';\nimport { MaterialUiPickersDate } from '@material-ui/pickers/typings/date';\nimport CheckboxTree from 'react-checkbox-tree';\nimport MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';\nimport DateFnsUtils from '@date-io/date-fns';\nimport { createSurvey, retrieveSubjectNodes } from '../../clients/client';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport './CreateSurveyButton.scss';\n\ninterface Props {\n reloadSurveys: () => void;\n}\n\nexport const CreateSurveyButton: FC = (props) => {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [subjectNodes, setSubjectNodes] = useState();\n const [expanded, setExpanded] = useState([]);\n const [selectedDate, setSelectedDate] = useState(moment());\n const [checked, setChecked] = useState([]);\n const [name, setName] = useState('');\n const [isDriveBy, setIsDriveBy] = useState(false);\n\n useEffect(() => {\n retrieveSubjectNodes().then((nodes: SubjectNode[]) => {\n setSubjectNodes(nodes);\n });\n }, []);\n\n const handleClose = () => {\n setIsDialogOpen(false);\n };\n\n const handleSubmit = () => {\n setIsSaving(true);\n createSurvey(name, selectedDate, checked, isDriveBy).then((response) => {\n setIsSaving(false);\n if (response.ok) {\n props.reloadSurveys();\n setIsDialogOpen(false);\n }\n });\n };\n\n return (\n <>\n {\n setIsDialogOpen(true);\n }}\n >\n Create Survey\n \n \n
\n \n Create Survey\n \n \n \n
Generate a new screening survey
\n
Selected Tests will be auto-generated based on Pod distribution defined in Population tab
\n
\n
\n

Name

\n setName(e.target.value)}\n />\n
\n
\n

Collection Date

\n \n date && setSelectedDate(moment(Date.parse(date.toDateString())))}\n KeyboardButtonProps={{\n 'aria-label': 'change date',\n }}\n />\n \n
\n
\n

Drive-By Mode

\n ) => { setIsDriveBy(event.target.checked); }}\n name=\"checkedA\"\n color=\"primary\"\n />\n
\n
\n

Population

\n
\n {subjectNodes ? (\n setChecked(newChecked)}\n onExpand={(newExpanded) => setExpanded(newExpanded)}\n showNodeIcon={false}\n />\n ) : (\n \n )}\n
\n \n \n \n \n
\n \n \n );\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n AppBar, Button, Tab, Toolbar, Typography,\n} from '@material-ui/core';\nimport { TabContext, TabList, TabPanel } from '@material-ui/lab';\nimport { useHistory } from 'react-router-dom';\nimport { SurveyModal } from '../survey/SurveyModal';\nimport './Home.scss';\nimport { SurveyTable } from '../survey/SurveyTable';\nimport { logout, retrieveSubjectNodes, retrieveSurveyListings } from '../../clients/client';\nimport { PopulationTable } from '../population/PopulationTable';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport { SurveyListing } from '../../models/SurveyListing';\nimport { Scanner } from '../scanner/Scanner';\nimport { CreateSurveyButton } from '../survey/CreateSurveyButton';\n\nexport const Home = () => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [modalMode, setModalMode] = useState<'edit' | 'view'>('view');\n const [tabValue, setTabValue] = useState('1');\n const [selectedSurveyId, setSelectedSurveyId] = useState();\n const [surveyListings, setSurveyListings] = useState();\n const [population, setPopulation] = useState();\n\n const loadSurveyListings = () => {\n retrieveSurveyListings().then((response) => {\n setSurveyListings(response);\n });\n };\n\n const loadPopulation = () => {\n retrieveSubjectNodes().then((response: SubjectNode[]) => {\n setPopulation(response);\n });\n };\n\n useEffect(() => {\n loadSurveyListings();\n loadPopulation();\n }, []);\n\n const handleOpenSurvey = (surveyId: string) => {\n setSelectedSurveyId(surveyId);\n setIsModalOpen(true);\n };\n\n const handleCloseModal = () => {\n setModalMode('view');\n setIsModalOpen(false);\n loadSurveyListings();\n };\n\n return (\n
\n \n \n \n SRTI COVID-19 Tracker\n \n
\n \n {\n logout();\n }}\n >\n Log out\n \n
\n
\n
\n\n \n \n {\n setTabValue(newValue);\n }}\n aria-label=\"simple tabs example\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n {isModalOpen && (\n \n )}\n
\n );\n};\n","import React, { FC } from 'react';\nimport useFitText from 'use-fit-text';\n\nconst Barcode = require('react-barcode');\n\ninterface Props {\n text?: string;\n barcode?: string;\n index: number;\n onDone: () => void;\n}\n\nexport const Label: FC = (props) => {\n const { fontSize, ref } = useFitText({\n onFinish: () => {\n props.onDone();\n },\n });\n return (\n
\n {props.text && (\n <>\n \n {props.text.split('\\n').map((line) => (\n
{line}
\n ))}\n
\n {props.barcode && (\n \n )}\n \n )}\n
\n );\n};\n","const cdigit = require('cdigit');\n\nexport const generateEan8 = (value: string, type: 'test' | 'sample') => {\n const numToPad = 6 - value.length;\n let padded = value;\n for (let i = 0; i < numToPad; i++) {\n padded = `0${padded}`;\n }\n const withTypeDigit = type === 'test' ? `0${padded}` : `1${padded}`;\n return cdigit.luhn.generate(withTypeDigit);\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { CircularProgress, Popover, Typography } from '@material-ui/core';\nimport { retrieveAllSurveys, retrieveSurvey } from '../../clients/client';\nimport { Survey } from '../../models/Survey';\nimport './Labels.scss';\nimport { Label } from './Label';\nimport { generateEan8 } from '../../helpers/barcodes';\nimport { sortSamplesByLastName } from '../../helpers/samples';\n\ntype LabelEntry = { content?: string; id?: string };\n\nexport const Labels: FC = () => {\n const maxLabelsPerPage = 80;\n const [labels, setLabels] = useState();\n const query = new URLSearchParams(useLocation().search);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const [tooltipAnchor, setTooltipAnchor] = useState();\n const [isLoading, setIsLoading] = useState(true);\n\n const handleFinishedLabel = () => {\n if (isLoading) {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n const surveyId = query.get('survey');\n if (surveyId) {\n retrieveSurvey(surveyId).then((survey: Survey) => {\n const labelContent: LabelEntry[][] = [[]];\n if (survey) {\n const selectedTestIds = query.getAll('test');\n const tests = survey.tests.filter((test) => selectedTestIds.includes(test.id));\n tests.forEach((test) => {\n if (labelContent[labelContent.length - 1].length === maxLabelsPerPage) {\n labelContent.push([]);\n } else if (labelContent[0].length) {\n const remainder = labelContent[labelContent.length - 1].length % 4;\n const remainingLabelsOnLine = remainder ? 4 - remainder : remainder;\n for (let i = 0; i < remainingLabelsOnLine + 4; i++) {\n labelContent[labelContent.length - 1].push({});\n if (labelContent[labelContent.length - 1].length === maxLabelsPerPage) {\n labelContent.push([]);\n break;\n }\n }\n }\n const id = generateEan8(test.id, 'test');\n labelContent[labelContent.length - 1].push({\n content: `${test.name || `Test #${test.id}`}\\n${survey.startDate}`,\n id,\n });\n sortSamplesByLastName(test.samples).forEach((sample) => {\n if (!sample.deleted) {\n if (labelContent[labelContent.length - 1].length === maxLabelsPerPage) {\n labelContent.push([]);\n }\n labelContent[labelContent.length - 1].push({\n content: `${sample.person.name}\\nID: ${sample.person.apid}\\n${survey.startDate}`,\n id: generateEan8(sample.id, 'sample'),\n });\n }\n });\n });\n setLabels(labelContent);\n }\n });\n }\n }, []);\n\n return (\n
\n {isLoading && (\n
\n Generating labels...\n
\n )}\n {labels?.map((page) => (\n {\n setIsTooltipOpen(false);\n setTimeout(() => {\n window.print();\n }, 200);\n }}\n key={page[0].id}\n onMouseEnter={(event) => {\n setIsTooltipOpen(true);\n setTooltipAnchor(event.currentTarget);\n }}\n onMouseLeave={() => setIsTooltipOpen(false)}\n >\n {page.map((label, index) => (\n
\n ))}\n \n Click Anywhere to Print\n \n \n );\n};\n","import React, { FC, useState } from 'react';\nimport Avatar from '@material-ui/core/Avatar';\nimport Button from '@material-ui/core/Button';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport TextField from '@material-ui/core/TextField';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Link from '@material-ui/core/Link';\nimport Grid from '@material-ui/core/Grid';\nimport Box from '@material-ui/core/Box';\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Container from '@material-ui/core/Container';\nimport { login } from '../../clients/client';\n\nfunction Copyright() {\n return (\n \n {'Copyright © '}\n \n Your Website\n \n {' '}\n {new Date().getFullYear()}\n .\n \n );\n}\n\nconst useStyles = makeStyles((theme) => ({\n paper: {\n marginTop: theme.spacing(8),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n },\n avatar: {\n margin: theme.spacing(1),\n backgroundColor: theme.palette.secondary.main,\n },\n form: {\n width: '100%', // Fix IE 11 issue.\n marginTop: theme.spacing(1),\n },\n submit: {\n margin: theme.spacing(3, 0, 2),\n },\n}));\n\nexport const LoginPage: FC = () => {\n const classes = useStyles();\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [failed, setIsFailed] = useState(false);\n\n const attemptLogin = () => {\n login(username, password).then((result) => {\n setIsFailed(!result);\n });\n };\n\n return (\n \n \n
\n \n \n \n \n Sign in\n \n {failed && (\n \n Invalid Credentials\n \n )}\n
\n {\n setUsername(event.target.value);\n }}\n onKeyPress={(event) => {\n if (event.key === 'Enter') {\n attemptLogin();\n }\n }}\n />\n {\n setPassword(event.target.value);\n }}\n onKeyPress={(event) => {\n if (event.key === 'Enter') {\n attemptLogin();\n }\n }}\n />\n \n Sign In\n \n \n
\n
\n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport {\n Paper, Table, TableCell, TableContainer, TableHead, TableRow,\n} from '@material-ui/core';\nimport { SubjectNode } from '../../models/SubjectNode';\nimport { retrieveSubjectNodes } from '../../clients/client';\nimport { Person } from '../../models/Person';\nimport './PopulationTable.scss';\n\nexport const PrintPopulation: FC = () => {\n const [people, setPeople] = useState([]);\n\n useEffect(() => {\n retrieveSubjectNodes().then((population: SubjectNode[]) => {\n const schools = population[0].children;\n const personNodes = schools?.flatMap((school) => school.children).flatMap((grade) => grade?.children).flatMap((pod) => pod?.children);\n const personArray: Person[] = [];\n personNodes?.forEach((node) => {\n if (node) {\n personArray.push({\n id: node.value.split('-')[1],\n name: node.label,\n apid: node.apid || '',\n });\n }\n });\n const sortedPeople = personArray.sort((a: Person, b: Person) => {\n const componentsA = a.name.split(' ');\n const componentsB = b.name.split(' ');\n\n const lastNameA = componentsA[componentsA.length - 1].toLowerCase();\n const lastNameB = componentsB[componentsB.length - 1].toLowerCase();\n\n if (lastNameA < lastNameB) return -1;\n return 1;\n });\n setPeople(sortedPeople);\n });\n }, []);\n\n useEffect(() => {\n if (people.length) {\n window.print();\n }\n }, [people]);\n\n return (\n {\n window.print();\n }}\n >\n \n \n \n Name\n School ID\n Done\n \n \n {people.map((person, index) => (\n \n {person.name}\n {person.apid}\n \n \n ))}\n
\n \n );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport {\n Paper, Table, TableCell, TableContainer, TableHead, TableRow,\n} from '@material-ui/core';\nimport { useLocation } from 'react-router-dom';\nimport { retrieveSurvey } from '../../clients/client';\nimport '../population/PopulationTable.scss';\nimport { Sample } from '../../models/Sample';\nimport { generateEan8 } from '../../helpers/barcodes';\nimport { sortSamplesByLastName } from '../../helpers/samples';\n\nconst Barcode = require('react-barcode');\n\nexport const DriveByList: FC = () => {\n const query = new URLSearchParams(useLocation().search);\n const [samples, setSamples] = useState([]);\n\n useEffect(() => {\n retrieveSurvey(query.get('survey')!).then((survey) => {\n const sortedSamples = sortSamplesByLastName(survey.tests.flatMap((test) => test.samples));\n setSamples(sortedSamples);\n });\n }, []);\n\n useEffect(() => {\n if (samples.length) {\n window.print();\n }\n }, [samples]);\n\n return (\n {\n window.print();\n }}\n >\n \n \n \n Name\n School ID\n Done\n Label\n \n \n {samples.map((sample, index) => (\n \n {sample.person.name}\n {sample.person.apid}\n \n \n \n \n \n ))}\n
\n \n );\n};\n","import React, { FC } from 'react';\nimport QrReader from 'react-qr-reader';\nimport {\n Route, Switch,\n BrowserRouter as Router,\n} from 'react-router-dom';\n\nimport { Home } from './home/Home';\nimport { Labels } from './labels/Labels';\nimport { LoginPage } from './login/LoginPage';\nimport { Scanner } from './scanner/Scanner';\nimport { PrintPopulation } from './population/PrintPopulation';\nimport { DriveByList } from './labels/DriveByList';\n\nexport const Routes: FC = () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n","import React from 'react';\nimport QrReader from 'react-qr-reader';\nimport './App.css';\nimport { Routes } from './components/Routes';\n\nfunction App() {\n return (\n
\n \n
\n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}