From 2e0483d9e999d551ac551b18fbc74629877bb668 Mon Sep 17 00:00:00 2001 From: Mashood ur Rehman <112761667+ranamashood@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:10:58 +0500 Subject: [PATCH] feat: Add ability to create new card at top (#1261) Closes #1260 --- .../components/boards/Board/FiniteContent.jsx | 2 +- client/src/components/lists/List/List.jsx | 53 ++++++++++++------- client/src/constants/EntryActionTypes.js | 2 +- client/src/entry-actions/cards.js | 14 ++--- client/src/sagas/core/services/cards.js | 20 +++---- client/src/sagas/core/watchers/cards.js | 13 ++--- 6 files changed, 62 insertions(+), 42 deletions(-) diff --git a/client/src/components/boards/Board/FiniteContent.jsx b/client/src/components/boards/Board/FiniteContent.jsx index 5bb5c568..5a5751ec 100644 --- a/client/src/components/boards/Board/FiniteContent.jsx +++ b/client/src/components/boards/Board/FiniteContent.jsx @@ -21,7 +21,7 @@ const FiniteContent = React.memo(() => { const handleCardCreate = useCallback( (data, autoOpen) => { - dispatch(entryActions.createCardInFirstFiniteList(data, autoOpen)); + dispatch(entryActions.createCardInFirstFiniteList(data, undefined, autoOpen)); }, [dispatch], ); diff --git a/client/src/components/lists/List/List.jsx b/client/src/components/lists/List/List.jsx index 89c7adc3..ce30c2d9 100755 --- a/client/src/components/lists/List/List.jsx +++ b/client/src/components/lists/List/List.jsx @@ -30,6 +30,15 @@ import PlusMathIcon from '../../../assets/images/plus-math-icon.svg?react'; import styles from './List.module.scss'; import globalStyles from '../../../styles.module.scss'; +const AddCardPositions = { + TOP: 'top', + BOTTOM: 'bottom', +}; + +const INDEX_BY_ADD_CARD_POSITION = { + [AddCardPositions.TOP]: 0, +}; + const List = React.memo(({ id, index }) => { const selectListById = useMemo(() => selectors.makeSelectListById(), []); @@ -59,16 +68,18 @@ const List = React.memo(({ id, index }) => { const dispatch = useDispatch(); const [t] = useTranslation(); const [isEditNameOpened, setIsEditNameOpened] = useState(false); - const [isAddCardOpened, setIsAddCardOpened] = useState(false); + const [addCardPosition, setAddCardPosition] = useState(null); const wrapperRef = useRef(null); const cardsWrapperRef = useRef(null); const handleCardCreate = useCallback( (data, autoOpen) => { - dispatch(entryActions.createCard(id, data, autoOpen)); + dispatch( + entryActions.createCard(id, data, INDEX_BY_ADD_CARD_POSITION[addCardPosition], autoOpen), + ); }, - [id, dispatch], + [id, dispatch, addCardPosition], ); const handleHeaderClick = useCallback(() => { @@ -78,15 +89,15 @@ const List = React.memo(({ id, index }) => { }, [list.isPersisted, canEdit]); const handleAddCardClick = useCallback(() => { - setIsAddCardOpened(true); + setAddCardPosition(AddCardPositions.BOTTOM); }, []); const handleAddCardClose = useCallback(() => { - setIsAddCardOpened(false); + setAddCardPosition(null); }, []); const handleCardAdd = useCallback(() => { - setIsAddCardOpened(true); + setAddCardPosition(AddCardPositions.TOP); }, []); const handleNameEdit = useCallback(() => { @@ -104,14 +115,26 @@ const List = React.memo(({ id, index }) => { ); useDidUpdate(() => { - if (isAddCardOpened) { - cardsWrapperRef.current.scrollTop = cardsWrapperRef.current.scrollHeight; + if (!addCardPosition) { + return; } - }, [cardIds, isAddCardOpened]); + + cardsWrapperRef.current.scrollTop = + addCardPosition === AddCardPositions.TOP ? 0 : cardsWrapperRef.current.scrollHeight; + }, [cardIds, addCardPosition]); const ActionsPopup = usePopup(ActionsStep); const ArchiveCardsPopup = usePopup(ArchiveCardsStep); + const addCardNode = canAddCard && ( + + ); + const cardsNode = ( { // eslint-disable-next-line react/jsx-props-no-spreading
+ {addCardPosition === AddCardPositions.TOP && addCardNode} {cardIds.map((cardId, cardIndex) => ( ))} {placeholder} - {canAddCard && ( - - )} + {addCardPosition === AddCardPositions.BOTTOM && addCardNode}
)} @@ -213,7 +230,7 @@ const List = React.memo(({ id, index }) => {
{cardsNode}
- {!isAddCardOpened && canAddCard && ( + {!addCardPosition && canAddCard && (