Skip to content

Commit

Permalink
Add relationship manager UI
Browse files Browse the repository at this point in the history
  • Loading branch information
Gargron committed Mar 16, 2019
1 parent 782b622 commit 16b2caa
Show file tree
Hide file tree
Showing 57 changed files with 264 additions and 660 deletions.
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

0 comments on commit 16b2caa

Please sign in to comment.