Merge branch 'master' into glitch-soc/merge-upstream
This commit is contained in:
		
						commit
						eff1c94744
					
				@ -429,7 +429,7 @@ GEM
 | 
			
		||||
    rack-attack (5.4.2)
 | 
			
		||||
      rack (>= 1.0, < 3)
 | 
			
		||||
    rack-cors (1.0.2)
 | 
			
		||||
    rack-protection (2.0.4)
 | 
			
		||||
    rack-protection (2.0.5)
 | 
			
		||||
      rack
 | 
			
		||||
    rack-proxy (0.6.4)
 | 
			
		||||
      rack
 | 
			
		||||
@ -553,8 +553,9 @@ GEM
 | 
			
		||||
    scss_lint (0.57.1)
 | 
			
		||||
      rake (>= 0.9, < 13)
 | 
			
		||||
      sass (~> 3.5, >= 3.5.5)
 | 
			
		||||
    sidekiq (5.2.3)
 | 
			
		||||
    sidekiq (5.2.5)
 | 
			
		||||
      connection_pool (~> 2.2, >= 2.2.2)
 | 
			
		||||
      rack (>= 1.5.0)
 | 
			
		||||
      rack-protection (>= 1.5.0)
 | 
			
		||||
      redis (>= 3.3.5, < 5)
 | 
			
		||||
    sidekiq-bulk (0.2.0)
 | 
			
		||||
@ -639,7 +640,7 @@ GEM
 | 
			
		||||
      activesupport (>= 4.2)
 | 
			
		||||
      rack-proxy (>= 0.6.1)
 | 
			
		||||
      railties (>= 4.2)
 | 
			
		||||
    webpush (0.3.5)
 | 
			
		||||
    webpush (0.3.6)
 | 
			
		||||
      hkdf (~> 0.2)
 | 
			
		||||
      jwt (~> 2.0)
 | 
			
		||||
    websocket-driver (0.7.0)
 | 
			
		||||
 | 
			
		||||
@ -69,8 +69,12 @@ module ApplicationHelper
 | 
			
		||||
    tag(:meta, content: content, property: property)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def react_component(name, props = {})
 | 
			
		||||
  def react_component(name, props = {}, &block)
 | 
			
		||||
    if block.nil?
 | 
			
		||||
      content_tag(:div, nil, data: { component: name.to_s.camelcase, props: Oj.dump(props) })
 | 
			
		||||
    else
 | 
			
		||||
      content_tag(:div, data: { component: name.to_s.camelcase, props: Oj.dump(props) }, &block)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def body_classes
 | 
			
		||||
 | 
			
		||||
@ -92,11 +92,14 @@ const handlePush = (event) => {
 | 
			
		||||
      options.image     = notification.status && notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url || undefined;
 | 
			
		||||
      options.data      = { access_token, preferred_locale, id: notification.status ? notification.status.id : notification.account.id, url: notification.status ? `/web/statuses/${notification.status.id}` : `/web/accounts/${notification.account.id}` };
 | 
			
		||||
 | 
			
		||||
      if (notification.status && notification.status.sensitive) {
 | 
			
		||||
      if (notification.status && notification.status.spoiler_text || notification.status.sensitive) {
 | 
			
		||||
        options.data.hiddenBody  = htmlToPlainText(notification.status.content);
 | 
			
		||||
        options.data.hiddenImage = notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url;
 | 
			
		||||
 | 
			
		||||
        if (notification.status.spoiler_text) {
 | 
			
		||||
          options.body    = notification.status.spoiler_text;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        options.image   = undefined;
 | 
			
		||||
        options.actions = [actionExpand(preferred_locale)];
 | 
			
		||||
      } else if (notification.type === 'mention') {
 | 
			
		||||
 | 
			
		||||
@ -66,6 +66,12 @@ function main() {
 | 
			
		||||
    if (reactComponents.length > 0) {
 | 
			
		||||
      import(/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container')
 | 
			
		||||
        .then(({ default: MediaContainer }) => {
 | 
			
		||||
          [].forEach.call(reactComponents, (component) => {
 | 
			
		||||
            [].forEach.call(component.children, (child) => {
 | 
			
		||||
              component.removeChild(child);
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          const content = document.createElement('div');
 | 
			
		||||
 | 
			
		||||
          ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content);
 | 
			
		||||
 | 
			
		||||
@ -1041,6 +1041,10 @@ $small-breakpoint: 960px;
 | 
			
		||||
 | 
			
		||||
    .scrollable {
 | 
			
		||||
      height: 400px;
 | 
			
		||||
 | 
			
		||||
      @media screen and (max-width: $column-breakpoint) {
 | 
			
		||||
        height: 90vh;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    p {
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,6 @@
 | 
			
		||||
$no-columns-breakpoint: 600px;
 | 
			
		||||
$sidebar-width: 240px;
 | 
			
		||||
$content-width: 840px;
 | 
			
		||||
 | 
			
		||||
.admin-wrapper {
 | 
			
		||||
  display: flex;
 | 
			
		||||
@ -6,7 +8,7 @@ $no-columns-breakpoint: 600px;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
 | 
			
		||||
  .sidebar-wrapper {
 | 
			
		||||
    flex: 1;
 | 
			
		||||
    flex: 1 1 $sidebar-width;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    background: $ui-base-color;
 | 
			
		||||
    display: flex;
 | 
			
		||||
@ -14,7 +16,7 @@ $no-columns-breakpoint: 600px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .sidebar {
 | 
			
		||||
    width: 240px;
 | 
			
		||||
    width: $sidebar-width;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    overflow-y: auto;
 | 
			
		||||
@ -95,12 +97,12 @@ $no-columns-breakpoint: 600px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .content-wrapper {
 | 
			
		||||
    flex: 2;
 | 
			
		||||
    flex: 2 1 $content-width;
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .content {
 | 
			
		||||
    max-width: 700px;
 | 
			
		||||
    max-width: $content-width;
 | 
			
		||||
    padding: 20px 15px;
 | 
			
		||||
    padding-top: 60px;
 | 
			
		||||
    padding-left: 25px;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								app/views/stream_entries/_attachment_list.html.haml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								app/views/stream_entries/_attachment_list.html.haml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
.attachment-list
 | 
			
		||||
  .attachment-list__icon
 | 
			
		||||
    = fa_icon 'link'
 | 
			
		||||
  %ul.attachment-list__list
 | 
			
		||||
    - attachments.each do |media|
 | 
			
		||||
      %li
 | 
			
		||||
        - url = media.remote_url.presence || media.file.url
 | 
			
		||||
        = link_to File.basename(url), url, title: media.description
 | 
			
		||||
@ -25,9 +25,11 @@
 | 
			
		||||
  - if !status.media_attachments.empty?
 | 
			
		||||
    - if status.media_attachments.first.video?
 | 
			
		||||
      - video = status.media_attachments.first
 | 
			
		||||
      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description
 | 
			
		||||
      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
 | 
			
		||||
        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
 | 
			
		||||
    - else
 | 
			
		||||
      = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
 | 
			
		||||
      = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
 | 
			
		||||
        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
 | 
			
		||||
  - elsif status.preview_card
 | 
			
		||||
    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -30,9 +30,11 @@
 | 
			
		||||
  - if !status.media_attachments.empty?
 | 
			
		||||
    - if status.media_attachments.first.video?
 | 
			
		||||
      - video = status.media_attachments.first
 | 
			
		||||
      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description
 | 
			
		||||
      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description do
 | 
			
		||||
        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
 | 
			
		||||
    - else
 | 
			
		||||
      = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
 | 
			
		||||
      = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
 | 
			
		||||
        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
 | 
			
		||||
  - elsif status.preview_card
 | 
			
		||||
    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,131 @@
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe Admin::AccountAction, type: :model do
 | 
			
		||||
  let(:account_action) { described_class.new }
 | 
			
		||||
 | 
			
		||||
  describe '#save!' do
 | 
			
		||||
    subject              { account_action.save! }
 | 
			
		||||
    let(:account)        { Fabricate(:account, user: Fabricate(:user, admin: true)) }
 | 
			
		||||
    let(:target_account) { Fabricate(:account, user: Fabricate(:user)) }
 | 
			
		||||
    let(:type)           { 'disable' }
 | 
			
		||||
 | 
			
		||||
    before do
 | 
			
		||||
      account_action.assign_attributes(
 | 
			
		||||
        type:            type,
 | 
			
		||||
        current_account: account,
 | 
			
		||||
        target_account:  target_account
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'type is "disable"' do
 | 
			
		||||
      let(:type) { 'disable' }
 | 
			
		||||
 | 
			
		||||
      it 'disable user' do
 | 
			
		||||
        subject
 | 
			
		||||
        expect(target_account.user).to be_disabled
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'type is "silence"' do
 | 
			
		||||
      let(:type) { 'silence' }
 | 
			
		||||
 | 
			
		||||
      it 'silences account' do
 | 
			
		||||
        subject
 | 
			
		||||
        expect(target_account).to be_silenced
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'type is "suspend"' do
 | 
			
		||||
      let(:type) { 'suspend' }
 | 
			
		||||
 | 
			
		||||
      it 'suspends account' do
 | 
			
		||||
        subject
 | 
			
		||||
        expect(target_account).to be_suspended
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'queues Admin::SuspensionWorker by 1' do
 | 
			
		||||
        Sidekiq::Testing.fake! do
 | 
			
		||||
          expect do
 | 
			
		||||
            subject
 | 
			
		||||
          end.to change { Admin::SuspensionWorker.jobs.size }.by 1
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'creates Admin::ActionLog' do
 | 
			
		||||
      expect do
 | 
			
		||||
        subject
 | 
			
		||||
      end.to change { Admin::ActionLog.count }.by 1
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'calls queue_email!' do
 | 
			
		||||
      expect(account_action).to receive(:queue_email!)
 | 
			
		||||
      subject
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'calls process_reports!' do
 | 
			
		||||
      expect(account_action).to receive(:process_reports!)
 | 
			
		||||
      subject
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#report' do
 | 
			
		||||
    subject { account_action.report }
 | 
			
		||||
 | 
			
		||||
    context 'report_id.present?' do
 | 
			
		||||
      before do
 | 
			
		||||
        account_action.report_id = Fabricate(:report).id
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns Report' do
 | 
			
		||||
        expect(subject).to be_instance_of Report
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context '!report_id.present?' do
 | 
			
		||||
      it 'returns nil' do
 | 
			
		||||
        expect(subject).to be_nil
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#with_report?' do
 | 
			
		||||
    subject { account_action.with_report? }
 | 
			
		||||
 | 
			
		||||
    context '!report.nil?' do
 | 
			
		||||
      before do
 | 
			
		||||
        account_action.report_id = Fabricate(:report).id
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns true' do
 | 
			
		||||
        expect(subject).to be true
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context '!(!report.nil?)' do
 | 
			
		||||
      it 'returns false' do
 | 
			
		||||
        expect(subject).to be false
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '.types_for_account' do
 | 
			
		||||
    subject { described_class.types_for_account(account) }
 | 
			
		||||
 | 
			
		||||
    context 'account.local?' do
 | 
			
		||||
      let(:account) { Fabricate(:account, domain: nil) }
 | 
			
		||||
 | 
			
		||||
      it 'returns ["none", "disable", "silence", "suspend"]' do
 | 
			
		||||
        expect(subject).to eq %w(none disable silence suspend)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context '!account.local?' do
 | 
			
		||||
      let(:account) { Fabricate(:account, domain: 'hoge.com') }
 | 
			
		||||
 | 
			
		||||
      it 'returns ["silence", "suspend"]' do
 | 
			
		||||
        expect(subject).to eq %w(silence suspend)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,12 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe Admin::ActionLog, type: :model do
 | 
			
		||||
  describe '#action' do
 | 
			
		||||
    it 'returns action' do
 | 
			
		||||
      action_log = described_class.new(action: 'hoge')
 | 
			
		||||
      expect(action_log.action).to be :hoge
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user