From ffc0c0a2298d2b1ff49758fed8ee7c63b49942d9 Mon Sep 17 00:00:00 2001 From: andreas-unleash <104830839+andreas-unleash@users.noreply.github.com> Date: Wed, 20 Jul 2022 10:17:26 +0300 Subject: [PATCH] Make accordion expand dependent on text width --- .../ConstraintAccordionView.tsx | 16 +++-- .../ConstraintAccordionViewHeader.tsx | 63 +++++++++++++++---- 2 files changed, 64 insertions(+), 15 deletions(-) diff --git a/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx b/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx index a56da12348..cc45a41c55 100644 --- a/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx +++ b/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx @@ -12,6 +12,7 @@ import { } from 'constants/operators'; import { useStyles } from '../ConstraintAccordion.styles'; +import {useState} from "react"; interface IConstraintAccordionViewProps { constraint: IConstraint; onDelete?: () => void; @@ -26,27 +27,34 @@ export const ConstraintAccordionView = ({ onDelete, }: IConstraintAccordionViewProps) => { const { classes: styles } = useStyles(); + const [expandable, setExpandable] = useState(true) + const [expanded, setExpanded] = useState(false); const singleValue = oneOf( [...semVerOperators, ...numOperators, ...dateOperators], constraint.operator ); + const handleChange = + () => (event: React.SyntheticEvent, isExpanded: boolean) => { + setExpanded((!isExpanded && expandable)); + }; + return ( - } - > + setExpandable(shouldExpand)} /> diff --git a/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx b/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx index 8521bdadf4..ac600f3ca4 100644 --- a/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx +++ b/frontend/src/component/common/ConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx @@ -5,11 +5,12 @@ import { IConstraint } from 'interfaces/strategy'; import { useStyles } from 'component/common/ConstraintAccordion/ConstraintAccordion.styles'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; -import React from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { formatConstraintValue } from 'utils/formatConstraintValue'; import { useLocationSettings } from 'hooks/useLocationSettings'; import { ConstraintOperator } from 'component/common/ConstraintAccordion/ConstraintOperator/ConstraintOperator'; import classnames from 'classnames'; +import ReactDOM from 'react-dom'; const StyledHeaderText = styled('span')(({ theme }) => ({ display: '-webkit-box', @@ -54,6 +55,7 @@ interface IConstraintAccordionViewHeaderProps { onDelete?: () => void; onEdit?: () => void; singleValue: boolean; + allowExpand: (shouldExpand: boolean) => void; } export const ConstraintAccordionViewHeader = ({ @@ -62,9 +64,14 @@ export const ConstraintAccordionViewHeader = ({ onEdit, onDelete, singleValue, + allowExpand }: IConstraintAccordionViewHeaderProps) => { const { classes: styles } = useStyles(); const { locationSettings } = useLocationSettings(); + const [height, setHeight] = useState(0); + const [width, setWidth] = useState(0); + const [textWidth, setTextWidth] = useState(0); + const elementRef = useRef(null); const onEditClick = onEdit && @@ -80,6 +87,35 @@ export const ConstraintAccordionViewHeader = ({ onDelete(); }); + useEffect(() => { + if (elementRef && elementRef.current != null) { + console.log(elementRef.current.clientHeight); + console.log(elementRef.current.clientWidth); + setTextWidth( + Math.round(getTextWidth(elementRef.current.innerText) / 2) // 2 lines + ); + setHeight(elementRef.current.clientHeight); + setWidth(elementRef.current.clientWidth); + allowExpand(textWidth > width) + } + }, []); + + function getTextWidth(text: string | null) { + if (text != null) { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + + if (context != null) { + context.font = getComputedStyle(document.body).font; + + return context.measureText(text).width; + } + } + return 0; + } + + const shouldBeExpandable = textWidth > width; + return (
@@ -104,20 +140,25 @@ export const ConstraintAccordionViewHeader = ({ } elseShow={
- + {constraint?.values ?.map(value => value) .join(', ')} -

- Expand to view all ({constraint?.values?.length} - ) -

+ + Expand to view all ( + {constraint?.values?.length}) +

+ } + />
} />