mirror of
https://github.com/discourse/discourse.git
synced 2025-02-10 05:14:59 +00:00
This commit extracts the storage part of the route-scroll-manager into a dedicated service. This provides a key/value store which will reset for each navigation, and restore previous values when the user uses the back/forward buttons in their browser. This gives us a reliable replacement for the old `DiscourseRoute.isPoppedState` function, which would not work under all situations. Previously reverted in e6370decfdcb87737e76b21fe1bbe033af08afaa. This version has been significantly refactored, and includes an additional system spec for the issue we identified.
107 lines
3.5 KiB
Ruby
107 lines
3.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
describe "Topic list focus", type: :system do
|
|
fab!(:topics) { Fabricate.times(10, :post).map(&:topic) }
|
|
|
|
before_all do
|
|
sidebar_url = Fabricate(:sidebar_url, name: "my topic link", value: "/t/#{topics[4].id}")
|
|
|
|
Fabricate(
|
|
:sidebar_section_link,
|
|
sidebar_section:
|
|
SidebarSection.find_by(section_type: SidebarSection.section_types[:community]),
|
|
linkable: sidebar_url,
|
|
)
|
|
end
|
|
|
|
let(:discovery) { PageObjects::Pages::Discovery.new }
|
|
let(:topic) { PageObjects::Pages::Topic.new }
|
|
|
|
def focussed_topic_id
|
|
page.evaluate_script(
|
|
"document.activeElement.closest('.topic-list-item')?.dataset.topicId",
|
|
)&.to_i
|
|
end
|
|
|
|
it "refocusses last clicked topic when going back to topic list" do
|
|
visit("/latest")
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(discovery.topic_list).to have_topics
|
|
|
|
# Click a topic
|
|
discovery.topic_list.visit_topic(topics[5])
|
|
expect(topic).to have_topic_title(topics[5].title)
|
|
|
|
# Going back to the topic-list should re-focus
|
|
page.go_back
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(focussed_topic_id).to eq(topics[5].id)
|
|
|
|
# Click topic again
|
|
discovery.topic_list.visit_topic(topics[5])
|
|
expect(topic).to have_topic_title(topics[5].title)
|
|
|
|
# Visiting a topic list another way should not focus
|
|
find(".sidebar-section-link[data-link-name='everything']").click
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(focussed_topic_id).to eq(nil)
|
|
end
|
|
|
|
it "refocusses properly when navigating via the 'last activity' link" do
|
|
visit("/latest")
|
|
|
|
# Visit topic via activity column and keyboard
|
|
discovery.topic_list.visit_topic_last_reply_via_keyboard(topics[2])
|
|
expect(topic).to have_topic_title(topics[2].title)
|
|
|
|
# Going back to the topic-list should re-focus
|
|
page.go_back
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(focussed_topic_id).to eq(topics[2].id)
|
|
|
|
# Visit topic via keyboard using posts map (OP button)
|
|
discovery.topic_list.visit_topic_first_reply_via_keyboard(topics[4])
|
|
expect(topic).to have_topic_title(topics[4].title)
|
|
|
|
# Going back to the topic-list should re-focus
|
|
page.go_back
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(focussed_topic_id).to eq(topics[4].id)
|
|
end
|
|
|
|
it "does not refocus topic when visiting via something other than topic list" do
|
|
visit("/latest")
|
|
|
|
# Clicking sidebar link should visit topic
|
|
find(".sidebar-section-link[data-link-name='my topic link']").click
|
|
expect(topic).to have_topic_title(topics[4].title)
|
|
|
|
# Going back to the topic-list should not re-focus
|
|
page.go_back
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(focussed_topic_id).to eq(nil)
|
|
end
|
|
|
|
it "refocusses properly when there are multiple pages of topics" do
|
|
extra_topics = Fabricate.times(25, :post).map(&:topic)
|
|
oldest_topic = Fabricate(:post).topic
|
|
oldest_topic.update(bumped_at: 1.day.ago)
|
|
|
|
visit("/latest")
|
|
|
|
# Scroll to bottom for infinite load
|
|
page.execute_script <<~JS
|
|
document.querySelectorAll('.topic-list-item')[24].scrollIntoView(true);
|
|
JS
|
|
|
|
# Click a topic
|
|
discovery.topic_list.visit_topic(oldest_topic)
|
|
expect(topic).to have_topic_title(oldest_topic.title)
|
|
|
|
# Going back to the topic-list should re-focus
|
|
page.go_back
|
|
expect(page).to have_css("body.navigation-topics")
|
|
expect(focussed_topic_id).to eq(oldest_topic.id)
|
|
end
|
|
end
|