Fix domain history ordering and current state display

- Ensure "Current state" (pending/current domain) is always shown as the first row in domain history.
- Sort post-update domain states by updated_at descending for correct chronological order.
- Fix version navigation and sidebar highlighting for current state in domain version show view.
- Unify logic for displaying domain and contact data in both history and single version views.
- Remove legacy ObjectVersionsParser usage and handle nil @version cases gracefully.
- Refactor partials and controller logic to ensure all rows in history reflect the correct post-update state.
This commit is contained in:
oleghasjanov 2025-07-17 09:07:40 +03:00
parent 0b13cfbe0f
commit 9e5b2743a3
6 changed files with 74 additions and 45 deletions

View file

@ -56,14 +56,18 @@ module Admin
def show def show
per_page = 7 per_page = 7
@version = Version::DomainVersion.find(params[:id]) if params[:current]
@versions = Version::DomainVersion.where(item_id: @version.item_id).order(created_at: :desc, id: :desc) @domain = Domain.find(params[:domain_id] || params[:id])
@version = nil
else
@version = Version::DomainVersion.find(params[:id])
@domain = Domain.find(@version.item_id)
end
@versions = Version::DomainVersion.where(item_id: @domain.id).order(created_at: :desc, id: :desc)
@versions_map = @versions.all.map(&:id) @versions_map = @versions.all.map(&:id)
# what we do is calc amount of results until needed version
# then we cacl which page it is
if params[:page].blank? if params[:page].blank?
counter = @versions_map.index(@version.id) + 1 counter = @version ? (@versions_map.index(@version.id) + 1) : 1
page = counter / per_page page = counter / per_page
page += 1 if (counter % per_page) != 0 page += 1 if (counter % per_page) != 0
params[:page] = page params[:page] = page

View file

@ -54,10 +54,22 @@ module Admin
def versions def versions
@domain = Domain.where(id: params[:domain_id]).includes({ versions: :item }).first @domain = Domain.where(id: params[:domain_id]).includes({ versions: :item }).first
@versions = @domain.versions @versions = @domain.versions
@last_version = @versions.last
@old_versions = Kaminari.paginate_array(@versions.not_creates.reverse) @old_versions = Kaminari.paginate_array(@versions.not_creates.reverse)
.page(params[:page]) .page(params[:page])
.per(DEFAULT_VERSIONS_PER_PAGE) .per(DEFAULT_VERSIONS_PER_PAGE)
@post_update_domains = []
old_versions_arr = @old_versions.to_a
old_versions_arr.each_with_index do |version, idx|
next_version = old_versions_arr[idx - 1] # reverse order!
if next_version
@post_update_domains << (next_version.reify || @domain)
else
@post_update_domains << @domain
end
end
@post_update_domains.sort_by! { |d| -d.updated_at.to_i }
end end
def download def download

View file

@ -90,4 +90,4 @@
= paginate @versions = paginate @versions
.col-md-6.text-right .col-md-6.text-right
.pagination .pagination
= t(:result_count, count: @versions.total_count) = t(:result_count, count: @versions.total_count)

View file

@ -1,54 +1,64 @@
- domain = ObjectVersionsParser.new(@version).parse
- if @version - if @version
- children = HashWithIndifferentAccess.new(@version.children) - children = HashWithIndifferentAccess.new(@version.children)
- nameservers = Nameserver.all_versions_for(children[:nameservers], @version.created_at) - nameservers = Nameserver.all_versions_for(children[:nameservers], @domain.updated_at)
- dnskeys = Dnskey.all_versions_for(children[:dnskeys], @version.created_at) - dnskeys = Dnskey.all_versions_for(children[:dnskeys], @domain.updated_at)
- tech_contacts = Contact.all_versions_for(children[:tech_contacts], @version.created_at) - tech_contacts = Contact.all_versions_for(children[:tech_contacts], @domain.updated_at)
- admin_contacts = Contact.all_versions_for(children[:admin_contacts], @version.created_at) - admin_contacts = Contact.all_versions_for(children[:admin_contacts], @domain.updated_at)
- registrant = Contact.all_versions_for(children[:registrant], @version.created_at) - registrant = Contact.all_versions_for(children[:registrant], @domain.updated_at)
- event = @version.event - event = @version.event
- creator = plain_username(@version.terminator) - creator = plain_username(@version.terminator)
- else
- nameservers = @domain.nameservers
- dnskeys = @domain.dnskeys
- tech_contacts = @domain.tech_contacts
- admin_contacts = @domain.admin_contacts
- registrant = [@domain.registrant]
- event = t('current_state')
- creator = @domain.creator_str
= render 'shared/title', name: domain.name = render 'shared/title', name: @domain.name
.row .row
.col-md-8 .col-md-8
.panel.panel-default{:style => "min-height:450px;"} .panel.panel-default{:style => "min-height:450px;"}
.panel-heading .panel-heading
%h3.panel-title %h3.panel-title
= l(@version.created_at, format: :short) - if @version
= event = l(@version.created_at, format: :short)
= creator = event
= creator
- else
= t('current_state')
= creator
.panel-body .panel-body
%dl.dl-horizontal %dl.dl-horizontal
%dt= t(:name) %dt= t(:name)
- if !domain.name - if !@domain.name
- domain_name = Domain.find(@version.item_id).try(:name) - domain_name = Domain.find(@version.item_id).try(:name)
- else - else
- domain_name = domain.name - domain_name = @domain.name
%dd= link_to(domain_name, admin_domain_path(@version.item_id)) %dd= link_to(domain_name, admin_domain_path(@version ? @version.item_id : @domain.id))
%dt= t('.created') %dt= t('.created')
%dd %dd
= l(domain.created_at, format: :short) = l(@domain.created_at, format: :short)
%dt= t('.updated') %dt= t('.updated')
%dd %dd
= l(domain.updated_at, format: :short) = l(@domain.updated_at, format: :short)
%br %br
%dt= t(:statuses) %dt= t(:statuses)
%dd{class: changing_css_class(@version,"statuses")} %dd{class: changing_css_class(@version,"statuses")}
- if domain.statuses.present? - if @domain.statuses.present?
- domain.statuses.each do |s| - @domain.statuses.each do |s|
= s = s
%dt= "Status notes" %dt= "Status notes"
%dd{class: changing_css_class(@version,"statuses")} %dd{class: changing_css_class(@version,"statuses")}
- if domain.status_notes.present? - if @domain.status_notes.present?
- domain.status_notes.each do |s| - @domain.status_notes.each do |s|
= s = s
%dt= t('.registrant') %dt= t('.registrant')
@ -102,21 +112,21 @@
\...#{ns[:public_key].to_s[-20,20]} \...#{ns[:public_key].to_s[-20,20]}
%br %br
- if domain.registrar - if @domain.registrar
%dt= t(:registrar_name) %dt= t(:registrar_name)
%dd{class: changing_css_class(@version,"registrar_id")} %dd{class: changing_css_class(@version,"registrar_id")}
= link_to admin_registrar_path(domain.registrar), target: "registrar_#{domain.registrar.id}" do = link_to admin_registrar_path(@domain.registrar), target: "registrar_#{@domain.registrar.id}" do
= domain.registrar.name = @domain.registrar.name
%span{:style => "margin: 20px 20px; clear:both;"} %span{:style => "margin: 20px 20px; clear:both;"}
- if (prev = @versions_map[(@versions_map.index(@version.id) - 1)]) && @versions_map.index(@version.id) != 0 - if @version && (prev = @versions_map[(@versions_map.index(@version.id) - 1)]) && @versions_map.index(@version.id) != 0
= link_to(t(:previous), = link_to(t(:previous),
admin_domain_version_path(prev), admin_domain_version_path(prev),
class: 'btn btn-primary') class: 'btn btn-primary')
- else - else
%a.btn.btn-primary.disabled{:href => "#"} %a.btn.btn-primary.disabled{:href => "#"}
%span= t(:previous) %span= t(:previous)
- if nxt = @versions_map[(@versions_map.index(@version.id) + 1)] - if @version && (nxt = @versions_map[(@versions_map.index(@version.id) + 1)])
= link_to(t(:next), = link_to(t(:next),
admin_domain_version_path(nxt), admin_domain_version_path(nxt),
class: 'btn btn-default') class: 'btn btn-default')
@ -127,10 +137,12 @@
.col-md-4 .col-md-4
.panel.panel-default{:style => "min-height:450px;"} .panel.panel-default{:style => "min-height:450px;"}
%ul.nav.nav-pills.nav-stacked %ul.nav.nav-pills.nav-stacked
%li{class: ('active' if @version.nil?)}
= link_to t('current_state'), admin_domain_version_path(current: 1, domain_id: @domain.id)
- @versions.each do |vs| - @versions.each do |vs|
%li{class: (vs.id == @version.id) && :active} %li{class: (@version && vs.id == @version.id) && :active}
= link_to admin_domain_version_path(vs) do = link_to admin_domain_version_path(vs) do
= l(vs.created_at, format: :short) = l(vs.created_at, format: :short)
= vs.event = vs.event
%span{:style => "padding-left:10px; position: absolute; bottom: 10px;"} %span{:style => "padding-left:10px; position: absolute; bottom: 10px;"}
= paginate @versions = paginate @versions

View file

@ -15,18 +15,19 @@
- event = version.event - event = version.event
- creator = plain_username(version.terminator) - creator = plain_username(version.terminator)
- whodunnit = version.try(:whodunnit) - whodunnit = version.try(:whodunnit)
- else # pending history - else # current version
- epp_req = false - epp_req = false
- nameservers = domain.nameservers - nameservers = domain.nameservers
- dnskeys = domain.dnskeys - dnskeys = domain.dnskeys
- tech_contacts = domain.tech_contacts - if defined?(@last_version) && @last_version
- admin_contacts = domain.admin_contacts - children = HashWithIndifferentAccess.new(@last_version.children)
- registrant = domain.registrant - tech_contacts = Contact.all_versions_for(children[:tech_contacts], @last_version.created_at)
- unless registrant - admin_contacts = Contact.all_versions_for(children[:admin_contacts], @last_version.created_at)
- ver = Version::ContactVersion.where(item_id: domain.registrant_id).where(event: :destroy).last - registrant = Contact.all_versions_for(children[:registrant], @last_version.created_at)
- registrant = ver.reify - else
- registrant.version_loader = ver - tech_contacts = domain.tech_contacts
- registrant = [registrant] - admin_contacts = domain.admin_contacts
- registrant = [domain.registrant]
- creator = pending_user.try(:username) - creator = pending_user.try(:username)
- event = 'pending' - event = 'pending'
- whodunnit = false - whodunnit = false

View file

@ -32,10 +32,10 @@
domain: @domain, version: @last_version domain: @domain, version: @last_version
-# all other older versions -# all other older versions
- @old_versions.each do |version| - @old_versions.each_with_index do |version, idx|
%tr.small %tr.small
= render 'admin/domains/partials/version', = render 'admin/domains/partials/version',
domain: version.reify, version: version.previous domain: @post_update_domains[idx], version: version
.row .row
.col-md-6 .col-md-6