diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/accounts_controller.rb | 8 | ||||
-rw-r--r-- | app/controllers/application_controller.rb | 5 | ||||
-rw-r--r-- | app/controllers/follower_accounts_controller.rb | 1 | ||||
-rw-r--r-- | app/controllers/relationships_controller.rb | 19 | ||||
-rw-r--r-- | app/controllers/statuses_controller.rb | 4 | ||||
-rw-r--r-- | app/helpers/admin/filter_helper.rb | 2 | ||||
-rw-r--r-- | app/javascript/mastodon/actions/notifications.js | 2 | ||||
-rw-r--r-- | app/javascript/mastodon/locales/defaultMessages.json | 39 | ||||
-rw-r--r-- | app/javascript/mastodon/locales/en.json | 5 | ||||
-rw-r--r-- | app/javascript/mastodon/locales/ja.json | 2 | ||||
-rw-r--r-- | app/javascript/styles/mastodon/tables.scss | 24 | ||||
-rw-r--r-- | app/lib/activitypub/activity/flag.rb | 7 | ||||
-rw-r--r-- | app/models/report.rb | 11 | ||||
-rw-r--r-- | app/models/status.rb | 2 | ||||
-rw-r--r-- | app/serializers/activitypub/flag_serializer.rb | 1 | ||||
-rw-r--r-- | app/services/report_service.rb | 3 | ||||
-rw-r--r-- | app/views/relationships/show.html.haml | 11 |
17 files changed, 99 insertions, 47 deletions
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 157ea8569..fcdebb47f 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -11,6 +11,8 @@ class AccountsController < ApplicationController respond_to do |format| format.html do use_pack 'public' + mark_cacheable! unless user_signed_in? + @body_classes = 'with-modals' @pinned_statuses = [] @endorsed_accounts = @account.endorsed_accounts.to_a.sample(4) @@ -31,17 +33,21 @@ class AccountsController < ApplicationController end format.atom do + mark_cacheable! + @entries = @account.stream_entries.where(hidden: false).with_includes.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id]) render xml: OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, @entries.reject { |entry| entry.status.nil? || entry.status.local_only? })) end format.rss do + mark_cacheable! + @statuses = cache_collection(default_statuses.without_reblogs.without_replies.limit(PAGE_SIZE), Status) render xml: RSS::AccountSerializer.render(@account, @statuses) end format.json do - skip_session! + mark_cacheable! render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0209805d0..5401b9d59 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -227,6 +227,11 @@ class ApplicationController < ActionController::Base response.headers['Vary'] = 'Accept' end + def mark_cacheable! + skip_session! + expires_in 0, public: true + end + def skip_session! request.session_options[:skip] = true end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index f985f0eff..213c209ab 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -7,6 +7,7 @@ class FollowerAccountsController < ApplicationController respond_to do |format| format.html do use_pack 'public' + mark_cacheable! unless user_signed_in? next if @account.user_hides_network? diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb index af91cb658..a0b9c77df 100644 --- a/app/controllers/relationships_controller.rb +++ b/app/controllers/relationships_controller.rb @@ -32,17 +32,18 @@ class RelationshipsController < ApplicationController def relationships_scope scope = begin if following_relationship? - current_account.following.includes(:account_stat) + current_account.following.joins(:account_stat) else - current_account.followers.includes(:account_stat) + current_account.followers.joins(:account_stat) end end scope.merge!(Follow.recent) scope.merge!(mutual_relationship_scope) if mutual_relationship? - scope.merge!(abandoned_account_scope) if params[:status] == 'abandoned' - scope.merge!(active_account_scope) if params[:status] == 'active' + scope.merge!(moved_account_scope) if params[:status] == 'moved' + scope.merge!(primary_account_scope) if params[:status] == 'primary' scope.merge!(by_domain_scope) if params[:by_domain].present? + scope.merge!(dormant_account_scope) if params[:activity] == 'dormant' scope end @@ -51,14 +52,18 @@ class RelationshipsController < ApplicationController Account.where(id: current_account.following) end - def abandoned_account_scope + def moved_account_scope Account.where.not(moved_to_account_id: nil) end - def active_account_scope + def primary_account_scope Account.where(moved_to_account_id: nil) end + def dormant_account_scope + AccountStat.where(last_status_at: nil).or(AccountStat.where(AccountStat.arel_table[:last_status_at].lt(1.month.ago))) + end + def by_domain_scope Account.where(domain: params[:by_domain]) end @@ -80,7 +85,7 @@ class RelationshipsController < ApplicationController end def current_params - params.slice(:page, :status, :relationship, :by_domain).permit(:page, :status, :relationship, :by_domain) + params.slice(:page, :status, :relationship, :by_domain, :activity).permit(:page, :status, :relationship, :by_domain, :activity) end def action_from_button diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 6f56a67ba..53cf1c4ca 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -28,6 +28,8 @@ class StatusesController < ApplicationController respond_to do |format| format.html do use_pack 'public' + mark_cacheable! unless user_signed_in? + @body_classes = 'with-modals' set_ancestors @@ -37,7 +39,7 @@ class StatusesController < ApplicationController end format.json do - skip_session! unless @stream_entry.hidden? + mark_cacheable! unless @stream_entry.hidden? render_cached_json(['activitypub', 'note', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter) diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 09a356296..4fd36ef42 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -7,7 +7,7 @@ module Admin::FilterHelper CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze TAGS_FILTERS = %i(hidden).freeze INSTANCES_FILTERS = %i(limited by_domain).freeze - FOLLOWERS_FILTERS = %i(relationship status by_domain).freeze + FOLLOWERS_FILTERS = %i(relationship status by_domain activity).freeze FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS + FOLLOWERS_FILTERS diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 61fef19e9..b0861fc6b 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -7,6 +7,7 @@ import { importFetchedStatus, importFetchedStatuses, } from './importer'; +import { saveSettings } from './settings'; import { defineMessages } from 'react-intl'; import { List as ImmutableList } from 'immutable'; import { unescapeHTML } from '../utils/html'; @@ -187,5 +188,6 @@ export function setFilter (filterType) { value: filterType, }); dispatch(expandNotifications()); + dispatch(saveSettings()); }; }; diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 094f401b1..8261ce578 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -134,15 +134,6 @@ { "descriptors": [ { - "defaultMessage": "It crashed!", - "id": "error_boundary.it_crashed" - } - ], - "path": "app/javascript/mastodon/components/error_boundary.json" - }, - { - "descriptors": [ - { "defaultMessage": "{count} {rawCount, plural, one {person} other {people}} talking", "id": "trends.count_by_accounts" } @@ -1870,6 +1861,10 @@ { "defaultMessage": "Boosts:", "id": "notifications.column_settings.reblog" + }, + { + "defaultMessage": "Poll results:", + "id": "notifications.column_settings.poll" } ], "path": "app/javascript/mastodon/features/notifications/components/column_settings.json" @@ -1889,6 +1884,10 @@ "id": "notifications.filter.boosts" }, { + "defaultMessage": "Poll results", + "id": "notifications.filter.polls" + }, + { "defaultMessage": "Follows", "id": "notifications.filter.follows" }, @@ -1912,6 +1911,10 @@ { "defaultMessage": "{name} boosted your status", "id": "notification.reblog" + }, + { + "defaultMessage": "A poll you have voted in has ended", + "id": "notification.poll" } ], "path": "app/javascript/mastodon/features/notifications/components/notification.json" @@ -1976,24 +1979,6 @@ { "descriptors": [ { - "defaultMessage": "A look inside...", - "id": "standalone.public_title" - } - ], - "path": "app/javascript/mastodon/features/standalone/community_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "A look inside...", - "id": "standalone.public_title" - } - ], - "path": "app/javascript/mastodon/features/standalone/public_timeline/index.json" - }, - { - "descriptors": [ - { "defaultMessage": "Delete", "id": "status.delete" }, diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 4d1b02098..1c45d6f20 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -137,7 +137,6 @@ "empty_column.mutes": "You haven't muted any users yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", - "error_boundary.it_crashed": "It crashed!", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -253,6 +252,7 @@ "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", + "notification.poll": "A poll you have voted in has ended", "notification.reblog": "{name} boosted your status", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", @@ -263,6 +263,7 @@ "notifications.column_settings.filter_bar.show": "Show", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.poll": "Poll results:", "notifications.column_settings.push": "Push notifications", "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "Show in column", @@ -272,6 +273,7 @@ "notifications.filter.favourites": "Favourites", "notifications.filter.follows": "Follows", "notifications.filter.mentions": "Mentions", + "notifications.filter.polls": "Poll results", "notifications.group": "{count} notifications", "poll.closed": "Closed", "poll.refresh": "Refresh", @@ -313,7 +315,6 @@ "search_results.hashtags": "Hashtags", "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "standalone.public_title": "A look inside...", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this status in the moderation interface", "status.block": "Block @{name}", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 9213b2a48..ca66fbf2a 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -137,7 +137,6 @@ "empty_column.mutes": "まだ誰もミュートしていません。", "empty_column.notifications": "まだ通知がありません。他の人とふれ合って会話を始めましょう。", "empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のサーバーのユーザーをフォローしたりしていっぱいにしましょう", - "error_boundary.it_crashed": "It crashed!", "follow_request.authorize": "許可", "follow_request.reject": "拒否", "getting_started.developers": "開発", @@ -313,7 +312,6 @@ "search_results.hashtags": "ハッシュタグ", "search_results.statuses": "トゥート", "search_results.total": "{count, number}件の結果", - "standalone.public_title": "A look inside...", "status.admin_account": "@{name} のモデレーション画面を開く", "status.admin_status": "このトゥートをモデレーション画面で開く", "status.block": "@{name}さんをブロック", diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index d3a0ea03d..11ac6dfeb 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -149,6 +149,10 @@ a.table-action-link { margin-top: 0; } } + + @media screen and (max-width: $no-gap-breakpoint) { + display: none; + } } &__actions, @@ -170,6 +174,10 @@ a.table-action-link { text-align: right; padding-right: 16px - 5px; } + + @media screen and (max-width: $no-gap-breakpoint) { + display: none; + } } &__row { @@ -177,6 +185,12 @@ a.table-action-link { border-top: 0; background: darken($ui-base-color, 4%); + @media screen and (max-width: $no-gap-breakpoint) { + &:first-child { + border-top: 1px solid darken($ui-base-color, 8%); + } + } + &:hover { background: darken($ui-base-color, 2%); } @@ -215,5 +229,15 @@ a.table-action-link { border: 1px solid darken($ui-base-color, 8%); border-top: 0; box-shadow: none; + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 1px solid darken($ui-base-color, 8%); + } + } + + @media screen and (max-width: 870px) { + .accounts-table tbody td.optional { + display: none; + } } } diff --git a/app/lib/activitypub/activity/flag.rb b/app/lib/activitypub/activity/flag.rb index 0d10d6c3c..f73b93058 100644 --- a/app/lib/activitypub/activity/flag.rb +++ b/app/lib/activitypub/activity/flag.rb @@ -14,7 +14,8 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity @account, target_account, status_ids: target_statuses.nil? ? [] : target_statuses.map(&:id), - comment: @json['content'] || '' + comment: @json['content'] || '', + uri: report_uri ) end end @@ -28,4 +29,8 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity def object_uris @object_uris ||= Array(@object.is_a?(Array) ? @object.map { |item| value_or_id(item) } : value_or_id(@object)) end + + def report_uri + @json['id'] unless @json['id'].nil? || invalid_origin?(@json['id']) + end end diff --git a/app/models/report.rb b/app/models/report.rb index 2804020f5..86c303798 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -13,6 +13,7 @@ # action_taken_by_account_id :bigint(8) # target_account_id :bigint(8) not null # assigned_account_id :bigint(8) +# uri :string # class Report < ApplicationRecord @@ -28,6 +29,12 @@ class Report < ApplicationRecord validates :comment, length: { maximum: 1000 } + def local? + false # Force uri_for to use uri attribute + end + + before_validation :set_uri, only: :create + def object_type :flag end @@ -89,4 +96,8 @@ class Report < ApplicationRecord Admin::ActionLog.from("(#{sql}) AS admin_action_logs") end + + def set_uri + self.uri = ActivityPub::TagManager.instance.generate_uri_for(self) if uri.nil? && account.local? + end end diff --git a/app/models/status.rb b/app/models/status.rb index 440d7cc63..95f336820 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -473,8 +473,8 @@ class Status < ApplicationRecord end def set_visibility + self.visibility = reblog.visibility if reblog? && visibility.nil? self.visibility = (account.locked? ? :private : :public) if visibility.nil? - self.visibility = reblog.visibility if reblog? self.sensitive = false if sensitive.nil? end diff --git a/app/serializers/activitypub/flag_serializer.rb b/app/serializers/activitypub/flag_serializer.rb index 53e8f726d..1e7a46dd9 100644 --- a/app/serializers/activitypub/flag_serializer.rb +++ b/app/serializers/activitypub/flag_serializer.rb @@ -5,7 +5,6 @@ class ActivityPub::FlagSerializer < ActiveModel::Serializer attribute :virtual_object, key: :object def id - # This is nil for now ActivityPub::TagManager.instance.uri_for(object) end diff --git a/app/services/report_service.rb b/app/services/report_service.rb index 1bcc1c0d5..73bd6694f 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -21,7 +21,8 @@ class ReportService < BaseService @report = @source_account.reports.create!( target_account: @target_account, status_ids: @status_ids, - comment: @comment + comment: @comment, + uri: @options[:uri] ) end diff --git a/app/views/relationships/show.html.haml b/app/views/relationships/show.html.haml index 94972026a..fc9613731 100644 --- a/app/views/relationships/show.html.haml +++ b/app/views/relationships/show.html.haml @@ -13,13 +13,20 @@ %strong= t 'relationships.status' %ul %li= filter_link_to t('generic.all'), status: nil - %li= filter_link_to t('relationships.active'), status: 'active' - %li= filter_link_to t('relationships.abandoned'), status: 'abandoned' + %li= filter_link_to t('relationships.primary'), status: 'primary' + %li= filter_link_to t('relationships.moved'), status: 'moved' + + .filter-subset + %strong= t 'relationships.activity' + %ul + %li= filter_link_to t('generic.all'), activity: nil + %li= filter_link_to t('relationships.dormant'), activity: 'dormant' = form_for(@form, url: relationships_path, method: :patch) do |f| = hidden_field_tag :page, params[:page] || 1 = hidden_field_tag :relationship, params[:relationship] = hidden_field_tag :status, params[:status] + = hidden_field_tag :activity, params[:activity] .batch-table .batch-table__toolbar |