From 56e39827107157964d766d313126ff42fec40b29 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 24 Aug 2023 19:24:17 +0200 Subject: [PATCH] Do no reset Tabulator if DataFrame indexes are unchanged --- panel/widgets/tables.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/panel/widgets/tables.py b/panel/widgets/tables.py index 19ae7c08fb..6eebca2f81 100644 --- a/panel/widgets/tables.py +++ b/panel/widgets/tables.py @@ -1388,15 +1388,32 @@ def _get_model_children(self, panels, doc, root, parent, comm=None): models[i] = model return models + def _indexes_changed(self, old, new): + """ + Comparator that checks whether DataFrame indexes have changed. + + If indexes and length are unchanged we assume we do not + have to reset various settings including expanded rows, + scroll position, pagination etc. + """ + if type(old) != type(new) or isinstance(new, dict): + return True + elif len(old) != len(new): + return False + return (old.index == new.index).all() + def _update_children(self, *events): cleanup, reuse = set(), set() - page_events = ('page', 'page_size', 'value', 'pagination') + page_events = ('page', 'page_size', 'pagination') for event in events: if event.name == 'expanded' and len(events) == 1: cleanup = set(event.old) - set(event.new) reuse = set(event.old) & set(event.new) - elif ((event.name in page_events and not self._updating) or - (self.pagination == 'remote' and event.name == 'sorters')): + elif ( + (event.name == 'value' and self._indexes_changed(event.old, event.new)) or + (event.name in page_events and not self._updating) or + (self.pagination == 'remote' and event.name == 'sorters') + ): self.expanded = [] return old_panels = self._child_panels