fix: impossible to unselect all check box (#4471)

* fix: impossible to unselect all check box

* fix: newly loaded records adopts select/unselect status

* Fix

* Fixes

* Fixed naming

* Used better naming

* Fixed naming

---------

Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
Ravan
2024-03-29 22:32:22 +05:30
committed by GitHub
parent 09e77db74c
commit aaf429a907
8 changed files with 75 additions and 16 deletions

View File

@ -38,10 +38,6 @@ export const ObjectSortDropdownButton = ({
setSelectedSortDirection('asc'); setSelectedSortDirection('asc');
}, []); }, []);
const { isSortSelectedState } = useSortDropdown({
sortDropdownId: sortDropdownId,
});
const { toggleDropdown } = useDropdown(OBJECT_SORT_DROPDOWN_ID); const { toggleDropdown } = useDropdown(OBJECT_SORT_DROPDOWN_ID);
const handleButtonClick = () => { const handleButtonClick = () => {
@ -49,7 +45,11 @@ export const ObjectSortDropdownButton = ({
resetState(); resetState();
}; };
const { availableSortDefinitionsState, onSortSelectState } = useSortDropdown({ const {
availableSortDefinitionsState,
onSortSelectState,
isSortSelectedState,
} = useSortDropdown({
sortDropdownId: sortDropdownId, sortDropdownId: sortDropdownId,
}); });

View File

@ -68,7 +68,7 @@ export const RecordTableWithWrappers = ({
isRecordTableInitialLoadingState, isRecordTableInitialLoadingState,
); );
const { resetTableRowSelection, setRowSelectedState } = useRecordTable({ const { resetTableRowSelection, setRowSelected } = useRecordTable({
recordTableId, recordTableId,
}); });
@ -109,7 +109,7 @@ export const RecordTableWithWrappers = ({
<DragSelect <DragSelect
dragSelectable={tableBodyRef} dragSelectable={tableBodyRef}
onDragSelectionStart={resetTableRowSelection} onDragSelectionStart={resetTableRowSelection}
onDragSelectionChange={setRowSelectedState} onDragSelectionChange={setRowSelected}
/> />
</div> </div>
<RecordTableInternalEffect <RecordTableInternalEffect

View File

@ -20,13 +20,20 @@ export const SelectAllCheckbox = () => {
const { allRowsSelectedStatusSelector } = useRecordTableStates(); const { allRowsSelectedStatusSelector } = useRecordTableStates();
const allRowsSelectedStatus = useRecoilValue(allRowsSelectedStatusSelector()); const allRowsSelectedStatus = useRecoilValue(allRowsSelectedStatusSelector());
const { selectAllRows } = useRecordTable(); const { selectAllRows, resetTableRowSelection, setHasUserSelectedAllRows } =
useRecordTable();
const checked = allRowsSelectedStatus === 'all'; const checked = allRowsSelectedStatus === 'all';
const indeterminate = allRowsSelectedStatus === 'some'; const indeterminate = allRowsSelectedStatus === 'some';
const onChange = () => { const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
selectAllRows(); if (e.target.checked) {
setHasUserSelectedAllRows(true);
selectAllRows();
} else {
setHasUserSelectedAllRows(false);
resetTableRowSelection();
}
}; };
return ( return (

View File

@ -1,3 +1,4 @@
import { hasUserSelectedAllRowsComponentState } from '@/object-record/record-table/record-table-row/states/hasUserSelectedAllRowsFamilyState';
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState'; import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
import { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext'; import { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext';
import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState'; import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState';
@ -48,7 +49,6 @@ export const useRecordTableStates = (recordTableId?: string) => {
tableColumnsComponentState, tableColumnsComponentState,
scopeId, scopeId,
), ),
onColumnsChangeState: extractComponentState( onColumnsChangeState: extractComponentState(
onColumnsChangeComponentState, onColumnsChangeComponentState,
scopeId, scopeId,
@ -98,6 +98,10 @@ export const useRecordTableStates = (recordTableId?: string) => {
isRowSelectedComponentFamilyState, isRowSelectedComponentFamilyState,
scopeId, scopeId,
), ),
hasUserSelectedAllRowState: extractComponentState(
hasUserSelectedAllRowsComponentState,
scopeId,
),
allRowsSelectedStatusSelector: extractComponentReadOnlySelector( allRowsSelectedStatusSelector: extractComponentReadOnlySelector(
allRowsSelectedStatusComponentSelector, allRowsSelectedStatusComponentSelector,
scopeId, scopeId,

View File

@ -0,0 +1,16 @@
import { useRecoilCallback } from 'recoil';
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
export const useSetHasUserSelectedAllRows = (recordTableId?: string) => {
const { hasUserSelectedAllRowState: hasUserSelectedAllRowFamilyState } =
useRecordTableStates(recordTableId);
return useRecoilCallback(
({ set }) =>
(selected: boolean) => {
set(hasUserSelectedAllRowFamilyState, selected);
},
[hasUserSelectedAllRowFamilyState],
);
};

View File

@ -14,8 +14,12 @@ export const useSetRecordTableData = ({
recordTableId, recordTableId,
onEntityCountChange, onEntityCountChange,
}: useSetRecordTableDataProps) => { }: useSetRecordTableDataProps) => {
const { tableRowIdsState, numberOfTableRowsState } = const {
useRecordTableStates(recordTableId); tableRowIdsState,
numberOfTableRowsState,
isRowSelectedFamilyState,
hasUserSelectedAllRowState,
} = useRecordTableStates(recordTableId);
return useRecoilCallback( return useRecoilCallback(
({ set, snapshot }) => ({ set, snapshot }) =>
@ -32,15 +36,32 @@ export const useSetRecordTableData = ({
} }
const currentRowIds = getSnapshotValue(snapshot, tableRowIdsState); const currentRowIds = getSnapshotValue(snapshot, tableRowIdsState);
const hasUserSelectedAllRows = getSnapshotValue(
snapshot,
hasUserSelectedAllRowState,
);
const entityIds = newEntityArray.map((entity) => entity.id); const entityIds = newEntityArray.map((entity) => entity.id);
if (!isDeeplyEqual(currentRowIds, entityIds)) { if (!isDeeplyEqual(currentRowIds, entityIds)) {
set(tableRowIdsState, entityIds); set(tableRowIdsState, entityIds);
} }
if (hasUserSelectedAllRows) {
for (const rowId of entityIds) {
set(isRowSelectedFamilyState(rowId), true);
}
}
set(numberOfTableRowsState, totalCount); set(numberOfTableRowsState, totalCount);
onEntityCountChange(totalCount); onEntityCountChange(totalCount);
}, },
[numberOfTableRowsState, tableRowIdsState, onEntityCountChange], [
numberOfTableRowsState,
tableRowIdsState,
onEntityCountChange,
isRowSelectedFamilyState,
hasUserSelectedAllRowState,
],
); );
}; };

View File

@ -4,6 +4,7 @@ import { Key } from 'ts-key-enum';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { useGetIsSomeCellInEditModeState } from '@/object-record/record-table/hooks/internal/useGetIsSomeCellInEditMode'; import { useGetIsSomeCellInEditModeState } from '@/object-record/record-table/hooks/internal/useGetIsSomeCellInEditMode';
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
import { useSetHasUserSelectedAllRows } from '@/object-record/record-table/hooks/internal/useSetAllRowSelectedState';
import { useRecordTableMoveFocus } from '@/object-record/record-table/hooks/useRecordTableMoveFocus'; import { useRecordTableMoveFocus } from '@/object-record/record-table/hooks/useRecordTableMoveFocus';
import { isSoftFocusUsingMouseState } from '@/object-record/record-table/states/isSoftFocusUsingMouseState'; import { isSoftFocusUsingMouseState } from '@/object-record/record-table/states/isSoftFocusUsingMouseState';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
@ -110,7 +111,9 @@ export const useRecordTable = (props?: useRecordTableProps) => {
const leaveTableFocus = useLeaveTableFocus(recordTableId); const leaveTableFocus = useLeaveTableFocus(recordTableId);
const setRowSelectedState = useSetRowSelectedState(recordTableId); const setRowSelected = useSetRowSelectedState(recordTableId);
const setHasUserSelectedAllRows = useSetHasUserSelectedAllRows(recordTableId);
const resetTableRowSelection = useResetTableRowSelection(recordTableId); const resetTableRowSelection = useResetTableRowSelection(recordTableId);
@ -196,7 +199,7 @@ export const useRecordTable = (props?: useRecordTableProps) => {
setRecordTableData, setRecordTableData,
setTableColumns, setTableColumns,
leaveTableFocus, leaveTableFocus,
setRowSelectedState, setRowSelected,
resetTableRowSelection, resetTableRowSelection,
upsertRecordTableItem, upsertRecordTableItem,
moveDown, moveDown,
@ -211,5 +214,6 @@ export const useRecordTable = (props?: useRecordTableProps) => {
setSoftFocusPosition, setSoftFocusPosition,
isSomeCellInEditModeState, isSomeCellInEditModeState,
selectedRowIdsSelector, selectedRowIdsSelector,
setHasUserSelectedAllRows,
}; };
}; };

View File

@ -0,0 +1,7 @@
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
export const hasUserSelectedAllRowsComponentState =
createComponentState<boolean>({
key: 'hasUserSelectedAllRowsFamilyState',
defaultValue: false,
});