diff options
23 files changed, 190 insertions, 80 deletions
diff --git a/Changelog.md b/Changelog.md index 1dcc5b9bc..d91522834 100644 --- a/Changelog.md +++ b/Changelog.md @@ -49,6 +49,7 @@ Note: Although this is a minor release, the configuration file changed because t * Add optional `Content-Security-Policy` header [#7128](https://github.com/diaspora/diaspora/pull/7128) * Add links to main stream and public stream to the mobile drawer [#7144](https://github.com/diaspora/diaspora/pull/7144) * Allow opening search results from the dropdown in a new tab [#7021](https://github.com/diaspora/diaspora/issues/7021) +* Add user setting for default post visibility [#7118](https://github.com/diaspora/diaspora/issues/7118) # 0.6.0.1 diff --git a/app/assets/javascripts/app/pages/settings.js b/app/assets/javascripts/app/pages/settings.js index 725abbedc..3bbfaeb6a 100644 --- a/app/assets/javascripts/app/pages/settings.js +++ b/app/assets/javascripts/app/pages/settings.js @@ -9,6 +9,11 @@ app.pages.Settings = Backbone.View.extend({ preFill: gon.preloads.tagsArray }); new Diaspora.ProfilePhotoUploader(); + + this.viewAspectSelector = new app.views.PublisherAspectSelector({ + el: $(".aspect_dropdown"), + form: $("#post-default-aspects") + }); } }); // @license-end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b13dd822c..8e01dff62 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -144,6 +144,7 @@ class UsersController < ApplicationController :auto_follow_back, :auto_follow_back_aspect_id, :getting_started, + :post_default_public, email_preferences: %i( someone_reported also_commented @@ -167,6 +168,8 @@ class UsersController < ApplicationController change_email(user_data) elsif user_data[:auto_follow_back] change_settings(user_data, "users.update.follow_settings_changed", "users.update.follow_settings_not_changed") + elsif user_data[:post_default_public] + change_post_default(user_data) elsif user_data[:color_theme] change_settings(user_data, "users.update.color_theme_changed", "users.update.color_theme_not_changed") else @@ -184,6 +187,18 @@ class UsersController < ApplicationController end end + def change_post_default(user_data) + # by default user_data[:post_default_public] is set to false + case params[:aspect_ids].try(:first) + when "public" + user_data[:post_default_public] = true + when "all_aspects" + params[:aspect_ids] = @user.aspects.map {|a| a.id.to_s } + end + @user.update_post_default_aspects params[:aspect_ids].to_a + change_settings(user_data) + end + # change email notifications def change_email_preferences(user_data) @user.update_user_preferences(user_data[:email_preferences]) diff --git a/app/helpers/aspect_global_helper.rb b/app/helpers/aspect_global_helper.rb index 421215b7d..d495072d9 100644 --- a/app/helpers/aspect_global_helper.rb +++ b/app/helpers/aspect_global_helper.rb @@ -17,13 +17,24 @@ module AspectGlobalHelper aspect = stream.aspect aspect_ids = stream.aspect_ids elsif current_user - aspects = current_user.aspects + aspects = current_user.post_default_aspects aspect = aspects.first aspect_ids = current_user.aspect_ids else return {} end + {selected_aspects: aspects, aspect: aspect, aspect_ids: aspect_ids} + end + + def public_selected?(selected_aspects) + "public" == selected_aspects.try(:first) + end + + def all_aspects_selected?(aspects, selected_aspects) + !aspects.empty? && aspects.size == selected_aspects.size && !public_selected?(selected_aspects) + end - { selected_aspects: aspects, aspect: aspect, aspect_ids: aspect_ids } + def aspect_selected?(aspect, aspects, selected_aspects) + selected_aspects.include?(aspect) && !all_aspects_selected?(aspects, selected_aspects) end end diff --git a/app/helpers/interim_stream_hackiness_helper.rb b/app/helpers/interim_stream_hackiness_helper.rb index c5d6992ab..78a893143 100644 --- a/app/helpers/interim_stream_hackiness_helper.rb +++ b/app/helpers/interim_stream_hackiness_helper.rb @@ -46,8 +46,4 @@ module InterimStreamHackinessHelper def publisher_open publisher_method(:open) end - - def publisher_public - publisher_method(:public) - end end diff --git a/app/helpers/publisher_helper.rb b/app/helpers/publisher_helper.rb index 1e7e326a9..ba4bc1d37 100644 --- a/app/helpers/publisher_helper.rb +++ b/app/helpers/publisher_helper.rb @@ -7,10 +7,6 @@ module PublisherHelper params[:controller] != "tags" end - def all_aspects_selected?(selected_aspects) - @all_aspects_selected ||= all_aspects.size == selected_aspects.size - end - def service_button(service) provider_title = I18n.t( "services.index.share_to", diff --git a/app/models/user.rb b/app/models/user.rb index 2b32a3622..77cdd8d21 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -252,6 +252,21 @@ class User < ActiveRecord::Base end end + def post_default_aspects + if post_default_public + ["public"] + else + aspects.where(post_default: true).to_a + end + end + + def update_post_default_aspects(post_default_aspect_ids) + aspects.each do |aspect| + enable = post_default_aspect_ids.include?(aspect.id.to_s) + aspect.update_attribute(:post_default, enable) + end + end + def salmon(post) Salmon::EncryptedSlap.create_by_user_and_activity(self, post.to_diaspora_xml) end @@ -502,7 +517,8 @@ class User < ActiveRecord::Base self[field] = nil end [:getting_started, - :show_community_spotlight_in_stream].each do |field| + :show_community_spotlight_in_stream, + :post_default_public].each do |field| self[field] = false end self[:disable_mail] = true diff --git a/app/views/aspects/_aspect_dropdown.html.haml b/app/views/aspects/_aspect_dropdown.html.haml new file mode 100644 index 000000000..6199d4b1e --- /dev/null +++ b/app/views/aspects/_aspect_dropdown.html.haml @@ -0,0 +1,48 @@ +-# locals: selected_aspects. Note: all_aspects is a global in the ApplicationController +:ruby + dropdown_css = {"data-toggle" => "dropdown"} + if current_user.getting_started? + dropdown_css[:title] = popover_with_close_html("2. #{t('shared.public_explain.control_your_audience')}") + dropdown_css["data-content"] = t("shared.public_explain.visibility_dropdown") + end + +.btn-group.aspect_dropdown + %button.btn.btn-default.dropdown-toggle{dropdown_css} + - if public_selected?(selected_aspects) + %i.entypo-globe.small#visibility-icon + %span.text + = t("public") + - else + %i.entypo-lock.small#visibility-icon + %span.text + - if all_aspects_selected?(all_aspects, selected_aspects) + = t("all_aspects") + - elsif selected_aspects.size == 1 + = selected_aspects.first.name + - else + = t("shared.aspect_dropdown.toggle", count: selected_aspects.size) + %span.caret + %ul.dropdown-menu.pull-right{unSelectable: "on"} + + %li.public.radio{"data-aspect_id" => "public", :class => ("selected" if public_selected?(selected_aspects))} + %a + %span.status_indicator + %i.glyphicon.glyphicon-ok + %span.text + = t("public") + %li.all_aspects.radio{"data-aspect_id" => "all_aspects", + :class => ("selected" if all_aspects_selected?(all_aspects, selected_aspects))} + %a + %span.status_indicator + %i.glyphicon.glyphicon-ok + %span.text + = t("all_aspects") + %li.divider + - all_aspects.each do |aspect| + %li.aspect_selector{"data-aspect_id" => aspect.id, + :class => ("selected" if aspect_selected?(aspect, all_aspects, selected_aspects))} + %a + %span.status_indicator + %i.glyphicon.glyphicon-ok + %span.text + = aspect.name diff --git a/app/views/publisher/_aspect_dropdown.html.haml b/app/views/publisher/_aspect_dropdown.html.haml deleted file mode 100644 index e97e50426..000000000 --- a/app/views/publisher/_aspect_dropdown.html.haml +++ /dev/null @@ -1,38 +0,0 @@ -.btn-group.aspect_dropdown - %button.btn.btn-default.dropdown-toggle{ ! current_user.getting_started? ? {'data-toggle' => 'dropdown'} : {'data-toggle' => 'dropdown', title: popover_with_close_html("2. #{t('shared.public_explain.control_your_audience')}"), 'data-content'=> t('shared.public_explain.visibility_dropdown')} } - - if publisher_public - %i#visibility-icon.entypo-globe.small - %span.text - = t('public') - - else - %i#visibility-icon.entypo-lock.small - %span.text - - if all_aspects_selected?(selected_aspects) - = t('all_aspects') - - elsif selected_aspects.size == 1 - = selected_aspects.first.name - - else - = t('shared.aspect_dropdown.toggle', count: selected_aspects.size) - %span.caret - %ul.dropdown-menu.pull-right{ unSelectable: 'on' } - - %li.public.radio{"data-aspect_id" => "public", class: ("selected" if publisher_public)} - %a - %span.status_indicator - %i.glyphicon.glyphicon-ok - %span.text - = t('public') - %li.all_aspects.radio{"data-aspect_id" => "all_aspects", class: ("selected" if (!publisher_public && all_aspects_selected?(selected_aspects)))} - %a - %span.status_indicator - %i.glyphicon.glyphicon-ok - %span.text - = t('all_aspects') - %li.divider - - for aspect in all_aspects - %li.aspect_selector{ 'data-aspect_id' => aspect.id, class: !all_aspects_selected?(selected_aspects) && selected_aspects.include?(aspect) ? "selected" : "" } - %a - %span.status_indicator - %i.glyphicon.glyphicon-ok - %span.text - = aspect.name diff --git a/app/views/publisher/_publisher.html.haml b/app/views/publisher/_publisher.html.haml index 5e1ca38f1..d71b1e27f 100644 --- a/app/views/publisher/_publisher.html.haml +++ b/app/views/publisher/_publisher.html.haml @@ -40,9 +40,9 @@ != t("shared.publisher.formatWithMarkdown", markdown_link: link_to(t("help.markdown"), "https://diasporafoundation.org/formatting", target: :blank)) - - if publisher_public + - if public_selected?(selected_aspects) = hidden_field_tag "aspect_ids[]", "public" - - elsif all_aspects_selected?(selected_aspects) + - elsif all_aspects_selected?(all_aspects, selected_aspects) = hidden_field_tag "aspect_ids[]", "all_aspects" - else - for aspect_id in aspect_ids @@ -54,7 +54,7 @@ .options_and_submit.col-sm-12 .public_toggle.clearfix .btn-toolbar.pull-right - = render partial: "publisher/aspect_dropdown", locals: {selected_aspects: selected_aspects} + = render partial: "aspects/aspect_dropdown", locals: {selected_aspects: selected_aspects} %button.btn.btn-group.btn-primary#submit= t("shared.publisher.share") .btn-toolbar.pull-right#publisher-service-icons diff --git a/app/views/users/_edit.haml b/app/views/users/_edit.haml index aec5eccc7..af9aea49b 100644 --- a/app/views/users/_edit.haml +++ b/app/views/users/_edit.haml @@ -115,6 +115,7 @@ .clearfix= f.submit t(".change"), class: "btn btn-primary pull-right" %hr + = render partial: "post_default" .row .col-md-12 diff --git a/app/views/users/_post_default.html.haml b/app/views/users/_post_default.html.haml new file mode 100644 index 000000000..8f5fd8eb3 --- /dev/null +++ b/app/views/users/_post_default.html.haml @@ -0,0 +1,12 @@ +.row + .col-md-12 + %h3 + = t("users.edit.default_post_visibility") + = form_for current_user, url: edit_user_path, + html: {method: :put, id: "post-default-aspects", class: "form-horizontal"} do |f| + = f.hidden_field :post_default_public, value: false + - selected_aspects = current_user.post_default_aspects + = render partial: "aspects/aspect_dropdown", locals: {selected_aspects: selected_aspects} + .small-horizontal-spacer + .clearfix= f.submit t("users.edit.change"), class: "btn btn-primary pull-right" +%hr diff --git a/app/views/users/_post_default.mobile.haml b/app/views/users/_post_default.mobile.haml new file mode 100644 index 000000000..736458a9a --- /dev/null +++ b/app/views/users/_post_default.mobile.haml @@ -0,0 +1 @@ +-# This feature is not supported in mobile format. diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 8e5b8aef9..cdff0411b 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -1156,6 +1156,7 @@ en: following: "Sharing settings" auto_follow_back: "Automatically share with users who start sharing with you" auto_follow_aspect: "Aspect for users you automatically share with:" + default_post_visibility: "Default aspects selected for posting" receive_email_notifications: "Receive email notifications when:" started_sharing: "someone starts sharing with you" someone_reported: "someone sends a report" diff --git a/db/migrate/20160829170244_add_post_default_to_aspects.rb b/db/migrate/20160829170244_add_post_default_to_aspects.rb new file mode 100644 index 000000000..dcc2d76c6 --- /dev/null +++ b/db/migrate/20160829170244_add_post_default_to_aspects.rb @@ -0,0 +1,6 @@ +class AddPostDefaultToAspects < ActiveRecord::Migration + def change + add_column :aspects, :post_default, :boolean, default: true + add_column :users, :post_default_public, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index d18815df9..48a75a864 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -48,6 +48,7 @@ ActiveRecord::Schema.define(version: 20160906225138) do t.boolean "contacts_visible", default: true, null: false t.integer "order_id", limit: 4 t.boolean "chat_enabled", default: false + t.boolean "post_default", default: true end add_index "aspects", ["user_id", "contacts_visible"], name: "index_aspects_on_user_id_and_contacts_visible", using: :btree @@ -634,6 +635,7 @@ ActiveRecord::Schema.define(version: 20160906225138) do t.datetime "exported_photos_at" t.boolean "exporting_photos", default: false t.string "color_theme", limit: 255 + t.boolean "post_default_public", default: false end add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree diff --git a/features/desktop/change_settings.feature b/features/desktop/change_settings.feature index f636e29ce..ba0543908 100644 --- a/features/desktop/change_settings.feature +++ b/features/desktop/change_settings.feature @@ -3,6 +3,9 @@ Feature: Change settings Background: Given I am signed in + And I have following aspects: + | Friends | + | Family | When I go to the edit user page Scenario: Change my email @@ -25,3 +28,24 @@ Feature: Change settings And I press "Change language" Then I should see "Język został zmieniony" And "polski" should be selected from "user_language" + + Scenario: Change my post default aspects + When I go to the stream page + And I expand the publisher + Then I should see "All aspects" within ".aspect_dropdown" + When I go to the edit user page + And I press the aspect dropdown + And I toggle the aspect "Family" + And I press the aspect dropdown + And I press "Change" within "#post-default-aspects" + And I go to the stream page + And I expand the publisher + Then I should see "Family" within ".aspect_dropdown" + + Scenario: Change my post default to public + When I press the aspect dropdown + And I toggle the aspect "Public" + And I press "Change" within "#post-default-aspects" + And I go to the stream page + And I expand the publisher + Then I should see "Public" within ".aspect_dropdown" diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb index 473ab2ab2..bcfa6b37c 100644 --- a/features/step_definitions/aspects_steps.rb +++ b/features/step_definitions/aspects_steps.rb @@ -4,7 +4,11 @@ module AspectCukeHelpers end def toggle_aspect(a_name) - a_id = @me.aspects.where(name: a_name).pluck(:id).first + a_id = if "Public" == a_name + "public" + else + @me.aspects.where(name: a_name).pluck(:id).first + end aspect_css = ".aspect_dropdown li[data-aspect_id='#{a_id}']" expect(page).to have_selector(aspect_css) find(aspect_css).click diff --git a/lib/stream/base.rb b/lib/stream/base.rb index f593169f2..0d705469f 100644 --- a/lib/stream/base.rb +++ b/lib/stream/base.rb @@ -62,7 +62,7 @@ class Stream::Base #NOTE: MBS bad bad methods the fact we need these means our views are foobared. please kill them and make them #private methods on the streams that need them def aspects - user.aspects + user.post_default_aspects end # @return [Aspect] The first aspect in #aspects @@ -71,7 +71,7 @@ class Stream::Base end def aspect_ids - aspects.map{|x| x.id} + aspects.map {|x| x.try(:id) } end def max_time=(time_string) diff --git a/lib/stream/multi.rb b/lib/stream/multi.rb index 868a82228..7a7d6cc2a 100644 --- a/lib/stream/multi.rb +++ b/lib/stream/multi.rb @@ -28,7 +28,7 @@ class Stream::Multi < Stream::Base if welcome? {open: true, prefill: publisher_prefill, public: true} else - super + {public: user.post_default_public} end end diff --git a/lib/stream/public.rb b/lib/stream/public.rb index 0c6987233..b0285f4a8 100644 --- a/lib/stream/public.rb +++ b/lib/stream/public.rb @@ -19,4 +19,9 @@ class Stream::Public < Stream::Base def can_comment?(post) post.author.local? end + + # Override base class method + def aspects + ["public"] + end end diff --git a/spec/lib/stream/multi_spec.rb b/spec/lib/stream/multi_spec.rb index 8f84caf54..b53ee384c 100644 --- a/spec/lib/stream/multi_spec.rb +++ b/spec/lib/stream/multi_spec.rb @@ -32,7 +32,7 @@ describe Stream::Multi do it 'provides no opts if welcome? is not set' do prefill_text = "sup?" allow(@stream).to receive(:welcome?).and_return(false) - expect(@stream.send(:publisher_opts)).to eq({}) + expect(@stream.send(:publisher_opts)).to eq(public: false) end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index eaaaf6caf..80ab08d40 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -931,42 +931,46 @@ describe User, :type => :model do end end - it 'disables mail' do + it "disables mail" do @user.disable_mail = false @user.clear_account! expect(@user.reload.disable_mail).to be true end - it 'sets getting_started and show_community_spotlight_in_stream fields to false' do + it "sets getting_started and show_community_spotlight_in_stream and post_default_public fields to false" do @user.clear_account! expect(@user.reload.getting_started).to be false expect(@user.reload.show_community_spotlight_in_stream).to be false + expect(@user.reload.post_default_public).to be false end end describe "#clearable_attributes" do - it 'returns the clearable fields' do + it "returns the clearable fields" do user = FactoryGirl.create :user - expect(user.send(:clearable_fields).sort).to eq(%w( - language - reset_password_sent_at - reset_password_token - remember_created_at - sign_in_count - current_sign_in_at - last_sign_in_at - current_sign_in_ip - hidden_shareables - last_sign_in_ip - invited_by_id - authentication_token - auto_follow_back - auto_follow_back_aspect_id - unconfirmed_email - confirm_email_token - last_seen - color_theme - ).sort) + expect(user.send(:clearable_fields)).to match_array( + %w( + language + reset_password_sent_at + reset_password_token + remember_created_at + sign_in_count + current_sign_in_at + last_sign_in_at + current_sign_in_ip + hidden_shareables + last_sign_in_ip + invited_by_id + authentication_token + auto_follow_back + auto_follow_back_aspect_id + unconfirmed_email + confirm_email_token + last_seen + color_theme + post_default_public + ) + ) end end end |