From b245bbb8d64bd5becc2d28574945bbb63c3b1872 Mon Sep 17 00:00:00 2001 From: Andrew <15331990+ahuang11@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:08:41 -0800 Subject: [PATCH] Fix visible range on objects set in Feed (#7673) --- panel/layout/feed.py | 12 +++++++++++- panel/tests/ui/layout/test_feed.py | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/panel/layout/feed.py b/panel/layout/feed.py index eeec31dfc9..fa172732d4 100644 --- a/panel/layout/feed.py +++ b/panel/layout/feed.py @@ -6,7 +6,7 @@ import param from ..models.feed import Feed as PnFeed, ScrollButtonClick, ScrollLatestEvent -from ..util import edit_readonly +from ..util import edit_readonly, isIn from .base import Column if TYPE_CHECKING: @@ -154,6 +154,16 @@ def _get_objects( self, model: Model, old_objects: list[Viewable], doc: Document, root: Model, comm: Comm | None = None ): + # If no previously visible objects are visible now, reset the visible range + events = self._in_process__events.get(doc, {}) + if ( + self._last_synced and + 'visible_range' not in events and + not any(isIn(old_objects[i], self.objects) for i in range(*self._last_synced)) + ): + with edit_readonly(self): + self.visible_range = None + from ..pane.base import RerenderError new_models, old_models = [], [] self._last_synced = self._synced_range diff --git a/panel/tests/ui/layout/test_feed.py b/panel/tests/ui/layout/test_feed.py index 4e6e6fe1ff..adb826c9e3 100644 --- a/panel/tests/ui/layout/test_feed.py +++ b/panel/tests/ui/layout/test_feed.py @@ -160,3 +160,17 @@ def test_feed_dynamic_objects(page): wait_until(lambda: expect(page.locator('pre').first).to_have_text('0')) wait_until(lambda: page.locator('pre').count() > 10, page) + +def test_feed_reset_visible_range(page): + feed = Feed(*list(range(ITEMS)), load_buffer=20, height=50, view_latest=True) + serve_component(page, feed) + + wait_until(lambda: int(page.locator('pre').last.inner_text() or 0) == 99, page) + + # set objects to 20 + feed.objects = feed.objects[:20] + + # assert view reset + wait_until(lambda: ( + int(page.locator('pre').last.inner_text() or 0) == 19 + ), page)