Merge branch 'origin/master' into sync/upstream
Conflicts: app/javascript/mastodon/components/status_list.js app/javascript/mastodon/features/notifications/index.js app/javascript/mastodon/features/ui/components/modal_root.js app/javascript/mastodon/features/ui/components/onboarding_modal.js app/javascript/mastodon/features/ui/index.js app/javascript/styles/about.scss app/javascript/styles/accounts.scss app/javascript/styles/components.scss app/presenters/instance_presenter.rb app/services/post_status_service.rb app/services/reblog_service.rb app/views/about/more.html.haml app/views/about/show.html.haml app/views/accounts/_header.html.haml config/webpack/loaders/babel.js spec/controllers/api/v1/accounts/credentials_controller_spec.rb
This commit is contained in:
@@ -63,9 +63,9 @@
|
||||
.footer-links
|
||||
.container
|
||||
%p
|
||||
= link_to t('about.source_code'), 'https://github.com/glitch-soc/mastodon'
|
||||
= link_to t('about.source_code'), @instance_presenter.source_url
|
||||
- if @instance_presenter.commit_hash == ""
|
||||
%strong= @instance_presenter.version_number
|
||||
%strong= " (#{@instance_presenter.version_number})"
|
||||
- else
|
||||
%strong= "#{@instance_presenter.version_number}, "
|
||||
%strong= "#{@instance_presenter.commit_hash}"
|
||||
|
@@ -58,7 +58,7 @@
|
||||
= @instance_presenter.closed_registrations_message.html_safe
|
||||
= link_to t('about.find_another_instance'), 'https://joinmastodon.org/', class: 'button button-alternative button--block'
|
||||
|
||||
.learn-more-cta
|
||||
.about-short
|
||||
.container
|
||||
%h3= t('about.description_headline', domain: site_hostname)
|
||||
%p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname)
|
||||
@@ -76,7 +76,7 @@
|
||||
.footer-links
|
||||
.container
|
||||
%p
|
||||
= link_to t('about.source_code'), 'https://github.com/glitch-soc/mastodon'
|
||||
= link_to t('about.source_code'), @instance_presenter.source_url
|
||||
- if @instance_presenter.commit_hash == ""
|
||||
%strong= " (#{@instance_presenter.version_number})"
|
||||
- else
|
||||
|
@@ -1,8 +1,9 @@
|
||||
.account-grid-card
|
||||
.account-grid-card__header
|
||||
.account-grid-card__header{ style: "background-image: url(#{account.header.url(:original)})" }
|
||||
.account-grid-card__avatar
|
||||
.avatar= image_tag account.avatar.url(:original)
|
||||
.name
|
||||
= link_to TagManager.instance.url_for(account) do
|
||||
%span.display_name.emojify= display_name(account)
|
||||
%span.username @#{account.acct}
|
||||
.name
|
||||
= link_to TagManager.instance.url_for(account) do
|
||||
%span.display_name.emojify= display_name(account)
|
||||
%span.username @#{account.acct}
|
||||
%p.note.emojify= truncate(strip_tags(account.note), length: 150)
|
||||
|
@@ -1,41 +1,57 @@
|
||||
- processed_bio = FrontmatterHandler.instance.process_bio Formatter.instance.simplified_format account
|
||||
.card.h-card.p-author{ style: "background-image: url(#{account.header.url(:original)})" }
|
||||
.details
|
||||
.card__illustration
|
||||
- if user_signed_in? && current_account.id != account.id && !current_account.requested?(account)
|
||||
.controls
|
||||
- if current_account.following?(account)
|
||||
= link_to t('accounts.unfollow'), account_unfollow_path(account), data: { method: :post }, class: 'button'
|
||||
= link_to account_unfollow_path(account), data: { method: :post }, class: 'icon-button' do
|
||||
= fa_icon 'user-times'
|
||||
= t('accounts.unfollow')
|
||||
- else
|
||||
= link_to t('accounts.follow'), account_follow_path(account), data: { method: :post }, class: 'button'
|
||||
= link_to account_follow_path(account), data: { method: :post }, class: 'icon-button' do
|
||||
= fa_icon 'user-plus'
|
||||
= t('accounts.follow')
|
||||
- elsif !user_signed_in?
|
||||
.controls
|
||||
.remote-follow
|
||||
= link_to t('accounts.remote_follow'), account_remote_follow_path(account), class: 'button'
|
||||
= link_to account_remote_follow_path(account), class: 'icon-button' do
|
||||
= fa_icon 'user-plus'
|
||||
= t('accounts.remote_follow')
|
||||
|
||||
.avatar= image_tag account.avatar.url(:original), class: 'u-photo'
|
||||
|
||||
.card__bio
|
||||
%h1.name
|
||||
%span.p-name.emojify= display_name(account)
|
||||
%small
|
||||
%span @#{account.username}
|
||||
%span @#{account.local_username_and_domain}
|
||||
= fa_icon('lock') if account.locked?
|
||||
|
||||
- if account.user_admin?
|
||||
.roles
|
||||
.account-role
|
||||
= t 'accounts.roles.admin'
|
||||
.bio
|
||||
.account__header__content.p-note.emojify!=processed_bio[:text]
|
||||
- if processed_bio[:metadata].length > 0
|
||||
.metadata<
|
||||
- processed_bio[:metadata].each do |i|
|
||||
.metadata-item><
|
||||
%b.emojify>!=i[0]
|
||||
%span.emojify>!=i[1]
|
||||
|
||||
.details-counters
|
||||
.counter{ class: active_nav_class(short_account_url(account)) }
|
||||
= link_to short_account_url(account), class: 'u-url u-uid' do
|
||||
%span.counter-number= number_to_human account.statuses_count
|
||||
%span.counter-label= t('accounts.posts')
|
||||
%span.counter-number= number_with_delimiter account.statuses_count
|
||||
|
||||
.counter{ class: active_nav_class(account_following_index_url(account)) }
|
||||
= link_to account_following_index_url(account) do
|
||||
%span.counter-number= number_to_human account.following_count
|
||||
%span.counter-label= t('accounts.following')
|
||||
%span.counter-number= number_with_delimiter account.following_count
|
||||
|
||||
.counter{ class: active_nav_class(account_followers_url(account)) }
|
||||
= link_to account_followers_url(account) do
|
||||
%span.counter-number= number_to_human account.followers_count
|
||||
%span.counter-label= t('accounts.followers')
|
||||
%span.counter-number= number_with_delimiter account.followers_count
|
||||
- if processed_bio[:metadata].length > 0
|
||||
.metadata<
|
||||
- processed_bio[:metadata].each do |i|
|
||||
.metadata-item><
|
||||
%b.emojify>!=i[0]
|
||||
%span.emojify>!=i[1]
|
||||
|
@@ -7,6 +7,7 @@
|
||||
|
||||
%link{ rel: 'salmon', href: api_salmon_url(@account.id) }/
|
||||
%link{ rel: 'alternate', type: 'application/atom+xml', href: account_url(@account, format: 'atom') }/
|
||||
%link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/
|
||||
|
||||
%meta{ property: 'og:type', content: 'profile' }/
|
||||
= render 'og', account: @account, url: short_account_url(@account, only_path: false)
|
||||
@@ -19,13 +20,21 @@
|
||||
|
||||
= render 'header', account: @account
|
||||
|
||||
.activity-stream-tabs
|
||||
= active_link_to t('accounts.posts'), short_account_url(@account)
|
||||
= active_link_to t('accounts.posts_with_replies'), short_account_with_replies_url(@account)
|
||||
= active_link_to t('accounts.media'), short_account_media_url(@account)
|
||||
|
||||
- if @statuses.empty?
|
||||
.accounts-grid
|
||||
= render 'nothing_here'
|
||||
- else
|
||||
.activity-stream.with-header
|
||||
- if params[:page].to_i.zero?
|
||||
= render partial: 'stream_entries/status', collection: @pinned_statuses, as: :status, locals: { pinned: true }
|
||||
|
||||
= render partial: 'stream_entries/status', collection: @statuses, as: :status
|
||||
|
||||
- if @statuses.size == 20
|
||||
.pagination
|
||||
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), short_account_url(@account, max_id: @statuses.last.id), class: 'next', rel: 'next'
|
||||
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), @next_url, class: 'next', rel: 'next'
|
||||
|
@@ -4,6 +4,9 @@
|
||||
%td.domain
|
||||
- unless account.local?
|
||||
= link_to account.domain, admin_accounts_path(by_domain: account.domain)
|
||||
%td.protocol
|
||||
- unless account.local?
|
||||
= account.protocol.humanize
|
||||
%td.confirmed
|
||||
- if account.local?
|
||||
- if account.user_confirmed?
|
||||
|
@@ -55,6 +55,7 @@
|
||||
%tr
|
||||
%th= t('admin.accounts.username')
|
||||
%th= t('admin.accounts.domain')
|
||||
%th= t('admin.accounts.protocol')
|
||||
%th= t('admin.accounts.confirmed')
|
||||
%th= fa_icon 'paper-plane-o'
|
||||
%th
|
||||
|
@@ -24,7 +24,8 @@
|
||||
%th= t('admin.accounts.most_recent_activity')
|
||||
%td
|
||||
- if @account.user_current_sign_in_at
|
||||
= l @account.user_current_sign_in_at
|
||||
%time.formatted{ datetime: @account.user_current_sign_in_at.iso8601, title: l(@account.user_current_sign_in_at) }
|
||||
= l @account.user_current_sign_in_at
|
||||
- else
|
||||
Never
|
||||
- else
|
||||
@@ -32,18 +33,31 @@
|
||||
%th= t('admin.accounts.profile_url')
|
||||
%td= link_to @account.url, @account.url
|
||||
%tr
|
||||
%th= t('admin.accounts.feed_url')
|
||||
%td= link_to @account.remote_url, @account.remote_url
|
||||
%tr
|
||||
%th= t('admin.accounts.push_subscription_expires')
|
||||
%td
|
||||
- if @account.subscribed?
|
||||
= l @account.subscription_expires_at
|
||||
- else
|
||||
= t('admin.accounts.not_subscribed')
|
||||
%tr
|
||||
%th= t('admin.accounts.salmon_url')
|
||||
%td= link_to @account.salmon_url, @account.salmon_url
|
||||
%th= t('admin.accounts.protocol')
|
||||
%td= @account.protocol.humanize
|
||||
|
||||
- if @account.ostatus?
|
||||
%tr
|
||||
%th= t('admin.accounts.feed_url')
|
||||
%td= link_to @account.remote_url, @account.remote_url
|
||||
%tr
|
||||
%th= t('admin.accounts.push_subscription_expires')
|
||||
%td
|
||||
- if @account.subscribed?
|
||||
%time.formatted{ datetime: @account.subscription_expires_at.iso8601, title: l(@account.subscription_expires_at) }
|
||||
= l @account.subscription_expires_at
|
||||
- else
|
||||
= t('admin.accounts.not_subscribed')
|
||||
%tr
|
||||
%th= t('admin.accounts.salmon_url')
|
||||
%td= link_to @account.salmon_url, @account.salmon_url
|
||||
- elsif @account.activitypub?
|
||||
%tr
|
||||
%th= t('admin.accounts.inbox_url')
|
||||
%td= link_to @account.inbox_url, @account.inbox_url
|
||||
%tr
|
||||
%th= t('admin.accounts.outbox_url')
|
||||
%td= link_to @account.outbox_url, @account.outbox_url
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.follows')
|
||||
@@ -74,9 +88,10 @@
|
||||
- if @account.user&.otp_required_for_login?
|
||||
= link_to t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(@account.user.id), method: :delete, class: 'button'
|
||||
- else
|
||||
= link_to @account.subscribed? ? t('admin.accounts.resubscribe') : t('admin.accounts.subscribe'), subscribe_admin_account_path(@account.id), method: :post, class: 'button'
|
||||
- if @account.subscribed?
|
||||
= link_to t('admin.accounts.unsubscribe'), unsubscribe_admin_account_path(@account.id), method: :post, class: 'button negative'
|
||||
- if @account.ostatus?
|
||||
= link_to @account.subscribed? ? t('admin.accounts.resubscribe') : t('admin.accounts.subscribe'), subscribe_admin_account_path(@account.id), method: :post, class: 'button'
|
||||
- if @account.subscribed?
|
||||
= link_to t('admin.accounts.unsubscribe'), unsubscribe_admin_account_path(@account.id), method: :post, class: 'button negative'
|
||||
= link_to t('admin.accounts.redownload'), redownload_admin_account_path(@account.id), method: :post, class: 'button'
|
||||
|
||||
%div{ style: 'float: left' }
|
||||
|
@@ -1,7 +1,7 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.change_password')
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f|
|
||||
= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, class: 'auth_edit' }) do |f|
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }
|
||||
|
@@ -10,4 +10,4 @@
|
||||
= image_tag asset_pack_path('logo.svg'), alt: 'Mastodon'
|
||||
|
||||
%div
|
||||
= t('errors.noscript')
|
||||
= t('errors.noscript_html')
|
||||
|
@@ -37,7 +37,8 @@
|
||||
|
||||
= yield :header_tags
|
||||
|
||||
- body_classes ||= @body_classes
|
||||
- body_classes ||= @body_classes || ''
|
||||
- body_classes += ' system-font' if current_account&.user&.setting_system_font_ui
|
||||
|
||||
%body{ class: add_rtl_body_class(body_classes) }
|
||||
= content_for?(:content) ? yield(:content) : yield
|
||||
|
21
app/views/settings/applications/_fields.html.haml
Normal file
21
app/views/settings/applications/_fields.html.haml
Normal file
@@ -0,0 +1,21 @@
|
||||
.fields-group
|
||||
= f.input :name, placeholder: t('activerecord.attributes.doorkeeper/application.name')
|
||||
= f.input :website, placeholder: t('activerecord.attributes.doorkeeper/application.website')
|
||||
|
||||
.fields-group
|
||||
= f.input :redirect_uri, wrapper: :with_block_label, label: t('activerecord.attributes.doorkeeper/application.redirect_uri'), hint: t('doorkeeper.applications.help.redirect_uri')
|
||||
|
||||
%p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: Doorkeeper.configuration.native_redirect_uri)
|
||||
|
||||
.field-group
|
||||
= f.input :scopes,
|
||||
label: t('activerecord.attributes.doorkeeper/application.scopes'),
|
||||
collection: Doorkeeper.configuration.scopes,
|
||||
wrapper: :with_label,
|
||||
include_blank: false,
|
||||
label_method: lambda { |scope| safe_join([scope, content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) },
|
||||
selected: f.object.scopes.all,
|
||||
required: false,
|
||||
as: :check_boxes,
|
||||
collection_wrapper_tag: 'ul',
|
||||
item_wrapper_tag: 'li'
|
19
app/views/settings/applications/index.html.haml
Normal file
19
app/views/settings/applications/index.html.haml
Normal file
@@ -0,0 +1,19 @@
|
||||
- content_for :page_title do
|
||||
= t('doorkeeper.applications.index.title')
|
||||
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('doorkeeper.applications.index.application')
|
||||
%th= t('doorkeeper.applications.index.scopes')
|
||||
%th
|
||||
%tbody
|
||||
- @applications.each do |application|
|
||||
%tr
|
||||
%td= link_to application.name, settings_application_path(application)
|
||||
%th= application.scopes
|
||||
%td
|
||||
= table_link_to 'times', t('doorkeeper.applications.index.delete'), settings_application_path(application), method: :delete, data: { confirm: t('doorkeeper.applications.confirmations.destroy') }
|
||||
|
||||
= paginate @applications
|
||||
= link_to t('doorkeeper.applications.index.new'), new_settings_application_path, class: 'button'
|
8
app/views/settings/applications/new.html.haml
Normal file
8
app/views/settings/applications/new.html.haml
Normal file
@@ -0,0 +1,8 @@
|
||||
- content_for :page_title do
|
||||
= t('doorkeeper.applications.new.title')
|
||||
|
||||
= simple_form_for @application, url: settings_applications_path do |f|
|
||||
= render 'fields', f: f
|
||||
|
||||
.actions
|
||||
= f.button :button, t('doorkeeper.applications.buttons.submit'), type: :submit
|
30
app/views/settings/applications/show.html.haml
Normal file
30
app/views/settings/applications/show.html.haml
Normal file
@@ -0,0 +1,30 @@
|
||||
- content_for :page_title do
|
||||
= t('doorkeeper.applications.show.title', name: @application.name)
|
||||
|
||||
%p.hint= t('applications.warning')
|
||||
|
||||
%table.table
|
||||
%tbody
|
||||
%tr
|
||||
%th= t('doorkeeper.applications.show.application_id')
|
||||
%td
|
||||
%code= @application.uid
|
||||
%tr
|
||||
%th= t('doorkeeper.applications.show.secret')
|
||||
%td
|
||||
%code= @application.secret
|
||||
%tr
|
||||
%th{ rowspan: 2}= t('applications.your_token')
|
||||
%td
|
||||
%code= current_user.token_for_app(@application).token
|
||||
%tr
|
||||
%td= table_link_to 'refresh', t('applications.regenerate_token'), regenerate_settings_application_path(@application), method: :post
|
||||
|
||||
%hr/
|
||||
|
||||
= simple_form_for @application, url: settings_application_path(@application), method: :put do |f|
|
||||
= render 'fields', f: f
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit
|
||||
|
@@ -1,5 +1,8 @@
|
||||
.landing-strip
|
||||
= t('landing_strip_html', name: content_tag(:span, display_name(account), class: :emojify), link_to_root_path: link_to(content_tag(:strong, site_hostname), root_path))
|
||||
= image_tag asset_pack_path('logo.svg'), class: 'logo'
|
||||
|
||||
- if open_registrations?
|
||||
= t('landing_strip_signup_html', sign_up_path: new_user_registration_path)
|
||||
%div
|
||||
= t('landing_strip_html', name: content_tag(:span, display_name(account), class: :emojify), link_to_root_path: link_to(content_tag(:strong, site_hostname), root_path))
|
||||
|
||||
- if open_registrations?
|
||||
= t('landing_strip_signup_html', sign_up_path: new_user_registration_path)
|
||||
|
5
app/views/shares/show.html.haml
Normal file
5
app/views/shares/show.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
- content_for :header_tags do
|
||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
||||
= javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous'
|
||||
|
||||
#mastodon-compose{ data: { props: Oj.dump(default_props) } }
|
@@ -1,4 +1,9 @@
|
||||
.detailed-status.light
|
||||
- if embedded_view?
|
||||
= link_to "web+mastodon://follow?uri=#{status.account.local_username_and_domain}", class: 'button button-secondary logo-button', target: '_new' do
|
||||
= render file: Rails.root.join('app', 'javascript', 'images', 'logo.svg')
|
||||
= t('accounts.follow')
|
||||
|
||||
= link_to TagManager.instance.url_for(status.account), class: 'detailed-status__display-name p-author h-card', target: stream_link_target, rel: 'noopener' do
|
||||
%div
|
||||
.avatar
|
||||
|
@@ -1,4 +1,5 @@
|
||||
:ruby
|
||||
pinned ||= false
|
||||
include_threads ||= false
|
||||
is_predecessor ||= false
|
||||
is_successor ||= false
|
||||
@@ -25,6 +26,12 @@
|
||||
= link_to TagManager.instance.url_for(status.account), class: 'status__display-name muted' do
|
||||
%strong.emojify= display_name(status.account)
|
||||
= t('stream_entries.reblogged')
|
||||
- elsif pinned
|
||||
.pre-header
|
||||
.pre-header__icon
|
||||
= fa_icon('thumb-tack fw')
|
||||
%span
|
||||
= t('stream_entries.pinned')
|
||||
|
||||
= render (centered ? 'stream_entries/detailed_status' : 'stream_entries/simple_status'), status: status.proper
|
||||
|
||||
|
@@ -1,2 +1,3 @@
|
||||
.activity-stream.activity-stream-headless
|
||||
= render @type, @type.to_sym => @stream_entry.activity, centered: true
|
||||
- cache @stream_entry.activity do
|
||||
.activity-stream.activity-stream-headless
|
||||
= render "stream_entries/#{@type}", @type.to_sym => @stream_entry.activity, centered: true
|
||||
|
@@ -4,6 +4,7 @@
|
||||
|
||||
%link{ rel: 'alternate', type: 'application/atom+xml', href: account_stream_entry_url(@account, @stream_entry, format: 'atom') }/
|
||||
%link{ rel: 'alternate', type: 'application/json+oembed', href: api_oembed_url(url: account_stream_entry_url(@account, @stream_entry), format: 'json') }/
|
||||
%link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@stream_entry.activity) }/
|
||||
|
||||
%meta{ property: 'og:site_name', content: site_title }/
|
||||
%meta{ property: 'og:type', content: 'article' }/
|
||||
|
Reference in New Issue
Block a user