Fixes #3869 - Overview select fields are sorted by key.

This commit is contained in:
Rolf Schmidt 2021-12-10 11:29:21 +01:00 committed by Dominik Klein
parent c71be5b808
commit 4e2f310fbd
2 changed files with 44 additions and 13 deletions

View file

@ -493,16 +493,6 @@ class App.ControllerTable extends App.Controller
sortable: @dndCallback
))
getGroupByKeyName: (object, groupBy) ->
reference_key = groupBy + '_id'
if reference_key of object
attribute = _.findWhere(object.constructor.configure_attributes, { name: reference_key })
return App[attribute.relation]?.find(object[reference_key])?.displayName() || reference_key
groupBy
sortObjectKeys: (objects, direction) ->
sorted = Object.keys(objects).sort()
@ -525,7 +515,7 @@ class App.ControllerTable extends App.Controller
objectsToShow = @objectsOfPage(@pagerShownPage)
if @groupBy
# group by raw (and not printable) value so dates work also
objectsGrouped = _.groupBy(objectsToShow, (object) => object[@getGroupByKeyName(object, @groupBy)])
objectsGrouped = _.groupBy(objectsToShow, (object) => @groupObjectName(object, @groupBy, excludeTags: ['date', 'datetime']))
else
objectsGrouped = { '': objectsToShow }
@ -865,11 +855,15 @@ class App.ControllerTable extends App.Controller
@objects = localObjects
@lastSortedobjects = localObjects
groupObjectName: (object, key = undefined) ->
groupObjectName: (object, key = undefined, options = {}) ->
group = object
if key
if key not of object
key += '_id'
# return internal value if needed
return object[key] if options.excludeTags && _.find(@attributesList, (attr) -> attr.name == key && _.contains(options.excludeTags, attr.tag))
group = App.viewPrint(object, key, @attributesList)
if _.isEmpty(group)
group = ''

View file

@ -363,7 +363,7 @@ RSpec.describe 'Ticket views', type: :system do
true
end
it 'does show the date groups sorted' do
it 'does show the values grouped and sorted by date key value (yyy-mm-dd) instead of display value' do
visit 'ticket/view/all_unassigned'
text = page.find('.js-tableBody').text(:all)
@ -372,5 +372,42 @@ RSpec.describe 'Ticket views', type: :system do
expect(text.index('01/19/2019') < text.index('08/18/2021')).to eq(true)
end
end
context 'when sorted by custom object select', authenticated_as: :authenticate, db_strategy: :reset do
let(:ticket1) { create(:ticket, group: Group.find_by(name: 'Users'), cselect: 'a') }
let(:ticket2) { create(:ticket, group: Group.find_by(name: 'Users'), cselect: 'b') }
let(:ticket3) { create(:ticket, group: Group.find_by(name: 'Users'), cselect: 'c') }
def authenticate
create :object_manager_attribute_select, name: 'cselect', data_option: {
'default' => '',
'options' => {
'a' => 'Zzz a',
'b' => 'Yyy b',
'c' => 'Xxx c',
},
'relation' => '',
'nulloption' => true,
'multiple' => false,
'null' => true,
'translate' => true,
'maxlength' => 255
}
ObjectManager::Attribute.migration_execute
ticket1
ticket2
ticket3
Overview.find_by(link: 'all_unassigned').update(group_by: 'cselect')
true
end
it 'does show the values grouped and sorted by display value instead of key value' do
visit 'ticket/view/all_unassigned'
text = page.find('.js-tableBody').text(:all)
expect(text.index('Xxx c') < text.index('Yyy b')).to eq(true)
expect(text.index('Yyy b') < text.index('Zzz a')).to eq(true)
end
end
end
end