Merge tag 'v3.5.5+hometown-1.0.8' into hometown-4.0-1.0.8-merge
This commit is contained in:
commit
a98750aac0
|
@ -22,6 +22,11 @@ class AccountsController < ApplicationController
|
|||
format.rss do
|
||||
expires_in 1.minute, public: true
|
||||
|
||||
if @account&.user&.setting_norss == true
|
||||
@statuses = []
|
||||
next
|
||||
end
|
||||
|
||||
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
|
||||
@statuses = filtered_statuses.without_reblogs.without_local_only.limit(limit)
|
||||
@statuses = cache_collection(@statuses, Status)
|
||||
|
|
|
@ -47,6 +47,7 @@ class Settings::PreferencesController < Settings::BaseController
|
|||
:setting_disable_swiping,
|
||||
:setting_system_font_ui,
|
||||
:setting_noindex,
|
||||
:setting_norss,
|
||||
:setting_theme,
|
||||
:setting_aggregate_reblogs,
|
||||
:setting_show_application,
|
||||
|
|
|
@ -26,7 +26,7 @@ class StatusesCleanupController < ApplicationController
|
|||
end
|
||||
|
||||
def resource_params
|
||||
params.require(:account_statuses_cleanup_policy).permit(:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :min_favs, :min_reblogs)
|
||||
params.require(:account_statuses_cleanup_policy).permit(:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_local, :keep_self_bookmark, :min_favs, :min_reblogs)
|
||||
end
|
||||
|
||||
def set_body_classes
|
||||
|
|
|
@ -535,7 +535,7 @@ class Status extends ImmutablePureComponent {
|
|||
onCollapsedToggle={this.handleCollapsedToggle}
|
||||
/>
|
||||
|
||||
{media}
|
||||
{status.get('activity_pub_type') === 'Article' ? null : media}
|
||||
|
||||
<StatusActionBar scrollKey={scrollKey} status={status} account={account} onFilter={matchedFilters ? this.handleFilterClick : null} {...other} />
|
||||
</div>
|
||||
|
|
|
@ -276,7 +276,7 @@ class StatusContent extends React.PureComponent {
|
|||
|
||||
{mentionsPlaceholder}
|
||||
|
||||
<div tabIndex={!hidden ? 0 : null} className={`status__content__text ${!hidden ? 'status__content__text--visible' : ''} translate`} lang={lang} dangerouslySetInnerHTML={content} />
|
||||
<div tabIndex={!hidden ? 0 : null} className={`status__content__text ${!hidden ? 'status__content__text--visible' : ''} ${status.get('activity_pub_type') === 'Article' ? 'article-type' : ''} translate`} lang={lang} dangerouslySetInnerHTML={content} />
|
||||
{!hidden && poll}
|
||||
{!hidden && translateButton}
|
||||
</div>
|
||||
|
|
|
@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
|
|||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
import Toggle from 'react-toggle';
|
||||
import IconButton from 'mastodon/components/icon_button';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import AutosuggestInput from 'mastodon/components/autosuggest_input';
|
||||
|
@ -155,6 +156,12 @@ class PollForm extends ImmutablePureComponent {
|
|||
<ul>
|
||||
{options.map((title, i) => <Option title={title} key={i} index={i} onChange={onChangeOption} onRemove={onRemoveOption} isPollMultiple={isMultiple} onToggleMultiple={this.handleToggleMultiple} autoFocus={i === autoFocusIndex} {...other} />)}
|
||||
</ul>
|
||||
<div className='is-multiple-toggle'>
|
||||
<Toggle className='is-multiple-checkbox' checked={isMultiple} onChange={this.handleToggleMultiple}/>
|
||||
<span className='is-multiple-toggle__label'>
|
||||
<FormattedMessage id='poll.is_multiple' defaultMessage='Multiple choice' />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className='poll__footer'>
|
||||
<button type='button' disabled={options.size >= 4} className='button button-secondary' onClick={this.handleAddOption}><Icon id='plus' /> <FormattedMessage {...messages.add_option} /></button>
|
||||
|
|
|
@ -42,7 +42,7 @@ class Category extends React.PureComponent {
|
|||
|
||||
switch(category) {
|
||||
case 'dislike':
|
||||
onNextStep('thanks');
|
||||
onNextStep('statuses');
|
||||
break;
|
||||
case 'violation':
|
||||
onNextStep('rules');
|
||||
|
|
|
@ -279,7 +279,7 @@ class DetailedStatus extends ImmutablePureComponent {
|
|||
onTranslate={this.handleTranslate}
|
||||
/>
|
||||
|
||||
{media}
|
||||
{status.get('activity_pub_type') === 'Article' ? null : media}
|
||||
|
||||
<div className='detailed-status__meta'>
|
||||
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
|
||||
|
|
|
@ -94,7 +94,6 @@ class LinkFooter extends React.PureComponent {
|
|||
<Link to='/keyboard-shortcuts'><FormattedMessage id='footer.keyboard_shortcuts' defaultMessage='Keyboard shortcuts' /></Link>
|
||||
{' · '}
|
||||
<a href={source_url} rel='noopener noreferrer' target='_blank'><FormattedMessage id='footer.source_code' defaultMessage='View source code' /></a>
|
||||
{' · '}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -449,6 +449,7 @@
|
|||
"poll.vote": "Vote",
|
||||
"poll.voted": "You voted for this answer",
|
||||
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
|
||||
"poll.is_multiple": "Multiple choice",
|
||||
"poll_button.add_poll": "Add a poll",
|
||||
"poll_button.remove_poll": "Remove poll",
|
||||
"privacy.change": "Change post privacy",
|
||||
|
|
|
@ -980,6 +980,11 @@
|
|||
}
|
||||
}
|
||||
|
||||
.article-type {
|
||||
display: inline-block;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.article-type img {
|
||||
max-width: 95%;
|
||||
}
|
||||
|
@ -4215,6 +4220,21 @@ a.status-card.compact:hover {
|
|||
}
|
||||
}
|
||||
|
||||
// Hometown: Styling for toggle for multiple choice polls
|
||||
.is-multiple-toggle {
|
||||
display: block;
|
||||
line-height: 24px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.is-multiple-toggle__label {
|
||||
color: $inverted-text-color;
|
||||
display: inline-block;
|
||||
margin-bottom: 14px;
|
||||
margin-left: 8px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.setting-toggle {
|
||||
display: block;
|
||||
line-height: 24px;
|
||||
|
|
|
@ -165,6 +165,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
|||
handler = Handler.new(proc)
|
||||
Ox.sax_parse(handler, @object['content'])
|
||||
handler.srcs.each do |src|
|
||||
# Handle images where the src is formatted as "/foo/bar.png"
|
||||
# we assume that the `url` field is populated which lets us infer
|
||||
# the protocol and domain of the _original_ article, as though
|
||||
# we were looking at it via a web browser
|
||||
if src[0] == '/' && !@object['url'].nil?
|
||||
site = Addressable::URI.parse(@object['url']).site
|
||||
src = site + src
|
||||
end
|
||||
|
||||
if skip_download?
|
||||
@object['content'].gsub!(src, '')
|
||||
next
|
||||
|
|
|
@ -5,6 +5,7 @@ module Settings
|
|||
DEFAULTING_TO_UNSCOPED = %w(
|
||||
theme
|
||||
noindex
|
||||
norss
|
||||
).freeze
|
||||
|
||||
def initialize(object)
|
||||
|
|
|
@ -31,6 +31,7 @@ class UserSettingsDecorator
|
|||
user.settings['disable_swiping'] = disable_swiping_preference if change?('setting_disable_swiping')
|
||||
user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui')
|
||||
user.settings['noindex'] = noindex_preference if change?('setting_noindex')
|
||||
user.settings['norss'] = norss_preference if change?('setting_norss')
|
||||
user.settings['theme'] = theme_preference if change?('setting_theme')
|
||||
user.settings['aggregate_reblogs'] = aggregate_reblogs_preference if change?('setting_aggregate_reblogs')
|
||||
user.settings['show_application'] = show_application_preference if change?('setting_show_application')
|
||||
|
@ -102,6 +103,10 @@ class UserSettingsDecorator
|
|||
boolean_cast_setting 'setting_noindex'
|
||||
end
|
||||
|
||||
def norss_preference
|
||||
boolean_cast_setting 'setting_norss'
|
||||
end
|
||||
|
||||
def show_application_preference
|
||||
boolean_cast_setting 'setting_show_application'
|
||||
end
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
# keep_media :boolean default(FALSE), not null
|
||||
# keep_self_fav :boolean default(TRUE), not null
|
||||
# keep_self_bookmark :boolean default(TRUE), not null
|
||||
# keep_local :boolean default(TRUE), not null
|
||||
# min_favs :integer
|
||||
# min_reblogs :integer
|
||||
# created_at :datetime not null
|
||||
|
@ -66,6 +67,7 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
|
|||
scope.merge!(without_poll_scope) if keep_polls?
|
||||
scope.merge!(without_media_scope) if keep_media?
|
||||
scope.merge!(without_self_fav_scope) if keep_self_fav?
|
||||
scope.merge!(without_local_scope) if keep_local?
|
||||
scope.merge!(without_self_bookmark_scope) if keep_self_bookmark?
|
||||
|
||||
scope.reorder(id: :asc).limit(limit)
|
||||
|
@ -148,6 +150,10 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
|
|||
Status.where(Status.arel_table[:id].lteq(max_id))
|
||||
end
|
||||
|
||||
def without_local_scope
|
||||
Status.where(local_only: false)
|
||||
end
|
||||
|
||||
def without_self_fav_scope
|
||||
Status.where('NOT EXISTS (SELECT * FROM favourites fav WHERE fav.account_id = statuses.account_id AND fav.status_id = statuses.id)')
|
||||
end
|
||||
|
|
|
@ -27,6 +27,7 @@ class Form::AdminSettings
|
|||
show_domain_blocks
|
||||
show_domain_blocks_rationale
|
||||
noindex
|
||||
norss
|
||||
require_invite_text
|
||||
media_cache_retention_period
|
||||
content_cache_retention_period
|
||||
|
@ -48,6 +49,7 @@ class Form::AdminSettings
|
|||
trends
|
||||
trendable_by_default
|
||||
noindex
|
||||
norss
|
||||
require_invite_text
|
||||
).freeze
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ class User < ApplicationRecord
|
|||
has_many :session_activations, dependent: :destroy
|
||||
|
||||
delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal,
|
||||
:reduce_motion, :system_font_ui, :noindex, :theme, :display_media,
|
||||
:reduce_motion, :system_font_ui, :noindex, :norss, :theme, :display_media,
|
||||
:expand_spoilers, :default_language, :aggregate_reblogs, :show_application,
|
||||
:advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images,
|
||||
:disable_swiping, :default_federation, :always_send_emails,
|
||||
|
|
|
@ -4,6 +4,7 @@ class REST::PreferencesSerializer < ActiveModel::Serializer
|
|||
attribute :posting_default_privacy, key: 'posting:default:visibility'
|
||||
attribute :posting_default_sensitive, key: 'posting:default:sensitive'
|
||||
attribute :posting_default_language, key: 'posting:default:language'
|
||||
attribute :posting_default_federation, key: 'posting:default:federation'
|
||||
|
||||
attribute :reading_default_sensitive_media, key: 'reading:expand:media'
|
||||
attribute :reading_default_sensitive_text, key: 'reading:expand:spoilers'
|
||||
|
@ -27,4 +28,8 @@ class REST::PreferencesSerializer < ActiveModel::Serializer
|
|||
def reading_default_sensitive_text
|
||||
object.user.setting_expand_spoilers
|
||||
end
|
||||
|
||||
def posting_default_federation
|
||||
object.user.setting_default_federation
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
- if @account.user_prefers_noindex?
|
||||
%meta{ name: 'robots', content: 'noindex, noarchive' }/
|
||||
|
||||
%link{ rel: 'alternate', type: 'application/rss+xml', href: @rss_url }/
|
||||
- if !@account.user&.setting_norss
|
||||
%link{ rel: 'alternate', type: 'application/rss+xml', href: @rss_url }/
|
||||
%link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/
|
||||
|
||||
- @account.fields.select(&:verifiable?).each do |field|
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
.fields-group
|
||||
= f.input :setting_noindex, as: :boolean, wrapper: :with_label
|
||||
|
||||
.fields-group
|
||||
= f.input :setting_norss, as: :boolean, wrapper: :with_label
|
||||
|
||||
.fields-group
|
||||
= f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true
|
||||
|
||||
|
|
|
@ -34,6 +34,10 @@
|
|||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :keep_media, wrapper: :with_label, label: t('statuses_cleanup.keep_media'), hint: t('statuses_cleanup.keep_media_hint')
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :keep_local, wrapper: :with_label, label: t('statuses_cleanup.keep_local'), hint: t('statuses_cleanup.keep_local_hint')
|
||||
|
||||
%h4= t('statuses_cleanup.interaction_exceptions')
|
||||
|
||||
.fields-row
|
||||
|
|
|
@ -1497,6 +1497,8 @@ en:
|
|||
interaction_exceptions_explanation: Note that there is no guarantee for posts to be deleted if they go below the favourite or boost threshold after having once gone over them.
|
||||
keep_direct: Keep direct messages
|
||||
keep_direct_hint: Doesn't delete any of your direct messages
|
||||
keep_local: Keep local-only messages
|
||||
keep_local_hint: Doesn't delete any of your local-only posts
|
||||
keep_media: Keep posts with media attachments
|
||||
keep_media_hint: Doesn't delete any of your posts that have media attachments
|
||||
keep_pinned: Keep pinned posts
|
||||
|
|
|
@ -194,7 +194,7 @@ en:
|
|||
setting_auto_play_gif: Auto-play animated GIFs
|
||||
setting_boost_modal: Show confirmation dialog before boosting
|
||||
setting_crop_images: Crop images in non-expanded posts to 16x9
|
||||
setting_default_federation: Allow my posts to reach other instances by default
|
||||
setting_default_federation: Allow my posts to reach other servers by default
|
||||
setting_default_language: Posting language
|
||||
setting_default_privacy: Posting privacy
|
||||
setting_default_sensitive: Always mark media as sensitive
|
||||
|
@ -207,6 +207,7 @@ en:
|
|||
setting_expand_spoilers: Always expand posts marked with content warnings
|
||||
setting_hide_network: Hide your social graph
|
||||
setting_noindex: Opt-out of search engine indexing
|
||||
setting_norss: Opt-out of an RSS feed for your public posts
|
||||
setting_reduce_motion: Reduce motion in animations
|
||||
setting_show_application: Disclose application used to send posts
|
||||
setting_system_font_ui: Use system's default font
|
||||
|
|
|
@ -30,6 +30,7 @@ defaults: &defaults
|
|||
show_application: true
|
||||
system_font_ui: false
|
||||
noindex: false
|
||||
norss: false
|
||||
theme: 'default'
|
||||
aggregate_reblogs: true
|
||||
advanced_layout: false
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
class AddKeepLocalToAccountStatusesCleanupPolicies < ActiveRecord::Migration[6.1]
|
||||
def change
|
||||
add_column :account_statuses_cleanup_policies, :keep_local, :boolean
|
||||
change_column_default :account_statuses_cleanup_policies, :keep_local, false
|
||||
end
|
||||
end
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2022_11_04_133904) do
|
||||
ActiveRecord::Schema.define(version: 2022_12_02_035831) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
@ -116,6 +116,7 @@ ActiveRecord::Schema.define(version: 2022_11_04_133904) do
|
|||
t.integer "min_reblogs"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.boolean "keep_local", default: true, null: false
|
||||
t.index ["account_id"], name: "index_account_statuses_cleanup_policies_on_account_id"
|
||||
end
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ module Mastodon
|
|||
module_function
|
||||
|
||||
def major
|
||||
2
|
||||
4
|
||||
end
|
||||
|
||||
def minor
|
||||
|
@ -21,7 +21,7 @@ module Mastodon
|
|||
end
|
||||
|
||||
def suffix
|
||||
'+4.0.0'
|
||||
'+hometown-1.1.0'
|
||||
end
|
||||
|
||||
def to_a
|
||||
|
|
|
@ -86,9 +86,6 @@ class Sanitize
|
|||
'rel' => 'nofollow noopener noreferrer',
|
||||
'target' => '_blank',
|
||||
},
|
||||
'span' => {
|
||||
'class' => 'article-type',
|
||||
},
|
||||
},
|
||||
|
||||
protocols: {
|
||||
|
|
Loading…
Reference in New Issue