From c6302e625ed7c4dff9887ce71d8b46a148a2b31a Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 08:54:51 +0900 Subject: [PATCH 01/26] Fix antenna is not remove in webui --- app/javascript/mastodon/reducers/antennas.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/mastodon/reducers/antennas.js b/app/javascript/mastodon/reducers/antennas.js index b12d6d9fd0..524053107b 100644 --- a/app/javascript/mastodon/reducers/antennas.js +++ b/app/javascript/mastodon/reducers/antennas.js @@ -21,6 +21,10 @@ const initialState = ImmutableMap(); const normalizeAntenna = (state, antenna) => { const old = state.get(antenna.id); + if (old === false) { + return state; + } + let s = state.set(antenna.id, fromJS(antenna)); if (old) { s = s.setIn([antenna.id, 'domains'], old.get('domains')); From db6d1f5c7578c0a3e71575d473d49e7cc3e55116 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 09:13:21 +0900 Subject: [PATCH 02/26] Fix signatured post not work --- app/lib/activitypub/activity/create.rb | 2 +- app/lib/activitypub/parser/status_parser.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 20496eb8c9..8cf4c747f0 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -118,7 +118,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end def process_status_params - @status_parser = ActivityPub::Parser::StatusParser.new(@json['signature'].present? ? @object : @json, followers_collection: @account.followers_url) + @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url, object: @object) @params = { uri: @status_parser.uri, diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb index 34d1497c1e..36467b810b 100644 --- a/app/lib/activitypub/parser/status_parser.rb +++ b/app/lib/activitypub/parser/status_parser.rb @@ -8,7 +8,7 @@ class ActivityPub::Parser::StatusParser # @option magic_values [String] :followers_collection def initialize(json, magic_values = {}) @json = json - @object = json['object'] || json + @object = magic_values[:object] || json['object'] || json @magic_values = magic_values end From e336542063f42e03fe2473de1aa7288603f4ed42 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 09:56:00 +0900 Subject: [PATCH 03/26] Add antenna elements limit --- .../api/v1/antennas/keywords_controller.rb | 2 ++ app/models/antenna.rb | 4 ++++ app/models/antenna_account.rb | 13 +++++++++++++ app/models/antenna_domain.rb | 7 +++++++ app/models/antenna_tag.rb | 13 +++++++++++++ config/locales/en.yml | 6 ++++++ config/locales/ja.yml | 5 +++++ 7 files changed, 50 insertions(+) diff --git a/app/controllers/api/v1/antennas/keywords_controller.rb b/app/controllers/api/v1/antennas/keywords_controller.rb index d486d1a585..b35fb535dc 100644 --- a/app/controllers/api/v1/antennas/keywords_controller.rb +++ b/app/controllers/api/v1/antennas/keywords_controller.rb @@ -21,6 +21,8 @@ class Api::V1::Antennas::KeywordsController < Api::BaseController new_keywords << keyword end + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.keywords') if new_keywords.size > Antenna::KEYWORDS_PER_ANTENNA_LIMIT + @antenna.update!(keywords: new_keywords, any_keywords: new_keywords.empty?) render_empty diff --git a/app/models/antenna.rb b/app/models/antenna.rb index 5476a6d149..a52e78192d 100644 --- a/app/models/antenna.rb +++ b/app/models/antenna.rb @@ -30,6 +30,10 @@ class Antenna < ApplicationRecord include Expireable LIMIT = 30 + DOMAINS_PER_ANTENNA_LIMIT = 20 + ACCOUNTS_PER_ANTENNA_LIMIT = 100 + TAGS_PER_ANTENNA_LIMIT = 50 + KEYWORDS_PER_ANTENNA_LIMIT = 100 has_many :antenna_domains, inverse_of: :antenna, dependent: :destroy has_many :antenna_tags, inverse_of: :antenna, dependent: :destroy diff --git a/app/models/antenna_account.rb b/app/models/antenna_account.rb index 78c6255c30..29da021425 100644 --- a/app/models/antenna_account.rb +++ b/app/models/antenna_account.rb @@ -14,4 +14,17 @@ class AntennaAccount < ApplicationRecord belongs_to :antenna belongs_to :account + + validate :duplicate_account + validate :limit_per_antenna + + private + + def duplicate_account + raise Mastodon::ValidationError, I18n.t('antennas.errors.duplicate_account') if AntennaAccount.exists?(antenna_id: antenna_id, account_id: account_id, exclude: exclude) + end + + def limit_per_antenna + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.accounts') if AntennaAccount.where(antenna_id: antenna_id).count >= Antenna::ACCOUNTS_PER_ANTENNA_LIMIT + end end diff --git a/app/models/antenna_domain.rb b/app/models/antenna_domain.rb index 3b387b7c19..09e481ad9f 100644 --- a/app/models/antenna_domain.rb +++ b/app/models/antenna_domain.rb @@ -15,8 +15,15 @@ class AntennaDomain < ApplicationRecord belongs_to :antenna validate :duplicate_domain + validate :limit_per_antenna + + private def duplicate_domain raise Mastodon::ValidationError, I18n.t('antennas.errors.duplicate_domain') if AntennaDomain.exists?(antenna_id: antenna_id, name: name, exclude: exclude) end + + def limit_per_antenna + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.domains') if AntennaDomain.where(antenna_id: antenna_id).count >= Antenna::DOMAINS_PER_ANTENNA_LIMIT + end end diff --git a/app/models/antenna_tag.rb b/app/models/antenna_tag.rb index 194b5eba8a..0fbdbc0932 100644 --- a/app/models/antenna_tag.rb +++ b/app/models/antenna_tag.rb @@ -14,4 +14,17 @@ class AntennaTag < ApplicationRecord belongs_to :antenna belongs_to :tag + + validate :duplicate_tag + validate :limit_per_antenna + + private + + def duplicate_tag + raise Mastodon::ValidationError, I18n.t('antennas.errors.duplicate_tag') if AntennaTag.exists?(antenna_id: antenna_id, tag_id: tag_id, exclude: exclude) + end + + def limit_per_antenna + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.tags') if AntennaTag.where(antenna_id: antenna_id).count >= Antenna::TAGS_PER_ANTENNA_LIMIT + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index a20ae7f33c..5530c3e88e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1028,6 +1028,12 @@ en: domain: Domains keyword: Keywords tag: Tags + errors: + limit: + accounts: 登録できるアカウント数の上限に達しています + domains: 登録できるドメイン数の上限に達しています + keywords: 登録できるキーワード数の上限に達しています + tags: 登録できるタグ数の上限に達しています edit: accounts_hint: \@askyq or @askyq@example.com accounts_raw: Account list diff --git a/config/locales/ja.yml b/config/locales/ja.yml index b2904429b5..d8c103c07f 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1027,6 +1027,11 @@ ja: duplicate_keyword: すでに同じキーワードが登録されています empty_contexts: 絞り込み条件が1つも指定されていないため無効です(除外条件はカウントされません) invalid_list_owner: これはあなたのリストではありません + limit: + accounts: 登録できるアカウント数の上限に達しています + domains: 登録できるドメイン数の上限に達しています + keywords: 登録できるキーワード数の上限に達しています + tags: 登録できるタグ数の上限に達しています over_limit: 所持できるアンテナ数 %{limit}を超えています over_stl_limit: 所持できるSTLモード付きアンテナ数 (ホーム/リストそれぞれにつき%{limit}) を超えています remove_list_with_antenna: アンテナが関連付けられているリストは削除できません From 21e590c02bc4f9425054fe2a6a5f27a06a842802 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 11:43:19 +0900 Subject: [PATCH 04/26] Remove statuses from antenna timeline when blocked --- app/lib/feed_manager.rb | 22 ++++++++++++++++++++++ app/services/after_block_service.rb | 5 +++++ spec/fabricators/antenna_fabricator.rb | 7 +++++++ spec/services/after_block_service_spec.rb | 19 +++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 spec/fabricators/antenna_fabricator.rb diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 7cf98f3e36..101d9cb8d8 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -265,6 +265,28 @@ class FeedManager end end + def clear_from_antenna(antenna, target_account) + timeline_key = key(:antenna, antenna.id) + timeline_status_ids = redis.zrange(timeline_key, 0, -1) + statuses = Status.where(id: timeline_status_ids).select(:id, :reblog_of_id, :account_id).to_a + reblogged_ids = Status.where(id: statuses.filter_map(&:reblog_of_id), account: target_account).pluck(:id) + with_mentions_ids = Mention.active.where(status_id: statuses.flat_map { |s| [s.id, s.reblog_of_id] }.compact, account: target_account).pluck(:status_id) + + target_statuses = statuses.select do |status| + status.account_id == target_account.id || reblogged_ids.include?(status.reblog_of_id) || with_mentions_ids.include?(status.id) || with_mentions_ids.include?(status.reblog_of_id) + end + + target_statuses.each do |status| + unpush_from_antenna(antenna, status) + end + end + + def clear_from_antennas(account, target_account) + Antenna.where(account: account).each do |antenna| + clear_from_antenna(antenna, target_account) + end + end + # Populate home feed of account from scratch # @param [Account] account # @return [void] diff --git a/app/services/after_block_service.rb b/app/services/after_block_service.rb index 899e84be44..fafd5f5b9f 100644 --- a/app/services/after_block_service.rb +++ b/app/services/after_block_service.rb @@ -7,6 +7,7 @@ class AfterBlockService < BaseService clear_home_feed! clear_list_feeds! + clear_antenna_feeds! clear_notifications! clear_conversations! end @@ -21,6 +22,10 @@ class AfterBlockService < BaseService FeedManager.instance.clear_from_lists(@account, @target_account) end + def clear_antenna_feeds! + FeedManager.instance.clear_from_antennas(@account, @target_account) + end + def clear_conversations! AccountConversation.where(account: @account).where('? = ANY(participant_account_ids)', @target_account.id).in_batches.destroy_all end diff --git a/spec/fabricators/antenna_fabricator.rb b/spec/fabricators/antenna_fabricator.rb new file mode 100644 index 0000000000..9d4a582db7 --- /dev/null +++ b/spec/fabricators/antenna_fabricator.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +Fabricator(:antenna) do + account { Fabricate.build(:account) } + title 'MyString' + list_id 0 +end diff --git a/spec/services/after_block_service_spec.rb b/spec/services/after_block_service_spec.rb index d81bba1d8d..3e8529148b 100644 --- a/spec/services/after_block_service_spec.rb +++ b/spec/services/after_block_service_spec.rb @@ -48,4 +48,23 @@ RSpec.describe AfterBlockService, type: :service do }.from([status.id.to_s, other_account_status.id.to_s, other_account_reblog.id.to_s]).to([other_account_status.id.to_s]) end end + + describe 'antennas' do + let(:antenna) { Fabricate(:antenna, account: account, list_id: 0) } + let(:antenna_timeline_key) { FeedManager.instance.key(:antenna, antenna.id) } + + before do + redis.del(antenna_timeline_key) + end + + it "clears account's statuses" do + FeedManager.instance.push_to_antenna(antenna, status) + FeedManager.instance.push_to_antenna(antenna, other_account_status) + FeedManager.instance.push_to_antenna(antenna, other_account_reblog) + + expect { subject }.to change { + redis.zrange(antenna_timeline_key, 0, -1) + }.from([status.id.to_s, other_account_status.id.to_s, other_account_reblog.id.to_s]).to([other_account_status.id.to_s]) + end + end end From c090f2153232c6f155e497d0f96bafba9f0a0ee3 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 11:47:41 +0900 Subject: [PATCH 05/26] Add antenna to fedibird_capabilities --- app/serializers/rest/instance_serializer.rb | 1 + app/serializers/rest/v1/instance_serializer.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 3ed35d9c32..8cf0304184 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -119,6 +119,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer :kmyblue_visibility_login, :status_reference, :visibility_mutual, + :kmyblue_antenna, ] capabilities << :profile_search unless Chewy.enabled? diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb index 1c6c976216..747b2a1a45 100644 --- a/app/serializers/rest/v1/instance_serializer.rb +++ b/app/serializers/rest/v1/instance_serializer.rb @@ -129,6 +129,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer :status_reference, :visibility_mutual, :kmyblue_limited_scope, + :kmyblue_antenna, ] capabilities << :profile_search unless Chewy.enabled? From 7bbec3c2a8d4e2e3b632db246924e8947320e825 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 12:22:11 +0900 Subject: [PATCH 06/26] Add antenna timeline api test --- .../v1/timelines/antenna_controller_spec.rb | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 spec/controllers/api/v1/timelines/antenna_controller_spec.rb diff --git a/spec/controllers/api/v1/timelines/antenna_controller_spec.rb b/spec/controllers/api/v1/timelines/antenna_controller_spec.rb new file mode 100644 index 0000000000..cf14a1afdb --- /dev/null +++ b/spec/controllers/api/v1/timelines/antenna_controller_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Api::V1::Timelines::AntennaController do + render_views + + let(:user) { Fabricate(:user) } + let(:antenna) { Fabricate(:antenna, account: user.account) } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + context 'with a user context' do + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') } + + describe 'GET #show' do + before do + account = Fabricate(:account) + antenna.antenna_accounts.create!(account: account) + PostStatusService.new.call(account, text: 'New status for user home timeline.') + end + + it 'returns http success' do + get :show, params: { id: antenna.id } + expect(response).to have_http_status(200) + end + end + end + + context 'with the wrong user context' do + let(:other_user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: other_user.id, scopes: 'read') } + + describe 'GET #show' do + it 'returns http not found' do + get :show, params: { id: antenna.id } + expect(response).to have_http_status(404) + end + end + end + + context 'without a user context' do + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil, scopes: 'read') } + + describe 'GET #show' do + it 'returns http unprocessable entity' do + get :show, params: { id: antenna.id } + + expect(response).to have_http_status(422) + expect(response.headers['Link']).to be_nil + end + end + end +end From 8b6b4571ecac3fa6470580b8ea969c009131ee8f Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 13:28:56 +0900 Subject: [PATCH 07/26] Fix antenna id error --- app/services/fan_out_on_write_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 8ca7b079f9..8742dea0b5 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -276,8 +276,8 @@ class FanOutOnWriteService < BaseService def push(antenna) if antenna.list_id.zero? - @home_account_ids << { id: antenna.account_id, antenna_id: antenna.id } if @home_account_ids.none? { |id| id.id == antenna.account_id } - elsif @list_ids.none? { |id| id.id == antenna.list_id } + @home_account_ids << { id: antenna.account_id, antenna_id: antenna.id } if @home_account_ids.none? { |id| id[:id] == antenna.account_id } + elsif @list_ids.none? { |id| id[:id] == antenna.list_id } @list_ids << { id: antenna.list_id, antenna_id: antenna.id } end end From 4b3b3a0e3b5a564ae99c4da2a00ca26c37c89659 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 14:05:52 +0900 Subject: [PATCH 08/26] Add privacy setting translation --- config/locales/simple_form.ja.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index c79daa0621..be070e2198 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -159,8 +159,8 @@ ja: fields: name: ラベル value: 内容 - hide_collections: (仮訳)フォロー・フォロワー一覧を隠す - locked: (仮訳)新規フォローを承認制にする + show_collections: (仮訳)フォロー・フォロワー一覧を公開する + unlocked: (仮訳)新規フォローを自動で承認する account_alias: acct: 引っ越し元のユーザー ID account_migration: From 370d58701b4c09caa7579843b022f95a4f7a1480 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 18:18:34 +0900 Subject: [PATCH 09/26] Fix ignore_reblog not work correctly --- app/services/fan_out_on_write_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 8742dea0b5..8b6671d31c 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -172,7 +172,7 @@ class FanOutOnWriteService < BaseService antennas = antennas.where(account: @status.account.followers) if [:public, :public_unlisted, :login, :limited].exclude?(@status.visibility.to_sym) antennas = antennas.where(account: @status.mentioned_accounts) if @status.visibility.to_sym == :limited antennas = antennas.where(with_media_only: false) unless @status.with_media? - antennas = antennas.where(ignore_reblog: false) unless @status.reblog? + antennas = antennas.where(ignore_reblog: false) if @status.reblog? antennas = antennas.where(stl: false) collection = AntennaCollection.new(@status, @options[:update], false) From a6d910eb88f2b328f07465ff7661d71dda29dd84 Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 21 Aug 2023 08:56:14 +0900 Subject: [PATCH 10/26] Change antenna accounts and domains to radio selection --- .../components/radio_panel.jsx | 47 +++++++ .../features/antenna_setting/index.jsx | 49 ++++--- .../styles/mastodon/components.scss | 124 ++++++++++++++++++ 3 files changed, 204 insertions(+), 16 deletions(-) create mode 100644 app/javascript/mastodon/features/antenna_setting/components/radio_panel.jsx diff --git a/app/javascript/mastodon/features/antenna_setting/components/radio_panel.jsx b/app/javascript/mastodon/features/antenna_setting/components/radio_panel.jsx new file mode 100644 index 0000000000..64f7db0660 --- /dev/null +++ b/app/javascript/mastodon/features/antenna_setting/components/radio_panel.jsx @@ -0,0 +1,47 @@ +import PropTypes from 'prop-types'; +import { PureComponent } from 'react'; + +import { injectIntl } from 'react-intl'; + +import classNames from 'classnames'; + + +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { connect } from 'react-redux'; + +class RadioPanel extends PureComponent { + + static propTypes = { + values: ImmutablePropTypes.list.isRequired, + value: PropTypes.string.isRequired, + intl: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, + }; + + handleChange = e => { + const value = e.currentTarget.getAttribute('data-value'); + console.dir(value); + + if (value !== this.props.value.get('value')) { + this.props.onChange(value); + } + }; + + render () { + const { values, value } = this.props; + + return ( +
+ {values.map((val) => ( +
+ {val.get('label')} +
+ ))} +
+ ); + } + +} + +export default connect()(injectIntl(RadioPanel)); diff --git a/app/javascript/mastodon/features/antenna_setting/index.jsx b/app/javascript/mastodon/features/antenna_setting/index.jsx index f98abb6409..2d137457e8 100644 --- a/app/javascript/mastodon/features/antenna_setting/index.jsx +++ b/app/javascript/mastodon/features/antenna_setting/index.jsx @@ -5,7 +5,7 @@ import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Helmet } from 'react-helmet'; -import { List as ImmutableList } from 'immutable'; +import { List as ImmutableList, Map as ImmutableMap } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; @@ -23,6 +23,7 @@ import { Icon } from 'mastodon/components/icon'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; +import RadioPanel from './components/radio_panel'; import TextList from './components/text_list'; const messages = defineMessages({ @@ -35,6 +36,8 @@ const messages = defineMessages({ addKeywordLabel: { id: 'antennas.add_keyword_placeholder', defaultMessage: 'New keyword' }, addDomainTitle: { id: 'antennas.add_domain', defaultMessage: 'Add domain' }, addKeywordTitle: { id: 'antennas.add_keyword', defaultMessage: 'Add keyword' }, + accounts: { id: 'antennas.accounts', defaultMessage: '{count} accounts' }, + domains: { id: 'antennas.domains', defaultMessage: '{count} domains' }, }); const mapStateToProps = (state, props) => ({ @@ -65,6 +68,7 @@ class AntennaSetting extends PureComponent { state = { domainName: '', keywordName: '', + rangeRadioValue: null, }; handlePin = () => { @@ -183,6 +187,8 @@ class AntennaSetting extends PureComponent { noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions); + onRangeRadioChanged = (value) => this.setState({ rangeRadioValue: value }); + onDomainNameChanged = (value) => this.setState({ domainName: value }); onDomainAdd = () => { @@ -255,6 +261,13 @@ class AntennaSetting extends PureComponent { ); } + const rangeRadioValues = ImmutableList([ + ImmutableMap({ value: 'accounts', label: intl.formatMessage(messages.accounts, { count: antenna.get('accounts_count') }) }), + ImmutableMap({ value: 'domains', label: intl.formatMessage(messages.domains, { count: antenna.get('domains_count') }) }), + ]); + const rangeRadioValue = ImmutableMap({ value: this.state.rangeRadioValue || (antenna.get('accounts_count') > 0 ? 'accounts' : 'domains') }); + const rangeRadioAlert = antenna.get(rangeRadioValue.get('value') === 'accounts' ? 'domains_count' : 'accounts_count') > 0; + const listOptions = lists.toArray().map((list) => { return { value: list[1].get('id'), label: list[1].get('title') } }); @@ -317,8 +330,8 @@ class AntennaSetting extends PureComponent { options={listOptions} noOptionsMessage={this.noOptionsMessage} onChange={this.onSelect} - className='column-select__container' - classNamePrefix='column-select' + className='column-content-select__container' + classNamePrefix='column-content-select' name='lists' placeholder={this.props.intl.formatMessage(messages.placeholder)} defaultOptions @@ -329,20 +342,24 @@ class AntennaSetting extends PureComponent { {!isStl && ( <> -

- ))} ); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 2464c92e38..d719d3d879 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -7512,6 +7512,7 @@ noscript { margin: 16px 0; background: lighten($ui-base-color, 4%); color: $secondary-text-color; + border: 0; &__active { color: $primary-text-color; From 504aaaa0c5c82af7ea53b5cd1e5ebbc504d8d23a Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 21 Aug 2023 14:29:28 +0900 Subject: [PATCH 21/26] Fix translations --- app/javascript/mastodon/locales/ja.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 4845dcd60f..b6b54af3ba 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -88,10 +88,17 @@ "alert.unexpected.message": "不明なエラーが発生しました。", "alert.unexpected.title": "エラー!", "announcement.announcement": "お知らせ", + "antennas.account.add": "アンテナに追加", + "antennas.account.remove": "アンテナから外す", "antennas.accounts": "{count} のアカウント", + "antennas.add_domain": "新規ドメイン", + "antennas.add_domain_placeholder": "新しいドメイン名", + "antennas.add_keyword": "新規キーワード", + "antennas.add_keyword_placeholder": "新しいキーワード", "antennas.delete": "アンテナを削除", "antennas.domains": "{count} のドメイン", "antennas.edit": "アンテナを編集", + "antennas.edit.submit": "タイトルを変更", "antennas.edit_static": "旧編集画面に移動", "antennas.edit_accounts": "アカウントを編集", "antennas.exclude_accounts": "除外するアカウント", From c97e63bb182ad2e9f1ce1241012041cbf683745a Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 21 Aug 2023 14:47:55 +0900 Subject: [PATCH 22/26] Set able to send new item with enter key --- .../features/antenna_setting/components/text_list.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/antenna_setting/components/text_list.jsx b/app/javascript/mastodon/features/antenna_setting/components/text_list.jsx index 7f4d5b67ac..cce7bf70f3 100644 --- a/app/javascript/mastodon/features/antenna_setting/components/text_list.jsx +++ b/app/javascript/mastodon/features/antenna_setting/components/text_list.jsx @@ -59,6 +59,11 @@ class TextList extends PureComponent { this.props.onAdd(); }; + handleSubmit = (e) => { + e.preventDefault(); + this.handleAdd(); + }; + render () { const { icon, value, values, disabled, label, title } = this.props; @@ -68,7 +73,7 @@ class TextList extends PureComponent { ))} -
+