diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index cf711fc0..79360403 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -23,15 +23,15 @@ class UsersController < ApplicationController if user_params[:password] == '' && user_params[:password_confirmation] == '' # not trying to change the password if @user.update_attributes(user_params.except(:password, :password_confirmation)) - update_follow_settings(@user, params[:settings]) if is_tester(@user) + update_follow_settings(@user, params[:settings]) @user.image = nil if params[:remove_image] == '1' @user.save - sign_in(@user, bypass: true) + bypass_sign_in(@user) respond_to do |format| format.html { redirect_to root_url, notice: 'Settings updated' } end else - sign_in(@user, bypass: true) + bypass_sign_in(@user) respond_to do |format| format.html { redirect_to edit_user_path(@user), notice: @user.errors.to_a[0] } end diff --git a/app/models/user.rb b/app/models/user.rb index bb22f972..feac3d08 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -58,8 +58,8 @@ class User < ApplicationRecord admin: admin } if (_options[:follows]) json['follows'] = { - topics: following.where(followed_type: 'Topic').to_a.map(&:followed_id), - maps: following.where(followed_type: 'Map').to_a.map(&:followed_id) + topics: following.where(muted: false, followed_type: 'Topic').to_a.map(&:followed_id), + maps: following.where(muted: false, followed_type: 'Map').to_a.map(&:followed_id) } end if (_options[:follow_settings]) diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 8434baca..be70cf84 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -3,18 +3,20 @@ class FollowService class << self def follow(entity, user, reason) - return unless user && is_tester(user) + return unless user return if (reason == 'created' || reason == 'contributed') && !should_auto_follow(entity, user, reason) follow = Follow.where(followed: entity, user: user).first_or_create + follow.update_attribute('muted', false) if FollowReason::REASONS.include?(reason) && !follow.follow_reason.read_attribute(reason) follow.follow_reason.update_attribute(reason, true) end end def unfollow(entity, user) - Follow.where(followed: entity, user: user).destroy_all + follow = Follow.where(followed: entity, user: user).first + follow.update_attribute('muted', true) end def remove_reason(entity, user, reason) @@ -31,6 +33,8 @@ class FollowService protected def should_auto_follow(entity, user, reason) + follow = Follow.where(followed: entity, user: user).first + return false if follow && follow.muted if entity.class == Topic if reason == 'created' return user.settings.follow_topic_on_created == '1' diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 81467b2c..ba1203b8 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -54,7 +54,8 @@ class NotificationService def self.notify_followers(entity, event_type, event, reason_filter = nil, exclude_follows = nil) follows = entity.follows.where.not(user_id: event.user.id) - + follows = follows.where(muted: false) + if !exclude_follows.nil? follows = follows.where.not(id: exclude_follows) end diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 0bd2a366..4ea6130f 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -45,24 +45,22 @@ <%= form.check_box :emails_allowed, class: 'inline' %> Send Metamaps notifications to my email. <% end %> - <% if is_tester(@user) %> - <%= fields_for :settings, @user.settings do |settings| %> - <%= settings.label :follow_topic_on_created, class: 'firstFieldText' do %> - <%= settings.check_box :follow_topic_on_created, class: 'inline' %> - Auto-follow topics you create. - <% end %> - <%= settings.label :follow_topic_on_contributed, class: 'firstFieldText' do %> - <%= settings.check_box :follow_topic_on_contributed, class: 'inline' %> - Auto-follow topics you edit. - <% end %> - <%= settings.label :follow_map_on_created, class: 'firstFieldText' do %> - <%= settings.check_box :follow_map_on_created, class: 'inline' %> - Auto-follow maps you create. - <% end %> - <%= settings.label :follow_map_on_contributed, class: 'firstFieldText' do %> - <%= settings.check_box :follow_map_on_contributed, class: 'inline' %> - Auto-follow maps you edit. - <% end %> + <%= fields_for :settings, @user.settings do |settings| %> + <%= settings.label :follow_topic_on_created, class: 'firstFieldText' do %> + <%= settings.check_box :follow_topic_on_created, class: 'inline' %> + Auto-follow topics you create. + <% end %> + <%= settings.label :follow_topic_on_contributed, class: 'firstFieldText' do %> + <%= settings.check_box :follow_topic_on_contributed, class: 'inline' %> + Auto-follow topics you edit + <% end %> + <%= settings.label :follow_map_on_created, class: 'firstFieldText' do %> + <%= settings.check_box :follow_map_on_created, class: 'inline' %> + Auto-follow maps you create. + <% end %> + <%= settings.label :follow_map_on_contributed, class: 'firstFieldText' do %> + <%= settings.check_box :follow_map_on_contributed, class: 'inline' %> + Auto-follow maps you edit. <% end %> <% end %> diff --git a/db/migrate/20170903180840_add_muted_to_follows.rb b/db/migrate/20170903180840_add_muted_to_follows.rb new file mode 100644 index 00000000..31649639 --- /dev/null +++ b/db/migrate/20170903180840_add_muted_to_follows.rb @@ -0,0 +1,5 @@ +class AddMutedToFollows < ActiveRecord::Migration[5.0] + def change + add_column :follows, :muted, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 21a2447b..6a6d3097 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170209215911) do +ActiveRecord::Schema.define(version: 20170903180840) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -86,6 +86,7 @@ ActiveRecord::Schema.define(version: 20170209215911) do t.integer "followed_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.boolean "muted" t.index ["followed_type", "followed_id"], name: "index_follows_on_followed_type_and_followed_id", using: :btree t.index ["user_id"], name: "index_follows_on_user_id", using: :btree end diff --git a/frontend/src/Metamaps/DataModel/Topic.js b/frontend/src/Metamaps/DataModel/Topic.js index 10acc5b1..29c271d4 100644 --- a/frontend/src/Metamaps/DataModel/Topic.js +++ b/frontend/src/Metamaps/DataModel/Topic.js @@ -105,6 +105,10 @@ const Topic = Backbone.Model.extend({ var onPageWithTopicCard = Active.Map || Active.Topic var node = this.get('node') + if (Active.Mapper.get('follow_topic_on_contributed')) { + Active.Mapper.followTopic(this.id) + } + // update the node on the map if (onPageWithTopicCard && node) { node.name = this.get('name') diff --git a/frontend/src/components/Maps/MapCard.js b/frontend/src/components/Maps/MapCard.js index bd1b137c..b2b36d7c 100644 --- a/frontend/src/components/Maps/MapCard.js +++ b/frontend/src/components/Maps/MapCard.js @@ -1,7 +1,6 @@ import React, { Component, PropTypes } from 'react' import { Link } from 'react-router' import { find, values } from 'lodash' -import Util from '../../Metamaps/Util' const IN_CONVERSATION = 1 // shared with /realtime/reducer.js @@ -38,7 +37,7 @@ class Menu extends Component { } diff --git a/frontend/src/components/TopicCard/index.js b/frontend/src/components/TopicCard/index.js index e3297dad..0ed56224 100644 --- a/frontend/src/components/TopicCard/index.js +++ b/frontend/src/components/TopicCard/index.js @@ -6,7 +6,6 @@ import Links from './Links' import Desc from './Desc' import Attachments from './Attachments' import Follow from './Follow' -import Util from '../../Metamaps/Util' class ReactTopicCard extends Component { render = () => { @@ -53,7 +52,7 @@ class ReactTopicCard extends Component { authorizedToEdit={authorizedToEdit} updateTopic={wrappedUpdateTopic} /> - {Util.isTester(currentUser) && } +