import React, { useMemo } from 'react'; import Grid from '@mui/material/Grid'; import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4'; import TabContext from '@mui/lab/TabContext'; import TabPanel from '@mui/lab/TabPanel'; import GroupItem from '../FormComponents/GroupItem/GroupItem'; import type { PropsWithParentIsReadOnlyAttribute, PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface'; import { useQuestionnaireStore } from '../../stores'; import { useRendererConfigStore } from '../../stores/rendererConfigStore'; import { interpolate } from '../../i18n'; import { SingleItem } from '../FormComponents'; import PageButtonsWrapper from '../FormComponents/GroupItem/PageButtonWrapper'; import { QGroupContainerBox } from '../Box.styles'; import { GroupCard } from '../FormComponents/GroupItem/GroupItem.styles'; import { isFooter, isHeader } from '../../utils/page'; interface FormBodyPaginatedProps extends PropsWithQrItemChangeHandler, PropsWithParentIsReadOnlyAttribute { topLevelQItems: QuestionnaireItem[]; topLevelQRItems: (QuestionnaireResponseItem | QuestionnaireResponseItem[] | undefined)[]; } // TODO This implementation doesnt take into account repeat items and repeat groups // Every group item in here is rendered as a page function FormBodyPaginated(props: FormBodyPaginatedProps) { const { topLevelQItems, topLevelQRItems, parentIsReadOnly, onQrItemChange } = props; const pages = useQuestionnaireStore.use.pages(); const currentPage = useQuestionnaireStore.use.currentPageIndex(); const disableCardView = useRendererConfigStore.use.disablePageCardView(); const rendererStrings = useRendererConfigStore.use.rendererStrings(); const { headerQItems, pageQItems, footerQItems } = useMemo(() => { const headerQItems: [QuestionnaireItem, number][] = []; const pageQItems: [QuestionnaireItem, number][] = []; const footerQItems: [QuestionnaireItem, number][] = []; for (const [qrItemIndex, qItem] of topLevelQItems.entries()) { if (isHeader(qItem)) { headerQItems.push([qItem, qrItemIndex]); } else if (isFooter(qItem)) { footerQItems.push([qItem, qrItemIndex]); } else { pageQItems.push([qItem, qrItemIndex]); } } return { headerQItems, pageQItems, footerQItems }; }, [topLevelQItems]); return ( <> {headerQItems.map((headerQItem) => { const [qItem, qrItemIndex] = headerQItem; const qrItemOrItems = topLevelQRItems[qrItemIndex]; const isRepeatGroup = Array.isArray(qrItemOrItems); if (isRepeatGroup) { // Does not work with repeat groups return null; } const isRepeated = qItem.repeats ?? false; return ( ); })} {pageQItems.map((pageQItem, i) => { const [qItem, qrItemIndex] = pageQItem; const qrItem = topLevelQRItems[qrItemIndex]; const isNotRepeatGroup = !Array.isArray(qrItem); const isPage = !!pages[qItem.linkId]; const itemIsGroup = qItem.type === 'group'; // const isHeader = qItem.itemControl?.type === 'header'; if (!isPage || !isNotRepeatGroup) { // Something has gone horribly wrong return null; } const isRepeated = qItem.repeats ?? false; const pageIsMarkedAsComplete = pages[qItem.linkId].isComplete ?? false; // Render this page as a group if (itemIsGroup) { return ( ); } // Page consists of a non-group item return ( {disableCardView ? ( <> ) : ( )} ); })} {footerQItems.map((footerQItem) => { const [qItem, qrItemIndex] = footerQItem; const qrItemOrItems = topLevelQRItems[qrItemIndex]; const isRepeatGroup = Array.isArray(qrItemOrItems); if (isRepeatGroup) { // Does not work with repeat groups return null; } const isRepeated = qItem.repeats ?? false; return ( ); })} ); } export default FormBodyPaginated;