diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/about_controller.rb | 1 | ||||
-rw-r--r-- | app/controllers/admin/rules_controller.rb | 59 | ||||
-rw-r--r-- | app/controllers/api/v1/instances/rules_controller.rb | 17 | ||||
-rw-r--r-- | app/javascript/styles/mastodon/about.scss | 21 | ||||
-rw-r--r-- | app/models/rule.rb | 22 | ||||
-rw-r--r-- | app/policies/rule_policy.rb | 19 | ||||
-rw-r--r-- | app/presenters/instance_presenter.rb | 4 | ||||
-rw-r--r-- | app/serializers/rest/instance_serializer.rb | 4 | ||||
-rw-r--r-- | app/serializers/rest/rule_serializer.rb | 9 | ||||
-rw-r--r-- | app/views/about/more.html.haml | 13 | ||||
-rw-r--r-- | app/views/admin/rules/_rule.html.haml | 11 | ||||
-rw-r--r-- | app/views/admin/rules/edit.html.haml | 11 | ||||
-rw-r--r-- | app/views/admin/rules/index.html.haml | 24 |
13 files changed, 214 insertions, 1 deletions
diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index dcad5d3b4..d7e78d6b9 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -20,6 +20,7 @@ class AboutController < ApplicationController toc_generator = TOCGenerator.new(@instance_presenter.site_extended_description) + @rules = Rule.ordered @contents = toc_generator.html @table_of_contents = toc_generator.toc @blocks = DomainBlock.with_user_facing_limitations.by_severity if display_blocks? diff --git a/app/controllers/admin/rules_controller.rb b/app/controllers/admin/rules_controller.rb new file mode 100644 index 000000000..f3bed3ad8 --- /dev/null +++ b/app/controllers/admin/rules_controller.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Admin + class RulesController < BaseController + before_action :set_rule, except: [:index, :create] + + def index + authorize :rule, :index? + + @rules = Rule.ordered + @rule = Rule.new + end + + def create + authorize :rule, :create? + + @rule = Rule.new(resource_params) + + if @rule.save + redirect_to admin_rules_path + else + @rules = Rule.ordered + render :index + end + end + + def edit + authorize @rule, :update? + end + + def update + authorize @rule, :update? + + if @rule.update(resource_params) + redirect_to admin_rules_path + else + render :edit + end + end + + def destroy + authorize @rule, :destroy? + + @rule.discard + + redirect_to admin_rules_path + end + + private + + def set_rule + @rule = Rule.find(params[:id]) + end + + def resource_params + params.require(:rule).permit(:text, :priority) + end + end +end diff --git a/app/controllers/api/v1/instances/rules_controller.rb b/app/controllers/api/v1/instances/rules_controller.rb new file mode 100644 index 000000000..93cf3c759 --- /dev/null +++ b/app/controllers/api/v1/instances/rules_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class Api::V1::Instances::RulesController < Api::BaseController + skip_before_action :require_authenticated_user!, unless: :whitelist_mode? + + before_action :set_rules + + def index + render json: @rules, each_serializer: REST::RuleSerializer + end + + private + + def set_rules + @rules = Rule.ordered + end +end diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index d6bd9e3c6..281f5b2bf 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -884,3 +884,24 @@ $small-breakpoint: 960px; } } +.rules-list { + background: darken($ui-base-color, 2%); + border: 1px solid darken($ui-base-color, 8%); + border-radius: 4px; + padding: 0.5em 2.5em !important; + margin-top: 1.85em !important; + + li { + border-bottom: 1px solid lighten($ui-base-color, 4%); + color: $dark-text-color; + padding: 1em; + + &:last-child { + border-bottom: 0; + } + } + + &__text { + color: $primary-text-color; + } +} diff --git a/app/models/rule.rb b/app/models/rule.rb new file mode 100644 index 000000000..7b62f2b35 --- /dev/null +++ b/app/models/rule.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: rules +# +# id :bigint(8) not null, primary key +# priority :integer default(0), not null +# deleted_at :datetime +# text :text default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# +class Rule < ApplicationRecord + include Discard::Model + + self.discard_column = :deleted_at + + validates :text, presence: true, length: { maximum: 300 } + + scope :ordered, -> { kept.order(priority: :asc) } +end diff --git a/app/policies/rule_policy.rb b/app/policies/rule_policy.rb new file mode 100644 index 000000000..6a4def009 --- /dev/null +++ b/app/policies/rule_policy.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class RulePolicy < ApplicationPolicy + def index? + staff? + end + + def create? + admin? + end + + def update? + admin? + end + + def destroy? + admin? + end +end diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index 1bfdd40ac..8cd774abe 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -16,6 +16,10 @@ class InstancePresenter Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, '')) end + def rules + Rule.ordered + end + def user_count Rails.cache.fetch('user_count') { User.confirmed.joins(:account).merge(Account.without_suspended).count } end diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index b388e448e..d39092b56 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -9,7 +9,9 @@ class REST::InstanceSerializer < ActiveModel::Serializer has_one :contact_account, serializer: REST::AccountSerializer - delegate :contact_account, to: :instance_presenter + has_many :rules, serializer: REST::RuleSerializer + + delegate :contact_account, :rules, to: :instance_presenter def uri Rails.configuration.x.local_domain diff --git a/app/serializers/rest/rule_serializer.rb b/app/serializers/rest/rule_serializer.rb new file mode 100644 index 000000000..fc925925a --- /dev/null +++ b/app/serializers/rest/rule_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class REST::RuleSerializer < ActiveModel::Serializer + attributes :id, :text + + def id + object.id.to_s + end +end diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 109b5fa86..3c5f4f6f1 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -48,6 +48,16 @@ - else .box-widget .rich-formatting + - unless @rules.empty? + %h2#rules= t('about.rules') + + %p= t('about.rules_html') + + %ol.rules-list + - @rules.each do |rule| + %li + .rules-list__text= rule.text + = @contents.html_safe - if display_blocks? && !@blocks.empty? @@ -70,6 +80,9 @@ .column-4 %ul.table-of-contents + - unless @rules.empty? + %li= link_to t('about.rules'), '#rules' + - @table_of_contents.each do |item| %li = link_to item.title, "##{item.anchor}" diff --git a/app/views/admin/rules/_rule.html.haml b/app/views/admin/rules/_rule.html.haml new file mode 100644 index 000000000..f8a9ac786 --- /dev/null +++ b/app/views/admin/rules/_rule.html.haml @@ -0,0 +1,11 @@ +.announcements-list__item + = link_to edit_admin_rule_path(rule), class: 'announcements-list__item__title' do + = "#{rule_counter + 1}." + = truncate(rule.text) + + .announcements-list__item__action-bar + .announcements-list__item__meta + = rule.text + + %div + = table_link_to 'trash', t('admin.rules.delete'), admin_rule_path(rule), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, rule) diff --git a/app/views/admin/rules/edit.html.haml b/app/views/admin/rules/edit.html.haml new file mode 100644 index 000000000..ba7e6451a --- /dev/null +++ b/app/views/admin/rules/edit.html.haml @@ -0,0 +1,11 @@ +- content_for :page_title do + = t('admin.rules.edit') + += simple_form_for @rule, url: admin_rule_path(@rule) do |f| + = render 'shared/error_messages', object: @rule + + .fields-group + = f.input :text, wrapper: :with_block_label + + .actions + = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/rules/index.html.haml b/app/views/admin/rules/index.html.haml new file mode 100644 index 000000000..3b069d083 --- /dev/null +++ b/app/views/admin/rules/index.html.haml @@ -0,0 +1,24 @@ +- content_for :page_title do + = t('admin.rules.title') + +.simple_form + %p.hint= t('admin.rules.description') + +- if can? :create, :rule + = simple_form_for @rule, url: admin_rules_path do |f| + = render 'shared/error_messages', object: @rule + + .fields-group + = f.input :text, wrapper: :with_block_label + + .actions + = f.button :button, t('admin.rules.add_new'), type: :submit + + %hr.spacer/ + +- if @rules.empty? + %div.muted-hint.center-text + = t 'admin.rules.empty' +- else + .announcements-list + = render partial: 'rule', collection: @rules |