2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-03-04 01:15:08 +08:00
discourse/app/models/user_field.rb
chapoi 40842ce4ee
DEV: add input=date type to custom user field options (#37902)
Adds a new "date" field type to custom user fields, with native
datepicker (lightweight solution)

Long standing meta request:
https://meta.discourse.org/t/date-type-on-custom-user-fields/47357

<img width="912" height="496" alt="CleanShot 2026-02-18 at 22 25 04@2x"
src="https://github.com/user-attachments/assets/5e08091c-eee3-4580-a868-c3ead4422a92"
/>
<img width="970" height="1098" alt="CleanShot 2026-02-18 at 22 23 57@2x"
src="https://github.com/user-attachments/assets/0c026d62-fe9c-4fe0-b057-8d392ce03b13"
/>
<img width="1034" height="236" alt="CleanShot 2026-02-18 at 22 24 43@2x"
src="https://github.com/user-attachments/assets/d4264c6d-021a-4662-bd7a-7e89b48796df"
/>
2026-02-19 07:04:52 +01:00

81 lines
2.6 KiB
Ruby

# frozen_string_literal: true
class UserField < ActiveRecord::Base
include AnonCacheInvalidator
include HasDeprecatedColumns
include HasSanitizableFields
FLAG_ATTRIBUTES = %w[editable show_on_profile show_on_signup show_on_user_card searchable].freeze
deprecate_column :required, drop_from: "3.3"
self.ignored_columns += %i[field_type]
validates :description, presence: true
validates :name, presence: { unless: -> { field_type == "confirm" } }
has_many :user_field_options, dependent: :destroy
has_one :directory_column, dependent: :destroy
accepts_nested_attributes_for :user_field_options
before_save :sanitize_description
after_create :update_required_fields_version
after_update :update_required_fields_version, if: -> { saved_change_to_requirement? }
after_save :queue_index_search
scope :public_fields, -> { where(show_on_profile: true).or(where(show_on_user_card: true)) }
scope :required, -> { not_optional }
scope :user_editable_text_fields, -> { where(field_type: %w[text textarea]) }
enum :requirement, { optional: 0, for_all_users: 1, on_signup: 2 }.freeze
enum :field_type_enum,
{ text: 0, confirm: 1, dropdown: 2, multiselect: 3, textarea: 4, date: 5 }.freeze
alias_attribute :field_type, :field_type_enum
def self.max_length
2048
end
def required?
!optional?
end
def queue_index_search
Jobs.enqueue(:index_user_fields_for_search, user_field_id: self.id)
end
private
def update_required_fields_version
return if !for_all_users?
UserRequiredFieldsVersion.create
Discourse.request_refresh!
end
def sanitize_description
if description_changed?
self.description = sanitize_field(self.description, additional_attributes: ["target"])
end
end
end
# == Schema Information
#
# Table name: user_fields
#
# id :integer not null, primary key
# description :string not null
# editable :boolean default(FALSE), not null
# external_name :string
# external_type :string
# field_type_enum :integer not null
# name :string not null
# position :integer default(0)
# required :boolean default(TRUE), not null
# requirement :integer default("optional"), not null
# searchable :boolean default(FALSE), not null
# show_on_profile :boolean default(FALSE), not null
# show_on_signup :boolean default(TRUE), not null
# show_on_user_card :boolean default(FALSE), not null
# created_at :datetime not null
# updated_at :datetime not null
#