diff --git a/src/data-workspace/category-combo-table-body-pivoted/category-combo-table-body-pivoted.js b/src/data-workspace/category-combo-table-body-pivoted/category-combo-table-body-pivoted.js index 4e8a29ecb..0acbfbdd7 100644 --- a/src/data-workspace/category-combo-table-body-pivoted/category-combo-table-body-pivoted.js +++ b/src/data-workspace/category-combo-table-body-pivoted/category-combo-table-body-pivoted.js @@ -24,13 +24,14 @@ export const PivotedCategoryComboTableBody = React.memo( categoryCombo, dataElements, greyedFields, - /* + /* filterText, globalFilterText, maxColumnsInSection, renderRowTotals, renderColumnTotals,*/ displayOptions, + collapsed, }) { const { data: metadata } = useMetadata() @@ -68,7 +69,12 @@ export const PivotedCategoryComboTableBody = React.memo( <> {rowsMatrix.map((row, id /** todo: find suitable id */) => { return ( - + {row.map((fieldInRow) => { if ( fieldInRow.type === 'columnHeader' || @@ -150,6 +156,7 @@ PivotedCategoryComboTableBody.propTypes = { categoryCombo: PropTypes.shape({ id: PropTypes.string.isRequired, }), + collapsed: PropTypes.bool, dataElements: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.string.isRequired, diff --git a/src/data-workspace/category-combo-table-body/category-combo-table-body.js b/src/data-workspace/category-combo-table-body/category-combo-table-body.js index 6fcfe999b..596c30eb6 100644 --- a/src/data-workspace/category-combo-table-body/category-combo-table-body.js +++ b/src/data-workspace/category-combo-table-body/category-combo-table-body.js @@ -1,8 +1,8 @@ -import { TableBody, TableRow, TableCell } from '@dhis2/ui' +import { TableBody, TableCell, TableRow } from '@dhis2/ui' import cx from 'classnames' import PropTypes from 'prop-types' import React, { useCallback } from 'react' -import { useMetadata, selectors } from '../../shared/index.js' +import { selectors, useMetadata } from '../../shared/index.js' import { DataEntryCell, DataEntryField } from '../data-entry-cell/index.js' import { getFieldId } from '../get-field-id.js' import { TableBodyHiddenByFiltersRow } from '../table-body-hidden-by-filter-row.js' @@ -21,6 +21,7 @@ export const CategoryComboTableBody = React.memo( maxColumnsInSection, renderRowTotals, renderColumnTotals, + collapsed, }) { const { data: metadata } = useMetadata() @@ -59,7 +60,11 @@ export const CategoryComboTableBody = React.memo( const hiddenItemsCount = filteredDeIds.size return ( - + { try { const { displayOptions: displayOptionString } = section - return JSON.parse(displayOptionString) } catch (e) { console.error( diff --git a/src/data-workspace/section-form/section-form.js b/src/data-workspace/section-form/section-form.js index 2cb3d65ea..0621be065 100644 --- a/src/data-workspace/section-form/section-form.js +++ b/src/data-workspace/section-form/section-form.js @@ -43,6 +43,7 @@ export const SectionForm = ({ dataSet, globalFilterText }) => { dataSetId={dataSet.id} key={s.id} globalFilterText={globalFilterText} + collapsible /> ))} @@ -51,9 +52,7 @@ export const SectionForm = ({ dataSet, globalFilterText }) => { SectionForm.propTypes = { dataSet: PropTypes.shape({ - displayOptions: PropTypes.shape({ - tabsDirection: PropTypes.oneOf(['vertical', 'horizontal']), - }), + displayOptions: PropTypes.string, id: PropTypes.string, renderAsTabs: PropTypes.bool, sections: PropTypes.arrayOf( diff --git a/src/data-workspace/section-form/section.js b/src/data-workspace/section-form/section.js index 5d0b102d5..8a362ef57 100644 --- a/src/data-workspace/section-form/section.js +++ b/src/data-workspace/section-form/section.js @@ -1,6 +1,8 @@ import i18n from '@dhis2/d2-i18n' import { colors, + IconChevronDown16, + IconChevronUp16, IconFilter16, Table, TableCellHead, @@ -19,9 +21,16 @@ import { getDisplayOptions } from './displayOptions.js' import { SectionDescription } from './section-description.js' import styles from './section.module.css' -export function SectionFormSection({ section, dataSetId, globalFilterText }) { +export function SectionFormSection({ + section, + dataSetId, + globalFilterText, + collapsible, +}) { // Could potentially build table via props instead of rendering children const [filterText, setFilterText] = useState('') + const [showSectionContent, setShowSectionContent] = useState(true) + const { data } = useMetadata() const dataElements = selectors.getDataElementsBySection( @@ -77,6 +86,15 @@ export function SectionFormSection({ section, dataSetId, globalFilterText }) { const { beforeSectionText, afterSectionText } = displayOptions + const onSectionHeadClicked = () => { + collapsible && + setShowSectionContent((displayingContent) => !displayingContent) + } + + const onSectionHeadEntered = (e) => { + e.key === 'Enter' && onSectionHeadClicked() + } + return (
{beforeSectionText} @@ -88,44 +106,61 @@ export function SectionFormSection({ section, dataSetId, globalFilterText }) { className={styles.headerCell} >
-
- {section.displayName} +
+ {collapsible && + (showSectionContent ? ( + + ) : ( + + ))}
- {section.description && ( -
- {section.description || - 'Placeholder section description'} +
+
+ {section.displayName}
- )} + {section.description && ( +
+ {section.description || + 'Placeholder section description'} +
+ )} +
- - - - - + + + + )} {groupedDataElements.map( ({ categoryCombo, dataElements }, i) => ( @@ -140,10 +175,11 @@ export function SectionFormSection({ section, dataSetId, globalFilterText }) { renderColumnTotals={section.showColumnTotals} greyedFields={greyedFields} displayOptions={displayOptions} + collapsed={!showSectionContent} /> ) )} - {indicators.length > 0 && ( + {indicators.length > 0 && showSectionContent && (