panel icon indicating copy to clipboard operation
panel copied to clipboard

Tabulator with frozen_rows scrolling/paging to top when updating content

Open sylvaint opened this issue 9 months ago • 0 comments

ALL software version info

panel 1.4.2

Description of expected behavior and the observed behavior

With Tabulator using pagination and frozen_rows. When updating the data, the page snaps back to page 1 regardless of where the paging was whenever the update comes. Removing the frozen row, it behaves as expected.

Same behavior without paging using a scrollbar in Tabulator instead.

Also same behavior when using patch instead of writing the complete dataframe.

Complete, minimal, self-contained example code that reproduces the issue

import panel as pn
import numpy as np
import pandas as pd

pn.extension('tabulator')

def create_random_dataframe(n_rows):
    """Create a DataFrame with n_rows and 5 columns, where the first column is a constant 1 to n_rows and the rest are filled with random numbers."""
    # Define the column names
    columns = ['A', 'B', 'C', 'D', 'E']
    # Generate a DataFrame with the first column being 1 to n_rows and the rest random
    df = pd.DataFrame(np.random.rand(n_rows, 4), columns=columns[1:])
    df.insert(0, 'A', range(1, n_rows + 1))  # Insert the constant column at position 0 with values 1 to n_rows
    return df

df_data = create_random_dataframe(50)

# with frozen_rows 0, Tabulator will snap back to page 1 at every update
df_tab = pn.widgets.Tabulator(df_data,hidden_columns=['index'], layout='fit_data_fill', frozen_rows=[0], sortable=False, disabled=True, pagination='local', page_size=10)

# without frozen_rows set to 0 Tabulator will remain in whatever page it was after an update
# df_tab = pn.widgets.Tabulator(df_data,hidden_columns=['index'], layout='fit_data_fill', sortable=False, disabled=True, pagination='local', page_size=10)

def update_data():
    df_data = create_random_dataframe(50)
    df_tab.value = df_data

pn.state.add_periodic_callback(update_data, period=2000, start=True)

layout = pn.template.FastListTemplate(
    site="my site",
    title="Tabulator",
    accent_base_color='#d78929',
    header_background='#d78929',
    main=[pn.Column(df_tab)],
)
layout.servable()

Screenshots or screencasts of the bug in action

https://github.com/holoviz/panel/assets/5510517/f5997620-e3be-4a59-8077-4fb0bb6583be

https://github.com/holoviz/panel/assets/5510517/4a1318d1-b357-4c36-ac5e-b7fd6aa84a02

sylvaint avatar Apr 29 '24 16:04 sylvaint