mirror of
https://github.com/discourse/discourse.git
synced 2026-08-06 13:08:40 +08:00
Follow up to https://github.com/discourse/discourse/pull/41795 This adds content-localization support for manually created links in the built-in Community sidebar section. Built-in Community links like Topics, My posts, Review, Admin, etc. still use their existing frontend i18n labels and do not expose localization controls. Only admin-created links in the Community section can be localized (since only the admin can edit it). The earlier PR had skipped adding these entirely for the Community section
101 lines
2.9 KiB
Ruby
Vendored
101 lines
2.9 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
class SidebarSection < ActiveRecord::Base
|
|
include Localizable
|
|
|
|
MAX_TITLE_LENGTH = 30
|
|
MAX_USER_CATEGORY_LINKS = 100
|
|
|
|
belongs_to :user
|
|
has_many :sidebar_section_links, -> { order("position") }, dependent: :destroy
|
|
|
|
has_many :sidebar_urls,
|
|
through: :sidebar_section_links,
|
|
source: :linkable,
|
|
source_type: "SidebarUrl"
|
|
|
|
accepts_nested_attributes_for :sidebar_urls,
|
|
allow_destroy: true,
|
|
limit: -> { SiteSetting.max_sidebar_section_links }
|
|
accepts_nested_attributes_for :localizations, allow_destroy: true
|
|
|
|
before_validation :set_default_locale
|
|
before_save :set_system_user_for_public_section
|
|
|
|
validates :title,
|
|
presence: true,
|
|
uniqueness: {
|
|
scope: %i[user_id],
|
|
},
|
|
length: {
|
|
maximum: MAX_TITLE_LENGTH,
|
|
}
|
|
|
|
scope :public_sections, -> { where("public") }
|
|
scope :custom_sections, -> { where(section_type: nil) }
|
|
enum :section_type, { community: 0 }, scopes: false, suffix: true
|
|
|
|
def custom_section?
|
|
section_type.blank?
|
|
end
|
|
|
|
def community_section?
|
|
section_type == "community"
|
|
end
|
|
|
|
def reset_community!
|
|
ActiveRecord::Base.transaction do
|
|
update!(title: "Community")
|
|
sidebar_section_links.destroy_all
|
|
community_urls =
|
|
SidebarUrl::COMMUNITY_SECTION_LINKS.map do |url_data|
|
|
"('#{url_data[:name]}', '#{url_data[:path]}', '#{url_data[:icon]}', '#{url_data[:segment]}', false, now(), now())"
|
|
end
|
|
|
|
result = DB.query <<~SQL
|
|
INSERT INTO sidebar_urls(name, value, icon, segment, external, created_at, updated_at)
|
|
VALUES #{community_urls.join(",")}
|
|
RETURNING sidebar_urls.id
|
|
SQL
|
|
|
|
sidebar_section_links =
|
|
result.map.with_index do |url, index|
|
|
"(-1, #{url.id}, 'SidebarUrl', #{id}, #{index}, now(), now())"
|
|
end
|
|
|
|
DB.query <<~SQL
|
|
INSERT INTO sidebar_section_links(user_id, linkable_id, linkable_type, sidebar_section_id, position, created_at, updated_at)
|
|
VALUES #{sidebar_section_links.join(",")}
|
|
SQL
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def set_system_user_for_public_section
|
|
self.user_id = Discourse.system_user.id if public
|
|
end
|
|
|
|
def set_default_locale
|
|
self.locale ||= SiteSetting.default_locale.to_s
|
|
end
|
|
end
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: sidebar_sections
|
|
#
|
|
# id :bigint not null, primary key
|
|
# locale :string(20)
|
|
# public :boolean default(FALSE), not null
|
|
# section_type :integer
|
|
# title :string(30) not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# user_id :integer not null
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_sidebar_sections_on_section_type (section_type) UNIQUE
|
|
# index_sidebar_sections_on_user_id_and_title (user_id,title) UNIQUE
|
|
#
|