discourse/spec/system/page_objects/pages/category.rb
Alan Guo Xiang Tan f3914e4018
UX: Add dedicated moderation tab to simplified category editor (#39280)
Moderation settings (topic/reply approval, slow mode, auto-close,
auto-bump) are currently buried inside the Settings tab in the
simplified category editor. A dedicated tab makes these settings more
discoverable.

This commit extracts the moderation section into its own tab, visible in
the advanced tabs section after "Settings". Only the simplified layout
is affected since the legacy layout is about to be removed.
2026-04-15 16:24:13 +08:00

231 lines
6.1 KiB
Ruby

# frozen_string_literal: true
module PageObjects
module Pages
class Category < PageObjects::Pages::Base
def visit(category)
page.visit("/c/#{category.id}")
self
end
def visit_settings(category)
page.visit("/c/#{category.slug}/edit/settings")
self
end
def visit_moderation(category)
page.visit("/c/#{category.slug}/edit/moderation")
self
end
def visit_general(category, subcategory = nil)
if subcategory
page.visit("/c/#{category.slug}/#{subcategory.slug}/edit/general")
else
page.visit("/c/#{category.slug}/edit/general")
end
self
end
def visit_edit_template(category)
page.visit("/c/#{category.slug}/edit/topic-template")
self
end
def visit_edit_localizations(category)
page.visit("/c/#{category.slug}/edit/localizations")
end
def visit_categories
page.visit("/categories")
self
end
def visit_new_category
page.visit("/new-category/setup")
self
end
def visit_security(category)
page.visit("/c/#{category.slug}/edit/security")
self
end
def visit_tags(category)
page.visit("/c/#{category.slug}/edit/tags")
self
end
def visit_appearance(category)
visit_images(category)
self
end
def visit_images(category)
page.visit("/c/#{category.slug}/edit/images")
self
end
def back_to_category
find(".edit-category .back-button").click
self
end
def save_settings
if page.has_css?(".admin-changes-banner", wait: 0)
find(".admin-changes-banner .btn-primary").click
else
find("#save-category").click
end
self
end
def toggle_setting(setting, text = "")
find(".edit-category-tab .#{setting} label.checkbox-label", text: text, visible: :all).click
self
end
def has_form_template_enabled?
find(".d-toggle-switch .toggle-template-type", visible: false)["aria-checked"] == "true"
end
D_EDITOR_SELECTOR = ".d-editor"
def has_d_editor?
page.has_selector?(D_EDITOR_SELECTOR)
end
def has_no_d_editor?
page.has_no_selector?(D_EDITOR_SELECTOR)
end
def has_selected_template?(template_name)
has_css?(".select-category-template .select-kit-header[data-name='#{template_name}']")
end
def toggle_form_templates
PageObjects::Components::DToggleSwitch.new(".toggle-template-type").toggle
self
end
def toggle_advanced_settings
PageObjects::Components::DToggleSwitch.new(".d-toggle-switch__checkbox").toggle
self
end
def toggle_checkbox(label_text)
find("label.checkbox-label", text: label_text).click
self
end
def toggle_form_container(title)
find(".form-kit__container", text: title).find("label.d-toggle-switch__label").click
self
end
def select_form_template(template_name)
find(".select-category-template").click
find(".select-kit-collection .select-kit-row", text: template_name).click
find(".select-category-template").click
end
def new_topic_button
find("#create-topic")
end
def category_box(category)
find(".category-boxes .category-box[data-category-id='#{category.id}']")
end
CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR = ".category-navigation .nav-item_new"
def has_no_new_topics?
page.has_no_css?(CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR)
end
def has_new_topics?
page.has_css?(CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR)
end
def click_new
page.find(CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR).click
end
def click_setting_tab(name)
find(".edit-category-nav .edit-category-#{name}").click
self
end
def click_edit_category
find(".navigation-controls .edit-category").click
self
end
def has_public_access_message?
page.has_content?(
I18n.t(
"js.category.permissions.everyone_full_access",
everyone_group: ::Group[:everyone].name,
),
)
end
def has_no_public_access_message?
page.has_no_content?(
I18n.t(
"js.category.permissions.everyone_full_access",
everyone_group: ::Group[:everyone].name,
),
)
end
def has_setting_tab?(tab_name)
tab_css = ".edit-category-#{tab_name}"
page.has_css?(tab_css)
end
def has_no_setting_tab?(tab_name)
tab_css = ".edit-category-#{tab_name}"
page.has_no_css?(tab_css)
end
def has_category_title?(title)
page.has_css?(".category-header h1", text: title)
end
def topic_posting_review_mode_chooser(simplified: true)
if simplified
PageObjects::Components::SelectKit.new(
".form-kit__field[data-name='category_setting.topic_posting_review_mode'] .combo-box",
)
else
PageObjects::Components::SelectKit.new(".topic-posting-review-mode .combo-box")
end
end
def topic_posting_review_group_chooser(simplified: true)
if simplified
PageObjects::Components::SelectKit.new(".form-kit .group-chooser")
else
PageObjects::Components::SelectKit.new(".topic-posting-review-mode .group-chooser")
end
end
def has_posting_review_groups_error?
page.has_content?(I18n.t("js.category.validations.groups_required"))
end
def has_no_posting_review_groups_error?
page.has_no_content?(I18n.t("js.category.validations.groups_required"))
end
def has_topic_posting_review_mode?(mode, simplified: true)
topic_posting_review_mode_chooser(simplified: simplified).has_selected_value?(mode)
end
def has_topic_posting_review_groups?(group, simplified: true)
topic_posting_review_group_chooser(simplified: simplified).has_selected_value?(group.id)
end
end
end
end