mirror of
https://github.com/lingble/twenty.git
synced 2025-11-01 13:17:57 +00:00
feat: use new component state api for record table (#8143)
This PR drop the use of the old component state api in favour of the new component state api V2.
This commit is contained in:
@@ -8,7 +8,7 @@ export const actionMenuEntriesComponentSelector = createComponentSelectorV2<
|
|||||||
ActionMenuEntry[]
|
ActionMenuEntry[]
|
||||||
>({
|
>({
|
||||||
key: 'actionMenuEntriesComponentSelector',
|
key: 'actionMenuEntriesComponentSelector',
|
||||||
instanceContext: ActionMenuComponentInstanceContext,
|
componentInstanceContext: ActionMenuComponentInstanceContext,
|
||||||
get:
|
get:
|
||||||
({ instanceId }) =>
|
({ instanceId }) =>
|
||||||
({ get }) =>
|
({ get }) =>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ describe('formatTimeZoneLabel', () => {
|
|||||||
|
|
||||||
it('should format the time zone label correctly when location is not included in the label', () => {
|
it('should format the time zone label correctly when location is not included in the label', () => {
|
||||||
const ianaTimeZone = 'America/New_York';
|
const ianaTimeZone = 'America/New_York';
|
||||||
const expectedLabel = '(GMT-04:00) Eastern Daylight Time - New York';
|
const expectedLabel = '(GMT-05:00) Eastern Standard Time - New York';
|
||||||
|
|
||||||
const formattedLabel = formatTimeZoneLabel(ianaTimeZone);
|
const formattedLabel = formatTimeZoneLabel(ianaTimeZone);
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import { ReactNode } from 'react';
|
|||||||
|
|
||||||
import { mocks } from '@/auth/hooks/__mocks__/useAuth';
|
import { mocks } from '@/auth/hooks/__mocks__/useAuth';
|
||||||
import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
|
import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
|
|
||||||
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
|
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
|
||||||
|
|
||||||
const recordTableId = 'people';
|
const recordTableId = 'people';
|
||||||
@@ -24,12 +23,12 @@ const Wrapper = ({ children }: { children: ReactNode }) => {
|
|||||||
return (
|
return (
|
||||||
<HookMockWrapper>
|
<HookMockWrapper>
|
||||||
<ObjectNamePluralSetter>
|
<ObjectNamePluralSetter>
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId={getScopeIdFromComponentId(recordTableId)}
|
recordTableId={recordTableId}
|
||||||
onColumnsChange={onColumnsChange}
|
onColumnsChange={onColumnsChange}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</ObjectNamePluralSetter>
|
</ObjectNamePluralSetter>
|
||||||
</HookMockWrapper>
|
</HookMockWrapper>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useContext } from 'react';
|
|
||||||
|
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
|
|
||||||
@@ -11,7 +10,8 @@ import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/
|
|||||||
import { useSelectFilter } from '@/object-record/object-filter-dropdown/hooks/useSelectFilter';
|
import { useSelectFilter } from '@/object-record/object-filter-dropdown/hooks/useSelectFilter';
|
||||||
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
|
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
|
||||||
import { RecordIndexRootPropsContext } from '@/object-record/record-index/contexts/RecordIndexRootPropsContext';
|
import { RecordIndexRootPropsContext } from '@/object-record/record-index/contexts/RecordIndexRootPropsContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem';
|
import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
@@ -21,6 +21,7 @@ import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/
|
|||||||
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
||||||
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
||||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
||||||
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
import { isDefined } from 'twenty-ui';
|
import { isDefined } from 'twenty-ui';
|
||||||
|
|
||||||
@@ -57,6 +58,8 @@ type ObjectFilterDropdownFilterSelectProps = {
|
|||||||
export const ObjectFilterDropdownFilterSelect = ({
|
export const ObjectFilterDropdownFilterSelect = ({
|
||||||
isAdvancedFilterButtonVisible,
|
isAdvancedFilterButtonVisible,
|
||||||
}: ObjectFilterDropdownFilterSelectProps) => {
|
}: ObjectFilterDropdownFilterSelectProps) => {
|
||||||
|
const { recordIndexId } = useContext(RecordIndexRootPropsContext);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
setObjectFilterDropdownSearchInput,
|
setObjectFilterDropdownSearchInput,
|
||||||
objectFilterDropdownSearchInputState,
|
objectFilterDropdownSearchInputState,
|
||||||
@@ -78,15 +81,18 @@ export const ObjectFilterDropdownFilterSelect = ({
|
|||||||
const availableFilterDefinitions = useRecoilComponentValueV2(
|
const availableFilterDefinitions = useRecoilComponentValueV2(
|
||||||
availableFilterDefinitionsComponentState,
|
availableFilterDefinitionsComponentState,
|
||||||
);
|
);
|
||||||
const { recordIndexId } = useContext(RecordIndexRootPropsContext);
|
|
||||||
const { hiddenTableColumnsSelector, visibleTableColumnsSelector } =
|
|
||||||
useRecordTableStates(recordIndexId);
|
|
||||||
|
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
recordIndexId,
|
||||||
|
);
|
||||||
const visibleColumnsIds = visibleTableColumns.map(
|
const visibleColumnsIds = visibleTableColumns.map(
|
||||||
(column) => column.fieldMetadataId,
|
(column) => column.fieldMetadataId,
|
||||||
);
|
);
|
||||||
const hiddenTableColumns = useRecoilValue(hiddenTableColumnsSelector());
|
const hiddenTableColumns = useRecoilComponentValueV2(
|
||||||
|
hiddenTableColumnsComponentSelector,
|
||||||
|
recordIndexId,
|
||||||
|
);
|
||||||
const hiddenColumnIds = hiddenTableColumns.map(
|
const hiddenColumnIds = hiddenTableColumns.map(
|
||||||
(column) => column.fieldMetadataId,
|
(column) => column.fieldMetadataId,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,14 +4,13 @@ import { TaskGroups } from '@/activities/tasks/components/TaskGroups';
|
|||||||
import { MultipleFiltersDropdownButton } from '@/object-record/object-filter-dropdown/components/MultipleFiltersDropdownButton';
|
import { MultipleFiltersDropdownButton } from '@/object-record/object-filter-dropdown/components/MultipleFiltersDropdownButton';
|
||||||
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope';
|
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope';
|
||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext';
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
||||||
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
|
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
|
||||||
import { within } from '@storybook/test';
|
import { within } from '@storybook/test';
|
||||||
import { useSetRecoilState } from 'recoil';
|
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
import { FieldMetadataType } from '~/generated/graphql';
|
import { FieldMetadataType } from '~/generated/graphql';
|
||||||
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
||||||
@@ -30,9 +29,10 @@ const meta: Meta<typeof MultipleFiltersDropdownButton> = {
|
|||||||
instanceId,
|
instanceId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const { tableColumnsState } = useRecordTableStates(instanceId);
|
const setTableColumns = useSetRecoilComponentStateV2(
|
||||||
|
tableColumnsComponentState,
|
||||||
const setTableColumns = useSetRecoilState(tableColumnsState);
|
instanceId,
|
||||||
|
);
|
||||||
|
|
||||||
setTableColumns([
|
setTableColumns([
|
||||||
{
|
{
|
||||||
@@ -91,15 +91,15 @@ const meta: Meta<typeof MultipleFiltersDropdownButton> = {
|
|||||||
<ObjectFilterDropdownComponentInstanceContext.Provider
|
<ObjectFilterDropdownComponentInstanceContext.Provider
|
||||||
value={{ instanceId }}
|
value={{ instanceId }}
|
||||||
>
|
>
|
||||||
<RecordTableScopeInternalContext.Provider
|
<RecordTableComponentInstanceContext.Provider
|
||||||
value={{ scopeId: instanceId, onColumnsChange: () => {} }}
|
value={{ instanceId: instanceId, onColumnsChange: () => {} }}
|
||||||
>
|
>
|
||||||
<ViewComponentInstanceContext.Provider value={{ instanceId }}>
|
<ViewComponentInstanceContext.Provider value={{ instanceId }}>
|
||||||
<ObjectFilterDropdownScope filterScopeId={instanceId}>
|
<ObjectFilterDropdownScope filterScopeId={instanceId}>
|
||||||
<Story />
|
<Story />
|
||||||
</ObjectFilterDropdownScope>
|
</ObjectFilterDropdownScope>
|
||||||
</ViewComponentInstanceContext.Provider>
|
</ViewComponentInstanceContext.Provider>
|
||||||
</RecordTableScopeInternalContext.Provider>
|
</RecordTableComponentInstanceContext.Provider>
|
||||||
</ObjectFilterDropdownComponentInstanceContext.Provider>
|
</ObjectFilterDropdownComponentInstanceContext.Provider>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ import { OBJECT_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/co
|
|||||||
import { useObjectSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useObjectSortDropdown';
|
import { useObjectSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useObjectSortDropdown';
|
||||||
import { ObjectSortDropdownScope } from '@/object-record/object-sort-dropdown/scopes/ObjectSortDropdownScope';
|
import { ObjectSortDropdownScope } from '@/object-record/object-sort-dropdown/scopes/ObjectSortDropdownScope';
|
||||||
import { RecordIndexRootPropsContext } from '@/object-record/record-index/contexts/RecordIndexRootPropsContext';
|
import { RecordIndexRootPropsContext } from '@/object-record/record-index/contexts/RecordIndexRootPropsContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader';
|
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
@@ -15,6 +16,7 @@ import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/Styl
|
|||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
||||||
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { SORT_DIRECTIONS } from '../types/SortDirection';
|
import { SORT_DIRECTIONS } from '../types/SortDirection';
|
||||||
@@ -77,6 +79,8 @@ export const ObjectSortDropdownButton = ({
|
|||||||
resetSearchInput,
|
resetSearchInput,
|
||||||
} = useObjectSortDropdown();
|
} = useObjectSortDropdown();
|
||||||
|
|
||||||
|
const { recordIndexId } = useContext(RecordIndexRootPropsContext);
|
||||||
|
|
||||||
const { isDropdownOpen } = useDropdown(OBJECT_SORT_DROPDOWN_ID);
|
const { isDropdownOpen } = useDropdown(OBJECT_SORT_DROPDOWN_ID);
|
||||||
|
|
||||||
const handleButtonClick = () => {
|
const handleButtonClick = () => {
|
||||||
@@ -94,15 +98,17 @@ export const ObjectSortDropdownButton = ({
|
|||||||
|
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { recordIndexId } = useContext(RecordIndexRootPropsContext);
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
const { hiddenTableColumnsSelector, visibleTableColumnsSelector } =
|
visibleTableColumnsComponentSelector,
|
||||||
useRecordTableStates(recordIndexId);
|
recordIndexId,
|
||||||
|
);
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
|
||||||
const visibleColumnsIds = visibleTableColumns.map(
|
const visibleColumnsIds = visibleTableColumns.map(
|
||||||
(column) => column.fieldMetadataId,
|
(column) => column.fieldMetadataId,
|
||||||
);
|
);
|
||||||
const hiddenTableColumns = useRecoilValue(hiddenTableColumnsSelector());
|
const hiddenTableColumns = useRecoilComponentValueV2(
|
||||||
|
hiddenTableColumnsComponentSelector,
|
||||||
|
recordIndexId,
|
||||||
|
);
|
||||||
const hiddenColumnIds = hiddenTableColumns.map(
|
const hiddenColumnIds = hiddenTableColumns.map(
|
||||||
(column) => column.fieldMetadataId,
|
(column) => column.fieldMetadataId,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { useContext, useEffect } from 'react';
|
import { useContext, useEffect } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
||||||
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
||||||
@@ -9,8 +8,13 @@ import { useHandleToggleColumnFilter } from '@/object-record/record-index/hooks/
|
|||||||
import { useHandleToggleColumnSort } from '@/object-record/record-index/hooks/useHandleToggleColumnSort';
|
import { useHandleToggleColumnSort } from '@/object-record/record-index/hooks/useHandleToggleColumnSort';
|
||||||
import { recordIndexFiltersState } from '@/object-record/record-index/states/recordIndexFiltersState';
|
import { recordIndexFiltersState } from '@/object-record/record-index/states/recordIndexFiltersState';
|
||||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
|
import { hasUserSelectedAllRowsComponentState } from '@/object-record/record-table/record-table-row/states/hasUserSelectedAllRowsFamilyState';
|
||||||
|
import { selectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/selectedRowIdsComponentSelector';
|
||||||
|
import { unselectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/unselectedRowIdsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { useSetRecordCountInCurrentView } from '@/views/hooks/useSetRecordCountInCurrentView';
|
import { useSetRecordCountInCurrentView } from '@/views/hooks/useSetRecordCountInCurrentView';
|
||||||
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
export const RecordIndexTableContainerEffect = () => {
|
export const RecordIndexTableContainerEffect = () => {
|
||||||
const { recordIndexId, objectNameSingular } = useContext(
|
const { recordIndexId, objectNameSingular } = useContext(
|
||||||
@@ -22,11 +26,8 @@ export const RecordIndexTableContainerEffect = () => {
|
|||||||
const {
|
const {
|
||||||
setAvailableTableColumns,
|
setAvailableTableColumns,
|
||||||
setOnEntityCountChange,
|
setOnEntityCountChange,
|
||||||
selectedRowIdsSelector,
|
|
||||||
setOnToggleColumnFilter,
|
setOnToggleColumnFilter,
|
||||||
setOnToggleColumnSort,
|
setOnToggleColumnSort,
|
||||||
hasUserSelectedAllRowsState,
|
|
||||||
unselectedRowIdsSelector,
|
|
||||||
} = useRecordTable({
|
} = useRecordTable({
|
||||||
recordTableId: recordIndexId,
|
recordTableId: recordIndexId,
|
||||||
});
|
});
|
||||||
@@ -78,9 +79,18 @@ export const RecordIndexTableContainerEffect = () => {
|
|||||||
const setContextStoreTargetedRecords = useSetRecoilComponentStateV2(
|
const setContextStoreTargetedRecords = useSetRecoilComponentStateV2(
|
||||||
contextStoreTargetedRecordsRuleComponentState,
|
contextStoreTargetedRecordsRuleComponentState,
|
||||||
);
|
);
|
||||||
const hasUserSelectedAllRows = useRecoilValue(hasUserSelectedAllRowsState);
|
const hasUserSelectedAllRows = useRecoilComponentValueV2(
|
||||||
const selectedRowIds = useRecoilValue(selectedRowIdsSelector());
|
hasUserSelectedAllRowsComponentState,
|
||||||
const unselectedRowIds = useRecoilValue(unselectedRowIdsSelector());
|
recordIndexId,
|
||||||
|
);
|
||||||
|
const selectedRowIds = useRecoilComponentValueV2(
|
||||||
|
selectedRowIdsComponentSelector,
|
||||||
|
recordIndexId,
|
||||||
|
);
|
||||||
|
const unselectedRowIds = useRecoilComponentValueV2(
|
||||||
|
unselectedRowIdsComponentSelector,
|
||||||
|
recordIndexId,
|
||||||
|
);
|
||||||
|
|
||||||
const recordIndexFilters = useRecoilValue(recordIndexFiltersState);
|
const recordIndexFilters = useRecoilValue(recordIndexFiltersState);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/u
|
|||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
|
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
|
||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
@@ -28,7 +29,12 @@ export const useHandleToggleTrashColumnFilter = ({
|
|||||||
useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
|
useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
|
||||||
|
|
||||||
const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(viewBarId);
|
const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(viewBarId);
|
||||||
const { isSoftDeleteActiveState } = useRecordTableStates(viewBarId);
|
|
||||||
|
const isSoftDeleteFilterActiveComponentRecoilState =
|
||||||
|
useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftDeleteFilterActiveComponentState,
|
||||||
|
viewBarId,
|
||||||
|
);
|
||||||
|
|
||||||
const handleToggleTrashColumnFilter = useCallback(() => {
|
const handleToggleTrashColumnFilter = useCallback(() => {
|
||||||
const trashFieldMetadata = objectMetadataItem.fields.find(
|
const trashFieldMetadata = objectMetadataItem.fields.find(
|
||||||
@@ -69,9 +75,9 @@ export const useHandleToggleTrashColumnFilter = ({
|
|||||||
const toggleSoftDeleteFilterState = useRecoilCallback(
|
const toggleSoftDeleteFilterState = useRecoilCallback(
|
||||||
({ set }) =>
|
({ set }) =>
|
||||||
(currentState: boolean) => {
|
(currentState: boolean) => {
|
||||||
set(isSoftDeleteActiveState, currentState);
|
set(isSoftDeleteFilterActiveComponentRecoilState, currentState);
|
||||||
},
|
},
|
||||||
[isSoftDeleteActiveState],
|
[isSoftDeleteFilterActiveComponentRecoilState],
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
handleToggleTrashColumnFilter,
|
handleToggleTrashColumnFilter,
|
||||||
|
|||||||
@@ -7,9 +7,12 @@ import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
|
|||||||
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
|
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
|
||||||
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
|
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
|
||||||
import { useRecordTableRecordGqlFields } from '@/object-record/record-index/hooks/useRecordTableRecordGqlFields';
|
import { useRecordTableRecordGqlFields } from '@/object-record/record-index/hooks/useRecordTableRecordGqlFields';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
|
import { tableFiltersComponentState } from '@/object-record/record-table/states/tableFiltersComponentState';
|
||||||
|
import { tableSortsComponentState } from '@/object-record/record-table/states/tableSortsComponentState';
|
||||||
|
import { tableViewFilterGroupsComponentState } from '@/object-record/record-table/states/tableViewFilterGroupsComponentState';
|
||||||
import { SIGN_IN_BACKGROUND_MOCK_COMPANIES } from '@/sign-in-background-mock/constants/SignInBackgroundMockCompanies';
|
import { SIGN_IN_BACKGROUND_MOCK_COMPANIES } from '@/sign-in-background-mock/constants/SignInBackgroundMockCompanies';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { isNull } from '@sniptt/guards';
|
import { isNull } from '@sniptt/guards';
|
||||||
import { WorkspaceActivationStatus } from '~/generated/graphql';
|
import { WorkspaceActivationStatus } from '~/generated/graphql';
|
||||||
|
|
||||||
@@ -21,12 +24,18 @@ export const useFindManyParams = (
|
|||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { tableFiltersState, tableSortsState, tableViewFilterGroupsState } =
|
const tableViewFilterGroups = useRecoilComponentValueV2(
|
||||||
useRecordTableStates(recordTableId);
|
tableViewFilterGroupsComponentState,
|
||||||
|
recordTableId,
|
||||||
const tableViewFilterGroups = useRecoilValue(tableViewFilterGroupsState);
|
);
|
||||||
const tableFilters = useRecoilValue(tableFiltersState);
|
const tableFilters = useRecoilComponentValueV2(
|
||||||
const tableSorts = useRecoilValue(tableSortsState);
|
tableFiltersComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const tableSorts = useRecoilComponentValueV2(
|
||||||
|
tableSortsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const filter = computeViewRecordGqlOperationFilter(
|
const filter = computeViewRecordGqlOperationFilter(
|
||||||
tableFilters,
|
tableFilters,
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
import { getObjectMetadataIdentifierFields } from '@/object-metadata/utils/getObjectMetadataIdentifierFields';
|
import { getObjectMetadataIdentifierFields } from '@/object-metadata/utils/getObjectMetadataIdentifierFields';
|
||||||
import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields';
|
import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
export const useRecordTableRecordGqlFields = ({
|
export const useRecordTableRecordGqlFields = ({
|
||||||
@@ -13,12 +12,12 @@ export const useRecordTableRecordGqlFields = ({
|
|||||||
}: {
|
}: {
|
||||||
objectMetadataItem: ObjectMetadataItem;
|
objectMetadataItem: ObjectMetadataItem;
|
||||||
}) => {
|
}) => {
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates();
|
|
||||||
|
|
||||||
const { imageIdentifierFieldMetadataItem, labelIdentifierFieldMetadataItem } =
|
const { imageIdentifierFieldMetadataItem, labelIdentifierFieldMetadataItem } =
|
||||||
getObjectMetadataIdentifierFields({ objectMetadataItem });
|
getObjectMetadataIdentifierFields({ objectMetadataItem });
|
||||||
|
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
);
|
||||||
|
|
||||||
const identifierQueryFields: Record<string, boolean> = {};
|
const identifierQueryFields: Record<string, boolean> = {};
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { useEffect, useState } from 'react';
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
@@ -15,6 +14,7 @@ import { useRecordBoardStates } from '@/object-record/record-board/hooks/interna
|
|||||||
import { useFindManyParams } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
|
import { useFindManyParams } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
|
||||||
import { EXPORT_TABLE_DATA_DEFAULT_PAGE_SIZE } from '@/object-record/record-index/options/constants/ExportTableDataDefaultPageSize';
|
import { EXPORT_TABLE_DATA_DEFAULT_PAGE_SIZE } from '@/object-record/record-index/options/constants/ExportTableDataDefaultPageSize';
|
||||||
import { useRecordIndexOptionsForBoard } from '@/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard';
|
import { useRecordIndexOptionsForBoard } from '@/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { ViewType } from '@/views/types/ViewType';
|
import { ViewType } from '@/views/types/ViewType';
|
||||||
|
|
||||||
@@ -61,8 +61,6 @@ export const useRecordData = ({
|
|||||||
});
|
});
|
||||||
const [previousRecordCount, setPreviousRecordCount] = useState(0);
|
const [previousRecordCount, setPreviousRecordCount] = useState(0);
|
||||||
|
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates(recordIndexId);
|
|
||||||
|
|
||||||
const { hiddenBoardFields } = useRecordIndexOptionsForBoard({
|
const { hiddenBoardFields } = useRecordIndexOptionsForBoard({
|
||||||
objectNameSingular: objectMetadataItem.nameSingular,
|
objectNameSingular: objectMetadataItem.nameSingular,
|
||||||
recordBoardId: recordIndexId,
|
recordBoardId: recordIndexId,
|
||||||
@@ -74,7 +72,10 @@ export const useRecordData = ({
|
|||||||
const hiddenKanbanFieldColumn = hiddenBoardFields.find(
|
const hiddenKanbanFieldColumn = hiddenBoardFields.find(
|
||||||
(column) => column.metadata.fieldName === kanbanFieldMetadataName,
|
(column) => column.metadata.fieldName === kanbanFieldMetadataName,
|
||||||
);
|
);
|
||||||
const columns = useRecoilValue(visibleTableColumnsSelector());
|
const columns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
recordIndexId,
|
||||||
|
);
|
||||||
|
|
||||||
const contextStoreTargetedRecordsRule = useRecoilComponentValueV2(
|
const contextStoreTargetedRecordsRule = useRecoilComponentValueV2(
|
||||||
contextStoreTargetedRecordsRuleComponentState,
|
contextStoreTargetedRecordsRuleComponentState,
|
||||||
|
|||||||
@@ -1,17 +1,21 @@
|
|||||||
import { useCallback } from 'react';
|
|
||||||
import { OnDragEndResponder } from '@hello-pangea/dnd';
|
import { OnDragEndResponder } from '@hello-pangea/dnd';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns';
|
import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns';
|
||||||
|
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { moveArrayItem } from '~/utils/array/moveArrayItem';
|
import { moveArrayItem } from '~/utils/array/moveArrayItem';
|
||||||
|
|
||||||
export const useRecordIndexOptionsForTable = (recordTableId: string) => {
|
export const useRecordIndexOptionsForTable = (recordTableId: string) => {
|
||||||
const { hiddenTableColumnsSelector, visibleTableColumnsSelector } =
|
const hiddenTableColumns = useRecoilComponentValueV2(
|
||||||
useRecordTableStates(recordTableId);
|
hiddenTableColumnsComponentSelector,
|
||||||
|
recordTableId,
|
||||||
const hiddenTableColumns = useRecoilValue(hiddenTableColumnsSelector());
|
);
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const { handleColumnVisibilityChange, handleColumnReorder } = useTableColumns(
|
const { handleColumnVisibilityChange, handleColumnReorder } = useTableColumns(
|
||||||
{ recordTableId: recordTableId },
|
{ recordTableId: recordTableId },
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { isNonEmptyString, isNull } from '@sniptt/guards';
|
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 { RecordTableContextProvider } from '@/object-record/record-table/components/RecordTableContextProvider';
|
||||||
import { RecordTableEmptyState } from '@/object-record/record-table/empty-state/components/RecordTableEmptyState';
|
import { RecordTableEmptyState } from '@/object-record/record-table/empty-state/components/RecordTableEmptyState';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableBody } from '@/object-record/record-table/record-table-body/components/RecordTableBody';
|
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 { RecordTableBodyEffect } from '@/object-record/record-table/record-table-body/components/RecordTableBodyEffect';
|
||||||
import { RecordTableHeader } from '@/object-record/record-table/record-table-header/components/RecordTableHeader';
|
import { RecordTableHeader } from '@/object-record/record-table/record-table-header/components/RecordTableHeader';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
import { isRecordTableInitialLoadingComponentState } from '@/object-record/record-table/states/isRecordTableInitialLoadingComponentState';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||||
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
const StyledTable = styled.table`
|
const StyledTable = styled.table`
|
||||||
border-radius: ${({ theme }) => theme.border.radius.sm};
|
border-radius: ${({ theme }) => theme.border.radius.sm};
|
||||||
@@ -30,21 +32,20 @@ export const RecordTable = ({
|
|||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
onColumnsChange,
|
onColumnsChange,
|
||||||
}: RecordTableProps) => {
|
}: RecordTableProps) => {
|
||||||
const { scopeId } = useRecordTableStates(recordTableId);
|
const isRecordTableInitialLoading = useRecoilComponentValueV2(
|
||||||
|
isRecordTableInitialLoadingComponentState,
|
||||||
const {
|
recordTableId,
|
||||||
isRecordTableInitialLoadingState,
|
|
||||||
tableRowIdsState,
|
|
||||||
pendingRecordIdState,
|
|
||||||
} = useRecordTableStates(recordTableId);
|
|
||||||
|
|
||||||
const isRecordTableInitialLoading = useRecoilValue(
|
|
||||||
isRecordTableInitialLoadingState,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const tableRowIds = useRecoilValue(tableRowIdsState);
|
const tableRowIds = useRecoilComponentValueV2(
|
||||||
|
tableRowIdsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const pendingRecordId = useRecoilValue(pendingRecordIdState);
|
const pendingRecordId = useRecoilComponentValueV2(
|
||||||
|
recordTablePendingRecordIdComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const recordTableIsEmpty =
|
const recordTableIsEmpty =
|
||||||
!isRecordTableInitialLoading &&
|
!isRecordTableInitialLoading &&
|
||||||
@@ -56,8 +57,8 @@ export const RecordTable = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId={scopeId}
|
recordTableId={recordTableId}
|
||||||
onColumnsChange={onColumnsChange}
|
onColumnsChange={onColumnsChange}
|
||||||
>
|
>
|
||||||
<RecordTableContextProvider
|
<RecordTableContextProvider
|
||||||
@@ -77,6 +78,6 @@ export const RecordTable = ({
|
|||||||
</StyledTable>
|
</StyledTable>
|
||||||
)}
|
)}
|
||||||
</RecordTableContextProvider>
|
</RecordTableContextProvider>
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstanceEffect } from '@/object-record/record-table/components/RecordTableComponentInstanceEffect';
|
||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
|
||||||
|
type RecordTableComponentInstanceProps = {
|
||||||
|
children: ReactNode;
|
||||||
|
recordTableId: string;
|
||||||
|
onColumnsChange: (columns: ColumnDefinition<FieldMetadata>[]) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const RecordTableComponentInstance = ({
|
||||||
|
children,
|
||||||
|
recordTableId,
|
||||||
|
onColumnsChange,
|
||||||
|
}: RecordTableComponentInstanceProps) => {
|
||||||
|
return (
|
||||||
|
<RecordTableComponentInstanceContext.Provider
|
||||||
|
value={{
|
||||||
|
instanceId: recordTableId,
|
||||||
|
onColumnsChange,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<RecordTableComponentInstanceEffect onColumnsChange={onColumnsChange} />
|
||||||
|
{children}
|
||||||
|
</RecordTableComponentInstanceContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -4,14 +4,14 @@ import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'
|
|||||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
|
|
||||||
type RecordTableScopeInitEffectProps = {
|
type RecordTableComponentInstanceEffectProps = {
|
||||||
onColumnsChange: (columns: ColumnDefinition<FieldMetadata>[]) => void;
|
onColumnsChange: (columns: ColumnDefinition<FieldMetadata>[]) => void;
|
||||||
onEntityCountChange?: (count: number) => void | Promise<void>;
|
onEntityCountChange?: (count: number) => void | Promise<void>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const RecordTableScopeInitEffect = ({
|
export const RecordTableComponentInstanceEffect = ({
|
||||||
onColumnsChange,
|
onColumnsChange,
|
||||||
}: RecordTableScopeInitEffectProps) => {
|
}: RecordTableComponentInstanceEffectProps) => {
|
||||||
const { setOnColumnsChange } = useRecordTable();
|
const { setOnColumnsChange } = useRecordTable();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
import { useHandleContainerMouseEnter } from '@/object-record/record-table/hooks/internal/useHandleContainerMouseEnter';
|
import { useHandleContainerMouseEnter } from '@/object-record/record-table/hooks/internal/useHandleContainerMouseEnter';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useRecordTableMoveFocus } from '@/object-record/record-table/hooks/useRecordTableMoveFocus';
|
import { useRecordTableMoveFocus } from '@/object-record/record-table/hooks/useRecordTableMoveFocus';
|
||||||
import { useCloseRecordTableCellV2 } from '@/object-record/record-table/record-table-cell/hooks/useCloseRecordTableCellV2';
|
import { useCloseRecordTableCellV2 } from '@/object-record/record-table/record-table-cell/hooks/useCloseRecordTableCellV2';
|
||||||
import { useMoveSoftFocusToCellOnHoverV2 } from '@/object-record/record-table/record-table-cell/hooks/useMoveSoftFocusToCellOnHoverV2';
|
import { useMoveSoftFocusToCellOnHoverV2 } from '@/object-record/record-table/record-table-cell/hooks/useMoveSoftFocusToCellOnHoverV2';
|
||||||
@@ -14,8 +12,10 @@ import {
|
|||||||
} from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
} from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
||||||
import { useTriggerActionMenuDropdown } from '@/object-record/record-table/record-table-cell/hooks/useTriggerActionMenuDropdown';
|
import { useTriggerActionMenuDropdown } from '@/object-record/record-table/record-table-cell/hooks/useTriggerActionMenuDropdown';
|
||||||
import { useUpsertRecord } from '@/object-record/record-table/record-table-cell/hooks/useUpsertRecord';
|
import { useUpsertRecord } from '@/object-record/record-table/record-table-cell/hooks/useUpsertRecord';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
import { MoveFocusDirection } from '@/object-record/record-table/types/MoveFocusDirection';
|
import { MoveFocusDirection } from '@/object-record/record-table/types/MoveFocusDirection';
|
||||||
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableContextProvider = ({
|
export const RecordTableContextProvider = ({
|
||||||
viewBarId,
|
viewBarId,
|
||||||
@@ -28,14 +28,13 @@ export const RecordTableContextProvider = ({
|
|||||||
objectNameSingular: string;
|
objectNameSingular: string;
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
}) => {
|
}) => {
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates(recordTableId);
|
|
||||||
|
|
||||||
const { objectMetadataItem } = useObjectMetadataItem({
|
const { objectMetadataItem } = useObjectMetadataItem({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { upsertRecord } = useUpsertRecord({
|
const { upsertRecord } = useUpsertRecord({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
|
recordTableId,
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleUpsertRecord = ({
|
const handleUpsertRecord = ({
|
||||||
@@ -47,7 +46,7 @@ export const RecordTableContextProvider = ({
|
|||||||
recordId: string;
|
recordId: string;
|
||||||
fieldName: string;
|
fieldName: string;
|
||||||
}) => {
|
}) => {
|
||||||
upsertRecord(persistField, recordId, fieldName, recordTableId);
|
upsertRecord(persistField, recordId, fieldName);
|
||||||
};
|
};
|
||||||
|
|
||||||
const { openTableCell } = useOpenRecordTableCellV2(recordTableId);
|
const { openTableCell } = useOpenRecordTableCellV2(recordTableId);
|
||||||
@@ -90,7 +89,10 @@ export const RecordTableContextProvider = ({
|
|||||||
recordTableId,
|
recordTableId,
|
||||||
});
|
});
|
||||||
|
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RecordTableContext.Provider
|
<RecordTableContext.Provider
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableBodyFetchMoreLoader } from '@/object-record/record-table/record-table-body/components/RecordTableBodyFetchMoreLoader';
|
import { RecordTableBodyFetchMoreLoader } from '@/object-record/record-table/record-table-body/components/RecordTableBodyFetchMoreLoader';
|
||||||
import { RecordTableRow } from '@/object-record/record-table/record-table-row/components/RecordTableRow';
|
import { RecordTableRow } from '@/object-record/record-table/record-table-row/components/RecordTableRow';
|
||||||
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableRows = () => {
|
export const RecordTableRows = () => {
|
||||||
const { tableRowIdsState } = useRecordTableStates();
|
const tableRowIds = useRecoilComponentValueV2(tableRowIdsComponentState);
|
||||||
|
|
||||||
const tableRowIds = useRecoilValue(tableRowIdsState);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ import {
|
|||||||
useSetRecordValue,
|
useSetRecordValue,
|
||||||
} from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
|
} 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';
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
||||||
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';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
import { ChipGeneratorsDecorator } from '~/testing/decorators/ChipGeneratorsDecorator';
|
import { ChipGeneratorsDecorator } from '~/testing/decorators/ChipGeneratorsDecorator';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory';
|
import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory';
|
||||||
@@ -78,8 +78,8 @@ const meta: Meta = {
|
|||||||
recordTableId: 'recordTableId',
|
recordTableId: 'recordTableId',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId="asd"
|
recordTableId="asd"
|
||||||
onColumnsChange={() => {}}
|
onColumnsChange={() => {}}
|
||||||
>
|
>
|
||||||
<RecordTableRowContext.Provider
|
<RecordTableRowContext.Provider
|
||||||
@@ -132,7 +132,7 @@ const meta: Meta = {
|
|||||||
</FieldContext.Provider>
|
</FieldContext.Provider>
|
||||||
</RecordTableCellContext.Provider>
|
</RecordTableCellContext.Provider>
|
||||||
</RecordTableRowContext.Provider>
|
</RecordTableRowContext.Provider>
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</RecordTableContext.Provider>
|
</RecordTableContext.Provider>
|
||||||
</RecordFieldValueSelectorContextProvider>
|
</RecordFieldValueSelectorContextProvider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,22 +4,23 @@ import { RecordTableEmptyStateNoRecordAtAll } from '@/object-record/record-table
|
|||||||
import { RecordTableEmptyStateNoRecordFoundForFilter } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateNoRecordFoundForFilter';
|
import { RecordTableEmptyStateNoRecordFoundForFilter } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateNoRecordFoundForFilter';
|
||||||
import { RecordTableEmptyStateRemote } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateRemote';
|
import { RecordTableEmptyStateRemote } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateRemote';
|
||||||
import { RecordTableEmptyStateSoftDelete } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete';
|
import { RecordTableEmptyStateSoftDelete } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
export const RecordTableEmptyState = () => {
|
export const RecordTableEmptyState = () => {
|
||||||
const { objectNameSingular, recordTableId, objectMetadataItem } =
|
const { objectNameSingular, recordTableId, objectMetadataItem } =
|
||||||
useContext(RecordTableContext);
|
useContext(RecordTableContext);
|
||||||
|
|
||||||
const { isSoftDeleteActiveState } = useRecordTableStates(recordTableId);
|
|
||||||
|
|
||||||
const { totalCount } = useFindManyRecords({ objectNameSingular, limit: 1 });
|
const { totalCount } = useFindManyRecords({ objectNameSingular, limit: 1 });
|
||||||
const noRecordAtAll = totalCount === 0;
|
const noRecordAtAll = totalCount === 0;
|
||||||
|
|
||||||
const isRemote = objectMetadataItem.isRemote;
|
const isRemote = objectMetadataItem.isRemote;
|
||||||
|
|
||||||
const isSoftDeleteActive = useRecoilValue(isSoftDeleteActiveState);
|
const isSoftDeleteActive = useRecoilComponentValueV2(
|
||||||
|
isSoftDeleteFilterActiveComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
if (isRemote) {
|
if (isRemote) {
|
||||||
return <RecordTableEmptyStateRemote />;
|
return <RecordTableEmptyStateRemote />;
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import { useObjectLabel } from '@/object-metadata/hooks/useObjectLabel';
|
|||||||
import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
|
import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
|
||||||
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
import { RecordTableEmptyStateDisplay } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateDisplay';
|
import { RecordTableEmptyStateDisplay } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateDisplay';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { tableFiltersComponentState } from '@/object-record/record-table/states/tableFiltersComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
|
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
export const RecordTableEmptyStateSoftDelete = () => {
|
export const RecordTableEmptyStateSoftDelete = () => {
|
||||||
const { objectMetadataItem, objectNameSingular, recordTableId } =
|
const { objectMetadataItem, objectNameSingular, recordTableId } =
|
||||||
@@ -15,9 +15,11 @@ export const RecordTableEmptyStateSoftDelete = () => {
|
|||||||
|
|
||||||
const { deleteCombinedViewFilter } =
|
const { deleteCombinedViewFilter } =
|
||||||
useDeleteCombinedViewFilters(recordTableId);
|
useDeleteCombinedViewFilters(recordTableId);
|
||||||
const { tableFiltersState } = useRecordTableStates(recordTableId);
|
|
||||||
|
|
||||||
const tableFilters = useRecoilValue(tableFiltersState);
|
const tableFilters = useRecoilComponentValueV2(
|
||||||
|
tableFiltersComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const { toggleSoftDeleteFilterState } = useHandleToggleTrashColumnFilter({
|
const { toggleSoftDeleteFilterState } = useHandleToggleTrashColumnFilter({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableEmptyStateNoRecordAtAll } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateNoRecordAtAll';
|
import { RecordTableEmptyStateNoRecordAtAll } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateNoRecordAtAll';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
@@ -19,12 +19,12 @@ const meta: Meta = {
|
|||||||
RecordTableDecorator,
|
RecordTableDecorator,
|
||||||
(Story) => (
|
(Story) => (
|
||||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId="persons"
|
recordTableId="persons"
|
||||||
onColumnsChange={() => {}}
|
onColumnsChange={() => {}}
|
||||||
>
|
>
|
||||||
<Story />
|
<Story />
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</SnackBarProviderScope>
|
</SnackBarProviderScope>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableEmptyStateNoRecordFoundForFilter } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateNoRecordFoundForFilter';
|
import { RecordTableEmptyStateNoRecordFoundForFilter } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateNoRecordFoundForFilter';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
@@ -20,12 +20,12 @@ const meta: Meta = {
|
|||||||
RecordTableDecorator,
|
RecordTableDecorator,
|
||||||
(Story) => (
|
(Story) => (
|
||||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId="persons"
|
recordTableId="persons"
|
||||||
onColumnsChange={() => {}}
|
onColumnsChange={() => {}}
|
||||||
>
|
>
|
||||||
<Story />
|
<Story />
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</SnackBarProviderScope>
|
</SnackBarProviderScope>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableEmptyStateRemote } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateRemote';
|
import { RecordTableEmptyStateRemote } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateRemote';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
@@ -19,12 +19,12 @@ const meta: Meta = {
|
|||||||
RecordTableDecorator,
|
RecordTableDecorator,
|
||||||
(Story) => (
|
(Story) => (
|
||||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId="persons"
|
recordTableId="persons"
|
||||||
onColumnsChange={() => {}}
|
onColumnsChange={() => {}}
|
||||||
>
|
>
|
||||||
<Story />
|
<Story />
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</SnackBarProviderScope>
|
</SnackBarProviderScope>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableEmptyStateSoftDelete } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete';
|
import { RecordTableEmptyStateSoftDelete } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
@@ -19,12 +19,12 @@ const meta: Meta = {
|
|||||||
RecordTableDecorator,
|
RecordTableDecorator,
|
||||||
(Story) => (
|
(Story) => (
|
||||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId="persons"
|
recordTableId="persons"
|
||||||
onColumnsChange={() => {}}
|
onColumnsChange={() => {}}
|
||||||
>
|
>
|
||||||
<Story />
|
<Story />
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</SnackBarProviderScope>
|
</SnackBarProviderScope>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,13 +1,20 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useCloseCurrentTableCellInEditMode = (recordTableId?: string) => {
|
export const useCloseCurrentTableCellInEditMode = (recordTableId?: string) => {
|
||||||
const {
|
const currentTableCellInEditModePositionState =
|
||||||
currentTableCellInEditModePositionState,
|
useRecoilComponentCallbackStateV2(
|
||||||
isTableCellInEditModeFamilyState,
|
currentTableCellInEditModePositionComponentState,
|
||||||
} = useRecordTableStates(recordTableId);
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isTableCellInEditModeFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isTableCellInEditModeComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set, snapshot }) => {
|
({ set, snapshot }) => {
|
||||||
|
|||||||
@@ -1,14 +1,24 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { isSoftFocusActiveComponentState } from '@/object-record/record-table/states/isSoftFocusActiveComponentState';
|
||||||
|
import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/record-table/states/isSoftFocusOnTableCellComponentFamilyState';
|
||||||
|
import { softFocusPositionComponentState } from '@/object-record/record-table/states/softFocusPositionComponentState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useDisableSoftFocus = (recordTableId?: string) => {
|
export const useDisableSoftFocus = (recordTableId?: string) => {
|
||||||
const {
|
const softFocusPositionState = useRecoilComponentCallbackStateV2(
|
||||||
softFocusPositionState,
|
softFocusPositionComponentState,
|
||||||
isSoftFocusActiveState,
|
recordTableId,
|
||||||
isSoftFocusOnTableCellFamilyState,
|
);
|
||||||
} = useRecordTableStates(recordTableId);
|
const isSoftFocusActiveState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusActiveComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isSoftFocusOnTableCellFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusOnTableCellComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set, snapshot }) => {
|
({ set, snapshot }) => {
|
||||||
|
|||||||
@@ -1,13 +1,20 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useGetIsSomeCellInEditModeState = (recordTableId?: string) => {
|
export const useGetIsSomeCellInEditModeState = (recordTableId?: string) => {
|
||||||
const {
|
const currentTableCellInEditModePositionState =
|
||||||
currentTableCellInEditModePositionState,
|
useRecoilComponentCallbackStateV2(
|
||||||
isTableCellInEditModeFamilyState,
|
currentTableCellInEditModePositionComponentState,
|
||||||
} = useRecordTableStates(recordTableId);
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isTableCellInEditModeFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isTableCellInEditModeComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
|
|||||||
@@ -6,10 +6,8 @@ import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/reco
|
|||||||
import { isSoftFocusUsingMouseState } from '@/object-record/record-table/states/isSoftFocusUsingMouseState';
|
import { isSoftFocusUsingMouseState } from '@/object-record/record-table/states/isSoftFocusUsingMouseState';
|
||||||
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
||||||
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
|
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
import { extractComponentFamilyState } from '@/ui/utilities/state/component-state/utils/extractComponentFamilyState';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
|
||||||
|
|
||||||
export type HandleContainerMouseEnterArgs = {
|
export type HandleContainerMouseEnterArgs = {
|
||||||
cellPosition: TableCellPosition;
|
cellPosition: TableCellPosition;
|
||||||
@@ -20,24 +18,28 @@ export const useHandleContainerMouseEnter = ({
|
|||||||
}: {
|
}: {
|
||||||
recordTableId: string;
|
recordTableId: string;
|
||||||
}) => {
|
}) => {
|
||||||
const tableScopeId = getScopeIdFromComponentId(recordTableId);
|
|
||||||
|
|
||||||
const { moveSoftFocusToCell } =
|
const { moveSoftFocusToCell } =
|
||||||
useMoveSoftFocusToCellOnHoverV2(recordTableId);
|
useMoveSoftFocusToCellOnHoverV2(recordTableId);
|
||||||
|
|
||||||
|
const currentTableCellInEditModePositionState =
|
||||||
|
useRecoilComponentCallbackStateV2(
|
||||||
|
currentTableCellInEditModePositionComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const isSoftFocusOnTableCellFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusOnTableCellComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const isTableCellInEditModeFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isTableCellInEditModeComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const handleContainerMouseEnter = useRecoilCallback(
|
const handleContainerMouseEnter = useRecoilCallback(
|
||||||
({ snapshot, set }) =>
|
({ snapshot, set }) =>
|
||||||
({ cellPosition }: HandleContainerMouseEnterArgs) => {
|
({ cellPosition }: HandleContainerMouseEnterArgs) => {
|
||||||
const currentTableCellInEditModePositionState = extractComponentState(
|
|
||||||
currentTableCellInEditModePositionComponentState,
|
|
||||||
tableScopeId,
|
|
||||||
);
|
|
||||||
|
|
||||||
const isSoftFocusOnTableCellFamilyState = extractComponentFamilyState(
|
|
||||||
isSoftFocusOnTableCellComponentFamilyState,
|
|
||||||
tableScopeId,
|
|
||||||
);
|
|
||||||
|
|
||||||
const isSoftFocusOnTableCell = getSnapshotValue(
|
const isSoftFocusOnTableCell = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
isSoftFocusOnTableCellFamilyState(cellPosition),
|
isSoftFocusOnTableCellFamilyState(cellPosition),
|
||||||
@@ -48,11 +50,6 @@ export const useHandleContainerMouseEnter = ({
|
|||||||
currentTableCellInEditModePositionState,
|
currentTableCellInEditModePositionState,
|
||||||
);
|
);
|
||||||
|
|
||||||
const isTableCellInEditModeFamilyState = extractComponentFamilyState(
|
|
||||||
isTableCellInEditModeComponentFamilyState,
|
|
||||||
tableScopeId,
|
|
||||||
);
|
|
||||||
|
|
||||||
const isSomeCellInEditMode = getSnapshotValue(
|
const isSomeCellInEditMode = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
isTableCellInEditModeFamilyState(currentTableCellInEditModePosition),
|
isTableCellInEditModeFamilyState(currentTableCellInEditModePosition),
|
||||||
@@ -63,7 +60,12 @@ export const useHandleContainerMouseEnter = ({
|
|||||||
set(isSoftFocusUsingMouseState, true);
|
set(isSoftFocusUsingMouseState, true);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[tableScopeId, moveSoftFocusToCell],
|
[
|
||||||
|
isSoftFocusOnTableCellFamilyState,
|
||||||
|
currentTableCellInEditModePositionState,
|
||||||
|
isTableCellInEditModeFamilyState,
|
||||||
|
moveSoftFocusToCell,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
|
||||||
import { useResetTableRowSelection } from '@/object-record/record-table/hooks/internal/useResetTableRowSelection';
|
import { useResetTableRowSelection } from '@/object-record/record-table/hooks/internal/useResetTableRowSelection';
|
||||||
|
import { isSoftFocusActiveComponentState } from '@/object-record/record-table/states/isSoftFocusActiveComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useDisableSoftFocus } from './useDisableSoftFocus';
|
import { useDisableSoftFocus } from './useDisableSoftFocus';
|
||||||
|
|
||||||
export const useLeaveTableFocus = (recordTableId?: string) => {
|
export const useLeaveTableFocus = (recordTableId?: string) => {
|
||||||
const disableSoftFocus = useDisableSoftFocus(recordTableId);
|
const disableSoftFocus = useDisableSoftFocus(recordTableId);
|
||||||
|
|
||||||
const { isSoftFocusActiveState } = useRecordTableStates(recordTableId);
|
const isSoftFocusActiveState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusActiveComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const resetTableRowSelection = useResetTableRowSelection(recordTableId);
|
const resetTableRowSelection = useResetTableRowSelection(recordTableId);
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,22 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
|
||||||
|
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { TableCellPosition } from '../../types/TableCellPosition';
|
import { TableCellPosition } from '../../types/TableCellPosition';
|
||||||
|
|
||||||
export const useMoveEditModeToTableCellPosition = (recordTableId?: string) => {
|
export const useMoveEditModeToTableCellPosition = (recordTableId?: string) => {
|
||||||
const {
|
const isTableCellInEditModeFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
isTableCellInEditModeFamilyState,
|
isTableCellInEditModeComponentFamilyState,
|
||||||
currentTableCellInEditModePositionState,
|
recordTableId,
|
||||||
} = useRecordTableStates(recordTableId);
|
);
|
||||||
|
const currentTableCellInEditModePositionState =
|
||||||
|
useRecoilComponentCallbackStateV2(
|
||||||
|
currentTableCellInEditModePositionComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set, snapshot }) => {
|
({ set, snapshot }) => {
|
||||||
|
|||||||
@@ -1,156 +0,0 @@
|
|||||||
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 { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext';
|
|
||||||
import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState';
|
|
||||||
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
|
||||||
import { isRecordTableInitialLoadingComponentState } from '@/object-record/record-table/states/isRecordTableInitialLoadingComponentState';
|
|
||||||
import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState';
|
|
||||||
import { isSoftFocusActiveComponentState } from '@/object-record/record-table/states/isSoftFocusActiveComponentState';
|
|
||||||
import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/record-table/states/isSoftFocusOnTableCellComponentFamilyState';
|
|
||||||
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
|
||||||
import { numberOfTableRowsComponentState } from '@/object-record/record-table/states/numberOfTableRowsComponentState';
|
|
||||||
import { onColumnsChangeComponentState } from '@/object-record/record-table/states/onColumnsChangeComponentState';
|
|
||||||
import { onEntityCountChangeComponentState } from '@/object-record/record-table/states/onEntityCountChangeComponentState';
|
|
||||||
import { onToggleColumnFilterComponentState } from '@/object-record/record-table/states/onToggleColumnFilterComponentState';
|
|
||||||
import { onToggleColumnSortComponentState } from '@/object-record/record-table/states/onToggleColumnSortComponentState';
|
|
||||||
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
|
||||||
import { resizeFieldOffsetComponentState } from '@/object-record/record-table/states/resizeFieldOffsetComponentState';
|
|
||||||
import { allRowsSelectedStatusComponentSelector } from '@/object-record/record-table/states/selectors/allRowsSelectedStatusComponentSelector';
|
|
||||||
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
|
||||||
import { numberOfTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/numberOfTableColumnsComponentSelector';
|
|
||||||
import { selectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/selectedRowIdsComponentSelector';
|
|
||||||
import { unselectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/unselectedRowIdsComponentSelector';
|
|
||||||
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
|
||||||
import { softFocusPositionComponentState } from '@/object-record/record-table/states/softFocusPositionComponentState';
|
|
||||||
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
|
||||||
import { tableFiltersComponentState } from '@/object-record/record-table/states/tableFiltersComponentState';
|
|
||||||
import { tableLastRowVisibleComponentState } from '@/object-record/record-table/states/tableLastRowVisibleComponentState';
|
|
||||||
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
|
||||||
import { tableSortsComponentState } from '@/object-record/record-table/states/tableSortsComponentState';
|
|
||||||
import { tableViewFilterGroupsComponentState } from '@/object-record/record-table/states/tableViewFilterGroupsComponentState';
|
|
||||||
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
|
||||||
import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId';
|
|
||||||
import { extractComponentFamilyState } from '@/ui/utilities/state/component-state/utils/extractComponentFamilyState';
|
|
||||||
import { extractComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/extractComponentReadOnlySelector';
|
|
||||||
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
|
||||||
|
|
||||||
export const useRecordTableStates = (recordTableId?: string) => {
|
|
||||||
const scopeId = useAvailableScopeIdOrThrow(
|
|
||||||
RecordTableScopeInternalContext,
|
|
||||||
getScopeIdOrUndefinedFromComponentId(recordTableId),
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
scopeId,
|
|
||||||
availableTableColumnsState: extractComponentState(
|
|
||||||
availableTableColumnsComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
tableViewFilterGroupsState: extractComponentState(
|
|
||||||
tableViewFilterGroupsComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
tableFiltersState: extractComponentState(
|
|
||||||
tableFiltersComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
tableSortsState: extractComponentState(tableSortsComponentState, scopeId),
|
|
||||||
tableColumnsState: extractComponentState(
|
|
||||||
tableColumnsComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
onToggleColumnFilterState: extractComponentState(
|
|
||||||
onToggleColumnFilterComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
onToggleColumnSortState: extractComponentState(
|
|
||||||
onToggleColumnSortComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
onColumnsChangeState: extractComponentState(
|
|
||||||
onColumnsChangeComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
onEntityCountChangeState: extractComponentState(
|
|
||||||
onEntityCountChangeComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
tableLastRowVisibleState: extractComponentState(
|
|
||||||
tableLastRowVisibleComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
softFocusPositionState: extractComponentState(
|
|
||||||
softFocusPositionComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
numberOfTableRowsState: extractComponentState(
|
|
||||||
numberOfTableRowsComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
currentTableCellInEditModePositionState: extractComponentState(
|
|
||||||
currentTableCellInEditModePositionComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
isTableCellInEditModeFamilyState: extractComponentFamilyState(
|
|
||||||
isTableCellInEditModeComponentFamilyState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
isSoftDeleteActiveState: extractComponentState(
|
|
||||||
isSoftDeleteFilterActiveComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
isSoftFocusActiveState: extractComponentState(
|
|
||||||
isSoftFocusActiveComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
tableRowIdsState: extractComponentState(tableRowIdsComponentState, scopeId),
|
|
||||||
isRecordTableInitialLoadingState: extractComponentState(
|
|
||||||
isRecordTableInitialLoadingComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
resizeFieldOffsetState: extractComponentState(
|
|
||||||
resizeFieldOffsetComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
isSoftFocusOnTableCellFamilyState: extractComponentFamilyState(
|
|
||||||
isSoftFocusOnTableCellComponentFamilyState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
isRowSelectedFamilyState: extractComponentFamilyState(
|
|
||||||
isRowSelectedComponentFamilyState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
hasUserSelectedAllRowsState: extractComponentState(
|
|
||||||
hasUserSelectedAllRowsComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
allRowsSelectedStatusSelector: extractComponentReadOnlySelector(
|
|
||||||
allRowsSelectedStatusComponentSelector,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
hiddenTableColumnsSelector: extractComponentReadOnlySelector(
|
|
||||||
hiddenTableColumnsComponentSelector,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
numberOfTableColumnsSelector: extractComponentReadOnlySelector(
|
|
||||||
numberOfTableColumnsComponentSelector,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
selectedRowIdsSelector: extractComponentReadOnlySelector(
|
|
||||||
selectedRowIdsComponentSelector,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
unselectedRowIdsSelector: extractComponentReadOnlySelector(
|
|
||||||
unselectedRowIdsComponentSelector,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
visibleTableColumnsSelector: extractComponentReadOnlySelector(
|
|
||||||
visibleTableColumnsComponentSelector,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
pendingRecordIdState: extractComponentState(
|
|
||||||
recordTablePendingRecordIdComponentState,
|
|
||||||
scopeId,
|
|
||||||
),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,16 +1,26 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
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 { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
||||||
|
|
||||||
export const useResetTableRowSelection = (recordTableId?: string) => {
|
export const useResetTableRowSelection = (recordTableId?: string) => {
|
||||||
const {
|
const tableRowIdsState = useRecoilComponentCallbackStateV2(
|
||||||
tableRowIdsState,
|
tableRowIdsComponentState,
|
||||||
isRowSelectedFamilyState,
|
recordTableId,
|
||||||
hasUserSelectedAllRowsState,
|
);
|
||||||
} = useRecordTableStates(recordTableId);
|
const isRowSelectedFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isRowSelectedComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const hasUserSelectedAllRowsState = useRecoilComponentCallbackStateV2(
|
||||||
|
hasUserSelectedAllRowsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ snapshot, set }) =>
|
({ snapshot, set }) =>
|
||||||
|
|||||||
@@ -1,21 +1,31 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
|
||||||
|
import { allRowsSelectedStatusComponentSelector } from '@/object-record/record-table/states/selectors/allRowsSelectedStatusComponentSelector';
|
||||||
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useSelectAllRows = (recordTableId?: string) => {
|
export const useSelectAllRows = (recordTableId?: string) => {
|
||||||
const {
|
const allRowsSelectedStatusSelector = useRecoilComponentCallbackStateV2(
|
||||||
allRowsSelectedStatusSelector,
|
allRowsSelectedStatusComponentSelector,
|
||||||
tableRowIdsState,
|
recordTableId,
|
||||||
isRowSelectedFamilyState,
|
);
|
||||||
} = useRecordTableStates(recordTableId);
|
const tableRowIdsState = useRecoilComponentCallbackStateV2(
|
||||||
|
tableRowIdsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isRowSelectedFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isRowSelectedComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const selectAllRows = useRecoilCallback(
|
const selectAllRows = useRecoilCallback(
|
||||||
({ set, snapshot }) =>
|
({ set, snapshot }) =>
|
||||||
() => {
|
() => {
|
||||||
const allRowsSelectedStatus = getSnapshotValue(
|
const allRowsSelectedStatus = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
allRowsSelectedStatusSelector(),
|
allRowsSelectedStatusSelector,
|
||||||
);
|
);
|
||||||
|
|
||||||
const tableRowIds = getSnapshotValue(snapshot, tableRowIdsState);
|
const tableRowIds = getSnapshotValue(snapshot, tableRowIdsState);
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { hasUserSelectedAllRowsComponentState } from '@/object-record/record-table/record-table-row/states/hasUserSelectedAllRowsFamilyState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useSetHasUserSelectedAllRows = (recordTableId?: string) => {
|
export const useSetHasUserSelectedAllRows = (recordTableId?: string) => {
|
||||||
const { hasUserSelectedAllRowsState } = useRecordTableStates(recordTableId);
|
const hasUserSelectedAllRowsState = useRecoilComponentCallbackStateV2(
|
||||||
|
hasUserSelectedAllRowsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set }) =>
|
({ set }) =>
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
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 { numberOfTableRowsComponentState } from '@/object-record/record-table/states/numberOfTableRowsComponentState';
|
||||||
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
||||||
|
|
||||||
type useSetRecordTableDataProps = {
|
type useSetRecordTableDataProps = {
|
||||||
@@ -15,12 +19,22 @@ export const useSetRecordTableData = ({
|
|||||||
recordTableId,
|
recordTableId,
|
||||||
onEntityCountChange,
|
onEntityCountChange,
|
||||||
}: useSetRecordTableDataProps) => {
|
}: useSetRecordTableDataProps) => {
|
||||||
const {
|
const tableRowIdsState = useRecoilComponentCallbackStateV2(
|
||||||
tableRowIdsState,
|
tableRowIdsComponentState,
|
||||||
numberOfTableRowsState,
|
recordTableId,
|
||||||
isRowSelectedFamilyState,
|
);
|
||||||
hasUserSelectedAllRowsState,
|
const numberOfTableRowsState = useRecoilComponentCallbackStateV2(
|
||||||
} = useRecordTableStates(recordTableId);
|
numberOfTableRowsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isRowSelectedFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isRowSelectedComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const hasUserSelectedAllRowsState = useRecoilComponentCallbackStateV2(
|
||||||
|
hasUserSelectedAllRowsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set, snapshot }) =>
|
({ set, snapshot }) =>
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useSetRowSelectedState = (recordTableId?: string) => {
|
export const useSetRowSelectedState = (recordTableId?: string) => {
|
||||||
const { isRowSelectedFamilyState } = useRecordTableStates(recordTableId);
|
const isRowSelectedFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isRowSelectedComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set }) =>
|
({ set }) =>
|
||||||
|
|||||||
@@ -1,16 +1,26 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
|
||||||
|
import { isSoftFocusActiveComponentState } from '@/object-record/record-table/states/isSoftFocusActiveComponentState';
|
||||||
|
import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/record-table/states/isSoftFocusOnTableCellComponentFamilyState';
|
||||||
|
import { softFocusPositionComponentState } from '@/object-record/record-table/states/softFocusPositionComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { TableCellPosition } from '../../types/TableCellPosition';
|
import { TableCellPosition } from '../../types/TableCellPosition';
|
||||||
|
|
||||||
export const useSetSoftFocusPosition = (recordTableId?: string) => {
|
export const useSetSoftFocusPosition = (recordTableId?: string) => {
|
||||||
const {
|
const softFocusPositionState = useRecoilComponentCallbackStateV2(
|
||||||
softFocusPositionState,
|
softFocusPositionComponentState,
|
||||||
isSoftFocusActiveState,
|
recordTableId,
|
||||||
isSoftFocusOnTableCellFamilyState,
|
);
|
||||||
} = useRecordTableStates(recordTableId);
|
const isSoftFocusActiveState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusActiveComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isSoftFocusOnTableCellFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusOnTableCellComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ set, snapshot }) => {
|
({ set, snapshot }) => {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ 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 { useSetHasUserSelectedAllRows } from '@/object-record/record-table/hooks/internal/useSetAllRowSelectedState';
|
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';
|
||||||
@@ -16,6 +15,20 @@ import { useUpsertRecordFromState } from '../../hooks/useUpsertRecordFromState';
|
|||||||
import { ColumnDefinition } from '../types/ColumnDefinition';
|
import { ColumnDefinition } from '../types/ColumnDefinition';
|
||||||
import { TableHotkeyScope } from '../types/TableHotkeyScope';
|
import { TableHotkeyScope } from '../types/TableHotkeyScope';
|
||||||
|
|
||||||
|
import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState';
|
||||||
|
import { isRecordTableInitialLoadingComponentState } from '@/object-record/record-table/states/isRecordTableInitialLoadingComponentState';
|
||||||
|
import { onColumnsChangeComponentState } from '@/object-record/record-table/states/onColumnsChangeComponentState';
|
||||||
|
import { onEntityCountChangeComponentState } from '@/object-record/record-table/states/onEntityCountChangeComponentState';
|
||||||
|
import { onToggleColumnFilterComponentState } from '@/object-record/record-table/states/onToggleColumnFilterComponentState';
|
||||||
|
import { onToggleColumnSortComponentState } from '@/object-record/record-table/states/onToggleColumnSortComponentState';
|
||||||
|
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||||
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
|
import { tableFiltersComponentState } from '@/object-record/record-table/states/tableFiltersComponentState';
|
||||||
|
import { tableLastRowVisibleComponentState } from '@/object-record/record-table/states/tableLastRowVisibleComponentState';
|
||||||
|
import { tableSortsComponentState } from '@/object-record/record-table/states/tableSortsComponentState';
|
||||||
|
import { tableViewFilterGroupsComponentState } from '@/object-record/record-table/states/tableViewFilterGroupsComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { useDisableSoftFocus } from './internal/useDisableSoftFocus';
|
import { useDisableSoftFocus } from './internal/useDisableSoftFocus';
|
||||||
import { useLeaveTableFocus } from './internal/useLeaveTableFocus';
|
import { useLeaveTableFocus } from './internal/useLeaveTableFocus';
|
||||||
import { useResetTableRowSelection } from './internal/useResetTableRowSelection';
|
import { useResetTableRowSelection } from './internal/useResetTableRowSelection';
|
||||||
@@ -31,24 +44,10 @@ type useRecordTableProps = {
|
|||||||
export const useRecordTable = (props?: useRecordTableProps) => {
|
export const useRecordTable = (props?: useRecordTableProps) => {
|
||||||
const recordTableId = props?.recordTableId;
|
const recordTableId = props?.recordTableId;
|
||||||
|
|
||||||
const {
|
const availableTableColumnsState = useRecoilComponentCallbackStateV2(
|
||||||
scopeId,
|
availableTableColumnsComponentState,
|
||||||
availableTableColumnsState,
|
recordTableId,
|
||||||
tableViewFilterGroupsState,
|
);
|
||||||
tableFiltersState,
|
|
||||||
tableSortsState,
|
|
||||||
tableColumnsState,
|
|
||||||
onEntityCountChangeState,
|
|
||||||
onColumnsChangeState,
|
|
||||||
isRecordTableInitialLoadingState,
|
|
||||||
tableLastRowVisibleState,
|
|
||||||
selectedRowIdsSelector,
|
|
||||||
unselectedRowIdsSelector,
|
|
||||||
onToggleColumnFilterState,
|
|
||||||
onToggleColumnSortState,
|
|
||||||
pendingRecordIdState,
|
|
||||||
hasUserSelectedAllRowsState,
|
|
||||||
} = useRecordTableStates(recordTableId);
|
|
||||||
|
|
||||||
const setAvailableTableColumns = useRecoilCallback(
|
const setAvailableTableColumns = useRecoilCallback(
|
||||||
({ snapshot, set }) =>
|
({ snapshot, set }) =>
|
||||||
@@ -66,29 +65,58 @@ export const useRecordTable = (props?: useRecordTableProps) => {
|
|||||||
[availableTableColumnsState],
|
[availableTableColumnsState],
|
||||||
);
|
);
|
||||||
|
|
||||||
const setOnEntityCountChange = useSetRecoilState(onEntityCountChangeState);
|
const setOnEntityCountChange = useSetRecoilComponentStateV2(
|
||||||
|
onEntityCountChangeComponentState,
|
||||||
const setTableViewFilterGroups = useSetRecoilState(
|
recordTableId,
|
||||||
tableViewFilterGroupsState,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const setTableFilters = useSetRecoilState(tableFiltersState);
|
const setTableViewFilterGroups = useSetRecoilComponentStateV2(
|
||||||
|
tableViewFilterGroupsComponentState,
|
||||||
const setTableSorts = useSetRecoilState(tableSortsState);
|
recordTableId,
|
||||||
|
|
||||||
const setTableColumns = useSetRecoilState(tableColumnsState);
|
|
||||||
|
|
||||||
const setOnColumnsChange = useSetRecoilState(onColumnsChangeState);
|
|
||||||
|
|
||||||
const setOnToggleColumnFilter = useSetRecoilState(onToggleColumnFilterState);
|
|
||||||
const setOnToggleColumnSort = useSetRecoilState(onToggleColumnSortState);
|
|
||||||
|
|
||||||
const setIsRecordTableInitialLoading = useSetRecoilState(
|
|
||||||
isRecordTableInitialLoadingState,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const setRecordTableLastRowVisible = useSetRecoilState(
|
const setTableFilters = useSetRecoilComponentStateV2(
|
||||||
tableLastRowVisibleState,
|
tableFiltersComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setTableSorts = useSetRecoilComponentStateV2(
|
||||||
|
tableSortsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setTableColumns = useSetRecoilComponentStateV2(
|
||||||
|
tableColumnsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setOnColumnsChange = useSetRecoilComponentStateV2(
|
||||||
|
onColumnsChangeComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setOnToggleColumnFilter = useSetRecoilComponentStateV2(
|
||||||
|
onToggleColumnFilterComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
const setOnToggleColumnSort = useSetRecoilComponentStateV2(
|
||||||
|
onToggleColumnSortComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setIsRecordTableInitialLoading = useSetRecoilComponentStateV2(
|
||||||
|
isRecordTableInitialLoadingComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setRecordTableLastRowVisible = useSetRecoilComponentStateV2(
|
||||||
|
tableLastRowVisibleComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const onColumnsChangeState = useRecoilComponentCallbackStateV2(
|
||||||
|
onColumnsChangeComponentState,
|
||||||
|
recordTableId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const onColumnsChange = useRecoilCallback(
|
const onColumnsChange = useRecoilCallback(
|
||||||
@@ -104,6 +132,11 @@ export const useRecordTable = (props?: useRecordTableProps) => {
|
|||||||
[onColumnsChangeState],
|
[onColumnsChangeState],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const onEntityCountChangeState = useRecoilComponentCallbackStateV2(
|
||||||
|
onEntityCountChangeComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const onEntityCountChange = useRecoilCallback(
|
const onEntityCountChange = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
(count?: number) => {
|
(count?: number) => {
|
||||||
@@ -202,10 +235,12 @@ export const useRecordTable = (props?: useRecordTableProps) => {
|
|||||||
const isSomeCellInEditModeState =
|
const isSomeCellInEditModeState =
|
||||||
useGetIsSomeCellInEditModeState(recordTableId);
|
useGetIsSomeCellInEditModeState(recordTableId);
|
||||||
|
|
||||||
const setPendingRecordId = useSetRecoilState(pendingRecordIdState);
|
const setPendingRecordId = useSetRecoilComponentStateV2(
|
||||||
|
recordTablePendingRecordIdComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
scopeId,
|
|
||||||
onColumnsChange,
|
onColumnsChange,
|
||||||
setAvailableTableColumns,
|
setAvailableTableColumns,
|
||||||
setTableViewFilterGroups,
|
setTableViewFilterGroups,
|
||||||
@@ -229,12 +264,9 @@ export const useRecordTable = (props?: useRecordTableProps) => {
|
|||||||
setRecordTableLastRowVisible,
|
setRecordTableLastRowVisible,
|
||||||
setSoftFocusPosition,
|
setSoftFocusPosition,
|
||||||
isSomeCellInEditModeState,
|
isSomeCellInEditModeState,
|
||||||
selectedRowIdsSelector,
|
|
||||||
unselectedRowIdsSelector,
|
|
||||||
setHasUserSelectedAllRows,
|
setHasUserSelectedAllRows,
|
||||||
setOnToggleColumnFilter,
|
setOnToggleColumnFilter,
|
||||||
setOnToggleColumnSort,
|
setOnToggleColumnSort,
|
||||||
setPendingRecordId,
|
setPendingRecordId,
|
||||||
hasUserSelectedAllRowsState,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { MoveFocusDirection } from '@/object-record/record-table/types/MoveFocusDirection';
|
import { MoveFocusDirection } from '@/object-record/record-table/types/MoveFocusDirection';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
|
||||||
|
import { numberOfTableRowsComponentState } from '@/object-record/record-table/states/numberOfTableRowsComponentState';
|
||||||
|
import { numberOfTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/numberOfTableColumnsComponentSelector';
|
||||||
|
import { softFocusPositionComponentState } from '@/object-record/record-table/states/softFocusPositionComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useSetSoftFocusPosition } from './internal/useSetSoftFocusPosition';
|
import { useSetSoftFocusPosition } from './internal/useSetSoftFocusPosition';
|
||||||
|
|
||||||
export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
||||||
const {
|
|
||||||
scopeId,
|
|
||||||
softFocusPositionState,
|
|
||||||
numberOfTableRowsState,
|
|
||||||
numberOfTableColumnsSelector,
|
|
||||||
selectedRowIdsSelector,
|
|
||||||
} = useRecordTableStates(recordTableId);
|
|
||||||
|
|
||||||
const setSoftFocusPosition = useSetSoftFocusPosition(recordTableId);
|
const setSoftFocusPosition = useSetSoftFocusPosition(recordTableId);
|
||||||
|
|
||||||
|
const softFocusPositionState = useRecoilComponentCallbackStateV2(
|
||||||
|
softFocusPositionComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const moveUp = useRecoilCallback(
|
const moveUp = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
() => {
|
() => {
|
||||||
@@ -39,6 +39,11 @@ export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
|||||||
[softFocusPositionState, setSoftFocusPosition],
|
[softFocusPositionState, setSoftFocusPosition],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const numberOfTableRowsState = useRecoilComponentCallbackStateV2(
|
||||||
|
numberOfTableRowsComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const moveDown = useRecoilCallback(
|
const moveDown = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
() => {
|
() => {
|
||||||
@@ -66,6 +71,11 @@ export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
|||||||
[numberOfTableRowsState, setSoftFocusPosition, softFocusPositionState],
|
[numberOfTableRowsState, setSoftFocusPosition, softFocusPositionState],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const numberOfTableColumnsSelector = useRecoilComponentCallbackStateV2(
|
||||||
|
numberOfTableColumnsComponentSelector,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const moveRight = useRecoilCallback(
|
const moveRight = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
() => {
|
() => {
|
||||||
@@ -76,7 +86,7 @@ export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
|||||||
|
|
||||||
const numberOfTableColumns = getSnapshotValue(
|
const numberOfTableColumns = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
numberOfTableColumnsSelector(),
|
numberOfTableColumnsSelector,
|
||||||
);
|
);
|
||||||
|
|
||||||
const numberOfTableRows = getSnapshotValue(
|
const numberOfTableRows = getSnapshotValue(
|
||||||
@@ -132,7 +142,7 @@ export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
|||||||
|
|
||||||
const numberOfTableColumns = getSnapshotValue(
|
const numberOfTableColumns = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
numberOfTableColumnsSelector(),
|
numberOfTableColumnsSelector,
|
||||||
);
|
);
|
||||||
|
|
||||||
const currentColumnNumber = softFocusPosition.column;
|
const currentColumnNumber = softFocusPosition.column;
|
||||||
@@ -187,13 +197,11 @@ export const useRecordTableMoveFocus = (recordTableId?: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
scopeId,
|
|
||||||
moveDown,
|
moveDown,
|
||||||
moveLeft,
|
moveLeft,
|
||||||
moveRight,
|
moveRight,
|
||||||
moveUp,
|
moveUp,
|
||||||
setSoftFocusPosition,
|
setSoftFocusPosition,
|
||||||
selectedRowIdsSelector,
|
|
||||||
moveFocus,
|
moveFocus,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
import { useMoveViewColumns } from '@/views/hooks/useMoveViewColumns';
|
import { useMoveViewColumns } from '@/views/hooks/useMoveViewColumns';
|
||||||
|
|
||||||
|
import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { ColumnDefinition } from '../types/ColumnDefinition';
|
import { ColumnDefinition } from '../types/ColumnDefinition';
|
||||||
|
|
||||||
type useRecordTableProps = {
|
type useRecordTableProps = {
|
||||||
@@ -17,16 +19,19 @@ export const useTableColumns = (props?: useRecordTableProps) => {
|
|||||||
recordTableId: props?.recordTableId,
|
recordTableId: props?.recordTableId,
|
||||||
});
|
});
|
||||||
|
|
||||||
const {
|
const availableTableColumns = useRecoilComponentValueV2(
|
||||||
availableTableColumnsState,
|
availableTableColumnsComponentState,
|
||||||
tableColumnsState,
|
props?.recordTableId,
|
||||||
visibleTableColumnsSelector,
|
);
|
||||||
} = useRecordTableStates(props?.recordTableId);
|
|
||||||
|
|
||||||
const availableTableColumns = useRecoilValue(availableTableColumnsState);
|
const tableColumns = useRecoilComponentValueV2(
|
||||||
|
tableColumnsComponentState,
|
||||||
const tableColumns = useRecoilValue(tableColumnsState);
|
props?.recordTableId,
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
);
|
||||||
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
props?.recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const { handleColumnMove } = useMoveViewColumns();
|
const { handleColumnMove } = useMoveViewColumns();
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { RecordTableRows } from '@/object-record/record-table/components/RecordTableRows';
|
import { RecordTableRows } from '@/object-record/record-table/components/RecordTableRows';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableBodyDragDropContext } from '@/object-record/record-table/record-table-body/components/RecordTableBodyDragDropContext';
|
import { RecordTableBodyDragDropContext } from '@/object-record/record-table/record-table-body/components/RecordTableBodyDragDropContext';
|
||||||
import { RecordTableBodyDroppable } from '@/object-record/record-table/record-table-body/components/RecordTableBodyDroppable';
|
import { RecordTableBodyDroppable } from '@/object-record/record-table/record-table-body/components/RecordTableBodyDroppable';
|
||||||
import { RecordTableBodyLoading } from '@/object-record/record-table/record-table-body/components/RecordTableBodyLoading';
|
import { RecordTableBodyLoading } from '@/object-record/record-table/record-table-body/components/RecordTableBodyLoading';
|
||||||
import { RecordTablePendingRow } from '@/object-record/record-table/record-table-row/components/RecordTablePendingRow';
|
import { RecordTablePendingRow } from '@/object-record/record-table/record-table-row/components/RecordTablePendingRow';
|
||||||
|
import { isRecordTableInitialLoadingComponentState } from '@/object-record/record-table/states/isRecordTableInitialLoadingComponentState';
|
||||||
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableBody = () => {
|
export const RecordTableBody = () => {
|
||||||
const { tableRowIdsState, isRecordTableInitialLoadingState } =
|
const tableRowIds = useRecoilComponentValueV2(tableRowIdsComponentState);
|
||||||
useRecordTableStates();
|
|
||||||
|
|
||||||
const tableRowIds = useRecoilValue(tableRowIdsState);
|
const isRecordTableInitialLoading = useRecoilComponentValueV2(
|
||||||
|
isRecordTableInitialLoadingComponentState,
|
||||||
const isRecordTableInitialLoading = useRecoilValue(
|
|
||||||
isRecordTableInitialLoadingState,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (isRecordTableInitialLoading && tableRowIds.length === 0) {
|
if (isRecordTableInitialLoading && tableRowIds.length === 0) {
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import { ReactNode, useContext } from 'react';
|
|
||||||
import { DragDropContext, DropResult } from '@hello-pangea/dnd';
|
import { DragDropContext, DropResult } from '@hello-pangea/dnd';
|
||||||
import { useRecoilValue, useSetRecoilState } from 'recoil';
|
import { ReactNode, useContext } from 'react';
|
||||||
|
import { useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useComputeNewRowPosition } from '@/object-record/record-table/hooks/useComputeNewRowPosition';
|
import { useComputeNewRowPosition } from '@/object-record/record-table/hooks/useComputeNewRowPosition';
|
||||||
import { isRemoveSortingModalOpenState } from '@/object-record/record-table/states/isRemoveSortingModalOpenState';
|
import { isRemoveSortingModalOpenState } from '@/object-record/record-table/states/isRemoveSortingModalOpenState';
|
||||||
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
@@ -21,9 +22,7 @@ export const RecordTableBodyDragDropContext = ({
|
|||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { tableRowIdsState } = useRecordTableStates();
|
const tableRowIds = useRecoilComponentValueV2(tableRowIdsComponentState);
|
||||||
|
|
||||||
const tableRowIds = useRecoilValue(tableRowIdsState);
|
|
||||||
|
|
||||||
const { currentViewWithCombinedFiltersAndSorts } =
|
const { currentViewWithCombinedFiltersAndSorts } =
|
||||||
useGetCurrentView(recordTableId);
|
useGetCurrentView(recordTableId);
|
||||||
|
|||||||
@@ -6,13 +6,14 @@ import { lastShowPageRecordIdState } from '@/object-record/record-field/states/l
|
|||||||
import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
|
import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
|
||||||
import { ROW_HEIGHT } from '@/object-record/record-table/constants/RowHeight';
|
import { ROW_HEIGHT } from '@/object-record/record-table/constants/RowHeight';
|
||||||
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { hasRecordTableFetchedAllRecordsComponentStateV2 } from '@/object-record/record-table/states/hasRecordTableFetchedAllRecordsComponentStateV2';
|
import { hasRecordTableFetchedAllRecordsComponentStateV2 } from '@/object-record/record-table/states/hasRecordTableFetchedAllRecordsComponentStateV2';
|
||||||
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
|
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
|
||||||
|
import { tableLastRowVisibleComponentState } from '@/object-record/record-table/states/tableLastRowVisibleComponentState';
|
||||||
import { isFetchingMoreRecordsFamilyState } from '@/object-record/states/isFetchingMoreRecordsFamilyState';
|
import { isFetchingMoreRecordsFamilyState } from '@/object-record/states/isFetchingMoreRecordsFamilyState';
|
||||||
import { useScrollLeftValue } from '@/ui/utilities/scroll/hooks/useScrollLeftValue';
|
import { useScrollLeftValue } from '@/ui/utilities/scroll/hooks/useScrollLeftValue';
|
||||||
import { useScrollTopValue } from '@/ui/utilities/scroll/hooks/useScrollTopValue';
|
import { useScrollTopValue } from '@/ui/utilities/scroll/hooks/useScrollTopValue';
|
||||||
import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { isNonEmptyString } from '@sniptt/guards';
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
import { useScrollToPosition } from '~/hooks/useScrollToPosition';
|
import { useScrollToPosition } from '~/hooks/useScrollToPosition';
|
||||||
|
|
||||||
@@ -35,14 +36,16 @@ export const RecordTableBodyEffect = () => {
|
|||||||
isFetchingMoreRecordsFamilyState(queryStateIdentifier),
|
isFetchingMoreRecordsFamilyState(queryStateIdentifier),
|
||||||
);
|
);
|
||||||
|
|
||||||
const { tableLastRowVisibleState } = useRecordTableStates();
|
const tableLastRowVisible = useRecoilComponentValueV2(
|
||||||
|
tableLastRowVisibleComponentState,
|
||||||
const tableLastRowVisible = useRecoilValue(tableLastRowVisibleState);
|
);
|
||||||
|
|
||||||
const scrollTop = useScrollTopValue('recordTableWithWrappers');
|
const scrollTop = useScrollTopValue('recordTableWithWrappers');
|
||||||
|
|
||||||
const setHasRecordTableFetchedAllRecordsComponents =
|
const setHasRecordTableFetchedAllRecordsComponents =
|
||||||
useSetRecoilComponentState(hasRecordTableFetchedAllRecordsComponentStateV2);
|
useSetRecoilComponentStateV2(
|
||||||
|
hasRecordTableFetchedAllRecordsComponentStateV2,
|
||||||
|
);
|
||||||
|
|
||||||
// TODO: move this outside because it might cause way too many re-renders for other hooks
|
// TODO: move this outside because it might cause way too many re-renders for other hooks
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -59,7 +62,7 @@ export const RecordTableBodyEffect = () => {
|
|||||||
|
|
||||||
const scrollLeft = useScrollLeftValue('recordTableWithWrappers');
|
const scrollLeft = useScrollLeftValue('recordTableWithWrappers');
|
||||||
|
|
||||||
const setIsRecordTableScrolledLeft = useSetRecoilComponentState(
|
const setIsRecordTableScrolledLeft = useSetRecoilComponentStateV2(
|
||||||
isRecordTableScrolledLeftComponentState,
|
isRecordTableScrolledLeftComponentState,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { GRAY_SCALE } from 'twenty-ui';
|
|||||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
import { hasRecordTableFetchedAllRecordsComponentStateV2 } from '@/object-record/record-table/states/hasRecordTableFetchedAllRecordsComponentStateV2';
|
import { hasRecordTableFetchedAllRecordsComponentStateV2 } from '@/object-record/record-table/states/hasRecordTableFetchedAllRecordsComponentStateV2';
|
||||||
import { RecordTableWithWrappersScrollWrapperContext } from '@/ui/utilities/scroll/contexts/ScrollWrapperContexts';
|
import { RecordTableWithWrappersScrollWrapperContext } from '@/ui/utilities/scroll/contexts/ScrollWrapperContexts';
|
||||||
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
const StyledText = styled.div`
|
const StyledText = styled.div`
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -33,7 +33,7 @@ export const RecordTableBodyFetchMoreLoader = () => {
|
|||||||
RecordTableWithWrappersScrollWrapperContext,
|
RecordTableWithWrappersScrollWrapperContext,
|
||||||
);
|
);
|
||||||
|
|
||||||
const hasRecordTableFetchedAllRecordsComponents = useRecoilComponentValue(
|
const hasRecordTableFetchedAllRecordsComponents = useRecoilComponentValueV2(
|
||||||
hasRecordTableFetchedAllRecordsComponentStateV2,
|
hasRecordTableFetchedAllRecordsComponentStateV2,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableCellCheckbox } from '@/object-record/record-table/record-table-cell/components/RecordTableCellCheckbox';
|
import { RecordTableCellCheckbox } from '@/object-record/record-table/record-table-cell/components/RecordTableCellCheckbox';
|
||||||
import { RecordTableCellGrip } from '@/object-record/record-table/record-table-cell/components/RecordTableCellGrip';
|
import { RecordTableCellGrip } from '@/object-record/record-table/record-table-cell/components/RecordTableCellGrip';
|
||||||
import { RecordTableCellLoading } from '@/object-record/record-table/record-table-cell/components/RecordTableCellLoading';
|
import { RecordTableCellLoading } from '@/object-record/record-table/record-table-cell/components/RecordTableCellLoading';
|
||||||
import { RecordTableTr } from '@/object-record/record-table/record-table-row/components/RecordTableTr';
|
import { RecordTableTr } from '@/object-record/record-table/record-table-row/components/RecordTableTr';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableBodyLoading = () => {
|
export const RecordTableBodyLoading = () => {
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates();
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
visibleTableColumnsComponentSelector,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|||||||
@@ -1,18 +1,14 @@
|
|||||||
import { useContext, useMemo } from 'react';
|
import { useContext, useMemo } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import { RecordTableCellFieldContextWrapper } from '@/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextWrapper';
|
import { RecordTableCellFieldContextWrapper } from '@/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextWrapper';
|
||||||
import { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext';
|
|
||||||
import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/record-table/states/isSoftFocusOnTableCellComponentFamilyState';
|
import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/record-table/states/isSoftFocusOnTableCellComponentFamilyState';
|
||||||
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
||||||
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
||||||
import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId';
|
|
||||||
import { extractComponentFamilyState } from '@/ui/utilities/state/component-state/utils/extractComponentFamilyState';
|
|
||||||
|
|
||||||
export const RecordTableCellWrapper = ({
|
export const RecordTableCellWrapper = ({
|
||||||
children,
|
children,
|
||||||
@@ -23,11 +19,6 @@ export const RecordTableCellWrapper = ({
|
|||||||
columnIndex: number;
|
columnIndex: number;
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) => {
|
}) => {
|
||||||
const tableScopeId = useAvailableScopeIdOrThrow(
|
|
||||||
RecordTableScopeInternalContext,
|
|
||||||
getScopeIdOrUndefinedFromComponentId(),
|
|
||||||
);
|
|
||||||
|
|
||||||
const { rowIndex } = useContext(RecordTableRowContext);
|
const { rowIndex } = useContext(RecordTableRowContext);
|
||||||
|
|
||||||
const currentTableCellPosition: TableCellPosition = useMemo(
|
const currentTableCellPosition: TableCellPosition = useMemo(
|
||||||
@@ -38,22 +29,14 @@ export const RecordTableCellWrapper = ({
|
|||||||
[columnIndex, rowIndex],
|
[columnIndex, rowIndex],
|
||||||
);
|
);
|
||||||
|
|
||||||
const isTableCellInEditModeFamilyState = extractComponentFamilyState(
|
const isInEditMode = useRecoilComponentFamilyValueV2(
|
||||||
isTableCellInEditModeComponentFamilyState,
|
isTableCellInEditModeComponentFamilyState,
|
||||||
tableScopeId,
|
currentTableCellPosition,
|
||||||
);
|
);
|
||||||
|
|
||||||
const isSoftFocusOnTableCellFamilyState = extractComponentFamilyState(
|
const hasSoftFocus = useRecoilComponentFamilyValueV2(
|
||||||
isSoftFocusOnTableCellComponentFamilyState,
|
isSoftFocusOnTableCellComponentFamilyState,
|
||||||
tableScopeId,
|
currentTableCellPosition,
|
||||||
);
|
|
||||||
|
|
||||||
const isInEditMode = useRecoilValue(
|
|
||||||
isTableCellInEditModeFamilyState(currentTableCellPosition),
|
|
||||||
);
|
|
||||||
|
|
||||||
const hasSoftFocus = useRecoilValue(
|
|
||||||
isSoftFocusOnTableCellFamilyState(currentTableCellPosition),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,19 +1,22 @@
|
|||||||
import { act, renderHook } from '@testing-library/react';
|
import { act, renderHook } from '@testing-library/react';
|
||||||
import { RecoilRoot, useRecoilValue } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
import { textfieldDefinition } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
import { textfieldDefinition } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import {
|
import {
|
||||||
recordTableCell,
|
recordTableCell,
|
||||||
recordTableRow,
|
recordTableRow,
|
||||||
} from '@/object-record/record-table/record-table-cell/hooks/__mocks__/cell';
|
} from '@/object-record/record-table/record-table-cell/hooks/__mocks__/cell';
|
||||||
import { useCloseRecordTableCell } from '@/object-record/record-table/record-table-cell/hooks/useCloseRecordTableCell';
|
import { useCloseRecordTableCell } from '@/object-record/record-table/record-table-cell/hooks/useCloseRecordTableCell';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
|
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
|
||||||
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
|
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
|
||||||
|
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
const setHotkeyScope = jest.fn();
|
const setHotkeyScope = jest.fn();
|
||||||
|
|
||||||
@@ -22,12 +25,12 @@ jest.mock('@/ui/utilities/hotkey/hooks/useSetHotkeyScope', () => ({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
const onColumnsChange = jest.fn();
|
const onColumnsChange = jest.fn();
|
||||||
const scopeId = 'scopeId';
|
const recordTableId = 'scopeId';
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId={scopeId}
|
recordTableId={recordTableId}
|
||||||
onColumnsChange={onColumnsChange}
|
onColumnsChange={onColumnsChange}
|
||||||
>
|
>
|
||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
@@ -46,7 +49,7 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
|||||||
</RecordTableCellContext.Provider>
|
</RecordTableCellContext.Provider>
|
||||||
</RecordTableRowContext.Provider>
|
</RecordTableRowContext.Provider>
|
||||||
</FieldContext.Provider>
|
</FieldContext.Provider>
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</RecoilRoot>
|
</RecoilRoot>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -54,15 +57,12 @@ describe('useCloseRecordTableCell', () => {
|
|||||||
it('should work as expected', async () => {
|
it('should work as expected', async () => {
|
||||||
const { result } = renderHook(
|
const { result } = renderHook(
|
||||||
() => {
|
() => {
|
||||||
const {
|
const currentTableCellInEditModePosition = useRecoilComponentValueV2(
|
||||||
currentTableCellInEditModePositionState,
|
currentTableCellInEditModePositionComponentState,
|
||||||
isTableCellInEditModeFamilyState,
|
|
||||||
} = useRecordTableStates();
|
|
||||||
const currentTableCellInEditModePosition = useRecoilValue(
|
|
||||||
currentTableCellInEditModePositionState,
|
|
||||||
);
|
);
|
||||||
const isTableCellInEditMode = useRecoilValue(
|
const isTableCellInEditMode = useRecoilComponentFamilyValueV2(
|
||||||
isTableCellInEditModeFamilyState(currentTableCellInEditModePosition),
|
isTableCellInEditModeComponentFamilyState,
|
||||||
|
currentTableCellInEditModePosition,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
...useCloseRecordTableCell(),
|
...useCloseRecordTableCell(),
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
import { act, renderHook, waitFor } from '@testing-library/react';
|
import { act, renderHook, waitFor } from '@testing-library/react';
|
||||||
import { RecoilRoot } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
|
|
||||||
import { useCurrentTableCellEditMode } from '../useCurrentTableCellEditMode';
|
import { useCurrentTableCellEditMode } from '../useCurrentTableCellEditMode';
|
||||||
|
|
||||||
const onColumnsChange = jest.fn();
|
const onColumnsChange = jest.fn();
|
||||||
|
|
||||||
const scopeId = 'scopeId';
|
const recordTableId = 'scopeId';
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
<RecordTableScope
|
<RecordTableComponentInstance
|
||||||
recordTableScopeId={scopeId}
|
recordTableId={recordTableId}
|
||||||
onColumnsChange={onColumnsChange}
|
onColumnsChange={onColumnsChange}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</RecoilRoot>
|
</RecoilRoot>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { renderHook } from '@testing-library/react';
|
import { renderHook } from '@testing-library/react';
|
||||||
import { RecoilRoot } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import {
|
import {
|
||||||
@@ -8,17 +9,19 @@ import {
|
|||||||
recordTableRow,
|
recordTableRow,
|
||||||
} from '@/object-record/record-table/record-table-cell/hooks/__mocks__/cell';
|
} from '@/object-record/record-table/record-table-cell/hooks/__mocks__/cell';
|
||||||
import { useIsSoftFocusOnCurrentTableCell } from '@/object-record/record-table/record-table-cell/hooks/useIsSoftFocusOnCurrentTableCell';
|
import { useIsSoftFocusOnCurrentTableCell } from '@/object-record/record-table/record-table-cell/hooks/useIsSoftFocusOnCurrentTableCell';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
<RecordTableScope recordTableScopeId="scopeId" onColumnsChange={jest.fn()}>
|
<RecordTableComponentInstance
|
||||||
|
recordTableId="scopeId"
|
||||||
|
onColumnsChange={jest.fn()}
|
||||||
|
>
|
||||||
<RecordTableRowContext.Provider value={recordTableRow}>
|
<RecordTableRowContext.Provider value={recordTableRow}>
|
||||||
<RecordTableCellContext.Provider value={recordTableCell}>
|
<RecordTableCellContext.Provider value={recordTableCell}>
|
||||||
{children}
|
{children}
|
||||||
</RecordTableCellContext.Provider>
|
</RecordTableCellContext.Provider>
|
||||||
</RecordTableRowContext.Provider>
|
</RecordTableRowContext.Provider>
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</RecoilRoot>
|
</RecoilRoot>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { act, renderHook } from '@testing-library/react';
|
import { act, renderHook } from '@testing-library/react';
|
||||||
import { CallbackInterface, RecoilRoot } from 'recoil';
|
import { CallbackInterface, RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import {
|
import {
|
||||||
@@ -8,24 +9,26 @@ import {
|
|||||||
recordTableRow,
|
recordTableRow,
|
||||||
} from '@/object-record/record-table/record-table-cell/hooks/__mocks__/cell';
|
} from '@/object-record/record-table/record-table-cell/hooks/__mocks__/cell';
|
||||||
import { useMoveSoftFocusToCurrentCellOnHover } from '@/object-record/record-table/record-table-cell/hooks/useMoveSoftFocusToCurrentCellOnHover';
|
import { useMoveSoftFocusToCurrentCellOnHover } from '@/object-record/record-table/record-table-cell/hooks/useMoveSoftFocusToCurrentCellOnHover';
|
||||||
import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope';
|
|
||||||
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
||||||
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
|
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
|
||||||
|
|
||||||
const mockSoftFocusPositionState = {
|
const mockSoftFocusPositionState = {
|
||||||
key: 'softFocusPositionComponentState__{"scopeId":"scopeId"}',
|
key: 'softFocusPositionComponentState__{"instanceId":"scopeId"}',
|
||||||
};
|
};
|
||||||
const mockSoftFocusActiveState = {
|
const mockSoftFocusActiveState = {
|
||||||
key: 'isSoftFocusActiveComponentState__{"scopeId":"scopeId"}',
|
key: 'isSoftFocusActiveComponentState__{"instanceId":"scopeId"}',
|
||||||
};
|
};
|
||||||
const mockIsSoftFocusOnTableCellFamilyState = {
|
const mockIsSoftFocusOnTableCellFamilyStateCurrentPosition = {
|
||||||
key: 'isSoftFocusOnTableCellFamilyComponentState__{"familyKey":{"column":1,"row":0},"scopeId":"scopeId"}',
|
key: 'isSoftFocusOnTableCellComponentFamilyState__{"familyKey":{"column":1,"row":0},"instanceId":"scopeId"}',
|
||||||
|
};
|
||||||
|
const mockIsSoftFocusOnTableCellFamilyStateNewPosition = {
|
||||||
|
key: 'isSoftFocusOnTableCellComponentFamilyState__{"familyKey":{"column":3,"row":2},"instanceId":"scopeId"}',
|
||||||
};
|
};
|
||||||
const mockCurrentTableCellInEditModePositionState = {
|
const mockCurrentTableCellInEditModePositionState = {
|
||||||
key: 'currentTableCellInEditModePositionComponentState__{"scopeId":"scopeId"}',
|
key: 'currentTableCellInEditModePositionComponentState__{"instanceId":"scopeId"}',
|
||||||
};
|
};
|
||||||
const mockIsTableCellInEditModeFamilyState = {
|
const mockIsTableCellInEditModeFamilyState = {
|
||||||
key: 'isTableCellInEditModeFamilyComponentState__{"familyKey":{"column":1,"row":0},"scopeId":"scopeId"}',
|
key: 'isTableCellInEditModeComponentFamilyState__{"familyKey":{"column":1,"row":0},"instanceId":"scopeId"}',
|
||||||
};
|
};
|
||||||
const mockCurrentHotKeyScopeState = {
|
const mockCurrentHotKeyScopeState = {
|
||||||
key: 'currentHotkeyScopeState',
|
key: 'currentHotkeyScopeState',
|
||||||
@@ -61,21 +64,6 @@ jest.mock('recoil', () => ({
|
|||||||
) => (newPosition: TableCellPosition) => void,
|
) => (newPosition: TableCellPosition) => void,
|
||||||
) => callback(mockCallbackInterface),
|
) => callback(mockCallbackInterface),
|
||||||
}));
|
}));
|
||||||
jest.mock(
|
|
||||||
'@/object-record/record-table/hooks/internal/useRecordTableStates',
|
|
||||||
() => ({
|
|
||||||
useRecordTableStates: () => ({
|
|
||||||
softFocusPositionState: mockSoftFocusPositionState,
|
|
||||||
isSoftFocusActiveState: mockSoftFocusActiveState,
|
|
||||||
isSoftFocusOnTableCellFamilyState: () =>
|
|
||||||
mockIsSoftFocusOnTableCellFamilyState,
|
|
||||||
currentTableCellInEditModePositionState:
|
|
||||||
mockCurrentTableCellInEditModePositionState,
|
|
||||||
isTableCellInEditModeFamilyState: () =>
|
|
||||||
mockIsTableCellInEditModeFamilyState,
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
jest.mock('@/object-record/record-table/hooks/useRecordTable', () => ({
|
jest.mock('@/object-record/record-table/hooks/useRecordTable', () => ({
|
||||||
useRecordTable: () => ({
|
useRecordTable: () => ({
|
||||||
setSoftFocusPosition,
|
setSoftFocusPosition,
|
||||||
@@ -88,13 +76,16 @@ jest.mock('@/ui/utilities/hotkey/hooks/useSetHotkeyScope', () => ({
|
|||||||
|
|
||||||
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
<RecordTableScope recordTableScopeId="scopeId" onColumnsChange={jest.fn()}>
|
<RecordTableComponentInstance
|
||||||
|
recordTableId="scopeId"
|
||||||
|
onColumnsChange={jest.fn()}
|
||||||
|
>
|
||||||
<RecordTableRowContext.Provider value={recordTableRow}>
|
<RecordTableRowContext.Provider value={recordTableRow}>
|
||||||
<RecordTableCellContext.Provider value={recordTableCell}>
|
<RecordTableCellContext.Provider value={recordTableCell}>
|
||||||
{children}
|
{children}
|
||||||
</RecordTableCellContext.Provider>
|
</RecordTableCellContext.Provider>
|
||||||
</RecordTableRowContext.Provider>
|
</RecordTableRowContext.Provider>
|
||||||
</RecordTableScope>
|
</RecordTableComponentInstance>
|
||||||
</RecoilRoot>
|
</RecoilRoot>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -114,26 +105,36 @@ describe('useMoveSoftFocusToCurrentCellOnHover', () => {
|
|||||||
result.current.moveSoftFocusToCurrentCellOnHover();
|
result.current.moveSoftFocusToCurrentCellOnHover();
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
expect(mockCallbackInterface.set).toHaveBeenNthCalledWith(
|
||||||
|
1,
|
||||||
mockSoftFocusActiveState,
|
mockSoftFocusActiveState,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
|
||||||
mockIsSoftFocusOnTableCellFamilyState,
|
expect(mockCallbackInterface.set).toHaveBeenNthCalledWith(
|
||||||
|
2,
|
||||||
|
mockIsSoftFocusOnTableCellFamilyStateCurrentPosition,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
|
||||||
|
expect(mockCallbackInterface.set).toHaveBeenNthCalledWith(
|
||||||
|
3,
|
||||||
mockSoftFocusPositionState,
|
mockSoftFocusPositionState,
|
||||||
{ column: 3, row: 2 },
|
{ column: 3, row: 2 },
|
||||||
);
|
);
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
|
||||||
mockIsSoftFocusOnTableCellFamilyState,
|
expect(mockCallbackInterface.set).toHaveBeenNthCalledWith(
|
||||||
|
4,
|
||||||
|
mockIsSoftFocusOnTableCellFamilyStateNewPosition,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
|
||||||
|
expect(mockCallbackInterface.set).toHaveBeenNthCalledWith(
|
||||||
|
5,
|
||||||
mockSoftFocusActiveState,
|
mockSoftFocusActiveState,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(setHotkeyScope).toHaveBeenCalledWith(
|
expect(setHotkeyScope).toHaveBeenCalledWith(
|
||||||
TableHotkeyScope.TableSoftFocus,
|
TableHotkeyScope.TableSoftFocus,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -48,14 +48,14 @@ describe('useSelectedTableCellEditMode', () => {
|
|||||||
|
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
||||||
{
|
{
|
||||||
key: 'isTableCellInEditModeComponentFamilyState__{"familyKey":{"column":0,"row":0},"scopeId":"yourScopeId"}',
|
key: 'isTableCellInEditModeComponentFamilyState__{"familyKey":{"column":0,"row":0},"instanceId":"yourScopeId"}',
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
expect(mockCallbackInterface.set).toHaveBeenCalledWith(
|
||||||
{
|
{
|
||||||
key: 'isTableCellInEditModeComponentFamilyState__{"familyKey":{"column":5,"row":1},"scopeId":"yourScopeId"}',
|
key: 'isTableCellInEditModeComponentFamilyState__{"familyKey":{"column":5,"row":1},"instanceId":"yourScopeId"}',
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -39,15 +39,6 @@ const pendingRecordIdState = createState<string | null>({
|
|||||||
key: 'pendingRecordIdState',
|
key: 'pendingRecordIdState',
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
});
|
});
|
||||||
jest.mock(
|
|
||||||
'@/object-record/record-table/hooks/internal/useRecordTableStates',
|
|
||||||
() => ({
|
|
||||||
__esModule: true,
|
|
||||||
useRecordTableStates: jest.fn(() => ({
|
|
||||||
pendingRecordIdState: pendingRecordIdState,
|
|
||||||
})),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
const createOneRecordMock = jest.fn();
|
const createOneRecordMock = jest.fn();
|
||||||
const updateOneRecordMock = jest.fn();
|
const updateOneRecordMock = jest.fn();
|
||||||
@@ -98,7 +89,11 @@ describe('useUpsertRecord', () => {
|
|||||||
|
|
||||||
it('calls update record if there is no pending record', async () => {
|
it('calls update record if there is no pending record', async () => {
|
||||||
const { result } = renderHook(
|
const { result } = renderHook(
|
||||||
() => useUpsertRecord({ objectNameSingular: 'person' }),
|
() =>
|
||||||
|
useUpsertRecord({
|
||||||
|
objectNameSingular: 'person',
|
||||||
|
recordTableId: 'recordTableId',
|
||||||
|
}),
|
||||||
{
|
{
|
||||||
wrapper: ({ children }) =>
|
wrapper: ({ children }) =>
|
||||||
Wrapper({
|
Wrapper({
|
||||||
@@ -114,7 +109,6 @@ describe('useUpsertRecord', () => {
|
|||||||
updateOneRecordMock,
|
updateOneRecordMock,
|
||||||
'recordId',
|
'recordId',
|
||||||
'name',
|
'name',
|
||||||
'recordTableId',
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -124,7 +118,11 @@ describe('useUpsertRecord', () => {
|
|||||||
|
|
||||||
it('calls update record if pending record is empty', async () => {
|
it('calls update record if pending record is empty', async () => {
|
||||||
const { result } = renderHook(
|
const { result } = renderHook(
|
||||||
() => useUpsertRecord({ objectNameSingular: 'person' }),
|
() =>
|
||||||
|
useUpsertRecord({
|
||||||
|
objectNameSingular: 'person',
|
||||||
|
recordTableId: 'recordTableId',
|
||||||
|
}),
|
||||||
{
|
{
|
||||||
wrapper: ({ children }) =>
|
wrapper: ({ children }) =>
|
||||||
Wrapper({
|
Wrapper({
|
||||||
@@ -140,7 +138,6 @@ describe('useUpsertRecord', () => {
|
|||||||
updateOneRecordMock,
|
updateOneRecordMock,
|
||||||
'recordId',
|
'recordId',
|
||||||
'name',
|
'name',
|
||||||
'recordTableId',
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,26 @@
|
|||||||
import { useResetRecoilState } from 'recoil';
|
|
||||||
|
|
||||||
import { SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID } from '@/object-record/record-table/constants/SoftFocusClickOutsideListenerId';
|
import { SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID } from '@/object-record/record-table/constants/SoftFocusClickOutsideListenerId';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
|
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
||||||
import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
|
import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
|
||||||
|
|
||||||
|
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
import { useResetRecoilState } from 'recoil';
|
||||||
import { useCloseCurrentTableCellInEditMode } from '../../hooks/internal/useCloseCurrentTableCellInEditMode';
|
import { useCloseCurrentTableCellInEditMode } from '../../hooks/internal/useCloseCurrentTableCellInEditMode';
|
||||||
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
||||||
|
|
||||||
export const useCloseRecordTableCell = () => {
|
export const useCloseRecordTableCell = () => {
|
||||||
const setHotkeyScope = useSetHotkeyScope();
|
const setHotkeyScope = useSetHotkeyScope();
|
||||||
const { setDragSelectionStartEnabled } = useDragSelect();
|
const { setDragSelectionStartEnabled } = useDragSelect();
|
||||||
const { pendingRecordIdState } = useRecordTableStates();
|
|
||||||
|
|
||||||
const { toggleClickOutsideListener } = useClickOutsideListener(
|
const { toggleClickOutsideListener } = useClickOutsideListener(
|
||||||
SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID,
|
SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID,
|
||||||
);
|
);
|
||||||
|
|
||||||
const closeCurrentTableCellInEditMode = useCloseCurrentTableCellInEditMode();
|
const closeCurrentTableCellInEditMode = useCloseCurrentTableCellInEditMode();
|
||||||
|
const pendingRecordIdState = useRecoilComponentCallbackStateV2(
|
||||||
|
recordTablePendingRecordIdComponentState,
|
||||||
|
);
|
||||||
const resetRecordTablePendingRecordId =
|
const resetRecordTablePendingRecordId =
|
||||||
useResetRecoilState(pendingRecordIdState);
|
useResetRecoilState(pendingRecordIdState);
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,30 @@
|
|||||||
import { useResetRecoilState } from 'recoil';
|
import { useResetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID } from '@/object-record/record-table/constants/SoftFocusClickOutsideListenerId';
|
import { SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID } from '@/object-record/record-table/constants/SoftFocusClickOutsideListenerId';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
|
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
||||||
import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
|
import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
|
||||||
|
|
||||||
|
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useCloseCurrentTableCellInEditMode } from '../../hooks/internal/useCloseCurrentTableCellInEditMode';
|
import { useCloseCurrentTableCellInEditMode } from '../../hooks/internal/useCloseCurrentTableCellInEditMode';
|
||||||
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
||||||
|
|
||||||
export const useCloseRecordTableCellV2 = (recordTableScopeId: string) => {
|
export const useCloseRecordTableCellV2 = (recordTableId: string) => {
|
||||||
const setHotkeyScope = useSetHotkeyScope();
|
const setHotkeyScope = useSetHotkeyScope();
|
||||||
const { setDragSelectionStartEnabled } = useDragSelect();
|
const { setDragSelectionStartEnabled } = useDragSelect();
|
||||||
const { pendingRecordIdState } = useRecordTableStates(recordTableScopeId);
|
|
||||||
|
|
||||||
const { toggleClickOutsideListener } = useClickOutsideListener(
|
const { toggleClickOutsideListener } = useClickOutsideListener(
|
||||||
SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID,
|
SOFT_FOCUS_CLICK_OUTSIDE_LISTENER_ID,
|
||||||
);
|
);
|
||||||
|
|
||||||
const closeCurrentTableCellInEditMode =
|
const closeCurrentTableCellInEditMode =
|
||||||
useCloseCurrentTableCellInEditMode(recordTableScopeId);
|
useCloseCurrentTableCellInEditMode(recordTableId);
|
||||||
|
|
||||||
|
const pendingRecordIdState = useRecoilComponentCallbackStateV2(
|
||||||
|
recordTablePendingRecordIdComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
const resetRecordTablePendingRecordId =
|
const resetRecordTablePendingRecordId =
|
||||||
useResetRecoilState(pendingRecordIdState);
|
useResetRecoilState(pendingRecordIdState);
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
|
|
||||||
import { useMoveEditModeToTableCellPosition } from '../../hooks/internal/useMoveEditModeToCellPosition';
|
import { useMoveEditModeToTableCellPosition } from '../../hooks/internal/useMoveEditModeToCellPosition';
|
||||||
|
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
|
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
||||||
import { useCurrentTableCellPosition } from './useCurrentCellPosition';
|
import { useCurrentTableCellPosition } from './useCurrentCellPosition';
|
||||||
|
|
||||||
export const useCurrentTableCellEditMode = () => {
|
export const useCurrentTableCellEditMode = () => {
|
||||||
@@ -12,10 +11,9 @@ export const useCurrentTableCellEditMode = () => {
|
|||||||
|
|
||||||
const currentTableCellPosition = useCurrentTableCellPosition();
|
const currentTableCellPosition = useCurrentTableCellPosition();
|
||||||
|
|
||||||
const { isTableCellInEditModeFamilyState } = useRecordTableStates();
|
const isCurrentTableCellInEditMode = useRecoilComponentFamilyValueV2(
|
||||||
|
isTableCellInEditModeComponentFamilyState,
|
||||||
const isCurrentTableCellInEditMode = useRecoilValue(
|
currentTableCellPosition,
|
||||||
isTableCellInEditModeFamilyState(currentTableCellPosition),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const setCurrentTableCellInEditMode = useCallback(() => {
|
const setCurrentTableCellInEditMode = useCallback(() => {
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { isSoftFocusOnTableCellComponentFamilyState } from '@/object-record/record-table/states/isSoftFocusOnTableCellComponentFamilyState';
|
||||||
|
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
|
|
||||||
import { useCurrentTableCellPosition } from './useCurrentCellPosition';
|
import { useCurrentTableCellPosition } from './useCurrentCellPosition';
|
||||||
|
|
||||||
export const useIsSoftFocusOnCurrentTableCell = () => {
|
export const useIsSoftFocusOnCurrentTableCell = () => {
|
||||||
const currentTableCellPosition = useCurrentTableCellPosition();
|
const currentTableCellPosition = useCurrentTableCellPosition();
|
||||||
|
|
||||||
const { isSoftFocusOnTableCellFamilyState } = useRecordTableStates();
|
const isSoftFocusOnTableCell = useRecoilComponentFamilyValueV2(
|
||||||
|
isSoftFocusOnTableCellComponentFamilyState,
|
||||||
const isSoftFocusOnTableCell = useRecoilValue(
|
currentTableCellPosition,
|
||||||
isSoftFocusOnTableCellFamilyState(currentTableCellPosition),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return isSoftFocusOnTableCell;
|
return isSoftFocusOnTableCell;
|
||||||
|
|||||||
@@ -1,20 +1,27 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useSetSoftFocus } from '@/object-record/record-table/record-table-cell/hooks/useSetSoftFocus';
|
import { useSetSoftFocus } from '@/object-record/record-table/record-table-cell/hooks/useSetSoftFocus';
|
||||||
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
||||||
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
|
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
|
||||||
|
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
||||||
|
|
||||||
export const useMoveSoftFocusToCellOnHoverV2 = (recordTableId: string) => {
|
export const useMoveSoftFocusToCellOnHoverV2 = (recordTableId: string) => {
|
||||||
const setSoftFocus = useSetSoftFocus(recordTableId);
|
const setSoftFocus = useSetSoftFocus(recordTableId);
|
||||||
|
|
||||||
const {
|
const currentTableCellInEditModePositionState =
|
||||||
currentTableCellInEditModePositionState,
|
useRecoilComponentCallbackStateV2(
|
||||||
isTableCellInEditModeFamilyState,
|
currentTableCellInEditModePositionComponentState,
|
||||||
} = useRecordTableStates(recordTableId);
|
recordTableId,
|
||||||
|
);
|
||||||
|
const isTableCellInEditModeFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isTableCellInEditModeComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const moveSoftFocusToCell = useRecoilCallback(
|
const moveSoftFocusToCell = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
|
|||||||
@@ -1,20 +1,25 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
|
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
|
||||||
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
||||||
|
|
||||||
|
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
|
||||||
|
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useSetSoftFocusOnCurrentTableCell } from './useSetSoftFocusOnCurrentTableCell';
|
import { useSetSoftFocusOnCurrentTableCell } from './useSetSoftFocusOnCurrentTableCell';
|
||||||
|
|
||||||
export const useMoveSoftFocusToCurrentCellOnHover = () => {
|
export const useMoveSoftFocusToCurrentCellOnHover = () => {
|
||||||
const setSoftFocusOnCurrentTableCell = useSetSoftFocusOnCurrentTableCell();
|
const setSoftFocusOnCurrentTableCell = useSetSoftFocusOnCurrentTableCell();
|
||||||
|
|
||||||
const {
|
const currentTableCellInEditModePositionState =
|
||||||
currentTableCellInEditModePositionState,
|
useRecoilComponentCallbackStateV2(
|
||||||
isTableCellInEditModeFamilyState,
|
currentTableCellInEditModePositionComponentState,
|
||||||
} = useRecordTableStates();
|
);
|
||||||
|
const isTableCellInEditModeFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isTableCellInEditModeComponentFamilyState,
|
||||||
|
);
|
||||||
|
|
||||||
return useRecoilCallback(
|
return useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
|
|||||||
@@ -1,16 +1,20 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useSetSoftFocusPosition } from '@/object-record/record-table/hooks/internal/useSetSoftFocusPosition';
|
import { useSetSoftFocusPosition } from '@/object-record/record-table/hooks/internal/useSetSoftFocusPosition';
|
||||||
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
||||||
|
|
||||||
|
import { isSoftFocusActiveComponentState } from '@/object-record/record-table/states/isSoftFocusActiveComponentState';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
|
||||||
|
|
||||||
export const useSetSoftFocus = (recordTableId?: string) => {
|
export const useSetSoftFocus = (recordTableId?: string) => {
|
||||||
const setSoftFocusPosition = useSetSoftFocusPosition(recordTableId);
|
const setSoftFocusPosition = useSetSoftFocusPosition(recordTableId);
|
||||||
|
|
||||||
const { isSoftFocusActiveState } = useRecordTableStates(recordTableId);
|
const isSoftFocusActiveState = useRecoilComponentCallbackStateV2(
|
||||||
|
isSoftFocusActiveComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const setHotkeyScope = useSetHotkeyScope();
|
const setHotkeyScope = useSetHotkeyScope();
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,9 @@ import { recordIndexActionMenuDropdownPositionComponentState } from '@/action-me
|
|||||||
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 { isBottomBarOpenedComponentState } from '@/ui/layout/bottom-bar/states/isBottomBarOpenedComponentState';
|
import { isBottomBarOpenedComponentState } from '@/ui/layout/bottom-bar/states/isBottomBarOpenedComponentState';
|
||||||
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
||||||
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
|
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { extractComponentFamilyState } from '@/ui/utilities/state/component-state/utils/extractComponentFamilyState';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
||||||
|
|
||||||
export const useTriggerActionMenuDropdown = ({
|
export const useTriggerActionMenuDropdown = ({
|
||||||
@@ -20,13 +19,16 @@ export const useTriggerActionMenuDropdown = ({
|
|||||||
ActionMenuComponentInstanceContext,
|
ActionMenuComponentInstanceContext,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const isRowSelectedFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isRowSelectedComponentFamilyState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const triggerActionMenuDropdown = useRecoilCallback(
|
const triggerActionMenuDropdown = useRecoilCallback(
|
||||||
({ set, snapshot }) =>
|
({ set, snapshot }) =>
|
||||||
(event: React.MouseEvent, recordId: string) => {
|
(event: React.MouseEvent, recordId: string) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
const tableScopeId = getScopeIdFromComponentId(recordTableId);
|
|
||||||
|
|
||||||
set(
|
set(
|
||||||
extractComponentState(
|
extractComponentState(
|
||||||
recordIndexActionMenuDropdownPositionComponentState,
|
recordIndexActionMenuDropdownPositionComponentState,
|
||||||
@@ -38,11 +40,6 @@ export const useTriggerActionMenuDropdown = ({
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const isRowSelectedFamilyState = extractComponentFamilyState(
|
|
||||||
isRowSelectedComponentFamilyState,
|
|
||||||
tableScopeId,
|
|
||||||
);
|
|
||||||
|
|
||||||
const isRowSelected = getSnapshotValue(
|
const isRowSelected = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
isRowSelectedFamilyState(recordId),
|
isRowSelectedFamilyState(recordId),
|
||||||
@@ -66,7 +63,7 @@ export const useTriggerActionMenuDropdown = ({
|
|||||||
set(isActionBarOpenState, false);
|
set(isActionBarOpenState, false);
|
||||||
set(isActionMenuDropdownOpenState, true);
|
set(isActionMenuDropdownOpenState, true);
|
||||||
},
|
},
|
||||||
[actionMenuInstanceId, recordTableId],
|
[actionMenuInstanceId, isRowSelectedFamilyState],
|
||||||
);
|
);
|
||||||
|
|
||||||
return { triggerActionMenuDropdown };
|
return { triggerActionMenuDropdown };
|
||||||
|
|||||||
@@ -7,27 +7,29 @@ import { recordFieldInputDraftValueComponentSelector } from '@/object-record/rec
|
|||||||
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||||
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
|
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { extractComponentSelector } from '@/ui/utilities/state/component-state/utils/extractComponentSelector';
|
import { extractComponentSelector } from '@/ui/utilities/state/component-state/utils/extractComponentSelector';
|
||||||
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
export const useUpsertRecord = ({
|
export const useUpsertRecord = ({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
|
recordTableId,
|
||||||
}: {
|
}: {
|
||||||
objectNameSingular: string;
|
objectNameSingular: string;
|
||||||
|
recordTableId: string;
|
||||||
}) => {
|
}) => {
|
||||||
const { createOneRecord } = useCreateOneRecord({
|
const { createOneRecord } = useCreateOneRecord({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const recordTablePendingRecordIdState = useRecoilComponentCallbackStateV2(
|
||||||
|
recordTablePendingRecordIdComponentState,
|
||||||
|
recordTableId,
|
||||||
|
);
|
||||||
|
|
||||||
const upsertRecord = useRecoilCallback(
|
const upsertRecord = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
(
|
(persistField: () => void, recordId: string, fieldName: string) => {
|
||||||
persistField: () => void,
|
|
||||||
recordId: string,
|
|
||||||
fieldName: string,
|
|
||||||
recordTableId: string,
|
|
||||||
) => {
|
|
||||||
const objectMetadataItems = snapshot
|
const objectMetadataItems = snapshot
|
||||||
.getLoadable(objectMetadataItemsState)
|
.getLoadable(objectMetadataItemsState)
|
||||||
.getValue();
|
.getValue();
|
||||||
@@ -43,13 +45,6 @@ export const useUpsertRecord = ({
|
|||||||
const labelIdentifierFieldMetadataItem =
|
const labelIdentifierFieldMetadataItem =
|
||||||
getLabelIdentifierFieldMetadataItem(foundObjectMetadataItem);
|
getLabelIdentifierFieldMetadataItem(foundObjectMetadataItem);
|
||||||
|
|
||||||
const tableScopeId = getScopeIdFromComponentId(recordTableId);
|
|
||||||
|
|
||||||
const recordTablePendingRecordIdState = extractComponentState(
|
|
||||||
recordTablePendingRecordIdComponentState,
|
|
||||||
tableScopeId,
|
|
||||||
);
|
|
||||||
|
|
||||||
const recordTablePendingRecordId = getSnapshotValue(
|
const recordTablePendingRecordId = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
recordTablePendingRecordIdState,
|
recordTablePendingRecordIdState,
|
||||||
@@ -75,7 +70,7 @@ export const useUpsertRecord = ({
|
|||||||
persistField();
|
persistField();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[createOneRecord, objectNameSingular],
|
[createOneRecord, objectNameSingular, recordTablePendingRecordIdState],
|
||||||
);
|
);
|
||||||
|
|
||||||
return { upsertRecord };
|
return { upsertRecord };
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import { MOBILE_VIEWPORT, useIcons } from 'twenty-ui';
|
|||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
|
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
|
||||||
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
|
|
||||||
|
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { ColumnDefinition } from '../../types/ColumnDefinition';
|
import { ColumnDefinition } from '../../types/ColumnDefinition';
|
||||||
|
|
||||||
type RecordTableColumnHeadProps = {
|
type RecordTableColumnHeadProps = {
|
||||||
@@ -55,7 +55,7 @@ export const RecordTableColumnHead = ({
|
|||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
const Icon = getIcon(column.iconName);
|
const Icon = getIcon(column.iconName);
|
||||||
|
|
||||||
const isRecordTableScrolledLeft = useRecoilComponentValue(
|
const isRecordTableScrolledLeft = useRecoilComponentValueV2(
|
||||||
isRecordTableScrolledLeftComponentState,
|
isRecordTableScrolledLeftComponentState,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
import {
|
import {
|
||||||
IconArrowLeft,
|
IconArrowLeft,
|
||||||
IconArrowRight,
|
IconArrowRight,
|
||||||
@@ -8,12 +7,15 @@ import {
|
|||||||
} from 'twenty-ui';
|
} from 'twenty-ui';
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
||||||
|
|
||||||
|
import { onToggleColumnFilterComponentState } from '@/object-record/record-table/states/onToggleColumnFilterComponentState';
|
||||||
|
import { onToggleColumnSortComponentState } from '@/object-record/record-table/states/onToggleColumnSortComponentState';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useTableColumns } from '../../hooks/useTableColumns';
|
import { useTableColumns } from '../../hooks/useTableColumns';
|
||||||
import { ColumnDefinition } from '../../types/ColumnDefinition';
|
import { ColumnDefinition } from '../../types/ColumnDefinition';
|
||||||
|
|
||||||
@@ -24,13 +26,9 @@ export type RecordTableColumnHeadDropdownMenuProps = {
|
|||||||
export const RecordTableColumnHeadDropdownMenu = ({
|
export const RecordTableColumnHeadDropdownMenu = ({
|
||||||
column,
|
column,
|
||||||
}: RecordTableColumnHeadDropdownMenuProps) => {
|
}: RecordTableColumnHeadDropdownMenuProps) => {
|
||||||
const {
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
visibleTableColumnsSelector,
|
visibleTableColumnsComponentSelector,
|
||||||
onToggleColumnFilterState,
|
);
|
||||||
onToggleColumnSortState,
|
|
||||||
} = useRecordTableStates();
|
|
||||||
|
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
|
||||||
|
|
||||||
const secondVisibleColumn = visibleTableColumns[1];
|
const secondVisibleColumn = visibleTableColumns[1];
|
||||||
const canMove = column.isLabelIdentifier !== true;
|
const canMove = column.isLabelIdentifier !== true;
|
||||||
@@ -67,8 +65,12 @@ export const RecordTableColumnHeadDropdownMenu = ({
|
|||||||
handleColumnVisibilityChange(column);
|
handleColumnVisibilityChange(column);
|
||||||
};
|
};
|
||||||
|
|
||||||
const onToggleColumnFilter = useRecoilValue(onToggleColumnFilterState);
|
const onToggleColumnFilter = useRecoilComponentValueV2(
|
||||||
const onToggleColumnSort = useRecoilValue(onToggleColumnSortState);
|
onToggleColumnFilterComponentState,
|
||||||
|
);
|
||||||
|
const onToggleColumnSort = useRecoilComponentValueV2(
|
||||||
|
onToggleColumnSortComponentState,
|
||||||
|
);
|
||||||
|
|
||||||
const handleSortClick = () => {
|
const handleSortClick = () => {
|
||||||
closeDropdown();
|
closeDropdown();
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
import { MOBILE_VIEWPORT } from 'twenty-ui';
|
import { MOBILE_VIEWPORT } from 'twenty-ui';
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableHeaderCell } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderCell';
|
import { RecordTableHeaderCell } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderCell';
|
||||||
import { RecordTableHeaderCheckboxColumn } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderCheckboxColumn';
|
import { RecordTableHeaderCheckboxColumn } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderCheckboxColumn';
|
||||||
import { RecordTableHeaderDragDropColumn } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderDragDropColumn';
|
import { RecordTableHeaderDragDropColumn } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderDragDropColumn';
|
||||||
import { RecordTableHeaderLastColumn } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderLastColumn';
|
import { RecordTableHeaderLastColumn } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderLastColumn';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
const StyledTableHead = styled.thead`
|
const StyledTableHead = styled.thead`
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -75,9 +75,9 @@ export const RecordTableHeader = ({
|
|||||||
}: {
|
}: {
|
||||||
objectMetadataNameSingular: string;
|
objectMetadataNameSingular: string;
|
||||||
}) => {
|
}) => {
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates();
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledTableHead id="record-table-header" data-select-disable>
|
<StyledTableHead id="record-table-header" data-select-disable>
|
||||||
|
|||||||
@@ -1,21 +1,24 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
import { useRecoilCallback, useRecoilState, useRecoilValue } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
import { IconPlus, LightIconButton } from 'twenty-ui';
|
import { IconPlus, LightIconButton } from 'twenty-ui';
|
||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { isObjectMetadataReadOnly } from '@/object-metadata/utils/isObjectMetadataReadOnly';
|
import { isObjectMetadataReadOnly } from '@/object-metadata/utils/isObjectMetadataReadOnly';
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useCreateNewTableRecord } from '@/object-record/record-table/hooks/useCreateNewTableRecords';
|
import { useCreateNewTableRecord } from '@/object-record/record-table/hooks/useCreateNewTableRecords';
|
||||||
import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns';
|
import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns';
|
||||||
import { RecordTableColumnHeadWithDropdown } from '@/object-record/record-table/record-table-header/components/RecordTableColumnHeadWithDropdown';
|
import { RecordTableColumnHeadWithDropdown } from '@/object-record/record-table/record-table-header/components/RecordTableColumnHeadWithDropdown';
|
||||||
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
|
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
|
||||||
|
import { resizeFieldOffsetComponentState } from '@/object-record/record-table/states/resizeFieldOffsetComponentState';
|
||||||
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { useTrackPointer } from '@/ui/utilities/pointer-event/hooks/useTrackPointer';
|
import { useTrackPointer } from '@/ui/utilities/pointer-event/hooks/useTrackPointer';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
|
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
|
||||||
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
|
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
|
||||||
|
|
||||||
const COLUMN_MIN_WIDTH = 104;
|
const COLUMN_MIN_WIDTH = 104;
|
||||||
@@ -96,17 +99,19 @@ export const RecordTableHeaderCell = ({
|
|||||||
column: ColumnDefinition<FieldMetadata>;
|
column: ColumnDefinition<FieldMetadata>;
|
||||||
objectMetadataNameSingular: string;
|
objectMetadataNameSingular: string;
|
||||||
}) => {
|
}) => {
|
||||||
const { resizeFieldOffsetState, tableColumnsState } = useRecordTableStates();
|
|
||||||
|
|
||||||
const { objectMetadataItem } = useObjectMetadataItem({
|
const { objectMetadataItem } = useObjectMetadataItem({
|
||||||
objectNameSingular: objectMetadataNameSingular,
|
objectNameSingular: objectMetadataNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
const [resizeFieldOffset, setResizeFieldOffset] = useRecoilState(
|
const resizeFieldOffsetState = useRecoilComponentCallbackStateV2(
|
||||||
resizeFieldOffsetState,
|
resizeFieldOffsetComponentState,
|
||||||
);
|
);
|
||||||
|
|
||||||
const tableColumns = useRecoilValue(tableColumnsState);
|
const [resizeFieldOffset, setResizeFieldOffset] = useRecoilComponentStateV2(
|
||||||
|
resizeFieldOffsetComponentState,
|
||||||
|
);
|
||||||
|
|
||||||
|
const tableColumns = useRecoilComponentValueV2(tableColumnsComponentState);
|
||||||
const tableColumnsByKey = useMemo(
|
const tableColumnsByKey = useMemo(
|
||||||
() =>
|
() =>
|
||||||
mapArrayToObject(tableColumns, ({ fieldMetadataId }) => fieldMetadataId),
|
mapArrayToObject(tableColumns, ({ fieldMetadataId }) => fieldMetadataId),
|
||||||
@@ -181,7 +186,7 @@ export const RecordTableHeaderCell = ({
|
|||||||
onMouseUp: handleResizeHandlerEnd,
|
onMouseUp: handleResizeHandlerEnd,
|
||||||
});
|
});
|
||||||
|
|
||||||
const isRecordTableScrolledLeft = useRecoilComponentValue(
|
const isRecordTableScrolledLeft = useRecoilComponentValueV2(
|
||||||
isRecordTableScrolledLeftComponentState,
|
isRecordTableScrolledLeftComponentState,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
|
import { allRowsSelectedStatusComponentSelector } from '@/object-record/record-table/states/selectors/allRowsSelectedStatusComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { Checkbox } from 'twenty-ui';
|
import { Checkbox } from 'twenty-ui';
|
||||||
|
|
||||||
const StyledContainer = styled.div`
|
const StyledContainer = styled.div`
|
||||||
@@ -23,9 +23,9 @@ const StyledColumnHeaderCell = styled.th`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
export const RecordTableHeaderCheckboxColumn = () => {
|
export const RecordTableHeaderCheckboxColumn = () => {
|
||||||
const { allRowsSelectedStatusSelector } = useRecordTableStates();
|
const allRowsSelectedStatus = useRecoilComponentValueV2(
|
||||||
|
allRowsSelectedStatusComponentSelector,
|
||||||
const allRowsSelectedStatus = useRecoilValue(allRowsSelectedStatusSelector());
|
);
|
||||||
const { selectAllRows, resetTableRowSelection, setHasUserSelectedAllRows } =
|
const { selectAllRows, resetTableRowSelection, setHasUserSelectedAllRows } =
|
||||||
useRecordTable();
|
useRecordTable();
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
import { Theme } from '@emotion/react';
|
import { Theme } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
import { IconPlus, ThemeContext } from 'twenty-ui';
|
import { IconPlus, ThemeContext } from 'twenty-ui';
|
||||||
|
|
||||||
import { HIDDEN_TABLE_COLUMN_DROPDOWN_ID } from '@/object-record/record-table/constants/HiddenTableColumnDropdownId';
|
import { HIDDEN_TABLE_COLUMN_DROPDOWN_ID } from '@/object-record/record-table/constants/HiddenTableColumnDropdownId';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableHeaderPlusButtonContent } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderPlusButtonContent';
|
import { RecordTableHeaderPlusButtonContent } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderPlusButtonContent';
|
||||||
|
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { useScrollWrapperScopedRef } from '@/ui/utilities/scroll/hooks/useScrollWrapperScopedRef';
|
import { useScrollWrapperScopedRef } from '@/ui/utilities/scroll/hooks/useScrollWrapperScopedRef';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
const StyledPlusIconHeaderCell = styled.th<{
|
const StyledPlusIconHeaderCell = styled.th<{
|
||||||
theme: Theme;
|
theme: Theme;
|
||||||
@@ -58,9 +58,9 @@ export const RecordTableHeaderLastColumn = () => {
|
|||||||
(scrollWrapper.ref.current?.clientWidth ?? 0) <
|
(scrollWrapper.ref.current?.clientWidth ?? 0) <
|
||||||
(scrollWrapper.ref.current?.scrollWidth ?? 0);
|
(scrollWrapper.ref.current?.scrollWidth ?? 0);
|
||||||
|
|
||||||
const { hiddenTableColumnsSelector } = useRecordTableStates();
|
const hiddenTableColumns = useRecoilComponentValueV2(
|
||||||
|
hiddenTableColumnsComponentSelector,
|
||||||
const hiddenTableColumns = useRecoilValue(hiddenTableColumnsSelector());
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledPlusIconHeaderCell
|
<StyledPlusIconHeaderCell
|
||||||
|
|||||||
@@ -1,27 +1,28 @@
|
|||||||
import { useCallback, useContext } from 'react';
|
import { useCallback, useContext } from 'react';
|
||||||
import { useLocation } from 'react-router-dom';
|
import { useLocation } from 'react-router-dom';
|
||||||
import { useRecoilValue, useSetRecoilState } from 'recoil';
|
import { useSetRecoilState } from 'recoil';
|
||||||
import { IconSettings, UndecoratedLink, useIcons } from 'twenty-ui';
|
import { IconSettings, UndecoratedLink, useIcons } from 'twenty-ui';
|
||||||
|
|
||||||
import { getObjectSlug } from '@/object-metadata/utils/getObjectSlug';
|
import { getObjectSlug } from '@/object-metadata/utils/getObjectSlug';
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { RecordTableContext } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns';
|
import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns';
|
||||||
|
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
||||||
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
|
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableHeaderPlusButtonContent = () => {
|
export const RecordTableHeaderPlusButtonContent = () => {
|
||||||
const { objectMetadataItem } = useContext(RecordTableContext);
|
const { objectMetadataItem } = useContext(RecordTableContext);
|
||||||
const { closeDropdown } = useDropdown();
|
const { closeDropdown } = useDropdown();
|
||||||
|
|
||||||
const { hiddenTableColumnsSelector } = useRecordTableStates();
|
const hiddenTableColumns = useRecoilComponentValueV2(
|
||||||
|
hiddenTableColumnsComponentSelector,
|
||||||
const hiddenTableColumns = useRecoilValue(hiddenTableColumnsSelector());
|
);
|
||||||
|
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
const { handleColumnVisibilityChange } = useTableColumns();
|
const { handleColumnVisibilityChange } = useTableColumns();
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { RecordTableTd } from '@/object-record/record-table/record-table-cell/components/RecordTableTd';
|
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { RecordTableTd } from '@/object-record/record-table/record-table-cell/components/RecordTableTd';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableCellsEmpty = () => {
|
export const RecordTableCellsEmpty = () => {
|
||||||
const { isSelected } = useContext(RecordTableRowContext);
|
const { isSelected } = useContext(RecordTableRowContext);
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates();
|
|
||||||
|
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
);
|
||||||
|
|
||||||
return visibleTableColumns.map((column) => (
|
return visibleTableColumns.map((column) => (
|
||||||
<RecordTableTd isSelected={isSelected} key={column.fieldMetadataId} />
|
<RecordTableTd isSelected={isSelected} key={column.fieldMetadataId} />
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableCell } from '@/object-record/record-table/record-table-cell/components/RecordTableCell';
|
import { RecordTableCell } from '@/object-record/record-table/record-table-cell/components/RecordTableCell';
|
||||||
import { RecordTableCellWrapper } from '@/object-record/record-table/record-table-cell/components/RecordTableCellWrapper';
|
import { RecordTableCellWrapper } from '@/object-record/record-table/record-table-cell/components/RecordTableCellWrapper';
|
||||||
import { RecordTableTd } from '@/object-record/record-table/record-table-cell/components/RecordTableTd';
|
import { RecordTableTd } from '@/object-record/record-table/record-table-cell/components/RecordTableTd';
|
||||||
|
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTableCellsVisible = () => {
|
export const RecordTableCellsVisible = () => {
|
||||||
const { isDragging, isSelected } = useContext(RecordTableRowContext);
|
const { isDragging, isSelected } = useContext(RecordTableRowContext);
|
||||||
const { visibleTableColumnsSelector } = useRecordTableStates();
|
|
||||||
|
|
||||||
const visibleTableColumns = useRecoilValue(visibleTableColumnsSelector());
|
const visibleTableColumns = useRecoilComponentValueV2(
|
||||||
|
visibleTableColumnsComponentSelector,
|
||||||
|
);
|
||||||
|
|
||||||
const tableColumnsAfterFirst = visibleTableColumns.slice(1);
|
const tableColumnsAfterFirst = visibleTableColumns.slice(1);
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableRow } from '@/object-record/record-table/record-table-row/components/RecordTableRow';
|
import { RecordTableRow } from '@/object-record/record-table/record-table-row/components/RecordTableRow';
|
||||||
|
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
|
||||||
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
export const RecordTablePendingRow = () => {
|
export const RecordTablePendingRow = () => {
|
||||||
const { pendingRecordIdState } = useRecordTableStates();
|
const pendingRecordId = useRecoilComponentValueV2(
|
||||||
const pendingRecordId = useRecoilValue(pendingRecordIdState);
|
recordTablePendingRecordIdComponentState,
|
||||||
|
);
|
||||||
|
|
||||||
if (!pendingRecordId) return <></>;
|
if (!pendingRecordId) return <></>;
|
||||||
|
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ import { useTheme } from '@emotion/react';
|
|||||||
import { Draggable } from '@hello-pangea/dnd';
|
import { Draggable } from '@hello-pangea/dnd';
|
||||||
import { ReactNode, useContext, useEffect } from 'react';
|
import { ReactNode, useContext, useEffect } from 'react';
|
||||||
import { useInView } from 'react-intersection-observer';
|
import { useInView } from 'react-intersection-observer';
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
|
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
|
||||||
import { RecordIndexRootPropsContext } from '@/object-record/record-index/contexts/RecordIndexRootPropsContext';
|
import { RecordIndexRootPropsContext } from '@/object-record/record-index/contexts/RecordIndexRootPropsContext';
|
||||||
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';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
|
||||||
import { RecordTableTr } from '@/object-record/record-table/record-table-row/components/RecordTableTr';
|
import { RecordTableTr } from '@/object-record/record-table/record-table-row/components/RecordTableTr';
|
||||||
|
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
|
||||||
import { RecordTableWithWrappersScrollWrapperContext } from '@/ui/utilities/scroll/contexts/ScrollWrapperContexts';
|
import { RecordTableWithWrappersScrollWrapperContext } from '@/ui/utilities/scroll/contexts/ScrollWrapperContexts';
|
||||||
|
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
||||||
|
|
||||||
export const RecordTableRowWrapper = ({
|
export const RecordTableRowWrapper = ({
|
||||||
recordId,
|
recordId,
|
||||||
@@ -28,8 +28,10 @@ export const RecordTableRowWrapper = ({
|
|||||||
|
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
|
|
||||||
const { isRowSelectedFamilyState } = useRecordTableStates();
|
const currentRowSelected = useRecoilComponentFamilyValueV2(
|
||||||
const currentRowSelected = useRecoilValue(isRowSelectedFamilyState(recordId));
|
isRowSelectedComponentFamilyState,
|
||||||
|
recordId,
|
||||||
|
);
|
||||||
|
|
||||||
const scrollWrapperRef = useContext(
|
const scrollWrapperRef = useContext(
|
||||||
RecordTableWithWrappersScrollWrapperContext,
|
RecordTableWithWrappersScrollWrapperContext,
|
||||||
|
|||||||
@@ -2,13 +2,16 @@ import { useContext } from 'react';
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
import { RecordTableRowContext } from '@/object-record/record-table/contexts/RecordTableRowContext';
|
||||||
import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates';
|
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
export const useSetCurrentRowSelected = () => {
|
export const useSetCurrentRowSelected = () => {
|
||||||
const { recordId } = useContext(RecordTableRowContext);
|
const { recordId } = useContext(RecordTableRowContext);
|
||||||
|
|
||||||
const { isRowSelectedFamilyState } = useRecordTableStates();
|
const isRowSelectedFamilyState = useRecoilComponentCallbackStateV2(
|
||||||
|
isRowSelectedComponentFamilyState,
|
||||||
|
);
|
||||||
|
|
||||||
const setCurrentRowSelected = useRecoilCallback(
|
const setCurrentRowSelected = useRecoilCallback(
|
||||||
({ set, snapshot }) =>
|
({ set, snapshot }) =>
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const hasUserSelectedAllRowsComponentState =
|
export const hasUserSelectedAllRowsComponentState =
|
||||||
createComponentState<boolean>({
|
createComponentStateV2<boolean>({
|
||||||
key: 'hasUserSelectedAllRowsFamilyState',
|
key: 'hasUserSelectedAllRowsFamilyState',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { createComponentFamilyState } from '@/ui/utilities/state/component-state/utils/createComponentFamilyState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2';
|
||||||
|
|
||||||
export const isRowSelectedComponentFamilyState = createComponentFamilyState<
|
export const isRowSelectedComponentFamilyState = createComponentFamilyStateV2<
|
||||||
boolean,
|
boolean,
|
||||||
string
|
string
|
||||||
>({
|
>({
|
||||||
key: 'isRowSelectedComponentFamilyState',
|
key: 'isRowSelectedComponentFamilyState',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
|
||||||
|
|
||||||
import { RecordTableScopeInternalContext } from './scope-internal-context/RecordTableScopeInternalContext';
|
|
||||||
import { RecordTableScopeInitEffect } from './RecordTableScopeInitEffect';
|
|
||||||
|
|
||||||
type RecordTableScopeProps = {
|
|
||||||
children: ReactNode;
|
|
||||||
recordTableScopeId: string;
|
|
||||||
onColumnsChange: (columns: ColumnDefinition<FieldMetadata>[]) => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const RecordTableScope = ({
|
|
||||||
children,
|
|
||||||
recordTableScopeId,
|
|
||||||
onColumnsChange,
|
|
||||||
}: RecordTableScopeProps) => {
|
|
||||||
return (
|
|
||||||
<RecordTableScopeInternalContext.Provider
|
|
||||||
value={{
|
|
||||||
scopeId: recordTableScopeId,
|
|
||||||
onColumnsChange,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<RecordTableScopeInitEffect onColumnsChange={onColumnsChange} />
|
|
||||||
{children}
|
|
||||||
</RecordTableScopeInternalContext.Provider>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
|
||||||
import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext';
|
|
||||||
import { RecoilComponentStateKey } from '@/ui/utilities/state/component-state/types/RecoilComponentStateKey';
|
|
||||||
|
|
||||||
import { ColumnDefinition } from '../../types/ColumnDefinition';
|
|
||||||
|
|
||||||
// TODO: separate scope contexts from event contexts
|
|
||||||
type RecordTableScopeInternalContextProps = RecoilComponentStateKey & {
|
|
||||||
onColumnsChange: (columns: ColumnDefinition<FieldMetadata>[]) => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const RecordTableScopeInternalContext =
|
|
||||||
createScopeInternalContext<RecordTableScopeInternalContextProps>();
|
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
|
||||||
|
|
||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
import { ColumnDefinition } from '../types/ColumnDefinition';
|
import { ColumnDefinition } from '../types/ColumnDefinition';
|
||||||
|
|
||||||
export const availableTableColumnsComponentState = createComponentState<
|
export const availableTableColumnsComponentState = createComponentStateV2<
|
||||||
ColumnDefinition<FieldMetadata>[]
|
ColumnDefinition<FieldMetadata>[]
|
||||||
>({
|
>({
|
||||||
key: 'availableTableColumnsComponentState',
|
key: 'availableTableColumnsComponentState',
|
||||||
defaultValue: [],
|
defaultValue: [],
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
|
import { ComponentStateKeyV2 } from '@/ui/utilities/state/component-state/types/ComponentStateKeyV2';
|
||||||
|
import { createComponentInstanceContext } from '@/ui/utilities/state/component-state/utils/createComponentInstanceContext';
|
||||||
|
import { ColumnDefinition } from '../../types/ColumnDefinition';
|
||||||
|
|
||||||
|
// TODO: separate scope contexts from event contexts
|
||||||
|
type RecordTableComponentInstanceContextProps = ComponentStateKeyV2 & {
|
||||||
|
onColumnsChange: (columns: ColumnDefinition<FieldMetadata>[]) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const RecordTableComponentInstanceContext =
|
||||||
|
createComponentInstanceContext<RecordTableComponentInstanceContextProps>();
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
import { TableCellPosition } from '../types/TableCellPosition';
|
import { TableCellPosition } from '../types/TableCellPosition';
|
||||||
|
|
||||||
export const currentTableCellInEditModePositionComponentState =
|
export const currentTableCellInEditModePositionComponentState =
|
||||||
createComponentState<TableCellPosition>({
|
createComponentStateV2<TableCellPosition>({
|
||||||
key: 'currentTableCellInEditModePositionComponentState',
|
key: 'currentTableCellInEditModePositionComponentState',
|
||||||
defaultValue: {
|
defaultValue: {
|
||||||
row: 0,
|
row: 0,
|
||||||
column: 1,
|
column: 1,
|
||||||
},
|
},
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { createComponentStateV2_alpha } from '@/ui/utilities/state/component-state/utils/createComponentStateV2Alpha';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const hasRecordTableFetchedAllRecordsComponentStateV2 =
|
export const hasRecordTableFetchedAllRecordsComponentStateV2 =
|
||||||
createComponentStateV2_alpha<boolean>({
|
createComponentStateV2<boolean>({
|
||||||
key: 'hasRecordTableFetchedAllRecordsComponentStateV2',
|
key: 'hasRecordTableFetchedAllRecordsComponentStateV2',
|
||||||
componentContext: RecordTableScopeInternalContext,
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const isRecordTableInitialLoadingComponentState =
|
export const isRecordTableInitialLoadingComponentState =
|
||||||
createComponentState<boolean>({
|
createComponentStateV2<boolean>({
|
||||||
key: 'isRecordTableInitialLoadingComponentState',
|
key: 'isRecordTableInitialLoadingComponentState',
|
||||||
defaultValue: true,
|
defaultValue: true,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { RecordTableScopeInternalContext } from '@/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { createComponentStateV2_alpha } from '@/ui/utilities/state/component-state/utils/createComponentStateV2Alpha';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const isRecordTableScrolledLeftComponentState =
|
export const isRecordTableScrolledLeftComponentState =
|
||||||
createComponentStateV2_alpha<boolean>({
|
createComponentStateV2<boolean>({
|
||||||
key: 'isRecordTableScrolledLeftComponentState',
|
key: 'isRecordTableScrolledLeftComponentState',
|
||||||
componentContext: RecordTableScopeInternalContext,
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
defaultValue: true,
|
defaultValue: true,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const isSoftDeleteFilterActiveComponentState =
|
export const isSoftDeleteFilterActiveComponentState =
|
||||||
createComponentState<boolean>({
|
createComponentStateV2<boolean>({
|
||||||
key: 'isSoftDeleteFilterActiveComponentState',
|
key: 'isSoftDeleteFilterActiveComponentState',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const isSoftFocusActiveComponentState = createComponentState<boolean>({
|
export const isSoftFocusActiveComponentState = createComponentStateV2<boolean>({
|
||||||
key: 'isSoftFocusActiveComponentState',
|
key: 'isSoftFocusActiveComponentState',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { createComponentFamilyState } from '@/ui/utilities/state/component-state/utils/createComponentFamilyState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2';
|
||||||
import { TableCellPosition } from '../types/TableCellPosition';
|
import { TableCellPosition } from '../types/TableCellPosition';
|
||||||
|
|
||||||
export const isSoftFocusOnTableCellComponentFamilyState =
|
export const isSoftFocusOnTableCellComponentFamilyState =
|
||||||
createComponentFamilyState<boolean, TableCellPosition>({
|
createComponentFamilyStateV2<boolean, TableCellPosition>({
|
||||||
key: 'isSoftFocusOnTableCellComponentFamilyState',
|
key: 'isSoftFocusOnTableCellComponentFamilyState',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { createComponentFamilyState } from '@/ui/utilities/state/component-state/utils/createComponentFamilyState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2';
|
||||||
import { TableCellPosition } from '../types/TableCellPosition';
|
import { TableCellPosition } from '../types/TableCellPosition';
|
||||||
|
|
||||||
export const isTableCellInEditModeComponentFamilyState =
|
export const isTableCellInEditModeComponentFamilyState =
|
||||||
createComponentFamilyState<boolean, TableCellPosition>({
|
createComponentFamilyStateV2<boolean, TableCellPosition>({
|
||||||
key: 'isTableCellInEditModeComponentFamilyState',
|
key: 'isTableCellInEditModeComponentFamilyState',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const numberOfTableRowsComponentState = createComponentState<number>({
|
export const numberOfTableRowsComponentState = createComponentStateV2<number>({
|
||||||
key: 'numberOfTableRowsComponentState',
|
key: 'numberOfTableRowsComponentState',
|
||||||
defaultValue: 0,
|
defaultValue: 0,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const onColumnsChangeComponentState = createComponentState<
|
export const onColumnsChangeComponentState = createComponentStateV2<
|
||||||
((columns: ColumnDefinition<FieldMetadata>[]) => void) | undefined
|
((columns: ColumnDefinition<FieldMetadata>[]) => void) | undefined
|
||||||
>({
|
>({
|
||||||
key: 'onColumnsChangeComponentState',
|
key: 'onColumnsChangeComponentState',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const onEntityCountChangeComponentState = createComponentState<
|
export const onEntityCountChangeComponentState = createComponentStateV2<
|
||||||
((entityCount?: number) => void) | undefined
|
((entityCount?: number) => void) | undefined
|
||||||
>({
|
>({
|
||||||
key: 'onEntityCountChangeComponentState',
|
key: 'onEntityCountChangeComponentState',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const onToggleColumnFilterComponentState = createComponentState<
|
export const onToggleColumnFilterComponentState = createComponentStateV2<
|
||||||
((fieldMetadataId: string) => void) | undefined
|
((fieldMetadataId: string) => void) | undefined
|
||||||
>({
|
>({
|
||||||
key: 'onToggleColumnFilterComponentState',
|
key: 'onToggleColumnFilterComponentState',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const onToggleColumnSortComponentState = createComponentState<
|
export const onToggleColumnSortComponentState = createComponentStateV2<
|
||||||
((fieldMetadataId: string) => void) | undefined
|
((fieldMetadataId: string) => void) | undefined
|
||||||
>({
|
>({
|
||||||
key: 'onToggleColumnSortComponentState',
|
key: 'onToggleColumnSortComponentState',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const recordTablePendingRecordIdComponentState = createComponentState<
|
export const recordTablePendingRecordIdComponentState = createComponentStateV2<
|
||||||
string | null
|
string | null
|
||||||
>({
|
>({
|
||||||
key: 'recordTablePendingRecordIdState',
|
key: 'recordTablePendingRecordIdState',
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState';
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const resizeFieldOffsetComponentState = createComponentState<number>({
|
export const resizeFieldOffsetComponentState = createComponentStateV2<number>({
|
||||||
key: 'resizeFieldOffsetComponentState',
|
key: 'resizeFieldOffsetComponentState',
|
||||||
defaultValue: 0,
|
defaultValue: 0,
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,19 +1,23 @@
|
|||||||
import { selectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/selectedRowIdsComponentSelector';
|
import { selectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/selectedRowIdsComponentSelector';
|
||||||
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
import { createComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/createComponentReadOnlySelector';
|
|
||||||
|
|
||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
import { AllRowsSelectedStatus } from '../../types/AllRowSelectedStatus';
|
import { AllRowsSelectedStatus } from '../../types/AllRowSelectedStatus';
|
||||||
|
|
||||||
export const allRowsSelectedStatusComponentSelector =
|
export const allRowsSelectedStatusComponentSelector =
|
||||||
createComponentReadOnlySelector<AllRowsSelectedStatus>({
|
createComponentSelectorV2<AllRowsSelectedStatus>({
|
||||||
key: 'allRowsSelectedStatusComponentSelector',
|
key: 'allRowsSelectedStatusComponentSelector',
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ instanceId }) =>
|
||||||
({ get }) => {
|
({ get }) => {
|
||||||
const tableRowIds = get(tableRowIdsComponentState({ scopeId }));
|
const tableRowIds = get(
|
||||||
|
tableRowIdsComponentState.atomFamily({ instanceId }),
|
||||||
|
);
|
||||||
|
|
||||||
const selectedRowIds = get(
|
const selectedRowIds = get(
|
||||||
selectedRowIdsComponentSelector({ scopeId }),
|
selectedRowIdsComponentSelector.selectorFamily({ instanceId }),
|
||||||
);
|
);
|
||||||
|
|
||||||
const numberOfSelectedRows = selectedRowIds.length;
|
const numberOfSelectedRows = selectedRowIds.length;
|
||||||
|
|||||||
@@ -1,38 +1,41 @@
|
|||||||
import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState';
|
import { availableTableColumnsComponentState } from '@/object-record/record-table/states/availableTableColumnsComponentState';
|
||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
import { createComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/createComponentReadOnlySelector';
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
|
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
|
||||||
|
|
||||||
export const hiddenTableColumnsComponentSelector =
|
export const hiddenTableColumnsComponentSelector = createComponentSelectorV2({
|
||||||
createComponentReadOnlySelector({
|
key: 'hiddenTableColumnsComponentSelector',
|
||||||
key: 'hiddenTableColumnsComponentSelector',
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ instanceId }) =>
|
||||||
({ get }) => {
|
({ get }) => {
|
||||||
const tableColumns = get(tableColumnsComponentState({ scopeId }));
|
const tableColumns = get(
|
||||||
const availableColumns = get(
|
tableColumnsComponentState.atomFamily({ instanceId }),
|
||||||
availableTableColumnsComponentState({ scopeId }),
|
);
|
||||||
);
|
const availableColumns = get(
|
||||||
const tableColumnsByKey = mapArrayToObject(
|
availableTableColumnsComponentState.atomFamily({ instanceId }),
|
||||||
tableColumns,
|
);
|
||||||
({ fieldMetadataId }) => fieldMetadataId,
|
const tableColumnsByKey = mapArrayToObject(
|
||||||
);
|
tableColumns,
|
||||||
|
({ fieldMetadataId }) => fieldMetadataId,
|
||||||
|
);
|
||||||
|
|
||||||
const hiddenColumns = availableColumns
|
const hiddenColumns = availableColumns
|
||||||
.filter(
|
.filter(
|
||||||
({ fieldMetadataId }) =>
|
({ fieldMetadataId }) =>
|
||||||
!tableColumnsByKey[fieldMetadataId]?.isVisible,
|
!tableColumnsByKey[fieldMetadataId]?.isVisible,
|
||||||
)
|
)
|
||||||
.map((availableColumn) => {
|
.map((availableColumn) => {
|
||||||
const { fieldMetadataId } = availableColumn;
|
const { fieldMetadataId } = availableColumn;
|
||||||
const existingTableColumn = tableColumnsByKey[fieldMetadataId];
|
const existingTableColumn = tableColumnsByKey[fieldMetadataId];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...(existingTableColumn || availableColumn),
|
...(existingTableColumn || availableColumn),
|
||||||
isVisible: false,
|
isVisible: false,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
return hiddenColumns;
|
return hiddenColumns;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
import { createComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/createComponentReadOnlySelector';
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
|
|
||||||
export const numberOfTableColumnsComponentSelector =
|
export const numberOfTableColumnsComponentSelector = createComponentSelectorV2({
|
||||||
createComponentReadOnlySelector({
|
key: 'numberOfTableColumnsComponentSelector',
|
||||||
key: 'numberOfTableColumnsComponentSelector',
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ instanceId }) =>
|
||||||
({ get }) =>
|
({ get }) =>
|
||||||
get(tableColumnsComponentState({ scopeId })).length,
|
get(tableColumnsComponentState.atomFamily({ instanceId })).length,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,21 +1,23 @@
|
|||||||
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 { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
import { createComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/createComponentReadOnlySelector';
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
|
|
||||||
export const selectedRowIdsComponentSelector = createComponentReadOnlySelector<
|
export const selectedRowIdsComponentSelector = createComponentSelectorV2<
|
||||||
string[]
|
string[]
|
||||||
>({
|
>({
|
||||||
key: 'selectedRowIdsComponentSelector',
|
key: 'selectedRowIdsComponentSelector',
|
||||||
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ instanceId }) =>
|
||||||
({ get }) => {
|
({ get }) => {
|
||||||
const rowIds = get(tableRowIdsComponentState({ scopeId }));
|
const rowIds = get(tableRowIdsComponentState.atomFamily({ instanceId }));
|
||||||
|
|
||||||
return rowIds.filter(
|
return rowIds.filter(
|
||||||
(rowId) =>
|
(rowId) =>
|
||||||
get(
|
get(
|
||||||
isRowSelectedComponentFamilyState({
|
isRowSelectedComponentFamilyState.atomFamily({
|
||||||
scopeId,
|
instanceId,
|
||||||
familyKey: rowId,
|
familyKey: rowId,
|
||||||
}),
|
}),
|
||||||
) === true,
|
) === true,
|
||||||
|
|||||||
@@ -1,23 +1,26 @@
|
|||||||
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 { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
import { tableRowIdsComponentState } from '@/object-record/record-table/states/tableRowIdsComponentState';
|
||||||
import { createComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/createComponentReadOnlySelector';
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
|
|
||||||
export const unselectedRowIdsComponentSelector =
|
export const unselectedRowIdsComponentSelector = createComponentSelectorV2<
|
||||||
createComponentReadOnlySelector<string[]>({
|
string[]
|
||||||
key: 'unselectedRowIdsComponentSelector',
|
>({
|
||||||
get:
|
key: 'unselectedRowIdsComponentSelector',
|
||||||
({ scopeId }) =>
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
({ get }) => {
|
get:
|
||||||
const rowIds = get(tableRowIdsComponentState({ scopeId }));
|
({ instanceId }) =>
|
||||||
|
({ get }) => {
|
||||||
|
const rowIds = get(tableRowIdsComponentState.atomFamily({ instanceId }));
|
||||||
|
|
||||||
return rowIds.filter(
|
return rowIds.filter(
|
||||||
(rowId) =>
|
(rowId) =>
|
||||||
get(
|
get(
|
||||||
isRowSelectedComponentFamilyState({
|
isRowSelectedComponentFamilyState.atomFamily({
|
||||||
scopeId,
|
instanceId,
|
||||||
familyKey: rowId,
|
familyKey: rowId,
|
||||||
}),
|
}),
|
||||||
) === false,
|
) === false,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
|
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
|
||||||
import { createComponentReadOnlySelector } from '@/ui/utilities/state/component-state/utils/createComponentReadOnlySelector';
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
|
|
||||||
export const visibleTableColumnsComponentSelector =
|
export const visibleTableColumnsComponentSelector = createComponentSelectorV2({
|
||||||
createComponentReadOnlySelector({
|
key: 'visibleTableColumnsComponentSelector',
|
||||||
key: 'visibleTableColumnsComponentSelector',
|
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ instanceId }) =>
|
||||||
({ get }) => {
|
({ get }) => {
|
||||||
const columns = get(tableColumnsComponentState({ scopeId }));
|
const columns = get(
|
||||||
return columns
|
tableColumnsComponentState.atomFamily({ instanceId }),
|
||||||
.filter((column) => column.isVisible)
|
);
|
||||||
.sort((columnA, columnB) => columnA.position - columnB.position);
|
|
||||||
},
|
return columns
|
||||||
});
|
.filter((column) => column.isVisible)
|
||||||
|
.sort((columnA, columnB) => columnA.position - columnB.position);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user