diff --git a/frontend/src/AppBuilder/Widgets/NewTable/Table.jsx b/frontend/src/AppBuilder/Widgets/NewTable/Table.jsx index ad0631803b..1d30da2a98 100644 --- a/frontend/src/AppBuilder/Widgets/NewTable/Table.jsx +++ b/frontend/src/AppBuilder/Widgets/NewTable/Table.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo, memo } from 'react'; +import React, { useEffect, useMemo, memo, useRef } from 'react'; // eslint-disable-next-line import/no-unresolved import { diff } from 'deep-object-diff'; import { shallow } from 'zustand/shallow'; @@ -19,7 +19,7 @@ export const Table = memo( const setTableEvents = useTableStore((state) => state.setTableEvents, shallow); const setTableStyles = useTableStore((state) => state.setTableStyles, shallow); const setColumnDetails = useTableStore((state) => state.setColumnDetails, shallow); - const getColumnTransformations = useTableStore((state) => state.getColumnTransformations, shallow); + const transformations = useTableStore((state) => state.getColumnTransformations(id), shallow); // get table properties const visibility = useTableStore((state) => state.getTableProperties(id)?.visibility, shallow); @@ -44,11 +44,12 @@ export const Table = memo( } = properties; const firstRowOfTable = !isEmpty(restOfProperties.data?.[0]) ? restOfProperties.data?.[0] : undefined; - const transformations = getColumnTransformations(id); // Get all app events. Needed for certain events like onBulkUpdate const allAppEvents = useEvents(); + const shouldAutogenerateColumns = useRef(false); + // Initialize component on the table store useEffect(() => { initializeComponent(id); @@ -65,6 +66,10 @@ export const Table = memo( setTableActions(id, actions); }, [id, actions, setTableActions]); + useEffect(() => { + if (useDynamicColumn) shouldAutogenerateColumns.current = true; + }, [firstRowOfTable, useDynamicColumn, columnData]); + // Set column details to the table store. This is responsible for auto-generating columns useEffect(() => { setColumnDetails( @@ -74,8 +79,10 @@ export const Table = memo( columnData, firstRowOfTable, autogenerateColumns, - columnDeletionHistory + columnDeletionHistory, + shouldAutogenerateColumns.current ); + shouldAutogenerateColumns.current = false; }, [ id, columns, diff --git a/frontend/src/AppBuilder/Widgets/NewTable/_components/TableContainer/TableContainer.jsx b/frontend/src/AppBuilder/Widgets/NewTable/_components/TableContainer/TableContainer.jsx index dcdaf1fadb..15987f2576 100644 --- a/frontend/src/AppBuilder/Widgets/NewTable/_components/TableContainer/TableContainer.jsx +++ b/frontend/src/AppBuilder/Widgets/NewTable/_components/TableContainer/TableContainer.jsx @@ -1,4 +1,4 @@ -import React, { useState, useMemo, useEffect, useRef, useCallback, memo } from 'react'; +import React, { useState, useMemo, useEffect, useRef, useCallback } from 'react'; import useTableStore from '../../_stores/tableStore'; import TableExposedVariables from '../TableExposedVariables'; import Header from '../Header'; diff --git a/frontend/src/AppBuilder/Widgets/NewTable/_components/TableData/TableData.jsx b/frontend/src/AppBuilder/Widgets/NewTable/_components/TableData/TableData.jsx index 98e1c1a90d..aa9cd74a87 100644 --- a/frontend/src/AppBuilder/Widgets/NewTable/_components/TableData/TableData.jsx +++ b/frontend/src/AppBuilder/Widgets/NewTable/_components/TableData/TableData.jsx @@ -104,6 +104,7 @@ export const TableData = ({ } else if (data.length === 0) { return (
+ {renderTableHeader()}
); diff --git a/frontend/src/AppBuilder/Widgets/NewTable/_hooks/useTable.js b/frontend/src/AppBuilder/Widgets/NewTable/_hooks/useTable.js index b622b0a87f..b31c258cf1 100644 --- a/frontend/src/AppBuilder/Widgets/NewTable/_hooks/useTable.js +++ b/frontend/src/AppBuilder/Widgets/NewTable/_hooks/useTable.js @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useState, useMemo } from 'react'; import { getCoreRowModel, useReactTable, @@ -30,8 +30,12 @@ export function useTable({ const [columnFilters, setColumnFilters] = useState([]); const [columnOrder, setColumnOrder] = useState(columns.map((column) => column.id)); + // When the columns change, the data is not getting re-rendered. So, we need to create a new data array + // eslint-disable-next-line react-hooks/exhaustive-deps + const newData = useMemo(() => [...data], [data, columns]); + const table = useReactTable({ - data, + data: newData, columns, enableSorting, getCoreRowModel: getCoreRowModel(), diff --git a/frontend/src/AppBuilder/Widgets/NewTable/_stores/slices/columnSlice.js b/frontend/src/AppBuilder/Widgets/NewTable/_stores/slices/columnSlice.js index 7ac2680fee..6663f4f2f9 100644 --- a/frontend/src/AppBuilder/Widgets/NewTable/_stores/slices/columnSlice.js +++ b/frontend/src/AppBuilder/Widgets/NewTable/_stores/slices/columnSlice.js @@ -13,7 +13,8 @@ export const createColumnSlice = (set, get) => ({ columnData, firstRowOfTable, autogenerateColumnsFlag, - columnDeletionHistory + columnDeletionHistory, + shouldAutogenerateColumns ) => { set( (state) => { @@ -23,19 +24,30 @@ export const createColumnSlice = (set, get) => ({ state.components[id].columnDetails.columnData = columnData ?? []; } else { state.components[id].columnDetails.useDynamicColumn = false; - state.components[id].columnDetails.columnProperties = removeNullValues(columns); } - const columnProperties = get().generateColumns( - id, - columns, - firstRowOfTable, - isDynamicColumnSelected, - autogenerateColumnsFlag, - columnDeletionHistory, - columnData - ); - state.components[id].columnDetails.columnProperties = columnProperties; - state.components[id].columnDetails.transformations = get().generateColumnTransformations(id, columnProperties); + if (shouldAutogenerateColumns) { + const columnProperties = get().generateColumns( + id, + columns, + firstRowOfTable, + isDynamicColumnSelected, + autogenerateColumnsFlag, + columnDeletionHistory, + columnData + ); + state.components[id].columnDetails.columnProperties = columnProperties; + state.components[id].columnDetails.transformations = get().generateColumnTransformations( + id, + columnProperties + ); + } else { + const columnProperties = removeNullValues(columns); + state.components[id].columnDetails.columnProperties = columnProperties; + state.components[id].columnDetails.transformations = get().generateColumnTransformations( + id, + columnProperties + ); + } }, false, { type: 'setColumnDetails', payload: { id, columns, useDynamicColumn, columnData } } @@ -74,10 +86,12 @@ export const createColumnSlice = (set, get) => ({ generateColumnTransformations: (id, columnProperties) => { const transformations = columnProperties .filter((column) => column.transformation && column.transformation != '{{cellValue}}') - .map((column) => ({ - key: column.key ? column.key : column.name, - transformation: column.transformation, - })); + .map((column) => { + return { + key: column.key ? column.key : column.name, + transformation: column.transformation, + }; + }); const existingTransformations = get().getColumnTransformations(id); if (!isEqual(existingTransformations, transformations)) { return transformations;