From 9e5b2743a392d50ea22bea9d49a7bfc26db887ed Mon Sep 17 00:00:00 2001 From: oleghasjanov Date: Thu, 17 Jul 2025 09:07:40 +0300 Subject: [PATCH] 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. --- .../admin/domain_versions_controller.rb | 14 ++-- app/controllers/admin/domains_controller.rb | 14 +++- app/views/admin/domain_versions/archive.haml | 2 +- app/views/admin/domain_versions/show.haml | 66 +++++++++++-------- .../admin/domains/partials/_version.haml | 19 +++--- app/views/admin/domains/versions.haml | 4 +- 6 files changed, 74 insertions(+), 45 deletions(-) diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index eb976ecb7..9579d26ad 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -56,14 +56,18 @@ module Admin def show per_page = 7 - @version = Version::DomainVersion.find(params[:id]) - @versions = Version::DomainVersion.where(item_id: @version.item_id).order(created_at: :desc, id: :desc) + if params[:current] + @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) - # 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 diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index 58a482dc6..07d646552 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -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 diff --git a/app/views/admin/domain_versions/archive.haml b/app/views/admin/domain_versions/archive.haml index 85105b9f0..1b80c59c7 100644 --- a/app/views/admin/domain_versions/archive.haml +++ b/app/views/admin/domain_versions/archive.haml @@ -90,4 +90,4 @@ = paginate @versions .col-md-6.text-right .pagination - = t(:result_count, count: @versions.total_count) + = t(:result_count, count: @versions.total_count) \ No newline at end of file diff --git a/app/views/admin/domain_versions/show.haml b/app/views/admin/domain_versions/show.haml index 644144b90..1dfdc4d52 100644 --- a/app/views/admin/domain_versions/show.haml +++ b/app/views/admin/domain_versions/show.haml @@ -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 - = l(@version.created_at, format: :short) - = event - = creator + - 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,10 +137,12 @@ .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 %span{:style => "padding-left:10px; position: absolute; bottom: 10px;"} - = paginate @versions + = paginate @versions \ No newline at end of file diff --git a/app/views/admin/domains/partials/_version.haml b/app/views/admin/domains/partials/_version.haml index 6a278ea57..b4698eaab 100644 --- a/app/views/admin/domains/partials/_version.haml +++ b/app/views/admin/domains/partials/_version.haml @@ -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 - - 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] + - 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] - creator = pending_user.try(:username) - event = 'pending' - whodunnit = false diff --git a/app/views/admin/domains/versions.haml b/app/views/admin/domains/versions.haml index e47463302..ada01b012 100644 --- a/app/views/admin/domains/versions.haml +++ b/app/views/admin/domains/versions.haml @@ -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