Fixed pending row edit mode (#5592)
This PR fixes creation on table. With the recent optimization refactor, we now use a custom event to trigger edit and soft focus mode on a table cell. There's a specific case when we create a pending row to allow creating a new record, where the custom event gets triggered before the cell exists, so it cannot listen and put itself in edit mode. The fix is passing down a new isPendingRow in the context, so the identifier cell on a pending row can put itself in edit mode during its first render.
This commit is contained in:
@ -4,6 +4,7 @@ import { useRecoilValue } from 'recoil';
|
|||||||
import { useSetRecordValue } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
|
import { useSetRecordValue } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
|
|
||||||
|
// TODO: should be optimized and put higher up
|
||||||
export const RecordValueSetterEffect = ({ recordId }: { recordId: string }) => {
|
export const RecordValueSetterEffect = ({ recordId }: { recordId: string }) => {
|
||||||
const setRecordValue = useSetRecordValue();
|
const setRecordValue = useSetRecordValue();
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,7 @@ export const RecordTablePendingRow = () => {
|
|||||||
key={pendingRecordId}
|
key={pendingRecordId}
|
||||||
recordId={pendingRecordId}
|
recordId={pendingRecordId}
|
||||||
rowIndex={-1}
|
rowIndex={-1}
|
||||||
|
isPendingRow
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -17,13 +17,18 @@ import { CheckboxCell } from './CheckboxCell';
|
|||||||
type RecordTableRowProps = {
|
type RecordTableRowProps = {
|
||||||
recordId: string;
|
recordId: string;
|
||||||
rowIndex: number;
|
rowIndex: number;
|
||||||
|
isPendingRow?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const StyledTd = styled.td`
|
const StyledTd = styled.td`
|
||||||
background-color: ${({ theme }) => theme.background.primary};
|
background-color: ${({ theme }) => theme.background.primary};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const RecordTableRow = ({ recordId, rowIndex }: RecordTableRowProps) => {
|
export const RecordTableRow = ({
|
||||||
|
recordId,
|
||||||
|
rowIndex,
|
||||||
|
isPendingRow,
|
||||||
|
}: RecordTableRowProps) => {
|
||||||
const { visibleTableColumnsSelector, isRowSelectedFamilyState } =
|
const { visibleTableColumnsSelector, isRowSelectedFamilyState } =
|
||||||
useRecordTableStates();
|
useRecordTableStates();
|
||||||
const currentRowSelected = useRecoilValue(isRowSelectedFamilyState(recordId));
|
const currentRowSelected = useRecoilValue(isRowSelectedFamilyState(recordId));
|
||||||
@ -51,6 +56,7 @@ export const RecordTableRow = ({ recordId, rowIndex }: RecordTableRowProps) => {
|
|||||||
}) + recordId,
|
}) + recordId,
|
||||||
isSelected: currentRowSelected,
|
isSelected: currentRowSelected,
|
||||||
isReadOnly: objectMetadataItem.isRemote ?? false,
|
isReadOnly: objectMetadataItem.isRemote ?? false,
|
||||||
|
isPendingRow,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<RecordValueSetterEffect recordId={recordId} />
|
<RecordValueSetterEffect recordId={recordId} />
|
||||||
|
|||||||
@ -6,6 +6,7 @@ export type RecordTableRowContextProps = {
|
|||||||
rowIndex: number;
|
rowIndex: number;
|
||||||
isSelected: boolean;
|
isSelected: boolean;
|
||||||
isReadOnly: boolean;
|
isReadOnly: boolean;
|
||||||
|
isPendingRow?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const RecordTableRowContext = createContext<RecordTableRowContextProps>(
|
export const RecordTableRowContext = createContext<RecordTableRowContextProps>(
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import React, { ReactElement, useContext, useEffect, useState } from 'react';
|
import React, { ReactElement, useContext, useEffect, useState } from 'react';
|
||||||
import { clsx } from 'clsx';
|
import { clsx } from 'clsx';
|
||||||
|
|
||||||
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useFieldFocus } from '@/object-record/record-field/hooks/useFieldFocus';
|
import { useFieldFocus } from '@/object-record/record-field/hooks/useFieldFocus';
|
||||||
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
@ -37,12 +38,18 @@ export const RecordTableCellContainer = ({
|
|||||||
}: RecordTableCellContainerProps) => {
|
}: RecordTableCellContainerProps) => {
|
||||||
const { setIsFocused } = useFieldFocus();
|
const { setIsFocused } = useFieldFocus();
|
||||||
|
|
||||||
const { isSelected, recordId } = useContext(RecordTableRowContext);
|
const { isSelected, recordId, isPendingRow } = useContext(
|
||||||
|
RecordTableRowContext,
|
||||||
|
);
|
||||||
|
const { isLabelIdentifier } = useContext(FieldContext);
|
||||||
const { onContextMenu, onCellMouseEnter } = useContext(RecordTableContext);
|
const { onContextMenu, onCellMouseEnter } = useContext(RecordTableContext);
|
||||||
|
|
||||||
|
const shouldBeInitiallyInEditMode =
|
||||||
|
isPendingRow === true && isLabelIdentifier;
|
||||||
|
|
||||||
const [isHovered, setIsHovered] = useState(false);
|
const [isHovered, setIsHovered] = useState(false);
|
||||||
const [hasSoftFocus, setHasSoftFocus] = useState(false);
|
const [hasSoftFocus, setHasSoftFocus] = useState(false);
|
||||||
const [isInEditMode, setIsInEditMode] = useState(false);
|
const [isInEditMode, setIsInEditMode] = useState(shouldBeInitiallyInEditMode);
|
||||||
|
|
||||||
const cellPosition = useCurrentTableCellPosition();
|
const cellPosition = useCurrentTableCellPosition();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user