FEATURE: default sidebar categories and tags (#17939)
Ability to set up default sidebar categories and tags for authenticated users
This commit is contained in:
parent
49fa2e93c2
commit
caab916569
|
@ -109,7 +109,7 @@ class User < ActiveRecord::Base
|
||||||
|
|
||||||
has_many :sidebar_section_links, dependent: :delete_all
|
has_many :sidebar_section_links, dependent: :delete_all
|
||||||
has_many :category_sidebar_section_links, -> { where(linkable_type: "Category") }, class_name: 'SidebarSectionLink'
|
has_many :category_sidebar_section_links, -> { where(linkable_type: "Category") }, class_name: 'SidebarSectionLink'
|
||||||
has_many :sidebar_tags, through: :sidebar_section_links, source: :linkable, source_type: "Tag"
|
has_many :custom_sidebar_tags, through: :sidebar_section_links, source: :linkable, source_type: "Tag"
|
||||||
|
|
||||||
delegate :last_sent_email_address, to: :email_logs
|
delegate :last_sent_email_address, to: :email_logs
|
||||||
|
|
||||||
|
@ -1660,6 +1660,14 @@ class User < ActiveRecord::Base
|
||||||
Discourse.redis.del("#{REDESIGN_USER_MENU_REDIS_KEY_PREFIX}#{self.id}")
|
Discourse.redis.del("#{REDESIGN_USER_MENU_REDIS_KEY_PREFIX}#{self.id}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sidebar_categories_ids
|
||||||
|
categories_ids = category_sidebar_section_links.pluck(:linkable_id)
|
||||||
|
if categories_ids.blank? && SiteSetting.default_sidebar_categories.present?
|
||||||
|
return guardian.allowed_category_ids & SiteSetting.default_sidebar_categories.split("|").map(&:to_i)
|
||||||
|
end
|
||||||
|
categories_ids
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def badge_grant
|
def badge_grant
|
||||||
|
@ -1952,6 +1960,15 @@ class User < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sidebar_tags
|
||||||
|
return custom_sidebar_tags if custom_sidebar_tags.present?
|
||||||
|
if SiteSetting.default_sidebar_tags.present?
|
||||||
|
tag_names = SiteSetting.default_sidebar_tags.split("|") - DiscourseTagging.hidden_tag_names(guardian)
|
||||||
|
return Tag.where(name: tag_names)
|
||||||
|
end
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
def self.ensure_consistency!
|
def self.ensure_consistency!
|
||||||
DB.exec <<~SQL
|
DB.exec <<~SQL
|
||||||
UPDATE users
|
UPDATE users
|
||||||
|
|
|
@ -76,7 +76,6 @@ class CurrentUserSerializer < BasicUserSerializer
|
||||||
:pending_posts_count,
|
:pending_posts_count,
|
||||||
:status,
|
:status,
|
||||||
:sidebar_category_ids,
|
:sidebar_category_ids,
|
||||||
:sidebar_tags,
|
|
||||||
:likes_notifications_disabled,
|
:likes_notifications_disabled,
|
||||||
:grouped_unread_high_priority_notifications,
|
:grouped_unread_high_priority_notifications,
|
||||||
:redesigned_user_menu_enabled
|
:redesigned_user_menu_enabled
|
||||||
|
@ -309,7 +308,7 @@ class CurrentUserSerializer < BasicUserSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def sidebar_category_ids
|
def sidebar_category_ids
|
||||||
object.category_sidebar_section_links.pluck(:linkable_id)
|
object.sidebar_categories_ids
|
||||||
end
|
end
|
||||||
|
|
||||||
def include_sidebar_category_ids?
|
def include_sidebar_category_ids?
|
||||||
|
|
|
@ -2380,6 +2380,8 @@ en:
|
||||||
suggest_weekends_in_date_pickers: "Include weekends (Saturday and Sunday) in date picker suggestions (disable this if you use Discourse only on weekdays, Monday through Friday)."
|
suggest_weekends_in_date_pickers: "Include weekends (Saturday and Sunday) in date picker suggestions (disable this if you use Discourse only on weekdays, Monday through Friday)."
|
||||||
|
|
||||||
splash_screen: "Displays a temporary loading screen while site assets load"
|
splash_screen: "Displays a temporary loading screen while site assets load"
|
||||||
|
default_sidebar_categories: "Selected categories will be displayed under Sidebar's Categories section by default."
|
||||||
|
default_sidebar_tags: "Selected tags will be displayed under Sidebar's Tags section by default."
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
invalid_css_color: "Invalid color. Enter a color name or hex value."
|
invalid_css_color: "Invalid color. Enter a color name or hex value."
|
||||||
|
|
|
@ -1994,6 +1994,14 @@ developer:
|
||||||
enable_sidebar:
|
enable_sidebar:
|
||||||
default: true
|
default: true
|
||||||
client: true
|
client: true
|
||||||
|
default_sidebar_categories:
|
||||||
|
type: category_list
|
||||||
|
default: ""
|
||||||
|
client: true
|
||||||
|
default_sidebar_tags:
|
||||||
|
type: tag_list
|
||||||
|
default: ""
|
||||||
|
client: true
|
||||||
|
|
||||||
embedding:
|
embedding:
|
||||||
embed_by_username:
|
embed_by_username:
|
||||||
|
|
|
@ -221,10 +221,15 @@ RSpec.describe CurrentUserSerializer do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#sidebar_tags' do
|
describe '#sidebar_tags' do
|
||||||
fab!(:tag_sidebar_section_link) { Fabricate(:tag_sidebar_section_link, user: user) }
|
fab!(:tag_1) { Fabricate(:tag, name: "foo") }
|
||||||
fab!(:tag_sidebar_section_link_2) { Fabricate(:tag_sidebar_section_link, user: user) }
|
fab!(:tag_2) { Fabricate(:tag, name: "bar") }
|
||||||
|
fab!(:hidden_tag) { Fabricate(:tag, name: "secret") }
|
||||||
|
fab!(:staff_tag_group) { Fabricate(:tag_group, permissions: { "staff" => 1 }, tag_names: ["secret"]) }
|
||||||
|
let(:tag_sidebar_section_link) { Fabricate(:tag_sidebar_section_link, user: user) }
|
||||||
|
let(:tag_sidebar_section_link_2) { Fabricate(:tag_sidebar_section_link, user: user) }
|
||||||
|
|
||||||
it "is not included when experimental sidebar has not been enabled" do
|
it "is not included when experimental sidebar has not been enabled" do
|
||||||
|
tag_sidebar_section_link
|
||||||
SiteSetting.enable_experimental_sidebar_hamburger = false
|
SiteSetting.enable_experimental_sidebar_hamburger = false
|
||||||
SiteSetting.tagging_enabled = true
|
SiteSetting.tagging_enabled = true
|
||||||
|
|
||||||
|
@ -234,6 +239,7 @@ RSpec.describe CurrentUserSerializer do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "is not included when tagging has not been enabled" do
|
it "is not included when tagging has not been enabled" do
|
||||||
|
tag_sidebar_section_link
|
||||||
SiteSetting.enable_experimental_sidebar_hamburger = true
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
||||||
SiteSetting.tagging_enabled = false
|
SiteSetting.tagging_enabled = false
|
||||||
|
|
||||||
|
@ -243,6 +249,7 @@ RSpec.describe CurrentUserSerializer do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "is present when experimental sidebar and tagging has been enabled" do
|
it "is present when experimental sidebar and tagging has been enabled" do
|
||||||
|
tag_sidebar_section_link
|
||||||
SiteSetting.enable_experimental_sidebar_hamburger = true
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
||||||
SiteSetting.tagging_enabled = true
|
SiteSetting.tagging_enabled = true
|
||||||
|
|
||||||
|
@ -255,13 +262,43 @@ RSpec.describe CurrentUserSerializer do
|
||||||
{ name: tag_sidebar_section_link_2.linkable.name, pm_only: true }
|
{ name: tag_sidebar_section_link_2.linkable.name, pm_only: true }
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes visible default sidebar tags' do
|
||||||
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
||||||
|
SiteSetting.tagging_enabled = true
|
||||||
|
SiteSetting.default_sidebar_tags = "foo|bar|secret"
|
||||||
|
|
||||||
|
json = serializer.as_json
|
||||||
|
|
||||||
|
expect(json[:sidebar_tags]).to eq([
|
||||||
|
{ name: "foo", pm_only: false },
|
||||||
|
{ name: "bar", pm_only: false }
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'includes tags choosen by user' do
|
||||||
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
||||||
|
SiteSetting.tagging_enabled = true
|
||||||
|
SiteSetting.default_sidebar_tags = "foo|bar|secret"
|
||||||
|
tag_sidebar_section_link = Fabricate(:tag_sidebar_section_link, user: user)
|
||||||
|
|
||||||
|
json = serializer.as_json
|
||||||
|
|
||||||
|
expect(json[:sidebar_tags]).to eq([
|
||||||
|
{ name: tag_sidebar_section_link.linkable.name, pm_only: false }
|
||||||
|
])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#sidebar_category_ids' do
|
describe '#sidebar_category_ids' do
|
||||||
fab!(:category_sidebar_section_link) { Fabricate(:category_sidebar_section_link, user: user) }
|
fab!(:category) { Fabricate(:category) }
|
||||||
fab!(:category_sidebar_section_link_2) { Fabricate(:category_sidebar_section_link, user: user) }
|
fab!(:category_2) { Fabricate(:category) }
|
||||||
|
fab!(:private_category) { Fabricate(:private_category, group: Fabricate(:group)) }
|
||||||
|
let(:category_sidebar_section_link) { Fabricate(:category_sidebar_section_link, user: user) }
|
||||||
|
let(:category_sidebar_section_link_2) { Fabricate(:category_sidebar_section_link, user: user) }
|
||||||
|
|
||||||
it "is not included when SiteSeting.enable_experimental_sidebar_hamburger is false" do
|
it "is not included when SiteSeting.enable_experimental_sidebar_hamburger is false" do
|
||||||
|
category_sidebar_section_link
|
||||||
SiteSetting.enable_experimental_sidebar_hamburger = false
|
SiteSetting.enable_experimental_sidebar_hamburger = false
|
||||||
|
|
||||||
json = serializer.as_json
|
json = serializer.as_json
|
||||||
|
@ -270,6 +307,7 @@ RSpec.describe CurrentUserSerializer do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "is not included when experimental sidebar has not been enabled" do
|
it "is not included when experimental sidebar has not been enabled" do
|
||||||
|
category_sidebar_section_link
|
||||||
SiteSetting.enable_experimental_sidebar_hamburger = false
|
SiteSetting.enable_experimental_sidebar_hamburger = false
|
||||||
|
|
||||||
json = serializer.as_json
|
json = serializer.as_json
|
||||||
|
@ -277,15 +315,23 @@ RSpec.describe CurrentUserSerializer do
|
||||||
expect(json[:sidebar_category_ids]).to eq(nil)
|
expect(json[:sidebar_category_ids]).to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "is present when experimental sidebar has been enabled" do
|
it 'includes visible default sidebar categories' do
|
||||||
SiteSetting.enable_experimental_sidebar_hamburger = true
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
||||||
|
SiteSetting.default_sidebar_categories = "#{category.id}|#{category_2.id}|#{private_category.id}"
|
||||||
|
|
||||||
json = serializer.as_json
|
json = serializer.as_json
|
||||||
|
expect(json[:sidebar_category_ids]).to eq([category.id, category_2.id])
|
||||||
|
end
|
||||||
|
|
||||||
expect(json[:sidebar_category_ids]).to contain_exactly(
|
it 'includes categories choosen by user' do
|
||||||
category_sidebar_section_link.linkable_id,
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
||||||
category_sidebar_section_link_2.linkable_id
|
SiteSetting.default_sidebar_categories = "#{category.id}|#{category_2.id}|#{private_category.id}"
|
||||||
)
|
|
||||||
|
category_sidebar_section_link
|
||||||
|
category_sidebar_section_link_2
|
||||||
|
|
||||||
|
json = serializer.as_json
|
||||||
|
expect(json[:sidebar_category_ids]).to eq([category_sidebar_section_link.linkable.id, category_sidebar_section_link_2.linkable.id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue