FIX: use a custom prefix for custom flags (#28839)

Currently, when the custom flag has the same name as the system flag (which is disabled) then it is not displayed. To fix the problem, `custom_` prefix as `name_key` is used to distinguish between the system and the custom flag.

I considered writing a migration to fix existing custom flags name key. However, at the end of migration I would need to run rails code to reset cache `Flag.reset_flag_settings!`. I decided to skip that step as it is a very edge case. If someone has the same flag name as the system flag, then all they have to do is edit the flag and click save.

In addition, I made 2 small fixes:
- edit flag title was missing translation;
- flag form UI was not showing that description is the required field.
This commit is contained in:
Krzysztof Kotlarek 2024-09-11 15:30:20 +10:00 committed by GitHub
parent 0323b366f3
commit 1f1709d249
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 56 additions and 23 deletions

View File

@ -135,7 +135,7 @@ export default class AdminFlagsForm extends Component {
<form.Field
@name="description"
@title={{i18n "admin.config_areas.flags.form.description"}}
@validation="length:0,1000"
@validation="required|length:3,1000"
as |field|
>
<field.Textarea @height={{60}} />

View File

@ -43,7 +43,7 @@ class Flag < ActiveRecord::Base
end
def system?
self.id < MAX_SYSTEM_FLAG_ID
self.id.present? && self.id < MAX_SYSTEM_FLAG_ID
end
def applies_to?(type)
@ -61,7 +61,8 @@ class Flag < ActiveRecord::Base
end
def set_name_key
self.name_key = self.name.squeeze(" ").gsub(" ", "_").gsub(/[^\w]/, "").downcase
prefix = self.system? ? "" : "custom_"
self.name_key = "#{prefix}#{self.name.squeeze(" ").gsub(" ", "_").gsub(/[^\w]/, "").downcase}"
end
end

View File

@ -5617,6 +5617,7 @@ en:
saved: "saved!"
flags:
header: "Moderation Flags"
edit_header: "Edit Flag"
subheader: "The flagging system in Discourse helps you and your moderator team manage content and user behavior, keeping your community respectful and healthy. The defaults are suitable for most communities and you dont have to change them. However, if your site has particular requirements you can disable flags you dont need and add your own custom flags."
description: "Description"
enabled: "Enabled?"

View File

@ -29,8 +29,8 @@ RSpec.describe PostActionTypeView do
)
expect(post_action_type_view.score_types).to eq({ needs_approval: 9 })
flag = Fabricate(:flag, name: "custom", enabled: false)
expect(PostActionTypeView.new.disabled_flag_types).to eq({ custom: flag.id })
flag = Fabricate(:flag, name: "flag", enabled: false)
expect(PostActionTypeView.new.disabled_flag_types).to eq({ custom_flag: flag.id })
flag.destroy!
end

View File

@ -17,14 +17,14 @@ RSpec.describe Flag, type: :model do
end
it "has correct name key" do
flag = Fabricate(:flag, name: "CuStOm Flag!!!")
flag = Fabricate(:flag, name: "FlAg!!!")
expect(flag.name_key).to eq("custom_flag")
flag.update!(name: "It's Illegal")
expect(flag.name_key).to eq("its_illegal")
expect(flag.name_key).to eq("custom_its_illegal")
flag.update!(name: "THIS IS SPaM!+)(*&^%$#@@@!)")
expect(flag.name_key).to eq("this_is_spam")
expect(flag.name_key).to eq("custom_this_is_spam")
flag.destroy!
end
@ -37,17 +37,9 @@ RSpec.describe Flag, type: :model do
%i[notify_user off_topic inappropriate spam illegal notify_moderators needs_approval],
)
flag = Fabricate(:flag, name: "custom")
flag = Fabricate(:flag, name: "flag")
expect(PostActionType.flag_types.keys).to eq(
%i[notify_user off_topic inappropriate spam illegal notify_moderators custom],
)
expect(ReviewableScore.types.keys).to eq(
%i[notify_user off_topic inappropriate spam illegal notify_moderators custom needs_approval],
)
flag.update!(name: "edited_custom")
expect(PostActionType.flag_types.keys).to eq(
%i[notify_user off_topic inappropriate spam illegal notify_moderators edited_custom],
%i[notify_user off_topic inappropriate spam illegal notify_moderators custom_flag],
)
expect(ReviewableScore.types.keys).to eq(
%i[
@ -57,7 +49,24 @@ RSpec.describe Flag, type: :model do
spam
illegal
notify_moderators
edited_custom
custom_flag
needs_approval
],
)
flag.update!(name: "edited_flag")
expect(PostActionType.flag_types.keys).to eq(
%i[notify_user off_topic inappropriate spam illegal notify_moderators custom_edited_flag],
)
expect(ReviewableScore.types.keys).to eq(
%i[
notify_user
off_topic
inappropriate
spam
illegal
notify_moderators
custom_edited_flag
needs_approval
],
)

View File

@ -791,7 +791,7 @@ RSpec.describe PostAction do
PostActionCreator.new(
Discourse.system_user,
post,
PostActionType.types[:flag_without_message],
PostActionType.types[:custom_flag_without_message],
message: "WAT",
).perform
@ -824,7 +824,7 @@ RSpec.describe PostAction do
PostActionCreator.new(
Discourse.system_user,
post,
PostActionType.types[:flag_with_message],
PostActionType.types[:custom_flag_with_message],
message: "WAT",
).perform

View File

@ -108,7 +108,7 @@ describe "Admin Flags Page", type: :system do
)
# update
admin_flags_page.visit.click_edit_flag("vulgar")
admin_flags_page.visit.click_edit_flag("custom_vulgar")
admin_flag_form_page.fill_in_name("Tasteless").click_save
expect(admin_flags_page).to have_flags(
@ -132,7 +132,7 @@ describe "Admin Flags Page", type: :system do
)
# delete
admin_flags_page.visit.click_delete_flag("tasteless").confirm_delete
admin_flags_page.visit.click_delete_flag("custom_tasteless").confirm_delete
expect(admin_flags_page).to have_no_flag("tasteless")
@ -146,6 +146,28 @@ describe "Admin Flags Page", type: :system do
"It's Illegal",
"Something Else",
)
# custom flag with same name as system flag
admin_flags_page.visit.toggle("inappropriate")
admin_flags_page.click_add_flag
admin_flag_form_page
.fill_in_name("Inappropriate")
.fill_in_description("New flag description")
.select_applies_to("Topic")
.select_applies_to("Post")
.click_save
topic_page.visit_topic(post.topic).open_flag_topic_modal
expect(flag_modal).to have_choices(
"It's Spam",
"It's Illegal",
"Something Else",
"Inappropriate",
)
Flag.system.where(name: "illegal").update!(enabled: true)
admin_flags_page.visit.click_delete_flag("custom_inappropriate").confirm_delete
end
it "has settings tab" do