discourse/app/controllers/admin/user_fields_controller.rb

69 lines
1.8 KiB
Ruby

# frozen_string_literal: true
class Admin::UserFieldsController < Admin::AdminController
def self.columns
columns = %i[
name
field_type
editable
description
required
show_on_profile
show_on_user_card
position
searchable
]
DiscoursePluginRegistry.apply_modifier(:admin_user_fields_columns, columns)
end
def create
field = UserField.new(params.require(:user_field).permit(*Admin::UserFieldsController.columns))
field.position = (UserField.maximum(:position) || 0) + 1
field.required = params[:user_field][:required] == "true"
update_options(field)
json_result(field, serializer: UserFieldSerializer) { field.save }
end
def index
user_fields = UserField.all.includes(:user_field_options).order(:position)
render_serialized(user_fields, UserFieldSerializer, root: "user_fields")
end
def update
field_params = params[:user_field]
field = UserField.where(id: params.require(:id)).first
Admin::UserFieldsController.columns.each do |col|
field.public_send("#{col}=", field_params[col]) unless field_params[col].nil?
end
update_options(field)
if field.save
if !field.show_on_profile && !field.show_on_user_card
DirectoryColumn.where(user_field_id: field.id).destroy_all
end
render_serialized(field, UserFieldSerializer, root: "user_field")
else
render_json_error(field)
end
end
def destroy
field = UserField.where(id: params.require(:id)).first
field.destroy if field.present?
render json: success_json
end
protected
def update_options(field)
options = params[:user_field][:options]
if options.present?
UserFieldOption.where(user_field_id: field.id).delete_all
field.user_field_options_attributes = options.map { |o| { value: o } }.uniq
end
end
end