2358 refactor entityboard to recordboard (#2652)

* renaming

* wip

* merge BoardColumn and RecordBoardColumn

* merge files

* remove unnecessary export

* Fix lint

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
bosiraphael
2023-11-22 17:31:56 +01:00
committed by GitHub
parent 8f12aea64a
commit 13d31072a7
69 changed files with 296 additions and 338 deletions

View File

@ -2,14 +2,14 @@ import styled from '@emotion/styled';
import { BoardContext } from '@/companies/states/contexts/BoardContext'; import { BoardContext } from '@/companies/states/contexts/BoardContext';
import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields'; import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields';
import { BoardOptionsDropdown } from '@/ui/layout/board/components/BoardOptionsDropdown'; import { RecordBoardActionBar } from '@/ui/object/record-board/action-bar/components/RecordBoardActionBar';
import { BoardOptionsDropdownId } from '@/ui/layout/board/components/constants/BoardOptionsDropdownId'; import { BoardOptionsDropdownId } from '@/ui/object/record-board/components/constants/BoardOptionsDropdownId';
import { import {
EntityBoard, RecordBoard,
EntityBoardProps, RecordBoardProps,
} from '@/ui/layout/board/components/EntityBoard'; } from '@/ui/object/record-board/components/RecordBoard';
import { EntityBoardActionBar } from '@/ui/layout/board/components/EntityBoardActionBar'; import { RecordBoardContextMenu } from '@/ui/object/record-board/context-menu/components/RecordBoardContextMenu';
import { EntityBoardContextMenu } from '@/ui/layout/board/components/EntityBoardContextMenu'; import { BoardOptionsDropdown } from '@/ui/object/record-board/options/components/BoardOptionsDropdown';
import { ViewBar } from '@/views/components/ViewBar'; import { ViewBar } from '@/views/components/ViewBar';
import { useViewFields } from '@/views/hooks/internal/useViewFields'; import { useViewFields } from '@/views/hooks/internal/useViewFields';
import { ViewScope } from '@/views/scopes/ViewScope'; import { ViewScope } from '@/views/scopes/ViewScope';
@ -27,7 +27,7 @@ const StyledContainer = styled.div`
`; `;
type CompanyBoardProps = Pick< type CompanyBoardProps = Pick<
EntityBoardProps, RecordBoardProps,
'onColumnAdd' | 'onColumnDelete' | 'onEditColumnTitle' 'onColumnAdd' | 'onColumnDelete' | 'onEditColumnTitle'
>; >;
@ -61,14 +61,14 @@ export const CompanyBoard = ({
optionsDropdownScopeId={BoardOptionsDropdownId} optionsDropdownScopeId={BoardOptionsDropdownId}
/> />
<HooksCompanyBoardEffect /> <HooksCompanyBoardEffect />
<EntityBoard <RecordBoard
boardOptions={opportunitiesBoardOptions} boardOptions={opportunitiesBoardOptions}
onColumnAdd={onColumnAdd} onColumnAdd={onColumnAdd}
onColumnDelete={onColumnDelete} onColumnDelete={onColumnDelete}
onEditColumnTitle={onEditColumnTitle} onEditColumnTitle={onEditColumnTitle}
/> />
<EntityBoardActionBar /> <RecordBoardActionBar />
<EntityBoardContextMenu /> <RecordBoardContextMenu />
</BoardContext.Provider> </BoardContext.Provider>
</StyledContainer> </StyledContainer>
</ViewScope> </ViewScope>

View File

@ -7,13 +7,13 @@ import { EntityChipVariant } from '@/ui/display/chip/components/EntityChip';
import { IconEye } from '@/ui/display/icon/index'; import { IconEye } from '@/ui/display/icon/index';
import { LightIconButton } from '@/ui/input/button/components/LightIconButton'; import { LightIconButton } from '@/ui/input/button/components/LightIconButton';
import { Checkbox, CheckboxVariant } from '@/ui/input/components/Checkbox'; import { Checkbox, CheckboxVariant } from '@/ui/input/components/Checkbox';
import { BoardCardIdContext } from '@/ui/layout/board/contexts/BoardCardIdContext';
import { useBoardContext } from '@/ui/layout/board/hooks/useBoardContext';
import { useCurrentCardSelected } from '@/ui/layout/board/hooks/useCurrentCardSelected';
import { isCardInCompactViewState } from '@/ui/layout/board/states/isCardInCompactViewState';
import { isCompactViewEnabledState } from '@/ui/layout/board/states/isCompactViewEnabledState';
import { visibleBoardCardFieldsScopedSelector } from '@/ui/layout/board/states/selectors/visibleBoardCardFieldsScopedSelector';
import { FieldContext } from '@/ui/object/field/contexts/FieldContext'; import { FieldContext } from '@/ui/object/field/contexts/FieldContext';
import { BoardCardIdContext } from '@/ui/object/record-board/contexts/BoardCardIdContext';
import { useBoardContext } from '@/ui/object/record-board/hooks/useBoardContext';
import { useCurrentCardSelected } from '@/ui/object/record-board/hooks/useCurrentCardSelected';
import { isCardInCompactViewState } from '@/ui/object/record-board/states/isCardInCompactViewState';
import { isCompactViewEnabledState } from '@/ui/object/record-board/states/isCompactViewEnabledState';
import { visibleBoardCardFieldsScopedSelector } from '@/ui/object/record-board/states/selectors/visibleBoardCardFieldsScopedSelector';
import { RecordInlineCell } from '@/ui/object/record-inline-cell/components/RecordInlineCell'; import { RecordInlineCell } from '@/ui/object/record-inline-cell/components/RecordInlineCell';
import { InlineCellHotkeyScope } from '@/ui/object/record-inline-cell/types/InlineCellHotkeyScope'; import { InlineCellHotkeyScope } from '@/ui/object/record-inline-cell/types/InlineCellHotkeyScope';
import { AnimatedEaseInOut } from '@/ui/utilities/animation/components/AnimatedEaseInOut'; import { AnimatedEaseInOut } from '@/ui/utilities/animation/components/AnimatedEaseInOut';

View File

@ -9,14 +9,14 @@ import { PaginatedObjectTypeResults } from '@/object-record/types/PaginatedObjec
import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns'; import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns';
import { Opportunity } from '@/pipeline/types/Opportunity'; import { Opportunity } from '@/pipeline/types/Opportunity';
import { PipelineStep } from '@/pipeline/types/PipelineStep'; import { PipelineStep } from '@/pipeline/types/PipelineStep';
import { useBoardActionBarEntries } from '@/ui/layout/board/hooks/useBoardActionBarEntries';
import { useBoardContext } from '@/ui/layout/board/hooks/useBoardContext';
import { useBoardContextMenuEntries } from '@/ui/layout/board/hooks/useBoardContextMenuEntries';
import { availableBoardCardFieldsScopedState } from '@/ui/layout/board/states/availableBoardCardFieldsScopedState';
import { boardCardFieldsScopedState } from '@/ui/layout/board/states/boardCardFieldsScopedState';
import { isBoardLoadedState } from '@/ui/layout/board/states/isBoardLoadedState';
import { turnFiltersIntoWhereClauseV2 } from '@/ui/object/object-filter-dropdown/utils/turnFiltersIntoWhereClauseV2'; import { turnFiltersIntoWhereClauseV2 } from '@/ui/object/object-filter-dropdown/utils/turnFiltersIntoWhereClauseV2';
import { turnSortsIntoOrderByV2 } from '@/ui/object/object-sort-dropdown/utils/turnSortsIntoOrderByV2'; import { turnSortsIntoOrderByV2 } from '@/ui/object/object-sort-dropdown/utils/turnSortsIntoOrderByV2';
import { useBoardActionBarEntries } from '@/ui/object/record-board/hooks/useBoardActionBarEntries';
import { useBoardContext } from '@/ui/object/record-board/hooks/useBoardContext';
import { useBoardContextMenuEntries } from '@/ui/object/record-board/hooks/useBoardContextMenuEntries';
import { availableBoardCardFieldsScopedState } from '@/ui/object/record-board/states/availableBoardCardFieldsScopedState';
import { boardCardFieldsScopedState } from '@/ui/object/record-board/states/boardCardFieldsScopedState';
import { isBoardLoadedState } from '@/ui/object/record-board/states/isBoardLoadedState';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useSetRecoilScopedStateV2 } from '@/ui/utilities/recoil-scope/hooks/useSetRecoilScopedStateV2'; import { useSetRecoilScopedStateV2 } from '@/ui/utilities/recoil-scope/hooks/useSetRecoilScopedStateV2';
import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates';

View File

@ -3,8 +3,8 @@ import { useCallback, useContext, useState } from 'react';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { relationPickerSearchFilterScopedState } from '@/ui/input/relation-picker/states/relationPickerSearchFilterScopedState'; import { relationPickerSearchFilterScopedState } from '@/ui/input/relation-picker/states/relationPickerSearchFilterScopedState';
import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope'; import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope';
import { NewButton } from '@/ui/layout/board/components/NewButton'; import { NewButton } from '@/ui/object/record-board/components/NewButton';
import { BoardColumnContext } from '@/ui/layout/board/contexts/BoardColumnContext'; import { BoardColumnContext } from '@/ui/object/record-board/contexts/BoardColumnContext';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';

View File

@ -1,8 +1,8 @@
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { Opportunity } from '@/pipeline/types/Opportunity'; import { Opportunity } from '@/pipeline/types/Opportunity';
import { boardCardIdsByColumnIdFamilyState } from '@/ui/layout/board/states/boardCardIdsByColumnIdFamilyState'; import { boardCardIdsByColumnIdFamilyState } from '@/ui/object/record-board/states/boardCardIdsByColumnIdFamilyState';
import { boardColumnsState } from '@/ui/layout/board/states/boardColumnsState'; import { boardColumnsState } from '@/ui/object/record-board/states/boardColumnsState';
export const useUpdateCompanyBoardCardIds = () => export const useUpdateCompanyBoardCardIds = () =>
useRecoilCallback( useRecoilCallback(

View File

@ -3,11 +3,11 @@ import { useRecoilCallback } from 'recoil';
import { currentPipelineStepsState } from '@/pipeline/states/currentPipelineStepsState'; import { currentPipelineStepsState } from '@/pipeline/states/currentPipelineStepsState';
import { Opportunity } from '@/pipeline/types/Opportunity'; import { Opportunity } from '@/pipeline/types/Opportunity';
import { PipelineStep } from '@/pipeline/types/PipelineStep'; import { PipelineStep } from '@/pipeline/types/PipelineStep';
import { boardCardIdsByColumnIdFamilyState } from '@/ui/layout/board/states/boardCardIdsByColumnIdFamilyState';
import { boardColumnsState } from '@/ui/layout/board/states/boardColumnsState';
import { savedBoardColumnsState } from '@/ui/layout/board/states/savedBoardColumnsState';
import { BoardColumnDefinition } from '@/ui/layout/board/types/BoardColumnDefinition';
import { entityFieldsFamilyState } from '@/ui/object/field/states/entityFieldsFamilyState'; import { entityFieldsFamilyState } from '@/ui/object/field/states/entityFieldsFamilyState';
import { boardCardIdsByColumnIdFamilyState } from '@/ui/object/record-board/states/boardCardIdsByColumnIdFamilyState';
import { boardColumnsState } from '@/ui/object/record-board/states/boardColumnsState';
import { savedBoardColumnsState } from '@/ui/object/record-board/states/savedBoardColumnsState';
import { BoardColumnDefinition } from '@/ui/object/record-board/types/BoardColumnDefinition';
import { isThemeColor } from '@/ui/theme/utils/castStringAsThemeColor'; import { isThemeColor } from '@/ui/theme/utils/castStringAsThemeColor';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
import { logError } from '~/utils/logError'; import { logError } from '~/utils/logError';

View File

@ -1,8 +1,8 @@
import { createContext } from 'react'; import { createContext } from 'react';
import { RecoilScopeContext } from '@/types/RecoilScopeContext'; import { RecoilScopeContext } from '@/types/RecoilScopeContext';
import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { BoardFieldDefinition } from '@/ui/object/record-board/types/BoardFieldDefinition';
export const BoardContext = createContext<{ export const BoardContext = createContext<{
BoardRecoilScopeContext: RecoilScopeContext; BoardRecoilScopeContext: RecoilScopeContext;

View File

@ -1,5 +1,5 @@
import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { BoardFieldDefinition } from '@/ui/object/record-board/types/BoardFieldDefinition';
import { ViewField } from '@/views/types/ViewField'; import { ViewField } from '@/views/types/ViewField';
export const mapBoardFieldDefinitionsToViewFields = ( export const mapBoardFieldDefinitionsToViewFields = (

View File

@ -4,7 +4,7 @@ import { useCreateOneObjectRecord } from '@/object-record/hooks/useCreateOneObje
import { useDeleteOneObjectRecord } from '@/object-record/hooks/useDeleteOneObjectRecord'; import { useDeleteOneObjectRecord } from '@/object-record/hooks/useDeleteOneObjectRecord';
import { currentPipelineState } from '@/pipeline/states/currentPipelineState'; import { currentPipelineState } from '@/pipeline/states/currentPipelineState';
import { PipelineStep } from '@/pipeline/types/PipelineStep'; import { PipelineStep } from '@/pipeline/types/PipelineStep';
import { BoardColumnDefinition } from '@/ui/layout/board/types/BoardColumnDefinition'; import { BoardColumnDefinition } from '@/ui/object/record-board/types/BoardColumnDefinition';
export const usePipelineSteps = () => { export const usePipelineSteps = () => {
const { createOneObject: createOnePipelineStep } = const { createOneObject: createOnePipelineStep } =

View File

@ -1,120 +0,0 @@
import React, { useContext } from 'react';
import styled from '@emotion/styled';
import { Tag } from '@/ui/display/tag/components/Tag';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { BoardColumnContext } from '../contexts/BoardColumnContext';
import { BoardColumnHotkeyScope } from '../types/BoardColumnHotkeyScope';
import { BoardColumnMenu } from './BoardColumnMenu';
const StyledColumn = styled.div<{ isFirstColumn: boolean }>`
background-color: ${({ theme }) => theme.background.primary};
border-left: 1px solid
${({ theme, isFirstColumn }) =>
isFirstColumn ? 'none' : theme.border.color.light};
display: flex;
flex-direction: column;
max-width: 200px;
min-width: 200px;
padding: ${({ theme }) => theme.spacing(2)};
position: relative;
`;
const StyledHeader = styled.div`
align-items: center;
cursor: pointer;
display: flex;
flex-direction: row;
height: 24px;
justify-content: left;
margin-bottom: ${({ theme }) => theme.spacing(2)};
width: 100%;
`;
const StyledAmount = styled.div`
color: ${({ theme }) => theme.font.color.tertiary};
margin-left: ${({ theme }) => theme.spacing(2)};
`;
const StyledNumChildren = styled.div`
align-items: center;
background-color: ${({ theme }) => theme.background.tertiary};
border-radius: ${({ theme }) => theme.border.radius.rounded};
color: ${({ theme }) => theme.font.color.tertiary};
display: flex;
height: 20px;
justify-content: center;
line-height: ${({ theme }) => theme.text.lineHeight.lg};
margin-left: auto;
width: 16px;
`;
export type BoardColumnProps = {
onDelete?: (id: string) => void;
onTitleEdit: (title: string, color: string) => void;
totalAmount?: number;
children: React.ReactNode;
numChildren: number;
stageId: string;
};
export const BoardColumn = ({
onDelete,
onTitleEdit,
totalAmount,
children,
numChildren,
stageId,
}: BoardColumnProps) => {
const boardColumn = useContext(BoardColumnContext);
const [isBoardColumnMenuOpen, setIsBoardColumnMenuOpen] =
React.useState(false);
const {
setHotkeyScopeAndMemorizePreviousScope,
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
const handleTitleClick = () => {
setIsBoardColumnMenuOpen(true);
setHotkeyScopeAndMemorizePreviousScope(BoardColumnHotkeyScope.BoardColumn, {
goto: false,
});
};
const handleClose = () => {
goBackToPreviousHotkeyScope();
setIsBoardColumnMenuOpen(false);
};
if (!boardColumn) return <></>;
const { isFirstColumn, columnDefinition } = boardColumn;
return (
<StyledColumn isFirstColumn={isFirstColumn}>
<StyledHeader>
<Tag
onClick={handleTitleClick}
color={columnDefinition.colorCode ?? 'gray'}
text={columnDefinition.title}
/>
{!!totalAmount && <StyledAmount>${totalAmount}</StyledAmount>}
<StyledNumChildren>{numChildren}</StyledNumChildren>
</StyledHeader>
{isBoardColumnMenuOpen && (
<BoardColumnMenu
onClose={handleClose}
onDelete={onDelete}
onTitleEdit={onTitleEdit}
stageId={stageId}
/>
)}
{children}
</StyledColumn>
);
};

View File

@ -1,123 +0,0 @@
import { useContext } from 'react';
import styled from '@emotion/styled';
import { Draggable, Droppable, DroppableProvided } from '@hello-pangea/dnd';
import { useRecoilValue } from 'recoil';
import { BoardColumn } from '@/ui/layout/board/components/BoardColumn';
import { BoardCardIdContext } from '@/ui/layout/board/contexts/BoardCardIdContext';
import { BoardColumnContext } from '@/ui/layout/board/contexts/BoardColumnContext';
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
import { boardCardIdsByColumnIdFamilyState } from '../states/boardCardIdsByColumnIdFamilyState';
import { boardColumnTotalsFamilySelector } from '../states/selectors/boardColumnTotalsFamilySelector';
import { BoardOptions } from '../types/BoardOptions';
import { EntityBoardCard } from './EntityBoardCard';
const StyledPlaceholder = styled.div`
min-height: 1px;
`;
const StyledNewCardButtonContainer = styled.div`
padding-bottom: ${({ theme }) => theme.spacing(4)};
`;
const StyledColumnCardsContainer = styled.div`
display: flex;
flex: 1;
flex-direction: column;
`;
type BoardColumnCardsContainerProps = {
children: React.ReactNode;
droppableProvided: DroppableProvided;
};
type EntityBoardColumnProps = {
boardOptions: BoardOptions;
onDelete?: (columnId: string) => void;
onTitleEdit: (columnId: string, title: string, color: string) => void;
};
const BoardColumnCardsContainer = ({
children,
droppableProvided,
}: BoardColumnCardsContainerProps) => {
return (
<StyledColumnCardsContainer
ref={droppableProvided?.innerRef}
// eslint-disable-next-line react/jsx-props-no-spreading
{...droppableProvided?.droppableProps}
>
{children}
<StyledPlaceholder>{droppableProvided?.placeholder}</StyledPlaceholder>
</StyledColumnCardsContainer>
);
};
export const EntityBoardColumn = ({
boardOptions,
onDelete,
onTitleEdit,
}: EntityBoardColumnProps) => {
const column = useContext(BoardColumnContext);
const boardColumnId = column?.id || '';
const boardColumnTotal = useRecoilValue(
boardColumnTotalsFamilySelector(boardColumnId),
);
const cardIds = useRecoilValue(
boardCardIdsByColumnIdFamilyState(boardColumnId),
);
const handleTitleEdit = (title: string, color: string) => {
onTitleEdit(boardColumnId, title, color);
};
if (!column) return <></>;
return (
<Droppable droppableId={column.id}>
{(droppableProvided) => (
<BoardColumn
onTitleEdit={handleTitleEdit}
onDelete={onDelete}
totalAmount={boardColumnTotal}
numChildren={cardIds.length}
stageId={column.id}
>
<BoardColumnCardsContainer droppableProvided={droppableProvided}>
{cardIds.map((cardId, index) => (
<BoardCardIdContext.Provider value={cardId} key={cardId}>
<EntityBoardCard
index={index}
cardId={cardId}
boardOptions={boardOptions}
/>
</BoardCardIdContext.Provider>
))}
<Draggable
draggableId={`new-${column.id}`}
index={cardIds.length}
isDragDisabled={true}
>
{(draggableProvided) => (
<div
ref={draggableProvided?.innerRef}
// eslint-disable-next-line react/jsx-props-no-spreading
{...draggableProvided?.draggableProps}
>
<StyledNewCardButtonContainer>
<RecoilScope>{boardOptions.newCardComponent}</RecoilScope>
</StyledNewCardButtonContainer>
</div>
)}
</Draggable>
</BoardColumnCardsContainer>
</BoardColumn>
)}
</Droppable>
);
};

View File

@ -1,10 +0,0 @@
import styled from '@emotion/styled';
export const StyledBoard = styled.div`
border-top: 1px solid ${({ theme }) => theme.border.color.light};
display: flex;
flex: 1;
flex-direction: row;
margin-left: ${({ theme }) => theme.spacing(2)};
margin-right: ${({ theme }) => theme.spacing(2)};
`;

View File

@ -25,7 +25,6 @@ export const SingleEntityObjectFilterDropdownButton = ({
selectedFilter, selectedFilter,
setFilterDefinitionUsedInDropdown, setFilterDefinitionUsedInDropdown,
setSelectedOperandInDropdown, setSelectedOperandInDropdown,
resetFilter,
} = useFilter(); } = useFilter();
const availableFilter = availableFilterDefinitions[0]; const availableFilter = availableFilterDefinitions[0];

View File

@ -3,9 +3,9 @@ import { useRecoilValue } from 'recoil';
import { ActionBar } from '@/ui/navigation/action-bar/components/ActionBar'; import { ActionBar } from '@/ui/navigation/action-bar/components/ActionBar';
import { selectedCardIdsSelector } from '../states/selectors/selectedCardIdsSelector'; import { selectedCardIdsSelector } from '../../states/selectors/selectedCardIdsSelector';
export const EntityBoardActionBar = () => { export const RecordBoardActionBar = () => {
const selectedCardIds = useRecoilValue(selectedCardIdsSelector); const selectedCardIds = useRecoilValue(selectedCardIdsSelector);
return <ActionBar selectedIds={selectedCardIds}></ActionBar>; return <ActionBar selectedIds={selectedCardIds}></ActionBar>;
}; };

View File

@ -6,11 +6,10 @@ import { useRecoilValue } from 'recoil';
import { useUpdateOneObjectRecord } from '@/object-record/hooks/useUpdateOneObjectRecord'; import { useUpdateOneObjectRecord } from '@/object-record/hooks/useUpdateOneObjectRecord';
import { Opportunity } from '@/pipeline/types/Opportunity'; import { Opportunity } from '@/pipeline/types/Opportunity';
import { PageHotkeyScope } from '@/types/PageHotkeyScope'; import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { StyledBoard } from '@/ui/layout/board/components/StyledBoard'; import { BoardColumnContext } from '@/ui/object/record-board/contexts/BoardColumnContext';
import { BoardColumnContext } from '@/ui/layout/board/contexts/BoardColumnContext'; import { useSetCardSelected } from '@/ui/object/record-board/hooks/useSetCardSelected';
import { useSetCardSelected } from '@/ui/layout/board/hooks/useSetCardSelected'; import { useUpdateBoardCardIds } from '@/ui/object/record-board/hooks/useUpdateBoardCardIds';
import { useUpdateBoardCardIds } from '@/ui/layout/board/hooks/useUpdateBoardCardIds'; import { boardColumnsState } from '@/ui/object/record-board/states/boardColumnsState';
import { boardColumnsState } from '@/ui/layout/board/states/boardColumnsState';
import { DragSelect } from '@/ui/utilities/drag-select/components/DragSelect'; import { DragSelect } from '@/ui/utilities/drag-select/components/DragSelect';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useListenClickOutsideByClassName } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { useListenClickOutsideByClassName } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
@ -22,15 +21,24 @@ import { BoardColumnRecoilScopeContext } from '../states/recoil-scope-contexts/B
import { BoardColumnDefinition } from '../types/BoardColumnDefinition'; import { BoardColumnDefinition } from '../types/BoardColumnDefinition';
import { BoardOptions } from '../types/BoardOptions'; import { BoardOptions } from '../types/BoardOptions';
import { EntityBoardColumn } from './EntityBoardColumn'; import { RecordBoardColumn } from './RecordBoardColumn';
export type EntityBoardProps = { 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: (columnId: string, title: string, color: string) => void;
}; };
const StyledBoard = styled.div`
border-top: 1px solid ${({ theme }) => theme.border.color.light};
display: flex;
flex: 1;
flex-direction: row;
margin-left: ${({ theme }) => theme.spacing(2)};
margin-right: ${({ theme }) => theme.spacing(2)};
`;
const StyledWrapper = styled.div` const StyledWrapper = styled.div`
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -45,11 +53,11 @@ const StyledBoardHeader = styled.div`
z-index: 1; z-index: 1;
`; `;
export const EntityBoard = ({ export const RecordBoard = ({
boardOptions, boardOptions,
onColumnDelete, onColumnDelete,
onEditColumnTitle, onEditColumnTitle,
}: EntityBoardProps) => { }: RecordBoardProps) => {
const boardColumns = useRecoilValue(boardColumnsState); const boardColumns = useRecoilValue(boardColumnsState);
const { updateOneObject: updateOneOpportunity } = const { updateOneObject: updateOneOpportunity } =
@ -140,7 +148,7 @@ export const EntityBoard = ({
CustomRecoilScopeContext={BoardColumnRecoilScopeContext} CustomRecoilScopeContext={BoardColumnRecoilScopeContext}
key={column.id} key={column.id}
> >
<EntityBoardColumn <RecordBoardColumn
boardOptions={boardOptions} boardOptions={boardOptions}
onDelete={onColumnDelete} onDelete={onColumnDelete}
onTitleEdit={onEditColumnTitle} onTitleEdit={onEditColumnTitle}

View File

@ -7,7 +7,7 @@ import { contextMenuPositionState } from '@/ui/navigation/context-menu/states/co
import { useCurrentCardSelected } from '../hooks/useCurrentCardSelected'; import { useCurrentCardSelected } from '../hooks/useCurrentCardSelected';
import { BoardOptions } from '../types/BoardOptions'; import { BoardOptions } from '../types/BoardOptions';
export const EntityBoardCard = ({ export const RecordBoardCard = ({
boardOptions, boardOptions,
cardId, cardId,
index, index,

View File

@ -0,0 +1,204 @@
import React, { useContext } from 'react';
import styled from '@emotion/styled';
import { Draggable, Droppable, DroppableProvided } from '@hello-pangea/dnd';
import { useRecoilValue } from 'recoil';
import { Tag } from '@/ui/display/tag/components/Tag';
import { RecordBoardCard } from '@/ui/object/record-board/components/RecordBoardCard';
import { BoardCardIdContext } from '@/ui/object/record-board/contexts/BoardCardIdContext';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
import { BoardColumnContext } from '../contexts/BoardColumnContext';
import { boardCardIdsByColumnIdFamilyState } from '../states/boardCardIdsByColumnIdFamilyState';
import { boardColumnTotalsFamilySelector } from '../states/selectors/boardColumnTotalsFamilySelector';
import { BoardColumnHotkeyScope } from '../types/BoardColumnHotkeyScope';
import { BoardOptions } from '../types/BoardOptions';
import { RecordBoardColumnDropdownMenu } from './RecordBoardColumnDropdownMenu';
const StyledPlaceholder = styled.div`
min-height: 1px;
`;
const StyledNewCardButtonContainer = styled.div`
padding-bottom: ${({ theme }) => theme.spacing(4)};
`;
const StyledColumnCardsContainer = styled.div`
display: flex;
flex: 1;
flex-direction: column;
`;
const StyledColumn = styled.div<{ isFirstColumn: boolean }>`
background-color: ${({ theme }) => theme.background.primary};
border-left: 1px solid
${({ theme, isFirstColumn }) =>
isFirstColumn ? 'none' : theme.border.color.light};
display: flex;
flex-direction: column;
max-width: 200px;
min-width: 200px;
padding: ${({ theme }) => theme.spacing(2)};
position: relative;
`;
const StyledHeader = styled.div`
align-items: center;
cursor: pointer;
display: flex;
flex-direction: row;
height: 24px;
justify-content: left;
margin-bottom: ${({ theme }) => theme.spacing(2)};
width: 100%;
`;
const StyledAmount = styled.div`
color: ${({ theme }) => theme.font.color.tertiary};
margin-left: ${({ theme }) => theme.spacing(2)};
`;
const StyledNumChildren = styled.div`
align-items: center;
background-color: ${({ theme }) => theme.background.tertiary};
border-radius: ${({ theme }) => theme.border.radius.rounded};
color: ${({ theme }) => theme.font.color.tertiary};
display: flex;
height: 20px;
justify-content: center;
line-height: ${({ theme }) => theme.text.lineHeight.lg};
margin-left: auto;
width: 16px;
`;
type BoardColumnCardsContainerProps = {
children: React.ReactNode;
droppableProvided: DroppableProvided;
};
type RecordBoardColumnProps = {
boardOptions: BoardOptions;
onDelete?: (columnId: string) => void;
onTitleEdit: (columnId: string, title: string, color: string) => void;
};
const BoardColumnCardsContainer = ({
children,
droppableProvided,
}: BoardColumnCardsContainerProps) => {
return (
<StyledColumnCardsContainer
ref={droppableProvided?.innerRef}
// eslint-disable-next-line react/jsx-props-no-spreading
{...droppableProvided?.droppableProps}
>
{children}
<StyledPlaceholder>{droppableProvided?.placeholder}</StyledPlaceholder>
</StyledColumnCardsContainer>
);
};
export const RecordBoardColumn = ({
boardOptions,
onDelete,
onTitleEdit,
}: RecordBoardColumnProps) => {
const column = useContext(BoardColumnContext);
const [isBoardColumnMenuOpen, setIsBoardColumnMenuOpen] =
React.useState(false);
const {
setHotkeyScopeAndMemorizePreviousScope,
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
const handleTitleClick = () => {
setIsBoardColumnMenuOpen(true);
setHotkeyScopeAndMemorizePreviousScope(BoardColumnHotkeyScope.BoardColumn, {
goto: false,
});
};
const handleClose = () => {
goBackToPreviousHotkeyScope();
setIsBoardColumnMenuOpen(false);
};
const boardColumnId = column?.id || '';
const boardColumnTotal = useRecoilValue(
boardColumnTotalsFamilySelector(boardColumnId),
);
const cardIds = useRecoilValue(
boardCardIdsByColumnIdFamilyState(boardColumnId),
);
const handleTitleEdit = (title: string, color: string) => {
onTitleEdit(boardColumnId, title, color);
};
if (!column) return <></>;
const { isFirstColumn, columnDefinition } = column;
return (
<Droppable droppableId={column.id}>
{(droppableProvided) => (
<StyledColumn isFirstColumn={isFirstColumn}>
<StyledHeader>
<Tag
onClick={handleTitleClick}
color={columnDefinition.colorCode ?? 'gray'}
text={columnDefinition.title}
/>
{!!boardColumnTotal && (
<StyledAmount>${boardColumnTotal}</StyledAmount>
)}
<StyledNumChildren>{cardIds.length}</StyledNumChildren>
</StyledHeader>
{isBoardColumnMenuOpen && (
<RecordBoardColumnDropdownMenu
onClose={handleClose}
onDelete={onDelete}
onTitleEdit={handleTitleEdit}
stageId={boardColumnId}
/>
)}
<BoardColumnCardsContainer droppableProvided={droppableProvided}>
{cardIds.map((cardId, index) => (
<BoardCardIdContext.Provider value={cardId} key={cardId}>
<RecordBoardCard
index={index}
cardId={cardId}
boardOptions={boardOptions}
/>
</BoardCardIdContext.Provider>
))}
<Draggable
draggableId={`new-${column.id}`}
index={cardIds.length}
isDragDisabled={true}
>
{(draggableProvided) => (
<div
ref={draggableProvided?.innerRef}
// eslint-disable-next-line react/jsx-props-no-spreading
{...draggableProvided?.draggableProps}
>
<StyledNewCardButtonContainer>
<RecoilScope>{boardOptions.newCardComponent}</RecoilScope>
</StyledNewCardButtonContainer>
</div>
)}
</Draggable>
</BoardColumnCardsContainer>
</StyledColumn>
)}
</Droppable>
);
};

View File

@ -25,7 +25,7 @@ import { BoardColumnContext } from '../contexts/BoardColumnContext';
import { useBoardColumns } from '../hooks/useBoardColumns'; import { useBoardColumns } from '../hooks/useBoardColumns';
import { BoardColumnHotkeyScope } from '../types/BoardColumnHotkeyScope'; import { BoardColumnHotkeyScope } from '../types/BoardColumnHotkeyScope';
import { BoardColumnEditTitleMenu } from './BoardColumnEditTitleMenu'; import { RecordBoardColumnEditTitleMenu } from './RecordBoardColumnEditTitleMenu';
const StyledMenuContainer = styled.div` const StyledMenuContainer = styled.div`
position: absolute; position: absolute;
top: ${({ theme }) => theme.spacing(10)}; top: ${({ theme }) => theme.spacing(10)};
@ -33,7 +33,7 @@ const StyledMenuContainer = styled.div`
z-index: 1; z-index: 1;
`; `;
type BoardColumnMenuProps = { type RecordBoardColumnDropdownMenuProps = {
onClose: () => void; onClose: () => void;
onDelete?: (id: string) => void; onDelete?: (id: string) => void;
onTitleEdit: (title: string, color: string) => void; onTitleEdit: (title: string, color: string) => void;
@ -42,12 +42,12 @@ type BoardColumnMenuProps = {
type Menu = 'actions' | 'add' | 'title'; type Menu = 'actions' | 'add' | 'title';
export const BoardColumnMenu = ({ export const RecordBoardColumnDropdownMenu = ({
onClose, onClose,
onDelete, onDelete,
onTitleEdit, onTitleEdit,
stageId, stageId,
}: BoardColumnMenuProps) => { }: RecordBoardColumnDropdownMenuProps) => {
const [currentMenu, setCurrentMenu] = useState('actions'); const [currentMenu, setCurrentMenu] = useState('actions');
const column = useContext(BoardColumnContext); const column = useContext(BoardColumnContext);
@ -160,7 +160,7 @@ export const BoardColumnMenu = ({
</DropdownMenuItemsContainer> </DropdownMenuItemsContainer>
)} )}
{currentMenu === 'title' && ( {currentMenu === 'title' && (
<BoardColumnEditTitleMenu <RecordBoardColumnEditTitleMenu
color={columnDefinition.colorCode ?? 'gray'} color={columnDefinition.colorCode ?? 'gray'}
onClose={closeMenu} onClose={closeMenu}
onTitleEdit={onTitleEdit} onTitleEdit={onTitleEdit}

View File

@ -40,7 +40,7 @@ const StyledEditModeInput = styled.input`
width: 100%; width: 100%;
`; `;
export type BoardColumnEditTitleMenuProps = { type RecordBoardColumnEditTitleMenuProps = {
onClose: () => void; onClose: () => void;
onDelete?: (id: string) => void; onDelete?: (id: string) => void;
title: string; title: string;
@ -67,14 +67,14 @@ export const COLUMN_COLOR_OPTIONS: ColumnColorOption[] = [
{ name: 'Gray', id: 'gray' }, { name: 'Gray', id: 'gray' },
]; ];
export const BoardColumnEditTitleMenu = ({ export const RecordBoardColumnEditTitleMenu = ({
onClose, onClose,
onDelete, onDelete,
stageId, stageId,
onTitleEdit, onTitleEdit,
title, title,
color, color,
}: BoardColumnEditTitleMenuProps) => { }: RecordBoardColumnEditTitleMenuProps) => {
const [internalValue, setInternalValue] = useState(title); const [internalValue, setInternalValue] = useState(title);
const [, setBoardColumns] = useRecoilState(boardColumnsState); const [, setBoardColumns] = useRecoilState(boardColumnsState);
const debouncedOnUpdateTitle = debounce( const debouncedOnUpdateTitle = debounce(

View File

@ -3,13 +3,13 @@ import { Meta, StoryObj } from '@storybook/react';
import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator'; import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator';
import { import {
BoardColumnEditTitleMenu,
COLUMN_COLOR_OPTIONS, COLUMN_COLOR_OPTIONS,
} from '../BoardColumnEditTitleMenu'; RecordBoardColumnEditTitleMenu,
} from '../RecordBoardColumnEditTitleMenu';
const meta: Meta<typeof BoardColumnEditTitleMenu> = { const meta: Meta<typeof RecordBoardColumnEditTitleMenu> = {
title: 'UI/Layout/Board/BoardColumnMenu', title: 'UI/Layout/Board/BoardColumnMenu',
component: BoardColumnEditTitleMenu, component: RecordBoardColumnEditTitleMenu,
decorators: [ComponentDecorator], decorators: [ComponentDecorator],
argTypes: { argTypes: {
color: { color: {
@ -21,6 +21,6 @@ const meta: Meta<typeof BoardColumnEditTitleMenu> = {
}; };
export default meta; export default meta;
type Story = StoryObj<typeof BoardColumnEditTitleMenu>; type Story = StoryObj<typeof RecordBoardColumnEditTitleMenu>;
export const AllTags: Story = {}; export const AllTags: Story = {};

View File

@ -3,9 +3,9 @@ import { useRecoilValue } from 'recoil';
import { ContextMenu } from '@/ui/navigation/context-menu/components/ContextMenu'; import { ContextMenu } from '@/ui/navigation/context-menu/components/ContextMenu';
import { selectedCardIdsSelector } from '../states/selectors/selectedCardIdsSelector'; import { selectedCardIdsSelector } from '../../states/selectors/selectedCardIdsSelector';
export const EntityBoardContextMenu = () => { export const RecordBoardContextMenu = () => {
const selectedCardIds = useRecoilValue(selectedCardIdsSelector); const selectedCardIds = useRecoilValue(selectedCardIdsSelector);
return <ContextMenu selectedIds={selectedCardIds}></ContextMenu>; return <ContextMenu selectedIds={selectedCardIds}></ContextMenu>;
}; };

View File

@ -1,5 +1,5 @@
import { createContext } from 'react'; import { createContext } from 'react';
import { BoardOptions } from '@/ui/layout/board/types/BoardOptions'; import { BoardOptions } from '@/ui/object/record-board/types/BoardOptions';
export const BoardOptionsContext = createContext<BoardOptions | null>(null); export const BoardOptionsContext = createContext<BoardOptions | null>(null);

View File

@ -2,8 +2,8 @@ import { useCallback } from 'react';
import { useSetRecoilState } from 'recoil'; import { useSetRecoilState } from 'recoil';
import { IconTrash } from '@/ui/display/icon'; import { IconTrash } from '@/ui/display/icon';
import { useDeleteSelectedBoardCards } from '@/ui/layout/board/hooks/useDeleteSelectedBoardCards';
import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionBarEntriesState'; import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionBarEntriesState';
import { useDeleteSelectedBoardCards } from '@/ui/object/record-board/hooks/useDeleteSelectedBoardCards';
export const useBoardActionBarEntries = () => { export const useBoardActionBarEntries = () => {
const setActionBarEntriesRecoil = useSetRecoilState(actionBarEntriesState); const setActionBarEntriesRecoil = useSetRecoilState(actionBarEntriesState);

View File

@ -1,8 +1,8 @@
import { useCallback } from 'react'; import { useCallback } from 'react';
import { savedBoardCardFieldsFamilyState } from '@/ui/layout/board/states/savedBoardCardFieldsFamilyState';
import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { savedBoardCardFieldsFamilyState } from '@/ui/object/record-board/states/savedBoardCardFieldsFamilyState';
import { BoardFieldDefinition } from '@/ui/object/record-board/types/BoardFieldDefinition';
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition'; import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';

View File

@ -2,8 +2,8 @@ import { useCallback } from 'react';
import { useSetRecoilState } from 'recoil'; import { useSetRecoilState } from 'recoil';
import { IconTrash } from '@/ui/display/icon'; import { IconTrash } from '@/ui/display/icon';
import { useDeleteSelectedBoardCards } from '@/ui/layout/board/hooks/useDeleteSelectedBoardCards';
import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState'; import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState';
import { useDeleteSelectedBoardCards } from '@/ui/object/record-board/hooks/useDeleteSelectedBoardCards';
export const useBoardContextMenuEntries = () => { export const useBoardContextMenuEntries = () => {
const setContextMenuEntriesRecoil = useSetRecoilState( const setContextMenuEntriesRecoil = useSetRecoilState(

View File

@ -1,8 +1,8 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilCallback, useRecoilValue, useSetRecoilState } from 'recoil'; import { useRecoilCallback, useRecoilValue, useSetRecoilState } from 'recoil';
import { activeCardIdsState } from '@/ui/layout/board/states/activeCardIdsState';
import { actionBarOpenState } from '@/ui/navigation/action-bar/states/actionBarIsOpenState'; import { actionBarOpenState } from '@/ui/navigation/action-bar/states/actionBarIsOpenState';
import { activeCardIdsState } from '@/ui/object/record-board/states/activeCardIdsState';
import { BoardCardIdContext } from '../contexts/BoardCardIdContext'; import { BoardCardIdContext } from '../contexts/BoardCardIdContext';
import { isCardSelectedFamilyState } from '../states/isCardSelectedFamilyState'; import { isCardSelectedFamilyState } from '../states/isCardSelectedFamilyState';

View File

@ -1,10 +1,10 @@
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { Dropdown } from '../../dropdown/components/Dropdown'; import { Dropdown } from '../../../../layout/dropdown/components/Dropdown';
import { DropdownScope } from '../../dropdown/scopes/DropdownScope'; import { DropdownScope } from '../../../../layout/dropdown/scopes/DropdownScope';
import { BoardOptionsHotkeyScope } from '../types/BoardOptionsHotkeyScope'; import { BoardOptionsDropdownId } from '../../components/constants/BoardOptionsDropdownId';
import { BoardOptionsHotkeyScope } from '../../types/BoardOptionsHotkeyScope';
import { BoardOptionsDropdownId } from './constants/BoardOptionsDropdownId';
import { BoardOptionsDropdownButton } from './BoardOptionsDropdownButton'; import { BoardOptionsDropdownButton } from './BoardOptionsDropdownButton';
import { import {
BoardOptionsDropdownContent, BoardOptionsDropdownContent,

View File

@ -28,13 +28,13 @@ import { ViewFieldsVisibilityDropdownSection } from '@/views/components/ViewFiel
import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates';
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { useBoardCardFields } from '../hooks/useBoardCardFields'; import { useBoardCardFields } from '../../hooks/useBoardCardFields';
import { boardColumnsState } from '../states/boardColumnsState'; import { boardColumnsState } from '../../states/boardColumnsState';
import { isCompactViewEnabledState } from '../states/isCompactViewEnabledState'; import { isCompactViewEnabledState } from '../../states/isCompactViewEnabledState';
import { hiddenBoardCardFieldsScopedSelector } from '../states/selectors/hiddenBoardCardFieldsScopedSelector'; import { hiddenBoardCardFieldsScopedSelector } from '../../states/selectors/hiddenBoardCardFieldsScopedSelector';
import { visibleBoardCardFieldsScopedSelector } from '../states/selectors/visibleBoardCardFieldsScopedSelector'; import { visibleBoardCardFieldsScopedSelector } from '../../states/selectors/visibleBoardCardFieldsScopedSelector';
import { BoardColumnDefinition } from '../types/BoardColumnDefinition'; import { BoardColumnDefinition } from '../../types/BoardColumnDefinition';
import { BoardOptionsHotkeyScope } from '../types/BoardOptionsHotkeyScope'; import { BoardOptionsHotkeyScope } from '../../types/BoardOptionsHotkeyScope';
export type BoardOptionsDropdownContentProps = { export type BoardOptionsDropdownContentProps = {
onStageAdd?: (boardColumn: BoardColumnDefinition) => void; onStageAdd?: (boardColumn: BoardColumnDefinition) => void;

View File

@ -1,6 +1,6 @@
import { atom } from 'recoil'; import { atom } from 'recoil';
import { BoardColumnDefinition } from '@/ui/layout/board/types/BoardColumnDefinition'; import { BoardColumnDefinition } from '@/ui/object/record-board/types/BoardColumnDefinition';
export const boardColumnsState = atom<BoardColumnDefinition[]>({ export const boardColumnsState = atom<BoardColumnDefinition[]>({
key: 'boardColumnsState', key: 'boardColumnsState',

View File

@ -1,4 +1,4 @@
import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition'; import { BoardFieldDefinition } from '@/ui/object/record-board/types/BoardFieldDefinition';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition'; import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';

View File

@ -1,5 +1,5 @@
import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { BoardFieldDefinition } from '@/ui/object/record-board/types/BoardFieldDefinition';
import { assertNotNull } from '~/utils/assert'; import { assertNotNull } from '~/utils/assert';
import { ViewField } from '../types/ViewField'; import { ViewField } from '../types/ViewField';

View File

@ -7,10 +7,10 @@ import { PipelineAddButton } from '@/pipeline/components/PipelineAddButton';
import { usePipelineSteps } from '@/pipeline/hooks/usePipelineSteps'; import { usePipelineSteps } from '@/pipeline/hooks/usePipelineSteps';
import { PipelineStep } from '@/pipeline/types/PipelineStep'; import { PipelineStep } from '@/pipeline/types/PipelineStep';
import { IconTargetArrow } from '@/ui/display/icon'; import { IconTargetArrow } from '@/ui/display/icon';
import { BoardOptionsContext } from '@/ui/layout/board/contexts/BoardOptionsContext';
import { PageBody } from '@/ui/layout/page/PageBody'; import { PageBody } from '@/ui/layout/page/PageBody';
import { PageContainer } from '@/ui/layout/page/PageContainer'; import { PageContainer } from '@/ui/layout/page/PageContainer';
import { PageHeader } from '@/ui/layout/page/PageHeader'; import { PageHeader } from '@/ui/layout/page/PageHeader';
import { BoardOptionsContext } from '@/ui/object/record-board/contexts/BoardOptionsContext';
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope'; import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
import { opportunitiesBoardOptions } from '~/pages/opportunities/opportunitiesBoardOptions'; import { opportunitiesBoardOptions } from '~/pages/opportunities/opportunitiesBoardOptions';

View File

@ -1,6 +1,6 @@
import { CompanyBoardCard } from '@/companies/components/CompanyBoardCard'; import { CompanyBoardCard } from '@/companies/components/CompanyBoardCard';
import { NewCompanyProgressButton } from '@/companies/components/NewCompanyProgressButton'; import { NewCompanyProgressButton } from '@/companies/components/NewCompanyProgressButton';
import { BoardOptions } from '@/ui/layout/board/types/BoardOptions'; import { BoardOptions } from '@/ui/object/record-board/types/BoardOptions';
import { opportunityBoardFilterDefinitions } from './constants/opportunityBoardFilterDefinitions'; import { opportunityBoardFilterDefinitions } from './constants/opportunityBoardFilterDefinitions';
import { opportunityBoardSortDefinitions } from './constants/opportunityBoardSortDefinitions'; import { opportunityBoardSortDefinitions } from './constants/opportunityBoardSortDefinitions';