Merge pull request #369 from ZmagoD/zd_SCI_812

fixes bug with samples sorting [fixes SCI-812]
This commit is contained in:
Zmago Devetak 2017-01-03 08:56:59 +01:00 committed by GitHub
commit 5d0e80a5e1
4 changed files with 67 additions and 31 deletions

View file

@ -275,7 +275,8 @@ class ExperimentsController < ApplicationController
@organization,
nil,
nil,
@experiment)
@experiment,
current_user)
end
end
end

View file

@ -325,9 +325,14 @@ class MyModulesController < ApplicationController
respond_to do |format|
format.html
format.json {
render json: ::SampleDatatable.new(view_context, @organization, nil, @my_module)
}
format.json do
render json: ::SampleDatatable.new(view_context,
@organization,
nil,
@my_module,
nil,
current_user)
end
end
end

View file

@ -281,12 +281,17 @@ class ProjectsController < ApplicationController
def samples_index
@organization = @project.organization
@user = current_user
respond_to do |format|
format.html
format.json {
render json: ::SampleDatatable.new(view_context, @organization, @project, nil)
}
format.json do
render json: ::SampleDatatable.new(view_context,
@organization,
@project,
nil,
nil,
@user)
end
end
end

View file

@ -33,38 +33,42 @@ class SampleDatatable < AjaxDatatablesRails::Base
organization,
project = nil,
my_module = nil,
experiment = nil)
experiment = nil,
user = nil)
super(view)
@organization = organization
@project = project
@my_module = my_module
@experiment = experiment
@user = user
end
# Define sortable columns, so 1st column will be sorted by attribute in sortable_columns[0]
def sortable_columns
sort_array = [
ASSIGNED_SORT_COL,
"Sample.name",
"SampleType.name",
"SampleGroup.name",
"Sample.created_at",
"User.full_name",
'Sample.name',
'SampleType.name',
'SampleGroup.name',
'Sample.created_at',
'User.full_name'
]
sort_array.push(*custom_fields_sort_by)
@sortable_columns ||= sort_array
@sortable_columns = sort_array
end
# Define attributes on which we perform search
def searchable_columns
search_array = [
"Sample.name",
"SampleType.name",
"SampleGroup.name",
"Sample.created_at",
"User.full_name"
'Sample.name',
'SampleType.name',
'SampleGroup.name',
'Sample.created_at',
'User.full_name'
]
search_array.push(*custom_fields_sort_by)
@searchable_columns ||= filter_search_array search_array
end
@ -72,7 +76,7 @@ class SampleDatatable < AjaxDatatablesRails::Base
private
# filters the search array by checking if the the column is visible
def filter_search_array input_array
def filter_search_array(input_array)
param_index = 2
filtered_array =[]
input_array.each do |col|
@ -90,7 +94,7 @@ class SampleDatatable < AjaxDatatablesRails::Base
array = []
for _ in 0..num_cf
array << "SampleCustomField.value"
array << 'SampleCustomField.value'
end
array
end
@ -99,11 +103,11 @@ class SampleDatatable < AjaxDatatablesRails::Base
def data
records.map do |record|
sample = {
"DT_RowId": record.id,
"1": assigned_cell(record),
"2": record.name,
"3": record.sample_type.nil? ? I18n.t("samples.table.no_type") : record.sample_type.name,
"4": record.sample_group.nil? ?
'DT_RowId': record.id,
'1': assigned_cell(record),
'2': record.name,
'3': record.sample_type.nil? ? I18n.t('samples.table.no_type') : record.sample_type.name,
'4': record.sample_group.nil? ?
"<span class='glyphicon glyphicon-asterisk'></span> " + I18n.t("samples.table.no_group") :
"<span class='glyphicon glyphicon-asterisk' style='color: #{record.sample_group.color}'></span> " + record.sample_group.name,
"5": I18n.l(record.created_at, format: :full),
@ -211,7 +215,7 @@ class SampleDatatable < AjaxDatatablesRails::Base
# Override default sort method if needed
def sort_records(records)
if params[:order].present? and params[:order].length == 1
if params[:order].present? && params[:order].length == 1
if sort_column(params[:order].values[0]) == ASSIGNED_SORT_COL
# If "assigned" column is sorted
if @my_module then
@ -220,7 +224,6 @@ class SampleDatatable < AjaxDatatablesRails::Base
records.order("sample_my_modules.id NULLS #{sort_null_direction(params[:order].values[0])}")
elsif @experiment
# A very elegant solution to sort assigned samples at a experiment level
# grabs the ids of samples which has a modules that belongs to this project
assigned = Sample
.joins('LEFT OUTER JOIN "sample_my_modules" ON "sample_my_modules"."sample_id" = "samples"."id"')
@ -250,6 +253,7 @@ class SampleDatatable < AjaxDatatablesRails::Base
:sanitize_sql_array,
["position((',' || samples.id || ',') in ?)",
ids.join(',') + ','] )
records.where(id: ids).order(order_by_index)
elsif @project
# A very elegant solution to sort assigned samples at a project level
@ -331,7 +335,7 @@ class SampleDatatable < AjaxDatatablesRails::Base
super(records)
end
end
#(I18n.t('time.formats.datatables_date')).gsub("\"", '\'')
# A hack that overrides the new_search_contition method default behavior of the ajax-datatables-rails gem
# now the method checks if the column is the created_at and generate a custom SQL to parse
@ -361,7 +365,7 @@ class SampleDatatable < AjaxDatatablesRails::Base
end
def sorting_by_custom_column
params[:order].values[0]["column"].to_i > 6
sort_column(params[:order].values[0]) == 'SampleCustomField.value'
end
# Escapes special characters in search query
@ -371,4 +375,25 @@ class SampleDatatable < AjaxDatatablesRails::Base
params[:search][:value]) if params[:search]
.present?
end
def new_sort_column(item)
coli = item[:column].to_i - 1
model, column = sortable_columns[sortable_displayed_columns[coli].to_i]
.split('.')
return model if model == ASSIGNED_SORT_COL
col = [model.constantize.table_name, column].join('.')
end
def generate_sortable_displayed_columns
sort_order = SamplesTable.where(user: @user,
organization: @organization)
.pluck(:status)
.first['ColReorder']
sort_order.shift
sort_order.map! { |i| (i.to_i - 1).to_s }
@sortable_displayed_columns = sort_order
end
end