Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add relationship manager UI #10268

Merged
merged 1 commit into from
Mar 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions app/controllers/relationships_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# frozen_string_literal: true

class RelationshipsController < ApplicationController
layout 'admin'

before_action :authenticate_user!
before_action :set_accounts, only: :show
before_action :set_body_classes

helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship?

def show
@form = Form::AccountBatch.new
end

def update
@form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
@form.save
rescue ActionController::ParameterMissing
# Do nothing
ensure
redirect_to relationships_path(current_params)
end

private

def set_accounts
@accounts = relationships_scope.page(params[:page]).per(40)
end

def relationships_scope
scope = begin
if following_relationship?
current_account.following.includes(:account_stat)
else
current_account.followers.includes(: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!(by_domain_scope) if params[:by_domain].present?

scope
end

def mutual_relationship_scope
Account.where(id: current_account.following)
end

def abandoned_account_scope
Account.where.not(moved_to_account_id: nil)
end

def active_account_scope
Account.where(moved_to_account_id: nil)
end

def by_domain_scope
Account.where(domain: params[:by_domain])
end

def form_account_batch_params
params.require(:form_account_batch).permit(:action, account_ids: [])
end

def following_relationship?
params[:relationship].blank? || params[:relationship] == 'following'
end

def mutual_relationship?
params[:relationship] == 'mutual'
end

def followed_by_relationship?
params[:relationship] == 'followed_by'
end

def current_params
params.slice(:page, :status, :relationship, :by_domain).permit(:page, :status, :relationship, :by_domain)
end

def action_from_button
if params[:unfollow]
'unfollow'
elsif params[:remove_from_followers]
'remove_from_followers'
elsif params[:block_domains]
'block_domains'
end
end

def set_body_classes
@body_classes = 'admin'
end
end
28 changes: 0 additions & 28 deletions app/controllers/settings/follower_domains_controller.rb

This file was deleted.

3 changes: 2 additions & 1 deletion app/helpers/admin/filter_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ 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

FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS
FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS + FOLLOWERS_FILTERS

def filter_link_to(text, link_to_params, link_class_params = link_to_params)
new_url = filtered_url_for(link_to_params)
Expand Down
19 changes: 19 additions & 0 deletions app/javascript/styles/mastodon/tables.scss
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,15 @@ a.table-action-link {
input {
margin-top: 8px;
}

&--aligned {
display: flex;
align-items: center;

input {
margin-top: 0;
}
}
}

&__actions,
Expand Down Expand Up @@ -183,6 +192,10 @@ a.table-action-link {
&__content {
padding-top: 12px;
padding-bottom: 16px;

&--unpadded {
padding: 0;
}
}
}

Expand All @@ -197,4 +210,10 @@ a.table-action-link {
font-weight: 700;
}
}

.nothing-here {
border: 1px solid darken($ui-base-color, 8%);
border-top: 0;
box-shadow: none;
}
}
60 changes: 60 additions & 0 deletions app/models/form/account_batch.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# frozen_string_literal: true

class Form::AccountBatch
include ActiveModel::Model

attr_accessor :account_ids, :action, :current_account

def save
case action
when 'unfollow'
unfollow!
when 'remove_from_followers'
remove_from_followers!
when 'block_domains'
block_domains!
end
end

private

def unfollow!
accounts.find_each do |target_account|
UnfollowService.new.call(current_account, target_account)
end
end

def remove_from_followers!
current_account.passive_relationships.where(account_id: account_ids).find_each do |follow|
reject_follow!(follow)
end
end

def block_domains!
AfterAccountDomainBlockWorker.push_bulk(account_domains) do |domain|
[current_account.id, domain]
end
end

def account_domains
accounts.pluck(Arel.sql('distinct domain')).compact
end

def accounts
Account.where(id: account_ids)
end

def reject_follow!(follow)
follow.destroy

return unless follow.account.activitypub?

json = ActiveModelSerializers::SerializableResource.new(
follow,
serializer: ActivityPub::RejectFollowSerializer,
adapter: ActivityPub::Adapter
).to_json

ActivityPub::DeliveryWorker.perform_async(json, current_account.id, follow.account.inbox_url)
end
end
20 changes: 20 additions & 0 deletions app/views/relationships/_account.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
.batch-table__row
%label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
= f.check_box :account_ids, { multiple: true, include_hidden: false }, account.id
.batch-table__row__content.batch-table__row__content--unpadded
%table.accounts-table
%tbody
%tr
%td= account_link_to account
%td.accounts-table__count.optional
= number_to_human account.statuses_count, strip_insignificant_zeros: true
%small= t('accounts.posts', count: account.statuses_count).downcase
%td.accounts-table__count.optional
= number_to_human account.followers_count, strip_insignificant_zeros: true
%small= t('accounts.followers', count: account.followers_count).downcase
%td.accounts-table__count
- if account.last_status_at.present?
%time.time-ago{ datetime: account.last_status_at.iso8601, title: l(account.last_status_at) }= l account.last_status_at
- else
\-
%small= t('accounts.last_active')
43 changes: 43 additions & 0 deletions app/views/relationships/show.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
- content_for :page_title do
= t('settings.relationships')

- content_for :header_tags do
= javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'

.filters
.filter-subset
%strong= t 'relationships.relationship'
%ul
%li= filter_link_to t('accounts.following', count: current_account.following_count), relationship: nil
%li= filter_link_to t('accounts.followers', count: current_account.followers_count), relationship: 'followed_by'
%li= filter_link_to t('relationships.mutual'), relationship: 'mutual'

.filter-subset
%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'

= 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]

.batch-table
.batch-table__toolbar
%label.batch-table__toolbar__select.batch-checkbox-all
= check_box_tag :batch_checkbox_all, nil, false
.batch-table__toolbar__actions
= f.button safe_join([fa_icon('user-times'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } unless followed_by_relationship?

= f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } unless following_relationship?

= f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_domains')]), name: :block_domains, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship?
.batch-table__body
- if @accounts.empty?
= nothing_here 'nothing-here--under-tabs'
- else
= render partial: 'account', collection: @accounts, locals: { f: f }

= paginate @accounts
34 changes: 0 additions & 34 deletions app/views/settings/follower_domains/show.html.haml

This file was deleted.

10 changes: 0 additions & 10 deletions config/locales/ar.yml
Original file line number Diff line number Diff line change
Expand Up @@ -607,15 +607,6 @@ ar:
title: عوامل التصفية
new:
title: إضافة عامل تصفية جديد
followers:
domain: النطاق
followers_count: عدد المتابِعين
lock_link: قم بتجميد حسابك
purge: تنحية من بين متابعيك
success: جارية عملية حظر المتابِعين بسلاسة من %{count} نطاقات أخرى ...
true_privacy_html: تذكر دائمًا أنّ <strong>الخصوصية التامة لا يمكن بلوغها إلّا بالتعمية و التشفير من طرف إلى آخَر</strong>.
unlocked_warning_html: يمكن لأي كان متابعة حسابك و الإطلاع مباشرة على تبويقاتك. إستخدِم %{lock_link} لمُعاينة أو رفض طلبات المتابِعين الجُدُد.
unlocked_warning_title: إنّ حسابك غير مقفل
footer:
developers: المطورون
more: المزيد …
Expand Down Expand Up @@ -818,7 +809,6 @@ ar:
development: التطوير
edit_profile: تعديل الملف الشخصي
export: تصدير البيانات
followers: المتابِعون المُرَخّصون
import: إستيراد
migrate: تهجير الحساب
notifications: الإخطارات
Expand Down
5 changes: 0 additions & 5 deletions config/locales/ast.yml
Original file line number Diff line number Diff line change
Expand Up @@ -182,10 +182,6 @@ ast:
title: Peñeres
new:
title: Amestar una peñera nueva
followers:
domain: Dominiu
followers_count: Númberu de siguidores
purge: Desaniciar de los siguidores
generic:
changes_saved_msg: "¡Los cambeos guardáronse con ésitu!"
save_changes: Guardar cambeos
Expand Down Expand Up @@ -302,7 +298,6 @@ ast:
back: Volver a Mastodon
edit_profile: Edición del perfil
export: Esportación de datos
followers: Siguidores autorizaos
import: Importación
notifications: Avisos
preferences: Preferencies
Expand Down
Loading