mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
DEV: Plugin API to add directory columns (#13440)
This commit is contained in:
committed by
GitHub
parent
fe5923da06
commit
7fc3d7bdde
@@ -604,7 +604,6 @@ class ApplicationController < ActionController::Base
|
||||
store_preloaded("customEmoji", custom_emoji)
|
||||
store_preloaded("isReadOnly", @readonly_mode.to_s)
|
||||
store_preloaded("activatedThemes", activated_themes_json)
|
||||
store_preloaded("directoryColumns", directory_columns_json)
|
||||
end
|
||||
|
||||
def preload_current_user_data
|
||||
@@ -616,20 +615,6 @@ class ApplicationController < ActionController::Base
|
||||
store_preloaded("topicTrackingStates", MultiJson.dump(serializer))
|
||||
end
|
||||
|
||||
def directory_columns_json
|
||||
DirectoryColumn
|
||||
.left_joins(:user_field)
|
||||
.where(enabled: true)
|
||||
.order(:position)
|
||||
.pluck('directory_columns.name',
|
||||
'directory_columns.automatic',
|
||||
'directory_columns.icon',
|
||||
'user_fields.id',
|
||||
'user_fields.name')
|
||||
.map { |column| { name: column[0] || column[4], automatic: column[1], icon: column[2], user_field_id: column[3] } }
|
||||
.to_json
|
||||
end
|
||||
|
||||
def custom_html_json
|
||||
target = view_context.mobile_view? ? :mobile : :desktop
|
||||
|
||||
|
||||
@@ -1,62 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class DirectoryColumnsController < ApplicationController
|
||||
requires_login
|
||||
|
||||
def index
|
||||
raise Discourse::NotFound unless guardian.is_staff?
|
||||
|
||||
ensure_user_fields_have_columns
|
||||
|
||||
columns = DirectoryColumn.includes(:user_field).all
|
||||
render_json_dump(directory_columns: serialize_data(columns, DirectoryColumnSerializer))
|
||||
end
|
||||
|
||||
def update
|
||||
raise Discourse::NotFound unless guardian.is_staff?
|
||||
params.require(:directory_columns)
|
||||
directory_column_params = params.permit(directory_columns: {})
|
||||
directory_columns = DirectoryColumn.all
|
||||
|
||||
has_enabled_column = directory_column_params[:directory_columns].values.any? do |column_data|
|
||||
column_data[:enabled].to_s == "true"
|
||||
end
|
||||
raise Discourse::InvalidParameters, "Must have at least one column enabled" unless has_enabled_column
|
||||
|
||||
directory_column_params[:directory_columns].values.each do |column_data|
|
||||
existing_column = directory_columns.detect { |c| c.id == column_data[:id].to_i }
|
||||
if (existing_column.enabled != column_data[:enabled] || existing_column.position != column_data[:position].to_i)
|
||||
existing_column.update(enabled: column_data[:enabled], position: column_data[:position])
|
||||
end
|
||||
end
|
||||
|
||||
render json: success_json
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def ensure_user_fields_have_columns
|
||||
user_fields_without_column =
|
||||
UserField.left_outer_joins(:directory_column)
|
||||
.where(directory_column: { user_field_id: nil })
|
||||
.where("show_on_profile=? OR show_on_user_card=?", true, true)
|
||||
|
||||
return unless user_fields_without_column.count > 0
|
||||
|
||||
next_position = DirectoryColumn.maximum("position") + 1
|
||||
|
||||
new_directory_column_attrs = []
|
||||
user_fields_without_column.each do |user_field|
|
||||
new_directory_column_attrs.push({
|
||||
user_field_id: user_field.id,
|
||||
enabled: false,
|
||||
automatic: false,
|
||||
position: next_position
|
||||
})
|
||||
|
||||
next_position += 1
|
||||
end
|
||||
|
||||
DirectoryColumn.insert_all(new_directory_column_attrs)
|
||||
directory_columns = DirectoryColumn.includes(:user_field).where(enabled: true).order(:position)
|
||||
render_json_dump(directory_columns: serialize_data(directory_columns, DirectoryColumnSerializer))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,13 +26,14 @@ class DirectoryItemsController < ApplicationController
|
||||
result = result.references(:user).where.not(users: { username: params[:exclude_usernames].split(",") })
|
||||
end
|
||||
|
||||
order = params[:order] || DirectoryItem.headings.first
|
||||
order = params[:order] || DirectoryColumn.automatic_column_names.first
|
||||
dir = params[:asc] ? 'ASC' : 'DESC'
|
||||
if DirectoryItem.headings.include?(order.to_sym)
|
||||
if DirectoryColumn.active_column_names.include?(order.to_sym)
|
||||
result = result.order("directory_items.#{order} #{dir}, directory_items.id")
|
||||
elsif params[:order] === 'username'
|
||||
result = result.order("users.#{order} #{dir}, directory_items.id")
|
||||
else
|
||||
# Ordering by user field value
|
||||
user_field = UserField.find_by(name: params[:order])
|
||||
if user_field
|
||||
result = result
|
||||
@@ -98,6 +99,10 @@ class DirectoryItemsController < ApplicationController
|
||||
serializer_opts[:user_field_ids] = params[:user_field_ids]&.split("|")&.map(&:to_i)
|
||||
end
|
||||
|
||||
if params[:plugin_column_ids]
|
||||
serializer_opts[:plugin_column_ids] = params[:plugin_column_ids]&.split("|")&.map(&:to_i)
|
||||
end
|
||||
|
||||
serialized = serialize_data(result, DirectoryItemSerializer, serializer_opts)
|
||||
render_json_dump(directory_items: serialized,
|
||||
meta: {
|
||||
|
||||
62
app/controllers/edit_directory_columns_controller.rb
Normal file
62
app/controllers/edit_directory_columns_controller.rb
Normal file
@@ -0,0 +1,62 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class EditDirectoryColumnsController < ApplicationController
|
||||
requires_login
|
||||
|
||||
def index
|
||||
raise Discourse::NotFound unless guardian.is_staff?
|
||||
|
||||
ensure_user_fields_have_columns
|
||||
|
||||
columns = DirectoryColumn.includes(:user_field).all
|
||||
render_json_dump(directory_columns: serialize_data(columns, EditDirectoryColumnSerializer))
|
||||
end
|
||||
|
||||
def update
|
||||
raise Discourse::NotFound unless guardian.is_staff?
|
||||
params.require(:directory_columns)
|
||||
directory_column_params = params.permit(directory_columns: {})
|
||||
directory_columns = DirectoryColumn.all
|
||||
|
||||
has_enabled_column = directory_column_params[:directory_columns].values.any? do |column_data|
|
||||
column_data[:enabled].to_s == "true"
|
||||
end
|
||||
raise Discourse::InvalidParameters, "Must have at least one column enabled" unless has_enabled_column
|
||||
|
||||
directory_column_params[:directory_columns].values.each do |column_data|
|
||||
existing_column = directory_columns.detect { |c| c.id == column_data[:id].to_i }
|
||||
if (existing_column.enabled != column_data[:enabled] || existing_column.position != column_data[:position].to_i)
|
||||
existing_column.update(enabled: column_data[:enabled], position: column_data[:position])
|
||||
end
|
||||
end
|
||||
|
||||
render json: success_json
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def ensure_user_fields_have_columns
|
||||
user_fields_without_column =
|
||||
UserField.left_outer_joins(:directory_column)
|
||||
.where(directory_column: { user_field_id: nil })
|
||||
.where("show_on_profile=? OR show_on_user_card=?", true, true)
|
||||
|
||||
return unless user_fields_without_column.count > 0
|
||||
|
||||
next_position = DirectoryColumn.maximum("position") + 1
|
||||
|
||||
new_directory_column_attrs = []
|
||||
user_fields_without_column.each do |user_field|
|
||||
new_directory_column_attrs.push({
|
||||
user_field_id: user_field.id,
|
||||
enabled: false,
|
||||
type: DirectoryColumn.types[:user_field],
|
||||
position: next_position
|
||||
})
|
||||
|
||||
next_position += 1
|
||||
end
|
||||
|
||||
DirectoryColumn.insert_all(new_directory_column_attrs)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user