-
{{i18n "admin.user_fields.title"}}
+
+
+ <:breadcrumbs>
+
+
+ <:actions as |actions|>
+
+
+
-
{{i18n "admin.user_fields.help"}}
-
- {{#if this.model}}
- {{#each this.sortedFields as |uf|}}
-
- {{/each}}
- {{/if}}
-
-
+
\ No newline at end of file
diff --git a/app/assets/javascripts/discourse/app/lib/constants.js b/app/assets/javascripts/discourse/app/lib/constants.js
index 97fd6f78452..e08fcd52947 100644
--- a/app/assets/javascripts/discourse/app/lib/constants.js
+++ b/app/assets/javascripts/discourse/app/lib/constants.js
@@ -99,3 +99,10 @@ export const SITE_SETTING_REQUIRES_CONFIRMATION_TYPES = {
};
export const MAX_UNOPTIMIZED_CATEGORIES = 1000;
+
+export const USER_FIELD_FLAGS = [
+ "editable",
+ "show_on_profile",
+ "show_on_user_card",
+ "searchable",
+];
diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss
index 5a16b2f3388..cf92963f4f9 100644
--- a/app/assets/stylesheets/common/admin/admin_base.scss
+++ b/app/assets/stylesheets/common/admin/admin_base.scss
@@ -1078,6 +1078,7 @@ a.inline-editable-field {
@import "common/admin/badges";
@import "common/admin/emails";
@import "common/admin/flags";
+@import "common/admin/user_fields";
@import "common/admin/json_schema_editor";
@import "common/admin/schema_field";
@import "common/admin/staff_logs";
diff --git a/app/assets/stylesheets/common/admin/admin_table.scss b/app/assets/stylesheets/common/admin/admin_table.scss
index 1d18d2c1a37..0516d7e9914 100644
--- a/app/assets/stylesheets/common/admin/admin_table.scss
+++ b/app/assets/stylesheets/common/admin/admin_table.scss
@@ -94,6 +94,16 @@
margin-bottom: 0.1em;
}
}
+
+ &-flags {
+ color: var(--primary-high);
+ font-size: var(--font-down-1);
+ text-transform: lowercase;
+
+ &::first-letter {
+ text-transform: uppercase;
+ }
+ }
}
.d-admin-row__controls {
diff --git a/app/assets/stylesheets/common/admin/user_fields.scss b/app/assets/stylesheets/common/admin/user_fields.scss
new file mode 100644
index 00000000000..bb5da5f08d3
--- /dev/null
+++ b/app/assets/stylesheets/common/admin/user_fields.scss
@@ -0,0 +1,10 @@
+.admin-user_field-item {
+ &__delete.btn,
+ &__delete.btn:hover {
+ border-top: 1px solid var(--primary-low);
+ color: var(--danger);
+ svg {
+ color: var(--danger);
+ }
+ }
+}
diff --git a/app/controllers/admin/user_fields_controller.rb b/app/controllers/admin/user_fields_controller.rb
index 14066232810..95bcf4a551f 100644
--- a/app/controllers/admin/user_fields_controller.rb
+++ b/app/controllers/admin/user_fields_controller.rb
@@ -30,6 +30,14 @@ class Admin::UserFieldsController < Admin::AdminController
render_serialized(user_fields, UserFieldSerializer, root: "user_fields")
end
+ def show
+ user_field = UserField.find(params[:id])
+ render_serialized(user_field, UserFieldSerializer)
+ end
+
+ def edit
+ end
+
def update
field_params = params[:user_field]
field = UserField.where(id: params.require(:id)).first
diff --git a/app/models/user_field.rb b/app/models/user_field.rb
index 212f948d286..7607ff8b0dd 100644
--- a/app/models/user_field.rb
+++ b/app/models/user_field.rb
@@ -5,6 +5,8 @@ class UserField < ActiveRecord::Base
include HasDeprecatedColumns
include HasSanitizableFields
+ FLAG_ATTRIBUTES = %w[editable show_on_profile show_on_user_card searchable].freeze
+
deprecate_column :required, drop_from: "3.3"
self.ignored_columns += %i[field_type]
diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml
index 5653cca6573..770caf63ac7 100644
--- a/config/locales/client.bs_BA.yml
+++ b/config/locales/client.bs_BA.yml
@@ -4275,7 +4275,7 @@ bs_BA:
enabled: "prikazano na korisničkoj kartici"
disabled: "nije prikazano na korisničkoj kartici"
field_types:
- text: "Text Field"
+ text: "Text"
confirm: "Confirmation"
dropdown: "Ispustiti"
site_text:
diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml
index e42c445c937..e221f71ba5b 100644
--- a/config/locales/client.cs.yml
+++ b/config/locales/client.cs.yml
@@ -6412,7 +6412,7 @@ cs:
enabled: "zobrazeno na kartě uživatele"
disabled: "Nezobrazeno na kartě uživatele"
field_types:
- text: "Text Field"
+ text: "Text"
confirm: "Potvrzení"
dropdown: "Menu"
multiselect: "Více možností"
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index ce9419bf53a..b76fece785b 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -5737,6 +5737,16 @@ en:
themes_description: "Themes are expansive customizations that change multiple elements of the style of your forum design, and often also include additional front-end features."
new_theme: "New theme"
user_selectable: "User selectable"
+ user_fields:
+ field: "Field"
+ type: "Type"
+ more_options:
+ title: "More options"
+ move_up: "Move up"
+ move_down: "Move down"
+ delete: "Delete"
+ delete_successful: "User field deleted."
+ save_successful: "User field saved."
plugins:
title: "Plugins"
installed: "Installed plugins"
@@ -6946,8 +6956,12 @@ en:
user_fields:
title: "User Fields"
- help: "Add fields that your users can fill out."
- create: "Create User Field"
+ help: "Create custom user fields to collect extra details about your community members. You can choose what information is required during sign-up, what shows on profiles, and what users can update."
+ no_user_fields: "You don't have any custom user fields yet."
+ add: "Add user field"
+ back: "Back to user fields"
+ edit_header: "Edit User Field"
+ new_header: "Add User Field"
untitled: "Untitled"
name: "Field Name"
type: "Field Type"
@@ -6976,23 +6990,23 @@ en:
confirmation: "This will prompt existing users to fill in this field and will not allow them to do anything else on your site until the field is filled. Proceed?"
editable:
title: "Editable after signup"
- enabled: "editable"
- disabled: "not editable"
+ enabled: "Editable"
+ disabled: "Not editable"
show_on_profile:
title: "Show on public profile"
- enabled: "shown on profile"
- disabled: "not shown on profile"
+ enabled: "Shown on profile"
+ disabled: "Not shown on profile"
show_on_user_card:
title: "Show on user card"
- enabled: "shown on user card"
- disabled: "not shown on user card"
+ enabled: "Shown on user card"
+ disabled: "Not shown on user card"
searchable:
title: "Searchable"
- enabled: "searchable"
- disabled: "not searchable"
+ enabled: "Searchable"
+ disabled: "Not searchable"
field_types:
- text: "Text Field"
+ text: "Text"
confirm: "Confirmation"
dropdown: "Dropdown"
multiselect: "Multiselect"
diff --git a/config/routes.rb b/config/routes.rb
index 3d9e2a8b3af..df71ef73285 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -245,6 +245,9 @@ Discourse::Application.routes.draw do
resources :user_fields,
only: %i[index create update destroy],
constraints: AdminConstraint.new
+ get "user_fields/new" => "user_fields#index"
+ get "user_fields/:id" => "user_fields#show"
+ get "user_fields/:id/edit" => "user_fields#edit"
resources :emojis, only: %i[index create destroy], constraints: AdminConstraint.new
get "emojis/new" => "emojis#index"
get "emojis/settings" => "emojis#index"
diff --git a/lib/tasks/javascript.rake b/lib/tasks/javascript.rake
index bd7e8a6dbf3..a794bef55c5 100644
--- a/lib/tasks/javascript.rake
+++ b/lib/tasks/javascript.rake
@@ -165,6 +165,8 @@ task "javascript:update_constants" => :environment do
export const SITE_SETTING_REQUIRES_CONFIRMATION_TYPES = #{SiteSettings::TypeSupervisor::REQUIRES_CONFIRMATION_TYPES.to_json};
export const MAX_UNOPTIMIZED_CATEGORIES = #{CategoryList::MAX_UNOPTIMIZED_CATEGORIES};
+
+ export const USER_FIELD_FLAGS = #{UserField::FLAG_ATTRIBUTES};
JS
pretty_notifications = Notification.types.map { |n| " #{n[0]}: #{n[1]}," }.join("\n")
diff --git a/spec/system/admin_user_fields_spec.rb b/spec/system/admin_user_fields_spec.rb
index ad0a423caf4..8c77facff95 100644
--- a/spec/system/admin_user_fields_spec.rb
+++ b/spec/system/admin_user_fields_spec.rb
@@ -28,8 +28,7 @@ describe "Admin User Fields", type: :system do
it "makes sure new required fields are editable after signup" do
user_fields_page.visit
-
- page.find(".user-fields .btn-primary").click
+ user_fields_page.click_add_field
form = page.find(".user-field")
editable_label = I18n.t("admin_js.admin.user_fields.editable.title")
@@ -45,8 +44,7 @@ describe "Admin User Fields", type: :system do
it "requires confirmation when applying required fields retroactively" do
user_fields_page.visit
-
- page.find(".user-fields .btn-primary").click
+ user_fields_page.click_add_field
form = page.find(".user-field")
@@ -65,8 +63,7 @@ describe "Admin User Fields", type: :system do
it "does not require confirmation if the field already applies to all users" do
user_fields_page.visit
-
- page.find(".user-field .edit").click
+ user_fields_page.click_edit
form = page.find(".user-field")
diff --git a/spec/system/page_objects/pages/admin_user_fields.rb b/spec/system/page_objects/pages/admin_user_fields.rb
index 664d51c04dd..297d1e66881 100644
--- a/spec/system/page_objects/pages/admin_user_fields.rb
+++ b/spec/system/page_objects/pages/admin_user_fields.rb
@@ -18,8 +18,16 @@ module PageObjects
form.choose(I18n.t("admin_js.admin.user_fields.requirement.#{requirement}.title"))
end
+ def click_add_field
+ page.find(".admin-page-header__actions .btn-primary").click
+ end
+
+ def click_edit
+ page.find(".admin-user_field-item__edit").click
+ end
+
def add_field(name: nil, description: nil, requirement: nil, preferences: [])
- page.find(".user-fields .btn-primary").click
+ click_add_field
form = page.find(".user-field")