From dc0e448e337887a4c48ef0875577a3ef490675f6 Mon Sep 17 00:00:00 2001 From: sayali-2308 Date: Tue, 12 May 2026 16:59:58 -0400 Subject: [PATCH] feat: add Expand All/Truncate All button to Team Member Tasks header --- .../TeamMemberTasks/TeamMemberTask.jsx | 7 ++++++- .../TeamMemberTasks/TeamMemberTasks.jsx | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/components/TeamMemberTasks/TeamMemberTask.jsx b/src/components/TeamMemberTasks/TeamMemberTask.jsx index d585f7f371..49f2a5aa89 100644 --- a/src/components/TeamMemberTasks/TeamMemberTask.jsx +++ b/src/components/TeamMemberTasks/TeamMemberTask.jsx @@ -8,7 +8,7 @@ import { } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import PropTypes from 'prop-types'; -import React, { useRef, useState, useEffect } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { Modal, ModalBody, ModalFooter, ModalHeader, Progress, Table } from 'reactstrap'; import CopyToClipboard from '~/components/common/Clipboard/CopyToClipboard'; import UserStateDisplay from '../UserState/UserStateDisplay'; @@ -53,6 +53,7 @@ const TeamMemberTask = React.memo( onCatalogChange, userStateSelection = [], onSelectionChange, + expandAll = false, }) => { const darkMode = useSelector(state => state.theme.darkMode); const taskCounts = useSelector(state => state.dashboard?.taskCounts ?? {}); @@ -133,6 +134,9 @@ const TeamMemberTask = React.memo( const canTruncate = activeTasks.length > NUM_TASKS_SHOW_TRUNCATE; const [isTruncated, setIsTruncated] = useState(canTruncate); + useEffect(() => { + if (canTruncate) setIsTruncated(!expandAll); + }, [expandAll, canTruncate]); const [isTimeOffContentOpen, setIsTimeOffContentOpen] = useState( showWhoHasTimeOff && (onTimeOff || goingOnTimeOff), ); @@ -831,6 +835,7 @@ TeamMemberTask.propTypes = { onCatalogChange: PropTypes.func, userStateSelection: PropTypes.array, onSelectionChange: PropTypes.func, + expandAll: PropTypes.bool, }; TeamMemberTask.displayName = 'TeamMemberTask'; diff --git a/src/components/TeamMemberTasks/TeamMemberTasks.jsx b/src/components/TeamMemberTasks/TeamMemberTasks.jsx index 9e9003a3c2..2004128c27 100644 --- a/src/components/TeamMemberTasks/TeamMemberTasks.jsx +++ b/src/components/TeamMemberTasks/TeamMemberTasks.jsx @@ -68,6 +68,7 @@ const TeamMemberTasks = React.memo(props => { const [userStateCatalog, setUserStateCatalog] = useState([]); const [userStateSelections, setUserStateSelections] = useState({}); const [selectionsLoaded, setSelectionsLoaded] = useState(false); + const [expandAll, setExpandAll] = useState(false); useEffect(() => { axios @@ -78,7 +79,10 @@ const TeamMemberTasks = React.memo(props => { // Fetch all selections in ONE call once teamList is ready useEffect(() => { - if (usersWithTasks.length === 0) return; + if (usersWithTasks.length === 0) { + setSelectionsLoaded(true); + return; + } const userIds = usersWithTasks.map(u => u.personId); axios .post(ENDPOINTS.USER_STATE_SELECTIONS_BATCH, { userIds }) @@ -448,6 +452,13 @@ const TeamMemberTasks = React.memo(props => {

Team Member Tasks

+
{finishLoading ? ( @@ -762,10 +773,10 @@ const TeamMemberTasks = React.memo(props => { onSelectionChange={(uid, updated) => setUserStateSelections(prev => ({ ...prev, [uid]: updated })) } + expandAll={expandAll} /> ); } - return ( { onSelectionChange={(uid, updated) => setUserStateSelections(prev => ({ ...prev, [uid]: updated })) } + expandAll={expandAll} /> {timeEntriesList.length > 0 &&