From ec3327ca815f7e22eb5222d4d18e30e09e6694f4 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Fri, 27 Oct 2023 15:30:52 +0200 Subject: [PATCH] Fix major rework on view (#2262) --- .../table/components/CompanyTable.tsx | 7 +- .../useMoveSoftFocusToCurrentCellOnHover.ts | 14 ++ .../components/TableOptionsDropdown.tsx | 12 +- .../TableOptionsDropdownContent.tsx | 1 + .../views/components/ViewsDropdownButton.tsx | 24 ++- .../views/hooks/internal/useViewFields.ts | 15 +- .../views/hooks/internal/useViewFilters.ts | 165 +++++++++--------- .../views/hooks/internal/useViewSorts.ts | 134 +++++++------- front/src/modules/views/hooks/useView.ts | 83 +++++++-- .../views/hooks/useViewInternalStates.ts | 2 +- ...nPersistViewFiltersScopedFamilySelector.ts | 1 + 11 files changed, 269 insertions(+), 189 deletions(-) diff --git a/front/src/modules/companies/table/components/CompanyTable.tsx b/front/src/modules/companies/table/components/CompanyTable.tsx index dbe83f876..b4d4ec670 100644 --- a/front/src/modules/companies/table/components/CompanyTable.tsx +++ b/front/src/modules/companies/table/components/CompanyTable.tsx @@ -8,7 +8,6 @@ import { DataTableEffect } from '@/ui/data/data-table/components/DataTableEffect import { TableContext } from '@/ui/data/data-table/contexts/TableContext'; import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertDataTableItem'; import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown'; -import { TableOptionsHotkeyScope } from '@/ui/data/data-table/types/TableOptionsHotkeyScope'; import { ViewBar } from '@/views/components/ViewBar'; import { ViewBarEffect } from '@/views/components/ViewBarEffect'; import { useViewFields } from '@/views/hooks/internal/useViewFields'; @@ -93,11 +92,7 @@ export const CompanyTable = () => { - } + optionsDropdownButton={} optionsDropdownScopeId="table-dropdown-option" /> diff --git a/front/src/modules/ui/data/data-table/hooks/useMoveSoftFocusToCurrentCellOnHover.ts b/front/src/modules/ui/data/data-table/hooks/useMoveSoftFocusToCurrentCellOnHover.ts index fc1bc34f9..8e406dc49 100644 --- a/front/src/modules/ui/data/data-table/hooks/useMoveSoftFocusToCurrentCellOnHover.ts +++ b/front/src/modules/ui/data/data-table/hooks/useMoveSoftFocusToCurrentCellOnHover.ts @@ -1,8 +1,11 @@ import { useRecoilCallback } from 'recoil'; +import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState'; + import { currentTableCellInEditModePositionState } from '../states/currentTableCellInEditModePositionState'; import { isTableCellInEditModeFamilyState } from '../states/isTableCellInEditModeFamilyState'; import { useSetSoftFocusOnCurrentTableCell } from '../table-cell/hooks/useSetSoftFocusOnCurrentTableCell'; +import { TableHotkeyScope } from '../types/TableHotkeyScope'; export const useMoveSoftFocusToCurrentCellOnHover = () => { const setSoftFocusOnCurrentTableCell = useSetSoftFocusOnCurrentTableCell(); @@ -18,6 +21,17 @@ export const useMoveSoftFocusToCurrentCellOnHover = () => { isTableCellInEditModeFamilyState(currentTableCellInEditModePosition), ); + const currentHotkeyScope = snapshot + .getLoadable(currentHotkeyScopeState) + .valueOrThrow(); + + if ( + currentHotkeyScope.scope !== TableHotkeyScope.TableSoftFocus && + currentHotkeyScope.scope !== TableHotkeyScope.CellEditMode + ) { + return; + } + if (!isSomeCellInEditMode.contents) { setSoftFocusOnCurrentTableCell(); } diff --git a/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdown.tsx b/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdown.tsx index e77b1876b..a327deb45 100644 --- a/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdown.tsx +++ b/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdown.tsx @@ -1,27 +1,21 @@ import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope'; -import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { useView } from '@/views/hooks/useView'; import { TableOptionsDropdownId } from '../../constants/TableOptionsDropdownId'; +import { TableOptionsHotkeyScope } from '../../types/TableOptionsHotkeyScope'; import { TableOptionsDropdownButton } from './TableOptionsDropdownButton'; import { TableOptionsDropdownContent } from './TableOptionsDropdownContent'; -type TableOptionsDropdownProps = { - customHotkeyScope: HotkeyScope; -}; - -export const TableOptionsDropdown = ({ - customHotkeyScope, -}: TableOptionsDropdownProps) => { +export const TableOptionsDropdown = () => { const { setViewEditMode } = useView(); return ( } - dropdownHotkeyScope={customHotkeyScope} + dropdownHotkeyScope={{ scope: TableOptionsHotkeyScope.Dropdown }} dropdownOffset={{ y: 8 }} dropdownComponents={} onClickOutside={() => setViewEditMode('none')} diff --git a/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx b/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx index c5c54d13d..1ce5c17fa 100644 --- a/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx +++ b/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx @@ -81,6 +81,7 @@ export const TableOptionsDropdownContent = () => { useScopedHotkeys( Key.Enter, () => { + console.log('enter'); const name = viewEditInputRef.current?.value; handleViewNameSubmit(name); resetMenu(); diff --git a/front/src/modules/views/components/ViewsDropdownButton.tsx b/front/src/modules/views/components/ViewsDropdownButton.tsx index c0d0623a3..afb530efd 100644 --- a/front/src/modules/views/components/ViewsDropdownButton.tsx +++ b/front/src/modules/views/components/ViewsDropdownButton.tsx @@ -3,6 +3,7 @@ import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { useRecoilCallback } from 'recoil'; +import { TableOptionsDropdownId } from '@/ui/data/data-table/constants/TableOptionsDropdownId'; import { IconChevronDown, IconList, @@ -76,23 +77,31 @@ export const ViewsDropdownButton = ({ entityCountInCurrentView, } = useViewInternalStates(scopeId, currentViewId); - const { isDropdownOpen, closeDropdown } = useDropdown({ + const { + isDropdownOpen: isViewsDropdownOpen, + closeDropdown: closeViewsDropdown, + } = useDropdown({ dropdownScopeId: ViewsDropdownId, }); + const { openDropdown: openOptionsDropdown } = useDropdown({ + dropdownScopeId: TableOptionsDropdownId, + }); + const handleViewSelect = useRecoilCallback( () => async (viewId: string) => { setCurrentViewId(viewId); - closeDropdown(); + closeViewsDropdown(); }, - [setCurrentViewId, closeDropdown], + [setCurrentViewId, closeViewsDropdown], ); const handleAddViewButtonClick = () => { setViewEditMode('create'); onViewEditModeChange?.(); - closeDropdown(); + closeViewsDropdown(); + openOptionsDropdown(); }; const handleEditViewButtonClick = ( @@ -103,7 +112,8 @@ export const ViewsDropdownButton = ({ setCurrentViewId(viewId); setViewEditMode('edit'); onViewEditModeChange?.(); - closeDropdown(); + closeViewsDropdown(); + openOptionsDropdown(); }; const handleDeleteViewButtonClick = async ( @@ -113,7 +123,7 @@ export const ViewsDropdownButton = ({ event.stopPropagation(); await removeView(viewId); - closeDropdown(); + closeViewsDropdown(); }; return ( @@ -121,7 +131,7 @@ export const ViewsDropdownButton = ({ + {currentView?.name} diff --git a/front/src/modules/views/hooks/internal/useViewFields.ts b/front/src/modules/views/hooks/internal/useViewFields.ts index 9d8ac5abf..b8d16d282 100644 --- a/front/src/modules/views/hooks/internal/useViewFields.ts +++ b/front/src/modules/views/hooks/internal/useViewFields.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import { getOperationName } from '@apollo/client/utilities'; import { useRecoilCallback } from 'recoil'; @@ -32,7 +31,10 @@ export const useViewFields = (viewScopeId: string) => { const persistViewFields = useRecoilCallback( ({ snapshot }) => - async (viewFieldsToPersist: ColumnDefinition[]) => { + async ( + viewFieldsToPersist: ColumnDefinition[], + viewId?: string, + ) => { const currentViewId = snapshot .getLoadable(currentViewIdScopedState({ scopeId: viewScopeId })) .getValue(); @@ -45,7 +47,7 @@ export const useViewFields = (viewScopeId: string) => { .getLoadable( savedViewFieldByKeyScopedFamilySelector({ viewScopeId: viewScopeId, - viewId: currentViewId, + viewId: viewId ?? currentViewId, }), ) .getValue(); @@ -65,7 +67,7 @@ export const useViewFields = (viewScopeId: string) => { variables: { data: viewFieldsToCreate.map((viewField) => ({ ...toViewFieldInput(objectId, viewField), - viewId: currentViewId, + viewId: viewId ?? currentViewId, })), }, refetchQueries: [getOperationName(GET_VIEW_FIELDS) ?? ''], @@ -89,7 +91,10 @@ export const useViewFields = (viewScopeId: string) => { index: viewField.index, }, where: { - viewId_key: { key: viewField.key, viewId: currentViewId }, + viewId_key: { + key: viewField.key, + viewId: viewId ?? currentViewId, + }, }, }, refetchQueries: [getOperationName(GET_VIEWS) ?? ''], diff --git a/front/src/modules/views/hooks/internal/useViewFilters.ts b/front/src/modules/views/hooks/internal/useViewFilters.ts index fe53a9afe..1549f08ce 100644 --- a/front/src/modules/views/hooks/internal/useViewFilters.ts +++ b/front/src/modules/views/hooks/internal/useViewFilters.ts @@ -1,10 +1,11 @@ -import { useCallback } from 'react'; import { useRecoilCallback } from 'recoil'; import { Filter } from '@/ui/data/filter/types/Filter'; import { FilterDefinition } from '@/ui/data/filter/types/FilterDefinition'; import { availableFiltersScopedState } from '@/views/states/availableFiltersScopedState'; import { currentViewFiltersScopedFamilyState } from '@/views/states/currentViewFiltersScopedFamilyState'; +import { currentViewIdScopedState } from '@/views/states/currentViewIdScopedState'; +import { savedViewFiltersScopedFamilyState } from '@/views/states/savedViewFiltersScopedFamilyState'; import { savedViewFiltersByKeyScopedFamilySelector } from '@/views/states/selectors/savedViewFiltersByKeyScopedFamilySelector'; import { useCreateViewFiltersMutation, @@ -12,94 +13,86 @@ import { useUpdateViewFilterMutation, } from '~/generated/graphql'; -import { useViewStates } from '../useViewStates'; - export const useViewFilters = (viewScopeId: string) => { - const { currentViewId } = useViewStates(viewScopeId); - const [createViewFiltersMutation] = useCreateViewFiltersMutation(); const [updateViewFilterMutation] = useUpdateViewFilterMutation(); const [deleteViewFiltersMutation] = useDeleteViewFiltersMutation(); - const _createViewFilters = useCallback( - ( - filters: Filter[], - availableFilters: FilterDefinition[] = [], - viewId = currentViewId, - ) => { - if (!viewId || !filters.length) { - return; - } - - if (!availableFilters) { - return; - } - - return createViewFiltersMutation({ - variables: { - data: filters.map((filter) => ({ - displayValue: filter.displayValue ?? filter.value, - key: filter.key, - name: - availableFilters.find(({ key }) => key === filter.key)?.label ?? - '', - operand: filter.operand, - value: filter.value, - viewId, - })), - }, - }); - }, - [createViewFiltersMutation, currentViewId], - ); - - const _updateViewFilters = useCallback( - (filters: Filter[], viewId = currentViewId) => { - if (!viewId || !filters.length) return; - - return Promise.all( - filters.map((filter) => - updateViewFilterMutation({ - variables: { - data: { - displayValue: filter.displayValue ?? filter.value, - operand: filter.operand, - value: filter.value, - }, - where: { - viewId_key: { key: filter.key, viewId: viewId }, - }, - }, - }), - ), - ); - }, - [currentViewId, updateViewFilterMutation], - ); - - const _deleteViewFilters = useCallback( - (filterKeys: string[], viewId = currentViewId) => { - if (!viewId || !filterKeys.length) return; - - return deleteViewFiltersMutation({ - variables: { - where: { - key: { in: filterKeys }, - viewId: { equals: viewId }, - }, - }, - }); - }, - [currentViewId, deleteViewFiltersMutation], - ); - const persistViewFilters = useRecoilCallback( - ({ snapshot }) => - async () => { + ({ snapshot, set }) => + async (viewId?: string) => { + const currentViewId = snapshot + .getLoadable(currentViewIdScopedState({ scopeId: viewScopeId })) + .getValue(); if (!currentViewId) { return; } + const _createViewFilters = ( + filters: Filter[], + availableFilters: FilterDefinition[] = [], + ) => { + if (!currentViewId || !filters.length) { + return; + } + + if (!availableFilters) { + return; + } + + return createViewFiltersMutation({ + variables: { + data: filters.map((filter) => ({ + displayValue: filter.displayValue ?? filter.value, + key: filter.key, + name: + availableFilters.find(({ key }) => key === filter.key) + ?.label ?? '', + operand: filter.operand, + value: filter.value, + viewId: viewId ?? currentViewId, + })), + }, + }); + }; + + const _updateViewFilters = (filters: Filter[]) => { + if (!currentViewId || !filters.length) return; + + return Promise.all( + filters.map((filter) => + updateViewFilterMutation({ + variables: { + data: { + displayValue: filter.displayValue ?? filter.value, + operand: filter.operand, + value: filter.value, + }, + where: { + viewId_key: { + key: filter.key, + viewId: viewId ?? currentViewId, + }, + }, + }, + }), + ), + ); + }; + + const _deleteViewFilters = (filterKeys: string[]) => { + if (!currentViewId || !filterKeys.length) return; + + return deleteViewFiltersMutation({ + variables: { + where: { + key: { in: filterKeys }, + viewId: { equals: viewId ?? currentViewId }, + }, + }, + }); + }; + const currentViewFilters = snapshot .getLoadable( currentViewFiltersScopedFamilyState({ @@ -151,13 +144,19 @@ export const useViewFilters = (viewScopeId: string) => { (previousFilterKey) => !filterKeys.includes(previousFilterKey), ); await _deleteViewFilters(filterKeysToDelete); + set( + savedViewFiltersScopedFamilyState({ + scopeId: viewScopeId, + familyKey: viewId ?? currentViewId, + }), + currentViewFilters, + ); }, [ - currentViewId, viewScopeId, - _createViewFilters, - _updateViewFilters, - _deleteViewFilters, + createViewFiltersMutation, + updateViewFilterMutation, + deleteViewFiltersMutation, ], ); diff --git a/front/src/modules/views/hooks/internal/useViewSorts.ts b/front/src/modules/views/hooks/internal/useViewSorts.ts index 966968edd..db6c13b63 100644 --- a/front/src/modules/views/hooks/internal/useViewSorts.ts +++ b/front/src/modules/views/hooks/internal/useViewSorts.ts @@ -1,10 +1,10 @@ -/* eslint-disable no-console */ -import { useCallback } from 'react'; import { produce } from 'immer'; import { useRecoilCallback } from 'recoil'; import { Sort } from '@/ui/data/sort/types/Sort'; +import { currentViewIdScopedState } from '@/views/states/currentViewIdScopedState'; import { currentViewSortsScopedFamilyState } from '@/views/states/currentViewSortsScopedFamilyState'; +import { savedViewSortsScopedFamilyState } from '@/views/states/savedViewSortsScopedFamilyState'; import { savedViewSortsByKeyScopedFamilySelector } from '@/views/states/selectors/savedViewSortsByKeyScopedFamilySelector'; import { useCreateViewSortsMutation, @@ -16,75 +16,71 @@ import { import { useViewStates } from '../useViewStates'; export const useViewSorts = (viewScopeId: string) => { - const { currentViewId, setCurrentViewSorts } = useViewStates(viewScopeId); - + const { setCurrentViewSorts } = useViewStates(viewScopeId); const [createViewSortsMutation] = useCreateViewSortsMutation(); const [updateViewSortMutation] = useUpdateViewSortMutation(); const [deleteViewSortsMutation] = useDeleteViewSortsMutation(); - const _createViewSorts = useCallback( - (sorts: Sort[], viewId = currentViewId) => { - if (!viewId || !sorts.length) return; - - return createViewSortsMutation({ - variables: { - data: sorts.map((sort) => ({ - key: sort.key, - direction: sort.direction as ViewSortDirection, - name: sort.definition.label, - viewId, - })), - }, - }); - }, - [createViewSortsMutation, currentViewId], - ); - - const _updateViewSorts = useCallback( - (sorts: Sort[]) => { - if (!currentViewId || !sorts.length) return; - - return Promise.all( - sorts.map((sort) => - updateViewSortMutation({ - variables: { - data: { - direction: sort.direction as ViewSortDirection, - }, - where: { - viewId_key: { key: sort.key, viewId: currentViewId }, - }, - }, - }), - ), - ); - }, - [currentViewId, updateViewSortMutation], - ); - - const _deleteViewSorts = useCallback( - (sortKeys: string[]) => { - if (!currentViewId || !sortKeys.length) return; - - return deleteViewSortsMutation({ - variables: { - where: { - key: { in: sortKeys }, - viewId: { equals: currentViewId }, - }, - }, - }); - }, - [currentViewId, deleteViewSortsMutation], - ); - const persistViewSorts = useRecoilCallback( - ({ snapshot }) => - async () => { + ({ snapshot, set }) => + async (viewId?: string) => { + const currentViewId = snapshot + .getLoadable(currentViewIdScopedState({ scopeId: viewScopeId })) + .getValue(); if (!currentViewId) { return; } + const _createViewSorts = (sorts: Sort[]) => { + if (!currentViewId || !sorts.length) return; + + return createViewSortsMutation({ + variables: { + data: sorts.map((sort) => ({ + key: sort.key, + direction: sort.direction as ViewSortDirection, + name: sort.definition.label, + viewId: viewId ?? currentViewId, + })), + }, + }); + }; + + const _updateViewSorts = (sorts: Sort[]) => { + if (!currentViewId || !sorts.length) return; + + return Promise.all( + sorts.map((sort) => + updateViewSortMutation({ + variables: { + data: { + direction: sort.direction as ViewSortDirection, + }, + where: { + viewId_key: { + key: sort.key, + viewId: viewId ?? currentViewId, + }, + }, + }, + }), + ), + ); + }; + + const _deleteViewSorts = (sortKeys: string[]) => { + if (!currentViewId || !sortKeys.length) return; + + return deleteViewSortsMutation({ + variables: { + where: { + key: { in: sortKeys }, + viewId: { equals: viewId ?? currentViewId }, + }, + }, + }); + }; + const currentViewSorts = snapshot .getLoadable( currentViewSortsScopedFamilyState({ @@ -127,13 +123,19 @@ export const useViewSorts = (viewScopeId: string) => { (previousSortKey) => !sortKeys.includes(previousSortKey), ); await _deleteViewSorts(sortKeysToDelete); + set( + savedViewSortsScopedFamilyState({ + scopeId: viewScopeId, + familyKey: viewId ?? currentViewId, + }), + currentViewSorts, + ); }, [ - currentViewId, viewScopeId, - _createViewSorts, - _updateViewSorts, - _deleteViewSorts, + createViewSortsMutation, + updateViewSortMutation, + deleteViewSortsMutation, ], ); diff --git a/front/src/modules/views/hooks/useView.ts b/front/src/modules/views/hooks/useView.ts index 9d160681b..444c792f7 100644 --- a/front/src/modules/views/hooks/useView.ts +++ b/front/src/modules/views/hooks/useView.ts @@ -1,4 +1,3 @@ -import { useCallback } from 'react'; import { useSearchParams } from 'react-router-dom'; import { useRecoilCallback } from 'recoil'; import { v4 } from 'uuid'; @@ -8,7 +7,9 @@ import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-i import { ViewScopeInternalContext } from '../scopes/scope-internal-context/ViewScopeInternalContext'; import { currentViewFieldsScopedFamilyState } from '../states/currentViewFieldsScopedFamilyState'; +import { currentViewFiltersScopedFamilyState } from '../states/currentViewFiltersScopedFamilyState'; import { currentViewIdScopedState } from '../states/currentViewIdScopedState'; +import { currentViewSortsScopedFamilyState } from '../states/currentViewSortsScopedFamilyState'; import { savedViewFiltersScopedFamilyState } from '../states/savedViewFiltersScopedFamilyState'; import { savedViewSortsScopedFamilyState } from '../states/savedViewSortsScopedFamilyState'; import { viewEditModeScopedState } from '../states/viewEditModeScopedState'; @@ -90,19 +91,77 @@ export const useView = (props?: UseViewProps) => { setIsViewBarExpanded?.(false); }); - const createView = useCallback( - async (name: string) => { - const newViewId = v4(); - await internalCreateView({ id: v4(), name }); + const createView = useRecoilCallback( + ({ snapshot, set }) => + async (name: string) => { + const newViewId = v4(); + await internalCreateView({ id: newViewId, name }); - // await persistViewFields(); - await persistViewFilters(); - await persistViewSorts(); - //setCurrentViewId(newViewId); + const currentViewFields = snapshot + .getLoadable( + currentViewFieldsScopedFamilyState({ + scopeId, + familyKey: currentViewId || '', + }), + ) + .getValue(); - setSearchParams({ view: newViewId }); - }, - [internalCreateView, persistViewFilters, persistViewSorts, setSearchParams], + set( + currentViewFieldsScopedFamilyState({ scopeId, familyKey: newViewId }), + currentViewFields, + ); + + const currentViewFilters = snapshot + .getLoadable( + currentViewFiltersScopedFamilyState({ + scopeId, + familyKey: currentViewId || '', + }), + ) + .getValue(); + + set( + currentViewFiltersScopedFamilyState({ + scopeId, + familyKey: newViewId, + }), + currentViewFilters, + ); + + const currentViewSorts = snapshot + .getLoadable( + currentViewSortsScopedFamilyState({ + scopeId, + familyKey: currentViewId || '', + }), + ) + .getValue(); + + set( + currentViewSortsScopedFamilyState({ + scopeId, + familyKey: newViewId, + }), + currentViewSorts, + ); + + await persistViewFields(currentViewFields, newViewId); + await persistViewFilters(newViewId); + await persistViewSorts(newViewId); + setCurrentViewId(newViewId); + + setSearchParams({ view: newViewId }); + }, + [ + currentViewId, + internalCreateView, + persistViewFields, + persistViewFilters, + persistViewSorts, + scopeId, + setCurrentViewId, + setSearchParams, + ], ); const updateCurrentView = async () => { diff --git a/front/src/modules/views/hooks/useViewInternalStates.ts b/front/src/modules/views/hooks/useViewInternalStates.ts index 068322434..9f08a1253 100644 --- a/front/src/modules/views/hooks/useViewInternalStates.ts +++ b/front/src/modules/views/hooks/useViewInternalStates.ts @@ -46,7 +46,7 @@ export const useViewInternalStates = ( scopeId, ); - const familyItemId = viewId ? viewId : currentViewId; + const familyItemId = viewId ?? currentViewId; const currentView = useRecoilValue(currentViewScopedSelector(scopeId)); diff --git a/front/src/modules/views/states/selectors/canPersistViewFiltersScopedFamilySelector.ts b/front/src/modules/views/states/selectors/canPersistViewFiltersScopedFamilySelector.ts index cd51040c6..b13e6041d 100644 --- a/front/src/modules/views/states/selectors/canPersistViewFiltersScopedFamilySelector.ts +++ b/front/src/modules/views/states/selectors/canPersistViewFiltersScopedFamilySelector.ts @@ -13,6 +13,7 @@ export const canPersistViewFiltersScopedFamilySelector = selectorFamily({ if (!viewId) { return; } + return !isDeeplyEqual( get( savedViewFiltersScopedFamilyState({