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
per_page = 7
if params[:current]
@domain = Domain.find(params[:domain_id] || params[:id])
@version = nil
else
@version = Version::DomainVersion.find(params[:id])
@versions = Version::DomainVersion.where(item_id: @version.item_id).order(created_at: :desc, id: :desc)
@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)
# what we do is calc amount of results until needed version
# then we cacl which page it is
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 += 1 if (counter % per_page) != 0
params[:page] = page

View file

@ -54,10 +54,22 @@ module Admin
def versions
@domain = Domain.where(id: params[:domain_id]).includes({ versions: :item }).first
@versions = @domain.versions
@last_version = @versions.last
@old_versions = Kaminari.paginate_array(@versions.not_creates.reverse)
.page(params[: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
def download

View file

@ -1,54 +1,64 @@
- domain = ObjectVersionsParser.new(@version).parse
- if @version
- children = HashWithIndifferentAccess.new(@version.children)
- nameservers = Nameserver.all_versions_for(children[:nameservers], @version.created_at)
- dnskeys = Dnskey.all_versions_for(children[:dnskeys], @version.created_at)
- tech_contacts = Contact.all_versions_for(children[:tech_contacts], @version.created_at)
- admin_contacts = Contact.all_versions_for(children[:admin_contacts], @version.created_at)
- registrant = Contact.all_versions_for(children[:registrant], @version.created_at)
- nameservers = Nameserver.all_versions_for(children[:nameservers], @domain.updated_at)
- dnskeys = Dnskey.all_versions_for(children[:dnskeys], @domain.updated_at)
- tech_contacts = Contact.all_versions_for(children[:tech_contacts], @domain.updated_at)
- admin_contacts = Contact.all_versions_for(children[:admin_contacts], @domain.updated_at)
- registrant = Contact.all_versions_for(children[:registrant], @domain.updated_at)
- event = @version.event
- 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
.col-md-8
.panel.panel-default{:style => "min-height:450px;"}
.panel-heading
%h3.panel-title
- if @version
= l(@version.created_at, format: :short)
= event
= creator
- else
= t('current_state')
= creator
.panel-body
%dl.dl-horizontal
%dt= t(:name)
- if !domain.name
- if !@domain.name
- domain_name = Domain.find(@version.item_id).try(:name)
- else
- domain_name = domain.name
%dd= link_to(domain_name, admin_domain_path(@version.item_id))
- domain_name = @domain.name
%dd= link_to(domain_name, admin_domain_path(@version ? @version.item_id : @domain.id))
%dt= t('.created')
%dd
= l(domain.created_at, format: :short)
= l(@domain.created_at, format: :short)
%dt= t('.updated')
%dd
= l(domain.updated_at, format: :short)
= l(@domain.updated_at, format: :short)
%br
%dt= t(:statuses)
%dd{class: changing_css_class(@version,"statuses")}
- if domain.statuses.present?
- domain.statuses.each do |s|
- if @domain.statuses.present?
- @domain.statuses.each do |s|
= s
%dt= "Status notes"
%dd{class: changing_css_class(@version,"statuses")}
- if domain.status_notes.present?
- domain.status_notes.each do |s|
- if @domain.status_notes.present?
- @domain.status_notes.each do |s|
= s
%dt= t('.registrant')
@ -102,21 +112,21 @@
\...#{ns[:public_key].to_s[-20,20]}
%br
- if domain.registrar
- if @domain.registrar
%dt= t(:registrar_name)
%dd{class: changing_css_class(@version,"registrar_id")}
= link_to admin_registrar_path(domain.registrar), target: "registrar_#{domain.registrar.id}" do
= domain.registrar.name
= link_to admin_registrar_path(@domain.registrar), target: "registrar_#{@domain.registrar.id}" do
= @domain.registrar.name
%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),
admin_domain_version_path(prev),
class: 'btn btn-primary')
- else
%a.btn.btn-primary.disabled{:href => "#"}
%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),
admin_domain_version_path(nxt),
class: 'btn btn-default')
@ -127,8 +137,10 @@
.col-md-4
.panel.panel-default{:style => "min-height:450px;"}
%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|
%li{class: (vs.id == @version.id) && :active}
%li{class: (@version && vs.id == @version.id) && :active}
= link_to admin_domain_version_path(vs) do
= l(vs.created_at, format: :short)
= vs.event

View file

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

View file

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