mirror of
https://github.com/discourse/discourse.git
synced 2024-11-26 11:33:44 +08:00
2d2329095c
Followup to 67a8080e33
This commit makes it so the topic footer button for bookmarks
uses the new BookmarkMenu component, and makes some tweaks to
that component to allow for a label and CSS class options.
Also introduces a TopicBookmarkManager to manage the saving/editing/
deleting of the topic level bookmarks and the reactivity that happens
in the topic UI afterward.
Next commit should rip out old bookmark associated code in the
topic controller as it will no longer be needed.
---------
Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
175 lines
6.8 KiB
Ruby
175 lines
6.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
describe "Bookmarking posts and topics", type: :system do
|
|
fab!(:topic)
|
|
fab!(:current_user) { Fabricate(:user, refresh_auto_groups: true) }
|
|
fab!(:post) { Fabricate(:post, topic: topic, raw: "This is some post to bookmark") }
|
|
fab!(:post_2) { Fabricate(:post, topic: topic, raw: "Some interesting post content") }
|
|
|
|
let(:timezone) { "Australia/Brisbane" }
|
|
let(:cdp) { PageObjects::CDP.new }
|
|
let(:topic_page) { PageObjects::Pages::Topic.new }
|
|
let(:bookmark_modal) { PageObjects::Modals::Bookmark.new }
|
|
let(:bookmark_menu) { PageObjects::Components::BookmarkMenu.new }
|
|
|
|
before do
|
|
current_user.user_option.update!(timezone: timezone)
|
|
sign_in(current_user)
|
|
end
|
|
|
|
def visit_topic_and_open_bookmark_menu(post, expand_actions: true)
|
|
topic_page.visit_topic(topic)
|
|
open_bookmark_menu(post, expand_actions: expand_actions)
|
|
end
|
|
|
|
def open_bookmark_menu(post, expand_actions: true)
|
|
topic_page.expand_post_actions(post) if expand_actions
|
|
topic_page.click_post_action_button(post, :bookmark)
|
|
end
|
|
|
|
it "creates a bookmark on the post as soon as the bookmark button is clicked" do
|
|
visit_topic_and_open_bookmark_menu(post)
|
|
|
|
expect(bookmark_menu).to be_open
|
|
expect(page).to have_content(I18n.t("js.bookmarks.bookmarked_success"))
|
|
expect(topic_page).to have_post_bookmarked(post, with_reminder: false)
|
|
expect(Bookmark.find_by(bookmarkable: post, user: current_user)).to be_truthy
|
|
end
|
|
|
|
it "updates the created bookmark with a selected reminder option from the bookmark menu" do
|
|
visit_topic_and_open_bookmark_menu(post)
|
|
|
|
expect(bookmark_menu).to be_open
|
|
expect(page).to have_content(I18n.t("js.bookmarks.bookmarked_success"))
|
|
|
|
bookmark_menu.click_menu_option("tomorrow")
|
|
|
|
expect(topic_page).to have_post_bookmarked(post, with_reminder: true)
|
|
expect(page).to have_no_css(".bookmark-menu-content.-expanded")
|
|
expect(Bookmark.find_by(bookmarkable: post, user: current_user).reminder_at).not_to be_blank
|
|
end
|
|
|
|
it "can set a reminder from the bookmark modal using the custom bookmark menu option" do
|
|
visit_topic_and_open_bookmark_menu(post)
|
|
bookmark_menu.click_menu_option("custom")
|
|
bookmark_modal.select_preset_reminder(:tomorrow)
|
|
expect(topic_page).to have_post_bookmarked(post, with_reminder: true)
|
|
expect(Bookmark.find_by(bookmarkable: post, user: current_user).reminder_at).not_to be_blank
|
|
end
|
|
|
|
it "allows choosing a different auto_delete_preference to the user preference and remembers it when reopening the modal" do
|
|
current_user.user_option.update!(
|
|
bookmark_auto_delete_preference: Bookmark.auto_delete_preferences[:on_owner_reply],
|
|
)
|
|
visit_topic_and_open_bookmark_menu(post_2)
|
|
bookmark_menu.click_menu_option("custom")
|
|
expect(bookmark_modal).to be_open
|
|
|
|
# TODO (martin) Not sure why, but I need to click this twice for the panel to open :/
|
|
bookmark_modal.open_options_panel
|
|
bookmark_modal.open_options_panel
|
|
|
|
expect(bookmark_modal).to have_auto_delete_preference(
|
|
Bookmark.auto_delete_preferences[:on_owner_reply],
|
|
)
|
|
bookmark_modal.select_auto_delete_preference(Bookmark.auto_delete_preferences[:clear_reminder])
|
|
bookmark_modal.save
|
|
expect(topic_page).to have_post_bookmarked(post_2, with_reminder: false)
|
|
topic_page.click_post_action_button(post_2, :bookmark)
|
|
bookmark_menu.click_menu_option("edit")
|
|
expect(bookmark_modal).to have_open_options_panel
|
|
expect(bookmark_modal).to have_auto_delete_preference(
|
|
Bookmark.auto_delete_preferences[:clear_reminder],
|
|
)
|
|
end
|
|
|
|
it "opens the bookmark modal with the Custom... option only after the bookmark saves on slow connections" do
|
|
topic_page.visit_topic(topic)
|
|
|
|
cdp.with_slow_upload do
|
|
open_bookmark_menu(post)
|
|
bookmark_menu.click_menu_option("custom")
|
|
end
|
|
|
|
expect(bookmark_modal).to be_open
|
|
end
|
|
|
|
describe "topic level bookmarks" do
|
|
it "allows the topic to be bookmarked" do
|
|
topic_page.visit_topic(topic)
|
|
topic_page.click_topic_bookmark_button
|
|
expect(topic_page).to have_topic_bookmarked(topic)
|
|
expect(Bookmark.exists?(bookmarkable: topic, user: current_user)).to be_truthy
|
|
end
|
|
|
|
it "opens the edit bookmark modal from the topic bookmark button and saves edits" do
|
|
bookmark = Fabricate(:bookmark, bookmarkable: topic, user: current_user)
|
|
topic_page.visit_topic(topic)
|
|
topic_page.click_topic_bookmark_button
|
|
bookmark_menu.click_menu_option("edit")
|
|
expect(bookmark_modal).to be_open
|
|
expect(bookmark_modal).to be_editing_id(bookmark.id)
|
|
bookmark_modal.fill_name("something important")
|
|
bookmark_modal.click_primary_button
|
|
|
|
try_until_success(frequency: 0.5) do
|
|
expect(bookmark.reload.name).to eq("something important")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "editing existing bookmarks" do
|
|
fab!(:bookmark) do
|
|
Fabricate(
|
|
:bookmark,
|
|
bookmarkable: post_2,
|
|
user: current_user,
|
|
name: "test name",
|
|
reminder_at: 10.days.from_now,
|
|
)
|
|
end
|
|
|
|
it "prefills the name of the bookmark and the custom reminder date and time" do
|
|
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
|
|
bookmark_menu.click_menu_option("edit")
|
|
expect(bookmark_modal).to have_open_options_panel
|
|
expect(bookmark_modal.name.value).to eq("test name")
|
|
expect(bookmark_modal.existing_reminder_alert).to have_content(
|
|
bookmark_modal.existing_reminder_alert_message(bookmark),
|
|
)
|
|
expect(bookmark_modal.custom_date_picker.value).to eq(
|
|
bookmark.reminder_at_in_zone(timezone).strftime("%Y-%m-%d"),
|
|
)
|
|
expect(bookmark_modal.custom_time_picker.value).to eq(
|
|
bookmark.reminder_at_in_zone(timezone).strftime("%H:%M"),
|
|
)
|
|
expect(bookmark_modal).to have_active_preset("custom")
|
|
end
|
|
|
|
it "can delete the bookmark" do
|
|
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
|
|
bookmark_menu.click_menu_option("edit")
|
|
bookmark_modal.delete
|
|
bookmark_modal.confirm_delete
|
|
expect(topic_page).to have_no_post_bookmarked(post_2)
|
|
end
|
|
|
|
it "can delete the bookmark from within the menu" do
|
|
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
|
|
bookmark_menu.click_menu_option("delete")
|
|
expect(topic_page).to have_no_post_bookmarked(post_2)
|
|
end
|
|
|
|
it "does not save edits when pressing cancel" do
|
|
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
|
|
bookmark_menu.click_menu_option("edit")
|
|
bookmark_modal.fill_name("something important")
|
|
bookmark_modal.cancel
|
|
topic_page.click_post_action_button(post_2, :bookmark)
|
|
bookmark_menu.click_menu_option("edit")
|
|
expect(bookmark_modal.name.value).to eq("something important")
|
|
expect(bookmark.reload.name).to eq("test name")
|
|
end
|
|
end
|
|
end
|