Unselect record table records on table body click (#8306)
We have previously fixed the unselection of table records on click outside. However, the ref was mispositioned as it selected the full height table. In the case of low record numbers, we also want the unselection to happen on table body click
This commit is contained in:
@ -3,14 +3,20 @@ import { isNonEmptyString, isNull } from '@sniptt/guards';
|
||||
|
||||
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||
import { RecordTableContextProvider } from '@/object-record/record-table/components/RecordTableContextProvider';
|
||||
import { RECORD_TABLE_CLICK_OUTSIDE_LISTENER_ID } from '@/object-record/record-table/constants/RecordTableClickOutsideListenerId';
|
||||
import { RecordTableEmptyState } from '@/object-record/record-table/empty-state/components/RecordTableEmptyState';
|
||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||
import { RecordTableBody } from '@/object-record/record-table/record-table-body/components/RecordTableBody';
|
||||
import { RecordTableBodyEffect } from '@/object-record/record-table/record-table-body/components/RecordTableBodyEffect';
|
||||
import { RecordTableBodyUnselectEffect } from '@/object-record/record-table/record-table-body/components/RecordTableBodyUnselectEffect';
|
||||
import { RecordTableHeader } from '@/object-record/record-table/record-table-header/components/RecordTableHeader';
|
||||
import { isRecordTableInitialLoadingComponentState } from '@/object-record/record-table/states/isRecordTableInitialLoadingComponentState';
|
||||
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||
import { DragSelect } from '@/ui/utilities/drag-select/components/DragSelect';
|
||||
import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
|
||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||
import { useRef } from 'react';
|
||||
|
||||
const StyledTable = styled.table`
|
||||
border-radius: ${({ theme }) => theme.border.radius.sm};
|
||||
@ -32,11 +38,17 @@ export const RecordTable = ({
|
||||
objectNameSingular,
|
||||
onColumnsChange,
|
||||
}: RecordTableProps) => {
|
||||
const tableBodyRef = useRef<HTMLTableElement>(null);
|
||||
|
||||
const isRecordTableInitialLoading = useRecoilComponentValueV2(
|
||||
isRecordTableInitialLoadingComponentState,
|
||||
recordTableId,
|
||||
);
|
||||
|
||||
const { toggleClickOutsideListener } = useClickOutsideListener(
|
||||
RECORD_TABLE_CLICK_OUTSIDE_LISTENER_ID,
|
||||
);
|
||||
|
||||
const tableRowIds = useRecoilComponentValueV2(
|
||||
tableRowIdsComponentState,
|
||||
recordTableId,
|
||||
@ -47,6 +59,10 @@ export const RecordTable = ({
|
||||
recordTableId,
|
||||
);
|
||||
|
||||
const { resetTableRowSelection, setRowSelected } = useRecordTable({
|
||||
recordTableId,
|
||||
});
|
||||
|
||||
const recordTableIsEmpty =
|
||||
!isRecordTableInitialLoading &&
|
||||
tableRowIds.length === 0 &&
|
||||
@ -67,15 +83,32 @@ export const RecordTable = ({
|
||||
viewBarId={viewBarId}
|
||||
>
|
||||
<RecordTableBodyEffect />
|
||||
<RecordTableBodyUnselectEffect
|
||||
tableBodyRef={tableBodyRef}
|
||||
recordTableId={recordTableId}
|
||||
/>
|
||||
{recordTableIsEmpty ? (
|
||||
<RecordTableEmptyState />
|
||||
) : (
|
||||
<StyledTable className="entity-table-cell">
|
||||
<RecordTableHeader
|
||||
objectMetadataNameSingular={objectNameSingular}
|
||||
<>
|
||||
<StyledTable className="entity-table-cell" ref={tableBodyRef}>
|
||||
<RecordTableHeader
|
||||
objectMetadataNameSingular={objectNameSingular}
|
||||
/>
|
||||
<RecordTableBody />
|
||||
</StyledTable>
|
||||
<DragSelect
|
||||
dragSelectable={tableBodyRef}
|
||||
onDragSelectionStart={() => {
|
||||
resetTableRowSelection();
|
||||
toggleClickOutsideListener(false);
|
||||
}}
|
||||
onDragSelectionChange={setRowSelected}
|
||||
onDragSelectionEnd={() => {
|
||||
toggleClickOutsideListener(true);
|
||||
}}
|
||||
/>
|
||||
<RecordTableBody />
|
||||
</StyledTable>
|
||||
</>
|
||||
)}
|
||||
</RecordTableContextProvider>
|
||||
</RecordTableComponentInstance>
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
import styled from '@emotion/styled';
|
||||
import { useRef } from 'react';
|
||||
import { useRecoilCallback } from 'recoil';
|
||||
|
||||
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
|
||||
@ -7,15 +6,11 @@ import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'
|
||||
import { RecordTable } from '@/object-record/record-table/components/RecordTable';
|
||||
import { EntityDeleteContext } from '@/object-record/record-table/contexts/EntityDeleteHookContext';
|
||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||
import { DragSelect } from '@/ui/utilities/drag-select/components/DragSelect';
|
||||
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
||||
import { useSaveCurrentViewFields } from '@/views/hooks/useSaveCurrentViewFields';
|
||||
import { mapColumnDefinitionsToViewFields } from '@/views/utils/mapColumnDefinitionToViewField';
|
||||
|
||||
import { RecordUpdateContext } from '../contexts/EntityUpdateMutationHookContext';
|
||||
import { useRecordTable } from '../hooks/useRecordTable';
|
||||
|
||||
import { RecordTableInternalEffect } from './RecordTableInternalEffect';
|
||||
|
||||
const StyledTableWithHeader = styled.div`
|
||||
height: 100%;
|
||||
@ -45,12 +40,6 @@ export const RecordTableWithWrappers = ({
|
||||
recordTableId,
|
||||
viewBarId,
|
||||
}: RecordTableWithWrappersProps) => {
|
||||
const tableBodyRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const { resetTableRowSelection, setRowSelected } = useRecordTable({
|
||||
recordTableId,
|
||||
});
|
||||
|
||||
const { saveViewFields } = useSaveCurrentViewFields(viewBarId);
|
||||
|
||||
const { deleteOneRecord } = useDeleteOneRecord({ objectNameSingular });
|
||||
@ -72,25 +61,14 @@ export const RecordTableWithWrappers = ({
|
||||
<RecordUpdateContext.Provider value={updateRecordMutation}>
|
||||
<StyledTableWithHeader>
|
||||
<StyledTableContainer>
|
||||
<StyledTableInternalContainer ref={tableBodyRef}>
|
||||
<StyledTableInternalContainer>
|
||||
<RecordTable
|
||||
viewBarId={viewBarId}
|
||||
recordTableId={recordTableId}
|
||||
objectNameSingular={objectNameSingular}
|
||||
onColumnsChange={handleColumnsChange}
|
||||
/>
|
||||
<DragSelect
|
||||
dragSelectable={tableBodyRef}
|
||||
onDragSelectionStart={() => {
|
||||
resetTableRowSelection();
|
||||
}}
|
||||
onDragSelectionChange={setRowSelected}
|
||||
/>
|
||||
</StyledTableInternalContainer>
|
||||
<RecordTableInternalEffect
|
||||
tableBodyRef={tableBodyRef}
|
||||
recordTableId={recordTableId}
|
||||
/>
|
||||
</StyledTableContainer>
|
||||
</StyledTableWithHeader>
|
||||
</RecordUpdateContext.Provider>
|
||||
|
||||
@ -7,16 +7,16 @@ import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkey
|
||||
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
|
||||
import { useListenClickOutsideV2 } from '@/ui/utilities/pointer-event/hooks/useListenClickOutsideV2';
|
||||
|
||||
type RecordTableInternalEffectProps = {
|
||||
recordTableId: string;
|
||||
type RecordTableBodyUnselectEffectProps = {
|
||||
tableBodyRef: React.RefObject<HTMLDivElement>;
|
||||
recordTableId: string;
|
||||
};
|
||||
|
||||
export const RecordTableInternalEffect = ({
|
||||
recordTableId,
|
||||
export const RecordTableBodyUnselectEffect = ({
|
||||
tableBodyRef,
|
||||
}: RecordTableInternalEffectProps) => {
|
||||
const leaveTableFocus = useLeaveTableFocus(recordTableId);
|
||||
recordTableId,
|
||||
}: RecordTableBodyUnselectEffectProps) => {
|
||||
const leaveTableFocus = useLeaveTableFocus();
|
||||
|
||||
const { resetTableRowSelection, useMapKeyboardToSoftFocus } = useRecordTable({
|
||||
recordTableId,
|
||||
Reference in New Issue
Block a user