fix hound

This commit is contained in:
zmagod 2018-03-09 14:43:12 +01:00
parent 4f951f6679
commit 0baa7a1f99
4 changed files with 95 additions and 59 deletions

View file

@ -13,15 +13,18 @@ module RepositoryDatatableHelper
'2': escape_input(record.name), '2': escape_input(record.name),
'3': I18n.l(record.created_at, format: :full), '3': I18n.l(record.created_at, format: :full),
'4': escape_input(record.created_by.full_name), '4': escape_input(record.created_by.full_name),
'recordEditUrl': 'recordEditUrl': Rails.application.routes.url_helpers
Rails.application.routes.url_helpers .edit_repository_repository_row_path(
.edit_repository_repository_row_path(repository, repository,
record.id), record.id
'recordUpdateUrl': ),
Rails.application.routes.url_helpers 'recordUpdateUrl': Rails.application.routes.url_helpers
.repository_repository_row_path(repository, record.id), .repository_repository_row_path(
'recordInfoUrl': repository,
Rails.application.routes.url_helpers.repository_row_path(record.id) record.id
),
'recordInfoUrl': Rails.application.routes.url_helpers
.repository_row_path(record.id)
} }
# Add custom columns # Add custom columns

View file

@ -14,7 +14,8 @@ class RepositoryDatatableService
private private
def create_columns_mappings def create_columns_mappings
# Make mappings of custom columns, so we have same id for every column # Make mappings of custom columns, so we have same id for every
# column
i = 5 i = 5
@mappings = {} @mappings = {}
@repository.repository_columns.order(:id).each do |column| @repository.repository_columns.order(:id).each do |column|
@ -24,9 +25,8 @@ class RepositoryDatatableService
end end
def process_query def process_query
contitions = build_conditions(@params) order_obj = build_conditions(@params)[:order_by_column]
order_obj = contitions[:order_by_column] search_value = build_conditions(@params)[:search_value]
search_value = contitions[:search_value]
if search_value.present? if search_value.present?
@repository_rows = sort_rows(order_obj, search(search_value)) @repository_rows = sort_rows(order_obj, search(search_value))
else else
@ -53,7 +53,8 @@ class RepositoryDatatableService
else else
@assigned_rows = repository_rows.joins( @assigned_rows = repository_rows.joins(
'INNER JOIN my_module_repository_rows ON 'INNER JOIN my_module_repository_rows ON
(repository_rows.id = my_module_repository_rows.repository_row_id)' (repository_rows.id =
my_module_repository_rows.repository_row_id)'
) )
end end
repository_rows repository_rows
@ -61,8 +62,10 @@ class RepositoryDatatableService
def search(value) def search(value)
includes_json = { includes_json = {
repository_cells: [:repository_text_value, repository_cells: [
repository_list_value: :repository_list_item ] :repository_text_value,
repository_list_value: :repository_list_item
]
} }
RepositoryRow .left_outer_joins(:created_by) RepositoryRow .left_outer_joins(:created_by)
.left_outer_joins(includes_json) .left_outer_joins(includes_json)
@ -98,7 +101,9 @@ class RepositoryDatatableService
end end
def sort_rows(column_obj, records) def sort_rows(column_obj, records)
dir = %w[DESC ASC].find { |dir| dir == column_obj[:dir].upcase } || 'ASC' dir = %w(DESC ASC).find do |dir|
dir == column_obj[:dir].upcase
end || 'ASC'
column_index = column_obj[:column] column_index = column_obj[:column]
col_order = @repository.repository_table_states col_order = @repository.repository_table_states
.find_by_user_id(@user.id) .find_by_user_id(@user.id)
@ -106,17 +111,22 @@ class RepositoryDatatableService
column_id = col_order[column_index].to_i column_id = col_order[column_index].to_i
if sortable_columns[column_id - 1] == 'assigned' if sortable_columns[column_id - 1] == 'assigned'
return records if @my_module && @params[:assigned] == 'assigned' if @my_module && @params[:assigned] == 'assigned'
return records
end
if @my_module if @my_module
# Depending on the sort, order nulls first or # Depending on the sort, order nulls first or
# nulls last on repository_cells association # nulls last on repository_cells association
return records.joins( return records.joins(
"LEFT OUTER JOIN my_module_repository_rows ON "LEFT OUTER JOIN my_module_repository_rows ON
(repository_rows.id = my_module_repository_rows.repository_row_id (repository_rows.id =
AND (my_module_repository_rows.my_module_id = #{@my_module.id} OR my_module_repository_rows.repository_row_id
my_module_repository_rows.id IS NULL))" AND (my_module_repository_rows.my_module_id =
#{@my_module.id}
OR my_module_repository_rows.id IS NULL))"
).order( ).order(
"my_module_repository_rows.id NULLS #{sort_null_direction(dir)}" "my_module_repository_rows.id NULLS
#{sort_null_direction(dir)}"
) )
else else
return sort_assigned_records(records, dir) return sort_assigned_records(records, dir)
@ -127,12 +137,16 @@ class RepositoryDatatableService
return records unless type return records unless type
return select_type(type.data_type, records, id, dir) return select_type(type.data_type, records, id, dir)
else else
return records.order("#{sortable_columns[column_id - 1]} #{dir}") return records.order(
"#{sortable_columns[column_id - 1]} #{dir}"
)
end end
end end
def sort_assigned_records(records, direction) def sort_assigned_records(records, direction)
assigned = records.joins(:my_module_repository_rows).distinct.pluck(:id) assigned = records.joins(:my_module_repository_rows)
.distinct
.pluck(:id)
unassigned = records.where.not(id: assigned).pluck(:id) unassigned = records.where.not(id: assigned).pluck(:id)
if direction == 'ASC' if direction == 'ASC'
ids = assigned + unassigned ids = assigned + unassigned
@ -149,10 +163,14 @@ class RepositoryDatatableService
end end
def select_type(type, records, id, dir) def select_type(type, records, id, dir)
return filter_by_text_value( case type
records, id, dir) if type == 'RepositoryTextValue' when 'RepositoryTextValue'
return filter_by_list_value( filter_by_text_value(records, id, dir)
records, id, dir) if type == 'RepositoryListValue' when 'RepositoryListValue'
filter_by_list_value(records, id, dir)
else
records
end
end end
def sort_null_direction(val) def sort_null_direction(val)
@ -160,7 +178,7 @@ class RepositoryDatatableService
end end
def filter_by_text_value(records, id, dir) def filter_by_text_value(records, id, dir)
return records.joins( records.joins(
"LEFT OUTER JOIN (SELECT repository_cells.repository_row_id, "LEFT OUTER JOIN (SELECT repository_cells.repository_row_id,
repository_text_values.data AS value repository_text_values.data AS value
FROM repository_cells FROM repository_cells
@ -172,7 +190,7 @@ class RepositoryDatatableService
end end
def filter_by_list_value(records, id, dir) def filter_by_list_value(records, id, dir)
return records.joins( records.joins(
"LEFT OUTER JOIN (SELECT repository_cells.repository_row_id, "LEFT OUTER JOIN (SELECT repository_cells.repository_row_id,
repository_list_items.data AS value repository_list_items.data AS value
FROM repository_cells FROM repository_cells

View file

@ -98,11 +98,10 @@ RSpec.describe RepositoryListValue, type: :model do
it 'retuns only the the item related to the list' do it 'retuns only the the item related to the list' do
repository_row_two = create :repository_row, name: 'New row' repository_row_two = create :repository_row, name: 'New row'
repository_list_value_two = create :repository_list_value, repository_cell_attributes: {
create :repository_list_value, repository_cell_attributes: { repository_column: repository_column,
repository_column: repository_column, repository_row: repository_row_two
repository_row: repository_row_two }
}
list_item = create :repository_list_item, list_item = create :repository_list_item,
data: 'new item', data: 'new item',
repository: repository, repository: repository,
@ -113,10 +112,9 @@ RSpec.describe RepositoryListValue, type: :model do
end end
it 'returns an empty string if no item selected' do it 'returns an empty string if no item selected' do
list_item = create :repository_list_item, create :repository_list_item, data: 'my item',
data: 'my item', repository: repository,
repository: repository, repository_column: repository_column
repository_column: repository_column
expect(repository_list_value.reload.data).to be_nil expect(repository_list_value.reload.data).to be_nil
end end

View file

@ -4,10 +4,13 @@ describe RepositoryDatatableService do
let!(:team) { create :team } let!(:team) { create :team }
let!(:user) { create :user, email: 'user_one@asdf.com' } let!(:user) { create :user, email: 'user_one@asdf.com' }
let!(:repository) do let!(:repository) do
create :repository, name: 'my repo', created_by: user, team: team create :repository, name: 'my repo',
created_by: user,
team: team
end end
let!(:repository_column) do let!(:repository_column) do
create :repository_column, name: 'My column', data_type: :RepositoryListValue create :repository_column, name: 'My column',
data_type: :RepositoryListValue
end end
let!(:repository_state) do let!(:repository_state) do
RepositoryTableState.create( RepositoryTableState.create(
@ -29,33 +32,41 @@ describe RepositoryDatatableService do
last_modified_by: user last_modified_by: user
end end
let!(:list_item) do let!(:list_item) do
create :repository_list_item, data: 'bug', create :repository_list_item,
repository: repository, data: 'bug',
repository_column: repository_column, repository: repository,
created_by: user, repository_column: repository_column,
last_modified_by: user created_by: user,
last_modified_by: user
end end
let!(:repository_list_value) do let!(:repository_list_value) do
create :repository_list_value, repository_list_item: list_item, create :repository_list_value,
created_by: user, repository_list_item: list_item,
last_modified_by: user, created_by: user,
repository_cell_attributes: { last_modified_by: user,
repository_column: repository_column, repository_cell_attributes: {
repository_row: repository_row repository_column: repository_column,
} repository_row: repository_row
}
end end
context 'object' do context 'object' do
let(:params) do let(:params) do
{ order: { 0 => { column: '2', dir: 'asc' } }, search: { value: 'row' } } { order: { 0 => { column: '2', dir: 'asc' } },
search: { value: 'row' } }
end
let(:subject) do
RepositoryDatatableService.new(repository, params, user)
end end
let(:subject) { RepositoryDatatableService.new(repository, params, user) }
describe '#build_conditions/1' do describe '#build_conditions/1' do
it 'parsers the contitions' do it 'parsers the contitions' do
contitions = subject.send(:build_conditions, params) contitions = subject.send(:build_conditions, params)
expect(contitions[:search_value]).to eq 'row' expect(contitions[:search_value]).to eq 'row'
expect(contitions[:order_by_column]).to eq({ column: 2, dir: 'asc' }) expect(contitions[:order_by_column]).to eq(
{ column: 2, dir: 'asc' }
)
end end
end end
@ -83,7 +94,9 @@ describe RepositoryDatatableService do
it 'is ordered by row name asc' do it 'is ordered by row name asc' do
params = { order: { 0 => { column: '2', dir: 'asc' } }, params = { order: { 0 => { column: '2', dir: 'asc' } },
search: { value: '' } } search: { value: '' } }
subject = RepositoryDatatableService.new(repository, params, user) subject = RepositoryDatatableService.new(repository,
params,
user)
expect(subject.repository_rows.first.name).to eq 'A row' expect(subject.repository_rows.first.name).to eq 'A row'
expect(subject.repository_rows.last.name).to eq 'B row' expect(subject.repository_rows.last.name).to eq 'B row'
end end
@ -91,7 +104,9 @@ describe RepositoryDatatableService do
it 'is ordered by row name desc' do it 'is ordered by row name desc' do
params = { order: { 0 => { column: '2', dir: 'desc' } }, params = { order: { 0 => { column: '2', dir: 'desc' } },
search: { value: '' } } search: { value: '' } }
subject = RepositoryDatatableService.new(repository, params, user) subject = RepositoryDatatableService.new(repository,
params,
user)
expect(subject.repository_rows.first.name).to eq 'B row' expect(subject.repository_rows.first.name).to eq 'B row'
expect(subject.repository_rows.last.name).to eq 'A row' expect(subject.repository_rows.last.name).to eq 'A row'
end end
@ -108,7 +123,9 @@ describe RepositoryDatatableService do
it 'returns only the searched entity' do it 'returns only the searched entity' do
params = { order: { 0 => { column: '2', dir: 'desc' } }, params = { order: { 0 => { column: '2', dir: 'desc' } },
search: { value: 'test' } } search: { value: 'test' } }
subject = RepositoryDatatableService.new(repository, params, user) subject = RepositoryDatatableService.new(repository,
params,
user)
expect(subject.repository_rows.first.name).to eq 'test' expect(subject.repository_rows.first.name).to eq 'test'
expect(subject.repository_rows.count).to eq 1 expect(subject.repository_rows.count).to eq 1
end end