fix: fix Pipeline Step title and color update in board (#2849)

Fixes a bug where editing a pipeline step's title or color in the board changes the column's label to the column's uuid and the color to gray.
This commit is contained in:
Thaïs
2023-12-06 12:06:46 +01:00
committed by GitHub
parent f8ddf7f32c
commit e388d90976
7 changed files with 35 additions and 35 deletions

View File

@ -28,7 +28,11 @@ export type RecordBoardProps = {
boardOptions: BoardOptions; boardOptions: BoardOptions;
onColumnAdd?: (boardColumn: BoardColumnDefinition) => void; onColumnAdd?: (boardColumn: BoardColumnDefinition) => void;
onColumnDelete?: (boardColumnId: string) => void; onColumnDelete?: (boardColumnId: string) => void;
onEditColumnTitle: (columnId: string, title: string, color: string) => void; onEditColumnTitle: (params: {
columnId: string;
title: string;
color: string;
}) => void;
}; };
const StyledBoard = styled.div` const StyledBoard = styled.div`

View File

@ -51,7 +51,11 @@ type RecordBoardColumnProps = {
recordBoardOptions: BoardOptions; recordBoardOptions: BoardOptions;
recordBoardColumnTotal: number; recordBoardColumnTotal: number;
onDelete?: (columnId: string) => void; onDelete?: (columnId: string) => void;
onTitleEdit: (columnId: string, title: string, color: string) => void; onTitleEdit: (params: {
columnId: string;
title: string;
color: string;
}) => void;
}; };
const BoardColumnCardsContainer = ({ const BoardColumnCardsContainer = ({
@ -82,10 +86,6 @@ export const RecordBoardColumn = ({
recordBoardCardIdsByColumnIdFamilyState(recordBoardColumnId), recordBoardCardIdsByColumnIdFamilyState(recordBoardColumnId),
); );
const handleTitleEdit = (title: string, color: string) => {
onTitleEdit(recordBoardColumnId, title, color);
};
const isFirstColumn = columnDefinition.position === 0; const isFirstColumn = columnDefinition.position === 0;
return ( return (
@ -95,6 +95,8 @@ export const RecordBoardColumn = ({
columnDefinition: columnDefinition, columnDefinition: columnDefinition,
isFirstColumn: columnDefinition.position === 0, isFirstColumn: columnDefinition.position === 0,
isLastColumn: columnDefinition.position === recordBoardColumnTotal - 1, isLastColumn: columnDefinition.position === recordBoardColumnTotal - 1,
onTitleEdit: ({ title, color }) =>
onTitleEdit({ columnId: recordBoardColumnId, title, color }),
}} }}
> >
<Droppable droppableId={recordBoardColumnId}> <Droppable droppableId={recordBoardColumnId}>
@ -104,7 +106,6 @@ export const RecordBoardColumn = ({
recordBoardColumnId={recordBoardColumnId} recordBoardColumnId={recordBoardColumnId}
columnDefinition={columnDefinition} columnDefinition={columnDefinition}
onDelete={onDelete} onDelete={onDelete}
onTitleEdit={handleTitleEdit}
/> />
<BoardColumnCardsContainer droppableProvided={droppableProvided}> <BoardColumnCardsContainer droppableProvided={droppableProvided}>
{cardIds.map((cardId, index) => ( {cardIds.map((cardId, index) => (

View File

@ -26,7 +26,6 @@ const StyledMenuContainer = styled.div`
type RecordBoardColumnDropdownMenuProps = { type RecordBoardColumnDropdownMenuProps = {
onClose: () => void; onClose: () => void;
onDelete?: (id: string) => void; onDelete?: (id: string) => void;
onTitleEdit: (title: string, color: string) => void;
stageId: string; stageId: string;
}; };
@ -35,7 +34,6 @@ type Menu = 'actions' | 'add' | 'title';
export const RecordBoardColumnDropdownMenu = ({ export const RecordBoardColumnDropdownMenu = ({
onClose, onClose,
onDelete, onDelete,
onTitleEdit,
stageId, stageId,
}: RecordBoardColumnDropdownMenuProps) => { }: RecordBoardColumnDropdownMenuProps) => {
const [currentMenu, setCurrentMenu] = useState('actions'); const [currentMenu, setCurrentMenu] = useState('actions');
@ -127,7 +125,6 @@ export const RecordBoardColumnDropdownMenu = ({
<RecordBoardColumnEditTitleMenu <RecordBoardColumnEditTitleMenu
color={columnDefinition.colorCode ?? 'gray'} color={columnDefinition.colorCode ?? 'gray'}
onClose={closeMenu} onClose={closeMenu}
onTitleEdit={onTitleEdit}
title={columnDefinition.title} title={columnDefinition.title}
onDelete={onDelete} onDelete={onDelete}
stageId={stageId} stageId={stageId}

View File

@ -1,4 +1,4 @@
import { ChangeEvent, useCallback, useState } from 'react'; import { ChangeEvent, useCallback, useContext, useState } from 'react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { IconTrash } from '@/ui/display/icon'; import { IconTrash } from '@/ui/display/icon';
@ -6,11 +6,13 @@ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/Drop
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
import { MenuItemSelectColor } from '@/ui/navigation/menu-item/components/MenuItemSelectColor'; import { MenuItemSelectColor } from '@/ui/navigation/menu-item/components/MenuItemSelectColor';
import { useRecordBoard } from '@/ui/object/record-board/hooks/useRecordBoard';
import { mainColorNames, ThemeColor } from '@/ui/theme/constants/colors'; import { mainColorNames, ThemeColor } from '@/ui/theme/constants/colors';
import { textInputStyle } from '@/ui/theme/constants/effects'; import { textInputStyle } from '@/ui/theme/constants/effects';
import { debounce } from '~/utils/debounce'; import { debounce } from '~/utils/debounce';
import { BoardColumnContext } from '../contexts/BoardColumnContext';
import { useRecordBoard } from '../hooks/useRecordBoard';
const StyledEditTitleContainer = styled.div` const StyledEditTitleContainer = styled.div`
--vertical-padding: ${({ theme }) => theme.spacing(1)}; --vertical-padding: ${({ theme }) => theme.spacing(1)};
@ -42,7 +44,6 @@ type RecordBoardColumnEditTitleMenuProps = {
onClose: () => void; onClose: () => void;
onDelete?: (id: string) => void; onDelete?: (id: string) => void;
title: string; title: string;
onTitleEdit: (title: string, color: string) => void;
color: ThemeColor; color: ThemeColor;
stageId: string; stageId: string;
}; };
@ -51,16 +52,16 @@ export const RecordBoardColumnEditTitleMenu = ({
onClose, onClose,
onDelete, onDelete,
stageId, stageId,
onTitleEdit,
title, title,
color, color,
}: RecordBoardColumnEditTitleMenuProps) => { }: RecordBoardColumnEditTitleMenuProps) => {
const [internalValue, setInternalValue] = useState(title); const [internalValue, setInternalValue] = useState(title);
const { onTitleEdit } = useContext(BoardColumnContext) || {};
const { setBoardColumns } = useRecordBoard(); const { setBoardColumns } = useRecordBoard();
const debouncedOnUpdateTitle = debounce( const debouncedOnUpdateTitle = debounce(
(newTitle) => onTitleEdit(newTitle, color), (newTitle) => onTitleEdit?.({ title: newTitle, color }),
200, 200,
); );
const handleChange = (event: ChangeEvent<HTMLInputElement>) => { const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
@ -76,7 +77,7 @@ export const RecordBoardColumnEditTitleMenu = ({
}; };
const handleColorChange = (newColor: ThemeColor) => { const handleColorChange = (newColor: ThemeColor) => {
onTitleEdit(title, newColor); onTitleEdit?.({ title, color: newColor });
onClose(); onClose();
setBoardColumns((previousBoardColumns) => setBoardColumns((previousBoardColumns) =>
previousBoardColumns.map((column) => previousBoardColumns.map((column) =>

View File

@ -52,14 +52,12 @@ type RecordBoardColumnHeaderProps = {
recordBoardColumnId: string; recordBoardColumnId: string;
columnDefinition: BoardColumnDefinition; columnDefinition: BoardColumnDefinition;
onDelete?: (columnId: string) => void; onDelete?: (columnId: string) => void;
onTitleEdit: (columnId: string, title: string, color: string) => void;
}; };
export const RecordBoardColumnHeader = ({ export const RecordBoardColumnHeader = ({
recordBoardColumnId, recordBoardColumnId,
columnDefinition, columnDefinition,
onDelete, onDelete,
onTitleEdit,
}: RecordBoardColumnHeaderProps) => { }: RecordBoardColumnHeaderProps) => {
const [isBoardColumnMenuOpen, setIsBoardColumnMenuOpen] = useState(false); const [isBoardColumnMenuOpen, setIsBoardColumnMenuOpen] = useState(false);
const [isHeaderHovered, setIsHeaderHovered] = useState(false); const [isHeaderHovered, setIsHeaderHovered] = useState(false);
@ -89,10 +87,6 @@ export const RecordBoardColumnHeader = ({
recordBoardCardIdsByColumnIdFamilyState(recordBoardColumnId), recordBoardCardIdsByColumnIdFamilyState(recordBoardColumnId),
); );
const handleTitleEdit = (title: string, color: string) => {
onTitleEdit(recordBoardColumnId, title, color);
};
return ( return (
<> <>
<StyledHeader <StyledHeader
@ -127,7 +121,6 @@ export const RecordBoardColumnHeader = ({
<RecordBoardColumnDropdownMenu <RecordBoardColumnDropdownMenu
onClose={handleBoardColumnMenuClose} onClose={handleBoardColumnMenuClose}
onDelete={onDelete} onDelete={onDelete}
onTitleEdit={handleTitleEdit}
stageId={recordBoardColumnId} stageId={recordBoardColumnId}
/> />
)} )}

View File

@ -2,11 +2,14 @@ import { createContext } from 'react';
import { BoardColumnDefinition } from '../types/BoardColumnDefinition'; import { BoardColumnDefinition } from '../types/BoardColumnDefinition';
type BoardColumn = { type BoardColumnContextProps = {
id: string; id: string;
columnDefinition: BoardColumnDefinition; columnDefinition: BoardColumnDefinition;
isFirstColumn: boolean; isFirstColumn: boolean;
isLastColumn: boolean; isLastColumn: boolean;
onTitleEdit: (params: { title: string; color: string }) => void;
}; };
export const BoardColumnContext = createContext<BoardColumn | null>(null); export const BoardColumnContext = createContext<BoardColumnContextProps | null>(
null,
);

View File

@ -25,17 +25,18 @@ export const Opportunities = () => {
objectNameSingular: 'pipelineStep', objectNameSingular: 'pipelineStep',
}); });
const handleEditColumnTitle = ( const handleEditColumnTitle = ({
boardColumnId: string, columnId,
newTitle: string, title,
newColor: string, color,
) => { }: {
columnId: string;
title: string;
color: string;
}) => {
updateOnePipelineStep?.({ updateOnePipelineStep?.({
idToUpdate: boardColumnId, idToUpdate: columnId,
input: { input: { name: title, color },
name: newTitle,
color: newColor,
},
}); });
}; };