Fix new board bugs (#3730)

* Fix freeze on field visibility change on board

* Fix

* Fix lint
This commit is contained in:
Charles Bochet
2024-01-31 17:21:17 +01:00
committed by GitHub
parent e787b4e3b8
commit 4290db3566
3 changed files with 53 additions and 42 deletions

View File

@ -1,6 +1,6 @@
import { useState } from 'react'; import { useState } from 'react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useSetRecoilState } from 'recoil'; import { useRecoilCallback, useSetRecoilState } from 'recoil';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
@ -18,10 +18,12 @@ import { recordIndexSortsState } from '@/object-record/record-index/states/recor
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
import { SpreadsheetImportProvider } from '@/spreadsheet-import/provider/components/SpreadsheetImportProvider'; import { SpreadsheetImportProvider } from '@/spreadsheet-import/provider/components/SpreadsheetImportProvider';
import { ViewBar } from '@/views/components/ViewBar'; import { ViewBar } from '@/views/components/ViewBar';
import { ViewField } from '@/views/types/ViewField';
import { ViewType } from '@/views/types/ViewType'; import { ViewType } from '@/views/types/ViewType';
import { mapViewFieldsToColumnDefinitions } from '@/views/utils/mapViewFieldsToColumnDefinitions'; import { mapViewFieldsToColumnDefinitions } from '@/views/utils/mapViewFieldsToColumnDefinitions';
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
const StyledContainer = styled.div` const StyledContainer = styled.div`
display: flex; display: flex;
@ -58,9 +60,6 @@ export const RecordIndexContainer = ({
const { columnDefinitions } = const { columnDefinitions } =
useColumnDefinitionsFromFieldMetadata(objectMetadataItem); useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
const setRecordIndexFieldDefinitions = useSetRecoilState(
recordIndexFieldDefinitionsState,
);
const setRecordIndexFilters = useSetRecoilState(recordIndexFiltersState); const setRecordIndexFilters = useSetRecoilState(recordIndexFiltersState);
const setRecordIndexSorts = useSetRecoilState(recordIndexSortsState); const setRecordIndexSorts = useSetRecoilState(recordIndexSortsState);
@ -68,6 +67,32 @@ export const RecordIndexContainer = ({
recordTableId: recordIndexId, recordTableId: recordIndexId,
}); });
const onViewFieldsChange = useRecoilCallback(
({ set, snapshot }) =>
(viewFields: ViewField[]) => {
setTableColumns(
mapViewFieldsToColumnDefinitions(viewFields, columnDefinitions),
);
const existingRecordIndexFieldDefinitions = snapshot
.getLoadable(recordIndexFieldDefinitionsState)
.getValue();
const newFieldDefinitions = mapViewFieldsToColumnDefinitions(
viewFields,
columnDefinitions,
);
if (
!isDeeplyEqual(
existingRecordIndexFieldDefinitions,
newFieldDefinitions,
)
)
set(recordIndexFieldDefinitionsState, newFieldDefinitions);
},
[columnDefinitions, setTableColumns],
);
return ( return (
<StyledContainer> <StyledContainer>
<SpreadsheetImportProvider> <SpreadsheetImportProvider>
@ -81,14 +106,7 @@ export const RecordIndexContainer = ({
/> />
} }
optionsDropdownScopeId={RECORD_INDEX_OPTIONS_DROPDOWN_ID} optionsDropdownScopeId={RECORD_INDEX_OPTIONS_DROPDOWN_ID}
onViewFieldsChange={(viewFields) => { onViewFieldsChange={onViewFieldsChange}
setTableColumns(
mapViewFieldsToColumnDefinitions(viewFields, columnDefinitions),
);
setRecordIndexFieldDefinitions(
mapViewFieldsToColumnDefinitions(viewFields, columnDefinitions),
);
}}
onViewFiltersChange={(viewFilters) => { onViewFiltersChange={(viewFilters) => {
setTableFilters(mapViewFiltersToFilters(viewFilters)); setTableFilters(mapViewFiltersToFilters(viewFilters));
setRecordIndexFilters(mapViewFiltersToFilters(viewFilters)); setRecordIndexFilters(mapViewFiltersToFilters(viewFilters));

View File

@ -144,13 +144,14 @@ export const useRecordIndexOptionsForBoard = ({
updatedFieldDefinition.fieldMetadataId updatedFieldDefinition.fieldMetadataId
? { ? {
...exitingFieldDefinition, ...exitingFieldDefinition,
isVisible: !updatedFieldDefinition.isVisible, isVisible: !exitingFieldDefinition.isVisible,
} }
: exitingFieldDefinition, : exitingFieldDefinition,
); );
} }
setRecordIndexFieldDefinitions(updatedFieldsDefinitions); setRecordIndexFieldDefinitions(updatedFieldsDefinitions);
persistViewFields( persistViewFields(
mapBoardFieldDefinitionsToViewFields(updatedFieldsDefinitions), mapBoardFieldDefinitionsToViewFields(updatedFieldsDefinitions),
); );

View File

@ -18,10 +18,6 @@ type RecordTableRowProps = {
rowIndex: number; rowIndex: number;
}; };
const StyledPlaceholder = styled.td`
height: 30px;
`;
const StyledTd = styled.td` const StyledTd = styled.td`
background-color: ${({ theme }) => theme.background.primary}; background-color: ${({ theme }) => theme.background.primary};
`; `;
@ -56,31 +52,27 @@ export const RecordTableRow = ({ recordId, rowIndex }: RecordTableRowProps) => {
data-testid={`row-id-${recordId}`} data-testid={`row-id-${recordId}`}
data-selectable-id={recordId} data-selectable-id={recordId}
> >
{inView ? ( <StyledTd>
<> <CheckboxCell />
<StyledTd> </StyledTd>
<CheckboxCell /> {[...visibleTableColumns]
</StyledTd> .sort((columnA, columnB) => columnA.position - columnB.position)
{[...visibleTableColumns] .map((column, columnIndex) => {
.sort((columnA, columnB) => columnA.position - columnB.position) return inView ? (
.map((column, columnIndex) => { <RecordTableCellContext.Provider
return ( value={{
<RecordTableCellContext.Provider columnDefinition: column,
value={{ columnIndex,
columnDefinition: column, }}
columnIndex, key={column.fieldMetadataId}
}} >
key={column.fieldMetadataId} <RecordTableCellContainer />
> </RecordTableCellContext.Provider>
<RecordTableCellContainer /> ) : (
</RecordTableCellContext.Provider> <td></td>
); );
})} })}
<td></td> <td></td>
</>
) : (
<StyledPlaceholder />
)}
</tr> </tr>
</RecordTableRowContext.Provider> </RecordTableRowContext.Provider>
); );