diff --git a/packages/twenty-front/src/modules/companies/__stories__/Board.stories.tsx b/packages/twenty-front/src/modules/companies/__stories__/Board.stories.tsx deleted file mode 100644 index e86244248..000000000 --- a/packages/twenty-front/src/modules/companies/__stories__/Board.stories.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator'; -import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; -import { graphqlMocks } from '~/testing/graphqlMocks'; - -import { CompanyBoard } from '../board/components/CompanyBoard'; - -const DoNotRenderEffect = () => <>; - -const meta: Meta = { - title: 'Modules/Companies/Board', - component: DoNotRenderEffect, - decorators: [ComponentWithRouterDecorator, SnackBarDecorator], - parameters: { - msw: graphqlMocks, - }, -}; - -export default meta; -type Story = StoryObj; - -// FIXME: CompanyBoard is re-rendering so much and exceeding the maximum update depth for some reason. -export const OneColumnBoard: Story = {}; diff --git a/packages/twenty-front/src/modules/companies/__stories__/CompanyChip.stories.tsx b/packages/twenty-front/src/modules/companies/__stories__/CompanyChip.stories.tsx deleted file mode 100644 index 34b9e695c..000000000 --- a/packages/twenty-front/src/modules/companies/__stories__/CompanyChip.stories.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator'; - -import { CompanyChip } from '../components/CompanyChip'; - -const meta: Meta = { - title: 'Modules/Companies/CompanyChip', - component: CompanyChip, - decorators: [ComponentWithRouterDecorator], -}; - -export default meta; -type Story = StoryObj; - -export const SmallName: Story = { - args: { - opportunityId: 'airbnb', - companyName: 'Airbnb', - avatarUrl: 'https://api.faviconkit.com/airbnb.com/144', - }, -}; - -export const BigName: Story = { - args: { - opportunityId: 'google', - companyName: 'Google with a real big name to overflow the cell', - avatarUrl: 'https://api.faviconkit.com/google.com/144', - }, -}; diff --git a/packages/twenty-front/src/modules/companies/__stories__/mock-data.ts b/packages/twenty-front/src/modules/companies/__stories__/mock-data.ts deleted file mode 100644 index 6bfc08feb..000000000 --- a/packages/twenty-front/src/modules/companies/__stories__/mock-data.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -export const pipelineSteps = [ - { - id: 'pipeline-stage-1', - name: 'New', - position: 0, - color: 'red', - }, - { - id: 'pipeline-stage-2', - name: 'Screening', - position: 1, - color: 'purple', - }, - { - id: 'pipeline-stage-3', - name: 'Meeting', - position: 2, - color: 'sky', - }, - { - id: 'pipeline-stage-4', - name: 'Proposal', - position: 3, - color: 'turquoise', - }, - { - id: 'pipeline-stage-5', - name: 'Customer', - position: 4, - color: 'yellow', - }, -] as PipelineStep[]; diff --git a/packages/twenty-front/src/modules/companies/board/components/CompanyBoard.tsx b/packages/twenty-front/src/modules/companies/board/components/CompanyBoard.tsx deleted file mode 100644 index 48bbf277f..000000000 --- a/packages/twenty-front/src/modules/companies/board/components/CompanyBoard.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { useCallback } from 'react'; -import styled from '@emotion/styled'; - -import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields'; -import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; -import { - RecordBoardDeprecated, - RecordBoardDeprecatedProps, -} from '@/object-record/record-board-deprecated/components/RecordBoardDeprecated'; -import { RecordBoardDeprecatedEffect } from '@/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect'; -import { BOARD_OPTIONS_DROPDOWN_ID } from '@/object-record/record-board-deprecated/constants/BoardOptionsDropdownId'; -import { RecordBoardDeprecatedOptionsDropdown } from '@/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdown'; -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; -import { ViewBar } from '@/views/components/ViewBar'; -import { useViewFields } from '@/views/hooks/internal/useViewFields'; -import { opportunitiesBoardOptions } from '~/pages/opportunities/opportunitiesBoardOptions'; - -import { HooksCompanyBoardEffect } from '../../components/HooksCompanyBoardEffect'; - -const StyledContainer = styled.div` - display: flex; - flex-direction: column; - height: 100%; - overflow: auto; - width: 100%; -`; - -type CompanyBoardProps = Pick< - RecordBoardDeprecatedProps, - 'onColumnAdd' | 'onColumnDelete' | 'onEditColumnTitle' ->; - -export const CompanyBoard = ({ - onColumnAdd, - onColumnDelete, - onEditColumnTitle, -}: CompanyBoardProps) => { - const viewBarId = 'company-board-view'; - const recordBoardId = 'company-board'; - - const { persistViewFields } = useViewFields(viewBarId); - - const { createOneRecord } = useCreateOneRecord({ - objectNameSingular: 'pipelineStep', - }); - - const onStageAdd = useCallback( - (stage: BoardColumnDefinition) => { - createOneRecord({ - name: stage.title, - color: stage.colorCode, - position: stage.position, - id: stage.id, - }); - }, - [createOneRecord], - ); - - return ( - - - } - optionsDropdownScopeId={BOARD_OPTIONS_DROPDOWN_ID} - /> - - - { - persistViewFields(mapBoardFieldDefinitionsToViewFields(fields)); - }} - /> - - - - ); -}; diff --git a/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx b/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx deleted file mode 100644 index 59e81cecf..000000000 --- a/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx +++ /dev/null @@ -1,255 +0,0 @@ -import { ReactNode, useContext } from 'react'; -import styled from '@emotion/styled'; -import { useRecoilState, useRecoilValue } from 'recoil'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; -import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext'; -import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { isRecordBoardDeprecatedCardInCompactViewFamilyState } from '@/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState'; -import { - FieldContext, - RecordUpdateHook, - RecordUpdateHookParams, -} from '@/object-record/record-field/contexts/FieldContext'; -import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; -import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope'; -import { EntityChipVariant } from '@/ui/display/chip/components/EntityChip'; -import { IconEye } from '@/ui/display/icon/index'; -import { LightIconButton } from '@/ui/input/button/components/LightIconButton'; -import { Checkbox, CheckboxVariant } from '@/ui/input/components/Checkbox'; -import { AnimatedEaseInOut } from '@/ui/utilities/animation/components/AnimatedEaseInOut'; -import { getLogoUrlFromDomainName } from '~/utils'; - -import { companyProgressesFamilyState } from '../states/companyProgressesFamilyState'; - -import { CompanyChip } from './CompanyChip'; - -const StyledBoardCard = styled.div<{ selected: boolean }>` - background-color: ${({ theme, selected }) => - selected ? theme.accent.quaternary : theme.background.secondary}; - border: 1px solid - ${({ theme, selected }) => - selected ? theme.accent.secondary : theme.border.color.medium}; - border-radius: ${({ theme }) => theme.border.radius.sm}; - box-shadow: ${({ theme }) => theme.boxShadow.light}; - color: ${({ theme }) => theme.font.color.primary}; - &:hover { - background-color: ${({ theme, selected }) => - selected && theme.accent.tertiary}; - border: 1px solid - ${({ theme, selected }) => - selected ? theme.accent.primary : theme.border.color.medium}; - } - cursor: pointer; - - .checkbox-container { - transition: all ease-in-out 160ms; - opacity: ${({ selected }) => (selected ? 1 : 0)}; - } - - &:hover .checkbox-container { - opacity: 1; - } - - .compact-icon-container { - transition: all ease-in-out 160ms; - opacity: 0; - } - &:hover .compact-icon-container { - opacity: 1; - } -`; - -const StyledBoardCardWrapper = styled.div` - padding-bottom: ${({ theme }) => theme.spacing(2)}; - width: 100%; -`; - -const StyledBoardCardHeader = styled.div<{ - showCompactView: boolean; -}>` - align-items: center; - display: flex; - flex-direction: row; - font-weight: ${({ theme }) => theme.font.weight.medium}; - height: 24px; - padding-bottom: ${({ theme, showCompactView }) => - theme.spacing(showCompactView ? 0 : 1)}; - padding-left: ${({ theme }) => theme.spacing(2)}; - padding-right: ${({ theme }) => theme.spacing(2)}; - padding-top: ${({ theme }) => theme.spacing(2)}; - transition: padding ease-in-out 160ms; - - img { - height: ${({ theme }) => theme.icon.size.md}px; - margin-right: ${({ theme }) => theme.spacing(2)}; - object-fit: cover; - width: ${({ theme }) => theme.icon.size.md}px; - } -`; - -const StyledBoardCardBody = styled.div` - display: flex; - flex-direction: column; - gap: ${({ theme }) => theme.spacing(0.5)}; - padding-bottom: ${({ theme }) => theme.spacing(2)}; - padding-left: ${({ theme }) => theme.spacing(2.5)}; - padding-right: ${({ theme }) => theme.spacing(2)}; - span { - align-items: center; - display: flex; - flex-direction: row; - svg { - color: ${({ theme }) => theme.font.color.tertiary}; - margin-right: ${({ theme }) => theme.spacing(2)}; - } - } -`; - -const StyledCheckboxContainer = styled.div` - display: flex; - flex: 1; - justify-content: end; -`; - -const StyledFieldContainer = styled.div` - display: flex; - flex-direction: row; - width: 100%; -`; - -const StyledCompactIconContainer = styled.div` - align-items: center; - display: flex; - justify-content: center; -`; - -export const CompanyBoardCard = () => { - const { isCurrentCardSelected, setCurrentCardSelected } = - useCurrentRecordBoardDeprecatedCardSelectedInternal(); - const boardCardId = useContext(BoardCardIdContext); - - const [companyProgress] = useRecoilState( - companyProgressesFamilyState(boardCardId ?? ''), - ); - - const { isCompactViewEnabledState, visibleBoardCardFieldsSelector } = - useRecordBoardDeprecatedScopedStates(); - - const [isCompactViewEnabled] = useRecoilState(isCompactViewEnabledState); - - const [isCardInCompactView, setIsCardInCompactView] = useRecoilState( - isRecordBoardDeprecatedCardInCompactViewFamilyState(boardCardId ?? ''), - ); - - const showCompactView = isCompactViewEnabled && isCardInCompactView; - - const { opportunity, company } = companyProgress ?? {}; - - const visibleBoardCardFields = useRecoilValue(visibleBoardCardFieldsSelector); - - const useUpdateOneRecordMutation: RecordUpdateHook = () => { - const { updateOneRecord: updateOneOpportunity } = useUpdateOneRecord({ - objectNameSingular: CoreObjectNameSingular.Opportunity, - }); - - const updateEntity = ({ variables }: RecordUpdateHookParams) => { - updateOneOpportunity?.({ - idToUpdate: variables.where.id as string, - updateOneRecordInput: variables.updateOneRecordInput, - }); - }; - - return [updateEntity, { loading: false }]; - }; - - // boardCardId check can be moved to a wrapper to avoid unnecessary logic above - if (!company || !opportunity || !boardCardId) { - return null; - } - - const PreventSelectOnClickContainer = ({ - children, - }: { - children: ReactNode; - }) => ( - { - e.stopPropagation(); - }} - > - {children} - - ); - - const OnMouseLeaveBoard = () => { - setIsCardInCompactView(true); - }; - - return ( - - setCurrentCardSelected(!isCurrentCardSelected)} - > - - - {showCompactView && ( - - { - e.stopPropagation(); - setIsCardInCompactView(false); - }} - /> - - )} - - setCurrentCardSelected(!isCurrentCardSelected)} - variant={CheckboxVariant.Secondary} - /> - - - - - {visibleBoardCardFields.map((viewField) => ( - - - - - - ))} - - - - - ); -}; diff --git a/packages/twenty-front/src/modules/companies/components/CompanyChip.tsx b/packages/twenty-front/src/modules/companies/components/CompanyChip.tsx deleted file mode 100644 index 3fd892106..000000000 --- a/packages/twenty-front/src/modules/companies/components/CompanyChip.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { - EntityChip, - EntityChipVariant, -} from '@/ui/display/chip/components/EntityChip'; - -type CompanyChipProps = { - opportunityId: string; - companyName: string; - avatarUrl?: string; - variant?: EntityChipVariant; -}; - -export const CompanyChip = ({ - opportunityId, - companyName, - avatarUrl, - variant = EntityChipVariant.Regular, -}: CompanyChipProps) => ( - -); diff --git a/packages/twenty-front/src/modules/companies/components/HooksCompanyBoardEffect.tsx b/packages/twenty-front/src/modules/companies/components/HooksCompanyBoardEffect.tsx deleted file mode 100644 index eb955d344..000000000 --- a/packages/twenty-front/src/modules/companies/components/HooksCompanyBoardEffect.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { useEffect } from 'react'; -import { useRecoilValue } from 'recoil'; - -import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; -import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { availableRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState'; -import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState'; -import { recordBoardFiltersScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedFiltersScopedState'; -import { recordBoardSortsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedSortsScopedState'; -import { useSetRecoilScopedStateV2 } from '@/ui/utilities/recoil-scope/hooks/useSetRecoilScopedStateV2'; -import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; -import { useViewBar } from '@/views/hooks/useViewBar'; -import { mapViewFieldsToBoardFieldDefinitions } from '@/views/utils/mapViewFieldsToBoardFieldDefinitions'; - -type HooksCompanyBoardEffectProps = { - viewBarId: string; - recordBoardId: string; -}; - -export const HooksCompanyBoardEffect = ({ - viewBarId, - recordBoardId, -}: HooksCompanyBoardEffectProps) => { - const { - setAvailableFilterDefinitions, - setAvailableSortDefinitions, - setAvailableFieldDefinitions, - setViewObjectMetadataId, - } = useViewBar({ viewBarId }); - - const { objectMetadataItem } = useObjectMetadataItem({ - objectNameSingular: CoreObjectNameSingular.Opportunity, - }); - - const { columnDefinitions, filterDefinitions, sortDefinitions } = - useColumnDefinitionsFromFieldMetadata(objectMetadataItem); - - const setAvailableBoardCardFields = useSetRecoilScopedStateV2( - availableRecordBoardDeprecatedCardFieldsScopedState, - 'company-board', - ); - - useEffect(() => { - if (!objectMetadataItem) { - return; - } - setAvailableFilterDefinitions?.(filterDefinitions); - setAvailableSortDefinitions?.(sortDefinitions); - setAvailableFieldDefinitions?.(columnDefinitions); - }, [ - columnDefinitions, - filterDefinitions, - objectMetadataItem, - setAvailableFieldDefinitions, - setAvailableFilterDefinitions, - setAvailableSortDefinitions, - sortDefinitions, - ]); - - useEffect(() => { - setAvailableBoardCardFields(columnDefinitions); - }, [columnDefinitions, setAvailableBoardCardFields]); - - useEffect(() => { - if (!objectMetadataItem) { - return; - } - setViewObjectMetadataId?.(objectMetadataItem.id); - }, [objectMetadataItem, setViewObjectMetadataId]); - - const { - currentViewFieldsState, - currentViewFiltersState, - currentViewSortsState, - } = useViewScopedStates({ viewScopeId: viewBarId }); - - const currentViewFields = useRecoilValue(currentViewFieldsState); - const currentViewFilters = useRecoilValue(currentViewFiltersState); - const currentViewSorts = useRecoilValue(currentViewSortsState); - - //TODO: Modify to use scopeId - const setBoardCardFields = useSetRecoilScopedStateV2( - recordBoardCardFieldsScopedState, - 'company-board', - ); - const setBoardCardFilters = useSetRecoilScopedStateV2( - recordBoardFiltersScopedState, - 'company-board', - ); - - const setBoardCardSorts = useSetRecoilScopedStateV2( - recordBoardSortsScopedState, - 'company-board', - ); - - useEffect(() => { - if (currentViewFields) { - setBoardCardFields( - mapViewFieldsToBoardFieldDefinitions( - currentViewFields, - columnDefinitions, - ), - ); - } - }, [columnDefinitions, currentViewFields, setBoardCardFields]); - - useEffect(() => { - if (currentViewFilters) { - setBoardCardFilters(currentViewFilters); - } - }, [currentViewFilters, setBoardCardFilters]); - - useEffect(() => { - if (currentViewSorts) { - setBoardCardSorts(currentViewSorts); - } - }, [currentViewSorts, setBoardCardSorts]); - - const { setEntityCountInCurrentView } = useViewBar({ viewBarId }); - - const { savedOpportunitiesState } = useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: recordBoardId, - }); - - const savedOpportunities = useRecoilValue(savedOpportunitiesState); - - useEffect(() => { - setEntityCountInCurrentView(savedOpportunities.length); - }, [savedOpportunities.length, setEntityCountInCurrentView]); - - return <>; -}; diff --git a/packages/twenty-front/src/modules/companies/components/NewOpportunityButton.tsx b/packages/twenty-front/src/modules/companies/components/NewOpportunityButton.tsx deleted file mode 100644 index 193adfbed..000000000 --- a/packages/twenty-front/src/modules/companies/components/NewOpportunityButton.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { useCallback, useContext, useState } from 'react'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { NewButton } from '@/object-record/record-board-deprecated/components/NewButton'; -import { BoardColumnContext } from '@/object-record/record-board-deprecated/contexts/BoardColumnContext'; -import { useCreateOpportunity } from '@/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity'; -import { SingleEntitySelect } from '@/object-record/relation-picker/components/SingleEntitySelect'; -import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; -import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; -import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; - -export const NewOpportunityButton = () => { - const [isCreatingCard, setIsCreatingCard] = useState(false); - const column = useContext(BoardColumnContext); - - const pipelineStepId = column?.columnDefinition.id || ''; - - const { enqueueSnackBar } = useSnackBar(); - const createOpportunity = useCreateOpportunity(); - - const { - goBackToPreviousHotkeyScope, - setHotkeyScopeAndMemorizePreviousScope, - } = usePreviousHotkeyScope(); - - const handleEntitySelect = (company: any) => { - setIsCreatingCard(false); - goBackToPreviousHotkeyScope(); - - if (!pipelineStepId) { - enqueueSnackBar('Pipeline stage id is not defined', { - variant: 'error', - }); - - throw new Error('Pipeline stage id is not defined'); - } - - createOpportunity(company.id, pipelineStepId); - }; - - const handleNewClick = useCallback(() => { - setIsCreatingCard(true); - setHotkeyScopeAndMemorizePreviousScope( - RelationPickerHotkeyScope.RelationPicker, - ); - }, [setIsCreatingCard, setHotkeyScopeAndMemorizePreviousScope]); - - const handleCancel = () => { - goBackToPreviousHotkeyScope(); - setIsCreatingCard(false); - }; - - return ( - <> - {isCreatingCard ? ( - - ) : ( - - )} - - ); -}; diff --git a/packages/twenty-front/src/modules/companies/components/OpportunityPicker.tsx b/packages/twenty-front/src/modules/companies/components/OpportunityPicker.tsx deleted file mode 100644 index 2e5bc3970..000000000 --- a/packages/twenty-front/src/modules/companies/components/OpportunityPicker.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { useEffect, useMemo, useRef, useState } from 'react'; -import { useRecoilValue } from 'recoil'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { SingleEntitySelectMenuItemsWithSearch } from '@/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch'; -import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect'; -import { currentPipelineStepsState } from '@/pipeline/states/currentPipelineStepsState'; -import { IconChevronDown } from '@/ui/display/icon'; -import { DropdownMenu } from '@/ui/layout/dropdown/components/DropdownMenu'; -import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader'; -import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; -import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; -import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; - -export type OpportunityPickerProps = { - companyId: string | null; - onSubmit: ( - newCompany: EntityForSelect | null, - newPipelineStepId: string | null, - ) => void; - onCancel?: () => void; -}; - -export const OpportunityPicker = ({ - onSubmit, - onCancel, -}: OpportunityPickerProps) => { - const containerRef = useRef(null); - - const [isProgressSelectionUnfolded, setIsProgressSelectionUnfolded] = - useState(false); - - const [selectedPipelineStepId, setSelectedPipelineStepId] = useState< - string | null - >(null); - - const currentPipelineSteps = useRecoilValue(currentPipelineStepsState); - - const handlePipelineStepChange = (newPipelineStepId: string) => { - setSelectedPipelineStepId(newPipelineStepId); - setIsProgressSelectionUnfolded(false); - }; - - const handleEntitySelected = async ( - selectedCompany: EntityForSelect | null | undefined, - ) => { - onSubmit(selectedCompany ?? null, selectedPipelineStepId); - }; - - useEffect(() => { - if (currentPipelineSteps?.[0]?.id) { - setSelectedPipelineStepId(currentPipelineSteps?.[0]?.id); - } - }, [currentPipelineSteps]); - - const selectedPipelineStep = useMemo( - () => - currentPipelineSteps.find( - (pipelineStep: any) => pipelineStep.id === selectedPipelineStepId, - ), - [currentPipelineSteps, selectedPipelineStepId], - ); - - return ( - - {isProgressSelectionUnfolded ? ( - - {currentPipelineSteps.map((pipelineStep: any, index: number) => ( - { - handlePipelineStepChange(pipelineStep.id); - }} - text={pipelineStep.name} - /> - ))} - - ) : ( - <> - setIsProgressSelectionUnfolded(true)} - > - {selectedPipelineStep?.name} - - - - - )} - - ); -}; diff --git a/packages/twenty-front/src/modules/companies/editable-field/types/EditableFieldHotkeyScope.ts b/packages/twenty-front/src/modules/companies/editable-field/types/EditableFieldHotkeyScope.ts deleted file mode 100644 index 309495c8f..000000000 --- a/packages/twenty-front/src/modules/companies/editable-field/types/EditableFieldHotkeyScope.ts +++ /dev/null @@ -1,3 +0,0 @@ -export enum EditableFieldHotkeyScope { - EditableField = 'editable-field', -} diff --git a/packages/twenty-front/src/modules/companies/states/companyProgressesFamilyState.ts b/packages/twenty-front/src/modules/companies/states/companyProgressesFamilyState.ts deleted file mode 100644 index 5b920ef30..000000000 --- a/packages/twenty-front/src/modules/companies/states/companyProgressesFamilyState.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { atomFamily } from 'recoil'; - -import { CompanyProgress } from '@/companies/types/CompanyProgress'; - -export const companyProgressesFamilyState = atomFamily< - CompanyProgress | undefined, - string ->({ - key: 'companyProgressesFamilyState', - default: undefined, -}); diff --git a/packages/twenty-front/src/modules/companies/states/recoil-scope-contexts/CompanyBoardViewBarRecoilScopeContext.ts b/packages/twenty-front/src/modules/companies/states/recoil-scope-contexts/CompanyBoardViewBarRecoilScopeContext.ts deleted file mode 100644 index d5e5436e0..000000000 --- a/packages/twenty-front/src/modules/companies/states/recoil-scope-contexts/CompanyBoardViewBarRecoilScopeContext.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createContext } from 'react'; - -export const CompanyBoardViewBarRecoilScopeContext = createContext< - string | null ->(null); diff --git a/packages/twenty-front/src/modules/companies/types/CompanyProgress.ts b/packages/twenty-front/src/modules/companies/types/CompanyProgress.ts deleted file mode 100644 index ab797dca2..000000000 --- a/packages/twenty-front/src/modules/companies/types/CompanyProgress.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Company } from '@/companies/types/Company'; -import { Opportunity } from '@/pipeline/types/Opportunity'; - -export type CompanyForBoard = Pick; - -export type CompanyProgress = { - company: CompanyForBoard; - opportunity: Opportunity; -}; - -export type CompanyProgressDict = { - [key: string]: CompanyProgress; -}; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordBoard.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordBoard.test.tsx deleted file mode 100644 index a294d9d59..000000000 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordBoard.test.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; -import { renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; - -import { useObjectRecordBoardDeprecated } from '@/object-record/hooks/useObjectRecordBoardDeprecated'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; - -const recordBoardId = '783932a0-28c7-4607-b2ce-6543fa2be892'; - -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); - -describe('useObjectRecordBoardDeprecated', () => { - it('should skip fetch if currentWorkspace is undefined', async () => { - const { result } = renderHook(() => useObjectRecordBoardDeprecated(), { - wrapper: Wrapper, - }); - - expect(result.current.loading).toBe(false); - expect(Array.isArray(result.current.opportunities)).toBe(true); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useObjectRecordBoardDeprecated.ts b/packages/twenty-front/src/modules/object-record/hooks/useObjectRecordBoardDeprecated.ts deleted file mode 100644 index 84c6d3112..000000000 --- a/packages/twenty-front/src/modules/object-record/hooks/useObjectRecordBoardDeprecated.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { useCallback } from 'react'; -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; - -import { Company } from '@/companies/types/Company'; -import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { turnObjectDropdownFilterIntoQueryFilter } from '@/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter'; -import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; -import { Opportunity } from '@/pipeline/types/Opportunity'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -import { useFindManyRecords } from './useFindManyRecords'; - -export const useObjectRecordBoardDeprecated = () => { - const objectNameSingular = 'opportunity'; - - const { objectMetadataItem: foundObjectMetadataItem } = useObjectMetadataItem( - { - objectNameSingular, - }, - ); - - const { - isBoardLoadedState, - boardFiltersState, - boardSortsState, - savedCompaniesState, - savedOpportunitiesState, - savedPipelineStepsState, - } = useRecordBoardDeprecatedScopedStates(); - - const setIsBoardLoaded = useSetRecoilState(isBoardLoadedState); - - const boardFilters = useRecoilValue(boardFiltersState); - const boardSorts = useRecoilValue(boardSortsState); - - const setSavedCompanies = useSetRecoilState(savedCompaniesState); - - const [savedOpportunities] = useRecoilState(savedOpportunitiesState); - - const [savedPipelineSteps, setSavedPipelineSteps] = useRecoilState( - savedPipelineStepsState, - ); - - const filter = turnObjectDropdownFilterIntoQueryFilter( - boardFilters, - foundObjectMetadataItem?.fields ?? [], - ); - const orderBy = turnSortsIntoOrderBy( - boardSorts, - foundObjectMetadataItem?.fields ?? [], - ); - - useFindManyRecords({ - objectNameSingular: CoreObjectNameSingular.PipelineStep, - filter, - onCompleted: useCallback( - (data: ObjectRecordConnection) => { - setSavedPipelineSteps(data.edges.map((edge) => edge.node)); - }, - [setSavedPipelineSteps], - ), - }); - - const { - records: opportunities, - loading, - fetchMoreRecords: fetchMoreOpportunities, - } = useFindManyRecords({ - skip: !savedPipelineSteps.length, - objectNameSingular: CoreObjectNameSingular.Opportunity, - filter, - orderBy, - onCompleted: useCallback(() => { - setIsBoardLoaded(true); - }, [setIsBoardLoaded]), - }); - - const { fetchMoreRecords: fetchMoreCompanies } = useFindManyRecords({ - skip: !savedOpportunities.length, - objectNameSingular: CoreObjectNameSingular.Company, - filter: { - id: { - in: savedOpportunities.map( - (opportunity) => opportunity.companyId || '', - ), - }, - }, - onCompleted: useCallback( - (data: ObjectRecordConnection) => { - setSavedCompanies(data.edges.map((edge) => edge.node)); - }, - [setSavedCompanies], - ), - }); - - return { - opportunities, - loading, - fetchMoreOpportunities, - fetchMoreCompanies, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/action-bar/components/RecordBoardDeprecatedActionBar.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/action-bar/components/RecordBoardDeprecatedActionBar.tsx deleted file mode 100644 index b2e01c273..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/action-bar/components/RecordBoardDeprecatedActionBar.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { useRecoilValue } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { ActionBar } from '@/ui/navigation/action-bar/components/ActionBar'; - -export const RecordBoardDeprecatedActionBar = () => { - const { selectedCardIdsSelector } = useRecordBoardDeprecatedScopedStates(); - const selectedCardIds = useRecoilValue(selectedCardIdsSelector); - - if (!selectedCardIds.length) { - return null; - } - - return ; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/NewButton.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/NewButton.tsx deleted file mode 100644 index 867a57063..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/NewButton.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; - -import { IconPlus } from '@/ui/display/icon/index'; - -const StyledButton = styled.button` - align-items: center; - align-self: baseline; - background-color: ${({ theme }) => theme.background.primary}; - border: none; - border-radius: ${({ theme }) => theme.border.radius.sm}; - color: ${({ theme }) => theme.font.color.tertiary}; - cursor: pointer; - display: flex; - gap: ${({ theme }) => theme.spacing(1)}; - padding: ${({ theme }) => theme.spacing(1)}; - - &:hover { - background-color: ${({ theme }) => theme.background.tertiary}; - } -`; - -type NewButtonProps = { - onClick: () => void; -}; - -export const NewButton = ({ onClick }: NewButtonProps) => { - const theme = useTheme(); - - return ( - - - New - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecated.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecated.tsx deleted file mode 100644 index 854a13829..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecated.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useCallback, useRef } from 'react'; -import styled from '@emotion/styled'; -import { DragDropContext, OnDragEndResponder } from '@hello-pangea/dnd'; // Atlassian dnd does not support StrictMode from RN 18, so we use a fork @hello-pangea/dnd https://github.com/atlassian/react-beautiful-dnd/issues/2350 -import { useRecoilValue } from 'recoil'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; -import { RecordBoardDeprecatedActionBar } from '@/object-record/record-board-deprecated/action-bar/components/RecordBoardDeprecatedActionBar'; -import { RecordBoardDeprecatedInternalEffect } from '@/object-record/record-board-deprecated/components/RecordBoardDeprecatedInternalEffect'; -import { RecordBoardDeprecatedContextMenu } from '@/object-record/record-board-deprecated/context-menu/components/RecordBoardDeprecatedContextMenu'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { useSetRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useSetRecordBoardDeprecatedCardSelectedInternal'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { Opportunity } from '@/pipeline/types/Opportunity'; -import { DragSelect } from '@/ui/utilities/drag-select/components/DragSelect'; -import { useListenClickOutsideByClassName } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; -import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; -import { logError } from '~/utils/logError'; - -import { BoardColumnDefinition } from '../types/BoardColumnDefinition'; -import { BoardOptions } from '../types/BoardOptions'; - -import { RecordBoardDeprecatedColumn } from './RecordBoardDeprecatedColumn'; - -export type RecordBoardDeprecatedProps = { - recordBoardId: string; - boardOptions: BoardOptions; - onColumnAdd?: (boardColumn: BoardColumnDefinition) => void; - onColumnDelete?: (boardColumnId: string) => void; - onEditColumnTitle: (params: { - 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` - display: flex; - flex-direction: column; - height: 100%; - overflow: hidden; - position: relative; - width: 100%; -`; - -const StyledBoardHeader = styled.div` - position: relative; - z-index: 1; -`; - -export const RecordBoardDeprecated = ({ - recordBoardId, - boardOptions, - onColumnDelete, - onEditColumnTitle, -}: RecordBoardDeprecatedProps) => { - const recordBoardScopeId = recordBoardId; - - const { boardColumnsState } = useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId, - }); - const boardColumns = useRecoilValue(boardColumnsState); - - const { updateOneRecord: updateOneOpportunity } = - useUpdateOneRecord({ - objectNameSingular: CoreObjectNameSingular.Opportunity, - }); - - const { unselectAllActiveCards, setCardSelected } = - useSetRecordBoardDeprecatedCardSelectedInternal({ recordBoardScopeId }); - - const updatePipelineProgressStageInDB = useCallback( - async (pipelineProgressId: string, pipelineStepId: string) => { - await updateOneOpportunity?.({ - idToUpdate: pipelineProgressId, - updateOneRecordInput: { - pipelineStepId: pipelineStepId, - }, - }); - }, - [updateOneOpportunity], - ); - - useListenClickOutsideByClassName({ - classNames: ['entity-board-card'], - excludeClassNames: ['action-bar', 'context-menu'], - callback: unselectAllActiveCards, - }); - - const onDragEnd: OnDragEndResponder = useCallback( - async (result) => { - if (!boardColumns) return; - - try { - const draggedEntityId = result.draggableId; - const destinationColumnId = result.destination?.droppableId; - - if ( - draggedEntityId && - destinationColumnId && - updatePipelineProgressStageInDB - ) { - await updatePipelineProgressStageInDB( - draggedEntityId, - destinationColumnId, - ); - } - } catch (e) { - logError(e); - } - }, - [boardColumns, updatePipelineProgressStageInDB], - ); - - const sortedBoardColumns = [...boardColumns].sort((a, b) => { - return a.position - b.position; - }); - - const boardRef = useRef(null); - - return ( - - - - - - - - - - - {sortedBoardColumns.map((column) => ( - - ))} - - - - - - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedCard.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedCard.tsx deleted file mode 100644 index c4e630f78..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedCard.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Draggable } from '@hello-pangea/dnd'; -import { useSetRecoilState } from 'recoil'; - -import { contextMenuIsOpenState } from '@/ui/navigation/context-menu/states/contextMenuIsOpenState'; -import { contextMenuPositionState } from '@/ui/navigation/context-menu/states/contextMenuPositionState'; - -import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '../hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal'; -import { BoardOptions } from '../types/BoardOptions'; - -export const RecordBoardDeprecatedCard = ({ - recordBoardOptions, - cardId, - index, -}: { - recordBoardOptions: BoardOptions; - cardId: string; - index: number; -}) => { - const setContextMenuPosition = useSetRecoilState(contextMenuPositionState); - const setContextMenuOpenState = useSetRecoilState(contextMenuIsOpenState); - - const { setCurrentCardSelected } = - useCurrentRecordBoardDeprecatedCardSelectedInternal(); - - const handleContextMenu = (event: React.MouseEvent) => { - event.preventDefault(); - setCurrentCardSelected(true); - setContextMenuPosition({ - x: event.clientX, - y: event.clientY, - }); - setContextMenuOpenState(true); - }; - - return ( - - {(draggableProvided) => ( -
- {} -
- )} -
- ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumn.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumn.tsx deleted file mode 100644 index 7566c7135..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumn.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import React from 'react'; -import styled from '@emotion/styled'; -import { Draggable, Droppable, DroppableProvided } from '@hello-pangea/dnd'; -import { useRecoilValue } from 'recoil'; - -import { RecordBoardDeprecatedCard } from '@/object-record/record-board-deprecated/components/RecordBoardDeprecatedCard'; -import { RecordBoardDeprecatedColumnHeader } from '@/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnHeader'; -import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext'; -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; - -import { BoardColumnContext } from '../contexts/BoardColumnContext'; -import { recordBoardCardIdsByColumnIdFamilyState } from '../states/recordBoardCardIdsByColumnIdFamilyState'; -import { BoardOptions } from '../types/BoardOptions'; - -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; -`; - -type BoardColumnCardsContainerProps = { - children: React.ReactNode; - droppableProvided: DroppableProvided; -}; - -type RecordBoardDeprecatedColumnProps = { - recordBoardColumnId: string; - columnDefinition: BoardColumnDefinition; - recordBoardOptions: BoardOptions; - recordBoardColumnTotal: number; - onDelete?: (columnId: string) => void; - onTitleEdit: (params: { - columnId: string; - title: string; - color: string; - }) => void; -}; - -const BoardColumnCardsContainer = ({ - children, - droppableProvided, -}: BoardColumnCardsContainerProps) => { - return ( - - {children} - {droppableProvided?.placeholder} - - ); -}; - -export const RecordBoardDeprecatedColumn = ({ - recordBoardColumnId, - columnDefinition, - recordBoardOptions, - recordBoardColumnTotal, - onDelete, - onTitleEdit, -}: RecordBoardDeprecatedColumnProps) => { - const cardIds = useRecoilValue( - recordBoardCardIdsByColumnIdFamilyState(recordBoardColumnId), - ); - - const isFirstColumn = columnDefinition.position === 0; - - return ( - - onTitleEdit({ columnId: recordBoardColumnId, title, color }), - }} - > - - {(droppableProvided) => ( - - - - {cardIds.map((cardId, index) => ( - - - - ))} - - {(draggableProvided) => ( -
- - {recordBoardOptions.newCardComponent} - -
- )} -
-
-
- )} -
-
- ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnDropdownMenu.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnDropdownMenu.tsx deleted file mode 100644 index 69e99b95d..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnDropdownMenu.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import { useCallback, useContext, useRef, useState } from 'react'; -import styled from '@emotion/styled'; -import { Key } from 'ts-key-enum'; - -import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; -import { IconArrowLeft, IconArrowRight, IconPencil } from '@/ui/display/icon'; -import { DropdownMenu } from '@/ui/layout/dropdown/components/DropdownMenu'; -import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; -import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; -import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; -import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; -import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; - -import { BoardColumnContext } from '../contexts/BoardColumnContext'; -import { useBoardColumnsInternal } from '../hooks/internal/useRecordBoardDeprecatedColumnsInternal'; -import { BoardColumnHotkeyScope } from '../types/BoardColumnHotkeyScope'; - -import { RecordBoardDeprecatedColumnEditTitleMenu } from './RecordBoardDeprecatedColumnEditTitleMenu'; -const StyledMenuContainer = styled.div` - position: absolute; - top: ${({ theme }) => theme.spacing(10)}; - width: 200px; - z-index: 1; -`; - -type RecordBoardDeprecatedColumnDropdownMenuProps = { - onClose: () => void; - onDelete?: (id: string) => void; - stageId: string; -}; - -type Menu = 'actions' | 'add' | 'title'; - -export const RecordBoardDeprecatedColumnDropdownMenu = ({ - onClose, - onDelete, - stageId, -}: RecordBoardDeprecatedColumnDropdownMenuProps) => { - const [currentMenu, setCurrentMenu] = useState('actions'); - const column = useContext(BoardColumnContext); - - const boardColumnMenuRef = useRef(null); - - const { handleMoveBoardColumn } = useBoardColumnsInternal(); - - const { - setHotkeyScopeAndMemorizePreviousScope, - goBackToPreviousHotkeyScope, - } = usePreviousHotkeyScope(); - - const closeMenu = useCallback(() => { - goBackToPreviousHotkeyScope(); - onClose(); - }, [goBackToPreviousHotkeyScope, onClose]); - - const setMenu = (menu: Menu) => { - if (menu === 'add') { - setHotkeyScopeAndMemorizePreviousScope( - RelationPickerHotkeyScope.RelationPicker, - ); - } - setCurrentMenu(menu); - }; - - useListenClickOutside({ - refs: [boardColumnMenuRef], - callback: closeMenu, - }); - - useScopedHotkeys( - [Key.Escape, Key.Enter], - () => { - closeMenu(); - }, - BoardColumnHotkeyScope.BoardColumn, - [], - ); - - if (!column) return <>; - - const { isFirstColumn, isLastColumn, columnDefinition } = column; - - const handleColumnMoveLeft = () => { - closeMenu(); - if (isFirstColumn) { - return; - } - handleMoveBoardColumn('left', columnDefinition); - }; - - const handleColumnMoveRight = () => { - closeMenu(); - if (isLastColumn) { - return; - } - handleMoveBoardColumn('right', columnDefinition); - }; - - return ( - - - {currentMenu === 'actions' && ( - - setMenu('title')} - LeftIcon={IconPencil} - text="Edit" - /> - - - {/* setMenu('add')} - LeftIcon={IconPlus} - text="New opportunity" - /> */} - - )} - {currentMenu === 'title' && ( - - )} - {currentMenu === 'add' && ( -
add
- // - )} -
-
- ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnEditTitleMenu.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnEditTitleMenu.tsx deleted file mode 100644 index 4caf7d248..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnEditTitleMenu.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { ChangeEvent, useCallback, useContext, useState } from 'react'; -import styled from '@emotion/styled'; -import debounce from 'lodash.debounce'; - -import { IconTrash } from '@/ui/display/icon'; -import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; -import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; -import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; -import { MenuItemSelectColor } from '@/ui/navigation/menu-item/components/MenuItemSelectColor'; -import { - MAIN_COLOR_NAMES, - ThemeColor, -} from '@/ui/theme/constants/MainColorNames'; -import { TEXT_INPUT_STYLE } from '@/ui/theme/constants/TextInputStyle'; - -import { BoardColumnContext } from '../contexts/BoardColumnContext'; -import { useRecordBoardDeprecated } from '../hooks/useRecordBoardDeprecated'; - -const StyledEditTitleContainer = styled.div` - --vertical-padding: ${({ theme }) => theme.spacing(1)}; - - align-items: center; - - display: flex; - flex-direction: row; - height: calc(36px - 2 * var(--vertical-padding)); - padding: var(--vertical-padding) 0; - - width: calc(100%); -`; - -const StyledEditModeInput = styled.input` - ${TEXT_INPUT_STYLE} - - background: ${({ theme }) => theme.background.transparent.lighter}; - border-color: ${({ theme }) => theme.color.blue}; - border-radius: ${({ theme }) => theme.border.radius.sm}; - border-style: solid; - border-width: 1px; - box-shadow: 0px 0px 0px 3px rgba(25, 97, 237, 0.1); - font-size: ${({ theme }) => theme.font.size.sm}; - height: 100%; - width: 100%; -`; - -type RecordBoardDeprecatedColumnEditTitleMenuProps = { - onClose: () => void; - onDelete?: (id: string) => void; - title: string; - color: ThemeColor; - stageId: string; -}; - -export const RecordBoardDeprecatedColumnEditTitleMenu = ({ - onClose, - onDelete, - stageId, - title, - color, -}: RecordBoardDeprecatedColumnEditTitleMenuProps) => { - const [internalValue, setInternalValue] = useState(title); - const { onTitleEdit } = useContext(BoardColumnContext) || {}; - - const { setBoardColumns } = useRecordBoardDeprecated({ - recordBoardScopeId: 'company-board', - }); - - const debouncedOnUpdateTitle = debounce( - (newTitle) => onTitleEdit?.({ title: newTitle, color }), - 200, - ); - const handleChange = (event: ChangeEvent) => { - const title = event.target.value; - setInternalValue(title); - debouncedOnUpdateTitle(title); - - setBoardColumns((previousBoardColumns) => - previousBoardColumns.map((column) => - column.id === stageId ? { ...column, title: title } : column, - ), - ); - }; - - const handleColorChange = (newColor: ThemeColor) => { - onTitleEdit?.({ title, color: newColor }); - onClose(); - setBoardColumns((previousBoardColumns) => - previousBoardColumns.map((column) => - column.id === stageId - ? { ...column, colorCode: newColor ? newColor : 'gray' } - : column, - ), - ); - }; - - const handleDelete = useCallback(() => { - setBoardColumns((previousBoardColumns) => - previousBoardColumns.filter((column) => column.id !== stageId), - ); - onDelete?.(stageId); - onClose(); - }, [onClose, onDelete, setBoardColumns, stageId]); - - return ( - - - - - - {MAIN_COLOR_NAMES.map((colorName) => ( - handleColorChange(colorName)} - color={colorName} - selected={colorName === color} - variant="pipeline" - /> - ))} - - - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnHeader.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnHeader.tsx deleted file mode 100644 index 81c7bd81a..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedColumnHeader.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React, { useState } from 'react'; -import styled from '@emotion/styled'; -import { useRecoilValue } from 'recoil'; - -import { recordBoardColumnTotalsFamilySelector } from '@/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedColumnTotalsFamilySelector'; -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; -import { IconDotsVertical } from '@/ui/display/icon'; -import { Tag } from '@/ui/display/tag/components/Tag'; -import { LightIconButton } from '@/ui/input/button/components/LightIconButton'; -import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; - -import { recordBoardCardIdsByColumnIdFamilyState } from '../states/recordBoardCardIdsByColumnIdFamilyState'; -import { BoardColumnHotkeyScope } from '../types/BoardColumnHotkeyScope'; - -import { RecordBoardDeprecatedColumnDropdownMenu } from './RecordBoardDeprecatedColumnDropdownMenu'; - -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; -`; - -const StyledHeaderActions = styled.div` - display: flex; - margin-left: auto; -`; - -type RecordBoardDeprecatedColumnHeaderProps = { - recordBoardColumnId: string; - columnDefinition: BoardColumnDefinition; - onDelete?: (columnId: string) => void; -}; - -export const RecordBoardDeprecatedColumnHeader = ({ - recordBoardColumnId, - columnDefinition, - onDelete, -}: RecordBoardDeprecatedColumnHeaderProps) => { - const [isBoardColumnMenuOpen, setIsBoardColumnMenuOpen] = useState(false); - const [isHeaderHovered, setIsHeaderHovered] = useState(false); - - const { - setHotkeyScopeAndMemorizePreviousScope, - goBackToPreviousHotkeyScope, - } = usePreviousHotkeyScope(); - - const handleBoardColumnMenuOpen = () => { - setIsBoardColumnMenuOpen(true); - setHotkeyScopeAndMemorizePreviousScope(BoardColumnHotkeyScope.BoardColumn, { - goto: false, - }); - }; - - const handleBoardColumnMenuClose = () => { - goBackToPreviousHotkeyScope(); - setIsBoardColumnMenuOpen(false); - }; - - const boardColumnTotal = useRecoilValue( - recordBoardColumnTotalsFamilySelector(recordBoardColumnId), - ); - - const cardIds = useRecoilValue( - recordBoardCardIdsByColumnIdFamilyState(recordBoardColumnId), - ); - - return ( - <> - setIsHeaderHovered(true)} - onMouseLeave={() => setIsHeaderHovered(false)} - > - - {!!boardColumnTotal && ${boardColumnTotal}} - {!isHeaderHovered && ( - {cardIds.length} - )} - {isHeaderHovered && ( - - - {/* {}} - /> */} - - )} - - {isBoardColumnMenuOpen && ( - - )} - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx deleted file mode 100644 index 1e73d9410..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useEffect } from 'react'; - -import { useRecordBoardDeprecated } from '@/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated'; -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; - -type RecordBoardDeprecatedEffectProps = { - recordBoardId: string; - onFieldsChange: (fields: BoardFieldDefinition[]) => void; -}; - -export const RecordBoardDeprecatedEffect = ({ - recordBoardId, - onFieldsChange, -}: RecordBoardDeprecatedEffectProps) => { - const { setOnFieldsChange } = useRecordBoardDeprecated({ - recordBoardScopeId: recordBoardId, - }); - - useEffect(() => { - setOnFieldsChange(() => onFieldsChange); - }, [onFieldsChange, setOnFieldsChange]); - - return <>; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedInternalEffect.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedInternalEffect.tsx deleted file mode 100644 index f9c916d32..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedInternalEffect.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { useEffect } from 'react'; -import { useRecoilState, useRecoilValue } from 'recoil'; - -import { useObjectRecordBoardDeprecated } from '@/object-record/hooks/useObjectRecordBoardDeprecated'; -import { useRecordBoardDeprecatedActionBarEntriesInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedActionBarEntriesInternal'; -import { useRecordBoardDeprecatedContextMenuEntriesInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedContextMenuEntriesInternal'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { useUpdateCompanyBoardColumnsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useUpdateCompanyBoardColumnsInternal'; -import { isNonNullable } from '~/utils/isNonNullable'; - -export type RecordBoardDeprecatedInternalEffectProps = { - onFieldsChange: (fields: any) => void; -}; - -export const RecordBoardDeprecatedInternalEffect = () => { - const updateCompanyColumnsBoardInternal = - useUpdateCompanyBoardColumnsInternal(); - const { setActionBarEntries } = - useRecordBoardDeprecatedActionBarEntriesInternal(); - const { setContextMenuEntries } = - useRecordBoardDeprecatedContextMenuEntriesInternal(); - - const { - savedPipelineStepsState, - savedOpportunitiesState, - savedCompaniesState, - } = useRecordBoardDeprecatedScopedStates(); - - const { fetchMoreOpportunities, fetchMoreCompanies, opportunities } = - useObjectRecordBoardDeprecated(); - - const [savedOpportunities, setSavedOpportunities] = useRecoilState( - savedOpportunitiesState, - ); - const savedPipelineSteps = useRecoilValue(savedPipelineStepsState); - const savedCompanies = useRecoilValue(savedCompaniesState); - - useEffect(() => { - setSavedOpportunities(opportunities); - }, [opportunities, setSavedOpportunities]); - - useEffect(() => { - if (isNonNullable(fetchMoreOpportunities)) { - fetchMoreOpportunities(); - } - }, [fetchMoreOpportunities]); - - useEffect(() => { - if (isNonNullable(fetchMoreCompanies)) { - fetchMoreCompanies(); - } - }, [fetchMoreCompanies]); - - useEffect(() => { - if (savedOpportunities && savedCompanies) { - setActionBarEntries(); - setContextMenuEntries(); - - updateCompanyColumnsBoardInternal( - savedPipelineSteps, - savedOpportunities, - savedCompanies, - ); - } - }, [ - savedCompanies, - savedOpportunities, - savedPipelineSteps, - setActionBarEntries, - setContextMenuEntries, - updateCompanyColumnsBoardInternal, - ]); - - return <>; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/__stories__/RecordBoardColumnEditTitleMenu.stories.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/__stories__/RecordBoardColumnEditTitleMenu.stories.tsx deleted file mode 100644 index 99d7262f5..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/__stories__/RecordBoardColumnEditTitleMenu.stories.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator'; - -import { RecordBoardDeprecatedColumnEditTitleMenu } from '../RecordBoardDeprecatedColumnEditTitleMenu'; - -const meta: Meta = { - title: 'UI/Layout/Board/BoardColumnMenu', - component: RecordBoardDeprecatedColumnEditTitleMenu, - decorators: [ComponentDecorator], - args: { color: 'green', title: 'Column title' }, -}; - -export default meta; -type Story = StoryObj; - -export const AllTags: Story = {}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/constants/BoardOptionsDropdownId.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/constants/BoardOptionsDropdownId.ts deleted file mode 100644 index 77727d594..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/constants/BoardOptionsDropdownId.ts +++ /dev/null @@ -1 +0,0 @@ -export const BOARD_OPTIONS_DROPDOWN_ID = 'board-options-dropdown-id'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/context-menu/components/RecordBoardDeprecatedContextMenu.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/context-menu/components/RecordBoardDeprecatedContextMenu.tsx deleted file mode 100644 index 900d3d199..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/context-menu/components/RecordBoardDeprecatedContextMenu.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { useRecoilValue } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { ContextMenu } from '@/ui/navigation/context-menu/components/ContextMenu'; - -export const RecordBoardDeprecatedContextMenu = () => { - const { selectedCardIdsSelector } = useRecordBoardDeprecatedScopedStates(); - const selectedCardIds = useRecoilValue(selectedCardIdsSelector); - - if (!selectedCardIds.length) { - return null; - } - return ; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/contexts/BoardCardIdContext.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/contexts/BoardCardIdContext.ts deleted file mode 100644 index b135559a7..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/contexts/BoardCardIdContext.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react'; - -export const BoardCardIdContext = createContext(null); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/contexts/BoardColumnContext.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/contexts/BoardColumnContext.ts deleted file mode 100644 index d1b3b57cb..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/contexts/BoardColumnContext.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createContext } from 'react'; - -import { BoardColumnDefinition } from '../types/BoardColumnDefinition'; - -type BoardColumnContextProps = { - id: string; - columnDefinition: BoardColumnDefinition; - isFirstColumn: boolean; - isLastColumn: boolean; - onTitleEdit: (params: { title: string; color: string }) => void; -}; - -export const BoardColumnContext = createContext( - null, -); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/__tests__/useRecordBoard.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/__tests__/useRecordBoard.test.tsx deleted file mode 100644 index f891ba118..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/__tests__/useRecordBoard.test.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { useRecordBoardDeprecated } from '@/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated'; - -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - {children} - -); - -const recordBoardScopeId = 'recordBoardScopeId'; - -const renderHookConfig = { - wrapper: Wrapper, -}; - -const useRecordBoardDeprecatedHook = () => { - const recordBoard = useRecordBoardDeprecated({ recordBoardScopeId }); - const { isBoardLoadedState, boardColumnsState, onFieldsChangeState } = - useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: recordBoardScopeId, - }); - const isBoardLoaded = useRecoilValue(isBoardLoadedState); - const boardColumns = useRecoilValue(boardColumnsState); - const onFieldsChange = useRecoilValue(onFieldsChangeState); - - return { - recordBoard, - isBoardLoaded, - boardColumns, - onFieldsChange, - }; -}; - -describe('useRecordBoardDeprecated', () => { - it('should set isBoardLoadedState', async () => { - const { result } = renderHook( - () => useRecordBoardDeprecatedHook(), - renderHookConfig, - ); - - act(() => { - result.current.recordBoard.setIsBoardLoaded(true); - }); - - await waitFor(() => { - expect(result.current.isBoardLoaded).toBe(true); - }); - }); - - it('should set boardColumnsState', async () => { - const columns = [ - { - id: '1', - title: '1', - position: 1, - }, - { - id: '1', - title: '1', - position: 1, - }, - ]; - const { result } = renderHook( - () => useRecordBoardDeprecatedHook(), - renderHookConfig, - ); - - act(() => { - result.current.recordBoard.setBoardColumns(columns); - }); - - await waitFor(() => { - expect(result.current.boardColumns).toEqual(columns); - }); - }); - - it('should set setOnFieldsChange', async () => { - const onFieldsChangeFunction = () => {}; - const onFieldsChange = jest.fn(() => onFieldsChangeFunction); - const { result } = renderHook( - () => useRecordBoardDeprecatedHook(), - renderHookConfig, - ); - - act(() => { - result.current.recordBoard.setOnFieldsChange(onFieldsChange); - }); - - await waitFor(() => { - expect(result.current.onFieldsChange).toEqual(onFieldsChangeFunction); - }); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useCreateOpportunity.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useCreateOpportunity.test.tsx deleted file mode 100644 index 8c7e8a85c..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useCreateOpportunity.test.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook } from '@testing-library/react'; -import gql from 'graphql-tag'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { useCreateOpportunity } from '@/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity'; -import { recordBoardCardIdsByColumnIdFamilyState } from '@/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState'; - -const mockedUuid = 'mocked-uuid'; -jest.mock('uuid', () => ({ - v4: () => mockedUuid, -})); - -jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({ - useMapFieldMetadataToGraphQLQuery: () => () => '\n', -})); - -const mocks = [ - { - request: { - query: gql` - mutation CreateOneOpportunity($input: OpportunityCreateInput!) { - createOpportunity(data: $input) { - id - } - } - `, - variables: { - input: { - id: mockedUuid, - pipelineStepId: 'pipelineStepId', - companyId: 'New Opportunity', - }, - }, - }, - result: jest.fn(() => ({ - data: { createOpportunity: { id: '' } }, - })), - }, -]; - -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - {children} - -); - -const renderHookConfig = { - wrapper: Wrapper, -}; - -describe('useCreateOpportunity', () => { - it('should create opportunity successfully', () => { - const companyIdname = 'New Opportunity'; - const opportunityPipelineStepId = 'pipelineStepId'; - - const { result } = renderHook( - () => ({ - createOpportunity: useCreateOpportunity(), - recordBoardCardIdsByColumnId: useRecoilValue( - recordBoardCardIdsByColumnIdFamilyState(opportunityPipelineStepId), - ), - }), - renderHookConfig, - ); - - act(() => { - result.current.createOpportunity( - companyIdname, - opportunityPipelineStepId, - ); - }); - - expect(result.current.recordBoardCardIdsByColumnId).toStrictEqual([ - mockedUuid, - ]); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useCurrentRecordBoardCardSelectedInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useCurrentRecordBoardCardSelectedInternal.test.tsx deleted file mode 100644 index b63814766..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useCurrentRecordBoardCardSelectedInternal.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext'; -import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { actionBarOpenState } from '@/ui/navigation/action-bar/states/actionBarIsOpenState'; - -const scopeId = 'scopeId'; -const boardCardId = 'boardCardId'; - -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - - {children} - - -); - -describe('useCurrentRecordBoardDeprecatedCardSelectedInternal', () => { - it('should update the data when selecting and deselecting the cardId', () => { - const { result } = renderHook( - () => ({ - currentCardSelect: - useCurrentRecordBoardDeprecatedCardSelectedInternal(), - activeCardIdsState: useRecoilValue( - useRecordBoardDeprecatedScopedStates().activeCardIdsState, - ), - actionBarOpenState: useRecoilValue(actionBarOpenState), - }), - { - wrapper: Wrapper, - }, - ); - - expect(result.current.activeCardIdsState).toStrictEqual([]); - expect(result.current.actionBarOpenState).toBe(false); - expect(result.current.currentCardSelect.isCurrentCardSelected).toBe(false); - - act(() => { - result.current.currentCardSelect.setCurrentCardSelected(true); - }); - - expect(result.current.activeCardIdsState).toStrictEqual([boardCardId]); - expect(result.current.actionBarOpenState).toBe(true); - expect(result.current.currentCardSelect.isCurrentCardSelected).toBe(true); - - act(() => { - result.current.currentCardSelect.setCurrentCardSelected(false); - }); - - expect(result.current.activeCardIdsState).toStrictEqual([]); - expect(result.current.actionBarOpenState).toBe(false); - expect(result.current.currentCardSelect.isCurrentCardSelected).toBe(false); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useDeleteSelectedRecordBoardCardsInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useDeleteSelectedRecordBoardCardsInternal.test.tsx deleted file mode 100644 index cfaf7edc4..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useDeleteSelectedRecordBoardCardsInternal.test.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import gql from 'graphql-tag'; -import { RecoilRoot, useRecoilValue, useSetRecoilState } from 'recoil'; - -import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext'; -import { useCreateOpportunity } from '@/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity'; -import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal'; -import { useDeleteSelectedRecordBoardDeprecatedCardsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { recordBoardCardIdsByColumnIdFamilyState } from '@/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState'; - -jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({ - useMapFieldMetadataToGraphQLQuery: jest.fn().mockReturnValue(() => '\n'), -})); - -const mockedUuid = 'mocked-uuid'; -jest.mock('uuid', () => ({ v4: () => mockedUuid })); - -const mocks = [ - { - request: { - query: gql` - mutation DeleteManyOpportunities($filter: OpportunityFilterInput!) { - deleteOpportunities(filter: $filter) { - id - } - } - `, - variables: { filter: { id: { in: [mockedUuid] } } }, - }, - result: jest.fn(() => ({ - data: { deleteOpportunities: { id: '' } }, - })), - }, - { - request: { - query: gql` - mutation CreateOneOpportunity($input: OpportunityCreateInput!) { - createOpportunity(data: $input) { - id - } - } - `, - variables: { - input: { - id: mockedUuid, - pipelineStepId: 'pipelineStepId', - companyId: 'New Opportunity', - }, - }, - }, - result: jest.fn(() => ({ - data: { createOpportunity: { id: '' } }, - })), - }, -]; - -const scopeId = 'scopeId'; - -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - - - {children} - - - -); - -describe('useDeleteSelectedRecordBoardDeprecatedCardsInternal', () => { - it('should run apollo mutation and update recoil state when delete selected cards', async () => { - const companyIdname = 'New Opportunity'; - const opportunityPipelineStepId = 'pipelineStepId'; - - const { result } = renderHook( - () => ({ - createOpportunity: useCreateOpportunity(), - deleteSelectedCards: - useDeleteSelectedRecordBoardDeprecatedCardsInternal(), - setBoardColumns: useSetRecoilState( - useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: scopeId, - }).boardColumnsState, - ), - recordBoardCardIdsByColumnId: useRecoilValue( - recordBoardCardIdsByColumnIdFamilyState(opportunityPipelineStepId), - ), - currentSelect: useCurrentRecordBoardDeprecatedCardSelectedInternal(), - }), - { - wrapper: Wrapper, - }, - ); - - act(() => { - result.current.currentSelect.setCurrentCardSelected(true); - result.current.setBoardColumns([ - { - id: opportunityPipelineStepId, - title: '1', - position: 1, - }, - ]); - result.current.createOpportunity( - companyIdname, - opportunityPipelineStepId, - ); - }); - - expect(result.current.recordBoardCardIdsByColumnId).toStrictEqual([ - mockedUuid, - ]); - await act(async () => { - await result.current.deleteSelectedCards(); - }); - - await waitFor(() => { - expect(result.current.recordBoardCardIdsByColumnId).toStrictEqual([]); - expect(mocks[0].result).toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardActionBarEntriesInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardActionBarEntriesInternal.test.tsx deleted file mode 100644 index 8977a5caa..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardActionBarEntriesInternal.test.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { useDeleteSelectedRecordBoardDeprecatedCardsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal'; -import { useRecordBoardDeprecatedActionBarEntriesInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedActionBarEntriesInternal'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { IconTrash } from '@/ui/display/icon'; -import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionBarEntriesState'; - -const scopeId = 'scopeId'; -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - - {children} - - -); - -const renderHookConfig = { - wrapper: Wrapper, -}; - -describe('useRecordBoardDeprecatedActionBarEntriesInternal', () => { - it('should update actionBarEntries', async () => { - const { result } = renderHook(() => { - const deleteSelectedBoardCards = - useDeleteSelectedRecordBoardDeprecatedCardsInternal(); - const newActionBarEntry = { - label: 'Delete', - Icon: IconTrash, - accent: 'danger', - onClick: deleteSelectedBoardCards, - }; - return { - setActionBarEntries: useRecordBoardDeprecatedActionBarEntriesInternal(), - actionBarEntries: useRecoilValue(actionBarEntriesState), - newActionBarEntry, - }; - }, renderHookConfig); - - expect(result.current.actionBarEntries).toStrictEqual([]); - - act(() => { - result.current.setActionBarEntries.setActionBarEntries(); - }); - - await waitFor(() => { - expect(JSON.stringify(result.current.actionBarEntries)).toBe( - JSON.stringify([result.current.newActionBarEntry]), - ); - }); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx deleted file mode 100644 index 175b5bc74..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { act } from 'react-dom/test-utils'; -import { renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot, useRecoilState, useRecoilValue } from 'recoil'; - -import { useRecordBoardDeprecatedCardFieldsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal'; -import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState'; -import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState'; -import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState'; -import { FieldType } from '@/object-record/record-field/types/FieldType'; - -const recordBoardScopeId = 'recordBoardScopeId'; - -const renderHookConfig = { - wrapper: RecoilRoot, -}; - -describe('useRecordBoardDeprecatedCardFieldsInternal', () => { - it('should toggle field visibility', async () => { - const { result } = renderHook(() => { - const [cardFieldsList, setCardFieldsList] = useRecoilState( - recordBoardCardFieldsScopedState({ scopeId: recordBoardScopeId }), - ); - return { - boardCardFields: useRecordBoardDeprecatedCardFieldsInternal({ - recordBoardScopeId, - }), - cardFieldsList, - setCardFieldsList, - }; - }, renderHookConfig); - - const field = { - position: 0, - fieldMetadataId: 'id', - label: 'label', - iconName: 'icon', - type: 'TEXT' as FieldType, - metadata: { - fieldName: 'fieldName', - }, - isVisible: true, - }; - - act(() => { - result.current.setCardFieldsList([field]); - }); - - expect(result.current.cardFieldsList[0].isVisible).toBe(true); - - act(() => { - result.current.boardCardFields.handleFieldVisibilityChange({ - ...field, - isVisible: true, - }); - }); - - waitFor(() => { - expect(result.current.cardFieldsList[0].isVisible).toBe(false); - }); - - act(() => { - result.current.boardCardFields.handleFieldVisibilityChange({ - ...field, - isVisible: false, - }); - }); - - waitFor(() => { - expect(result.current.cardFieldsList[0].isVisible).toBe(true); - }); - }); - - it('should call the onFieldsChange callback and update board card states', async () => { - const { result } = renderHook(() => { - const [onFieldsChange, setOnFieldsChange] = useRecoilState( - onFieldsChangeScopedState({ scopeId: recordBoardScopeId }), - ); - return { - boardCardFieldsHook: useRecordBoardDeprecatedCardFieldsInternal({ - recordBoardScopeId, - }), - boardCardFieldsList: useRecoilValue( - recordBoardCardFieldsScopedState({ scopeId: recordBoardScopeId }), - ), - savedBoardCardFieldsList: useRecoilValue( - savedRecordBoardDeprecatedCardFieldsScopedState({ - scopeId: recordBoardScopeId, - }), - ), - onFieldsChange, - setOnFieldsChange, - }; - }, renderHookConfig); - - const field = { - position: 0, - fieldMetadataId: 'id', - label: 'label', - iconName: 'icon', - type: 'TEXT' as FieldType, - metadata: { - fieldName: 'fieldName', - }, - isVisible: true, - }; - const onChangeFunction = jest.fn(); - - await act(async () => { - result.current.setOnFieldsChange(() => onChangeFunction); - result.current.boardCardFieldsHook.handleFieldsReorder([field]); - }); - - expect(onChangeFunction).toHaveBeenCalledWith([field]); - expect(result.current.savedBoardCardFieldsList).toStrictEqual([field]); - expect(result.current.boardCardFieldsList).toStrictEqual([field]); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardColumnsInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardColumnsInternal.test.tsx deleted file mode 100644 index 805eb178c..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardColumnsInternal.test.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import gql from 'graphql-tag'; -import { RecoilRoot, useRecoilState, useSetRecoilState } from 'recoil'; - -import { useBoardColumnsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedColumnsInternal'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; - -jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({ - useMapFieldMetadataToGraphQLQuery: jest.fn().mockReturnValue(() => '\n'), -})); - -const mocks = [ - { - request: { - query: gql` - mutation UpdateOnePipelineStep( - $idToUpdate: ID! - $input: PipelineStepUpdateInput! - ) { - updatePipelineStep(id: $idToUpdate, data: $input) { - id - } - } - `, - variables: { idToUpdate: '1', input: { position: 0 } }, - }, - result: jest.fn(() => ({ - data: { updatePipelineStep: { id: '' } }, - })), - }, -]; - -const scopeId = 'scopeId'; -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - - {children} - - -); - -const renderHookConfig = { - wrapper: Wrapper, -}; - -describe('useBoardColumnsInternal', () => { - it('should update boardColumns state when moving to left and right', async () => { - const { result } = renderHook(() => { - const [boardColumnsList, setBoardColumnsList] = useRecoilState( - useRecordBoardDeprecatedScopedStates().boardColumnsState, - ); - return { - boardColumns: useBoardColumnsInternal(), - boardColumnsList, - setBoardColumnsList, - }; - }, renderHookConfig); - const columns: BoardColumnDefinition[] = [ - { - id: '1', - title: '1', - position: 0, - }, - { - id: '2', - title: '2', - position: 1, - }, - ]; - act(() => { - result.current.setBoardColumnsList(columns); - }); - - act(() => { - result.current.boardColumns.handleMoveBoardColumn('right', columns[0]); - }); - - await waitFor(() => { - expect(result.current.boardColumnsList).toStrictEqual([ - { id: '2', title: '2', position: 0, index: 0 }, - { id: '1', title: '1', position: 1, index: 1 }, - ]); - }); - - act(() => { - result.current.boardColumns.handleMoveBoardColumn('left', columns[0]); - }); - - await waitFor(() => { - expect(result.current.boardColumnsList).toStrictEqual([ - { id: '1', title: '1', position: 0, index: 0 }, - { id: '2', title: '2', position: 1, index: 1 }, - ]); - }); - }); - - it('should call apollo mutation after persistBoardColumns', async () => { - const { result } = renderHook(() => { - return { - boardColumns: useBoardColumnsInternal(), - setBoardColumnsList: useSetRecoilState( - useRecordBoardDeprecatedScopedStates().boardColumnsState, - ), - }; - }, renderHookConfig); - const columns: BoardColumnDefinition[] = [ - { - id: '1', - title: '1', - position: 0, - }, - ]; - act(() => { - result.current.setBoardColumnsList(columns); - }); - - act(() => { - result.current.boardColumns.persistBoardColumns(); - }); - - await waitFor(() => { - expect(mocks[0].result).toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardContextMenuEntriesInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardContextMenuEntriesInternal.test.tsx deleted file mode 100644 index a5b7b02aa..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardContextMenuEntriesInternal.test.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { useDeleteSelectedRecordBoardDeprecatedCardsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal'; -import { useRecordBoardDeprecatedContextMenuEntriesInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedContextMenuEntriesInternal'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { IconTrash } from '@/ui/display/icon'; -import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState'; - -const scopeId = 'scopeId'; -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - - {children} - - -); - -describe('useRecordBoardDeprecatedContextMenuEntriesInternal', () => { - it('should update contextEntries', async () => { - const { result } = renderHook( - () => { - const deleteSelectedBoardCards = - useDeleteSelectedRecordBoardDeprecatedCardsInternal(); - const newContextEntry = { - label: 'Delete', - Icon: IconTrash, - accent: 'danger', - onClick: deleteSelectedBoardCards, - }; - return { - setContextEntries: - useRecordBoardDeprecatedContextMenuEntriesInternal(), - contextEntries: useRecoilValue(contextMenuEntriesState), - newContextEntry, - }; - }, - { - wrapper: Wrapper, - }, - ); - - expect(result.current.contextEntries).toStrictEqual([]); - - act(() => { - result.current.setContextEntries.setContextMenuEntries(); - }); - - await waitFor(() => { - expect(JSON.stringify(result.current.contextEntries)).toBe( - JSON.stringify([result.current.newContextEntry]), - ); - }); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useSetRecordBoardCardSelectedInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useSetRecordBoardCardSelectedInternal.test.tsx deleted file mode 100644 index 849567126..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useSetRecordBoardCardSelectedInternal.test.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { useSetRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useSetRecordBoardDeprecatedCardSelectedInternal'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { isRecordBoardDeprecatedCardSelectedFamilyState } from '@/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardSelectedFamilyState'; - -const scopeId = 'scopeId'; -const boardCardId = 'boardCardId'; - -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - {children} - -); - -const recordBoardScopeId = 'recordBoardScopeId'; - -describe('useSetRecordBoardDeprecatedCardSelectedInternal', () => { - it('should update the data when selecting and deselecting the cardId', async () => { - const { result } = renderHook( - () => { - return { - cardSelect: useSetRecordBoardDeprecatedCardSelectedInternal({ - recordBoardScopeId, - }), - isSelected: useRecoilValue( - isRecordBoardDeprecatedCardSelectedFamilyState(boardCardId), - ), - }; - }, - { - wrapper: Wrapper, - }, - ); - - expect(result.current.isSelected).toBe(false); - - act(() => { - result.current.cardSelect.setCardSelected(boardCardId, true); - }); - - expect(result.current.isSelected).toBe(true); - - act(() => { - result.current.cardSelect.setCardSelected(boardCardId, false); - }); - - expect(result.current.isSelected).toBe(false); - - act(() => { - result.current.cardSelect.setCardSelected(boardCardId, true); - result.current.cardSelect.unselectAllActiveCards(); - }); - - expect(result.current.isSelected).toBe(false); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useUpdateCompanyBoardColumnsInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useUpdateCompanyBoardColumnsInternal.test.tsx deleted file mode 100644 index eadecd268..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useUpdateCompanyBoardColumnsInternal.test.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { CompanyForBoard } from '@/companies/types/CompanyProgress'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { useUpdateCompanyBoardColumnsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useUpdateCompanyBoardColumnsInternal'; -import { RecordBoardDeprecatedScope } from '@/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope'; -import { recordBoardCardIdsByColumnIdFamilyState } from '@/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState'; -import { currentPipelineStepsState } from '@/pipeline/states/currentPipelineStepsState'; -import { Opportunity } from '@/pipeline/types/Opportunity'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -const scopeId = 'scopeId'; -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - - {children} - -); - -describe('useUpdateCompanyBoardColumnsInternal', () => { - it('should update recoil state after updateCompanyBoardColumns call ', async () => { - const { result } = renderHook( - () => { - return { - updateCompanyBoardColumns: useUpdateCompanyBoardColumnsInternal(), - currentPipeline: useRecoilValue(currentPipelineStepsState), - boardColumns: useRecoilValue( - useRecordBoardDeprecatedScopedStates().boardColumnsState, - ), - savedBoardColumns: useRecoilValue( - useRecordBoardDeprecatedScopedStates().savedBoardColumnsState, - ), - idsByColumnId: useRecoilValue( - recordBoardCardIdsByColumnIdFamilyState('1'), - ), - }; - }, - { - wrapper: Wrapper, - }, - ); - - const pipelineSteps: PipelineStep[] = [ - { - id: '1', - name: 'Step 1', - color: 'red', - position: 1, - createdAt: '2024-01-12', - updatedAt: '2024-01-12', - }, - { - id: '2', - name: 'Step 2', - color: 'blue', - position: 1, - createdAt: '2024-01-12', - updatedAt: '2024-01-12', - }, - ]; - const opportunity: Opportunity = { - id: '123', - amount: { - amountMicros: 1000000, - currencyCode: 'USD', - }, - closeDate: new Date('2024-02-01'), - probability: 0.75, - pipelineStepId: '1', - pipelineStep: pipelineSteps[0], - pointOfContactId: '456', - pointOfContact: { - id: '456', - name: { - firstName: 'John', - lastName: 'Doe', - }, - avatarUrl: 'https://example.com/avatar.jpg', - }, - }; - - const companyForBoard: CompanyForBoard = { - id: '789', - name: 'Acme Inc.', - domainName: 'acme.com', - }; - - expect(result.current.currentPipeline).toStrictEqual([]); - expect(result.current.savedBoardColumns).toStrictEqual([]); - expect(result.current.boardColumns).toStrictEqual([]); - expect(result.current.idsByColumnId).toStrictEqual([]); - - act(() => { - result.current.updateCompanyBoardColumns( - pipelineSteps, - [opportunity], - [companyForBoard], - ); - }); - - const expectedBoardColumns = [ - { id: '1', title: 'Step 1', colorCode: 'red', position: 1 }, - { id: '2', title: 'Step 2', colorCode: 'blue', position: 1 }, - ]; - - expect(result.current.currentPipeline).toStrictEqual(pipelineSteps); - expect(result.current.savedBoardColumns).toStrictEqual( - expectedBoardColumns, - ); - expect(result.current.boardColumns).toStrictEqual(expectedBoardColumns); - expect(result.current.idsByColumnId).toStrictEqual([opportunity.id]); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity.ts deleted file mode 100644 index fe241054f..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { useRecoilCallback } from 'recoil'; -import { v4 } from 'uuid'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; -import { recordBoardCardIdsByColumnIdFamilyState } from '@/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState'; -import { Opportunity } from '@/pipeline/types/Opportunity'; - -export const useCreateOpportunity = () => { - const { createOneRecord: createOneOpportunity } = - useCreateOneRecord({ - objectNameSingular: CoreObjectNameSingular.Opportunity, - }); - - const createOpportunity = useRecoilCallback( - ({ set }) => - async (companyId: string, pipelineStepId: string) => { - const newUuid = v4(); - - set( - recordBoardCardIdsByColumnIdFamilyState(pipelineStepId), - (oldValue) => [...oldValue, newUuid], - ); - - await createOneOpportunity?.({ - id: newUuid, - name: 'Opportunity', - pipelineStepId, - companyId: companyId, - }); - }, - [createOneOpportunity], - ); - - return createOpportunity; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal.ts deleted file mode 100644 index 29f333e1c..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { useContext } from 'react'; -import { useRecoilCallback, useRecoilValue, useSetRecoilState } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { actionBarOpenState } from '@/ui/navigation/action-bar/states/actionBarIsOpenState'; - -import { BoardCardIdContext } from '../../contexts/BoardCardIdContext'; -import { isRecordBoardDeprecatedCardSelectedFamilyState } from '../../states/isRecordBoardDeprecatedCardSelectedFamilyState'; - -export const useCurrentRecordBoardDeprecatedCardSelectedInternal = () => { - const currentCardId = useContext(BoardCardIdContext); - - const isCurrentCardSelected = useRecoilValue( - isRecordBoardDeprecatedCardSelectedFamilyState(currentCardId ?? ''), - ); - - const { activeCardIdsState } = useRecordBoardDeprecatedScopedStates(); - - const setActiveCardIds = useSetRecoilState(activeCardIdsState); - - const setCurrentCardSelected = useRecoilCallback( - ({ set }) => - (selected: boolean) => { - if (!currentCardId) return; - - set( - isRecordBoardDeprecatedCardSelectedFamilyState(currentCardId), - selected, - ); - set(actionBarOpenState, selected); - - if (selected) { - setActiveCardIds((prevActiveCardIds) => [ - ...prevActiveCardIds, - currentCardId, - ]); - } else { - setActiveCardIds((prevActiveCardIds) => - prevActiveCardIds.filter((id) => id !== currentCardId), - ); - } - }, - [currentCardId, setActiveCardIds], - ); - - return { - isCurrentCardSelected, - setCurrentCardSelected, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal.ts deleted file mode 100644 index eae6d8196..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useApolloClient } from '@apollo/client'; -import { useRecoilCallback } from 'recoil'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; - -import { useRemoveRecordBoardDeprecatedCardIdsInternal } from './useRemoveRecordBoardDeprecatedCardIdsInternal'; - -export const useDeleteSelectedRecordBoardDeprecatedCardsInternal = () => { - const removeCardIds = useRemoveRecordBoardDeprecatedCardIdsInternal(); - const apolloClient = useApolloClient(); - - const { deleteManyRecords: deleteManyOpportunities } = useDeleteManyRecords({ - objectNameSingular: CoreObjectNameSingular.Opportunity, - }); - - const { selectedCardIdsSelector } = useRecordBoardDeprecatedScopedStates(); - - const deleteSelectedBoardCards = useRecoilCallback( - ({ snapshot }) => - async () => { - const selectedCardIds = snapshot - .getLoadable(selectedCardIdsSelector) - .getValue(); - - await deleteManyOpportunities?.(selectedCardIds); - removeCardIds(selectedCardIds); - selectedCardIds.forEach((id) => { - apolloClient.cache.evict({ id: `Opportunity:${id}` }); - }); - }, - [ - selectedCardIdsSelector, - removeCardIds, - deleteManyOpportunities, - apolloClient.cache, - ], - ); - - return deleteSelectedBoardCards; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedActionBarEntriesInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedActionBarEntriesInternal.ts deleted file mode 100644 index 12f9a0e18..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedActionBarEntriesInternal.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { useCallback } from 'react'; -import { useSetRecoilState } from 'recoil'; - -import { useDeleteSelectedRecordBoardDeprecatedCardsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal'; -import { IconTrash } from '@/ui/display/icon'; -import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionBarEntriesState'; - -export const useRecordBoardDeprecatedActionBarEntriesInternal = () => { - const setActionBarEntriesRecoil = useSetRecoilState(actionBarEntriesState); - - const deleteSelectedBoardCards = - useDeleteSelectedRecordBoardDeprecatedCardsInternal(); - - const setActionBarEntries = useCallback(() => { - setActionBarEntriesRecoil([ - { - label: 'Delete', - Icon: IconTrash, - accent: 'danger', - onClick: deleteSelectedBoardCards, - }, - ]); - }, [deleteSelectedBoardCards, setActionBarEntriesRecoil]); - - return { - setActionBarEntries, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts deleted file mode 100644 index 2618e1bb4..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { useCallback } from 'react'; -import { useRecoilCallback, useSetRecoilState } from 'recoil'; - -import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext'; -import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState'; -import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState'; -import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState'; -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; -import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; - -type useRecordBoardDeprecatedCardFieldsInternalProps = { - recordBoardScopeId?: string; -}; - -export const useRecordBoardDeprecatedCardFieldsInternal = ( - props?: useRecordBoardDeprecatedCardFieldsInternalProps, -) => { - const scopeId = useAvailableScopeIdOrThrow( - RecordBoardDeprecatedScopeInternalContext, - props?.recordBoardScopeId, - ); - - const setBoardCardFields = useSetRecoilState( - recordBoardCardFieldsScopedState({ scopeId }), - ); - - const setSavedBoardCardFields = useSetRecoilState( - savedRecordBoardDeprecatedCardFieldsScopedState({ scopeId }), - ); - - const handleFieldVisibilityChange = useRecoilCallback( - ({ snapshot }) => - async ( - field: Omit, 'size' | 'position'>, - ) => { - const existingFields = snapshot - .getLoadable(recordBoardCardFieldsScopedState({ scopeId })) - .getValue(); - - const fieldIndex = existingFields.findIndex( - ({ fieldMetadataId }) => field.fieldMetadataId === fieldMetadataId, - ); - const fields = [...existingFields]; - - if (fieldIndex === -1) { - fields.push({ ...field, position: existingFields.length }); - } else { - fields[fieldIndex] = { - ...field, - isVisible: !field.isVisible, - position: existingFields.length, - }; - } - - setSavedBoardCardFields(fields); - setBoardCardFields(fields); - - const onFieldsChange = snapshot - .getLoadable(onFieldsChangeScopedState({ scopeId })) - .getValue(); - - onFieldsChange?.(fields); - }, - [scopeId, setBoardCardFields, setSavedBoardCardFields], - ); - - const handleFieldsChange = useRecoilCallback( - ({ snapshot }) => - async (fields: BoardFieldDefinition[]) => { - setSavedBoardCardFields(fields); - setBoardCardFields(fields); - - const onFieldsChange = snapshot - .getLoadable(onFieldsChangeScopedState({ scopeId })) - .getValue(); - - await onFieldsChange?.(fields); - }, - [scopeId, setBoardCardFields, setSavedBoardCardFields], - ); - - const handleFieldsReorder = useCallback( - async (fields: BoardFieldDefinition[]) => { - const updatedFields = fields.map((column, index) => ({ - ...column, - position: index, - })); - - await handleFieldsChange(updatedFields); - }, - [handleFieldsChange], - ); - - return { handleFieldVisibilityChange, handleFieldsReorder }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedColumnsInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedColumnsInternal.ts deleted file mode 100644 index 1c9e98c75..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedColumnsInternal.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { useRecoilState } from 'recoil'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; -import { useMoveViewColumns } from '@/views/hooks/useMoveViewColumns'; - -import { BoardColumnDefinition } from '../../types/BoardColumnDefinition'; - -export const useBoardColumnsInternal = () => { - const { boardColumnsState } = useRecordBoardDeprecatedScopedStates(); - const [boardColumns, setBoardColumns] = useRecoilState(boardColumnsState); - - const { handleColumnMove } = useMoveViewColumns(); - - const { updateOneRecord: updateOnePipelineStep } = - useUpdateOneRecord({ - objectNameSingular: CoreObjectNameSingular.PipelineStep, - }); - - const updatedPipelineSteps = (stages: BoardColumnDefinition[]) => { - if (!stages.length) return; - - return Promise.all( - stages.map( - (stage) => - updateOnePipelineStep?.({ - idToUpdate: stage.id, - updateOneRecordInput: { - position: stage.position, - }, - }), - ), - ); - }; - - const persistBoardColumns = async () => { - await updatedPipelineSteps(boardColumns); - }; - - const handleMoveBoardColumn = ( - direction: 'left' | 'right', - column: BoardColumnDefinition, - ) => { - const currentColumnArrayIndex = boardColumns.findIndex( - (tableColumn) => tableColumn.id === column.id, - ); - const columns = handleColumnMove( - direction, - currentColumnArrayIndex, - boardColumns, - ); - setBoardColumns(columns); - }; - - return { handleMoveBoardColumn, persistBoardColumns }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedContextMenuEntriesInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedContextMenuEntriesInternal.ts deleted file mode 100644 index 4e3d7730c..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedContextMenuEntriesInternal.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useCallback } from 'react'; -import { useSetRecoilState } from 'recoil'; - -import { useDeleteSelectedRecordBoardDeprecatedCardsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useDeleteSelectedRecordBoardDeprecatedCardsInternal'; -import { IconTrash } from '@/ui/display/icon'; -import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState'; - -export const useRecordBoardDeprecatedContextMenuEntriesInternal = () => { - const setContextMenuEntriesRecoil = useSetRecoilState( - contextMenuEntriesState, - ); - - const deleteSelectedBoardCards = - useDeleteSelectedRecordBoardDeprecatedCardsInternal(); - - const setContextMenuEntries = useCallback(() => { - setContextMenuEntriesRecoil([ - { - label: 'Delete', - Icon: IconTrash, - accent: 'danger', - onClick: deleteSelectedBoardCards, - }, - ]); - }, [deleteSelectedBoardCards, setContextMenuEntriesRecoil]); - - return { - setContextMenuEntries, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates.ts deleted file mode 100644 index 0a5256a28..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext'; -import { getRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/utils/getRecordBoardDeprecatedScopedStates'; -import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; - -type useRecordBoardDeprecatedScopedStatesProps = { - recordBoardScopeId?: string; -}; - -export const useRecordBoardDeprecatedScopedStates = ( - args?: useRecordBoardDeprecatedScopedStatesProps, -) => { - const { recordBoardScopeId } = args ?? {}; - - const scopeId = useAvailableScopeIdOrThrow( - RecordBoardDeprecatedScopeInternalContext, - recordBoardScopeId, - ); - - const { - activeCardIdsState, - availableBoardCardFieldsState, - boardColumnsState, - isBoardLoadedState, - isCompactViewEnabledState, - savedBoardColumnsState, - boardFiltersState, - boardSortsState, - onFieldsChangeState, - boardCardFieldsByKeySelector, - hiddenBoardCardFieldsSelector, - selectedCardIdsSelector, - visibleBoardCardFieldsSelector, - savedCompaniesState, - savedOpportunitiesState, - savedPipelineStepsState, - } = getRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: scopeId, - }); - - return { - scopeId, - activeCardIdsState, - availableBoardCardFieldsState, - boardColumnsState, - isBoardLoadedState, - isCompactViewEnabledState, - savedBoardColumnsState, - boardFiltersState, - boardSortsState, - onFieldsChangeState, - boardCardFieldsByKeySelector, - hiddenBoardCardFieldsSelector, - selectedCardIdsSelector, - visibleBoardCardFieldsSelector, - savedCompaniesState, - savedOpportunitiesState, - savedPipelineStepsState, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRemoveRecordBoardDeprecatedCardIdsInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRemoveRecordBoardDeprecatedCardIdsInternal.ts deleted file mode 100644 index afe852ff2..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRemoveRecordBoardDeprecatedCardIdsInternal.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Atlassian dnd does not support StrictMode from RN 18, so we use a fork @hello-pangea/dnd https://github.com/atlassian/react-beautiful-dnd/issues/2350 -import { useRecoilCallback } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; - -import { recordBoardCardIdsByColumnIdFamilyState } from '../../states/recordBoardCardIdsByColumnIdFamilyState'; - -export const useRemoveRecordBoardDeprecatedCardIdsInternal = () => { - const { boardColumnsState } = useRecordBoardDeprecatedScopedStates(); - - return useRecoilCallback( - ({ snapshot, set }) => - (cardIdToRemove: string[]) => { - const boardColumns = snapshot.getLoadable(boardColumnsState).getValue(); - - boardColumns.forEach((boardColumn) => { - const columnCardIds = snapshot - .getLoadable( - recordBoardCardIdsByColumnIdFamilyState(boardColumn.id), - ) - .getValue(); - set( - recordBoardCardIdsByColumnIdFamilyState(boardColumn.id), - columnCardIds.filter((cardId) => !cardIdToRemove.includes(cardId)), - ); - }); - }, - [boardColumnsState], - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useSetRecordBoardDeprecatedCardSelectedInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useSetRecordBoardDeprecatedCardSelectedInternal.ts deleted file mode 100644 index cc443d0c5..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useSetRecordBoardDeprecatedCardSelectedInternal.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext'; -import { actionBarOpenState } from '@/ui/navigation/action-bar/states/actionBarIsOpenState'; -import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; - -import { isRecordBoardDeprecatedCardSelectedFamilyState } from '../../states/isRecordBoardDeprecatedCardSelectedFamilyState'; - -export const useSetRecordBoardDeprecatedCardSelectedInternal = (props: any) => { - const scopeId = useAvailableScopeIdOrThrow( - RecordBoardDeprecatedScopeInternalContext, - props?.recordBoardScopeId, - ); - const { activeCardIdsState } = useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: scopeId, - }); - - const setCardSelected = useRecoilCallback( - ({ set, snapshot }) => - (cardId: string, selected: boolean) => { - const activeCardIds = snapshot - .getLoadable(activeCardIdsState) - .getValue(); - - set(isRecordBoardDeprecatedCardSelectedFamilyState(cardId), selected); - set(actionBarOpenState, selected || activeCardIds.length > 0); - - if (selected) { - set(activeCardIdsState, [...activeCardIds, cardId]); - } else { - set( - activeCardIdsState, - activeCardIds.filter((id: string) => id !== cardId), - ); - } - }, - [activeCardIdsState], - ); - - const unselectAllActiveCards = useRecoilCallback( - ({ set, snapshot }) => - () => { - const activeCardIds = snapshot - .getLoadable(activeCardIdsState) - .getValue(); - - activeCardIds.forEach((cardId: string) => { - set(isRecordBoardDeprecatedCardSelectedFamilyState(cardId), false); - }); - - set(activeCardIdsState, []); - set(actionBarOpenState, false); - }, - [activeCardIdsState], - ); - - return { - setCardSelected, - unselectAllActiveCards, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useUpdateCompanyBoardColumnsInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useUpdateCompanyBoardColumnsInternal.ts deleted file mode 100644 index a0e9630a7..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useUpdateCompanyBoardColumnsInternal.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { recordBoardCardIdsByColumnIdFamilyState } from '@/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState'; -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; -import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; -import { currentPipelineStepsState } from '@/pipeline/states/currentPipelineStepsState'; -import { Opportunity } from '@/pipeline/types/Opportunity'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; -import { themeColorSchema } from '@/ui/theme/utils/themeColorSchema'; -import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; -import { logError } from '~/utils/logError'; - -import { companyProgressesFamilyState } from '../../../../companies/states/companyProgressesFamilyState'; -import { - CompanyForBoard, - CompanyProgressDict, -} from '../../../../companies/types/CompanyProgress'; - -export const useUpdateCompanyBoardColumnsInternal = () => { - const { boardColumnsState, savedBoardColumnsState } = - useRecordBoardDeprecatedScopedStates(); - - return useRecoilCallback( - ({ set, snapshot }) => - ( - pipelineSteps: PipelineStep[], - opportunities: Opportunity[], - companies: CompanyForBoard[], - ) => { - const indexCompanyByIdReducer = ( - acc: { [key: string]: CompanyForBoard }, - company: CompanyForBoard, - ) => ({ - ...acc, - [company.id]: company, - }); - - const companiesDict = - companies.reduce( - indexCompanyByIdReducer, - {} as { [key: string]: CompanyForBoard }, - ) ?? {}; - - const indexOpportunityByIdReducer = ( - acc: CompanyProgressDict, - opportunity: Opportunity, - ) => { - const company = - opportunity.companyId && companiesDict[opportunity.companyId]; - - if (!company) return acc; - - return { - ...acc, - [opportunity.id]: { - opportunity, - company, - }, - }; - }; - - const companyBoardIndex = opportunities.reduce( - indexOpportunityByIdReducer, - {} as CompanyProgressDict, - ); - - for (const [id, companyProgress] of Object.entries(companyBoardIndex)) { - const currentCompanyProgress = snapshot - .getLoadable(companyProgressesFamilyState(id)) - .getValue(); - - if (!isDeeplyEqual(currentCompanyProgress, companyProgress)) { - set(companyProgressesFamilyState(id), companyProgress); - set(recordStoreFamilyState(id), companyProgress.opportunity); - } - } - - const currentPipelineSteps = snapshot - .getLoadable(currentPipelineStepsState) - .getValue(); - - const currentBoardColumns = snapshot - .getLoadable(boardColumnsState) - .getValue(); - - if (!isDeeplyEqual(pipelineSteps, currentPipelineSteps)) { - set(currentPipelineStepsState, pipelineSteps); - } - - const orderedPipelineSteps = [...pipelineSteps].sort((a, b) => { - if (!a.position || !b.position) return 0; - return a.position - b.position; - }); - - const newBoardColumns: BoardColumnDefinition[] = - orderedPipelineSteps?.map((pipelineStep) => { - const colorValidationResult = themeColorSchema.safeParse( - pipelineStep.color, - ); - - if (!colorValidationResult.success) { - logError( - `Color ${pipelineStep.color} is not recognized in useUpdateCompanyBoard.`, - ); - } - - return { - id: pipelineStep.id, - title: pipelineStep.name, - colorCode: colorValidationResult.success - ? colorValidationResult.data - : undefined, - position: pipelineStep.position ?? 0, - }; - }); - if ( - currentBoardColumns.length === 0 && - !isDeeplyEqual(newBoardColumns, currentBoardColumns) - ) { - set(boardColumnsState, newBoardColumns); - set(savedBoardColumnsState, newBoardColumns); - } - for (const boardColumn of newBoardColumns) { - const boardCardIds = opportunities - .filter( - (opportunityToFilter) => - opportunityToFilter.pipelineStepId === boardColumn.id, - ) - .map((opportunity) => opportunity.id); - - const currentBoardCardIds = snapshot - .getLoadable( - recordBoardCardIdsByColumnIdFamilyState(boardColumn.id), - ) - .getValue(); - - if (!isDeeplyEqual(currentBoardCardIds, boardCardIds)) { - set( - recordBoardCardIdsByColumnIdFamilyState(boardColumn.id), - boardCardIds, - ); - } - } - }, - [boardColumnsState, savedBoardColumnsState], - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated.ts deleted file mode 100644 index 4a4e05b00..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { useSetRecoilState } from 'recoil'; - -import { useCreateOpportunity } from '@/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext'; -import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; - -type useRecordBoardDeprecatedProps = { - recordBoardScopeId?: string; -}; - -export const useRecordBoardDeprecated = ( - props?: useRecordBoardDeprecatedProps, -) => { - const scopeId = useAvailableScopeIdOrThrow( - RecordBoardDeprecatedScopeInternalContext, - props?.recordBoardScopeId, - ); - - const { isBoardLoadedState, boardColumnsState, onFieldsChangeState } = - useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: scopeId, - }); - const setIsBoardLoaded = useSetRecoilState(isBoardLoadedState); - - const setBoardColumns = useSetRecoilState(boardColumnsState); - - const createOpportunity = useCreateOpportunity(); - - const setOnFieldsChange = useSetRecoilState(onFieldsChangeState); - - return { - scopeId, - setIsBoardLoaded, - setBoardColumns, - createOpportunity, - setOnFieldsChange, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdown.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdown.tsx deleted file mode 100644 index 1a3e6f1f2..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdown.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { BOARD_OPTIONS_DROPDOWN_ID } from '@/object-record/record-board-deprecated/constants/BoardOptionsDropdownId'; -import { useViewBar } from '@/views/hooks/useViewBar'; - -import { Dropdown } from '../../../../ui/layout/dropdown/components/Dropdown'; -import { BoardOptionsHotkeyScope } from '../../types/BoardOptionsHotkeyScope'; - -import { RecordBoardDeprecatedOptionsDropdownButton } from './RecordBoardDeprecatedOptionsDropdownButton'; -import { - RecordBoardDeprecatedOptionsDropdownContent, - RecordBoardDeprecatedOptionsDropdownContentProps, -} from './RecordBoardDeprecatedOptionsDropdownContent'; - -type RecordBoardDeprecatedOptionsDropdownProps = Pick< - RecordBoardDeprecatedOptionsDropdownContentProps, - 'onStageAdd' | 'recordBoardId' ->; - -export const RecordBoardDeprecatedOptionsDropdown = ({ - onStageAdd, - recordBoardId, -}: RecordBoardDeprecatedOptionsDropdownProps) => { - const { setViewEditMode } = useViewBar(); - - return ( - } - dropdownComponents={ - - } - dropdownHotkeyScope={{ scope: BoardOptionsHotkeyScope.Dropdown }} - onClickOutside={() => setViewEditMode('none')} - dropdownMenuWidth={170} - /> - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdownButton.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdownButton.tsx deleted file mode 100644 index 254519c50..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdownButton.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { BOARD_OPTIONS_DROPDOWN_ID } from '@/object-record/record-board-deprecated/constants/BoardOptionsDropdownId'; -import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton'; -import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; - -export const RecordBoardDeprecatedOptionsDropdownButton = () => { - const { isDropdownOpen, toggleDropdown } = useDropdown( - BOARD_OPTIONS_DROPDOWN_ID, - ); - - const handleClick = () => { - toggleDropdown(); - }; - - return ( - - Options - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdownContent.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdownContent.tsx deleted file mode 100644 index 2290f75b4..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/options/components/RecordBoardDeprecatedOptionsDropdownContent.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import { useCallback, useRef, useState } from 'react'; -import { OnDragEndResponder } from '@hello-pangea/dnd'; -import { useRecoilState, useRecoilValue } from 'recoil'; -import { Key } from 'ts-key-enum'; -import { v4 } from 'uuid'; - -import { BOARD_OPTIONS_DROPDOWN_ID } from '@/object-record/record-board-deprecated/constants/BoardOptionsDropdownId'; -import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; -import { - IconBaselineDensitySmall, - IconChevronLeft, - IconLayoutKanban, - IconPlus, - IconTag, -} from '@/ui/display/icon'; -import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader'; -import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput'; -import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; -import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput'; -import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; -import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; -import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; -import { MenuItemNavigate } from '@/ui/navigation/menu-item/components/MenuItemNavigate'; -import { MenuItemToggle } from '@/ui/navigation/menu-item/components/MenuItemToggle'; -import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; -import { ViewFieldsVisibilityDropdownSection } from '@/views/components/ViewFieldsVisibilityDropdownSection'; -import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; -import { useViewBar } from '@/views/hooks/useViewBar'; -import { moveArrayItem } from '~/utils/array/moveArrayItem'; - -import { useRecordBoardDeprecatedCardFieldsInternal } from '../../hooks/internal/useRecordBoardDeprecatedCardFieldsInternal'; -import { BoardColumnDefinition } from '../../types/BoardColumnDefinition'; -import { BoardOptionsHotkeyScope } from '../../types/BoardOptionsHotkeyScope'; - -export type RecordBoardDeprecatedOptionsDropdownContentProps = { - onStageAdd?: (boardColumn: BoardColumnDefinition) => void; - recordBoardId: string; -}; - -type BoardOptionsMenu = 'fields' | 'stage-creation' | 'stages'; - -export const RecordBoardDeprecatedOptionsDropdownContent = ({ - onStageAdd, - recordBoardId, -}: RecordBoardDeprecatedOptionsDropdownContentProps) => { - const { setViewEditMode, handleViewNameSubmit } = useViewBar(); - const { viewEditModeState, currentViewSelector } = useViewScopedStates(); - - const viewEditMode = useRecoilValue(viewEditModeState); - const currentView = useRecoilValue(currentViewSelector); - - const stageInputRef = useRef(null); - const viewEditInputRef = useRef(null); - - const [currentMenu, setCurrentMenu] = useState< - BoardOptionsMenu | undefined - >(); - - const { - boardColumnsState, - isCompactViewEnabledState, - hiddenBoardCardFieldsSelector, - visibleBoardCardFieldsSelector, - } = useRecordBoardDeprecatedScopedStates({ - recordBoardScopeId: recordBoardId, - }); - - const [boardColumns, setBoardColumns] = useRecoilState(boardColumnsState); - const [isCompactViewEnabled, setIsCompactViewEnabled] = useRecoilState( - isCompactViewEnabledState, - ); - - const hiddenBoardCardFields = useRecoilValue(hiddenBoardCardFieldsSelector); - const hasHiddenFields = hiddenBoardCardFields.length > 0; - - const visibleBoardCardFields = useRecoilValue(visibleBoardCardFieldsSelector); - const hasVisibleFields = visibleBoardCardFields.length > 0; - - const handleStageSubmit = () => { - if (currentMenu !== 'stage-creation' || !stageInputRef?.current?.value) - return; - - const columnToCreate: BoardColumnDefinition = { - id: v4(), - colorCode: 'gray', - position: boardColumns.length, - title: stageInputRef.current.value, - }; - - setBoardColumns((previousBoardColumns) => [ - ...previousBoardColumns, - columnToCreate, - ]); - onStageAdd?.(columnToCreate); - }; - - const resetMenu = () => setCurrentMenu(undefined); - - const handleMenuNavigate = (menu: BoardOptionsMenu) => { - handleViewNameSubmit(); - setCurrentMenu(menu); - }; - - const { handleFieldVisibilityChange, handleFieldsReorder } = - useRecordBoardDeprecatedCardFieldsInternal({ - recordBoardScopeId: recordBoardId, - }); - - const { closeDropdown } = useDropdown(BOARD_OPTIONS_DROPDOWN_ID); - - const handleReorderField: OnDragEndResponder = useCallback( - (result) => { - if (!result.destination) { - return; - } - - const reorderedFields = moveArrayItem(visibleBoardCardFields, { - fromIndex: result.source.index - 1, - toIndex: result.destination.index - 1, - }); - - handleFieldsReorder(reorderedFields); - }, - [handleFieldsReorder, visibleBoardCardFields], - ); - - useScopedHotkeys( - [Key.Escape], - () => { - setViewEditMode('none'); - closeDropdown(); - }, - BoardOptionsHotkeyScope.Dropdown, - ); - - useScopedHotkeys( - Key.Enter, - () => { - const name = viewEditInputRef.current?.value; - resetMenu(); - setViewEditMode('none'); - handleStageSubmit(); - handleViewNameSubmit(name); - closeDropdown(); - }, - BoardOptionsHotkeyScope.Dropdown, - ); - - return ( - <> - {!currentMenu && ( - <> - - - - handleMenuNavigate('fields')} - LeftIcon={IconTag} - text="Fields" - /> - handleMenuNavigate('stages')} - LeftIcon={IconLayoutKanban} - text="Stages" - /> - - - - - - - )} - {currentMenu === 'stages' && ( - <> - - Stages - - - - setCurrentMenu('stage-creation')} - LeftIcon={IconPlus} - text="Add stage" - /> - - - )} - {currentMenu === 'stage-creation' && ( - - )} - {currentMenu === 'fields' && ( - <> - - Fields - - - {hasVisibleFields && ( - - )} - {hasVisibleFields && hasHiddenFields && } - {hasHiddenFields && ( - - )} - - )} - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope.tsx deleted file mode 100644 index d8e2f4a44..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/scopes/RecordBoardDeprecatedScope.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { ReactNode } from 'react'; - -import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext'; - -type RecordBoardDeprecatedScopeProps = { - children: ReactNode; - recordBoardScopeId: string; -}; - -export const RecordBoardDeprecatedScope = ({ - children, - recordBoardScopeId, -}: RecordBoardDeprecatedScopeProps) => { - return ( - - {children} - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext.ts deleted file mode 100644 index 11531f68e..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; -import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext'; - -type RecordBoardDeprecatedScopeInternalContextProps = StateScopeMapKey; - -export const RecordBoardDeprecatedScopeInternalContext = - createScopeInternalContext(); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/activeRecordBoardDeprecatedCardIdsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/activeRecordBoardDeprecatedCardIdsScopedState.ts deleted file mode 100644 index df9b9a158..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/activeRecordBoardDeprecatedCardIdsScopedState.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const activeRecordBoardDeprecatedCardIdsScopedState = - createStateScopeMap({ - key: 'activeRecordBoardDeprecatedCardIdsScopedState', - defaultValue: [], - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts deleted file mode 100644 index 3c397a042..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -import { BoardFieldDefinition } from '../types/BoardFieldDefinition'; - -export const availableRecordBoardDeprecatedCardFieldsScopedState = - createStateScopeMap[]>({ - key: 'availableRecordBoardDeprecatedCardFieldsScopedState', - defaultValue: [], - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isCompactViewEnabledScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isCompactViewEnabledScopedState.ts deleted file mode 100644 index 2e7a35df2..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isCompactViewEnabledScopedState.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const isCompactViewEnabledScopedState = createStateScopeMap({ - key: 'isCompactViewEnabledScopedState', - defaultValue: false, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState.ts deleted file mode 100644 index 09220ce05..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { atomFamily } from 'recoil'; - -export const isRecordBoardDeprecatedCardInCompactViewFamilyState = atomFamily< - boolean, - string ->({ - key: 'isRecordBoardDeprecatedCardInCompactViewFamilyState', - default: true, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardSelectedFamilyState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardSelectedFamilyState.ts deleted file mode 100644 index 84fce509c..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardSelectedFamilyState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { atomFamily } from 'recoil'; - -export const isRecordBoardDeprecatedCardSelectedFamilyState = atomFamily< - boolean, - string ->({ - key: 'isRecordBoardDeprecatedCardSelectedFamilyState', - default: false, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedLoadedScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedLoadedScopedState.ts deleted file mode 100644 index 4ac71da09..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/isRecordBoardDeprecatedLoadedScopedState.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const isRecordBoardDeprecatedLoadedScopedState = - createStateScopeMap({ - key: 'isRecordBoardDeprecatedLoadedScopedState', - defaultValue: false, - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts deleted file mode 100644 index d411b642a..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const onFieldsChangeScopedState = createStateScopeMap< - (fields: BoardFieldDefinition[]) => void ->({ - key: 'onFieldsChangeScopedState', - defaultValue: () => {}, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState.ts deleted file mode 100644 index 0c462a3e6..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardCardIdsByColumnIdFamilyState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { atomFamily } from 'recoil'; - -export const recordBoardCardIdsByColumnIdFamilyState = atomFamily< - string[], - string ->({ - key: 'recordBoardCardIdsByColumnIdFamilyState', - default: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardColumnsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardColumnsScopedState.ts deleted file mode 100644 index 129330e98..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardColumnsScopedState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const recordBoardColumnsScopedState = createStateScopeMap< - BoardColumnDefinition[] ->({ - key: 'recordBoardColumnsScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts deleted file mode 100644 index 8bdefa0a2..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -import { BoardFieldDefinition } from '../types/BoardFieldDefinition'; - -export const recordBoardCardFieldsScopedState = createStateScopeMap< - BoardFieldDefinition[] ->({ - key: 'recordBoardCardFieldsScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedFiltersScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedFiltersScopedState.ts deleted file mode 100644 index a0d02927e..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedFiltersScopedState.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const recordBoardFiltersScopedState = createStateScopeMap({ - key: 'recordBoardFiltersScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedSortsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedSortsScopedState.ts deleted file mode 100644 index b19b5f483..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedSortsScopedState.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -import { Sort } from '../../object-sort-dropdown/types/Sort'; - -export const recordBoardSortsScopedState = createStateScopeMap({ - key: 'recordBoardSortsScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedOpportunitiesScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedOpportunitiesScopedState.ts deleted file mode 100644 index 57443838c..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedOpportunitiesScopedState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Opportunity } from '@/pipeline/types/Opportunity'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const savedOpportunitiesScopedState = createStateScopeMap( - { - key: 'savedOpportunitiesScopedState', - defaultValue: [], - }, -); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedPipelineStepsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedPipelineStepsScopedState.ts deleted file mode 100644 index 347ae076a..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedPipelineStepsScopedState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PipelineStep } from '@/pipeline/types/PipelineStep'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const savedPipelineStepsScopedState = createStateScopeMap< - PipelineStep[] ->({ - key: 'savedPipelineStepsScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts deleted file mode 100644 index 5d129d2b8..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -import { BoardFieldDefinition } from '../types/BoardFieldDefinition'; - -export const savedRecordBoardDeprecatedCardFieldsScopedState = - createStateScopeMap[]>({ - key: 'savedRecordBoardDeprecatedCardFieldsScopedState', - defaultValue: [], - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedColumnsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedColumnsScopedState.ts deleted file mode 100644 index d0e5e70c5..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedColumnsScopedState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -import { BoardColumnDefinition } from '../types/BoardColumnDefinition'; - -export const savedRecordBoardDeprecatedColumnsScopedState = createStateScopeMap< - BoardColumnDefinition[] ->({ - key: 'savedRecordBoardDeprecatedColumnsScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordsScopedState.ts deleted file mode 100644 index ac17469e4..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordsScopedState.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Company } from '@/companies/types/Company'; -import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; - -export const savedRecordsScopedState = createStateScopeMap({ - key: 'savedRecordsScopedState', - defaultValue: [], -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts deleted file mode 100644 index d78a2c834..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; - -import { availableRecordBoardDeprecatedCardFieldsScopedState } from '../availableRecordBoardDeprecatedCardFieldsScopedState'; -import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState'; - -export const hiddenRecordBoardDeprecatedCardFieldsScopedSelector = - createSelectorReadOnlyScopeMap({ - key: 'hiddenRecordBoardDeprecatedCardFieldsScopedSelector', - get: - ({ scopeId }) => - ({ get }) => { - const fields = get(recordBoardCardFieldsScopedState({ scopeId })); - const fieldKeys = fields.map(({ fieldMetadataId }) => fieldMetadataId); - - const otherAvailableKeys = get( - availableRecordBoardDeprecatedCardFieldsScopedState({ scopeId }), - ).filter(({ fieldMetadataId }) => !fieldKeys.includes(fieldMetadataId)); - - return [ - ...fields.filter((field) => !field.isVisible), - ...otherAvailableKeys, - ]; - }, - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts deleted file mode 100644 index 63808d878..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { selectorFamily } from 'recoil'; - -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; - -import { BoardFieldDefinition } from '../../types/BoardFieldDefinition'; -import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState'; - -export const recordBoardCardFieldsByKeyScopedSelector = selectorFamily({ - key: 'recordBoardCardFieldsByKeyScopedSelector', - get: - (scopeId: string) => - ({ get }) => - get(recordBoardCardFieldsScopedState({ scopeId })).reduce< - Record> - >((result, field) => ({ ...result, [field.fieldMetadataId]: field }), {}), -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedColumnTotalsFamilySelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedColumnTotalsFamilySelector.ts deleted file mode 100644 index a03d9b935..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedColumnTotalsFamilySelector.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { selectorFamily } from 'recoil'; - -import { companyProgressesFamilyState } from '@/companies/states/companyProgressesFamilyState'; -import { amountFormat } from '~/utils/format/amountFormat'; - -import { recordBoardCardIdsByColumnIdFamilyState } from '../recordBoardCardIdsByColumnIdFamilyState'; - -// TODO: this state should be computed during the synchronization web-hook and put in a generic -// boardColumnTotalsFamilyState indexed by columnId. -export const recordBoardColumnTotalsFamilySelector = selectorFamily({ - key: 'recordBoardColumnTotalsFamilySelector', - get: - (pipelineStepId: string) => - ({ get }) => { - const cardIds = get( - recordBoardCardIdsByColumnIdFamilyState(pipelineStepId), - ); - - const opportunities = cardIds.map((opportunityId: string) => - get(companyProgressesFamilyState(opportunityId)), - ); - - const pipelineStepTotal: number = - opportunities?.reduce( - (acc: number, curr: any) => - acc + curr?.opportunity.amount.amountMicros / 1000000, - 0, - ) || 0; - - return amountFormat(pipelineStepTotal); - }, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts deleted file mode 100644 index b4f65e584..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; - -import { isRecordBoardDeprecatedCardSelectedFamilyState } from '../isRecordBoardDeprecatedCardSelectedFamilyState'; -import { recordBoardCardIdsByColumnIdFamilyState } from '../recordBoardCardIdsByColumnIdFamilyState'; -import { recordBoardColumnsScopedState } from '../recordBoardColumnsScopedState'; - -export const selectedRecordBoardDeprecatedCardIdsScopedSelector = - createSelectorReadOnlyScopeMap({ - key: 'selectedRecordBoardDeprecatedCardIdsScopedSelector', - get: - ({ scopeId }) => - ({ get }) => { - const boardColumns = get(recordBoardColumnsScopedState({ scopeId })); - - const cardIds = boardColumns.flatMap((boardColumn) => - get(recordBoardCardIdsByColumnIdFamilyState(boardColumn.id)), - ); - - const selectedCardIds = cardIds.filter( - (cardId) => - get(isRecordBoardDeprecatedCardSelectedFamilyState(cardId)) === - true, - ); - - return selectedCardIds; - }, - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts deleted file mode 100644 index de9e1cba1..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; - -import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState'; - -export const visibleRecordBoardDeprecatedCardFieldsScopedSelector = - createSelectorReadOnlyScopeMap({ - key: 'visibleRecordBoardDeprecatedCardFieldsScopedSelector', - get: - ({ scopeId }) => - ({ get }) => - get(recordBoardCardFieldsScopedState({ scopeId })) - .filter((field) => field.isVisible) - .sort((a, b) => a.position - b.position), - }); diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardColumnDefinition.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardColumnDefinition.ts deleted file mode 100644 index b779ed435..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardColumnDefinition.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ThemeColor } from '@/ui/theme/constants/MainColorNames'; - -export type BoardColumnDefinition = { - id: string; - title: string; - position: number; - colorCode?: ThemeColor; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardColumnHotkeyScope.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardColumnHotkeyScope.ts deleted file mode 100644 index 25663b4e3..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardColumnHotkeyScope.ts +++ /dev/null @@ -1,3 +0,0 @@ -export enum BoardColumnHotkeyScope { - BoardColumn = 'board-column', -} diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts deleted file mode 100644 index fc4c1e25b..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; - -export type BoardFieldDefinition = - FieldDefinition & { - position: number; - isVisible?: boolean; - viewFieldId?: string; - }; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardOptions.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardOptions.ts deleted file mode 100644 index 733909477..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardOptions.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ComponentType } from 'react'; - -export type BoardOptions = { - newCardComponent: React.ReactNode; - CardComponent: ComponentType; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardOptionsHotkeyScope.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardOptionsHotkeyScope.ts deleted file mode 100644 index f726bc66f..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardOptionsHotkeyScope.ts +++ /dev/null @@ -1,3 +0,0 @@ -export enum BoardOptionsHotkeyScope { - Dropdown = 'board-options-dropdown', -} diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/ColumnHotkeyScope.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/ColumnHotkeyScope.ts deleted file mode 100644 index 9e490fe40..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/ColumnHotkeyScope.ts +++ /dev/null @@ -1,3 +0,0 @@ -export enum ColumnHotkeyScope { - EditColumnName = 'EditColumnNameHotkeyScope', -} diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/utils/getRecordBoardDeprecatedScopedStates.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/utils/getRecordBoardDeprecatedScopedStates.ts deleted file mode 100644 index 087a7ff51..000000000 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/utils/getRecordBoardDeprecatedScopedStates.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { activeRecordBoardDeprecatedCardIdsScopedState } from '@/object-record/record-board-deprecated/states/activeRecordBoardDeprecatedCardIdsScopedState'; -import { availableRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState'; -import { isCompactViewEnabledScopedState } from '@/object-record/record-board-deprecated/states/isCompactViewEnabledScopedState'; -import { isRecordBoardDeprecatedLoadedScopedState } from '@/object-record/record-board-deprecated/states/isRecordBoardDeprecatedLoadedScopedState'; -import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState'; -import { recordBoardColumnsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardColumnsScopedState'; -import { recordBoardFiltersScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedFiltersScopedState'; -import { recordBoardSortsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedSortsScopedState'; -import { savedOpportunitiesScopedState } from '@/object-record/record-board-deprecated/states/savedOpportunitiesScopedState'; -import { savedPipelineStepsScopedState } from '@/object-record/record-board-deprecated/states/savedPipelineStepsScopedState'; -import { savedRecordBoardDeprecatedColumnsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedColumnsScopedState'; -import { savedRecordsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordsScopedState'; -import { hiddenRecordBoardDeprecatedCardFieldsScopedSelector } from '@/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector'; -import { recordBoardCardFieldsByKeyScopedSelector } from '@/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector'; -import { selectedRecordBoardDeprecatedCardIdsScopedSelector } from '@/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector'; -import { visibleRecordBoardDeprecatedCardFieldsScopedSelector } from '@/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector'; -import { getScopedStateDeprecated } from '@/ui/utilities/recoil-scope/utils/getScopedStateDeprecated'; - -export const getRecordBoardDeprecatedScopedStates = ({ - recordBoardScopeId, -}: { - recordBoardScopeId: string; -}) => { - const activeCardIdsState = getScopedStateDeprecated( - activeRecordBoardDeprecatedCardIdsScopedState, - recordBoardScopeId, - ); - - const availableBoardCardFieldsState = getScopedStateDeprecated( - availableRecordBoardDeprecatedCardFieldsScopedState, - recordBoardScopeId, - ); - - const boardColumnsState = getScopedStateDeprecated( - recordBoardColumnsScopedState, - recordBoardScopeId, - ); - - const isBoardLoadedState = getScopedStateDeprecated( - isRecordBoardDeprecatedLoadedScopedState, - recordBoardScopeId, - ); - - const isCompactViewEnabledState = getScopedStateDeprecated( - isCompactViewEnabledScopedState, - recordBoardScopeId, - ); - - const savedBoardColumnsState = getScopedStateDeprecated( - savedRecordBoardDeprecatedColumnsScopedState, - recordBoardScopeId, - ); - - const boardFiltersState = getScopedStateDeprecated( - recordBoardFiltersScopedState, - recordBoardScopeId, - ); - - const boardSortsState = getScopedStateDeprecated( - recordBoardSortsScopedState, - recordBoardScopeId, - ); - - const savedCompaniesState = getScopedStateDeprecated( - savedRecordsScopedState, - recordBoardScopeId, - ); - - const savedOpportunitiesState = getScopedStateDeprecated( - savedOpportunitiesScopedState, - recordBoardScopeId, - ); - - const savedPipelineStepsState = getScopedStateDeprecated( - savedPipelineStepsScopedState, - recordBoardScopeId, - ); - - const onFieldsChangeState = getScopedStateDeprecated( - onFieldsChangeScopedState, - recordBoardScopeId, - ); - - // TODO: Family scoped selector - const boardCardFieldsByKeySelector = - recordBoardCardFieldsByKeyScopedSelector(recordBoardScopeId); - - const hiddenBoardCardFieldsSelector = - hiddenRecordBoardDeprecatedCardFieldsScopedSelector({ - scopeId: recordBoardScopeId, - }); - - const selectedCardIdsSelector = - selectedRecordBoardDeprecatedCardIdsScopedSelector({ - scopeId: recordBoardScopeId, - }); - - const visibleBoardCardFieldsSelector = - visibleRecordBoardDeprecatedCardFieldsScopedSelector({ - scopeId: recordBoardScopeId, - }); - - return { - activeCardIdsState, - availableBoardCardFieldsState, - boardColumnsState, - isBoardLoadedState, - isCompactViewEnabledState, - savedBoardColumnsState, - boardFiltersState, - boardSortsState, - onFieldsChangeState, - boardCardFieldsByKeySelector, - hiddenBoardCardFieldsSelector, - selectedCardIdsSelector, - visibleBoardCardFieldsSelector, - savedCompaniesState, - savedOpportunitiesState, - savedPipelineStepsState, - }; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board/record-board-column/components/RecordBoardColumnHeader.tsx b/packages/twenty-front/src/modules/object-record/record-board/record-board-column/components/RecordBoardColumnHeader.tsx index d1e36a3ec..de56a8650 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/record-board-column/components/RecordBoardColumnHeader.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/record-board-column/components/RecordBoardColumnHeader.tsx @@ -3,7 +3,7 @@ import styled from '@emotion/styled'; import { RecordBoardColumnDropdownMenu } from '@/object-record/record-board/record-board-column/components/RecordBoardColumnDropdownMenu'; import { RecordBoardColumnContext } from '@/object-record/record-board/record-board-column/contexts/RecordBoardColumnContext'; -import { BoardColumnHotkeyScope } from '@/object-record/record-board-deprecated/types/BoardColumnHotkeyScope'; +import { RecordBoardColumnHotkeyScope } from '@/object-record/record-board/types/BoardColumnHotkeyScope'; import { IconDotsVertical } from '@/ui/display/icon'; import { Tag } from '@/ui/display/tag/components/Tag'; import { LightIconButton } from '@/ui/input/button/components/LightIconButton'; @@ -57,9 +57,12 @@ export const RecordBoardColumnHeader = () => { const handleBoardColumnMenuOpen = () => { setIsBoardColumnMenuOpen(true); - setHotkeyScopeAndMemorizePreviousScope(BoardColumnHotkeyScope.BoardColumn, { - goto: false, - }); + setHotkeyScopeAndMemorizePreviousScope( + RecordBoardColumnHotkeyScope.BoardColumn, + { + goto: false, + }, + ); }; const handleBoardColumnMenuClose = () => { diff --git a/packages/twenty-front/src/modules/object-record/record-board/types/BoardColumnHotkeyScope.ts b/packages/twenty-front/src/modules/object-record/record-board/types/BoardColumnHotkeyScope.ts new file mode 100644 index 000000000..c62d93935 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-board/types/BoardColumnHotkeyScope.ts @@ -0,0 +1,3 @@ +export enum RecordBoardColumnHotkeyScope { + BoardColumn = 'board-column', +} diff --git a/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard.ts b/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard.ts index 0b53cbd7f..770e9d6bd 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard.ts @@ -2,7 +2,6 @@ import { useCallback, useMemo } from 'react'; import { OnDragEndResponder } from '@hello-pangea/dnd'; import { useRecoilState } from 'recoil'; -import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard'; @@ -12,6 +11,7 @@ import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefin import { useViewFields } from '@/views/hooks/internal/useViewFields'; import { useViews } from '@/views/hooks/internal/useViews'; import { GraphQLView } from '@/views/types/GraphQLView'; +import { mapBoardFieldDefinitionsToViewFields } from '@/views/utils/mapBoardFieldDefinitionsToViewFields'; import { mapArrayToObject } from '~/utils/array/mapArrayToObject'; import { moveArrayItem } from '~/utils/array/moveArrayItem'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; diff --git a/packages/twenty-front/src/modules/pipeline/components/PipelineAddButton.tsx b/packages/twenty-front/src/modules/pipeline/components/PipelineAddButton.tsx deleted file mode 100644 index 867474795..000000000 --- a/packages/twenty-front/src/modules/pipeline/components/PipelineAddButton.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { OpportunityPicker } from '@/companies/components/OpportunityPicker'; -import { useCreateOpportunity } from '@/object-record/record-board-deprecated/hooks/internal/useCreateOpportunity'; -import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect'; -import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; -import { PageHotkeyScope } from '@/types/PageHotkeyScope'; -import { IconPlus } from '@/ui/display/icon/index'; -import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; -import { IconButton } from '@/ui/input/button/components/IconButton'; -import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; -import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; -import { logError } from '~/utils/logError'; - -export const PipelineAddButton = () => { - const { enqueueSnackBar } = useSnackBar(); - - const { closeDropdown, toggleDropdown } = useDropdown( - 'add-pipeline-progress', - ); - - const createOpportunity = useCreateOpportunity(); - - const handleCompanySelected = ( - selectedCompany: EntityForSelect | null, - selectedPipelineStepId: string | null, - ) => { - if (!selectedCompany?.id) { - enqueueSnackBar( - 'There was a problem with the company selection, please retry.', - { variant: 'error' }, - ); - - logError('There was a problem with the company selection, please retry.'); - return; - } - - if (!selectedPipelineStepId) { - enqueueSnackBar( - 'There was a problem with the pipeline stage selection, please retry.', - { variant: 'error' }, - ); - - logError('There was a problem with the pipeline step selection.'); - return; - } - closeDropdown(); - createOpportunity(selectedCompany.id, selectedPipelineStepId); - }; - - return ( - - } - dropdownComponents={ - - } - hotkey={{ - key: 'c', - scope: PageHotkeyScope.OpportunitiesPage, - }} - dropdownHotkeyScope={{ - scope: RelationPickerHotkeyScope.RelationPicker, - }} - /> - ); -}; diff --git a/packages/twenty-front/src/modules/pipeline/hooks/__mocks__/usePipelineSteps.ts b/packages/twenty-front/src/modules/pipeline/hooks/__mocks__/usePipelineSteps.ts deleted file mode 100644 index 2d7c5a434..000000000 --- a/packages/twenty-front/src/modules/pipeline/hooks/__mocks__/usePipelineSteps.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { gql } from '@apollo/client'; - -export const query = gql` - mutation CreateOnePipelineStep($input: PipelineStepCreateInput!) { - createPipelineStep(data: $input) { - id - name - id - createdAt - opportunities { - edges { - node { - __typename - id - } - } - } - position - color - updatedAt - } - } -`; - -export const deleteQuery = gql` - mutation DeleteOnePipelineStep($idToDelete: ID!) { - deletePipelineStep(id: $idToDelete) { - id - } - } -`; - -export const mockId = '8f3b2121-f194-4ba4-9fbf-2d5a37126806'; -export const currentPipelineId = 'f088c8c9-05d2-4276-b065-b863cc7d0b33'; - -const data = { - color: 'yellow', - id: mockId, - position: 1, - name: 'Column Title', -}; - -export const variables = { - input: data, -}; - -export const deleteVariables = { idToDelete: 'columnId' }; - -export const responseData = { - ...data, - createdAt: '', - opportunities: { - edges: [], - }, - updatedAt: '', -}; - -export const deleteResponseData = { - id: 'columnId', -}; diff --git a/packages/twenty-front/src/modules/pipeline/hooks/__tests__/usePipelineSteps.test.tsx b/packages/twenty-front/src/modules/pipeline/hooks/__tests__/usePipelineSteps.test.tsx deleted file mode 100644 index b8c7c044e..000000000 --- a/packages/twenty-front/src/modules/pipeline/hooks/__tests__/usePipelineSteps.test.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { ReactNode } from 'react'; -import { act } from 'react-dom/test-utils'; -import { MockedProvider } from '@apollo/client/testing'; -import { renderHook } from '@testing-library/react'; -import { RecoilRoot, useSetRecoilState } from 'recoil'; - -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; -import { currentPipelineState } from '@/pipeline/states/currentPipelineState'; - -import { - currentPipelineId, - deleteQuery, - deleteResponseData, - deleteVariables, - mockId, - query, - responseData, - variables, -} from '../__mocks__/usePipelineSteps'; -import { usePipelineSteps } from '../usePipelineSteps'; - -const mocks = [ - { - request: { - query, - variables, - }, - result: jest.fn(() => ({ - data: { - createPipelineStep: responseData, - }, - })), - }, - { - request: { - query: deleteQuery, - variables: deleteVariables, - }, - result: jest.fn(() => ({ - data: { - deletePipelineStep: deleteResponseData, - }, - })), - }, -]; - -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); - -jest.mock('uuid', () => ({ - v4: jest.fn(() => mockId), -})); - -describe('usePipelineSteps', () => { - it('should handlePipelineStepAdd successfully', async () => { - const { result } = renderHook( - () => { - const setCurrentPipeline = useSetRecoilState(currentPipelineState); - setCurrentPipeline({ id: currentPipelineId }); - return usePipelineSteps(); - }, - { - wrapper: Wrapper, - }, - ); - - const boardColumn: BoardColumnDefinition = { - id: mockId, - title: 'Column Title', - colorCode: 'yellow', - position: 1, - }; - - await act(async () => { - const res = await result.current.handlePipelineStepAdd(boardColumn); - expect(res).toEqual(responseData); - }); - }); - - it('should handlePipelineStepDelete successfully', async () => { - const { result } = renderHook( - () => { - const setCurrentPipeline = useSetRecoilState(currentPipelineState); - setCurrentPipeline({ id: currentPipelineId }); - return usePipelineSteps(); - }, - { - wrapper: Wrapper, - }, - ); - - const boardColumnId = 'columnId'; - - await act(async () => { - const res = await result.current.handlePipelineStepDelete(boardColumnId); - expect(res).toEqual(deleteResponseData); - }); - }); -}); diff --git a/packages/twenty-front/src/modules/pipeline/hooks/usePipelineSteps.ts b/packages/twenty-front/src/modules/pipeline/hooks/usePipelineSteps.ts deleted file mode 100644 index 36544d32c..000000000 --- a/packages/twenty-front/src/modules/pipeline/hooks/usePipelineSteps.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; -import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord'; -import { BoardColumnDefinition } from '@/object-record/record-board-deprecated/types/BoardColumnDefinition'; -import { currentPipelineState } from '@/pipeline/states/currentPipelineState'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -export const usePipelineSteps = () => { - const { createOneRecord: createOnePipelineStep } = - useCreateOneRecord({ - objectNameSingular: CoreObjectNameSingular.PipelineStep, - }); - - const { deleteOneRecord: deleteOnePipelineStep } = useDeleteOneRecord({ - objectNameSingular: CoreObjectNameSingular.PipelineStep, - }); - - const handlePipelineStepAdd = useRecoilCallback( - ({ snapshot }) => - (boardColumn: BoardColumnDefinition) => { - const currentPipeline = snapshot - .getLoadable(currentPipelineState) - .getValue(); - if (!currentPipeline?.id) return; - - return createOnePipelineStep?.({ - color: boardColumn.colorCode ?? 'gray', - id: boardColumn.id, - position: boardColumn.position, - name: boardColumn.title, - }); - }, - [createOnePipelineStep], - ); - - const handlePipelineStepDelete = useRecoilCallback( - ({ snapshot }) => - (boardColumnId: string) => { - const currentPipeline = snapshot - .getLoadable(currentPipelineState) - .getValue(); - if (!currentPipeline?.id) return; - - return deleteOnePipelineStep?.(boardColumnId); - }, - [deleteOnePipelineStep], - ); - - return { handlePipelineStepAdd, handlePipelineStepDelete }; -}; diff --git a/packages/twenty-front/src/modules/pipeline/states/currentPipelineState.ts b/packages/twenty-front/src/modules/pipeline/states/currentPipelineState.ts deleted file mode 100644 index 2de1a5e5f..000000000 --- a/packages/twenty-front/src/modules/pipeline/states/currentPipelineState.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { atom } from 'recoil'; -import { undefined } from 'zod'; - -export const currentPipelineState = atom({ - key: 'currentPipelineState', - default: undefined, -}); diff --git a/packages/twenty-front/src/modules/pipeline/states/currentPipelineStepsState.ts b/packages/twenty-front/src/modules/pipeline/states/currentPipelineStepsState.ts deleted file mode 100644 index fce0bc745..000000000 --- a/packages/twenty-front/src/modules/pipeline/states/currentPipelineStepsState.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { atom } from 'recoil'; - -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -export const currentPipelineStepsState = atom({ - key: 'currentPipelineStepsState', - default: [], -}); diff --git a/packages/twenty-front/src/modules/pipeline/types/Opportunity.ts b/packages/twenty-front/src/modules/pipeline/types/Opportunity.ts deleted file mode 100644 index 3525841f8..000000000 --- a/packages/twenty-front/src/modules/pipeline/types/Opportunity.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Person } from '@/people/types/Person'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -export type Opportunity = { - [key: string]: any; - id: string; - amount: { - amountMicros: number; - currencyCode: string; - }; - closeDate: Date; - probability: number; - pipelineStepId: string; - pipelineStep: PipelineStep; - pointOfContactId: string; - pointOfContact: Pick; -}; diff --git a/packages/twenty-front/src/modules/pipeline/types/PipelineStep.ts b/packages/twenty-front/src/modules/pipeline/types/PipelineStep.ts deleted file mode 100644 index 76773be08..000000000 --- a/packages/twenty-front/src/modules/pipeline/types/PipelineStep.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type PipelineStep = { - id: string; - name: string; - color: string; - position: number; - createdAt: string; - updatedAt: string; -}; diff --git a/packages/twenty-front/src/modules/views/types/ViewField.ts b/packages/twenty-front/src/modules/views/types/ViewField.ts index 0703b00bf..0e1d44bb4 100644 --- a/packages/twenty-front/src/modules/views/types/ViewField.ts +++ b/packages/twenty-front/src/modules/views/types/ViewField.ts @@ -1,4 +1,4 @@ -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; @@ -10,5 +10,5 @@ export type ViewField = { size: number; definition: | ColumnDefinition - | BoardFieldDefinition; + | RecordBoardFieldDefinition; }; diff --git a/packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts similarity index 83% rename from packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts rename to packages/twenty-front/src/modules/views/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts index b8a34352a..6f432e933 100644 --- a/packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts +++ b/packages/twenty-front/src/modules/views/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts @@ -1,10 +1,10 @@ -import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields'; -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { mapBoardFieldDefinitionsToViewFields } from '@/views/utils/mapBoardFieldDefinitionsToViewFields'; describe('mapBoardFieldDefinitionsToViewFields', () => { it('should map board field definitions to view fields', () => { - const fieldDefinitions: BoardFieldDefinition[] = [ + const fieldDefinitions: RecordBoardFieldDefinition[] = [ { fieldMetadataId: 'fieldMetadataId', label: 'label', diff --git a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts index 74d1f6d66..da0a27668 100644 --- a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts +++ b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts @@ -1,6 +1,5 @@ import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; import { Sort } from '@/object-record/object-sort-dropdown/types/Sort'; -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { ViewField } from '@/views/types/ViewField'; @@ -8,7 +7,6 @@ import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewSort } from '@/views/types/ViewSort'; import { mapColumnDefinitionsToViewFields } from '@/views/utils/mapColumnDefinitionToViewField'; -import { mapViewFieldsToBoardFieldDefinitions } from '@/views/utils/mapViewFieldsToBoardFieldDefinitions'; import { mapViewFieldsToColumnDefinitions } from '@/views/utils/mapViewFieldsToColumnDefinitions'; import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; @@ -192,84 +190,6 @@ describe('mapViewFieldsToColumnDefinitions', () => { }); }); -describe('mapViewFieldsToBoardFieldDefinitions', () => { - it('should map visible ViewFields to BoardFieldDefinitions and filter out missing fieldMetadata', () => { - const viewFields = [ - { - id: 1, - fieldMetadataId: 1, - position: 1, - isVisible: true, - }, - { - id: 2, - fieldMetadataId: 2, - position: 2, - isVisible: false, - }, - { - id: 3, - fieldMetadataId: 3, - position: 3, - isVisible: true, - }, - ]; - - const fieldsMetadata = [ - { - fieldMetadataId: 1, - label: 'Field 1', - metadata: {}, - position: 1, - infoTooltipContent: 'Tooltip content for Field 1', - iconName: 'icon-field-1', - type: 'string', - }, - { - fieldMetadataId: 3, - label: 'Field 3', - metadata: {}, - position: 3, - infoTooltipContent: 'Tooltip for Field 3', - iconName: 'icon-field-3', - type: 'number', - }, - ]; - - const expectedBoardFieldDefinitions = [ - { - fieldMetadataId: 1, - label: 'Field 1', - metadata: {}, - position: 1, - infoTooltipContent: 'Tooltip content for Field 1', - iconName: 'icon-field-1', - type: 'string', - isVisible: true, - viewFieldId: 1, - }, - { - fieldMetadataId: 3, - label: 'Field 3', - metadata: {}, - position: 3, - infoTooltipContent: 'Tooltip for Field 3', - iconName: 'icon-field-3', - type: 'number', - isVisible: true, - viewFieldId: 3, - }, - ]; - - const actualBoardFieldDefinitions = mapViewFieldsToBoardFieldDefinitions( - viewFields as unknown as ViewField[], - fieldsMetadata as unknown as BoardFieldDefinition[], - ); - - expect(actualBoardFieldDefinitions).toEqual(expectedBoardFieldDefinitions); - }); -}); - describe('mapColumnDefinitionsToViewFields', () => { it('should map ColumnDefinitions to ViewFields, setting defaults and using viewFieldId if present', () => { const columnDefinitions = [ diff --git a/packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts b/packages/twenty-front/src/modules/views/utils/mapBoardFieldDefinitionsToViewFields.ts similarity index 76% rename from packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts rename to packages/twenty-front/src/modules/views/utils/mapBoardFieldDefinitionsToViewFields.ts index f02d992af..bf183ca0f 100644 --- a/packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts +++ b/packages/twenty-front/src/modules/views/utils/mapBoardFieldDefinitionsToViewFields.ts @@ -1,11 +1,11 @@ import { v4 } from 'uuid'; -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ViewField } from '@/views/types/ViewField'; export const mapBoardFieldDefinitionsToViewFields = ( - fieldsDefinitions: BoardFieldDefinition[], + fieldsDefinitions: RecordBoardFieldDefinition[], ): ViewField[] => { return fieldsDefinitions.map( (fieldDefinition): ViewField => ({ diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts deleted file mode 100644 index 5a9573f2f..000000000 --- a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; -import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { isNonNullable } from '~/utils/isNonNullable'; - -import { ViewField } from '../types/ViewField'; - -export const mapViewFieldsToBoardFieldDefinitions = ( - viewFields: ViewField[], - fieldsMetadata: BoardFieldDefinition[], -): BoardFieldDefinition[] => { - return viewFields - .map((viewField) => { - const correspondingFieldMetadata = fieldsMetadata.find( - ({ fieldMetadataId }) => viewField.fieldMetadataId === fieldMetadataId, - ); - - return correspondingFieldMetadata - ? { - fieldMetadataId: viewField.fieldMetadataId, - label: correspondingFieldMetadata.label, - metadata: correspondingFieldMetadata.metadata, - infoTooltipContent: correspondingFieldMetadata.infoTooltipContent, - iconName: correspondingFieldMetadata.iconName, - type: correspondingFieldMetadata.type, - position: viewField.position, - isVisible: viewField.isVisible, - viewFieldId: viewField.id, - } - : null; - }) - .filter(isNonNullable); -}; diff --git a/packages/twenty-front/src/pages/opportunities/Opportunities.tsx b/packages/twenty-front/src/pages/opportunities/Opportunities.tsx deleted file mode 100644 index e091df565..000000000 --- a/packages/twenty-front/src/pages/opportunities/Opportunities.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import styled from '@emotion/styled'; - -import { CompanyBoard } from '@/companies/board/components/CompanyBoard'; -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; -import { PipelineAddButton } from '@/pipeline/components/PipelineAddButton'; -import { usePipelineSteps } from '@/pipeline/hooks/usePipelineSteps'; -import { PipelineStep } from '@/pipeline/types/PipelineStep'; -import { IconTargetArrow } from '@/ui/display/icon'; -import { PageBody } from '@/ui/layout/page/PageBody'; -import { PageContainer } from '@/ui/layout/page/PageContainer'; -import { PageHeader } from '@/ui/layout/page/PageHeader'; - -const StyledBoardContainer = styled.div` - display: flex; - height: 100%; - width: 100%; -`; - -export const Opportunities = () => { - const { handlePipelineStepAdd, handlePipelineStepDelete } = - usePipelineSteps(); - - const { updateOneRecord: updateOnePipelineStep } = - useUpdateOneRecord({ - objectNameSingular: CoreObjectNameSingular.PipelineStep, - }); - - const handleEditColumnTitle = ({ - columnId, - title, - color, - }: { - columnId: string; - title: string; - color: string; - }) => { - updateOnePipelineStep?.({ - idToUpdate: columnId, - updateOneRecordInput: { name: title, color }, - }); - }; - - return ( - - - - - - - - - - - ); -}; diff --git a/packages/twenty-front/src/pages/opportunities/__stories__/Opportunities.stories.tsx b/packages/twenty-front/src/pages/opportunities/__stories__/Opportunities.stories.tsx deleted file mode 100644 index b0ac3886c..000000000 --- a/packages/twenty-front/src/pages/opportunities/__stories__/Opportunities.stories.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { userEvent, within } from '@storybook/test'; - -import { ObjectMetadataItemsRelationPickerEffect } from '@/object-metadata/components/ObjectMetadataItemsRelationPickerEffect'; -import { AppPath } from '@/types/AppPath'; -import { - PageDecorator, - PageDecoratorArgs, -} from '~/testing/decorators/PageDecorator'; -import { graphqlMocks } from '~/testing/graphqlMocks'; - -import { Opportunities } from '../Opportunities'; - -const meta: Meta = { - title: 'Pages/Opportunities/Default', - component: Opportunities, - decorators: [ - (Story) => { - return ( - <> - - - - ); - }, - PageDecorator, - ], - args: { routePath: AppPath.OpportunitiesPage }, - parameters: { - msw: graphqlMocks, - }, -}; - -export default meta; - -export type Story = StoryObj; - -export const Default: Story = {}; - -export const AddCompanyFromHeader: Story = { - play: async ({ canvasElement, step }) => { - const canvas = within(canvasElement); - - await step('Click on the add company button', async () => { - const button = await canvas.findByTestId('add-company-progress-button'); - - await userEvent.click(button); - - await canvas.findByRole( - 'listitem', - { name: (_, element) => !!element?.textContent?.includes('Algolia') }, - { timeout: 1000 }, - ); - }); - - await step('Change pipeline stage', async () => { - const pipelineStepDropdownHeader = await canvas.findByRole( - 'listitem', - { name: (_, element) => !!element?.textContent?.includes('New') }, - { timeout: 1000 }, - ); - - const pipelineStepDropdownUnfoldButton = within( - pipelineStepDropdownHeader, - ).getByRole('button'); - - await userEvent.click(pipelineStepDropdownUnfoldButton); - - const menuItem1 = await canvas.findByRole( - 'listitem', - { name: (_, element) => !!element?.textContent?.includes('Screening') }, - { timeout: 1000 }, - ); - - await userEvent.click(menuItem1); - }); - - // TODO: mock add company mutation and add step for company creation - }, -}; diff --git a/packages/twenty-front/src/pages/opportunities/constants/opportunityBoardFilterDefinitions.tsx b/packages/twenty-front/src/pages/opportunities/constants/opportunityBoardFilterDefinitions.tsx deleted file mode 100644 index 2f81d1d12..000000000 --- a/packages/twenty-front/src/pages/opportunities/constants/opportunityBoardFilterDefinitions.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FilterDefinitionByEntity } from '@/object-record/object-filter-dropdown/types/FilterDefinitionByEntity'; -import { Opportunity } from '@/pipeline/types/Opportunity'; - -export const opportunityBoardFilterDefinitions: FilterDefinitionByEntity[] = - [ - { - fieldMetadataId: 'amount', - label: 'Amount', - iconName: 'IconCurrencyDollar', - type: 'NUMBER', - }, - { - fieldMetadataId: 'closeDate', - label: 'Close date', - iconName: 'IconCalendarEvent', - type: 'DATE_TIME', - }, - { - fieldMetadataId: 'companyId', - label: 'Company', - iconName: 'IconBuildingSkyscraper', - type: 'RELATION', - }, - { - fieldMetadataId: 'pointOfContactId', - label: 'Point of contact', - iconName: 'IconUser', - type: 'RELATION', - }, - ]; diff --git a/packages/twenty-front/src/pages/opportunities/constants/opportunityBoardSortDefinitions.tsx b/packages/twenty-front/src/pages/opportunities/constants/opportunityBoardSortDefinitions.tsx deleted file mode 100644 index d099da721..000000000 --- a/packages/twenty-front/src/pages/opportunities/constants/opportunityBoardSortDefinitions.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition'; - -export const opportunityBoardSortDefinitions: SortDefinition[] = [ - { - fieldMetadataId: 'createdAt', - label: 'Creation', - iconName: 'IconCalendarEvent', - }, - { - fieldMetadataId: 'amount', - label: 'Amount', - iconName: 'IconCurrencyDollar', - }, - { - fieldMetadataId: 'closeDate', - label: 'Expected close date', - iconName: 'IconCalendarEvent', - }, -]; diff --git a/packages/twenty-front/src/pages/opportunities/opportunitiesBoardOptions.tsx b/packages/twenty-front/src/pages/opportunities/opportunitiesBoardOptions.tsx deleted file mode 100644 index 679768ee8..000000000 --- a/packages/twenty-front/src/pages/opportunities/opportunitiesBoardOptions.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { CompanyBoardCard } from '@/companies/components/CompanyBoardCard'; -import { NewOpportunityButton } from '@/companies/components/NewOpportunityButton'; -import { BoardOptions } from '@/object-record/record-board-deprecated/types/BoardOptions'; -import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope'; - -export const opportunitiesBoardOptions: BoardOptions = { - newCardComponent: ( - - - - ), - CardComponent: CompanyBoardCard, -}; diff --git a/packages/twenty-front/src/testing/graphqlMocks.ts b/packages/twenty-front/src/testing/graphqlMocks.ts index aa9b8aa9a..9908092db 100644 --- a/packages/twenty-front/src/testing/graphqlMocks.ts +++ b/packages/twenty-front/src/testing/graphqlMocks.ts @@ -12,7 +12,6 @@ import { mockedDuplicateCompanyData, } from '~/testing/mock-data/companies'; import { mockedClientConfig } from '~/testing/mock-data/config'; -import { mockedPipelineSteps } from '~/testing/mock-data/pipeline-steps'; import { mockedUsersData } from '~/testing/mock-data/users'; import { mockWorkspaceMembers } from '~/testing/mock-data/workspace-members'; @@ -249,29 +248,6 @@ export const graphqlMocks = { }, }); }), - graphql.query('FindManyPipelineSteps', () => { - return HttpResponse.json({ - data: { - pipelineSteps: { - edges: mockedPipelineSteps.map((step) => ({ - node: { - ...step, - opportunities: { - edges: [], - }, - }, - cursor: null, - })), - pageInfo: { - hasNextPage: false, - hasPreviousPage: false, - startCursor: null, - endCursor: null, - }, - }, - }, - }); - }), graphql.query('FindManyOpportunities', () => { return HttpResponse.json({ data: { diff --git a/packages/twenty-front/src/testing/mock-data/pipeline-steps.ts b/packages/twenty-front/src/testing/mock-data/pipeline-steps.ts deleted file mode 100644 index 341bde89b..000000000 --- a/packages/twenty-front/src/testing/mock-data/pipeline-steps.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { PipelineStep } from '@/pipeline/types/PipelineStep'; - -const dates = { - updatedAt: '2021-06-01T10:23:42.33625+00:00', - createdAt: '2021-06-01T10:23:42.33625+00:00', -}; - -export const mockedPipelineSteps: Array = [ - { - id: '6edf4ead-006a-46e1-9c6d-228f1d0143c9', - color: 'red', - name: 'New', - position: 0, - ...dates, - }, - { - id: '30b14887-d592-427d-bd97-6e670158db02', - color: 'sky', - name: 'Meeting', - position: 2, - ...dates, - }, - { - id: 'bea8bb7b-5467-48a6-9a8a-a8fa500123fe', - - color: 'yellow', - name: 'Customer', - position: 4, - ...dates, - }, - { - id: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a', - color: 'purple', - name: 'Screening', - position: 1, - ...dates, - }, - { - id: 'db5a6648-d80d-4020-af64-4817ab4a12e8', - color: 'turquoise', - name: 'Proposal', - position: 3, - ...dates, - }, -];