From 1869f21083c878b6f223818a6245f09a6a4f9d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mir=C3=B3=20Sorja?= Date: Thu, 27 Feb 2025 14:22:11 +0200 Subject: [PATCH] 4408 - PDF and Print: Show dash for empty comment sections (#4409) * 4408 - Remove prop drilling showDashEmptyContent and use regex for checking empty HTML * 4408 - CommentableDescription: Remove defaultProps * 4408 - Update useDescriptionErrorState comment --- .../AnalysisDescriptions.tsx | 9 +------ .../CommentableDescription.tsx | 14 +++------- .../hooks/useDescriptionErrorState.ts | 26 ++++++++++++------- .../Section/Descriptions/Descriptions.tsx | 6 ++--- .../NationalDataDescriptions.tsx | 15 ++--------- 5 files changed, 26 insertions(+), 44 deletions(-) diff --git a/src/client/pages/Section/Descriptions/AnalysisDescriptions/AnalysisDescriptions.tsx b/src/client/pages/Section/Descriptions/AnalysisDescriptions/AnalysisDescriptions.tsx index faf5815033..73f3f9e12d 100644 --- a/src/client/pages/Section/Descriptions/AnalysisDescriptions/AnalysisDescriptions.tsx +++ b/src/client/pages/Section/Descriptions/AnalysisDescriptions/AnalysisDescriptions.tsx @@ -8,12 +8,11 @@ import { useCycleRouteParams } from 'client/hooks/useRouteParams' import CommentableDescription from 'client/pages/Section/Descriptions/CommentableDescription' type Props = { - showDashEmptyContent?: boolean analysisAndProcessing: AnalysisAndProcessingDescription } const AnalysisDescriptions: React.FC = (props) => { - const { analysisAndProcessing, showDashEmptyContent } = props + const { analysisAndProcessing } = props const { t } = useTranslation() const { cycleName } = useCycleRouteParams() @@ -24,7 +23,6 @@ const AnalysisDescriptions: React.FC = (props) => { {analysisAndProcessing.estimationAndForecasting && ( )} @@ -32,7 +30,6 @@ const AnalysisDescriptions: React.FC = (props) => { {analysisAndProcessing.reclassification && ( )} @@ -40,8 +37,4 @@ const AnalysisDescriptions: React.FC = (props) => { ) } -AnalysisDescriptions.defaultProps = { - showDashEmptyContent: false, -} - export default AnalysisDescriptions diff --git a/src/client/pages/Section/Descriptions/CommentableDescription/CommentableDescription.tsx b/src/client/pages/Section/Descriptions/CommentableDescription/CommentableDescription.tsx index 7f8ffa3d2b..6bf6fca3f2 100644 --- a/src/client/pages/Section/Descriptions/CommentableDescription/CommentableDescription.tsx +++ b/src/client/pages/Section/Descriptions/CommentableDescription/CommentableDescription.tsx @@ -9,6 +9,7 @@ import { useHistoryLastApprovedIsActive, } from 'client/store/data' import { useCanEditDescription, useIsDescriptionEditable } from 'client/store/user/hooks' +import { useIsPrintRoute } from 'client/hooks/useIsRoute' import { DataCell, DataGrid, DataRow } from 'client/components/DataGrid' import EditorWYSIWYG from 'client/components/EditorWYSIWYG' import { useSectionContext } from 'client/pages/Section/context' @@ -21,14 +22,13 @@ import DescriptionDiffView from './DescriptionDiffView' type Props = { name: CommentableDescriptionName repository?: boolean - showDashEmptyContent?: boolean template?: CommentableDescriptionValue title: string } const CommentableDescription: React.FC = (props) => { - const { name, showDashEmptyContent, repository, template, title } = props - + const { name, repository, template = { text: '' }, title } = props + const { print } = useIsPrintRoute() const { sectionName } = useSectionContext() const value = useCommentableDescriptionValue({ name, sectionName, template }) const { empty } = useDescriptionErrorState({ name, sectionName }) @@ -61,7 +61,7 @@ const CommentableDescription: React.FC = (props) => { disabled={!editable} onChange={(content) => onChange({ ...value, text: content })} repository={repository} - value={!editable && empty && showDashEmptyContent ? '-' : value.text} + value={empty && print ? '-' : value.text} /> )} @@ -70,10 +70,4 @@ const CommentableDescription: React.FC = (props) => { ) } -CommentableDescription.defaultProps = { - repository: false, - showDashEmptyContent: false, - template: { text: '' }, -} - export default CommentableDescription diff --git a/src/client/pages/Section/Descriptions/CommentableDescription/hooks/useDescriptionErrorState.ts b/src/client/pages/Section/Descriptions/CommentableDescription/hooks/useDescriptionErrorState.ts index 8d68791d5b..a99e2389d3 100644 --- a/src/client/pages/Section/Descriptions/CommentableDescription/hooks/useDescriptionErrorState.ts +++ b/src/client/pages/Section/Descriptions/CommentableDescription/hooks/useDescriptionErrorState.ts @@ -5,8 +5,17 @@ import { Objects } from 'utils/objects' import { CommentableDescriptionName, SectionName } from 'meta/assessment' import { useCommentableDescriptionValue } from 'client/store/data' -import { useIsPrintRoute } from 'client/hooks/useIsRoute' -import { DOMs } from 'client/utils/dom' + +const isHTMLEmpty = (html: string): boolean => { + if (Objects.isEmpty(html?.trim())) return true + + const strippedHtml = html + .replace(/<[^>]*>/g, '') + .replace(/ /g, ' ') + .trim() + + return !strippedHtml +} type Props = { name: CommentableDescriptionName @@ -17,16 +26,15 @@ type Returned = { empty: boolean } +/* + Note: Return value of the hook is used only in print view +*/ + export const useDescriptionErrorState = (props: Props): Returned => { const { name, sectionName } = props - const { print } = useIsPrintRoute() - const value = useCommentableDescriptionValue({ name, sectionName }) return useMemo(() => { - if (print) return { empty: false } - const empty = Objects.isEmpty(DOMs.parseDOMValue(value.text)) - - return { empty } - }, [print, value.text]) + return { empty: isHTMLEmpty(value.text) } + }, [value.text]) } diff --git a/src/client/pages/Section/Descriptions/Descriptions.tsx b/src/client/pages/Section/Descriptions/Descriptions.tsx index e4ac7b0bdb..000d7d26d9 100644 --- a/src/client/pages/Section/Descriptions/Descriptions.tsx +++ b/src/client/pages/Section/Descriptions/Descriptions.tsx @@ -26,11 +26,9 @@ const Descriptions: React.FC = (props: Props) => { return ( <>
- {nationalData && } + {nationalData && } - {analysisAndProcessing && ( - - )} + {analysisAndProcessing && }
{print && !onlyTables &&
} diff --git a/src/client/pages/Section/Descriptions/NationalDataDescriptions/NationalDataDescriptions.tsx b/src/client/pages/Section/Descriptions/NationalDataDescriptions/NationalDataDescriptions.tsx index ad8c0ac3b4..b3616c011e 100644 --- a/src/client/pages/Section/Descriptions/NationalDataDescriptions/NationalDataDescriptions.tsx +++ b/src/client/pages/Section/Descriptions/NationalDataDescriptions/NationalDataDescriptions.tsx @@ -9,7 +9,6 @@ import DataSources from 'client/pages/Section/Descriptions/NationalDataDescripti type Props = { nationalData: NationalDataDescription - showDashEmptyContent?: boolean } type DataSourcesProps = { @@ -18,7 +17,7 @@ type DataSourcesProps = { } const NationalDataDescriptions: React.FC = (props) => { - const { nationalData, showDashEmptyContent } = props + const { nationalData } = props const { t } = useTranslation() @@ -39,7 +38,6 @@ const NationalDataDescriptions: React.FC = (props) => { {!dataSourcesProps.withTable && ( )} @@ -49,24 +47,15 @@ const NationalDataDescriptions: React.FC = (props) => { {nationalData.nationalClassification && ( )} {nationalData.originalData && ( - + )}
) } -NationalDataDescriptions.defaultProps = { - showDashEmptyContent: false, -} - export default NationalDataDescriptions