/* * Copyright 2025 Commonwealth Scientific and Industrial Research * Organisation (CSIRO) ABN 41 687 119 230. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import React, { useMemo } from 'react'; import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4'; import type { PropsWithParentIsReadOnlyAttribute, PropsWithParentStylesAttribute, PropsWithQrItemChangeHandler } from '../../../interfaces/renderProps.interface'; import { createEmptyQrGroup, updateQrItemsInGroup } from '../../../utils/qrItem'; import { GridAnswerTableCell, GridTextTableCell } from '../Tables/Table.styles'; import SingleItem from '../SingleItem/SingleItem'; import { getQrItemsIndex, mapQItemsIndex } from '../../../utils/mapItem'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; import useHidden from '../../../hooks/useHidden'; import ItemPrefixSwitcher from '../ItemParts/ItemPrefixSwitcher'; import ItemTextSwitcher from '../ItemParts/ItemTextSwitcher'; interface GridRowProps extends PropsWithQrItemChangeHandler, PropsWithParentIsReadOnlyAttribute, PropsWithParentStylesAttribute { qItem: QuestionnaireItem; qrItem: QuestionnaireResponseItem | null; columnHeaderLabels: string[]; calculatedColumnWidths: { width: string; isFixed: boolean }[]; } function GridRow(props: GridRowProps) { const { qItem, qrItem, columnHeaderLabels, calculatedColumnWidths, parentIsReadOnly, parentStyles, onQrItemChange } = props; const rowQItems = qItem.item; const row = qrItem && qrItem.item ? qrItem : createEmptyQrGroup(qItem); const rowQrItems = row.item; const qItemsIndexMap = useMemo(() => mapQItemsIndex(qItem), [qItem]); const itemIsHidden = useHidden(qItem); if (itemIsHidden) { return null; } if (!rowQItems || !rowQrItems || rowQItems.length === 0) { return null; } // Add textAlign center style to all grid cells and pass it as parentStyles to the next item const gridCellStyles = { ...parentStyles, textAlign: 'center' }; function handleQrRowItemChange(newQrRowItem: QuestionnaireResponseItem) { const qrRow: QuestionnaireResponseItem = { ...row }; updateQrItemsInGroup(newQrRowItem, null, qrRow, qItemsIndexMap); onQrItemChange(qrRow); } const qrItemsByIndex = getQrItemsIndex(rowQItems, rowQrItems, qItemsIndexMap); return ( <> {columnHeaderLabels.map((label, colIndex) => { // Find the QuestionnaireItem in this row that matches the current column label const matchingCellQItemIndex = rowQItems.findIndex((item) => item.text === label); // Render empty cell for sparsity if (matchingCellQItemIndex === -1) { return ( ); } const cellQItem = rowQItems[matchingCellQItemIndex]; const cellQrItem = qrItemsByIndex[matchingCellQItemIndex]; if (Array.isArray(cellQrItem)) { return null; } return ( ); })} ); } export default GridRow;