From 4fa92c1823a0268dabf58c83c6e8438672e7a93c Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Thu, 5 Apr 2018 03:38:08 +0200 Subject: [PATCH 1/6] Remove flag for contacts visible to each other This feature only worked on the same pod and was more confusing than useful. --- app/assets/javascripts/app/pages/contacts.js | 21 ------- .../app/views/aspect_create_view.js | 7 +-- .../templates/aspect_create_modal_tpl.jst.hbs | 10 ---- app/assets/templates/help_tpl.jst.hbs | 2 +- app/controllers/aspects_controller.rb | 14 +---- app/models/contact.rb | 11 ---- app/serializers/export/aspect_serializer.rb | 4 +- app/views/contacts/_header.html.haml | 6 -- config/locales/diaspora/en.yml | 2 - config/locales/javascript/javascript.en.yml | 3 - config/routes.rb | 1 - ...21_remove_contacts_visible_from_aspects.rb | 8 +++ features/desktop/contacts.feature | 25 --------- lib/schemas/archive-format.json | 1 - spec/controllers/aspects_controller_spec.rb | 18 ------ spec/integration/exporter_spec.rb | 2 - spec/javascripts/app/pages/contacts_spec.js | 29 ---------- .../app/views/aspect_create_view_spec.js | 32 ----------- spec/models/aspect_spec.rb | 4 -- spec/models/contact_spec.rb | 56 ------------------- .../export/aspect_serializer_spec.rb | 5 +- spec/support/data_generator.rb | 2 +- 22 files changed, 15 insertions(+), 248 deletions(-) create mode 100644 db/migrate/20180406235521_remove_contacts_visible_from_aspects.rb diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js index 091601516..0035951c0 100644 --- a/app/assets/javascripts/app/pages/contacts.js +++ b/app/assets/javascripts/app/pages/contacts.js @@ -5,7 +5,6 @@ app.pages.Contacts = Backbone.View.extend({ el: "#contacts_container", events: { - "click #contacts_visibility_toggle" : "toggleContactVisibility", "click #chat_privilege_toggle" : "toggleChatPrivilege", "click #change_aspect_name" : "showAspectNameForm", "click .conversation_button": "showMessageModal", @@ -13,7 +12,6 @@ app.pages.Contacts = Backbone.View.extend({ }, initialize: function(opts) { - this.visibilityToggle = $("#contacts_visibility_toggle i"); this.chatToggle = $("#chat_privilege_toggle i"); this.stream = opts.stream; this.stream.render(); @@ -45,25 +43,6 @@ app.pages.Contacts = Backbone.View.extend({ } }, - toggleContactVisibility: function() { - if (this.visibilityToggle.hasClass("entypo-lock-open")) { - this.visibilityToggle.removeClass("entypo-lock-open") - .addClass("entypo-lock") - .tooltip("destroy") - .removeAttr("data-original-title") - .attr("title", Diaspora.I18n.t("contacts.aspect_list_is_not_visible")) - .tooltip({"placement": "bottom"}); - } - else { - this.visibilityToggle.removeClass("entypo-lock") - .addClass("entypo-lock-open") - .tooltip("destroy") - .removeAttr("data-original-title") - .attr("title", Diaspora.I18n.t("contacts.aspect_list_is_visible")) - .tooltip({"placement": "bottom"}); - } - }, - showAspectNameForm: function() { $(".header > h3").hide(); var aspectName = $.trim($(".header h3 #aspect_name").text()); diff --git a/app/assets/javascripts/app/views/aspect_create_view.js b/app/assets/javascripts/app/views/aspect_create_view.js index 8c7d030f9..c6c1e592b 100644 --- a/app/assets/javascripts/app/views/aspect_create_view.js +++ b/app/assets/javascripts/app/views/aspect_create_view.js @@ -21,10 +21,6 @@ app.views.AspectCreate = app.views.Base.extend({ }); }, - _contactsVisible: function() { - return this.$("#aspect_contacts_visible").is(":checked"); - }, - _name: function() { return this.$("#aspect_name").val(); }, @@ -71,8 +67,7 @@ app.views.AspectCreate = app.views.Base.extend({ app.aspects.create({ "person_id": this._personId || null, - "name": this._name(), - "contacts_visible": this._contactsVisible() + "name": this._name() }); }, diff --git a/app/assets/templates/aspect_create_modal_tpl.jst.hbs b/app/assets/templates/aspect_create_modal_tpl.jst.hbs index 00cd08d22..721f6f9f2 100644 --- a/app/assets/templates/aspect_create_modal_tpl.jst.hbs +++ b/app/assets/templates/aspect_create_modal_tpl.jst.hbs @@ -22,16 +22,6 @@ - -
-
-
- -
-
-
diff --git a/app/assets/templates/help_tpl.jst.hbs b/app/assets/templates/help_tpl.jst.hbs index b1cd4408e..16dc93075 100644 --- a/app/assets/templates/help_tpl.jst.hbs +++ b/app/assets/templates/help_tpl.jst.hbs @@ -17,7 +17,7 @@ {{ title_account_and_data_management }}
  • - {{ title_aspects }} + {{ title_aspects }} {{ title_aspects }}
  • diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb index 4e0344cc3..b970f7596 100644 --- a/app/controllers/aspects_controller.rb +++ b/app/controllers/aspects_controller.rb @@ -84,18 +84,6 @@ class AspectsController < ApplicationController head :no_content end - def toggle_contact_visibility - @aspect = current_user.aspects.where(:id => params[:aspect_id]).first - - if @aspect.contacts_visible? - @aspect.contacts_visible = false - else - @aspect.contacts_visible = true - end - @aspect.save - head :no_content - end - private def connect_person_to_aspect(aspecting_person_id) @@ -109,6 +97,6 @@ class AspectsController < ApplicationController end def aspect_params - params.require(:aspect).permit(:name, :contacts_visible, :chat_enabled, :order_id) + params.require(:aspect).permit(:name, :chat_enabled, :order_id) end end diff --git a/app/models/contact.rb b/app/models/contact.rb index 2f3dd4e73..6a7a5ce30 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -47,17 +47,6 @@ class Contact < ApplicationRecord ).destroy_all end - def contacts - people = Person.arel_table - incoming_aspects = Aspect.where( - :user_id => self.person.owner_id, - :contacts_visible => true).joins(:contacts).where( - :contacts => {:person_id => self.user.person_id}).select('aspects.id') - incoming_aspect_ids = incoming_aspects.map{|a| a.id} - similar_contacts = Person.joins(:contacts => :aspect_memberships).where( - :aspect_memberships => {:aspect_id => incoming_aspect_ids}).where(people[:id].not_eq(self.user.person.id)).select('DISTINCT people.*') - end - def mutual? sharing && receiving end diff --git a/app/serializers/export/aspect_serializer.rb b/app/serializers/export/aspect_serializer.rb index ceeef754c..938939ad9 100644 --- a/app/serializers/export/aspect_serializer.rb +++ b/app/serializers/export/aspect_serializer.rb @@ -2,8 +2,6 @@ module Export class AspectSerializer < ActiveModel::Serializer - attributes :name, - :contacts_visible, - :chat_enabled + attributes :name, :chat_enabled end end diff --git a/app/views/contacts/_header.html.haml b/app/views/contacts/_header.html.haml index d8d323fb1..4348e0dea 100644 --- a/app/views/contacts/_header.html.haml +++ b/app/views/contacts/_header.html.haml @@ -4,12 +4,6 @@ - if @aspect.contacts.size > 0 && @aspect.contacts.size < 20 = start_a_conversation_link(@aspect, @aspect.contacts.size) - = link_to aspect_toggle_contact_visibility_path(@aspect), id: "contacts_visibility_toggle", class: "contacts_button", method: :put, remote: true do - -if @aspect.contacts_visible? - %i.entypo-lock-open.contacts-header-icon{title: t("aspects.edit.aspect_list_is_visible")} - -else - %i.entypo-lock.contacts-header-icon{title: t("aspects.edit.aspect_list_is_not_visible")} - -if AppConfig.chat.enabled? = link_to aspect_toggle_chat_privilege_path(@aspect), id: "chat_privilege_toggle", class: "contacts_button", method: :put, remote: true do -if @aspect.chat_enabled? diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index d9e887a91..f28b8f551 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -369,8 +369,6 @@ en: contacts_know_aspect_a: "No. They cannot see the name of the aspect under any circumstances." person_multiple_aspects_q: "Can I add a person to multiple aspects?" person_multiple_aspects_a: "Yes. Go to your contacts page and click on “My contacts”. For each contact you can use the menu on the right to add them to (or remove them from) as many aspects as you want. Or you can add them to a new aspect (or remove them from an aspect) by clicking the aspect selector button on their profile page. Or you can even just move the pointer over their name where you see it in the stream, and a “hovercard” will appear. You can change the aspects they are in right there." - contacts_visible_q: "What does “make contacts in this aspect visible to each other” mean?" - contacts_visible_a: "If you check this option then contacts from that aspect will be able to see who else is in it, in the “Contacts” tab on your profile page. (At the moment, only your contacts who are on the same pod as you will be able to see the “Contacts” tab on your profile.) It’s best to select this option only if the contacts in that aspect all know each other, for example if the aspect is for a club or society you belong to. They still won’t be able to see what the aspect is called." remove_notification_q: "If I remove someone from an aspect, or all of my aspects, are they notified of this?" remove_notification_a: "No. They are also not notified if you add them to more aspects, when you are already sharing with them." change_aspect_of_post_q: "Once I have posted something, can I change the aspect(s) that can see it?" diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml index e89cf6109..63e8dee68 100644 --- a/config/locales/javascript/javascript.en.yml +++ b/config/locales/javascript/javascript.en.yml @@ -81,7 +81,6 @@ en: other: "The connection test returned an error for <%= count %> pods." aspects: - make_aspect_list_visible: "Make contacts in this aspect visible to each other?" name: "Name" create: add_a_new_aspect: "Add a new aspect" @@ -124,8 +123,6 @@ en: add_contact: "Add contact" aspect_chat_is_enabled: "Contacts in this aspect are able to chat with you." aspect_chat_is_not_enabled: "Contacts in this aspect are not able to chat with you." - aspect_list_is_visible: "Contacts in this aspect are able to see each other." - aspect_list_is_not_visible: "Contacts in this aspect are not able to see each other." remove_contact: "Remove contact" error_add: "Couldn’t add <%= name %> to the aspect :(" error_remove: "Couldn’t remove <%= name %> from the aspect :(" diff --git a/config/routes.rb b/config/routes.rb index 28ca010f6..ab8b75ffe 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -59,7 +59,6 @@ Rails.application.routes.draw do get "aspects" => "streams#aspects", :as => "aspects_stream" resources :aspects, except: %i(index new edit) do - put :toggle_contact_visibility put :toggle_chat_privilege collection do put "order" => :update_order diff --git a/db/migrate/20180406235521_remove_contacts_visible_from_aspects.rb b/db/migrate/20180406235521_remove_contacts_visible_from_aspects.rb new file mode 100644 index 000000000..5b201ccdf --- /dev/null +++ b/db/migrate/20180406235521_remove_contacts_visible_from_aspects.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class RemoveContactsVisibleFromAspects < ActiveRecord::Migration[5.1] + def change + remove_index :aspects, column: %i[user_id contacts_visible], name: :index_aspects_on_user_id_and_contacts_visible + remove_column :aspects, :contacts_visible, :boolean, default: true, null: false + end +end diff --git a/features/desktop/contacts.feature b/features/desktop/contacts.feature index 1beecbc86..89ef019a3 100644 --- a/features/desktop/contacts.feature +++ b/features/desktop/contacts.feature @@ -15,28 +15,3 @@ Feature: show contacts When I am on "robert@grimm.grimm"'s page And I press the first "#contacts_link" Then I should be on the contacts page - - Scenario: see contacts of a visible aspect list - When I am on "bob@bob.bob"'s page - And I add the person to my "Unicorns" aspect - And I sign out - And I sign in as "alice@alice.alice" - And I am on "robert@grimm.grimm"'s page - Then I should see "Contacts" within "#profile-horizontal-bar" - - When I press the first "#contacts_link" - Then I should see "Bob Jones" within "#people-stream .media-body" - When I add the person to my "Besties" aspect within "#people-stream" - Then I should see a flash message containing "You have started sharing with Bob Jones!" - - Scenario: don't see contacts of an invisible aspect list - When I am on "bob@bob.bob"'s page - And I add the person to my "Unicorns" aspect - And I am on the contacts page - And I follow "Unicorns" - And I press the first "a#contacts_visibility_toggle" - And I sign out - - And I sign in as "alice@alice.alice" - And I am on "robert@grimm.grimm"'s page - Then I should not see "Contacts" within "#profile-horizontal-bar" diff --git a/lib/schemas/archive-format.json b/lib/schemas/archive-format.json index 314331506..cc4c99ffe 100644 --- a/lib/schemas/archive-format.json +++ b/lib/schemas/archive-format.json @@ -31,7 +31,6 @@ "type": "object", "properties": { "name": { "type": "string" }, - "contacts_visible": { "type": "boolean" }, "chat_enabled": { "type": "boolean" } }, "required": [ diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb index d763f4a83..a243cfaf8 100644 --- a/spec/controllers/aspects_controller_spec.rb +++ b/spec/controllers/aspects_controller_spec.rb @@ -156,22 +156,4 @@ describe AspectsController, :type => :controller do end end end - - describe "#toggle_contact_visibility" do - it 'sets contacts visible' do - @alices_aspect_1.contacts_visible = false - @alices_aspect_1.save - - get :toggle_contact_visibility, xhr: true, params: {aspect_id: @alices_aspect_1.id} - expect(@alices_aspect_1.reload.contacts_visible).to be true - end - - it 'sets contacts hidden' do - @alices_aspect_1.contacts_visible = true - @alices_aspect_1.save - - get :toggle_contact_visibility, xhr: true, params: {aspect_id: @alices_aspect_1.id} - expect(@alices_aspect_1.reload.contacts_visible).to be false - end - end end diff --git a/spec/integration/exporter_spec.rb b/spec/integration/exporter_spec.rb index 908a92532..ac9bdbfd9 100644 --- a/spec/integration/exporter_spec.rb +++ b/spec/integration/exporter_spec.rb @@ -47,12 +47,10 @@ describe Diaspora::Exporter do "contact_groups": [ { "name": "generic", - "contacts_visible": true, "chat_enabled": false }, { "name": "Work", - "contacts_visible": false, "chat_enabled": false } ] diff --git a/spec/javascripts/app/pages/contacts_spec.js b/spec/javascripts/app/pages/contacts_spec.js index 485b17dc1..c9d972ec6 100644 --- a/spec/javascripts/app/pages/contacts_spec.js +++ b/spec/javascripts/app/pages/contacts_spec.js @@ -34,35 +34,6 @@ describe("app.pages.Contacts", function(){ }); }); - context('toggle contacts visibility', function() { - beforeEach(function() { - this.visibilityToggle = $("#contacts_visibility_toggle"); - this.lockIcon = $("#contacts_visibility_toggle i"); - }); - - it("updates the title for the tooltip", function() { - expect(this.lockIcon.attr("data-original-title")).toBe( - Diaspora.I18n.t("contacts.aspect_list_is_visible") - ); - - this.visibilityToggle.trigger("click"); - - expect(this.lockIcon.attr("data-original-title")).toBe( - Diaspora.I18n.t("contacts.aspect_list_is_not_visible") - ); - }); - - it("toggles the lock icon", function() { - expect(this.lockIcon.hasClass("entypo-lock-open")).toBeTruthy(); - expect(this.lockIcon.hasClass("entypo-lock")).toBeFalsy(); - - this.visibilityToggle.trigger("click"); - - expect(this.lockIcon.hasClass("entypo-lock")).toBeTruthy(); - expect(this.lockIcon.hasClass("entypo-lock-open")).toBeFalsy(); - }); - }); - context('show aspect name form', function() { beforeEach(function() { this.button = $('#change_aspect_name'); diff --git a/spec/javascripts/app/views/aspect_create_view_spec.js b/spec/javascripts/app/views/aspect_create_view_spec.js index bd1a38c4b..bac0870ed 100644 --- a/spec/javascripts/app/views/aspect_create_view_spec.js +++ b/spec/javascripts/app/views/aspect_create_view_spec.js @@ -17,7 +17,6 @@ describe("app.views.AspectCreate", function() { expect(this.view.$("#newAspectModal.modal").length).toBe(1); expect(this.view.$("#newAspectModal form").length).toBe(1); expect(this.view.$("#newAspectModal input#aspect_name").length).toBe(1); - expect(this.view.$("#newAspectModal input#aspect_contacts_visible").length).toBe(1); expect(this.view.$("#newAspectModal .btn-primary").length).toBe(1); }); @@ -61,21 +60,6 @@ describe("app.views.AspectCreate", function() { expect(obj.name).toBe(name); }); - it("should send the correct contacts_visible to the server", function() { - this.view.createAspect(); - var obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); - /* jshint camelcase: false */ - expect(obj.contacts_visible).toBeFalsy(); - /* jshint camelcase: true */ - - this.view.$("input#aspect_contacts_visible").prop("checked", true); - this.view.createAspect(); - obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); - /* jshint camelcase: false */ - expect(obj.contacts_visible).toBeTruthy(); - /* jshint camelcase: true */ - }); - it("should send person_id = null to the server", function() { this.view.createAspect(); var obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); @@ -150,7 +134,6 @@ describe("app.views.AspectCreate", function() { expect(this.view.$("#newAspectModal.modal").length).toBe(1); expect(this.view.$("#newAspectModal form").length).toBe(1); expect(this.view.$("#newAspectModal input#aspect_name").length).toBe(1); - expect(this.view.$("#newAspectModal input#aspect_contacts_visible").length).toBe(1); expect(this.view.$("#newAspectModal .btn-primary").length).toBe(1); }); @@ -174,21 +157,6 @@ describe("app.views.AspectCreate", function() { expect(obj.name).toBe(name); }); - it("should send the correct contacts_visible to the server", function() { - this.view.createAspect(); - var obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); - /* jshint camelcase: false */ - expect(obj.contacts_visible).toBeFalsy(); - /* jshint camelcase: true */ - - this.view.$("input#aspect_contacts_visible").prop("checked", true); - this.view.createAspect(); - obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); - /* jshint camelcase: false */ - expect(obj.contacts_visible).toBeTruthy(); - /* jshint camelcase: true */ - }); - it("should send the correct person_id to the server", function() { this.view.createAspect(); var obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); diff --git a/spec/models/aspect_spec.rb b/spec/models/aspect_spec.rb index c5426bf7c..b65816ab2 100644 --- a/spec/models/aspect_spec.rb +++ b/spec/models/aspect_spec.rb @@ -30,10 +30,6 @@ describe Aspect, :type => :model do expect(aspect.contacts.size).to eq(1) end - it "has a contacts_visible? method" do - expect(alice.aspects.first.contacts_visible?).to be true - end - it "sets an order_id" do aspect_2 = alice.aspects.create(name: "People") expect(aspect_2.order_id).to eq(2) diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index dd5f5b27c..dc5be39b8 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -160,62 +160,6 @@ describe Contact, type: :model do end end - describe "#contacts" do - before do - bob.aspects.create(name: "next") - - @original_aspect = bob.aspects.where(name: "generic").first - @new_aspect = bob.aspects.where(name: "next").first - - @people1 = [] - @people2 = [] - - 1.upto(5) do - person = FactoryGirl.build(:person) - bob.contacts.create(person: person, aspects: [@original_aspect]) - @people1 << person - end - 1.upto(5) do - person = FactoryGirl.build(:person) - bob.contacts.create(person: person, aspects: [@new_aspect]) - @people2 << person - end - # eve <-> bob <-> alice - end - - context "on a contact for a local user" do - before do - alice.reload - alice.aspects.reload - @contact = alice.contact_for(bob.person) - end - - it "returns the target local user's contacts that are in the same aspect" do - expect(@contact.contacts.map(&:id)).to match_array([eve.person].concat(@people1).map(&:id)) - end - - it "returns nothing if contacts_visible is false in that aspect" do - @original_aspect.contacts_visible = false - @original_aspect.save - expect(@contact.contacts).to eq([]) - end - - it "returns no duplicate contacts" do - [alice, eve].each {|c| bob.add_contact_to_aspect(bob.contact_for(c.person), bob.aspects.last) } - contact_ids = @contact.contacts.map(&:id) - expect(contact_ids.uniq).to eq(contact_ids) - end - end - - context "on a contact for a remote user" do - let(:contact) { bob.contact_for @people1.first } - - it "returns an empty array" do - expect(contact.contacts).to eq([]) - end - end - end - describe "#receive" do it "shares back if auto_following is enabled" do alice.auto_follow_back = true diff --git a/spec/serializers/export/aspect_serializer_spec.rb b/spec/serializers/export/aspect_serializer_spec.rb index bd13b7b2b..eba297f19 100644 --- a/spec/serializers/export/aspect_serializer_spec.rb +++ b/spec/serializers/export/aspect_serializer_spec.rb @@ -6,9 +6,8 @@ describe Export::AspectSerializer do it "has aspect attributes" do expect(serializer.attributes).to eq( - name: aspect.name, - contacts_visible: aspect.contacts_visible, - chat_enabled: aspect.chat_enabled + name: aspect.name, + chat_enabled: aspect.chat_enabled ) end end diff --git a/spec/support/data_generator.rb b/spec/support/data_generator.rb index a2849a6f9..16f7d877b 100644 --- a/spec/support/data_generator.rb +++ b/spec/support/data_generator.rb @@ -170,7 +170,7 @@ class DataGenerator end def work_aspect - user.aspects.create(name: "Work", contacts_visible: false) + user.aspects.create(name: "Work") end def status_messages_flavours From 7d6623d069af2e6fe4f37d5d48c71c29683fa109 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sat, 7 Apr 2018 02:49:42 +0200 Subject: [PATCH 2/6] Remove contacts page on profiles closes #7769 --- Changelog.md | 1 + app/assets/javascripts/app/pages/profile.js | 4 --- app/assets/javascripts/app/router.js | 1 - .../app/views/profile_header_view.js | 7 ---- .../templates/profile_header_tpl.jst.hbs | 17 ---------- app/controllers/people_controller.rb | 25 -------------- app/controllers/photos_controller.rb | 1 - app/models/contact.rb | 11 ------ app/views/people/contacts.haml | 32 ----------------- config/locales/javascript/javascript.en.yml | 1 - config/routes.rb | 1 - features/desktop/contacts.feature | 17 ---------- spec/controllers/people_controller_spec.rb | 34 ------------------- 13 files changed, 1 insertion(+), 151 deletions(-) delete mode 100644 app/views/people/contacts.haml delete mode 100644 features/desktop/contacts.feature diff --git a/Changelog.md b/Changelog.md index e82800e7e..0f3e91f3c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ # 0.7.5.0 ## Refactor +* Remove the 'make contacts in this aspect visible to each other' option [#7769](https://github.com/diaspora/diaspora/pull/7769) ## Bug fixes * Prefill conversation form on contacts page only with mutual contacts [#7744](https://github.com/diaspora/diaspora/pull/7744) diff --git a/app/assets/javascripts/app/pages/profile.js b/app/assets/javascripts/app/pages/profile.js index f4eb21b4f..09e8db0d4 100644 --- a/app/assets/javascripts/app/pages/profile.js +++ b/app/assets/javascripts/app/pages/profile.js @@ -24,9 +24,6 @@ app.pages.Profile = app.views.Base.extend({ if (app.hasPreload("photos_count")) { this.photos = app.parsePreload("photos_count"); } - if (app.hasPreload("contacts_count")) { - this.contacts = app.parsePreload("contacts_count"); - } this.streamCollection = _.has(opts, "streamCollection") ? opts.streamCollection : null; this.streamViewClass = _.has(opts, "streamView") ? opts.streamView : null; @@ -70,7 +67,6 @@ app.pages.Profile = app.views.Base.extend({ return new app.views.ProfileHeader({ model: this.model, photos: this.photos, - contacts: this.contacts }); }, diff --git a/app/assets/javascripts/app/router.js b/app/assets/javascripts/app/router.js index 702edc903..265b3cd48 100644 --- a/app/assets/javascripts/app/router.js +++ b/app/assets/javascripts/app/router.js @@ -20,7 +20,6 @@ app.Router = Backbone.Router.extend({ "p/:id(/)": "singlePost", "people(/)": "peopleSearch", "people/:id(/)": "profile", - "people/:id/contacts(/)": "profile", "people/:id/photos(/)": "photos", "posts/:id(/)": "singlePost", "profile/edit(/)": "settings", diff --git a/app/assets/javascripts/app/views/profile_header_view.js b/app/assets/javascripts/app/views/profile_header_view.js index f23ffc680..4858f9719 100644 --- a/app/assets/javascripts/app/views/profile_header_view.js +++ b/app/assets/javascripts/app/views/profile_header_view.js @@ -14,7 +14,6 @@ app.views.ProfileHeader = app.views.Base.extend({ initialize: function(opts) { this.photos = _.has(opts, 'photos') ? opts.photos : null; - this.contacts = _.has(opts, 'contacts') ? opts.contacts : null; this.model.on("change", this.render, this); $("#mentionModal").on("modal:loaded", this.mentionModalLoaded.bind(this)); $("#mentionModal").on("hidden.bs.modal", this.mentionModalHidden); @@ -24,13 +23,11 @@ app.views.ProfileHeader = app.views.Base.extend({ return _.extend({}, this.defaultPresenter(), { show_profile_btns: this._shouldShowProfileBtns(), show_photos: this._shouldShowPhotos(), - show_contacts: this._shouldShowContacts(), is_blocked: this.model.isBlocked(), is_sharing: this.model.isSharing(), is_receiving: this.model.isReceiving(), is_mutual: this.model.isMutual(), has_tags: this._hasTags(), - contacts: this.contacts, photos: this.photos }); }, @@ -51,10 +48,6 @@ app.views.ProfileHeader = app.views.Base.extend({ return (this.photos && this.photos > 0); }, - _shouldShowContacts: function() { - return (this.contacts && this.contacts > 0); - }, - showMentionModal: function() { app.helpers.showModal("#mentionModal"); }, diff --git a/app/assets/templates/profile_header_tpl.jst.hbs b/app/assets/templates/profile_header_tpl.jst.hbs index e6f94881f..d24f37c3b 100644 --- a/app/assets/templates/profile_header_tpl.jst.hbs +++ b/app/assets/templates/profile_header_tpl.jst.hbs @@ -82,22 +82,5 @@
  • {{/if}} - {{#if show_contacts}} -
  • - {{#if is_own_profile}} - - - {{t 'profile.contacts'}} -
    {{contacts}}
    -
    - {{else}} - - - {{t 'profile.contacts'}} -
    {{contacts}}
    -
    - {{/if}} -
  • - {{/if}} diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index c47ff2ae2..9d33cf338 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -77,7 +77,6 @@ class PeopleController < ApplicationController end gon.preloads[:person] = @presenter.as_json gon.preloads[:photos_count] = Photo.visible(current_user, @person).count(:all) - gon.preloads[:contacts_count] = Contact.contact_contacts_for(current_user, @person).count(:all) respond_with @presenter, layout: "with_header" end @@ -123,30 +122,6 @@ class PeopleController < ApplicationController end end - def contacts - respond_to do |format| - format.json { head :not_acceptable } - - format.any do - @person = Person.find_by_guid(params[:person_id]) - - if @person - @contact = current_user.contact_for(@person) - @contacts_of_contact = Contact.contact_contacts_for(current_user, @person) - gon.preloads[:person] = PersonPresenter.new(@person, current_user).as_json - gon.preloads[:photos_count] = Photo.visible(current_user, @person).count(:all) - gon.preloads[:contacts_count] = @contacts_of_contact.count(:all) - @contacts_of_contact = @contacts_of_contact.paginate(page: params[:page], per_page: (params[:limit] || 15)) - @hashes = hashes_for_people @contacts_of_contact, @aspects - respond_with @person, layout: "with_header" - else - flash[:error] = I18n.t "people.show.does_not_exist" - redirect_to people_path - end - end - end - end - private def find_person diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb index 8ebc0908c..1f8a37182 100644 --- a/app/controllers/photos_controller.rb +++ b/app/controllers/photos_controller.rb @@ -31,7 +31,6 @@ class PhotosController < ApplicationController format.all do gon.preloads[:person] = @presenter.as_json gon.preloads[:photos_count] = Photo.visible(current_user, @person).count(:all) - gon.preloads[:contacts_count] = Contact.contact_contacts_for(current_user, @person).count(:all) render "people/show", layout: "with_header" end format.mobile { render "people/show" } diff --git a/app/models/contact.rb b/app/models/contact.rb index 6a7a5ce30..0fa2e4d89 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -61,17 +61,6 @@ class Contact < ApplicationRecord end end - def self.contact_contacts_for(user, person) - return none unless user - - if person == user.person - user.contact_people - else - contact = user.contact_for(person) - contact.try(:contacts) || none - end - end - # Follows back if user setting is set so def receive(_recipient_user_ids) user.share_with(person, user.auto_follow_back_aspect) if user.auto_follow_back && !receiving diff --git a/app/views/people/contacts.haml b/app/views/people/contacts.haml deleted file mode 100644 index 698f5951b..000000000 --- a/app/views/people/contacts.haml +++ /dev/null @@ -1,32 +0,0 @@ -- content_for :page_title do - = @person.name - -.container-fluid#profile_container - .row - .col-md-3 - .sidebar.profile-sidebar#profile - -# here be JS - - .col-md-9 - .profile_header - -# more JS - - .stream-container - #people-stream.stream - - @hashes.each do |hash| - = render partial: 'people/person', locals: hash - = will_paginate @contacts_of_contact, renderer: WillPaginate::ActionView::BootstrapLinkRenderer - --if user_signed_in? && @person - #new_status_message_pane - = render 'shared/modal', - path: new_status_message_path(:person_id => @person.id), - title: t('status_messages.new.mentioning', person: @person.name), - id: 'mentionModal' - - -if @contact - .conversations-form-container#new_conversation_pane - = render 'shared/modal', - path: new_conversation_path(:contact_id => @contact.id, name: @contact.person.name, modal: true), - title: t('conversations.index.new_conversation'), - id: 'conversationModal' diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml index 63e8dee68..b935267b5 100644 --- a/config/locales/javascript/javascript.en.yml +++ b/config/locales/javascript/javascript.en.yml @@ -233,7 +233,6 @@ en: gender: "Gender" born: "Birthday" photos: "Photos" - contacts: "Contacts" posts: "Posts" conversation: diff --git a/config/routes.rb b/config/routes.rb index ab8b75ffe..846921b8b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -164,7 +164,6 @@ Rails.application.routes.draw do resources :people, only: %i(show index) do resources :status_messages, only: %i(new create) resources :photos, except: %i(new update) - get :contacts get :stream get :hovercard diff --git a/features/desktop/contacts.feature b/features/desktop/contacts.feature deleted file mode 100644 index 89ef019a3..000000000 --- a/features/desktop/contacts.feature +++ /dev/null @@ -1,17 +0,0 @@ -@javascript -Feature: show contacts - - Background: - Given following users exist: - | username | email | - | Bob Jones | bob@bob.bob | - | Alice Smith | alice@alice.alice | - | Robert Grimm | robert@grimm.grimm | - And I sign in as "robert@grimm.grimm" - And I am on "alice@alice.alice"'s page - And I add the person to my "Unicorns" aspect - - Scenario: see own contacts on profile - When I am on "robert@grimm.grimm"'s page - And I press the first "#contacts_link" - Then I should be on the contacts page diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb index 740744525..e979a9c00 100644 --- a/spec/controllers/people_controller_spec.rb +++ b/spec/controllers/people_controller_spec.rb @@ -580,40 +580,6 @@ describe PeopleController, :type => :controller do end end - - describe '#contacts' do - it 'assigns the contacts of a person' do - contact = alice.contact_for(bob.person) - contacts = contact.contacts - get :contacts, params: {person_id: bob.person.to_param} - expect(assigns(:contacts_of_contact).to_a).to eq(contacts.to_a) - expect(response).to be_success - end - - it 'shows an error when invalid person id' do - get :contacts, params: {person_id: "foo"} - expect(flash[:error]).to be_present - expect(response).to redirect_to people_path - end - - it "displays the correct number of photos" do - 16.times do |i| - eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => true) - end - get :contacts, params: {person_id: eve.person.to_param} - expect(response.body).to include ',"photos_count":16' - - eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => false) - get :contacts, params: {person_id: eve.person.to_param} - expect(response.body).to include ',"photos_count":16' # eve is not sharing with alice - end - - it "returns a 406 for json format" do - get :contacts, params: {person_id: "foo"}, format: :json - expect(response.code).to eq("406") - end - end - describe '#diaspora_id?' do it 'returns true for pods on urls' do expect(@controller.send(:diaspora_id?, "ilya_123@pod.geraspora.de")).to be true From 01ae00451882aadaefd19941573755ef1e74fa13 Mon Sep 17 00:00:00 2001 From: Steffen van Bergerem Date: Sun, 8 Apr 2018 16:32:01 +0200 Subject: [PATCH 3/6] Make public stream accessible for logged out users Fixes #6564. closes #7775 --- Changelog.md | 1 + .../javascripts/app/views/stream_view.js | 2 +- app/assets/stylesheets/stream.scss | 4 + app/controllers/streams_controller.rb | 2 +- app/helpers/application_helper.rb | 4 + app/views/aspects/_aspect_stream.haml | 13 +- app/views/streams/main_stream.html.haml | 252 +++++++++--------- app/views/streams/main_stream.mobile.haml | 3 + features/desktop/keyboard_navigation.feature | 2 +- features/desktop/public_stream.feature | 4 + spec/controllers/streams_controller_spec.rb | 100 ++++--- spec/helpers/application_helper_spec.rb | 24 ++ 12 files changed, 240 insertions(+), 171 deletions(-) diff --git a/Changelog.md b/Changelog.md index 0f3e91f3c..d534ecf21 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,6 +9,7 @@ * Show error message when creating posts with invalid aspects [#7742](https://github.com/diaspora/diaspora/pull/7742) ## Features +* Make public stream accessible for logged out users [#7775](https://github.com/diaspora/diaspora/pull/7775) # 0.7.4.1 diff --git a/app/assets/javascripts/app/views/stream_view.js b/app/assets/javascripts/app/views/stream_view.js index 687822595..2a0fd9f9e 100644 --- a/app/assets/javascripts/app/views/stream_view.js +++ b/app/assets/javascripts/app/views/stream_view.js @@ -25,7 +25,7 @@ app.views.Stream = app.views.InfScroll.extend({ markNavSelected : function() { var activeStream = Backbone.history.fragment; - var streamSelection = $("#stream_selection"); + var streamSelection = $("#stream-selection"); streamSelection.find("[data-stream]").removeClass("selected"); streamSelection.find("[data-stream='" + activeStream + "']").addClass("selected"); diff --git a/app/assets/stylesheets/stream.scss b/app/assets/stylesheets/stream.scss index 38f8139f7..64c51974d 100644 --- a/app/assets/stylesheets/stream.scss +++ b/app/assets/stylesheets/stream.scss @@ -4,6 +4,10 @@ } } +.public-stream { + float: none; +} + .main-stream-publisher { margin-top: 20px; padding: 0; diff --git a/app/controllers/streams_controller.rb b/app/controllers/streams_controller.rb index 89190168c..0d0947616 100644 --- a/app/controllers/streams_controller.rb +++ b/app/controllers/streams_controller.rb @@ -5,7 +5,7 @@ # the COPYRIGHT file. class StreamsController < ApplicationController - before_action :authenticate_user! + before_action :authenticate_user!, except: :public before_action :save_selected_aspects, :only => :aspects layout proc { request.format == :mobile ? "application" : "with_header" } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f262b288a..213d034b6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -46,6 +46,10 @@ module ApplicationHelper current_user.services.size == AppConfig.configured_services.size end + def service_unconnected?(service) + AppConfig.show_service?(service, current_user) && current_user.services.none? {|x| x.provider == service } + end + def popover_with_close_html(without_close_html) without_close_html + link_to('×'.html_safe, "#", :class => 'close') end diff --git a/app/views/aspects/_aspect_stream.haml b/app/views/aspects/_aspect_stream.haml index 902528710..036640de3 100644 --- a/app/views/aspects/_aspect_stream.haml +++ b/app/views/aspects/_aspect_stream.haml @@ -2,12 +2,13 @@ -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. -.container-fluid.main-stream-publisher - .pull-left.hidden-xs - = owner_image_link - = render "publisher/publisher", publisher_aspects_for(stream) +- if user_signed_in? + .container-fluid.main-stream-publisher + .pull-left.hidden-xs + = owner_image_link + = render "publisher/publisher", publisher_aspects_for(stream) -- if current_user.getting_started? +- if current_user&.getting_started? .stream#main-stream{:title => popover_with_close_html("3. #{t('.stay_updated')}"), "data-content" => t(".stay_updated_explanation")} - else @@ -17,5 +18,5 @@ .loader.hidden .spinner -- if current_user.contacts.size < 2 +- if current_user && current_user.contacts.size < 2 = render 'aspects/no_contacts_message' diff --git a/app/views/streams/main_stream.html.haml b/app/views/streams/main_stream.html.haml index dd297185b..abc6f1f36 100644 --- a/app/views/streams/main_stream.html.haml +++ b/app/views/streams/main_stream.html.haml @@ -7,7 +7,7 @@ = javascript_include_tag :jsxc, id: 'jsxc', data: { endpoint: get_bosh_endpoint } -- if current_user.getting_started? +- if current_user&.getting_started? #welcome-to-diaspora .container-fluid .row @@ -22,159 +22,161 @@ .container-fluid .row - .col-md-3 - .sidebar.left-navbar - %ul#stream_selection - %li{data: {stream: "stream"}} - = link_to t("streams.multi.title"), stream_path, rel: "backbone", class: "hoverable" - %li.nested-list.my-activity{data: {stream: "activity"}} - = link_to t("streams.activity.title"), activity_stream_path, rel: "backbone", class: "hoverable" - %ul - %li{data: {stream: "liked"}} - = link_to t("streams.liked.title"), liked_stream_path, rel: "backbone", class: "hoverable selectable" - %li{data: {stream: "commented"}} - = link_to t("streams.commented.title"), commented_stream_path, - rel: "backbone", class: "hoverable selectable" - %li{data: {stream: "mentions"}} - = link_to t("streams.mentions.title"), mentioned_stream_path, rel: "backbone", class: "hoverable" - %li.nested-list.all-aspects - = render "aspects/aspect_listings", stream: @stream - %li.nested-list - = render "tags/followed_tags_listings" - %li{data: {stream: "public"}} - = link_to t("streams.public.title"), public_stream_path, rel: "backbone", class: "hoverable" + - if user_signed_in? + .col-md-3 + .sidebar.left-navbar + %ul#stream-selection + %li{data: {stream: "stream"}} + = link_to t("streams.multi.title"), stream_path, rel: "backbone", class: "hoverable" + %li.nested-list.my-activity{data: {stream: "activity"}} + = link_to t("streams.activity.title"), activity_stream_path, rel: "backbone", class: "hoverable" + %ul + %li{data: {stream: "liked"}} + = link_to t("streams.liked.title"), liked_stream_path, rel: "backbone", class: "hoverable selectable" + %li{data: {stream: "commented"}} + = link_to t("streams.commented.title"), commented_stream_path, + rel: "backbone", class: "hoverable selectable" + %li{data: {stream: "mentions"}} + = link_to t("streams.mentions.title"), mentioned_stream_path, rel: "backbone", class: "hoverable" + %li.nested-list.all-aspects + = render "aspects/aspect_listings", stream: @stream + %li.nested-list + = render "tags/followed_tags_listings" + %li{data: {stream: "public"}} + = link_to t("streams.public.title"), public_stream_path, rel: "backbone", class: "hoverable" + + .sidebar.info-bar.hidden-xs + - if AppConfig.settings.invitations.open? + .section.collapsed + .title + %h5.title-header + .entypo-triangle-right + .entypo-triangle-down + = t("shared.invitations.invite_your_friends") + .content + = render "shared/invitations" - .sidebar.info-bar.hidden-xs - - if AppConfig.settings.invitations.open? .section.collapsed .title %h5.title-header .entypo-triangle-right .entypo-triangle-down - = t("shared.invitations.invite_your_friends") + = t("aspects.index.new_here.title") .content - = render "shared/invitations" + != t("aspects.index.new_here.follow", + link: link_to("#" + t("shared.publisher.new_user_prefill.newhere"), + tag_path(name: t("shared.publisher.new_user_prefill.newhere")))) + %br + = link_to(t("aspects.index.new_here.learn_more"), + "http://wiki.diasporafoundation.org/Welcoming_Committee") - .section.collapsed - .title - %h5.title-header - .entypo-triangle-right - .entypo-triangle-down - = t("aspects.index.new_here.title") - .content - != t("aspects.index.new_here.follow", - link: link_to("#" + t("shared.publisher.new_user_prefill.newhere"), - tag_path(name: t("shared.publisher.new_user_prefill.newhere")))) - %br - = link_to(t("aspects.index.new_here.learn_more"), - "http://wiki.diasporafoundation.org/Welcoming_Committee") - - .section.collapsed - .title - %h5.title-header - .entypo-triangle-right - .entypo-triangle-down - = t("aspects.index.help.need_help") - .content - %p - = t("aspects.index.help.here_to_help") - %p - = t("aspects.index.help.do_you") - %ul - %li - != t("aspects.index.help.have_a_question", - link: link_to("#" + t("aspects.index.help.tag_question"), - tag_path(name: t("aspects.index.help.tag_question")))) - %li - != t("aspects.index.help.find_a_bug", - link: link_to(t("aspects.index.help.tag_bug"), - "https://wiki.diasporafoundation.org/How_to_report_a_bug")) - %li - != t("aspects.index.help.feature_suggestion", - link: link_to(t("aspects.index.help.tag_feature"), - "https://discourse.diasporafoundation.org/c/features-and-ideas")) - %p - != t("aspects.index.help.tutorials_and_wiki", - faq: link_to(t("_help"), help_path), - tutorial: link_to(t("aspects.index.help.tutorial_link_text"), - "https://diasporafoundation.org/tutorials", target: "_blank"), - wiki: link_to("Wiki", "http://wiki.diasporafoundation.org", - target: "_blank"), - target: "_blank") - - %p - != t("aspects.index.help.support_forum", - support_forum: link_to(t("aspects.index.help.support_forum_link"), - "https://discourse.diasporafoundation.org/c/support", target: "_blank")) - - - unless AppConfig.configured_services.blank? || all_services_connected? .section.collapsed .title %h5.title-header .entypo-triangle-right .entypo-triangle-down - = t("aspects.index.services.heading") + = t("aspects.index.help.need_help") .content - %div - = t("aspects.index.services.content") + %p + = t("aspects.index.help.here_to_help") + %p + = t("aspects.index.help.do_you") + %ul + %li + != t("aspects.index.help.have_a_question", + link: link_to("#" + t("aspects.index.help.tag_question"), + tag_path(name: t("aspects.index.help.tag_question")))) + %li + != t("aspects.index.help.find_a_bug", + link: link_to(t("aspects.index.help.tag_bug"), + "https://wiki.diasporafoundation.org/How_to_report_a_bug")) + %li + != t("aspects.index.help.feature_suggestion", + link: link_to(t("aspects.index.help.tag_feature"), + "https://discourse.diasporafoundation.org/c/features-and-ideas")) + %p + != t("aspects.index.help.tutorials_and_wiki", + faq: link_to(t("_help"), help_path), + tutorial: link_to(t("aspects.index.help.tutorial_link_text"), + "https://diasporafoundation.org/tutorials", target: "_blank"), + wiki: link_to("Wiki", "http://wiki.diasporafoundation.org", + target: "_blank"), + target: "_blank") - .right-service-icons - - AppConfig.configured_services.each do |service| - - if AppConfig.show_service?(service, current_user) - - unless current_user.services.any? {|x| x.provider == service } + %p + != t("aspects.index.help.support_forum", + support_forum: link_to(t("aspects.index.help.support_forum_link"), + "https://discourse.diasporafoundation.org/c/support", target: "_blank")) + + - unless AppConfig.configured_services.blank? || all_services_connected? + .section.collapsed + .title + %h5.title-header + .entypo-triangle-right + .entypo-triangle-down + = t("aspects.index.services.heading") + .content + %div + = t("aspects.index.services.content") + + .right-service-icons + - AppConfig.configured_services.each do |service| + - if service_unconnected?(service) = link_to(content_tag(:div, nil, class: "social-media-logos-#{service.to_s.downcase}-24x24", title: service.to_s.titleize), "/auth/#{service}") - .section.collapsed - .title - %h5.title-header - .entypo-triangle-right - .entypo-triangle-down - = t("bookmarklet.heading") - .content - != t("bookmarklet.explanation", link: link_to(t("bookmarklet.post_something"), bookmarklet_code)) - - - if donations_enabled? .section.collapsed .title %h5.title-header .entypo-triangle-right .entypo-triangle-down - = t("aspects.index.donate") + = t("bookmarklet.heading") + .content + != t("bookmarklet.explanation", link: link_to(t("bookmarklet.post_something"), bookmarklet_code)) + + - if donations_enabled? + .section.collapsed + .title + %h5.title-header + .entypo-triangle-right + .entypo-triangle-down + = t("aspects.index.donate") + .content + %p + = t("aspects.index.keep_pod_running", pod: AppConfig.pod_uri.host) + = render "shared/donatepod" + + - if AppConfig.admins.podmin_email.present? + .section.collapsed + .title + %h5.title-header + .entypo-triangle-right + .entypo-triangle-down + = t("aspects.index.help.any_problem") + .content + %p + = t("aspects.index.help.contact_podmin") + %p + = link_to t("aspects.index.help.mail_podmin"), "mailto:#{AppConfig.admins.podmin_email}" + + .excellence-box .content %p - = t("aspects.index.keep_pod_running", pod: AppConfig.pod_uri.host) - = render "shared/donatepod" + = link_to t("layouts.application.be_excellent"), "https://diasporafoundation.org/community_guidelines" - - if AppConfig.admins.podmin_email.present? - .section.collapsed - .title - %h5.title-header - .entypo-triangle-right - .entypo-triangle-down - = t("aspects.index.help.any_problem") + .info-links .content - %p - = t("aspects.index.help.contact_podmin") - %p - = link_to t("aspects.index.help.mail_podmin"), "mailto:#{AppConfig.admins.podmin_email}" + %ul + = render "shared/links" - .excellence-box - .content - %p - = link_to t("layouts.application.be_excellent"), "https://diasporafoundation.org/community_guidelines" + .powered-box + .content + .powered-by-diaspora.text-center + = link_to t("layouts.application.powered_by"), "https://diasporafoundation.org" - .info-links - .content - %ul - = render "shared/links" - - .powered-box - .content - .powered-by-diaspora.text-center - = link_to t("layouts.application.powered_by"), "https://diasporafoundation.org" - - .col-md-9 + .col-md-9{class: ("center-block public-stream" unless user_signed_in?)} .stream-container#aspect-stream-container + - unless user_signed_in? + %h2= @stream.title = render "aspects/aspect_stream", stream: @stream diff --git a/app/views/streams/main_stream.mobile.haml b/app/views/streams/main_stream.mobile.haml index 7b84c08e2..ce8eb270f 100644 --- a/app/views/streams/main_stream.mobile.haml +++ b/app/views/streams/main_stream.mobile.haml @@ -2,6 +2,9 @@ -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. +- unless user_signed_in? + %h1= @stream.title + #main-stream.stream = render 'shared/stream', posts: @stream.stream_posts = render 'shared/stream_more_button' diff --git a/features/desktop/keyboard_navigation.feature b/features/desktop/keyboard_navigation.feature index f153e6e8f..b1e9078f3 100644 --- a/features/desktop/keyboard_navigation.feature +++ b/features/desktop/keyboard_navigation.feature @@ -25,7 +25,7 @@ Feature: Keyboard navigation Scenario: navigate downwards after changing the stream When I go to the activity stream page And I click on selector "[data-stream='stream'] a" - Then I should see "Stream" within "#stream_selection .selected" + Then I should see "Stream" within "#stream-selection .selected" When I press the "J" key somewhere Then post 1 should be highlighted diff --git a/features/desktop/public_stream.feature b/features/desktop/public_stream.feature index 02449b93c..8e53e1070 100644 --- a/features/desktop/public_stream.feature +++ b/features/desktop/public_stream.feature @@ -12,3 +12,7 @@ Feature: The public stream When I sign in as "alice@alice.alice" And I am on the public stream page Then I should see "Bob’s public post" + + Scenario: seeing public posts as a logged out user + When I am on the public stream page + Then I should see "Bob’s public post" diff --git a/spec/controllers/streams_controller_spec.rb b/spec/controllers/streams_controller_spec.rb index 9eb5e56ee..d46c22887 100644 --- a/spec/controllers/streams_controller_spec.rb +++ b/spec/controllers/streams_controller_spec.rb @@ -7,54 +7,80 @@ describe StreamsController, :type => :controller do include_context :gon - before do - sign_in alice - end - - describe "#public" do - it "succeeds" do - get :public - expect(response).to be_success - end - end - - describe '#multi' do - it 'succeeds' do - get :multi - expect(response).to be_success + context "with a logged in user" do + before do + sign_in alice end - it 'succeeds on mobile' do - get :multi, :format => :mobile - expect(response).to be_success + describe "#public" do + it "succeeds" do + get :public + expect(response).to be_success + end end - context "getting started" do - it "add the inviter to gon" do - user = FactoryGirl.create(:user, getting_started: true, invited_by: alice) - sign_in user - + describe "#multi" do + it "succeeds" do get :multi + expect(response).to be_success + end - expect(gon["preloads"][:mentioned_person][:name]).to eq(alice.person.name) - expect(gon["preloads"][:mentioned_person][:handle]).to eq(alice.person.diaspora_handle) + it "succeeds on mobile" do + get :multi, format: :mobile + expect(response).to be_success + end + + context "getting started" do + it "add the inviter to gon" do + user = FactoryGirl.create(:user, getting_started: true, invited_by: alice) + sign_in user + + get :multi + + expect(gon["preloads"][:mentioned_person][:name]).to eq(alice.person.name) + expect(gon["preloads"][:mentioned_person][:handle]).to eq(alice.person.diaspora_handle) + end + end + end + + streams = { + liked: Stream::Likes, + mentioned: Stream::Mention, + followed_tags: Stream::FollowedTag, + activity: Stream::Activity + } + + streams.each do |stream_path, stream_class| + describe "a GET to #{stream_path}" do + it "assigns a stream of the proper class" do + get stream_path + expect(response).to be_success + expect(assigns[:stream]).to be_a stream_class + end end end end - streams = { - :liked => Stream::Likes, - :mentioned => Stream::Mention, - :followed_tags => Stream::FollowedTag, - :activity => Stream::Activity - } - - streams.each do |stream_path, stream_class| - describe "a GET to #{stream_path}" do - it 'assigns a stream of the proper class' do - get stream_path + context "with no user signed in" do + describe "#public" do + it "succeeds" do + get :public expect(response).to be_success - expect(assigns[:stream]).to be_a stream_class + end + + it "succeeds on mobile" do + get :public, format: :mobile + expect(response).to be_success + end + end + + describe "other streams" do + it "redirects to the login page" do + %i[activity followed_tags liked mentioned multi].each do |stream_path| + get stream_path + expect(response).to be_redirect + expect(response).to redirect_to new_user_session_path + end end end end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 569360e94..feb94673c 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -35,6 +35,30 @@ describe ApplicationHelper, :type => :helper do end end + describe "#service_unconnected?" do + attr_reader :current_user + + before do + @current_user = alice + end + + it "returns true if the service is unconnected" do + expect(AppConfig).to receive(:show_service?).with("service", alice).and_return(true) + expect(service_unconnected?("service")).to be true + end + + it "returns false if the service is already connected" do + @current_user.services << FactoryGirl.build(:service, provider: "service") + expect(AppConfig).to receive(:show_service?).with("service", alice).and_return(true) + expect(service_unconnected?("service")).to be false + end + + it "returns false if the the service shouldn't be shown" do + expect(AppConfig).to receive(:show_service?).with("service", alice).and_return(false) + expect(service_unconnected?("service")).to be false + end + end + describe "#jquery_include_tag" do describe "with jquery cdn" do before do From 4aec9fbb42b06e9e7e78e4cab0675b033829c614 Mon Sep 17 00:00:00 2001 From: Steffen van Bergerem Date: Mon, 9 Apr 2018 00:18:37 +0200 Subject: [PATCH 4/6] Fix mention syntax backport for two immediately consecutive mentions Fixes #7695. closes #7777 --- Changelog.md | 1 + lib/diaspora/mentionable.rb | 2 +- spec/lib/diaspora/mentionable_spec.rb | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index d534ecf21..e70e51465 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ * Prefill conversation form on contacts page only with mutual contacts [#7744](https://github.com/diaspora/diaspora/pull/7744) * Fix profiles sometimes not loading properly in background tabs [#7740](https://github.com/diaspora/diaspora/pull/7740) * Show error message when creating posts with invalid aspects [#7742](https://github.com/diaspora/diaspora/pull/7742) +* Fix mention syntax backport for two immediately consecutive mentions [#7777](https://github.com/diaspora/diaspora/pull/7777) ## Features * Make public stream accessible for logged out users [#7775](https://github.com/diaspora/diaspora/pull/7775) diff --git a/lib/diaspora/mentionable.rb b/lib/diaspora/mentionable.rb index 81ade53b7..59f2da8f0 100644 --- a/lib/diaspora/mentionable.rb +++ b/lib/diaspora/mentionable.rb @@ -72,7 +72,7 @@ module Diaspora::Mentionable end # Regex to find mentions with new syntax, only used for backporting to old syntax - NEW_SYNTAX_REGEX = /@\{[^ ]+\}/ + NEW_SYNTAX_REGEX = /@\{[^\} ]+\}/ # replaces new syntax with old syntax, to be compatible with old pods # @deprecated remove when most of the posts can handle the new syntax diff --git a/spec/lib/diaspora/mentionable_spec.rb b/spec/lib/diaspora/mentionable_spec.rb index aef3e12f4..25926d898 100644 --- a/spec/lib/diaspora/mentionable_spec.rb +++ b/spec/lib/diaspora/mentionable_spec.rb @@ -217,6 +217,13 @@ STR expect(Diaspora::Mentionable.backport_mention_syntax(text)).to eq(expected_text) end + it "replaces the new syntax with the old syntax for immediately consecutive mentions" do + text = "mention @{#{people[0].diaspora_handle}}@{#{people[1].diaspora_handle}} text" + expected_text = "mention @{#{people[0].name}; #{people[0].diaspora_handle}}" \ + "@{#{people[1].name}; #{people[1].diaspora_handle}} text" + expect(Diaspora::Mentionable.backport_mention_syntax(text)).to eq(expected_text) + end + it "removes curly braces from name of the mentioned person when adding it" do profile = FactoryGirl.build(:profile, first_name: "{Alice}", last_name: "(Smith) [123]") person = FactoryGirl.create(:person, profile: profile) From e31ca1fd3b96e1a84927fc1f27b18ef3acf44cfc Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 11 Apr 2018 01:45:55 +0200 Subject: [PATCH 5/6] Fix link to "Make yourself an admin" --- app/views/home/podmin.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/home/podmin.haml b/app/views/home/podmin.haml index 35812647f..7b502870c 100644 --- a/app/views/home/podmin.haml +++ b/app/views/home/podmin.haml @@ -31,7 +31,7 @@ %span.entypo-key = t(".make_yourself_an_admin") != t(".make_yourself_an_admin_info", - wiki: link_to("diaspora* wiki", "https://wiki.diasporafoundation.org/FAQ_for_pod_maintainers#What_are_roles_and_how_do_I_use_them.3F_.2F_Make_yourself_an_admin"), + wiki: link_to("diaspora* wiki", "https://wiki.diasporafoundation.org/Permalink:FAQ_-_Add_admin"), admin_dashboard: link_to(t("javascripts.header.admin"), admin_dashboard_path)) .row From 686310fb8e3514e5e827b272a4e44b14f5711ab7 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 11 Apr 2018 01:51:23 +0200 Subject: [PATCH 6/6] Simplify /podmin redirect Some podmins were confuse how they can disable this redirect and I think the rule with two users can actually be a little confusing. I think the main goal of this page to give the podmin a little start and I think after they configured everything, the pod works and they found the link to the wiki to make themself an admin, it is OK to remove the redirect. Also it's bad for single-user pods where this page always stays active, even if they are an admin, but have only one user. It's more useful for single-user pods to have the login on the home page. closes #7783 --- Changelog.md | 2 ++ app/controllers/home_controller.rb | 2 +- spec/controllers/home_controller_spec.rb | 23 +++-------------------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/Changelog.md b/Changelog.md index e70e51465..86eb81f1b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,12 +2,14 @@ ## Refactor * Remove the 'make contacts in this aspect visible to each other' option [#7769](https://github.com/diaspora/diaspora/pull/7769) +* Remove the requirement to have at least two users to disable the /podmin redirect [#7783](https://github.com/diaspora/diaspora/pull/7783) ## Bug fixes * Prefill conversation form on contacts page only with mutual contacts [#7744](https://github.com/diaspora/diaspora/pull/7744) * Fix profiles sometimes not loading properly in background tabs [#7740](https://github.com/diaspora/diaspora/pull/7740) * Show error message when creating posts with invalid aspects [#7742](https://github.com/diaspora/diaspora/pull/7742) * Fix mention syntax backport for two immediately consecutive mentions [#7777](https://github.com/diaspora/diaspora/pull/7777) +* Fix link to 'make yourself an admin' [#7783](https://github.com/diaspora/diaspora/pull/7783) ## Features * Make public stream accessible for logged out users [#7775](https://github.com/diaspora/diaspora/pull/7775) diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index feaddad14..8d24202e8 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -21,7 +21,7 @@ class HomeController < ApplicationController partial_dir.join("_show.html.erb").exist? || partial_dir.join("_show.haml").exist? render :show - elsif User.count > 1 && Role.where(name: "admin").any? + elsif Role.admins.any? render :default else redirect_to podmin_path diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index 82cc10711..6f8b8e031 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -6,31 +6,14 @@ describe HomeController, type: :controller do describe "#show" do - it "does not redirect for :html if there are at least 2 users and an admin" do - allow(User).to receive(:count).and_return(2) - allow(Role).to receive_message_chain(:where, :any?).and_return(true) - allow(Role).to receive_message_chain(:where, :exists?).and_return(true) + it "does not redirect for :html if there is at least one admin" do + expect(Role).to receive_message_chain(:admins, :any?).and_return(true) get :show expect(response).not_to be_redirect end - it "redirects to the podmin page for :html if there are less than 2 users" do - allow(User).to receive(:count).and_return(1) - allow(Role).to receive_message_chain(:where, :any?).and_return(true) - get :show - expect(response).to redirect_to(podmin_path) - end - it "redirects to the podmin page for :html if there is no admin" do - allow(User).to receive(:count).and_return(2) - allow(Role).to receive_message_chain(:where, :any?).and_return(false) - get :show - expect(response).to redirect_to(podmin_path) - end - - it "redirects to the podmin page for :html if there are less than 2 users and no admin" do - allow(User).to receive(:count).and_return(0) - allow(Role).to receive_message_chain(:where, :any?).and_return(false) + expect(Role).to receive_message_chain(:admins, :any?).and_return(false) get :show expect(response).to redirect_to(podmin_path) end