From d519740a360073cc799accd757b33de818a1bc09 Mon Sep 17 00:00:00 2001 From: Kevin Triplett Date: Mon, 3 Mar 2025 19:19:46 -0600 Subject: [PATCH 1/9] fix lint error --- .../AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx b/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx index bdb434da5..871dfb12a 100644 --- a/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx +++ b/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx @@ -1,5 +1,5 @@ import { get } from 'lodash/fp' -import { ChevronLeft, GripHorizontal, Pencil, UserPlus, LogOut, Users} from 'lucide-react' +import { ChevronLeft, GripHorizontal, Pencil, UserPlus, LogOut, Users } from 'lucide-react' import React, { useMemo, useState, useCallback } from 'react' import { useNavigate, useLocation, Routes, Route } from 'react-router-dom' import { replace } from 'redux-first-history' From 140f131f98531b9f3f69b3273f3f45e7ef47e28d Mon Sep 17 00:00:00 2001 From: Kevin Triplett Date: Tue, 4 Mar 2025 09:55:09 -0600 Subject: [PATCH 2/9] scroll new widget into view --- .../components/ContextMenu/ContextMenu.jsx | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx b/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx index 871dfb12a..f7194374d 100644 --- a/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx +++ b/apps/web/src/routes/AuthLayoutRouter/components/ContextMenu/ContextMenu.jsx @@ -1,6 +1,6 @@ import { get } from 'lodash/fp' import { ChevronLeft, GripHorizontal, Pencil, UserPlus, LogOut, Users } from 'lucide-react' -import React, { useMemo, useState, useCallback } from 'react' +import React, { useRef, useEffect, useMemo, useState, useCallback } from 'react' import { useNavigate, useLocation, Routes, Route } from 'react-router-dom' import { replace } from 'redux-first-history' import { useTranslation } from 'react-i18next' @@ -35,6 +35,8 @@ import getQuerystringParam from 'store/selectors/getQuerystringParam' import logout from 'store/actions/logout' import classes from './ContextMenu.module.scss' +let previousWidgets = [] + export default function ContextMenu (props) { const { className, @@ -84,6 +86,19 @@ export default function ContextMenu (props) { const [activeWidget, setActiveWidget] = useState(null) const toggleNavMenuAction = useCallback(() => dispatch(toggleNavMenu()), []) + let newWidget = previousWidgets.length > 0 ? orderedWidgets.find(widget => previousWidgets.indexOf(widget.id) === -1) : null + previousWidgets = orderedWidgets.map(widget => widget.id) + const newWidgetRef = useRef() + + useEffect(() => { + if (newWidget && newWidgetRef.current) { + const element = newWidgetRef.current + element.scrollIntoView({ behavior: 'smooth', block: 'center' }) + // TODO: animate element to draw attention to it + newWidget = null + } + }, [newWidget]) + const handleDragStart = ({ active }) => { setIsDragging(true) @@ -154,6 +169,8 @@ export default function ContextMenu (props) { rootPath={rootPath} canAdminister={canAdminister} activeWidget={activeWidget} + newWidget={newWidget} + newWidgetRef={newWidgetRef} group={group} /> @@ -185,7 +202,7 @@ export default function ContextMenu (props) { ) } -function ContextWidgetList ({ contextWidgets, groupSlug, rootPath, canAdminister, isEditing, isDragging, activeWidget, group }) { +function ContextWidgetList ({ contextWidgets, groupSlug, rootPath, canAdminister, isEditing, isDragging, activeWidget, newWidget, newWidgetRef, group }) { const navigate = useNavigate() const location = useLocation() @@ -193,6 +210,9 @@ function ContextWidgetList ({ contextWidgets, groupSlug, rootPath, canAdminister navigate(addQuerystringToPath(location.pathname, { addview: 'yes', cme: 'yes', parentId: widget?.parentId || parentId, orderInFrontOfWidgetId: widget?.id || null })) } + const itemProps = {} + if (newWidget) itemProps[newWidget.id] = { ref: newWidgetRef } + return (