diff --git a/src/common/hooks/useDataTablePreference.ts b/src/common/hooks/useDataTablePreference.ts index 4f7c5aa496..69ec1ecd64 100644 --- a/src/common/hooks/useDataTablePreference.ts +++ b/src/common/hooks/useDataTablePreference.ts @@ -14,7 +14,7 @@ import { TableFiltersPreference } from './useReactSettings'; import { dataTableFiltersAtom } from './useStoreSessionTableFilters'; interface Params { - tableKey: string; + tableKey: string | undefined; } export function useDataTablePreference(params: Params) { const user = useUserChanges(); @@ -24,6 +24,10 @@ export function useDataTablePreference(params: Params) { const storeSessionTableFilters = useAtomValue(dataTableFiltersAtom); return (filterKey: keyof TableFiltersPreference) => { + if (!tableKey) { + return ''; + } + if (filterKey === 'filter' || filterKey === 'currentPage') { return storeSessionTableFilters?.[tableKey]?.[filterKey] ? storeSessionTableFilters[tableKey][filterKey] diff --git a/src/common/hooks/useDataTablePreferences.ts b/src/common/hooks/useDataTablePreferences.ts index 4e0df73335..e70a59941e 100644 --- a/src/common/hooks/useDataTablePreferences.ts +++ b/src/common/hooks/useDataTablePreferences.ts @@ -27,7 +27,7 @@ import { useStoreSessionTableFilters } from './useStoreSessionTableFilters'; interface Params { apiEndpoint: URL; customFilters?: SelectOption[]; - tableKey: string; + tableKey: string | undefined; isInitialConfiguration: boolean; customFilter: string[] | undefined; setFilter: Dispatch>; @@ -38,6 +38,7 @@ interface Params { setStatus: Dispatch>; setPerPage: Dispatch>; withoutStoringPerPage: boolean; + enableSavingFilterPreference?: boolean; } export function useDataTablePreferences(params: Params) { @@ -58,6 +59,7 @@ export function useDataTablePreferences(params: Params) { setStatus, setPerPage, withoutStoringPerPage, + enableSavingFilterPreference, } = params; const getPreference = useDataTablePreference({ tableKey }); @@ -85,7 +87,7 @@ export function useDataTablePreferences(params: Params) { status: string[], perPage: PerPage ) => { - if (!customFilter) { + if (!customFilter || !tableKey || !enableSavingFilterPreference) { return; } @@ -124,6 +126,16 @@ export function useDataTablePreferences(params: Params) { const updatedUser = cloneDeep(user) as User; if (updatedUser) { + // @Todo: This is a temporary solution for creating the table_filters object. It can be removed after some time. + const tableFilters = + updatedUser.company_user?.react_settings.table_filters || {}; + + Object.keys(tableFilters).forEach((key) => { + if (key.includes('/')) { + delete tableFilters[key]; + } + }); + set( updatedUser, `company_user.react_settings.table_filters.${tableKey}`, diff --git a/src/common/hooks/useDataTableUtilities.ts b/src/common/hooks/useDataTableUtilities.ts index 782b127441..6c733f46f4 100644 --- a/src/common/hooks/useDataTableUtilities.ts +++ b/src/common/hooks/useDataTableUtilities.ts @@ -16,7 +16,7 @@ import collect from 'collect.js'; interface Params { apiEndpoint: URL; isInitialConfiguration: boolean; - tableKey: string; + tableKey: string | undefined; customFilters?: SelectOption[]; customFilter?: string[] | undefined; } diff --git a/src/common/hooks/useStoreSessionTableFilters.ts b/src/common/hooks/useStoreSessionTableFilters.ts index e93ee72d0d..2338d8bb1a 100644 --- a/src/common/hooks/useStoreSessionTableFilters.ts +++ b/src/common/hooks/useStoreSessionTableFilters.ts @@ -21,7 +21,7 @@ export const dataTableFiltersAtom = atomWithStorage( ); interface Params { - tableKey: string; + tableKey: string | undefined; } export function useStoreSessionTableFilters(params: Params) { const { tableKey } = params; @@ -29,6 +29,10 @@ export function useStoreSessionTableFilters(params: Params) { const setDataTableFilters = useSetAtom(dataTableFiltersAtom); return (filter: string, currentPage: number) => { + if (!tableKey) { + return; + } + setDataTableFilters((current) => ({ ...current, [tableKey]: { diff --git a/src/components/DataTable.tsx b/src/components/DataTable.tsx index 8e7a1722cc..b943813e53 100644 --- a/src/components/DataTable.tsx +++ b/src/components/DataTable.tsx @@ -52,7 +52,6 @@ import { Guard } from '$app/common/guards/Guard'; import { EntityState } from '$app/common/enums/entity-state'; import { GenericSingleResourceResponse } from '$app/common/interfaces/generic-api-response'; import { refetchByUrl } from '$app/common/hooks/useRefetch'; -import { useLocation } from 'react-router-dom'; import { useDataTableOptions } from '$app/common/hooks/useDataTableOptions'; import { useDataTableUtilities } from '$app/common/hooks/useDataTableUtilities'; import { useDataTablePreferences } from '$app/common/hooks/useDataTablePreferences'; @@ -152,6 +151,7 @@ interface Props extends CommonProps { withoutPerPageAsPreference?: boolean; withoutSortQueryParameter?: boolean; showRestoreBulk?: (selectedResources: T[]) => boolean; + enableSavingFilterPreference?: boolean; } export type ResourceAction = (resource: T) => ReactElement; @@ -160,7 +160,6 @@ export type PerPage = '10' | '50' | '100'; export function DataTable(props: Props) { const [t] = useTranslation(); - const location = useLocation(); const options = useDataTableOptions(); const reactSettings = useReactSettings(); @@ -174,8 +173,6 @@ export function DataTable(props: Props) { new URL(endpoint(props.endpoint)) ); - const tableKey = `${location.pathname}${props.endpoint.replace('.', '')}`; - const setInvalidationQueryAtom = useSetAtom(invalidationQueryAtom); const { @@ -193,6 +190,7 @@ export function DataTable(props: Props) { withoutPerPageAsPreference = false, withoutSortQueryParameter = false, showRestoreBulk, + enableSavingFilterPreference = false, } = props; const companyUpdateTimeOut = useRef(undefined); @@ -232,9 +230,10 @@ export function DataTable(props: Props) { setSort, setSortedBy, setStatus, - tableKey, + tableKey: `${props.resource}s`, customFilters, withoutStoringPerPage: withoutPerPageAsPreference, + enableSavingFilterPreference, }); const { @@ -244,7 +243,7 @@ export function DataTable(props: Props) { } = useDataTableUtilities({ apiEndpoint, isInitialConfiguration, - tableKey, + tableKey: `${props.resource}s`, customFilter, customFilters, }); diff --git a/src/pages/clients/index/Clients.tsx b/src/pages/clients/index/Clients.tsx index 6335947dfd..04935ee2d7 100644 --- a/src/pages/clients/index/Clients.tsx +++ b/src/pages/clients/index/Clients.tsx @@ -52,11 +52,7 @@ export default function Clients() { } = useChangeTemplate(); return ( - + diff --git a/src/pages/credits/index/Credits.tsx b/src/pages/credits/index/Credits.tsx index db9b4795f3..87cbdee29f 100644 --- a/src/pages/credits/index/Credits.tsx +++ b/src/pages/credits/index/Credits.tsx @@ -85,6 +85,7 @@ export default function Credits() { dateRangeColumns={dateRangeColumns} linkToCreateGuards={[permission('create_credit')]} hideEditableOptions={!hasPermission('edit_credit')} + enableSavingFilterPreference /> diff --git a/src/pages/expenses/index/Expenses.tsx b/src/pages/expenses/index/Expenses.tsx index c8c963543e..9eb20f3ebb 100644 --- a/src/pages/expenses/index/Expenses.tsx +++ b/src/pages/expenses/index/Expenses.tsx @@ -77,6 +77,7 @@ export default function Expenses() { } linkToCreateGuards={[permission('create_expense')]} hideEditableOptions={!hasPermission('edit_expense')} + enableSavingFilterPreference /> ); diff --git a/src/pages/invoices/index/Invoices.tsx b/src/pages/invoices/index/Invoices.tsx index 4a72cfd2b6..40e603fa3f 100644 --- a/src/pages/invoices/index/Invoices.tsx +++ b/src/pages/invoices/index/Invoices.tsx @@ -151,6 +151,7 @@ export default function Invoices() { setInvoiceSliderVisibility(true); }} dateRangeColumns={dateRangeColumns} + enableSavingFilterPreference /> {!disableNavigation('invoice', invoiceSlider) && } diff --git a/src/pages/payments/index/Payments.tsx b/src/pages/payments/index/Payments.tsx index 92afe23283..8050e58858 100644 --- a/src/pages/payments/index/Payments.tsx +++ b/src/pages/payments/index/Payments.tsx @@ -124,6 +124,7 @@ export default function Payments() { (payment) => getEntityState(payment) === EntityState.Archived ) } + enableSavingFilterPreference /> {!disableNavigation('payment', paymentSlider) && } diff --git a/src/pages/products/index/Products.tsx b/src/pages/products/index/Products.tsx index 748d3dbb63..958ac43518 100644 --- a/src/pages/products/index/Products.tsx +++ b/src/pages/products/index/Products.tsx @@ -74,6 +74,7 @@ export default function Products() { } linkToCreateGuards={[permission('create_product')]} hideEditableOptions={!hasPermission('edit_product')} + enableSavingFilterPreference /> ); diff --git a/src/pages/projects/index/Projects.tsx b/src/pages/projects/index/Projects.tsx index e01d8c31ca..3fee94bea7 100644 --- a/src/pages/projects/index/Projects.tsx +++ b/src/pages/projects/index/Projects.tsx @@ -71,6 +71,7 @@ export default function Projects() { } linkToCreateGuards={[permission('create_project')]} hideEditableOptions={!hasPermission('edit_project')} + enableSavingFilterPreference /> diff --git a/src/pages/purchase-orders/index/PurchaseOrders.tsx b/src/pages/purchase-orders/index/PurchaseOrders.tsx index 1f8cdbef4c..e422de1679 100644 --- a/src/pages/purchase-orders/index/PurchaseOrders.tsx +++ b/src/pages/purchase-orders/index/PurchaseOrders.tsx @@ -79,6 +79,7 @@ export default function PurchaseOrders() { dateRangeColumns={dateRangeColumns} linkToCreateGuards={[permission('create_purchase_order')]} hideEditableOptions={!hasPermission('edit_purchase_order')} + enableSavingFilterPreference /> diff --git a/src/pages/quotes/index/Quotes.tsx b/src/pages/quotes/index/Quotes.tsx index fdd9549377..aa21b984dc 100644 --- a/src/pages/quotes/index/Quotes.tsx +++ b/src/pages/quotes/index/Quotes.tsx @@ -143,6 +143,7 @@ export default function Quotes() { dateRangeColumns={dateRangeColumns} linkToCreateGuards={[permission('create_quote')]} hideEditableOptions={!hasPermission('edit_quote')} + enableSavingFilterPreference /> {!disableNavigation('quote', quoteSlider) && } diff --git a/src/pages/recurring-expenses/index/RecurringExpenses.tsx b/src/pages/recurring-expenses/index/RecurringExpenses.tsx index 9bf3b36d63..4cca8a46ae 100644 --- a/src/pages/recurring-expenses/index/RecurringExpenses.tsx +++ b/src/pages/recurring-expenses/index/RecurringExpenses.tsx @@ -66,6 +66,7 @@ export default function RecurringExpenses() { } linkToCreateGuards={[permission('create_recurring_expense')]} hideEditableOptions={!hasPermission('edit_recurring_expense')} + enableSavingFilterPreference /> ); diff --git a/src/pages/recurring-invoices/index/RecurringInvoices.tsx b/src/pages/recurring-invoices/index/RecurringInvoices.tsx index 0fc0c6db21..652054b04a 100644 --- a/src/pages/recurring-invoices/index/RecurringInvoices.tsx +++ b/src/pages/recurring-invoices/index/RecurringInvoices.tsx @@ -151,6 +151,7 @@ export default function RecurringInvoices() { ); setRecurringInvoiceSliderVisibility(true); }} + enableSavingFilterPreference /> {!disableNavigation('recurring_invoice', recurringInvoiceSlider) && ( diff --git a/src/pages/settings/bank-accounts/components/transaction-rules/TransactionRules.tsx b/src/pages/settings/bank-accounts/components/transaction-rules/TransactionRules.tsx index b01212a7ab..565c4b756c 100644 --- a/src/pages/settings/bank-accounts/components/transaction-rules/TransactionRules.tsx +++ b/src/pages/settings/bank-accounts/components/transaction-rules/TransactionRules.tsx @@ -44,6 +44,7 @@ export function TransactionRules() { linkToCreate="/settings/bank_accounts/transaction_rules/create" linkToEdit="/settings/bank_accounts/transaction_rules/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/bank-accounts/index/BankAccounts.tsx b/src/pages/settings/bank-accounts/index/BankAccounts.tsx index fab420211a..f8a5c451c7 100644 --- a/src/pages/settings/bank-accounts/index/BankAccounts.tsx +++ b/src/pages/settings/bank-accounts/index/BankAccounts.tsx @@ -98,6 +98,7 @@ export function BankAccounts() { )} } + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/expense-categories/ExpenseCategories.tsx b/src/pages/settings/expense-categories/ExpenseCategories.tsx index 40a35a5ce2..6fbfebd6bb 100644 --- a/src/pages/settings/expense-categories/ExpenseCategories.tsx +++ b/src/pages/settings/expense-categories/ExpenseCategories.tsx @@ -49,6 +49,7 @@ export function ExpenseCategories() { linkToCreate="/settings/expense_categories/create" linkToEdit="/settings/expense_categories/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); } diff --git a/src/pages/settings/group-settings/index/GroupSettings.tsx b/src/pages/settings/group-settings/index/GroupSettings.tsx index 898e89c904..b2fd58d11a 100644 --- a/src/pages/settings/group-settings/index/GroupSettings.tsx +++ b/src/pages/settings/group-settings/index/GroupSettings.tsx @@ -62,6 +62,7 @@ export function GroupSettings() { linkToEdit="/settings/group_settings/:id/edit" customActions={actions} withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/integrations/api-tokens/ApiTokens.tsx b/src/pages/settings/integrations/api-tokens/ApiTokens.tsx index 7bb3e17e6b..84fe36a318 100644 --- a/src/pages/settings/integrations/api-tokens/ApiTokens.tsx +++ b/src/pages/settings/integrations/api-tokens/ApiTokens.tsx @@ -65,6 +65,7 @@ export function ApiTokens() { linkToCreate="/settings/integrations/api_tokens/create" linkToEdit="/settings/integrations/api_tokens/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/integrations/api-webhooks/ApiWebhooks.tsx b/src/pages/settings/integrations/api-webhooks/ApiWebhooks.tsx index 9cb8b965da..f23b51bcca 100644 --- a/src/pages/settings/integrations/api-webhooks/ApiWebhooks.tsx +++ b/src/pages/settings/integrations/api-webhooks/ApiWebhooks.tsx @@ -35,6 +35,7 @@ export function ApiWebhooks() { linkToCreate="/settings/integrations/api_webhooks/create" linkToEdit="/settings/integrations/api_webhooks/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/invoice-design/pages/custom-designs/index/CustomDesigns.tsx b/src/pages/settings/invoice-design/pages/custom-designs/index/CustomDesigns.tsx index 09cf2c7a53..10342367e5 100644 --- a/src/pages/settings/invoice-design/pages/custom-designs/index/CustomDesigns.tsx +++ b/src/pages/settings/invoice-design/pages/custom-designs/index/CustomDesigns.tsx @@ -40,6 +40,7 @@ export default function CustomDesigns() { linkToEdit="/settings/invoice_design/custom_designs/:id/edit" withResourcefulActions hideEditableOptions={!proPlan() && !enterprisePlan()} + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/payment-terms/PaymentTerms.tsx b/src/pages/settings/payment-terms/PaymentTerms.tsx index dcc2bb5093..55fc724431 100644 --- a/src/pages/settings/payment-terms/PaymentTerms.tsx +++ b/src/pages/settings/payment-terms/PaymentTerms.tsx @@ -52,6 +52,7 @@ export function PaymentTerms() { linkToCreate="/settings/payment_terms/create" linkToEdit="/settings/payment_terms/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/schedules/index/Schedules.tsx b/src/pages/settings/schedules/index/Schedules.tsx index fcb4c66cc4..98b96e4d38 100644 --- a/src/pages/settings/schedules/index/Schedules.tsx +++ b/src/pages/settings/schedules/index/Schedules.tsx @@ -40,6 +40,7 @@ export function Schedules() { linkToCreate="/settings/schedules/create" linkToEdit="/settings/schedules/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/subscriptions/index/Subscriptions.tsx b/src/pages/settings/subscriptions/index/Subscriptions.tsx index 1f6dcf4ead..31257b71da 100644 --- a/src/pages/settings/subscriptions/index/Subscriptions.tsx +++ b/src/pages/settings/subscriptions/index/Subscriptions.tsx @@ -40,6 +40,7 @@ export function Subscriptions() { linkToCreate="/settings/subscriptions/create" linkToEdit="/settings/subscriptions/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); diff --git a/src/pages/settings/task-statuses/TaskStatuses.tsx b/src/pages/settings/task-statuses/TaskStatuses.tsx index 1584959571..7c4f0690fd 100644 --- a/src/pages/settings/task-statuses/TaskStatuses.tsx +++ b/src/pages/settings/task-statuses/TaskStatuses.tsx @@ -52,6 +52,7 @@ export function TaskStatuses() { linkToCreate="/settings/task_statuses/create" linkToEdit="/settings/task_statuses/:id/edit" withResourcefulActions + enableSavingFilterPreference /> ); } diff --git a/src/pages/settings/tax-rates/TaxRates.tsx b/src/pages/settings/tax-rates/TaxRates.tsx index db76b86d05..12479e731e 100644 --- a/src/pages/settings/tax-rates/TaxRates.tsx +++ b/src/pages/settings/tax-rates/TaxRates.tsx @@ -41,6 +41,7 @@ export function TaxRates() { linkToEdit="/settings/tax_rates/:id/edit" withResourcefulActions onBulkActionSuccess={(_, action) => onBulkActionsSuccess(action)} + enableSavingFilterPreference /> ); } diff --git a/src/pages/settings/users/index/Users.tsx b/src/pages/settings/users/index/Users.tsx index 65bf8f2263..3c5eae2ed0 100644 --- a/src/pages/settings/users/index/Users.tsx +++ b/src/pages/settings/users/index/Users.tsx @@ -75,6 +75,7 @@ export function Users() { setAction(action); setIsPasswordConfirmModalOpen(true); }} + enableSavingFilterPreference /> diff --git a/src/pages/tasks/index/Tasks.tsx b/src/pages/tasks/index/Tasks.tsx index 2efede8467..cb54678faf 100644 --- a/src/pages/tasks/index/Tasks.tsx +++ b/src/pages/tasks/index/Tasks.tsx @@ -135,6 +135,7 @@ export default function Tasks() { setSliderTaskId(quote.id); setTaskSliderVisibility(true); }} + enableSavingFilterPreference /> {!disableNavigation('task', taskSlider) && } diff --git a/src/pages/transactions/index/Transactions.tsx b/src/pages/transactions/index/Transactions.tsx index 9cfb3f5bf6..2a2c500c07 100644 --- a/src/pages/transactions/index/Transactions.tsx +++ b/src/pages/transactions/index/Transactions.tsx @@ -105,6 +105,7 @@ export default function Transactions() { withResourcefulActions linkToCreateGuards={[permission('create_bank_transaction')]} hideEditableOptions={!hasPermission('edit_bank_transaction')} + enableSavingFilterPreference /> diff --git a/src/pages/vendors/index/Vendors.tsx b/src/pages/vendors/index/Vendors.tsx index 92ee496299..07f8ec6673 100644 --- a/src/pages/vendors/index/Vendors.tsx +++ b/src/pages/vendors/index/Vendors.tsx @@ -71,6 +71,7 @@ export default function Vendors() { } linkToCreateGuards={[permission('create_vendor')]} hideEditableOptions={!hasPermission('edit_vendor')} + enableSavingFilterPreference /> );