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:
@ -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`
|
||||||
|
|||||||
@ -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) => (
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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) =>
|
||||||
|
|||||||
@ -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}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -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,
|
||||||
|
);
|
||||||
|
|||||||
@ -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,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user