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:
David Yip
2017-09-09 14:27:47 -05:00
352 changed files with 8629 additions and 2380 deletions

View File

@@ -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}"

View File

@@ -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

View File

@@ -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)

View File

@@ -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]

View File

@@ -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'

View File

@@ -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?

View File

@@ -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

View File

@@ -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' }

View File

@@ -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') }

View File

@@ -10,4 +10,4 @@
= image_tag asset_pack_path('logo.svg'), alt: 'Mastodon'
%div
= t('errors.noscript')
= t('errors.noscript_html')

View File

@@ -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

View 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'

View 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'

View 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

View 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

View File

@@ -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)

View 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) } }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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' }/