DEV: Plugin API to add directory columns (#13440)

This commit is contained in:
Mark VanLandingham
2021-06-22 13:00:04 -05:00
committed by GitHub
parent fe5923da06
commit 7fc3d7bdde
33 changed files with 452 additions and 195 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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: {

View 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