diff --git a/app/components/forum_post_component/forum_post_component.html.erb b/app/components/forum_post_component/forum_post_component.html.erb index cd1ce382f..0a8a251a9 100644 --- a/app/components/forum_post_component/forum_post_component.html.erb +++ b/app/components/forum_post_component/forum_post_component.html.erb @@ -43,18 +43,20 @@ <% end %> <% end %> <% end %> + <% end %> - <% if policy(forum_post).destroy? && !forum_post.is_original_post?(original_forum_post_id) %> - <% menu.item do %> - <% if forum_post.is_deleted? %> - <%= link_to undelete_forum_post_path(forum_post.id), method: :post, remote: true do %> - <%= undelete_icon %> Undelete - <% end %> - <% else %> - <%= link_to forum_post_path(forum_post.id), "data-confirm": "Are you sure you want to delete this forum post?", method: :delete, remote: true do %> - <%= delete_icon %> Delete - <% end %> - <% end %> + <% if forum_post.is_deleted? && policy(forum_post).undelete? && !forum_post.is_original_post?(original_forum_post_id) %> + <% menu.item do %> + <%= link_to undelete_forum_post_path(forum_post.id), method: :post, remote: true do %> + <%= undelete_icon %> Undelete + <% end %> + <% end %> + <% end %> + + <% if !forum_post.is_deleted? && policy(forum_post).destroy? && !forum_post.is_original_post?(original_forum_post_id) %> + <% menu.item do %> + <%= link_to forum_post_path(forum_post.id), "data-confirm": "Are you sure you want to delete this forum post?", method: :delete, remote: true do %> + <%= delete_icon %> Delete <% end %> <% end %> <% end %> diff --git a/app/controllers/forum_posts_controller.rb b/app/controllers/forum_posts_controller.rb index e6ef8ea68..0ab945b58 100644 --- a/app/controllers/forum_posts_controller.rb +++ b/app/controllers/forum_posts_controller.rb @@ -55,12 +55,16 @@ class ForumPostsController < ApplicationController def destroy @forum_post = authorize ForumPost.find(params[:id]) @forum_post.delete! + + flash[:notice] = @forum_post.errors.none? ? "Post deleted" : @forum_post.errors.full_messages.join("; ") respond_with(@forum_post) end def undelete @forum_post = authorize ForumPost.find(params[:id]) @forum_post.undelete! + + flash[:notice] = @forum_post.errors.none? ? "Post undeleted" : @forum_post.errors.full_messages.join("; ") respond_with(@forum_post) end end diff --git a/app/controllers/wiki_pages_controller.rb b/app/controllers/wiki_pages_controller.rb index f9f6ece3f..7386018b1 100644 --- a/app/controllers/wiki_pages_controller.rb +++ b/app/controllers/wiki_pages_controller.rb @@ -30,15 +30,6 @@ class WikiPagesController < ApplicationController end def show - if params[:format].present? - request.format = params[:format] - elsif params[:id].ends_with?(".html", ".json", ".xml") - request.format = params[:id].split(".").last - params[:id].delete_suffix!(".#{request.format.symbol}") - else - request.format = "html" - end - @wiki_page, found_by = WikiPage.find_by_id_or_title(params[:id]) if request.format.html? && @wiki_page.blank? && found_by == :title diff --git a/app/javascript/src/styles/base/010_reset.scss b/app/javascript/src/styles/base/010_reset.scss index 30fa1c48f..b928b2506 100644 --- a/app/javascript/src/styles/base/010_reset.scss +++ b/app/javascript/src/styles/base/010_reset.scss @@ -1,8 +1,16 @@ +html { + // Disable font boosting on mobile. By default, when desktop mode is enabled + // on mobile, mobile browsers will automagically increase the size of text. + // Usually they do so poorly, making things like headers smaller than body + // text, which breaks the layout. + text-size-adjust: none; +} + *, ::before, ::after { box-sizing: border-box; } -body, h1, h2, h3, h4, h5, h6, p, ul, ol, li, blockquote, dl, dd, menu { +body, h1, h2, h3, h4, h5, h6, p, ul, ol, li, blockquote, dl, dd, menu, input { margin: 0; } diff --git a/app/javascript/src/styles/base/020_base.scss b/app/javascript/src/styles/base/020_base.scss index 6593d41d8..6b072fc8c 100644 --- a/app/javascript/src/styles/base/020_base.scss +++ b/app/javascript/src/styles/base/020_base.scss @@ -50,7 +50,6 @@ fieldset { img { border: none; vertical-align: middle; - image-rendering: smooth; } input, select, textarea { diff --git a/app/javascript/src/styles/common/simple_form.scss b/app/javascript/src/styles/common/simple_form.scss index f17155525..7ceba5e6e 100644 --- a/app/javascript/src/styles/common/simple_form.scss +++ b/app/javascript/src/styles/common/simple_form.scss @@ -83,6 +83,11 @@ form.simple_form { line-height: 1.5em; } + // Hide "*" in label next to required fields. + &.required abbr[title="required"] { + display: none; + } + &.radio_buttons { span.radio label { font-weight: normal; diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index 5bd66a95b..17ea1d6f9 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -15,13 +15,14 @@ class ForumPost < ApplicationRecord has_one :bulk_update_request validates :body, presence: true, length: { maximum: 200_000 }, if: :body_changed? + validate :validate_deletion_of_original_post + validate :validate_undeletion_of_post before_create :autoreport_spam before_save :handle_reports_on_deletion after_create :update_topic_updated_at_on_create after_update :update_topic_updated_at_on_update_for_original_posts after_destroy :update_topic_updated_at_on_destroy - after_save :delete_topic_if_original_post after_update(:if => ->(rec) {rec.updater_id != rec.creator_id}) do |rec| ModAction.log("#{CurrentUser.user.name} updated forum ##{rec.id}", :forum_post_update) end @@ -83,6 +84,18 @@ class ForumPost < ApplicationRecord votes.exists?(creator_id: user.id, score: score) end + def validate_deletion_of_original_post + if is_original_post? && is_deleted? && !topic.is_deleted? + errors.add(:base, "Can't delete original post without deleting the topic first") + end + end + + def validate_undeletion_of_post + if topic.is_deleted? && !is_deleted? + errors.add(:base, "Can't undelete post without undeleting the topic first") + end + end + def autoreport_spam if SpamDetector.new(self, user_ip: CurrentUser.ip_addr).spam? moderation_reports << ModerationReport.new(creator: User.system, reason: "Spam.") @@ -153,12 +166,6 @@ class ForumPost < ApplicationRecord end end - def delete_topic_if_original_post - if is_deleted? && is_original_post? - topic.update_attribute(:is_deleted, true) - end - end - def handle_reports_on_deletion return unless moderation_reports.pending.present? && is_deleted_change == [false, true] diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index 76056a957..bdf6cea95 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -24,12 +24,13 @@ class ForumTopic < ApplicationRecord has_many :tag_implications validates :title, presence: true, length: { maximum: 200 }, if: :title_changed? - validates_associated :original_post validates :category_id, inclusion: { in: CATEGORIES.keys } validates :min_level, inclusion: { in: MIN_LEVELS.values } accepts_nested_attributes_for :original_post - after_update :update_orignal_post + + after_update :update_posts_on_deletion_or_undeletion + after_update :update_original_post after_save(:if => ->(rec) {rec.is_locked? && rec.saved_change_to_is_locked?}) do |rec| ModAction.log("locked forum topic ##{id} (title: #{title})", :forum_topic_lock) end @@ -179,7 +180,14 @@ class ForumTopic < ApplicationRecord (response_count / Danbooru.config.posts_per_page.to_f).ceil end - def update_orignal_post + # Delete all posts when the topic is deleted. Undelete all posts when the topic is undeleted. + def update_posts_on_deletion_or_undeletion + if saved_change_to_is_deleted? + forum_posts.update!(is_deleted: is_deleted) # XXX depends on current user + end + end + + def update_original_post original_post&.update_columns(:updater_id => updater.id, :updated_at => Time.now) end diff --git a/app/models/upload_media_asset.rb b/app/models/upload_media_asset.rb new file mode 100644 index 000000000..9ff3b3a6c --- /dev/null +++ b/app/models/upload_media_asset.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class UploadMediaAsset < ApplicationRecord + belongs_to :upload + belongs_to :media_asset +end diff --git a/app/policies/forum_post_policy.rb b/app/policies/forum_post_policy.rb index bbcc370c1..641b3e6e8 100644 --- a/app/policies/forum_post_policy.rb +++ b/app/policies/forum_post_policy.rb @@ -18,11 +18,11 @@ class ForumPostPolicy < ApplicationPolicy end def destroy? - unbanned? && show? && user.is_moderator? + unbanned? && show? && !record.is_deleted? && user.is_moderator? end def undelete? - unbanned? && show? && user.is_moderator? + unbanned? && show? && record.is_deleted? && !record.topic.is_deleted? && user.is_moderator? end def reply? diff --git a/app/views/forum_posts/destroy.js.erb b/app/views/forum_posts/destroy.js.erb index 7ccf4d7cd..345366b9b 100644 --- a/app/views/forum_posts/destroy.js.erb +++ b/app/views/forum_posts/destroy.js.erb @@ -1 +1 @@ -$("#forum_post_<%= @forum_post.id %>").replaceWith("<%= j render(ForumPostComponent.new(forum_post: @forum_post, current_user: CurrentUser.user)) %>"); +location.reload(); diff --git a/app/views/forum_posts/undelete.js.erb b/app/views/forum_posts/undelete.js.erb index 7ccf4d7cd..345366b9b 100644 --- a/app/views/forum_posts/undelete.js.erb +++ b/app/views/forum_posts/undelete.js.erb @@ -1 +1 @@ -$("#forum_post_<%= @forum_post.id %>").replaceWith("<%= j render(ForumPostComponent.new(forum_post: @forum_post, current_user: CurrentUser.user)) %>"); +location.reload(); diff --git a/app/views/layouts/blank.html.erb b/app/views/layouts/blank.html.erb index 493cbffdc..8073e813c 100644 --- a/app/views/layouts/blank.html.erb +++ b/app/views/layouts/blank.html.erb @@ -4,11 +4,12 @@ <%= NewRelic::Agent.browser_timing_header rescue "" %>