Fixes #3663 - Custom date attributes provide inconsistent sorting within grouping.
This commit is contained in:
parent
b238e695eb
commit
58c685f833
3 changed files with 56 additions and 18 deletions
|
@ -504,24 +504,33 @@ class App.ControllerTable extends App.Controller
|
||||||
groupLastName = ''
|
groupLastName = ''
|
||||||
tableBody = []
|
tableBody = []
|
||||||
objectsToShow = @objectsOfPage(@pagerShownPage)
|
objectsToShow = @objectsOfPage(@pagerShownPage)
|
||||||
for object in objectsToShow
|
if @groupBy
|
||||||
objectActions = []
|
# group by raw (and not printable) value so dates work also
|
||||||
|
objectsGrouped = _.groupBy(objectsToShow, (object) => object[@groupBy])
|
||||||
|
else
|
||||||
|
objectsGrouped = { '': objectsToShow }
|
||||||
|
|
||||||
if object
|
for groupValue in Object.keys(objectsGrouped).sort()
|
||||||
position++
|
groupObjects = objectsGrouped[groupValue]
|
||||||
if @groupBy
|
|
||||||
groupByName = @groupObjectName(object, @groupBy)
|
|
||||||
if groupLastName isnt groupByName
|
|
||||||
groupLastName = groupByName
|
|
||||||
tableBody.push @renderTableGroupByRow(object, position, groupByName)
|
|
||||||
for action in @actions
|
|
||||||
# Check if the available key is used, it can be a Boolean or a function which should be called.
|
|
||||||
if !action.available? || action.available == true
|
|
||||||
objectActions.push action
|
|
||||||
else if typeof action.available is 'function' && action.available(object) == true
|
|
||||||
objectActions.push action
|
|
||||||
|
|
||||||
tableBody.push @renderTableRow(object, position, objectActions)
|
for object in groupObjects
|
||||||
|
objectActions = []
|
||||||
|
|
||||||
|
if object
|
||||||
|
position++
|
||||||
|
if @groupBy
|
||||||
|
groupByName = @groupObjectName(object, @groupBy)
|
||||||
|
if groupLastName isnt groupByName
|
||||||
|
groupLastName = groupByName
|
||||||
|
tableBody.push @renderTableGroupByRow(object, position, groupByName)
|
||||||
|
for action in @actions
|
||||||
|
# Check if the available key is used, it can be a Boolean or a function which should be called.
|
||||||
|
if !action.available? || action.available == true
|
||||||
|
objectActions.push action
|
||||||
|
else if typeof action.available is 'function' && action.available(object) == true
|
||||||
|
objectActions.push action
|
||||||
|
|
||||||
|
tableBody.push @renderTableRow(object, position, objectActions)
|
||||||
tableBody
|
tableBody
|
||||||
|
|
||||||
renderTableGroupByRow: (object, position, groupByName) =>
|
renderTableGroupByRow: (object, position, groupByName) =>
|
||||||
|
|
|
@ -370,8 +370,8 @@ test('table test', function() {
|
||||||
groupBy: 'priority',
|
groupBy: 'priority',
|
||||||
groupDirection: 'DESC',
|
groupDirection: 'DESC',
|
||||||
})
|
})
|
||||||
equal(el.find('tbody > tr:nth-child(1) > td:nth-child(1)').text().trim(), '2 normal', 'check row 1')
|
equal(el.find('tbody > tr:nth-child(1) > td:nth-child(1)').text().trim(), '1 niedrig', 'check row 1')
|
||||||
equal(el.find('tbody > tr:nth-child(3) > td:nth-child(1)').text().trim(), '1 niedrig', 'check row 3')
|
equal(el.find('tbody > tr:nth-child(4) > td:nth-child(1)').text().trim(), '2 normal', 'check row 3')
|
||||||
|
|
||||||
$('#table').append('<hr><h1>table Group By Direction ASC</h1><div id="table7"></div>')
|
$('#table').append('<hr><h1>table Group By Direction ASC</h1><div id="table7"></div>')
|
||||||
el = $('#table7')
|
el = $('#table7')
|
||||||
|
|
|
@ -344,4 +344,33 @@ RSpec.describe 'Ticket views', type: :system do
|
||||||
expect(page).to have_text(ticket.title, wait: 10)
|
expect(page).to have_text(ticket.title, wait: 10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'Grouping' do
|
||||||
|
context 'when sorted by custom object date', authenticated_as: :authenticate, db_strategy: :reset do
|
||||||
|
let(:ticket1) { create(:ticket, group: Group.find_by(name: 'Users'), cdate: '2018-01-17') }
|
||||||
|
let(:ticket2) { create(:ticket, group: Group.find_by(name: 'Users'), cdate: '2018-08-19') }
|
||||||
|
let(:ticket3) { create(:ticket, group: Group.find_by(name: 'Users'), cdate: '2019-01-19') }
|
||||||
|
let(:ticket4) { create(:ticket, group: Group.find_by(name: 'Users'), cdate: '2021-08-18') }
|
||||||
|
|
||||||
|
def authenticate
|
||||||
|
create :object_manager_attribute_date, name: 'cdate'
|
||||||
|
ObjectManager::Attribute.migration_execute
|
||||||
|
ticket4
|
||||||
|
ticket3
|
||||||
|
ticket2
|
||||||
|
ticket1
|
||||||
|
Overview.find_by(link: 'all_unassigned').update(group_by: 'cdate')
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does show the date groups sorted' do
|
||||||
|
visit 'ticket/view/all_unassigned'
|
||||||
|
text = page.find('.js-tableBody').text(:all)
|
||||||
|
|
||||||
|
expect(text.index('01/17/2018') < text.index('08/19/2018')).to eq(true)
|
||||||
|
expect(text.index('08/19/2018') < text.index('01/19/2019')).to eq(true)
|
||||||
|
expect(text.index('01/19/2019') < text.index('08/18/2021')).to eq(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue