diff --git a/app/assets/javascripts/discourse/app/components/sidebar.js b/app/assets/javascripts/discourse/app/components/sidebar.js new file mode 100644 index 00000000000..ea096319112 --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/sidebar.js @@ -0,0 +1,3 @@ +import GlimmerComponent from "discourse/components/glimmer"; + +export default class Sidebar extends GlimmerComponent {} diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js index d91dde1b52d..d2b6e8f0d1e 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js @@ -58,6 +58,7 @@ export default Controller.extend({ "skip_new_user_tips", "color_scheme_id", "dark_scheme_id", + "enable_experimental_sidebar", ]; if (makeThemeDefault) { diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index 28b449e37b1..39d215a0c7b 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -99,6 +99,7 @@ let userOptionFields = [ "skip_new_user_tips", "default_calendar", "bookmark_auto_delete_preference", + "enable_experimental_sidebar", ]; export function addSaveableUserOptionField(fieldName) { diff --git a/app/assets/javascripts/discourse/app/templates/application.hbs b/app/assets/javascripts/discourse/app/templates/application.hbs index 861c67f8781..bca6f6bc06d 100644 --- a/app/assets/javascripts/discourse/app/templates/application.hbs +++ b/app/assets/javascripts/discourse/app/templates/application.hbs @@ -25,6 +25,11 @@ {{create-topics-notice}} {{plugin-outlet name="top-notices" connectorTagName="div" args=(hash currentPath=router._router.currentPath)}} + + {{#if currentUser.experimental_sidebar_enabled}} + + {{/if}} + {{outlet}} {{outlet "user-card"}} diff --git a/app/assets/javascripts/discourse/app/templates/components/sidebar.hbs b/app/assets/javascripts/discourse/app/templates/components/sidebar.hbs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs b/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs index bbf00ca9008..77a8fbc517b 100644 --- a/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs +++ b/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs @@ -133,6 +133,10 @@
{{i18n "user.other_settings"}} + {{#if siteSettings.enable_experimental_sidebar}} + {{preference-checkbox labelKey="user.enable_experimental_sidebar" checked=model.user_option.enable_experimental_sidebar class="pref-external-links"}} + {{/if}} + {{preference-checkbox labelKey="user.external_links_in_new_tab" checked=model.user_option.external_links_in_new_tab class="pref-external-links"}} {{preference-checkbox labelKey="user.enable_quoting" checked=model.user_option.enable_quoting class="pref-enable-quoting"}} {{preference-checkbox labelKey="user.enable_defer" checked=model.user_option.enable_defer class="pref-defer-undread"}} diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 2118b101973..b35cf37453a 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -261,6 +261,7 @@ end # default_calendar :integer default("none_selected"), not null # oldest_search_log_date :datetime # bookmark_auto_delete_preference :integer default(3), not null +# enable_experimental_sidebar :boolean default(FALSE) # # Indexes # diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb index a5988d2ada1..249ecdefdd9 100644 --- a/app/serializers/current_user_serializer.rb +++ b/app/serializers/current_user_serializer.rb @@ -69,7 +69,8 @@ class CurrentUserSerializer < BasicUserSerializer :draft_count, :default_calendar, :bookmark_auto_delete_preference, - :pending_posts_count + :pending_posts_count, + :experimental_sidebar_enabled delegate :user_stat, to: :object, private: true delegate :any_posts, :draft_count, :pending_posts_count, :read_faq?, to: :user_stat @@ -327,4 +328,12 @@ class CurrentUserSerializer < BasicUserSerializer def include_has_topic_draft? Draft.has_topic_draft(object) end + + def experimental_sidebar_enabled + object.user_option.enable_experimental_sidebar + end + + def include_experimental_sidebar_enabled? + SiteSetting.enable_experimental_sidebar + end end diff --git a/app/serializers/user_option_serializer.rb b/app/serializers/user_option_serializer.rb index a086a6f3ee6..136fe500879 100644 --- a/app/serializers/user_option_serializer.rb +++ b/app/serializers/user_option_serializer.rb @@ -35,6 +35,7 @@ class UserOptionSerializer < ApplicationSerializer :skip_new_user_tips, :default_calendar, :oldest_search_log_date, + :enable_experimental_sidebar def auto_track_topics_after_msecs object.auto_track_topics_after_msecs || SiteSetting.default_other_auto_track_topics_after_msecs @@ -52,4 +53,8 @@ class UserOptionSerializer < ApplicationSerializer object.theme_ids.presence || [SiteSetting.default_theme_id] end + def include_enable_experimental_sidebar? + SiteSetting.enable_experimental_sidebar + end + end diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb index 7c28afd56b2..aaed136b5b9 100644 --- a/app/services/user_updater.rb +++ b/app/services/user_updater.rb @@ -47,7 +47,8 @@ class UserUpdater :title_count_mode, :timezone, :skip_new_user_tips, - :default_calendar + :default_calendar, + :enable_experimental_sidebar ] NOTIFICATION_SCHEDULE_ATTRS = -> { diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ca322301390..219ee93264f 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1156,6 +1156,7 @@ en: external_links_in_new_tab: "Open all external links in a new tab" enable_quoting: "Enable quote reply for highlighted text" enable_defer: "Enable defer to mark topics unread" + enable_experimental_sidebar: "Enable experimental sidebar" change: "change" featured_topic: "Featured Topic" moderator: "%{user} is a moderator" diff --git a/config/site_settings.yml b/config/site_settings.yml index 04daca202a2..bca0007ae86 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1957,6 +1957,10 @@ developer: enable_safe_mode: default: true client: true + enable_experimental_sidebar: + default: false + client: true + hidden: true embedding: embed_by_username: diff --git a/db/migrate/20220428025825_add_enable_experimental_sidebar_to_user_options.rb b/db/migrate/20220428025825_add_enable_experimental_sidebar_to_user_options.rb new file mode 100644 index 00000000000..2112ee1c70c --- /dev/null +++ b/db/migrate/20220428025825_add_enable_experimental_sidebar_to_user_options.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddEnableExperimentalSidebarToUserOptions < ActiveRecord::Migration[6.1] + def change + add_column :user_options, :enable_experimental_sidebar, :boolean, default: false + end +end diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index 6ad8ce3b3b6..37efe2d9bce 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -2309,6 +2309,21 @@ describe UsersController do expect(response).to be_forbidden expect(user.reload.name).not_to eq 'Jim Tom' end + + context 'enabling experimental sidebar' do + before do + sign_in(user) + end + + it "should be able to update UserOption#enable_experimental_sidebar" do + SiteSetting.enable_experimental_sidebar = true + + put "/u/#{user.username}.json", params: { enable_experimental_sidebar: 'true' } + + expect(response.status).to eq(200) + expect(user.user_option.enable_experimental_sidebar).to eq(true) + end + end end end @@ -3882,6 +3897,23 @@ describe UsersController do expect(topic_post_count[topic.id.to_s]).to eq(2) end end + + it "includes UserOption#enable_experimental_sidebar when SiteSetting.enable_experimental_sidebar is true" do + SiteSetting.enable_experimental_sidebar = true + user1.user_option.update!(enable_experimental_sidebar: true) + + get "/u/#{user1.username}.json" + + expect(response.status).to eq(200) + expect(response.parsed_body["user"]["user_option"]["enable_experimental_sidebar"]).to eq(true) + end + + it "does not include UserOption#enable_experimental_sidebar when SiteSetting.enable_experimental_sidebar is false" do + get "/u/#{user1.username}.json" + + expect(response.status).to eq(200) + expect(response.parsed_body["user"]["user_option"]["enable_experimental_sidebar"]).to eq(nil) + end end it "should be able to view a user" do