diff --git a/app/controllers/api/v1/lists_controller.rb b/app/controllers/api/v1/lists_controller.rb index e5ac45fef..4ff3f8505 100644 --- a/app/controllers/api/v1/lists_controller.rb +++ b/app/controllers/api/v1/lists_controller.rb @@ -38,6 +38,6 @@ class Api::V1::ListsController < Api::BaseController end def list_params - params.permit(:title, :replies_policy) + params.permit(:title, :replies_policy, :show_self) end end diff --git a/app/javascript/flavours/glitch/actions/lists.js b/app/javascript/flavours/glitch/actions/lists.js index c2309b8c2..30ec6442d 100644 --- a/app/javascript/flavours/glitch/actions/lists.js +++ b/app/javascript/flavours/glitch/actions/lists.js @@ -150,10 +150,10 @@ export const createListFail = error => ({ error, }); -export const updateList = (id, title, shouldReset, replies_policy) => (dispatch, getState) => { +export const updateList = (id, title, shouldReset, replies_policy, show_self) => (dispatch, getState) => { dispatch(updateListRequest(id)); - api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy }).then(({ data }) => { + api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy, show_self }).then(({ data }) => { dispatch(updateListSuccess(data)); if (shouldReset) { diff --git a/app/javascript/flavours/glitch/features/list_timeline/index.js b/app/javascript/flavours/glitch/features/list_timeline/index.js index ef829b937..c634417ce 100644 --- a/app/javascript/flavours/glitch/features/list_timeline/index.js +++ b/app/javascript/flavours/glitch/features/list_timeline/index.js @@ -13,10 +13,12 @@ import { fetchList, deleteList, updateList } from 'flavours/glitch/actions/lists import { openModal } from 'flavours/glitch/actions/modal'; import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import Toggle from 'react-toggle'; const messages = defineMessages({ deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' }, deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' }, + show_self: { id: 'lists.show_self', defaultMessage: 'Include your own toots' }, all_replies: { id: 'lists.replies_policy.all_replies', defaultMessage: 'any followed user' }, no_replies: { id: 'lists.replies_policy.no_replies', defaultMessage: 'no one' }, list_replies: { id: 'lists.replies_policy.list_replies', defaultMessage: 'members of the list' }, @@ -114,6 +116,14 @@ export default class ListTimeline extends React.PureComponent { })); } + handleShowSelfChange = ({ target }) => { + const { dispatch, list } = this.props; + const { id } = this.props.params; + const replies_policy = list ? list.get('replies_policy') : undefined; + const show_self = list ? list.get('show_self') : false; + this.props.dispatch(updateList(id, undefined, false, replies_policy, !show_self)); + } + handleRepliesPolicyChange = ({ target }) => { const { dispatch, list } = this.props; const { id } = this.props.params; @@ -126,6 +136,7 @@ export default class ListTimeline extends React.PureComponent { const pinned = !!columnId; const title = list ? list.get('title') : id; const replies_policy = list ? list.get('replies_policy') : undefined; + const show_self = list ? list.get('show_self') : false; if (typeof list === 'undefined') { return ( @@ -167,6 +178,15 @@ export default class ListTimeline extends React.PureComponent { +
+
+ + +
+
+ { replies_policy !== undefined && (
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 9417a745d..3c628c869 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -226,6 +226,7 @@ "lists.new.title_placeholder": "New list title", "lists.search": "Search among monsters in your pack", "lists.subheading": "Your lists", + "lists.show_self": "Include your own roars", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", diff --git a/app/models/list.rb b/app/models/list.rb index 8493046e5..c3aab9606 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -9,6 +9,7 @@ # created_at :datetime not null # updated_at :datetime not null # replies_policy :integer default("list_replies"), not null +# show_self :boolean default(FALSE), not null # class List < ApplicationRecord diff --git a/app/serializers/rest/list_serializer.rb b/app/serializers/rest/list_serializer.rb index 3e87f7119..86d885b55 100644 --- a/app/serializers/rest/list_serializer.rb +++ b/app/serializers/rest/list_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class REST::ListSerializer < ActiveModel::Serializer - attributes :id, :title, :replies_policy + attributes :id, :title, :replies_policy, :show_self def id object.id.to_s diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index f2e0415cf..2efd51445 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -64,6 +64,12 @@ class FanOutOnWriteService < BaseService def deliver_to_lists(status) Rails.logger.debug "Delivering status #{status.id} to lists" + List.where(account_id: status.account.id, show_self: true).select(:id).reorder(nil).find_in_batches do |lists| + FeedInsertWorker.push_bulk(lists) do |list| + [status.id, list.id, :list] + end + end + status.account.lists_for_local_distribution.select(:id).reorder(nil).find_in_batches do |lists| FeedInsertWorker.push_bulk(lists) do |list| [status.id, list.id, :list] diff --git a/db/migrate/20190428055312_add_show_self_to_lists.rb b/db/migrate/20190428055312_add_show_self_to_lists.rb new file mode 100644 index 000000000..5add9843b --- /dev/null +++ b/db/migrate/20190428055312_add_show_self_to_lists.rb @@ -0,0 +1,5 @@ +class AddShowSelfToLists < ActiveRecord::Migration[5.2] + def change + safety_assured { add_column :lists, :show_self, :boolean, default: false, null: false } + end +end diff --git a/db/schema.rb b/db/schema.rb index e621feb46..30121e4b4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -361,6 +361,7 @@ ActiveRecord::Schema.define(version: 2019_05_19_130537) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "replies_policy", default: 0, null: false + t.boolean "show_self", default: false, null: false t.index ["account_id"], name: "index_lists_on_account_id" end