Gab Social. All are welcome.
This commit is contained in:
13
app/views/about/_login.html.haml
Normal file
13
app/views/about/_login.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
= simple_form_for(new_user, url: user_session_path) do |f|
|
||||
.fields-group
|
||||
- if use_seamless_external_login?
|
||||
= f.input :email, placeholder: t('simple_form.labels.defaults.username_or_email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.username_or_email') }, hint: false
|
||||
- else
|
||||
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false
|
||||
|
||||
= f.input :password, placeholder: t('simple_form.labels.defaults.password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.password') }, hint: false
|
||||
|
||||
%p.hint.subtle-hint= link_to t('auth.trouble_logging_in'), new_user_password_path
|
||||
|
||||
.actions
|
||||
= f.button :button, t('auth.login'), type: :submit, class: 'button button-primary'
|
||||
28
app/views/about/_registration.html.haml
Normal file
28
app/views/about/_registration.html.haml
Normal file
@@ -0,0 +1,28 @@
|
||||
= simple_form_for(new_user, url: user_registration_path) do |f|
|
||||
.simple_form__overlay-area
|
||||
%p.lead= t('about.federation_hint_html', instance: content_tag(:strong, site_hostname))
|
||||
|
||||
.fields-group
|
||||
= f.simple_fields_for :account do |account_fields|
|
||||
= account_fields.input :username, wrapper: :with_label, label: false, required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off', placeholder: t('simple_form.labels.defaults.username') }, hint: false, disabled: closed_registrations?
|
||||
|
||||
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
|
||||
= f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
|
||||
= f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
|
||||
|
||||
- if approved_registrations?
|
||||
.fields-group
|
||||
= f.simple_fields_for :invite_request do |invite_request_fields|
|
||||
= invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false
|
||||
|
||||
.fields-group
|
||||
= f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: homepage_path, about_tos_path: about_tos_path), disabled: closed_registrations?
|
||||
|
||||
.actions
|
||||
= f.button :button, sign_up_message, type: :submit, class: 'button button-primary', disabled: closed_registrations?
|
||||
|
||||
- if closed_registrations? && @instance_presenter.closed_registrations_message.present?
|
||||
.simple_form__overlay-area__overlay
|
||||
.simple_form__overlay-area__overlay__content.rich-formatting
|
||||
.block-icon= fa_icon 'warning'
|
||||
= @instance_presenter.closed_registrations_message.html_safe
|
||||
6
app/views/about/guidelines.html.haml
Normal file
6
app/views/about/guidelines.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
- content_for :page_title do
|
||||
= t('terms.title', instance: site_hostname)
|
||||
|
||||
.content
|
||||
.box-widget
|
||||
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
|
||||
6
app/views/about/investors.html.haml
Normal file
6
app/views/about/investors.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
- content_for :page_title do
|
||||
= t('terms.title', instance: site_hostname)
|
||||
|
||||
.content
|
||||
.box-widget
|
||||
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
|
||||
19
app/views/about/more.html.haml
Normal file
19
app/views/about/more.html.haml
Normal file
@@ -0,0 +1,19 @@
|
||||
- content_for :page_title do
|
||||
= site_hostname
|
||||
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
||||
= render partial: 'shared/og'
|
||||
|
||||
.content
|
||||
.box-widget
|
||||
.rich-formatting= @instance_presenter.site_extended_description.html_safe.presence || t('about.extended_description_html')
|
||||
|
||||
%br
|
||||
|
||||
.box-widget
|
||||
.rich-formatting
|
||||
%h3 Open Source
|
||||
%p The future of online publishing and community building is decentralized and open. You get to own what you build. In the open source world, that includes the code powering the technology you use.
|
||||
%p Originally forked from the Mastodon project, Gab Social is a fresh take on one of the Internet's most popular applications: Social networking. By releasing the full program source code of Gab Social under the GNU Affero General Public License v3, Gab is not only guaranteeing you ownership of this system but also those who carry on where you might leave off.
|
||||
%p Gab's development team works on Gab Social as their full-time job. We welcome you to an unprecedented level of access into a commercial effort in decentralized and federated open source social networking. Thank you for taking this adventure with us.
|
||||
6
app/views/about/privacy.html.haml
Normal file
6
app/views/about/privacy.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
- content_for :page_title do
|
||||
= t('terms.title', instance: site_hostname)
|
||||
|
||||
.content
|
||||
.box-widget
|
||||
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
|
||||
18
app/views/about/show.html.haml
Normal file
18
app/views/about/show.html.haml
Normal file
@@ -0,0 +1,18 @@
|
||||
- content_for :page_title do
|
||||
= site_hostname
|
||||
|
||||
- content_for :header_tags do
|
||||
%link{ rel: 'canonical', href: about_url }/
|
||||
= render partial: 'shared/og'
|
||||
|
||||
.landing
|
||||
.landing-columns
|
||||
.landing-columns--left
|
||||
.landing__brand
|
||||
= link_to root_url, class: 'brand' do
|
||||
= image_pack_tag 'gab_logo.svg', alt: 'Gab Social'
|
||||
%span.brand__tagline=t 'about.tagline'
|
||||
|
||||
.landing-columns--right
|
||||
.box-widget
|
||||
= render 'registration'
|
||||
6
app/views/about/terms.html.haml
Normal file
6
app/views/about/terms.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
- content_for :page_title do
|
||||
= t('terms.title', instance: site_hostname)
|
||||
|
||||
.content
|
||||
.box-widget
|
||||
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
|
||||
29
app/views/accounts/_bio.html.haml
Normal file
29
app/views/accounts/_bio.html.haml
Normal file
@@ -0,0 +1,29 @@
|
||||
- proofs = account.identity_proofs.active
|
||||
- fields = account.fields
|
||||
|
||||
.public-account-bio
|
||||
- unless fields.empty? && proofs.empty?
|
||||
.account__header__fields
|
||||
- proofs.each do |proof|
|
||||
%dl
|
||||
%dt= proof.provider.capitalize
|
||||
%dd.verified
|
||||
= link_to fa_icon('check'), proof.badge.proof_url, class: 'verified__mark', title: t('accounts.link_verified_on', date: l(proof.updated_at))
|
||||
= link_to proof.provider_username, proof.badge.profile_url
|
||||
|
||||
- fields.each do |field|
|
||||
%dl
|
||||
%dt.emojify{ title: field.name }= Formatter.instance.format_field(account, field.name, custom_emojify: true)
|
||||
%dd{ title: field.value, class: custom_field_classes(field) }
|
||||
- if field.verified?
|
||||
%span.verified__mark{ title: t('accounts.link_verified_on', date: l(field.verified_at)) }
|
||||
= fa_icon 'check'
|
||||
= Formatter.instance.format_field(account, field.value, custom_emojify: true)
|
||||
|
||||
= account_badge(account)
|
||||
|
||||
- if account.note.present?
|
||||
.account__header__content.emojify= Formatter.instance.simplified_format(account, custom_emojify: true)
|
||||
|
||||
.public-account-bio__extra
|
||||
= t 'accounts.joined', date: l(account.created_at, format: :month)
|
||||
43
app/views/accounts/_header.html.haml
Normal file
43
app/views/accounts/_header.html.haml
Normal file
@@ -0,0 +1,43 @@
|
||||
.public-account-header{:class => ("inactive" if account.moved?)}
|
||||
.public-account-header__image
|
||||
= image_tag (current_account&.user&.setting_auto_play_gif ? account.header_original_url : account.header_static_url), class: 'parallax'
|
||||
.public-account-header__bar
|
||||
= link_to short_account_url(account), class: 'avatar' do
|
||||
= image_tag (current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url), id: 'profile_page_avatar', data: {original: full_asset_url(account.avatar_original_url), static: full_asset_url(account.avatar_static_url), autoplay: current_account&.user&.setting_auto_play_gif}
|
||||
.public-account-header__tabs
|
||||
.public-account-header__tabs__name
|
||||
%h1
|
||||
= display_name(account, custom_emojify: true)
|
||||
%small
|
||||
= acct(account)
|
||||
= fa_icon('lock') if account.locked?
|
||||
.public-account-header__tabs__tabs
|
||||
.details-counters
|
||||
.counter{ class: active_nav_class(short_account_url(account), short_account_with_replies_url(account), short_account_media_url(account)) }
|
||||
= link_to short_account_url(account), class: 'u-url u-uid', title: number_with_delimiter(account.statuses_count) do
|
||||
%span.counter-number= number_to_human account.statuses_count, strip_insignificant_zeros: true
|
||||
%span.counter-label= t('accounts.posts', count: account.statuses_count)
|
||||
|
||||
.counter{ class: active_nav_class(account_following_index_url(account)) }
|
||||
= link_to account_following_index_url(account), title: number_with_delimiter(account.following_count) do
|
||||
%span.counter-number= number_to_human account.following_count, strip_insignificant_zeros: true
|
||||
%span.counter-label= t('accounts.following', count: account.following_count)
|
||||
|
||||
.counter{ class: active_nav_class(account_followers_url(account)) }
|
||||
= link_to account_followers_url(account), title: number_with_delimiter(account.followers_count) do
|
||||
%span.counter-number= number_to_human account.followers_count, strip_insignificant_zeros: true
|
||||
%span.counter-label= t('accounts.followers', count: account.followers_count)
|
||||
.spacer
|
||||
.public-account-header__tabs__tabs__buttons
|
||||
= account_action_button(account)
|
||||
|
||||
.public-account-header__extra
|
||||
= render 'accounts/bio', account: account
|
||||
|
||||
.public-account-header__extra__links
|
||||
= link_to account_following_index_url(account) do
|
||||
%strong= number_to_human account.following_count, strip_insignificant_zeros: true
|
||||
= t('accounts.following', count: account.following_count)
|
||||
= link_to account_followers_url(account) do
|
||||
%strong= number_to_human account.followers_count, strip_insignificant_zeros: true
|
||||
= t('accounts.followers', count: account.followers_count)
|
||||
18
app/views/accounts/_moved.html.haml
Normal file
18
app/views/accounts/_moved.html.haml
Normal file
@@ -0,0 +1,18 @@
|
||||
- moved_to_account = account.moved_to_account
|
||||
|
||||
.moved-account-widget
|
||||
.moved-account-widget__message
|
||||
= fa_icon 'suitcase'
|
||||
= t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.acct)])), TagManager.instance.url_for(moved_to_account), class: 'mention'))
|
||||
|
||||
.moved-account-widget__card
|
||||
= link_to TagManager.instance.url_for(moved_to_account), class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'me noopener' do
|
||||
.detailed-status__display-avatar
|
||||
.account__avatar-overlay
|
||||
.account__avatar-overlay-base{ style: "background-image: url('#{moved_to_account.avatar.url(:original)}')" }
|
||||
.account__avatar-overlay-overlay{ style: "background-image: url('#{account.avatar.url(:original)}')" }
|
||||
|
||||
%span.display-name
|
||||
%bdi
|
||||
%strong.emojify= display_name(moved_to_account, custom_emojify: true)
|
||||
%span @#{moved_to_account.acct}
|
||||
13
app/views/accounts/_og.html.haml
Normal file
13
app/views/accounts/_og.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- description = account_description(account)
|
||||
|
||||
%meta{ name: 'description', content: description }/
|
||||
|
||||
= opengraph 'og:url', url
|
||||
= opengraph 'og:site_name', site_title
|
||||
= opengraph 'og:title', yield(:page_title).strip
|
||||
= opengraph 'og:description', description
|
||||
= opengraph 'og:image', full_asset_url(account.avatar.url(:original))
|
||||
= opengraph 'og:image:width', '120'
|
||||
= opengraph 'og:image:height', '120'
|
||||
= opengraph 'twitter:card', 'summary'
|
||||
= opengraph 'profile:username', account.local_username_and_domain
|
||||
81
app/views/accounts/show.html.haml
Normal file
81
app/views/accounts/show.html.haml
Normal file
@@ -0,0 +1,81 @@
|
||||
- content_for :page_title do
|
||||
= "#{display_name(@account)} (@#{@account.local_username_and_domain})"
|
||||
|
||||
- content_for :header_tags do
|
||||
%meta{ name: 'description', content: account_description(@account) }/
|
||||
|
||||
- if @account.user&.setting_noindex
|
||||
%meta{ name: 'robots', content: 'noindex' }/
|
||||
|
||||
%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/rss+xml', href: account_url(@account, format: 'rss') }/
|
||||
%link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/
|
||||
|
||||
- if @older_url
|
||||
%link{ rel: 'next', href: @older_url }/
|
||||
- if @newer_url
|
||||
%link{ rel: 'prev', href: @newer_url }/
|
||||
|
||||
= opengraph 'og:type', 'profile'
|
||||
= render 'og', account: @account, url: short_account_url(@account, only_path: false)
|
||||
|
||||
|
||||
= render 'header', account: @account, with_bio: true
|
||||
|
||||
.grid
|
||||
.column-0
|
||||
.h-feed
|
||||
%data.p-name{ value: "#{@account.username} on #{site_hostname}" }/
|
||||
|
||||
.account__section-headline
|
||||
= active_link_to t('accounts.posts_tab_heading'), 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 user_signed_in? && @account.blocking?(current_account)
|
||||
.nothing-here.nothing-here--under-tabs= t('accounts.unavailable')
|
||||
- elsif @statuses.empty?
|
||||
= nothing_here 'nothing-here--under-tabs'
|
||||
- else
|
||||
.activity-stream
|
||||
- if params[:page].to_i.zero?
|
||||
= render partial: 'stream_entries/status', collection: @pinned_statuses, as: :status, locals: { pinned: true }
|
||||
|
||||
- if @newer_url
|
||||
.entry= link_to_more @newer_url
|
||||
|
||||
= render partial: 'stream_entries/status', collection: @statuses, as: :status
|
||||
|
||||
- if @older_url
|
||||
.entry= link_to_more @older_url
|
||||
|
||||
.column-1
|
||||
- if @account.memorial?
|
||||
.memoriam-widget= t('in_memoriam_html')
|
||||
- elsif @account.moved?
|
||||
= render 'moved', account: @account
|
||||
|
||||
= render 'bio', account: @account
|
||||
|
||||
- unless @endorsed_accounts.empty?
|
||||
.endorsements-widget
|
||||
%h4= t 'accounts.choices_html', name: content_tag(:bdi, display_name(@account, custom_emojify: true))
|
||||
|
||||
- @endorsed_accounts.each do |account|
|
||||
= account_link_to account
|
||||
|
||||
- @account.featured_tags.order(statuses_count: :desc).each do |featured_tag|
|
||||
.directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil }
|
||||
= link_to short_account_tag_path(@account, featured_tag.tag) do
|
||||
%h4
|
||||
= fa_icon 'hashtag'
|
||||
= featured_tag.name
|
||||
%small
|
||||
- if featured_tag.last_status_at.nil?
|
||||
= t('accounts.nothing_here')
|
||||
- else
|
||||
%time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at
|
||||
.trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true
|
||||
|
||||
= render 'application/sidebar'
|
||||
26
app/views/admin/account_actions/new.html.haml
Normal file
26
app/views/admin/account_actions/new.html.haml
Normal file
@@ -0,0 +1,26 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.account_actions.title', acct: @account.acct)
|
||||
|
||||
= simple_form_for @account_action, url: admin_account_action_path(@account.id) do |f|
|
||||
= f.input :report_id, as: :hidden
|
||||
|
||||
.fields-group
|
||||
= f.input :type, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { I18n.t("simple_form.labels.admin_account_action.types.#{type}")}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.acct)
|
||||
|
||||
- if @account.local?
|
||||
%hr.spacer/
|
||||
|
||||
.fields-group
|
||||
= f.input :send_email_notification, as: :boolean, wrapper: :with_label
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
- unless @warning_presets.empty?
|
||||
.fields-group
|
||||
= f.input :warning_preset_id, collection: @warning_presets, label_method: :text, wrapper: :with_block_label
|
||||
|
||||
.fields-group
|
||||
= f.input :text, as: :text, wrapper: :with_block_label, hint: t('simple_form.hints.admin_account_action.text_html', path: admin_warning_presets_path)
|
||||
|
||||
.actions
|
||||
= f.button :button, t('admin.account_actions.action'), type: :submit
|
||||
@@ -0,0 +1,7 @@
|
||||
.speech-bubble
|
||||
.speech-bubble__bubble
|
||||
= simple_format(h(account_moderation_note.content))
|
||||
.speech-bubble__owner
|
||||
= admin_account_link_to account_moderation_note.account
|
||||
%time.formatted{ datetime: account_moderation_note.created_at.iso8601 }= l account_moderation_note.created_at
|
||||
= table_link_to 'trash', t('admin.account_moderation_notes.delete'), admin_account_moderation_note_path(account_moderation_note), method: :delete if can?(:destroy, account_moderation_note)
|
||||
@@ -0,0 +1,6 @@
|
||||
.speech-bubble.warning
|
||||
.speech-bubble__bubble
|
||||
= Formatter.instance.linkify(account_warning.text)
|
||||
.speech-bubble__owner
|
||||
= admin_account_link_to account_warning.account
|
||||
%time.formatted{ datetime: account_warning.created_at.iso8601 }= l account_warning.created_at
|
||||
22
app/views/admin/accounts/_account.html.haml
Normal file
22
app/views/admin/accounts/_account.html.haml
Normal file
@@ -0,0 +1,22 @@
|
||||
%tr
|
||||
%td
|
||||
= admin_account_link_to(account)
|
||||
%td
|
||||
%div{ style: 'margin: -2px 0' }= account_badge(account, all: true)
|
||||
%td
|
||||
- if account.user_current_sign_in_ip
|
||||
%samp.ellipsized-ip{ title: account.user_current_sign_in_ip }= account.user_current_sign_in_ip
|
||||
- else
|
||||
\-
|
||||
%td
|
||||
- if account.user_current_sign_in_at
|
||||
%time.time-ago{ datetime: account.user_current_sign_in_at.iso8601, title: l(account.user_current_sign_in_at) }= l account.user_current_sign_in_at
|
||||
- else
|
||||
\-
|
||||
%td
|
||||
- if account.local? && account.user_pending?
|
||||
= table_link_to 'check', t('admin.accounts.approve'), approve_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:approve, account.user)
|
||||
= table_link_to 'times', t('admin.accounts.reject'), reject_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:reject, account.user)
|
||||
- else
|
||||
= table_link_to 'circle', t('admin.accounts.web'), web_path("accounts/#{account.id}")
|
||||
= table_link_to 'globe', t('admin.accounts.public'), TagManager.instance.url_for(account)
|
||||
50
app/views/admin/accounts/index.html.haml
Normal file
50
app/views/admin/accounts/index.html.haml
Normal file
@@ -0,0 +1,50 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.accounts.title')
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.accounts.location.title')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.accounts.location.local'), remote: nil
|
||||
%li= filter_link_to t('admin.accounts.location.remote'), remote: '1'
|
||||
.filter-subset
|
||||
%strong= t('admin.accounts.moderation.title')
|
||||
%ul
|
||||
%li= link_to safe_join([t('admin.accounts.moderation.pending'), "(#{number_with_delimiter(User.pending.count)})"], ' '), admin_pending_accounts_path
|
||||
%li= filter_link_to t('admin.accounts.moderation.active'), silenced: nil, suspended: nil, pending: nil
|
||||
%li= filter_link_to t('admin.accounts.moderation.silenced'), silenced: '1', suspended: nil, pending: nil
|
||||
%li= filter_link_to t('admin.accounts.moderation.suspended'), suspended: '1', silenced: nil, pending: nil
|
||||
.filter-subset
|
||||
%strong= t('admin.accounts.role')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.accounts.moderation.all'), staff: nil
|
||||
%li= filter_link_to t('admin.accounts.roles.staff'), staff: '1'
|
||||
|
||||
= form_tag admin_accounts_url, method: 'GET', class: 'simple_form' do
|
||||
.fields-group
|
||||
- Admin::FilterHelper::ACCOUNT_FILTERS.each do |key|
|
||||
- if params[key].present?
|
||||
= hidden_field_tag key, params[key]
|
||||
|
||||
- %i(username by_domain display_name email ip).each do |key|
|
||||
- unless key == :by_domain && params[:remote].blank?
|
||||
.input.string.optional
|
||||
= text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}")
|
||||
|
||||
.actions
|
||||
%button= t('admin.accounts.search')
|
||||
= link_to t('admin.accounts.reset'), admin_accounts_path, class: 'button negative'
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.accounts.username')
|
||||
%th= t('admin.accounts.role')
|
||||
%th= t('admin.accounts.most_recent_ip')
|
||||
%th= t('admin.accounts.most_recent_activity')
|
||||
%th
|
||||
%tbody
|
||||
= render @accounts
|
||||
|
||||
= paginate @accounts
|
||||
240
app/views/admin/accounts/show.html.haml
Normal file
240
app/views/admin/accounts/show.html.haml
Normal file
@@ -0,0 +1,240 @@
|
||||
- content_for :page_title do
|
||||
= @account.acct
|
||||
|
||||
= render 'application/card', account: @account
|
||||
|
||||
.dashboard__counters{ style: 'margin-top: 10px' }
|
||||
%div
|
||||
= link_to admin_account_statuses_path(@account.id) do
|
||||
.dashboard__counters__num= number_with_delimiter @account.statuses_count
|
||||
.dashboard__counters__label= t 'admin.accounts.statuses'
|
||||
%div
|
||||
= link_to admin_account_statuses_path(@account.id, { media: true }) do
|
||||
.dashboard__counters__num= number_to_human_size @account.media_attachments.sum('file_file_size')
|
||||
.dashboard__counters__label= t 'admin.accounts.media_attachments'
|
||||
%div
|
||||
= link_to admin_account_followers_path(@account.id) do
|
||||
.dashboard__counters__num= number_with_delimiter @account.local_followers_count
|
||||
.dashboard__counters__label= t 'admin.accounts.followers'
|
||||
%div
|
||||
= link_to admin_reports_path(account_id: @account.id) do
|
||||
.dashboard__counters__num= number_with_delimiter @account.reports.count
|
||||
.dashboard__counters__label= t '.created_reports'
|
||||
%div
|
||||
= link_to admin_reports_path(target_account_id: @account.id) do
|
||||
.dashboard__counters__num= number_with_delimiter @account.targeted_reports.count
|
||||
.dashboard__counters__label= t '.targeted_reports'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__text
|
||||
- if @account.local? && @account.user.nil?
|
||||
%span.neutral= t('admin.accounts.deleted')
|
||||
- elsif @account.suspended?
|
||||
%span.red= t('admin.accounts.suspended')
|
||||
- elsif @account.silenced?
|
||||
%span.red= t('admin.accounts.silenced')
|
||||
- elsif @account.local? && @account.user&.disabled?
|
||||
%span.red= t('admin.accounts.disabled')
|
||||
- elsif @account.local? && !@account.user&.confirmed?
|
||||
%span.neutral= t('admin.accounts.confirming')
|
||||
- elsif @account.local? && !@account.user_approved?
|
||||
%span.neutral= t('admin.accounts.pending')
|
||||
- else
|
||||
%span.neutral= t('admin.accounts.no_limits_imposed')
|
||||
.dashboard__counters__label= t 'admin.accounts.login_status'
|
||||
|
||||
- unless @account.local? && @account.user.nil?
|
||||
.table-wrapper
|
||||
%table.table.inline-table
|
||||
%tbody
|
||||
- if @account.local?
|
||||
- if @account.avatar?
|
||||
%tr
|
||||
%th= t('admin.accounts.avatar')
|
||||
%td= table_link_to 'trash', t('admin.accounts.remove_avatar'), remove_avatar_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_avatar, @account)
|
||||
%td
|
||||
|
||||
- if @account.header?
|
||||
%tr
|
||||
%th= t('admin.accounts.header')
|
||||
%td= table_link_to 'trash', t('admin.accounts.remove_header'), remove_header_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_header, @account)
|
||||
%td
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.role')
|
||||
%td= t("admin.accounts.roles.#{@account.user&.role}")
|
||||
%td
|
||||
= table_link_to 'angle-double-up', t('admin.accounts.promote'), promote_admin_account_role_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:promote, @account.user)
|
||||
= table_link_to 'angle-double-down', t('admin.accounts.demote'), demote_admin_account_role_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:demote, @account.user)
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.email')
|
||||
%td= @account.user_email
|
||||
%td= table_link_to 'edit', t('admin.accounts.change_email.label'), admin_account_change_email_path(@account.id) if can?(:change_email, @account.user)
|
||||
|
||||
- if @account.user_unconfirmed_email.present?
|
||||
%tr
|
||||
%th= t('admin.accounts.unconfirmed_email')
|
||||
%td= @account.user_unconfirmed_email
|
||||
%td
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.email_status')
|
||||
%td
|
||||
- if @account.user&.confirmed?
|
||||
= t('admin.accounts.confirmed')
|
||||
- else
|
||||
= t('admin.accounts.confirming')
|
||||
%td= table_link_to 'refresh', t('admin.accounts.resend_confirmation.send'), resend_admin_account_confirmation_path(@account.id), method: :post if can?(:confirm, @account.user)
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.login_status')
|
||||
%td
|
||||
- if @account.user&.disabled?
|
||||
= t('admin.accounts.disabled')
|
||||
- else
|
||||
= t('admin.accounts.enabled')
|
||||
%td
|
||||
- if @account.user&.disabled?
|
||||
= table_link_to 'unlock', t('admin.accounts.enable'), enable_admin_account_path(@account.id), method: :post if can?(:enable, @account.user)
|
||||
- elsif @account.user_approved?
|
||||
= table_link_to 'lock', t('admin.accounts.disable'), new_admin_account_action_path(@account.id, type: 'disable') if can?(:disable, @account.user)
|
||||
|
||||
%tr
|
||||
%th= t('simple_form.labels.defaults.locale')
|
||||
%td= @account.user_locale
|
||||
%td
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.joined')
|
||||
%td
|
||||
%time.formatted{ datetime: @account.created_at.iso8601, title: l(@account.created_at) }= l @account.created_at
|
||||
%td
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.most_recent_ip')
|
||||
%td= @account.user_current_sign_in_ip
|
||||
%td
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.most_recent_activity')
|
||||
%td
|
||||
- if @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
|
||||
|
||||
- if @account.user&.invited?
|
||||
%tr
|
||||
%th= t('admin.accounts.invited_by')
|
||||
%td= admin_account_link_to @account.user.invite.user.account
|
||||
%td
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.is_pro')
|
||||
%td
|
||||
- if @account.is_pro?
|
||||
=fa_icon 'check'
|
||||
%time.formatted{ datetime: @account.pro_expires_at.iso8601, title: l(@account.pro_expires_at) }= l @account.pro_expires_at
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.is_verified')
|
||||
%td
|
||||
- if @account.is_verified?
|
||||
=fa_icon 'check'
|
||||
%td
|
||||
- if @account.local?
|
||||
- if @account.is_verified?
|
||||
= table_link_to 'undo', t('admin.accounts.unverify'), unverify_admin_account_path(@account.id), class: 'button', method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:verify, @account)
|
||||
- else
|
||||
= table_link_to '', t('admin.accounts.verify'), verify_admin_account_path(@account.id), class: 'button', method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:verify, @account)
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.is_donor')
|
||||
%td
|
||||
- if @account.is_donor?
|
||||
=fa_icon 'check'
|
||||
%td
|
||||
- if @account.local?
|
||||
- if @account.is_donor?
|
||||
= table_link_to 'undo', t('admin.accounts.remove_donor_badge'), remove_donor_badge_admin_account_path(@account.id), class: 'button', method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:update_badges, @account)
|
||||
- else
|
||||
= table_link_to '', t('admin.accounts.add_donor_badge'), add_donor_badge_admin_account_path(@account.id), class: 'button', method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:update_badges, @account)
|
||||
|
||||
%tr
|
||||
%th= t('admin.accounts.is_investor')
|
||||
%td
|
||||
- if @account.is_investor?
|
||||
=fa_icon 'check'
|
||||
%td
|
||||
- if @account.local?
|
||||
- if @account.is_investor?
|
||||
= table_link_to 'undo', t('admin.accounts.remove_investor_badge'), remove_investor_badge_admin_account_path(@account.id), class: 'button', method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:update_badges, @account)
|
||||
- else
|
||||
= table_link_to '', t('admin.accounts.add_investor_badge'), add_investor_badge_admin_account_path(@account.id), class: 'button', method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:update_badges, @account)
|
||||
|
||||
- else
|
||||
%tr
|
||||
%th= t('admin.accounts.inbox_url')
|
||||
%td
|
||||
= @account.inbox_url
|
||||
= fa_icon DeliveryFailureTracker.unavailable?(@account.inbox_url) ? 'times' : 'check'
|
||||
%tr
|
||||
%th= t('admin.accounts.shared_inbox_url')
|
||||
%td
|
||||
= @account.shared_inbox_url
|
||||
= fa_icon DeliveryFailureTracker.unavailable?(@account.shared_inbox_url) ? 'times' : 'check'
|
||||
|
||||
%div{ style: 'overflow: hidden' }
|
||||
%div{ style: 'float: right' }
|
||||
- if @account.local?
|
||||
= link_to t('admin.accounts.reset_password'), admin_account_reset_path(@account.id), method: :create, class: 'button' if can?(:reset_password, @account.user)
|
||||
- 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' if can?(:disable_2fa, @account.user)
|
||||
- if !@account.memorial? && @account.user_approved?
|
||||
= link_to t('admin.accounts.memorialize'), memorialize_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:memorialize, @account)
|
||||
- else
|
||||
= link_to t('admin.accounts.redownload'), redownload_admin_account_path(@account.id), method: :post, class: 'button' if can?(:redownload, @account)
|
||||
|
||||
%div{ style: 'float: left' }
|
||||
- if @account.local? && @account.user_approved?
|
||||
= link_to t('admin.accounts.warn'), new_admin_account_action_path(@account.id, type: 'none'), class: 'button' if can?(:warn, @account)
|
||||
- if @account.silenced?
|
||||
= link_to t('admin.accounts.undo_silenced'), unsilence_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unsilence, @account)
|
||||
- elsif !@account.local? || @account.user_approved?
|
||||
= link_to t('admin.accounts.silence'), new_admin_account_action_path(@account.id, type: 'silence'), class: 'button button--destructive' if can?(:silence, @account)
|
||||
|
||||
- if @account.local?
|
||||
- if @account.user_pending?
|
||||
= link_to t('admin.accounts.approve'), approve_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' if can?(:approve, @account.user)
|
||||
= link_to t('admin.accounts.reject'), reject_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:reject, @account.user)
|
||||
|
||||
- unless @account.user_confirmed?
|
||||
= link_to t('admin.accounts.confirm'), admin_account_confirmation_path(@account.id), method: :post, class: 'button' if can?(:confirm, @account.user)
|
||||
|
||||
- if @account.suspended?
|
||||
= link_to t('admin.accounts.undo_suspension'), unsuspend_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unsuspend, @account)
|
||||
- elsif !@account.local? || @account.user_approved?
|
||||
= link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(@account.id, type: 'suspend'), class: 'button button--destructive' if can?(:suspend, @account)
|
||||
|
||||
- unless @account.local?
|
||||
- if DomainBlock.where(domain: @account.domain).exists?
|
||||
= link_to t('admin.domain_blocks.undo'), admin_instance_path(@account.domain), class: 'button'
|
||||
- else
|
||||
= link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @account.domain), class: 'button button--destructive'
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
- unless @warnings.empty?
|
||||
= render @warnings
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
= render @moderation_notes
|
||||
|
||||
= simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |f|
|
||||
= render 'shared/error_messages', object: @account_moderation_note
|
||||
|
||||
= f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6
|
||||
= f.hidden_field :target_account_id
|
||||
|
||||
.actions
|
||||
= f.button :button, t('admin.account_moderation_notes.create'), type: :submit
|
||||
15
app/views/admin/action_logs/_action_log.html.haml
Normal file
15
app/views/admin/action_logs/_action_log.html.haml
Normal file
@@ -0,0 +1,15 @@
|
||||
.log-entry
|
||||
.log-entry__header
|
||||
.log-entry__avatar
|
||||
= image_tag action_log.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar'
|
||||
.log-entry__content
|
||||
.log-entry__title
|
||||
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target')).html_safe
|
||||
.log-entry__timestamp
|
||||
%time.formatted{ datetime: action_log.created_at.iso8601 }
|
||||
.spacer
|
||||
.log-entry__icon
|
||||
= fa_icon icon_for_log(action_log)
|
||||
.log-entry__icon__overlay{ class: class_for_log_icon(action_log) }
|
||||
.log-entry__extras
|
||||
= log_extra_attributes relevant_log_changes(action_log)
|
||||
6
app/views/admin/action_logs/index.html.haml
Normal file
6
app/views/admin/action_logs/index.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.action_logs.title')
|
||||
|
||||
= render @action_logs
|
||||
|
||||
= paginate @action_logs
|
||||
12
app/views/admin/change_emails/show.html.haml
Normal file
12
app/views/admin/change_emails/show.html.haml
Normal file
@@ -0,0 +1,12 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.accounts.change_email.title', username: @account.acct)
|
||||
|
||||
= simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f|
|
||||
.fields-group
|
||||
= f.input :email, wrapper: :with_label, hint: false, disabled: true, label: t('admin.accounts.change_email.current_email')
|
||||
|
||||
.fields-group
|
||||
= f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email')
|
||||
|
||||
.actions
|
||||
= f.button :submit, class: "button", value: t('admin.accounts.change_email.submit')
|
||||
28
app/views/admin/custom_emojis/_custom_emoji.html.haml
Normal file
28
app/views/admin/custom_emojis/_custom_emoji.html.haml
Normal file
@@ -0,0 +1,28 @@
|
||||
%tr
|
||||
%td
|
||||
= custom_emoji_tag(custom_emoji)
|
||||
%td
|
||||
%samp= ":#{custom_emoji.shortcode}:"
|
||||
%td
|
||||
- if custom_emoji.local?
|
||||
= t('admin.accounts.location.local')
|
||||
- else
|
||||
= link_to custom_emoji.domain, admin_custom_emojis_path(by_domain: custom_emoji.domain)
|
||||
%td
|
||||
- if custom_emoji.local?
|
||||
- if custom_emoji.visible_in_picker
|
||||
= table_link_to 'eye', t('admin.custom_emojis.listed'), admin_custom_emoji_path(custom_emoji, custom_emoji: { visible_in_picker: false }, page: params[:page], **@filter_params), method: :patch
|
||||
- else
|
||||
= table_link_to 'eye-slash', t('admin.custom_emojis.unlisted'), admin_custom_emoji_path(custom_emoji, custom_emoji: { visible_in_picker: true }, page: params[:page], **@filter_params), method: :patch
|
||||
- else
|
||||
- if custom_emoji.local_counterpart.present?
|
||||
= link_to safe_join([custom_emoji_tag(custom_emoji.local_counterpart), t('admin.custom_emojis.overwrite')]), copy_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post, class: 'table-action-link'
|
||||
- else
|
||||
= table_link_to 'copy', t('admin.custom_emojis.copy'), copy_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post
|
||||
%td
|
||||
- if custom_emoji.disabled?
|
||||
= table_link_to 'power-off', t('admin.custom_emojis.enable'), enable_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
- else
|
||||
= table_link_to 'power-off', t('admin.custom_emojis.disable'), disable_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
%td
|
||||
= table_link_to 'times', t('admin.custom_emojis.delete'), admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
48
app/views/admin/custom_emojis/index.html.haml
Normal file
48
app/views/admin/custom_emojis/index.html.haml
Normal file
@@ -0,0 +1,48 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.custom_emojis.title')
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.accounts.location.title')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.accounts.location.all'), local: nil, remote: nil
|
||||
%li
|
||||
- if selected? local: '1', remote: nil
|
||||
= filter_link_to t('admin.accounts.location.local'), {local: nil, remote: nil}, {local: '1', remote: nil}
|
||||
- else
|
||||
= filter_link_to t('admin.accounts.location.local'), local: '1', remote: nil
|
||||
%li
|
||||
- if selected? remote: '1', local: nil
|
||||
= filter_link_to t('admin.accounts.location.remote'), {remote: nil, local: nil}, {remote: '1', local: nil}
|
||||
- else
|
||||
= filter_link_to t('admin.accounts.location.remote'), remote: '1', local: nil
|
||||
|
||||
= form_tag admin_custom_emojis_url, method: 'GET', class: 'simple_form' do
|
||||
.fields-group
|
||||
- Admin::FilterHelper::CUSTOM_EMOJI_FILTERS.each do |key|
|
||||
- if params[key].present?
|
||||
= hidden_field_tag key, params[key]
|
||||
|
||||
- %i(shortcode by_domain).each do |key|
|
||||
.input.string.optional
|
||||
= text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.custom_emojis.#{key}")
|
||||
|
||||
.actions
|
||||
%button= t('admin.accounts.search')
|
||||
= link_to t('admin.accounts.reset'), admin_custom_emojis_path, class: 'button negative'
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.custom_emojis.emoji')
|
||||
%th= t('admin.custom_emojis.shortcode')
|
||||
%th= t('admin.accounts.domain')
|
||||
%th
|
||||
%th
|
||||
%th
|
||||
%tbody
|
||||
= render @custom_emojis
|
||||
|
||||
= paginate @custom_emojis
|
||||
= link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
|
||||
13
app/views/admin/custom_emojis/new.html.haml
Normal file
13
app/views/admin/custom_emojis/new.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- content_for :page_title do
|
||||
= t('.title')
|
||||
|
||||
= simple_form_for @custom_emoji, url: admin_custom_emojis_path do |f|
|
||||
= render 'shared/error_messages', object: @custom_emoji
|
||||
|
||||
.fields-group
|
||||
= f.input :shortcode, wrapper: :with_label, label: t('admin.custom_emojis.shortcode'), hint: t('admin.custom_emojis.shortcode_hint')
|
||||
.fields-group
|
||||
= f.input :image, wrapper: :with_label, input_html: { accept: 'image/png' }, hint: t('admin.custom_emojis.image_hint')
|
||||
|
||||
.actions
|
||||
= f.button :button, t('admin.custom_emojis.upload'), type: :submit
|
||||
109
app/views/admin/dashboard/index.html.haml
Normal file
109
app/views/admin/dashboard/index.html.haml
Normal file
@@ -0,0 +1,109 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.dashboard.title')
|
||||
|
||||
.dashboard__counters
|
||||
%div
|
||||
= link_to admin_accounts_url(local: 1, recent: 1) do
|
||||
.dashboard__counters__num= number_with_delimiter @users_count
|
||||
.dashboard__counters__label= t 'admin.dashboard.total_users'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @registrations_week
|
||||
.dashboard__counters__label= t 'admin.dashboard.week_users_new'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @logins_week
|
||||
.dashboard__counters__label= t 'admin.dashboard.week_users_active'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @interactions_week
|
||||
.dashboard__counters__label= t 'admin.dashboard.week_interactions'
|
||||
%div
|
||||
= link_to admin_reports_url do
|
||||
.dashboard__counters__num= number_with_delimiter @reports_count
|
||||
.dashboard__counters__label= t 'admin.dashboard.open_reports'
|
||||
%div
|
||||
= link_to sidekiq_url do
|
||||
.dashboard__counters__num= number_with_delimiter @queue_backlog
|
||||
.dashboard__counters__label= t 'admin.dashboard.backlog'
|
||||
|
||||
.dashboard__widgets
|
||||
.dashboard__widgets__users
|
||||
%div
|
||||
%h4= t 'admin.dashboard.recent_users'
|
||||
%ul
|
||||
- @recent_users.each do |user|
|
||||
%li= admin_account_link_to(user.account)
|
||||
|
||||
.dashboard__widgets__features
|
||||
%div
|
||||
%h4= t 'admin.dashboard.features'
|
||||
%ul
|
||||
%li
|
||||
= feature_hint(link_to(t('admin.dashboard.feature_registrations'), edit_admin_settings_path), @registrations_enabled)
|
||||
%li
|
||||
= feature_hint(link_to(t('admin.dashboard.feature_invites'), edit_admin_settings_path), @invites_enabled)
|
||||
%li
|
||||
= feature_hint(link_to(t('admin.dashboard.feature_deletions'), edit_admin_settings_path), @deletions_enabled)
|
||||
%li
|
||||
= feature_hint(link_to(t('admin.dashboard.feature_profile_directory'), edit_admin_settings_path), @profile_directory)
|
||||
%li
|
||||
= feature_hint(link_to(t('admin.dashboard.feature_timeline_preview'), edit_admin_settings_path), @timeline_preview)
|
||||
%li
|
||||
= feature_hint(link_to(t('admin.dashboard.feature_relay'), admin_relays_path), @relay_enabled)
|
||||
|
||||
.dashboard__widgets__versions
|
||||
%div
|
||||
%h4= t 'admin.dashboard.software'
|
||||
%ul
|
||||
%li
|
||||
Gab Social
|
||||
%span.pull-right= @version
|
||||
%li
|
||||
Ruby
|
||||
%span.pull-right= "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
|
||||
%li
|
||||
PostgreSQL
|
||||
%span.pull-right= @database_version
|
||||
%li
|
||||
Redis
|
||||
%span.pull-right= @redis_version
|
||||
|
||||
.dashboard__widgets__space
|
||||
%div
|
||||
%h4= t 'admin.dashboard.space'
|
||||
%ul
|
||||
%li
|
||||
PostgreSQL
|
||||
%span.pull-right= number_to_human_size @database_size
|
||||
%li
|
||||
Redis
|
||||
%span.pull-right= number_to_human_size @redis_size
|
||||
|
||||
.dashboard__widgets__config
|
||||
%div
|
||||
%h4= t 'admin.dashboard.config'
|
||||
%ul
|
||||
%li
|
||||
= feature_hint(t('admin.dashboard.search'), @search_enabled)
|
||||
%li
|
||||
= feature_hint(t('admin.dashboard.single_user_mode'), @single_user_mode)
|
||||
%li
|
||||
= feature_hint('LDAP', @ldap_enabled)
|
||||
%li
|
||||
= feature_hint('CAS', @cas_enabled)
|
||||
%li
|
||||
= feature_hint('SAML', @saml_enabled)
|
||||
%li
|
||||
= feature_hint('PAM', @pam_enabled)
|
||||
%li
|
||||
= feature_hint(t('admin.dashboard.hidden_service'), @hidden_service)
|
||||
|
||||
.dashboard__widgets__trends
|
||||
%div
|
||||
%h4= t 'admin.dashboard.trends'
|
||||
%ul
|
||||
- @trending_hashtags.each do |tag|
|
||||
%li
|
||||
= link_to "##{tag.name}", web_url("timelines/tag/#{tag.name}")
|
||||
%span.pull-right= number_with_delimiter(tag.history[0][:accounts].to_i)
|
||||
24
app/views/admin/domain_blocks/new.html.haml
Normal file
24
app/views/admin/domain_blocks/new.html.haml
Normal file
@@ -0,0 +1,24 @@
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
|
||||
|
||||
- content_for :page_title do
|
||||
= t('.title')
|
||||
|
||||
= simple_form_for @domain_block, url: admin_domain_blocks_path do |f|
|
||||
= render 'shared/error_messages', object: @domain_block
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :domain, wrapper: :with_label, label: t('admin.domain_blocks.domain'), hint: t('.hint'), required: true
|
||||
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :severity, collection: DomainBlock.severities.keys, wrapper: :with_label, include_blank: false, label_method: lambda { |type| t(".severity.#{type}") }, hint: t('.severity.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :reject_media, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_media'), hint: I18n.t('admin.domain_blocks.reject_media_hint')
|
||||
|
||||
.fields-group
|
||||
= f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint')
|
||||
|
||||
.actions
|
||||
= f.button :button, t('.create'), type: :submit
|
||||
13
app/views/admin/domain_blocks/show.html.haml
Normal file
13
app/views/admin/domain_blocks/show.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.domain_blocks.show.title', domain: @domain_block.domain)
|
||||
|
||||
= simple_form_for @domain_block, url: admin_domain_block_path(@domain_block), method: :delete do |f|
|
||||
|
||||
- unless (@domain_block.noop?)
|
||||
%p= t(".retroactive.#{@domain_block.severity}")
|
||||
%p.hint= t(:affected_accounts,
|
||||
scope: [:admin, :domain_blocks, :show],
|
||||
count: @domain_block.affected_accounts_count)
|
||||
|
||||
.actions
|
||||
= f.button :button, t('.undo'), type: :submit
|
||||
@@ -0,0 +1,5 @@
|
||||
%tr
|
||||
%td
|
||||
%samp= email_domain_block.domain
|
||||
%td
|
||||
= table_link_to 'trash', t('admin.email_domain_blocks.delete'), admin_email_domain_block_path(email_domain_block), method: :delete
|
||||
14
app/views/admin/email_domain_blocks/index.html.haml
Normal file
14
app/views/admin/email_domain_blocks/index.html.haml
Normal file
@@ -0,0 +1,14 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.email_domain_blocks.title')
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.email_domain_blocks.domain')
|
||||
%th
|
||||
%tbody
|
||||
= render @email_domain_blocks
|
||||
|
||||
= paginate @email_domain_blocks
|
||||
= link_to t('admin.email_domain_blocks.add_new'), new_admin_email_domain_block_path, class: 'button'
|
||||
11
app/views/admin/email_domain_blocks/new.html.haml
Normal file
11
app/views/admin/email_domain_blocks/new.html.haml
Normal file
@@ -0,0 +1,11 @@
|
||||
- content_for :page_title do
|
||||
= t('.title')
|
||||
|
||||
= simple_form_for @email_domain_block, url: admin_email_domain_blocks_path do |f|
|
||||
= render 'shared/error_messages', object: @email_domain_block
|
||||
|
||||
.fields-group
|
||||
= f.input :domain, wrapper: :with_label, label: t('admin.email_domain_blocks.domain')
|
||||
|
||||
.actions
|
||||
= f.button :button, t('.create'), type: :submit
|
||||
28
app/views/admin/followers/index.html.haml
Normal file
28
app/views/admin/followers/index.html.haml
Normal file
@@ -0,0 +1,28 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.followers.title', acct: @account.acct)
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.accounts.location.title')
|
||||
%ul
|
||||
%li= link_to t('admin.accounts.location.local'), admin_account_followers_path(@account.id), class: 'selected'
|
||||
.back-link{ style: 'flex: 1 1 auto; text-align: right' }
|
||||
= link_to admin_account_path(@account.id) do
|
||||
= fa_icon 'chevron-left fw'
|
||||
= t('admin.followers.back_to_account')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.accounts.username')
|
||||
%th= t('admin.accounts.role')
|
||||
%th= t('admin.accounts.most_recent_ip')
|
||||
%th= t('admin.accounts.most_recent_activity')
|
||||
%th
|
||||
%tbody
|
||||
= render partial: 'admin/accounts/account', collection: @followers
|
||||
|
||||
= paginate @followers
|
||||
53
app/views/admin/instances/index.html.haml
Normal file
53
app/views/admin/instances/index.html.haml
Normal file
@@ -0,0 +1,53 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.instances.title')
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.instances.moderation.title')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.instances.moderation.all'), limited: nil
|
||||
%li= filter_link_to t('admin.instances.moderation.limited'), limited: '1'
|
||||
|
||||
%div{ style: 'flex: 1 1 auto; text-align: right' }
|
||||
= link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
|
||||
|
||||
= form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
|
||||
.fields-group
|
||||
- Admin::FilterHelper::INSTANCES_FILTERS.each do |key|
|
||||
- if params[key].present?
|
||||
= hidden_field_tag key, params[key]
|
||||
|
||||
- %i(by_domain).each do |key|
|
||||
.input.string.optional
|
||||
= text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}")
|
||||
|
||||
.actions
|
||||
%button= t('admin.accounts.search')
|
||||
= link_to t('admin.accounts.reset'), admin_instances_path, class: 'button negative'
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
- @instances.each do |instance|
|
||||
.directory__tag
|
||||
= link_to admin_instance_path(instance) do
|
||||
%h4
|
||||
= instance.domain
|
||||
%small
|
||||
= t('admin.instances.known_accounts', count: instance.cached_accounts_count)
|
||||
|
||||
- if instance.domain_block
|
||||
- if !instance.domain_block.noop?
|
||||
•
|
||||
= t("admin.domain_blocks.severity.#{instance.domain_block.severity}")
|
||||
- if instance.domain_block.reject_media?
|
||||
•
|
||||
= t('admin.domain_blocks.rejecting_media')
|
||||
- if instance.domain_block.reject_reports?
|
||||
•
|
||||
= t('admin.domain_blocks.rejecting_reports')
|
||||
|
||||
.avatar-stack
|
||||
- instance.cached_sample_accounts.each do |account|
|
||||
= image_tag current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url, width: 48, height: 48, alt: '', class: 'account__avatar'
|
||||
|
||||
= paginate paginated_instances
|
||||
44
app/views/admin/instances/show.html.haml
Normal file
44
app/views/admin/instances/show.html.haml
Normal file
@@ -0,0 +1,44 @@
|
||||
- content_for :page_title do
|
||||
= @instance.domain
|
||||
|
||||
.dashboard__counters
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @following_count
|
||||
.dashboard__counters__label= t 'admin.instances.total_followed_by_them'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @followers_count
|
||||
.dashboard__counters__label= t 'admin.instances.total_followed_by_us'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_to_human_size @media_storage
|
||||
.dashboard__counters__label= t 'admin.instances.total_storage'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @blocks_count
|
||||
.dashboard__counters__label= t 'admin.instances.total_blocked_by_us'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num= number_with_delimiter @reports_count
|
||||
.dashboard__counters__label= t 'admin.instances.total_reported'
|
||||
%div
|
||||
%div
|
||||
.dashboard__counters__num
|
||||
- if @available
|
||||
= fa_icon 'check'
|
||||
- else
|
||||
= fa_icon 'times'
|
||||
.dashboard__counters__label= t 'admin.instances.delivery_available'
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
%div{ style: 'overflow: hidden' }
|
||||
%div{ style: 'float: left' }
|
||||
= link_to t('admin.accounts.title'), admin_accounts_path(remote: '1', by_domain: @instance.domain), class: 'button'
|
||||
|
||||
%div{ style: 'float: right' }
|
||||
- if @domain_block
|
||||
= link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@domain_block), class: 'button'
|
||||
- else
|
||||
= link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @instance.domain), class: 'button'
|
||||
30
app/views/admin/invites/_invite.html.haml
Normal file
30
app/views/admin/invites/_invite.html.haml
Normal file
@@ -0,0 +1,30 @@
|
||||
%tr
|
||||
%td
|
||||
.input-copy
|
||||
.input-copy__wrapper
|
||||
%input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: public_invite_url(invite_code: invite.code) }
|
||||
%button{ type: :button }= t('generic.copy')
|
||||
|
||||
%td
|
||||
.name-tag
|
||||
= image_tag invite.user.account.avatar.url(:original), alt: '', width: 16, height: 16, class: 'avatar'
|
||||
%span.username= invite.user.account.username
|
||||
|
||||
- if invite.valid_for_use?
|
||||
%td
|
||||
= fa_icon 'user fw'
|
||||
= invite.uses
|
||||
= " / #{invite.max_uses}" unless invite.max_uses.nil?
|
||||
%td
|
||||
- if invite.expires_at.nil?
|
||||
∞
|
||||
- else
|
||||
%time.formatted{ datetime: invite.expires_at.iso8601, title: l(invite.expires_at) }
|
||||
= l invite.expires_at
|
||||
- else
|
||||
%td{ colspan: 2 }
|
||||
= t('invites.expired')
|
||||
|
||||
%td
|
||||
- if invite.valid_for_use? && policy(invite).destroy?
|
||||
= table_link_to 'times', t('invites.delete'), admin_invite_path(invite), method: :delete
|
||||
36
app/views/admin/invites/index.html.haml
Normal file
36
app/views/admin/invites/index.html.haml
Normal file
@@ -0,0 +1,36 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.invites.title')
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.invites.filter.title')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.invites.filter.all'), available: nil, expired: nil
|
||||
%li= filter_link_to t('admin.invites.filter.available'), available: 1, expired: nil
|
||||
%li= filter_link_to t('admin.invites.filter.expired'), available: nil, expired: 1
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
- if policy(:invite).create?
|
||||
%p= t('invites.prompt')
|
||||
|
||||
= render 'invites/form'
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.table-wrapper.simple_form
|
||||
%table.table.table--invites
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
%th
|
||||
%th= t('invites.table.uses')
|
||||
%th= t('invites.table.expires_at')
|
||||
%th
|
||||
%tbody
|
||||
= render @invites
|
||||
|
||||
= paginate @invites
|
||||
|
||||
- if policy(:invite).deactivate_all?
|
||||
= link_to t('admin.invites.deactivate_all'), deactivate_all_admin_invites_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button'
|
||||
14
app/views/admin/pending_accounts/_account.html.haml
Normal file
14
app/views/admin/pending_accounts/_account.html.haml
Normal file
@@ -0,0 +1,14 @@
|
||||
.batch-table__row
|
||||
%label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
|
||||
= f.check_box :account_ids, { multiple: true, include_hidden: false }, account.id
|
||||
.batch-table__row__content.pending-account
|
||||
.pending-account__header
|
||||
= link_to admin_account_path(account.id) do
|
||||
%strong= account.user_email
|
||||
= "(@#{account.username})"
|
||||
%br/
|
||||
= account.user_current_sign_in_ip
|
||||
|
||||
- if account.user&.invite_request&.text&.present?
|
||||
.pending-account__body
|
||||
%p= account.user&.invite_request&.text
|
||||
33
app/views/admin/pending_accounts/index.html.haml
Normal file
33
app/views/admin/pending_accounts/index.html.haml
Normal file
@@ -0,0 +1,33 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.pending_accounts.title', count: User.pending.count)
|
||||
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
|
||||
|
||||
= form_for(@form, url: batch_admin_pending_accounts_path) do |f|
|
||||
= hidden_field_tag :page, params[:page] || 1
|
||||
|
||||
.batch-table
|
||||
.batch-table__toolbar
|
||||
%label.batch-table__toolbar__select.batch-checkbox-all
|
||||
= check_box_tag :batch_checkbox_all, nil, false
|
||||
.batch-table__toolbar__actions
|
||||
= f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
|
||||
= f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
.batch-table__body
|
||||
- if @accounts.empty?
|
||||
= nothing_here 'nothing-here--under-tabs'
|
||||
- else
|
||||
= render partial: 'account', collection: @accounts, locals: { f: f }
|
||||
|
||||
= paginate @accounts
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
%div{ style: 'overflow: hidden' }
|
||||
%div{ style: 'float: right' }
|
||||
= link_to t('admin.accounts.reject_all'), reject_all_admin_pending_accounts_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive'
|
||||
|
||||
%div
|
||||
= link_to t('admin.accounts.approve_all'), approve_all_admin_pending_accounts_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button'
|
||||
25
app/views/admin/relays/_relay.html.haml
Normal file
25
app/views/admin/relays/_relay.html.haml
Normal file
@@ -0,0 +1,25 @@
|
||||
%tr
|
||||
%td
|
||||
%samp= relay.inbox_url
|
||||
%td
|
||||
- if relay.accepted?
|
||||
%span.positive-hint
|
||||
= fa_icon('check')
|
||||
= ' '
|
||||
= t 'admin.relays.enabled'
|
||||
- elsif relay.pending?
|
||||
= fa_icon('hourglass')
|
||||
= ' '
|
||||
= t 'admin.relays.pending'
|
||||
- else
|
||||
%span.negative-hint
|
||||
= fa_icon('times')
|
||||
= ' '
|
||||
= t 'admin.relays.disabled'
|
||||
%td
|
||||
- if relay.accepted?
|
||||
= table_link_to 'power-off', t('admin.relays.disable'), disable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
- elsif !relay.pending?
|
||||
= table_link_to 'power-off', t('admin.relays.enable'), enable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
|
||||
= table_link_to 'times', t('admin.relays.delete'), admin_relay_path(relay), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
20
app/views/admin/relays/index.html.haml
Normal file
20
app/views/admin/relays/index.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.relays.title')
|
||||
|
||||
.simple_form
|
||||
%p.hint= t('admin.relays.description_html')
|
||||
= link_to @relays.empty? ? t('admin.relays.setup') : t('admin.relays.add_new'), new_admin_relay_path, class: 'block-button'
|
||||
|
||||
- unless @relays.empty?
|
||||
%hr.spacer
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.relays.inbox_url')
|
||||
%th= t('admin.relays.status')
|
||||
%th
|
||||
%tbody
|
||||
= render @relays
|
||||
|
||||
13
app/views/admin/relays/new.html.haml
Normal file
13
app/views/admin/relays/new.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.relays.add_new')
|
||||
|
||||
= simple_form_for @relay, url: admin_relays_path do |f|
|
||||
= render 'shared/error_messages', object: @relay
|
||||
|
||||
.field-group
|
||||
= f.input :inbox_url, as: :string, wrapper: :with_block_label
|
||||
|
||||
.actions
|
||||
= f.button :button, t('admin.relays.save_and_enable'), type: :submit
|
||||
|
||||
%p.hint.subtle-hint= t('admin.relays.enable_hint')
|
||||
7
app/views/admin/report_notes/_report_note.html.haml
Normal file
7
app/views/admin/report_notes/_report_note.html.haml
Normal file
@@ -0,0 +1,7 @@
|
||||
.speech-bubble
|
||||
.speech-bubble__bubble
|
||||
= simple_format(h(report_note.content))
|
||||
.speech-bubble__owner
|
||||
= admin_account_link_to report_note.account
|
||||
%time.formatted{ datetime: report_note.created_at.iso8601 }= l report_note.created_at
|
||||
= table_link_to 'trash', t('admin.reports.notes.delete'), admin_report_note_path(report_note), method: :delete if can?(:destroy, report_note)
|
||||
6
app/views/admin/reports/_action_log.html.haml
Normal file
6
app/views/admin/reports/_action_log.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
.speech-bubble.positive
|
||||
.speech-bubble__bubble
|
||||
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target')).html_safe
|
||||
.speech-bubble__owner
|
||||
= admin_account_link_to(action_log.account)
|
||||
%time.formatted{ datetime: action_log.created_at.iso8601 }= l action_log.created_at
|
||||
34
app/views/admin/reports/_status.html.haml
Normal file
34
app/views/admin/reports/_status.html.haml
Normal file
@@ -0,0 +1,34 @@
|
||||
.batch-table__row
|
||||
%label.batch-table__row__select.batch-checkbox
|
||||
= f.check_box :status_ids, { multiple: true, include_hidden: false }, status.id
|
||||
.batch-table__row__content
|
||||
.status__content><
|
||||
- if status.proper.spoiler_text.blank?
|
||||
= Formatter.instance.format(status.proper, custom_emojify: true)
|
||||
- else
|
||||
%details<
|
||||
%summary><
|
||||
%strong> Content warning: #{Formatter.instance.format_spoiler(status.proper)}
|
||||
= Formatter.instance.format(status.proper, custom_emojify: true)
|
||||
|
||||
- unless status.proper.media_attachments.empty?
|
||||
- if status.proper.media_attachments.first.video?
|
||||
- video = status.proper.media_attachments.first
|
||||
= react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.proper.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description
|
||||
- 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, media: status.proper.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
|
||||
|
||||
.detailed-status__meta
|
||||
= link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener' do
|
||||
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
|
||||
·
|
||||
- if status.reblog?
|
||||
= fa_icon('retweet fw')
|
||||
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account))
|
||||
- else
|
||||
= fa_visibility_icon(status)
|
||||
= t("statuses.visibilities.#{status.visibility}")
|
||||
- if status.proper.sensitive?
|
||||
·
|
||||
= fa_icon('eye-slash fw')
|
||||
= t('stream_entries.sensitive_content')
|
||||
52
app/views/admin/reports/index.html.haml
Normal file
52
app/views/admin/reports/index.html.haml
Normal file
@@ -0,0 +1,52 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.reports.title')
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.reports.status')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.reports.unresolved'), resolved: nil
|
||||
%li= filter_link_to t('admin.reports.resolved'), resolved: '1'
|
||||
|
||||
- @reports.group_by(&:target_account_id).each do |target_account_id, reports|
|
||||
- target_account = reports.first.target_account
|
||||
.report-card
|
||||
.report-card__profile
|
||||
= account_link_to target_account, '', size: 36, path: admin_account_path(target_account.id)
|
||||
.report-card__profile__stats
|
||||
= link_to pluralize(target_account.targeted_moderation_notes.count, t('admin.reports.account.note')), admin_account_path(target_account.id)
|
||||
%br/
|
||||
- if target_account.suspended?
|
||||
%span.red= t('admin.accounts.suspended')
|
||||
- elsif target_account.silenced?
|
||||
%span.red= t('admin.accounts.silenced')
|
||||
- elsif target_account.user&.disabled?
|
||||
%span.red= t('admin.accounts.disabled')
|
||||
- else
|
||||
%span.neutral= t('admin.accounts.no_limits_imposed')
|
||||
.report-card__summary
|
||||
- reports.each do |report|
|
||||
.report-card__summary__item
|
||||
.report-card__summary__item__reported-by
|
||||
- if report.account.local?
|
||||
= admin_account_link_to report.account
|
||||
- else
|
||||
= report.account.domain
|
||||
.report-card__summary__item__content
|
||||
= link_to admin_report_path(report) do
|
||||
.one-line= report.comment.presence || t('admin.reports.comment.none')
|
||||
|
||||
%span.report-card__summary__item__content__icon{ title: t('admin.accounts.statuses') }
|
||||
= fa_icon('comment')
|
||||
= report.statuses.count
|
||||
|
||||
%span.report-card__summary__item__content__icon{ title: t('admin.accounts.media_attachments') }
|
||||
= fa_icon('camera')
|
||||
= report.media_attachments.count
|
||||
|
||||
.report-card__summary__item__assigned
|
||||
- if report.assigned_account.present?
|
||||
= admin_account_link_to report.assigned_account
|
||||
- else
|
||||
\-
|
||||
= paginate @reports
|
||||
123
app/views/admin/reports/show.html.haml
Normal file
123
app/views/admin/reports/show.html.haml
Normal file
@@ -0,0 +1,123 @@
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
|
||||
|
||||
- content_for :page_title do
|
||||
= t('admin.reports.report', id: @report.id)
|
||||
|
||||
%div{ style: 'overflow: hidden; margin-bottom: 20px' }
|
||||
- if @report.unresolved?
|
||||
%div{ style: 'float: right' }
|
||||
- if @report.target_account.local?
|
||||
= link_to t('admin.accounts.warn'), new_admin_account_action_path(@report.target_account_id, type: 'none', report_id: @report.id), class: 'button'
|
||||
= link_to t('admin.accounts.disable'), new_admin_account_action_path(@report.target_account_id, type: 'disable', report_id: @report.id), class: 'button button--destructive'
|
||||
= link_to t('admin.accounts.silence'), new_admin_account_action_path(@report.target_account_id, type: 'silence', report_id: @report.id), class: 'button button--destructive'
|
||||
= link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(@report.target_account_id, type: 'suspend', report_id: @report.id), class: 'button button--destructive'
|
||||
%div{ style: 'float: left' }
|
||||
= link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), method: :post, class: 'button'
|
||||
- else
|
||||
= link_to t('admin.reports.mark_as_unresolved'), reopen_admin_report_path(@report), method: :post, class: 'button'
|
||||
|
||||
%hr.spacer
|
||||
|
||||
.table-wrapper
|
||||
%table.table.inline-table
|
||||
%tbody
|
||||
%tr
|
||||
%th= t('admin.reports.reported_account')
|
||||
%td= admin_account_link_to @report.target_account
|
||||
%td= table_link_to 'flag', pluralize(@report.target_account.targeted_reports.count, t('admin.reports.account.report')), admin_reports_path(target_account_id: @report.target_account.id)
|
||||
%td= table_link_to 'file', pluralize(@report.target_account.targeted_moderation_notes.count, t('admin.reports.account.note')), admin_reports_path(target_account_id: @report.target_account.id)
|
||||
%tr
|
||||
%th= t('admin.reports.reported_by')
|
||||
- if @report.account.local?
|
||||
%td= admin_account_link_to @report.account
|
||||
%td= table_link_to 'flag', pluralize(@report.account.targeted_reports.count, t('admin.reports.account.report')), admin_reports_path(target_account_id: @report.account.id)
|
||||
%td= table_link_to 'file', pluralize(@report.account.targeted_moderation_notes.count, t('admin.reports.account.note')), admin_reports_path(target_account_id: @report.account.id)
|
||||
- else
|
||||
%td{ colspan: 3 }= @report.account.domain
|
||||
%tr
|
||||
%th= t('admin.reports.created_at')
|
||||
%td{ colspan: 3 }
|
||||
%time.formatted{ datetime: @report.created_at.iso8601 }
|
||||
%tr
|
||||
%th= t('admin.reports.updated_at')
|
||||
%td{ colspan: 3 }
|
||||
%time.formatted{ datetime: @report.updated_at.iso8601 }
|
||||
%tr
|
||||
%th= t('admin.reports.status')
|
||||
%td
|
||||
- if @report.action_taken?
|
||||
= t('admin.reports.resolved')
|
||||
- else
|
||||
= t('admin.reports.unresolved')
|
||||
%td{ colspan: 2 }
|
||||
- if @report.action_taken?
|
||||
= table_link_to 'envelope-open', t('admin.reports.reopen'), admin_report_path(@report, outcome: 'reopen'), method: :put
|
||||
- if !@report.action_taken_by_account.nil?
|
||||
%tr
|
||||
%th= t('admin.reports.action_taken_by')
|
||||
%td{ colspan: 3 }
|
||||
= admin_account_link_to @report.action_taken_by_account
|
||||
- else
|
||||
%tr
|
||||
%th= t('admin.reports.assigned')
|
||||
%td
|
||||
- if @report.assigned_account.nil?
|
||||
\-
|
||||
- else
|
||||
= admin_account_link_to @report.assigned_account
|
||||
%td
|
||||
- if @report.assigned_account != current_user.account
|
||||
= table_link_to 'user', t('admin.reports.assign_to_self'), assign_to_self_admin_report_path(@report), method: :post
|
||||
%td
|
||||
- if !@report.assigned_account.nil?
|
||||
= table_link_to 'trash', t('admin.reports.unassign'), unassign_admin_report_path(@report), method: :post
|
||||
|
||||
%hr.spacer
|
||||
|
||||
.speech-bubble
|
||||
.speech-bubble__bubble= simple_format(@report.comment.presence || t('admin.reports.comment.none'))
|
||||
.speech-bubble__owner
|
||||
- if @report.account.local?
|
||||
= admin_account_link_to @report.account
|
||||
- else
|
||||
= @report.account.domain
|
||||
%br/
|
||||
%time.formatted{ datetime: @report.created_at.iso8601 }
|
||||
|
||||
- unless @report.statuses.empty?
|
||||
%hr.spacer/
|
||||
|
||||
= form_for(@form, url: admin_report_reported_statuses_path(@report.id)) do |f|
|
||||
.batch-table
|
||||
.batch-table__toolbar
|
||||
%label.batch-table__toolbar__select.batch-checkbox-all
|
||||
= check_box_tag :batch_checkbox_all, nil, false
|
||||
.batch-table__toolbar__actions
|
||||
= f.button safe_join([fa_icon('eye-slash'), t('admin.statuses.batch.nsfw_on')]), name: :nsfw_on, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
= f.button safe_join([fa_icon('eye'), t('admin.statuses.batch.nsfw_off')]), name: :nsfw_off, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
= f.button safe_join([fa_icon('trash'), t('admin.statuses.batch.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
.batch-table__body
|
||||
= render partial: 'admin/reports/status', collection: @report.statuses, locals: { f: f }
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
- @report_notes.each do |item|
|
||||
- if item.is_a?(Admin::ActionLog)
|
||||
= render partial: 'action_log', locals: { action_log: item }
|
||||
- else
|
||||
= render item
|
||||
|
||||
= simple_form_for @report_note, url: admin_report_notes_path do |f|
|
||||
= render 'shared/error_messages', object: @report_note
|
||||
= f.input :report_id, as: :hidden
|
||||
|
||||
.field-group
|
||||
= f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6
|
||||
|
||||
.actions
|
||||
- if @report.unresolved?
|
||||
= f.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit
|
||||
- else
|
||||
= f.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit
|
||||
= f.button :button, t('admin.reports.notes.create'), type: :submit
|
||||
81
app/views/admin/settings/edit.html.haml
Normal file
81
app/views/admin/settings/edit.html.haml
Normal file
@@ -0,0 +1,81 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.settings.title')
|
||||
|
||||
= simple_form_for @admin_settings, url: admin_settings_path, html: { method: :patch } do |f|
|
||||
= render 'shared/error_messages', object: @admin_settings
|
||||
|
||||
.fields-group
|
||||
= f.input :site_title, wrapper: :with_label, label: t('admin.settings.site_title')
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :registrations_mode, collection: %w(open approved none), wrapper: :with_label, label: t('admin.settings.registrations_mode.title'), include_blank: false, label_method: lambda { |mode| I18n.t("admin.settings.registrations_mode.modes.#{mode}") }
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :site_contact_username, wrapper: :with_label, label: t('admin.settings.contact_information.username')
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :site_contact_email, wrapper: :with_label, label: t('admin.settings.contact_information.email')
|
||||
|
||||
.fields-group
|
||||
= f.input :site_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_description.title'), hint: t('admin.settings.site_description.desc_html'), input_html: { rows: 4 }
|
||||
|
||||
.fields-group
|
||||
= f.input :site_short_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_short_description.title'), hint: t('admin.settings.site_short_description.desc_html'), input_html: { rows: 2 }
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :thumbnail, as: :file, wrapper: :with_block_label, label: t('admin.settings.thumbnail.title'), hint: t('admin.settings.thumbnail.desc_html')
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :hero, as: :file, wrapper: :with_block_label, label: t('admin.settings.hero.title'), hint: t('admin.settings.hero.desc_html')
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :mascot, as: :file, wrapper: :with_block_label, label: t('admin.settings.mascot.title'), hint: t('admin.settings.mascot.desc_html')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.fields-group
|
||||
= f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.fields-group
|
||||
= f.input :timeline_preview, as: :boolean, wrapper: :with_label, label: t('admin.settings.timeline_preview.title'), hint: t('admin.settings.timeline_preview.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :show_known_fediverse_at_about_page, as: :boolean, wrapper: :with_label, label: t('admin.settings.show_known_fediverse_at_about_page.title'), hint: t('admin.settings.show_known_fediverse_at_about_page.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :show_staff_badge, as: :boolean, wrapper: :with_label, label: t('admin.settings.show_staff_badge.title'), hint: t('admin.settings.show_staff_badge.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :open_deletion, as: :boolean, wrapper: :with_label, label: t('admin.settings.registrations.deletion.title'), hint: t('admin.settings.registrations.deletion.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :activity_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.activity_api_enabled.title'), hint: t('admin.settings.activity_api_enabled.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.peers_api_enabled.title'), hint: t('admin.settings.peers_api_enabled.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :preview_sensitive_media, as: :boolean, wrapper: :with_label, label: t('admin.settings.preview_sensitive_media.title'), hint: t('admin.settings.preview_sensitive_media.desc_html')
|
||||
|
||||
.fields-group
|
||||
= f.input :profile_directory, as: :boolean, wrapper: :with_label, label: t('admin.settings.profile_directory.title'), hint: t('admin.settings.profile_directory.desc_html')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.fields-group
|
||||
= f.input :min_invite_role, wrapper: :with_label, collection: %i(disabled user moderator admin), label: t('admin.settings.registrations.min_invite_role.title'), label_method: lambda { |role| role == :disabled ? t('admin.settings.registrations.min_invite_role.disabled') : t("admin.accounts.roles.#{role}") }, include_blank: false, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
|
||||
|
||||
.fields-group
|
||||
= f.input :closed_registrations_message, as: :text, wrapper: :with_block_label, label: t('admin.settings.registrations.closed_message.title'), hint: t('admin.settings.registrations.closed_message.desc_html'), input_html: { rows: 8 }
|
||||
= f.input :site_extended_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_description_extended.title'), hint: t('admin.settings.site_description_extended.desc_html'), input_html: { rows: 8 }
|
||||
= f.input :site_terms, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_terms.title'), hint: t('admin.settings.site_terms.desc_html'), input_html: { rows: 8 }
|
||||
= f.input :custom_css, wrapper: :with_block_label, as: :text, input_html: { rows: 8 }, label: t('admin.settings.custom_css.title'), hint: t('admin.settings.custom_css.desc_html')
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit
|
||||
37
app/views/admin/statuses/index.html.haml
Normal file
37
app/views/admin/statuses/index.html.haml
Normal file
@@ -0,0 +1,37 @@
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
|
||||
|
||||
- content_for :page_title do
|
||||
= t('admin.statuses.title')
|
||||
\-
|
||||
= "@#{@account.acct}"
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.statuses.media.title')
|
||||
%ul
|
||||
%li= link_to t('admin.statuses.no_media'), admin_account_statuses_path(@account.id, current_params.merge(media: nil)), class: !params[:media] && 'selected'
|
||||
%li= link_to t('admin.statuses.with_media'), admin_account_statuses_path(@account.id, current_params.merge(media: true)), class: params[:media] && 'selected'
|
||||
.back-link{ style: 'flex: 1 1 auto; text-align: right' }
|
||||
= link_to admin_account_path(@account.id) do
|
||||
= fa_icon 'chevron-left fw'
|
||||
= t('admin.statuses.back_to_account')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
= form_for(@form, url: admin_account_statuses_path(@account.id)) do |f|
|
||||
= hidden_field_tag :page, params[:page]
|
||||
= hidden_field_tag :media, params[:media]
|
||||
|
||||
.batch-table
|
||||
.batch-table__toolbar
|
||||
%label.batch-table__toolbar__select.batch-checkbox-all
|
||||
= check_box_tag :batch_checkbox_all, nil, false
|
||||
.batch-table__toolbar__actions
|
||||
= f.button safe_join([fa_icon('eye-slash'), t('admin.statuses.batch.nsfw_on')]), name: :nsfw_on, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
= f.button safe_join([fa_icon('eye'), t('admin.statuses.batch.nsfw_off')]), name: :nsfw_off, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
= f.button safe_join([fa_icon('trash'), t('admin.statuses.batch.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
.batch-table__body
|
||||
= render partial: 'admin/reports/status', collection: @statuses, locals: { f: f }
|
||||
|
||||
= paginate @statuses
|
||||
27
app/views/admin/statuses/show.html.haml
Normal file
27
app/views/admin/statuses/show.html.haml
Normal file
@@ -0,0 +1,27 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.statuses.title')
|
||||
\-
|
||||
= "@#{@account.acct}"
|
||||
|
||||
.filters
|
||||
.back-link{ style: 'flex: 1 1 auto; text-align: right' }
|
||||
= link_to admin_account_path(@account.id) do
|
||||
%i.fa.fa-chevron-left.fa-fw
|
||||
= t('admin.statuses.back_to_account')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
= form_for(@form, url: admin_account_statuses_path(@account.id)) do |f|
|
||||
= hidden_field_tag :page, params[:page]
|
||||
= hidden_field_tag :media, params[:media]
|
||||
|
||||
.batch-table
|
||||
.batch-table__toolbar
|
||||
%label.batch-table__toolbar__select.batch-checkbox-all
|
||||
= check_box_tag :batch_checkbox_all, nil, false
|
||||
.batch-table__toolbar__actions
|
||||
= f.button safe_join([fa_icon('eye-slash'), t('admin.statuses.batch.nsfw_on')]), name: :nsfw_on, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
= f.button safe_join([fa_icon('eye'), t('admin.statuses.batch.nsfw_off')]), name: :nsfw_off, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
= f.button safe_join([fa_icon('trash'), t('admin.statuses.batch.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
|
||||
.batch-table__body
|
||||
= render partial: 'admin/reports/status', collection: @statuses, locals: { f: f }
|
||||
18
app/views/admin/subscriptions/_subscription.html.haml
Normal file
18
app/views/admin/subscriptions/_subscription.html.haml
Normal file
@@ -0,0 +1,18 @@
|
||||
%tr
|
||||
%td
|
||||
%samp= subscription.account.acct
|
||||
%td
|
||||
%samp= subscription.callback_url
|
||||
%td
|
||||
- if subscription.confirmed?
|
||||
%i.fa.fa-check
|
||||
%td{ style: "color: #{subscription.expired? ? 'red' : 'inherit'};" }
|
||||
%time.time-ago{ datetime: subscription.expires_at.iso8601, title: l(subscription.expires_at) }
|
||||
= precede subscription.expired? ? '-' : '' do
|
||||
= time_ago_in_words(subscription.expires_at)
|
||||
%td
|
||||
- if subscription.last_successful_delivery_at?
|
||||
%time.formatted{ datetime: subscription.last_successful_delivery_at.iso8601, title: l(subscription.last_successful_delivery_at) }
|
||||
= l subscription.last_successful_delivery_at
|
||||
- else
|
||||
%i.fa.fa-times
|
||||
16
app/views/admin/subscriptions/index.html.haml
Normal file
16
app/views/admin/subscriptions/index.html.haml
Normal file
@@ -0,0 +1,16 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.subscriptions.title')
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.subscriptions.topic')
|
||||
%th= t('admin.subscriptions.callback_url')
|
||||
%th= t('admin.subscriptions.confirmed')
|
||||
%th= t('admin.subscriptions.expires_in')
|
||||
%th= t('admin.subscriptions.last_delivery')
|
||||
%tbody
|
||||
= render @subscriptions
|
||||
|
||||
= paginate @subscriptions
|
||||
12
app/views/admin/tags/_tag.html.haml
Normal file
12
app/views/admin/tags/_tag.html.haml
Normal file
@@ -0,0 +1,12 @@
|
||||
%tr
|
||||
%td
|
||||
= link_to explore_hashtag_path(tag) do
|
||||
= fa_icon 'hashtag'
|
||||
= tag.name
|
||||
%td
|
||||
= t('directories.people', count: tag.accounts_count)
|
||||
%td
|
||||
- if tag.hidden?
|
||||
= table_link_to 'eye', t('admin.tags.unhide'), unhide_admin_tag_path(tag.id, **@filter_params), method: :post
|
||||
- else
|
||||
= table_link_to 'eye-slash', t('admin.tags.hide'), hide_admin_tag_path(tag.id, **@filter_params), method: :post
|
||||
19
app/views/admin/tags/index.html.haml
Normal file
19
app/views/admin/tags/index.html.haml
Normal file
@@ -0,0 +1,19 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.tags.title')
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
%strong= t('admin.reports.status')
|
||||
%ul
|
||||
%li= filter_link_to t('admin.tags.visible'), hidden: nil
|
||||
%li= filter_link_to t('admin.tags.hidden'), hidden: '1'
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('admin.tags.name')
|
||||
%th= t('admin.tags.accounts')
|
||||
%th
|
||||
%tbody
|
||||
= render @tags
|
||||
11
app/views/admin/warning_presets/edit.html.haml
Normal file
11
app/views/admin/warning_presets/edit.html.haml
Normal file
@@ -0,0 +1,11 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.warning_presets.edit_preset')
|
||||
|
||||
= simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |f|
|
||||
= render 'shared/error_messages', object: @warning_preset
|
||||
|
||||
.fields-group
|
||||
= f.input :text, wrapper: :with_block_label
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit
|
||||
30
app/views/admin/warning_presets/index.html.haml
Normal file
30
app/views/admin/warning_presets/index.html.haml
Normal file
@@ -0,0 +1,30 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.warning_presets.title')
|
||||
|
||||
- if can? :create, :account_warning_preset
|
||||
= simple_form_for @warning_preset, url: admin_warning_presets_path do |f|
|
||||
= render 'shared/error_messages', object: @warning_preset
|
||||
|
||||
.fields-group
|
||||
= f.input :text, wrapper: :with_block_label
|
||||
|
||||
.actions
|
||||
= f.button :button, t('admin.warning_presets.add_new'), type: :submit
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
- unless @warning_presets.empty?
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('simple_form.labels.account_warning_preset.text')
|
||||
%th
|
||||
%tbody
|
||||
- @warning_presets.each do |preset|
|
||||
%tr
|
||||
%td
|
||||
= Formatter.instance.linkify(preset.text)
|
||||
%td
|
||||
= table_link_to 'pencil', t('admin.warning_presets.edit'), edit_admin_warning_preset_path(preset)
|
||||
= table_link_to 'trash', t('admin.warning_presets.delete'), admin_warning_preset_path(preset), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
|
||||
12
app/views/admin_mailer/new_pending_account.text.erb
Normal file
12
app/views/admin_mailer/new_pending_account.text.erb
Normal file
@@ -0,0 +1,12 @@
|
||||
<%= raw t('application_mailer.salutation', name: display_name(@me)) %>
|
||||
|
||||
<%= raw t('admin_mailer.new_pending_account.body') %>
|
||||
|
||||
<%= @account.user_email %> (@<%= @account.username %>)
|
||||
<%= @account.user_current_sign_in_ip %>
|
||||
<% if @account.user&.invite_request&.text.present? %>
|
||||
|
||||
<%= quote_wrap(@account.user&.invite_request&.text) %>
|
||||
<% end %>
|
||||
|
||||
<%= raw t('application_mailer.view')%> <%= admin_pending_accounts_url %>
|
||||
5
app/views/admin_mailer/new_report.text.erb
Normal file
5
app/views/admin_mailer/new_report.text.erb
Normal file
@@ -0,0 +1,5 @@
|
||||
<%= raw t('application_mailer.salutation', name: display_name(@me)) %>
|
||||
|
||||
<%= raw(@report.account.local? ? t('admin_mailer.new_report.body', target: @report.target_account.acct, reporter: @report.account.acct) : t('admin_mailer.new_report.body_remote', target: @report.target_account.acct, domain: @report.account.domain)) %>
|
||||
|
||||
<%= raw t('application_mailer.view')%> <%= admin_report_url(@report) %>
|
||||
17
app/views/application/_card.html.haml
Normal file
17
app/views/application/_card.html.haml
Normal file
@@ -0,0 +1,17 @@
|
||||
- account_url = local_assigns[:admin] ? admin_account_path(account.id) : TagManager.instance.url_for(account)
|
||||
|
||||
.card.h-card
|
||||
= link_to account_url, target: '_blank', rel: 'noopener' do
|
||||
.card__img
|
||||
= image_tag account.header.url, alt: ''
|
||||
.card__bar
|
||||
.avatar
|
||||
= image_tag account.avatar.url, alt: '', width: 48, height: 48, class: 'u-photo'
|
||||
|
||||
.display-name
|
||||
%span{id: "default_account_display_name", style: "display:none;"}= account.username
|
||||
%bdi
|
||||
%strong.emojify.p-name= display_name(account, custom_emojify: true)
|
||||
%span
|
||||
= acct(account)
|
||||
= fa_icon('lock') if account.locked?
|
||||
3
app/views/application/_flashes.html.haml
Normal file
3
app/views/application/_flashes.html.haml
Normal file
@@ -0,0 +1,3 @@
|
||||
- user_facing_flashes.each do |key, value|
|
||||
.flash-message{ class: key }
|
||||
%strong= value
|
||||
6
app/views/application/_sidebar.html.haml
Normal file
6
app/views/application/_sidebar.html.haml
Normal file
@@ -0,0 +1,6 @@
|
||||
.hero-widget
|
||||
.hero-widget__img
|
||||
= image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title
|
||||
|
||||
.hero-widget__text
|
||||
%p= @instance_presenter.site_short_description.html_safe.presence || @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname)
|
||||
15
app/views/auth/confirmations/finish_signup.html.haml
Normal file
15
app/views/auth/confirmations/finish_signup.html.haml
Normal file
@@ -0,0 +1,15 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.confirm_email')
|
||||
|
||||
= simple_form_for(current_user, as: 'user', url: finish_signup_path, html: { role: 'form'}) do |f|
|
||||
- if @show_errors && current_user.errors.any?
|
||||
#error_explanation
|
||||
- current_user.errors.full_messages.each do |msg|
|
||||
= msg
|
||||
%br
|
||||
|
||||
.fields-group
|
||||
= f.input :email, wrapper: :with_label, required: true, hint: false
|
||||
|
||||
.actions
|
||||
= f.submit t('auth.confirm_email'), class: 'button'
|
||||
13
app/views/auth/confirmations/new.html.haml
Normal file
13
app/views/auth/confirmations/new.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.resend_confirmation')
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f|
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
.fields-group
|
||||
= f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false
|
||||
|
||||
.actions
|
||||
= f.button :button, t('auth.resend_confirmation'), type: :submit
|
||||
|
||||
.form-footer= render 'auth/shared/links'
|
||||
20
app/views/auth/passwords/edit.html.haml
Normal file
20
app/views/auth/passwords/edit.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.set_new_password')
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
- if !use_seamless_external_login? || resource.encrypted_password.present?
|
||||
= f.input :reset_password_token, as: :hidden
|
||||
|
||||
.fields-group
|
||||
= f.input :password, wrapper: :with_label, autofocus: true, label: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'off' }, required: true
|
||||
.fields-group
|
||||
= f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'off' }, required: true
|
||||
|
||||
.actions
|
||||
= f.button :button, t('auth.set_new_password'), type: :submit
|
||||
- else
|
||||
%p.hint= t('users.seamless_external_login')
|
||||
|
||||
.form-footer= render 'auth/shared/links'
|
||||
13
app/views/auth/passwords/new.html.haml
Normal file
13
app/views/auth/passwords/new.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.reset_password')
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f|
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
.fields-group
|
||||
= f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false
|
||||
|
||||
.actions
|
||||
= f.button :button, t('auth.reset_password'), type: :submit
|
||||
|
||||
.form-footer= render 'auth/shared/links'
|
||||
26
app/views/auth/registrations/_sessions.html.haml
Normal file
26
app/views/auth/registrations/_sessions.html.haml
Normal file
@@ -0,0 +1,26 @@
|
||||
%h4= t 'sessions.title'
|
||||
%p.muted-hint= t 'sessions.explanation'
|
||||
|
||||
.table-wrapper
|
||||
%table.table.inline-table
|
||||
%thead
|
||||
%tr
|
||||
%th= t 'sessions.browser'
|
||||
%th= t 'sessions.activity'
|
||||
%th
|
||||
%tbody
|
||||
- @sessions.each do |session|
|
||||
%tr
|
||||
%td
|
||||
%span{ title: session.user_agent }<
|
||||
= fa_icon "#{session_device_icon(session)} fw", 'aria-label' => session_device_icon(session)
|
||||
= ' '
|
||||
= t 'sessions.description', browser: t("sessions.browsers.#{session.browser}", default: "#{session.browser}"), platform: t("sessions.platforms.#{session.platform}", default: "#{session.platform}")
|
||||
%td
|
||||
- if current_session.session_id == session.session_id
|
||||
= t 'sessions.current_session'
|
||||
- else
|
||||
%time.time-ago{ datetime: session.updated_at.iso8601, title: l(session.updated_at) }= l(session.updated_at)
|
||||
%td
|
||||
- if current_session.session_id != session.session_id
|
||||
= table_link_to 'times', t('sessions.revoke'), settings_session_path(session), method: :delete
|
||||
33
app/views/auth/registrations/edit.html.haml
Normal file
33
app/views/auth/registrations/edit.html.haml
Normal file
@@ -0,0 +1,33 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.security')
|
||||
|
||||
= 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
|
||||
|
||||
- if !use_seamless_external_login? || resource.encrypted_password.present?
|
||||
.fields-group
|
||||
= f.input :email, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, required: true, hint: false
|
||||
|
||||
.fields-group
|
||||
= f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, required: true
|
||||
|
||||
.fields-group
|
||||
= f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'off' }, hint: false
|
||||
|
||||
.fields-group
|
||||
= f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'off' }
|
||||
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit
|
||||
- else
|
||||
%p.hint= t('users.seamless_external_login')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
= render 'sessions'
|
||||
|
||||
- if open_deletion?
|
||||
%hr.spacer/
|
||||
%h4= t('auth.delete_account')
|
||||
%p.muted-hint= t('auth.delete_account_html', path: settings_delete_path)
|
||||
41
app/views/auth/registrations/new.html.haml
Normal file
41
app/views/auth/registrations/new.html.haml
Normal file
@@ -0,0 +1,41 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.register')
|
||||
|
||||
- content_for :header_tags do
|
||||
= render partial: 'shared/og'
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
- if @invite.present? && @invite.autofollow?
|
||||
.fields-group{ style: 'margin-bottom: 30px' }
|
||||
%p.hint{ style: 'text-align: center' }= t('invites.invited_by')
|
||||
= render 'application/card', account: @invite.user.account
|
||||
|
||||
= f.simple_fields_for :account do |ff|
|
||||
.fields-group
|
||||
= ff.input :username, wrapper: :with_label, autofocus: true, label: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off' }, hint: t('simple_form.hints.defaults.username', domain: site_hostname)
|
||||
|
||||
.fields-group
|
||||
= f.input :email, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }
|
||||
|
||||
.fields-group
|
||||
= f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }
|
||||
|
||||
.fields-group
|
||||
= f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }
|
||||
|
||||
- if approved_registrations? && !@invite.present?
|
||||
.fields-group
|
||||
= f.simple_fields_for :invite_request do |invite_request_fields|
|
||||
= invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false
|
||||
|
||||
= f.input :invite_code, as: :hidden
|
||||
|
||||
.fields-group
|
||||
= f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: about_privacy_path, about_tos_path: about_tos_path)
|
||||
|
||||
.actions
|
||||
= f.button :button, @invite.present? ? t('auth.register') : sign_up_message, type: :submit
|
||||
|
||||
.form-footer= render 'auth/shared/links'
|
||||
28
app/views/auth/sessions/new.html.haml
Normal file
28
app/views/auth/sessions/new.html.haml
Normal file
@@ -0,0 +1,28 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.login')
|
||||
|
||||
- content_for :header_tags do
|
||||
= render partial: 'shared/og'
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
|
||||
.fields-group
|
||||
- if use_seamless_external_login?
|
||||
= f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.username_or_email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.username_or_email') }, hint: false
|
||||
- else
|
||||
= f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false
|
||||
.fields-group
|
||||
= f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }, hint: false
|
||||
|
||||
.actions
|
||||
= f.button :button, t('auth.login'), type: :submit
|
||||
|
||||
- if devise_mapping.omniauthable? and resource_class.omniauth_providers.any?
|
||||
.simple_form.alternative-login
|
||||
%h4= t('auth.or_log_in_with')
|
||||
|
||||
.actions
|
||||
- resource_class.omniauth_providers.each do |provider|
|
||||
= link_to omniauth_authorize_path(resource_name, provider), class: "button button-#{provider}" do
|
||||
= t("auth.providers.#{provider}", default: provider.to_s.chomp("_oauth2").capitalize)
|
||||
|
||||
.form-footer= render 'auth/shared/links'
|
||||
14
app/views/auth/sessions/two_factor.html.haml
Normal file
14
app/views/auth/sessions/two_factor.html.haml
Normal file
@@ -0,0 +1,14 @@
|
||||
- content_for :page_title do
|
||||
= t('auth.login')
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: session_path(resource_name), method: :post) do |f|
|
||||
%p.hint{ style: 'margin-bottom: 25px' }= t('simple_form.hints.sessions.otp')
|
||||
|
||||
.fields-group
|
||||
= f.input :otp_attempt, type: :number, wrapper: :with_label, label: t('simple_form.labels.defaults.otp_attempt'), input_html: { 'aria-label' => t('simple_form.labels.defaults.otp_attempt'), :autocomplete => 'off' }, autofocus: true
|
||||
|
||||
.actions
|
||||
= f.button :button, t('auth.login'), type: :submit
|
||||
|
||||
- if Setting.site_contact_email.present?
|
||||
%p.hint.subtle-hint= t('users.otp_lost_help_html', email: mail_to(Setting.site_contact_email, nil))
|
||||
12
app/views/auth/shared/_links.html.haml
Normal file
12
app/views/auth/shared/_links.html.haml
Normal file
@@ -0,0 +1,12 @@
|
||||
%ul.no-list
|
||||
- if controller_name != 'sessions'
|
||||
%li= link_to t('auth.login'), new_session_path(resource_name)
|
||||
|
||||
- if devise_mapping.registerable? && controller_name != 'registrations'
|
||||
%li= link_to t('auth.register'), available_sign_up_path
|
||||
|
||||
- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations'
|
||||
%li= link_to t('auth.forgot_password'), new_password_path(resource_name)
|
||||
|
||||
- if devise_mapping.confirmable? && controller_name != 'confirmations'
|
||||
%li= link_to t('auth.didnt_get_confirmation'), new_confirmation_path(resource_name)
|
||||
@@ -0,0 +1,4 @@
|
||||
.post-follow-actions
|
||||
%div= link_to t('authorize_follow.post_follow.web'), web_url("accounts/#{@resource.id}"), class: 'button button--block'
|
||||
%div= link_to t('authorize_follow.post_follow.return'), TagManager.instance.url_for(@resource), class: 'button button--block'
|
||||
%div= t('authorize_follow.post_follow.close')
|
||||
3
app/views/authorize_interactions/error.html.haml
Normal file
3
app/views/authorize_interactions/error.html.haml
Normal file
@@ -0,0 +1,3 @@
|
||||
.form-container
|
||||
.flash-message#error_explanation
|
||||
= t('authorize_follow.error')
|
||||
18
app/views/authorize_interactions/show.html.haml
Normal file
18
app/views/authorize_interactions/show.html.haml
Normal file
@@ -0,0 +1,18 @@
|
||||
- content_for :page_title do
|
||||
= t('authorize_follow.title', acct: @resource.acct)
|
||||
|
||||
.form-container
|
||||
.follow-prompt
|
||||
= render 'application/card', account: @resource
|
||||
|
||||
- if current_account.following?(@resource)
|
||||
.flash-message
|
||||
%strong
|
||||
= t('authorize_follow.already_following')
|
||||
|
||||
= render 'post_follow_actions'
|
||||
- else
|
||||
= form_tag authorize_interaction_path, method: :post, class: 'simple_form' do
|
||||
= hidden_field_tag :action, :follow
|
||||
= hidden_field_tag :acct, @resource.acct
|
||||
= button_tag t('authorize_follow.follow'), type: :submit
|
||||
13
app/views/authorize_interactions/success.html.haml
Normal file
13
app/views/authorize_interactions/success.html.haml
Normal file
@@ -0,0 +1,13 @@
|
||||
- content_for :page_title do
|
||||
= t('authorize_follow.title', acct: @resource.acct)
|
||||
|
||||
.form-container
|
||||
.follow-prompt
|
||||
- if @resource.locked?
|
||||
%h2= t('authorize_follow.follow_request')
|
||||
- else
|
||||
%h2= t('authorize_follow.following')
|
||||
|
||||
= render 'application/card', account: @resource
|
||||
|
||||
= render 'post_follow_actions'
|
||||
71
app/views/directories/index.html.haml
Normal file
71
app/views/directories/index.html.haml
Normal file
@@ -0,0 +1,71 @@
|
||||
- content_for :page_title do
|
||||
= t('directories.explore_gabsocial', title: site_title)
|
||||
|
||||
- content_for :header_tags do
|
||||
%meta{ name: 'description', content: t('directories.explanation') }
|
||||
|
||||
= opengraph 'og:site_name', t('about.hosted_on', domain: site_hostname)
|
||||
= opengraph 'og:type', 'website'
|
||||
= opengraph 'og:title', t('directories.explore_gabsocial', title: site_title)
|
||||
= opengraph 'og:description', t('directories.explanation')
|
||||
= opengraph 'og:image', File.join(root_url, 'android-chrome-192x192.png')
|
||||
|
||||
.page-header
|
||||
%h1= t('directories.explore_gabsocial', title: site_title)
|
||||
%p= t('directories.explanation')
|
||||
|
||||
.grid
|
||||
.column-0
|
||||
- if @accounts.empty?
|
||||
= nothing_here
|
||||
- else
|
||||
.directory
|
||||
%table.accounts-table
|
||||
%tbody
|
||||
- @accounts.each do |account|
|
||||
%tr
|
||||
%td= account_link_to account
|
||||
%td.accounts-table__count.optional
|
||||
= number_to_human account.statuses_count, strip_insignificant_zeros: true
|
||||
%small= t('accounts.posts', count: account.statuses_count).downcase
|
||||
%td.accounts-table__count.optional
|
||||
= number_to_human account.followers_count, strip_insignificant_zeros: true
|
||||
%small= t('accounts.followers', count: account.followers_count).downcase
|
||||
%td.accounts-table__count
|
||||
- if account.last_status_at.present?
|
||||
%time.time-ago{ datetime: account.last_status_at.iso8601, title: l(account.last_status_at) }= l account.last_status_at
|
||||
- else
|
||||
\-
|
||||
%small= t('accounts.last_active')
|
||||
|
||||
= paginate @accounts
|
||||
|
||||
.column-1
|
||||
- if user_signed_in?
|
||||
.box-widget.notice-widget
|
||||
- if current_account.discoverable?
|
||||
- if current_account.followers_count < Account::MIN_FOLLOWERS_DISCOVERY
|
||||
%p= t('directories.enabled_but_waiting', min_followers: Account::MIN_FOLLOWERS_DISCOVERY)
|
||||
- else
|
||||
%p= t('directories.enabled')
|
||||
- else
|
||||
%p= t('directories.how_to_enable')
|
||||
|
||||
= link_to settings_profile_path do
|
||||
= t('settings.edit_profile')
|
||||
= fa_icon 'chevron-right fw'
|
||||
|
||||
- if @tags.empty? && !user_signed_in?
|
||||
.nothing-here
|
||||
- else
|
||||
- @tags.each do |tag|
|
||||
.directory__tag{ class: tag.id == @tag&.id ? 'active' : nil }
|
||||
= link_to explore_hashtag_path(tag) do
|
||||
%h4
|
||||
= fa_icon 'hashtag'
|
||||
= tag.name
|
||||
%small= t('directories.people', count: tag.accounts_count)
|
||||
|
||||
.avatar-stack
|
||||
- tag.cached_sample_accounts.each do |account|
|
||||
= image_tag current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url, width: 48, height: 48, alt: '', class: 'account__avatar'
|
||||
5
app/views/errors/403.html.haml
Normal file
5
app/views/errors/403.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('errors.403')
|
||||
|
||||
- content_for :content do
|
||||
= t('errors.403')
|
||||
5
app/views/errors/404.html.haml
Normal file
5
app/views/errors/404.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('errors.404')
|
||||
|
||||
- content_for :content do
|
||||
= t('errors.404')
|
||||
5
app/views/errors/410.html.haml
Normal file
5
app/views/errors/410.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('errors.410')
|
||||
|
||||
- content_for :content do
|
||||
= t('errors.410')
|
||||
5
app/views/errors/422.html.haml
Normal file
5
app/views/errors/422.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('errors.422.title')
|
||||
|
||||
- content_for :content do
|
||||
= t('errors.422.content')
|
||||
5
app/views/errors/500.html.haml
Normal file
5
app/views/errors/500.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('errors.500.title')
|
||||
|
||||
- content_for :content do
|
||||
= t('errors.500.content')
|
||||
16
app/views/filters/_fields.html.haml
Normal file
16
app/views/filters/_fields.html.haml
Normal file
@@ -0,0 +1,16 @@
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :phrase, as: :string, wrapper: :with_label, hint: false
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt')
|
||||
|
||||
.fields-group
|
||||
= f.input :context, wrapper: :with_block_label, collection: CustomFilter::VALID_CONTEXTS, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', label_method: lambda { |context| I18n.t("filters.contexts.#{context}") }, include_blank: false
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.fields-group
|
||||
= f.input :irreversible, wrapper: :with_label
|
||||
|
||||
.fields-group
|
||||
= f.input :whole_word, wrapper: :with_label
|
||||
8
app/views/filters/edit.html.haml
Normal file
8
app/views/filters/edit.html.haml
Normal file
@@ -0,0 +1,8 @@
|
||||
- content_for :page_title do
|
||||
= t('filters.edit.title')
|
||||
|
||||
= simple_form_for @filter, url: filter_path(@filter), method: :put do |f|
|
||||
= render 'fields', f: f
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit
|
||||
20
app/views/filters/index.html.haml
Normal file
20
app/views/filters/index.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :page_title do
|
||||
= t('filters.index.title')
|
||||
|
||||
.table-wrapper
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= t('simple_form.labels.defaults.phrase')
|
||||
%th= t('simple_form.labels.defaults.context')
|
||||
%th
|
||||
%tbody
|
||||
- @filters.each do |filter|
|
||||
%tr
|
||||
%td= filter.phrase
|
||||
%td= filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ')
|
||||
%td
|
||||
= table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter)
|
||||
= table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete
|
||||
|
||||
= link_to t('filters.new.title'), new_filter_path, class: 'button'
|
||||
8
app/views/filters/new.html.haml
Normal file
8
app/views/filters/new.html.haml
Normal file
@@ -0,0 +1,8 @@
|
||||
- content_for :page_title do
|
||||
= t('filters.new.title')
|
||||
|
||||
= simple_form_for @filter, url: filters_path do |f|
|
||||
= render 'fields', f: f
|
||||
|
||||
.actions
|
||||
= f.button :button, t('filters.new.title'), type: :submit
|
||||
20
app/views/follower_accounts/index.html.haml
Normal file
20
app/views/follower_accounts/index.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :page_title do
|
||||
= t('accounts.people_who_follow', name: display_name(@account))
|
||||
|
||||
- content_for :header_tags do
|
||||
%meta{ name: 'robots', content: 'noindex' }/
|
||||
= render 'accounts/og', account: @account, url: account_followers_url(@account, only_path: false)
|
||||
|
||||
= render 'accounts/header', account: @account
|
||||
|
||||
- if @account.user_hides_network?
|
||||
.nothing-here= t('accounts.network_hidden')
|
||||
- elsif user_signed_in? && @account.blocking?(current_account)
|
||||
.nothing-here= t('accounts.unavailable')
|
||||
- elsif @follows.empty?
|
||||
= nothing_here
|
||||
- else
|
||||
.card-grid
|
||||
= render partial: 'application/card', collection: @follows.map(&:account), as: :account
|
||||
|
||||
= paginate @follows
|
||||
20
app/views/following_accounts/index.html.haml
Normal file
20
app/views/following_accounts/index.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :page_title do
|
||||
= t('accounts.people_followed_by', name: display_name(@account))
|
||||
|
||||
- content_for :header_tags do
|
||||
%meta{ name: 'robots', content: 'noindex' }/
|
||||
= render 'accounts/og', account: @account, url: account_followers_url(@account, only_path: false)
|
||||
|
||||
= render 'accounts/header', account: @account
|
||||
|
||||
- if @account.user_hides_network?
|
||||
.nothing-here= t('accounts.network_hidden')
|
||||
- elsif user_signed_in? && @account.blocking?(current_account)
|
||||
.nothing-here= t('accounts.unavailable')
|
||||
- elsif @follows.empty?
|
||||
= nothing_here
|
||||
- else
|
||||
.card-grid
|
||||
= render partial: 'application/card', collection: @follows.map(&:target_account), as: :account
|
||||
|
||||
= paginate @follows
|
||||
17
app/views/home/index.html.haml
Normal file
17
app/views/home/index.html.haml
Normal file
@@ -0,0 +1,17 @@
|
||||
- content_for :header_tags do
|
||||
= preload_link_tag asset_pack_path('features/getting_started.js'), crossorigin: 'anonymous'
|
||||
= preload_link_tag asset_pack_path('features/compose.js'), crossorigin: 'anonymous'
|
||||
= preload_link_tag asset_pack_path('features/home_timeline.js'), crossorigin: 'anonymous'
|
||||
= preload_link_tag asset_pack_path('features/notifications.js'), crossorigin: 'anonymous'
|
||||
|
||||
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
|
||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
||||
|
||||
= javascript_pack_tag 'application', integrity: true, crossorigin: 'anonymous'
|
||||
|
||||
.app-holder#gabsocial{ data: { props: Oj.dump(default_props) } }
|
||||
%noscript
|
||||
= image_pack_tag 'logo.png', alt: 'Gab Social'
|
||||
|
||||
%div
|
||||
= t('errors.noscript_html', apps_path: 'https://gab.com/apps')
|
||||
14
app/views/invites/_form.html.haml
Normal file
14
app/views/invites/_form.html.haml
Normal file
@@ -0,0 +1,14 @@
|
||||
= simple_form_for(@invite, url: controller.is_a?(Admin::InvitesController) ? admin_invites_path : invites_path) do |f|
|
||||
= render 'shared/error_messages', object: @invite
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :max_uses, wrapper: :with_label, collection: [1, 5, 10, 25, 50, 100], label_method: lambda { |num| I18n.t('invites.max_uses', count: num) }, prompt: I18n.t('invites.max_uses_prompt')
|
||||
.fields-row__column.fields-row__column-6.fields-group
|
||||
= f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt')
|
||||
|
||||
.fields-group
|
||||
= f.input :autofollow, wrapper: :with_label
|
||||
|
||||
.actions
|
||||
= f.button :button, t('invites.generate'), type: :submit
|
||||
25
app/views/invites/_invite.html.haml
Normal file
25
app/views/invites/_invite.html.haml
Normal file
@@ -0,0 +1,25 @@
|
||||
%tr
|
||||
%td
|
||||
.input-copy
|
||||
.input-copy__wrapper
|
||||
%input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: public_invite_url(invite_code: invite.code) }
|
||||
%button{ type: :button }= t('generic.copy')
|
||||
|
||||
- if invite.valid_for_use?
|
||||
%td
|
||||
= fa_icon 'user fw'
|
||||
= invite.uses
|
||||
= " / #{invite.max_uses}" unless invite.max_uses.nil?
|
||||
%td
|
||||
- if invite.expires_at.nil?
|
||||
∞
|
||||
- else
|
||||
%time.formatted{ datetime: invite.expires_at.iso8601, title: l(invite.expires_at) }
|
||||
= l invite.expires_at
|
||||
- else
|
||||
%td{ colspan: 2 }
|
||||
= t('invites.expired')
|
||||
|
||||
%td
|
||||
- if invite.valid_for_use? && policy(invite).destroy?
|
||||
= table_link_to 'times', t('invites.delete'), invite_path(invite), method: :delete
|
||||
20
app/views/invites/index.html.haml
Normal file
20
app/views/invites/index.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :page_title do
|
||||
= t('invites.title')
|
||||
|
||||
- if policy(:invite).create?
|
||||
%p= t('invites.prompt')
|
||||
|
||||
= render 'form'
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.simple_form
|
||||
%table.table.table--invites
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
%th= t('invites.table.uses')
|
||||
%th= t('invites.table.expires_at')
|
||||
%th
|
||||
%tbody
|
||||
= render @invites
|
||||
9
app/views/kaminari/_next_page.html.haml
Normal file
9
app/views/kaminari/_next_page.html.haml
Normal file
@@ -0,0 +1,9 @@
|
||||
-# Link to the "Next" page
|
||||
-# available local variables
|
||||
-# url: url to the next page
|
||||
-# current_page: a page object for the currently displayed page
|
||||
-# total_pages: total number of pages
|
||||
-# per_page: number of items to fetch per page
|
||||
-# remote: data-remote
|
||||
%span.next
|
||||
= link_to_unless current_page.last?, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), url, rel: 'next', remote: remote
|
||||
16
app/views/kaminari/_paginator.html.haml
Normal file
16
app/views/kaminari/_paginator.html.haml
Normal file
@@ -0,0 +1,16 @@
|
||||
-# The container tag
|
||||
-# available local variables
|
||||
-# current_page: a page object for the currently displayed page
|
||||
-# total_pages: total number of pages
|
||||
-# per_page: number of items to fetch per page
|
||||
-# remote: data-remote
|
||||
-# paginator: the paginator that renders the pagination tags inside
|
||||
= paginator.render do
|
||||
%nav.pagination
|
||||
= prev_page_tag unless current_page.first?
|
||||
- each_page do |page|
|
||||
- if page.display_tag?
|
||||
= page_tag page
|
||||
- elsif !page.was_truncated?
|
||||
= gap_tag
|
||||
= next_page_tag unless current_page.last?
|
||||
9
app/views/kaminari/_prev_page.html.haml
Normal file
9
app/views/kaminari/_prev_page.html.haml
Normal file
@@ -0,0 +1,9 @@
|
||||
-# Link to the "Previous" page
|
||||
-# available local variables
|
||||
-# url: url to the previous page
|
||||
-# current_page: a page object for the currently displayed page
|
||||
-# total_pages: total number of pages
|
||||
-# per_page: number of items to fetch per page
|
||||
-# remote: data-remote
|
||||
%span.prev
|
||||
= link_to_unless current_page.first?, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote
|
||||
20
app/views/layouts/admin.html.haml
Normal file
20
app/views/layouts/admin.html.haml
Normal file
@@ -0,0 +1,20 @@
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
||||
|
||||
- content_for :content do
|
||||
.admin-wrapper
|
||||
.sidebar-wrapper
|
||||
.sidebar
|
||||
= link_to root_path do
|
||||
= image_pack_tag 'logo.png', class: 'logo', alt: 'Gab Social'
|
||||
|
||||
= render_navigation
|
||||
.content-wrapper
|
||||
.content
|
||||
%h2= yield :page_title
|
||||
|
||||
= render 'application/flashes'
|
||||
|
||||
= yield
|
||||
|
||||
= render template: 'layouts/application'
|
||||
38
app/views/layouts/application.html.haml
Executable file
38
app/views/layouts/application.html.haml
Executable file
@@ -0,0 +1,38 @@
|
||||
!!! 5
|
||||
%html{ lang: I18n.locale }
|
||||
%head
|
||||
%meta{ charset: 'utf-8' }/
|
||||
%meta{ name: 'viewport', content: 'width=device-width, initial-scale=1' }/
|
||||
|
||||
- if cdn_host?
|
||||
%link{ rel: 'dns-prefetch', href: cdn_host }/
|
||||
|
||||
- if storage_host?
|
||||
%link{ rel: 'dns-prefetch', href: storage_host }/
|
||||
|
||||
%link{ rel: 'icon', href: favicon_path, type: 'image/x-icon' }/
|
||||
%link{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' }/
|
||||
%link{ rel: 'mask-icon', href: '/mask-icon.svg', color: '#2B90D9' }/
|
||||
%link{ rel: 'manifest', href: '/manifest.json' }/
|
||||
%meta{ name: 'msapplication-config', content: '/browserconfig.xml' }/
|
||||
%meta{ name: 'theme-color', content: '#282c37' }/
|
||||
%meta{ name: 'apple-mobile-web-app-capable', content: 'yes' }/
|
||||
|
||||
%title= content_for?(:page_title) ? safe_join([yield(:page_title).chomp.html_safe, title], ' - ') : title
|
||||
|
||||
= stylesheet_pack_tag 'common', media: 'all'
|
||||
= stylesheet_pack_tag current_theme, media: 'all'
|
||||
= javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
|
||||
= javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
|
||||
= csrf_meta_tags
|
||||
|
||||
- if Setting.custom_css.present?
|
||||
= stylesheet_link_tag custom_css_path, media: 'all'
|
||||
|
||||
= yield :header_tags
|
||||
|
||||
%body{ class: body_classes }
|
||||
= content_for?(:content) ? yield(:content) : yield
|
||||
|
||||
%div{ style: 'display: none'}
|
||||
= render file: Rails.root.join('app', 'javascript', 'images', 'logo_transparent.svg')
|
||||
16
app/views/layouts/auth.html.haml
Normal file
16
app/views/layouts/auth.html.haml
Normal file
@@ -0,0 +1,16 @@
|
||||
- content_for :header_tags do
|
||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
||||
|
||||
- content_for :content do
|
||||
.container-alt
|
||||
.logo-container
|
||||
%h1
|
||||
= link_to root_path do
|
||||
= image_pack_tag 'logo_full.png', alt: 'Gab Social'
|
||||
|
||||
.form-container
|
||||
= render 'flashes'
|
||||
|
||||
= yield
|
||||
|
||||
= render template: 'layouts/application'
|
||||
19
app/views/layouts/embedded.html.haml
Normal file
19
app/views/layouts/embedded.html.haml
Normal file
@@ -0,0 +1,19 @@
|
||||
!!! 5
|
||||
%html{ lang: I18n.locale }
|
||||
%head
|
||||
%meta{ charset: 'utf-8' }/
|
||||
%meta{ name: 'robots', content: 'noindex' }/
|
||||
|
||||
- if cdn_host?
|
||||
%link{ rel: 'dns-prefetch', href: cdn_host }/
|
||||
|
||||
- if storage_host?
|
||||
%link{ rel: 'dns-prefetch', href: storage_host }/
|
||||
|
||||
= stylesheet_pack_tag 'common', media: 'all'
|
||||
= stylesheet_pack_tag Setting.default_settings['theme'], media: 'all'
|
||||
= javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
|
||||
= javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
|
||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
||||
%body.embed
|
||||
= yield
|
||||
15
app/views/layouts/error.html.haml
Normal file
15
app/views/layouts/error.html.haml
Normal file
@@ -0,0 +1,15 @@
|
||||
!!!
|
||||
%html{ lang: I18n.locale }
|
||||
%head
|
||||
%meta{ content: 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type' }/
|
||||
%meta{ charset: 'utf-8' }/
|
||||
%title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ')
|
||||
%meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/
|
||||
= stylesheet_pack_tag 'common', media: 'all'
|
||||
= stylesheet_pack_tag Setting.default_settings['theme'], media: 'all'
|
||||
= javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
|
||||
= javascript_pack_tag 'error', integrity: true, crossorigin: 'anonymous'
|
||||
%body.error
|
||||
.dialog
|
||||
.dialog__message
|
||||
%h1= yield :content
|
||||
52
app/views/layouts/mailer.html.haml
Normal file
52
app/views/layouts/mailer.html.haml
Normal file
@@ -0,0 +1,52 @@
|
||||
!!!
|
||||
%html{ lang: I18n.locale }
|
||||
%head
|
||||
%meta{ 'http-equiv' => 'Content-Type', 'content' => 'text/html; charset=utf-8' }/
|
||||
%meta{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, shrink-to-fit=no' }
|
||||
|
||||
%title/
|
||||
|
||||
= stylesheet_pack_tag 'mailer'
|
||||
%body{ dir: locale_direction }
|
||||
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
||||
%tbody
|
||||
%tr
|
||||
%td.email-body.email-start
|
||||
.email-container
|
||||
%table.content-section{ cellspacing: 0, cellpadding: 0 }
|
||||
%tbody
|
||||
%tr
|
||||
%td.content-cell.header
|
||||
.email-row
|
||||
.col-6
|
||||
%table.column{ cellspacing: 0, cellpadding: 0 }
|
||||
%tbody
|
||||
%tr
|
||||
%td.column-cell
|
||||
= link_to root_url do
|
||||
= image_tag full_pack_url('media/images/mailer/logo_full.png'), alt: 'Gab Social', height: 34, class: 'logo'
|
||||
|
||||
= yield
|
||||
|
||||
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
||||
%tbody
|
||||
%tr
|
||||
%td.email-body.email-end
|
||||
.email-container
|
||||
%table.content-section{ cellspacing: 0, cellpadding: 0 }
|
||||
%tbody
|
||||
%tr
|
||||
%td.content-cell.content-end
|
||||
!= " "
|
||||
%tr
|
||||
%td.blank-cell.footer
|
||||
.email-row
|
||||
.col-6
|
||||
%table.column{ cellspacing: 0, cellpadding: 0 }
|
||||
%tbody
|
||||
%td.column-cell
|
||||
%p= t 'about.hosted_on', domain: site_hostname
|
||||
%p= link_to t('application_mailer.notification_preferences'), settings_notifications_url
|
||||
%td.column-cell.text-right
|
||||
= link_to root_url do
|
||||
= image_tag full_pack_url('media/images/mailer/logo_transparent.png'), alt: 'Gab Social', height: 24
|
||||
5
app/views/layouts/mailer.text.erb
Normal file
5
app/views/layouts/mailer.text.erb
Normal file
@@ -0,0 +1,5 @@
|
||||
<%= yield %>
|
||||
---
|
||||
|
||||
<%= t 'about.hosted_on', domain: site_hostname %>
|
||||
<%= t('application_mailer.settings', link: settings_preferences_url) %>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user