Fix new board bugs (#3730)
* Fix freeze on field visibility change on board * Fix * Fix lint
This commit is contained in:
@ -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));
|
||||||
|
|||||||
@ -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),
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user