diff --git a/app/controllers/admin/contact_versions_controller.rb b/app/controllers/admin/contact_versions_controller.rb new file mode 100644 index 000000000..d6c7deb9e --- /dev/null +++ b/app/controllers/admin/contact_versions_controller.rb @@ -0,0 +1,32 @@ +class Admin::ContactVersionsController < AdminController + load_and_authorize_resource + + def index + params[:q] ||= {} + + @q = ContactVersion.search(params[:q]) + @versions = @q.result.page(params[:page]) + + whereS = "1=1" + + params[:q].each do |key, value| + next if value.empty? + whereS += create_where_string(key, value) + end + + versions = ContactVersion.includes(:item).where(whereS) + @q = versions.search(params[:q]) + @versions = @q.result.page(params[:page]) + @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + + end + + def search + render json: ContactVersion.search_by_query(params[:q]) + end + + def create_where_string(key, value) + " AND object->>'#{key}' ~ '#{value}'" + end + +end diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index 44a2087cd..6aca493ea 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -1,18 +1,48 @@ class Admin::DomainVersionsController < AdminController load_and_authorize_resource - # rubocop:disable Style/GuardClause def index - @domain = Domain.where(id: params[:domain_id]).includes({versions: :item}).first - @versions = @domain.versions + params[:q] ||= {} + + @q = DomainVersion.includes(:item).search(params[:q]) + @versions = @q.result.page(params[:page]) + search_params = params[:q].deep_dup + + if search_params[:registrant] + registrant = Contact.find_by_name(search_params[:registrant]) + search_params.delete(:registrant) + end + + if search_params[:registrar] + registrar = Registrar.find_by_name(search_params[:registrar]) + search_params.delete(:registrar) + end + + whereS = "1=1" + + search_params.each do |key, value| + next if value.empty? + whereS += create_where_string(key, value) + end + + whereS += " AND object->>'registrant_id' ~ '#{registrant.id}'" if registrant + whereS += " AND object->>'registrar_id' ~ '#{registrar.id}'" if registrar + + versions = DomainVersion.includes(:item).where(whereS) + @q = versions.search(params[:q]) + @versions = @q.result.page(params[:page]) + @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + render "admin/domain_versions/archive" - # Depricated it had to load legal document. We may do it by parsing and adding link. - # if @domain.pending_json.present? - # frame = Nokogiri::XML(@domain.pending_json['frame']) - # @pending_user = User.find(@domain.pending_json['current_user_id']) - # @pending_domain = Epp::Domain.find(@domain.id) - # @pending_domain.update(frame, @pending_user, false) - # end end - # rubocop:enable Style/GuardClause + + def search + render json: DomainVersion.search_by_query(params[:q]) + end + + def create_where_string(key, value) + " AND object->>'#{key}' ~ '#{value}'" + end + + end diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index 377912bad..36bdefbff 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -77,6 +77,11 @@ class Admin::DomainsController < AdminController redirect_to [:admin, @domain] end + def versions + @domain = Domain.where(id: params[:domain_id]).includes({versions: :item}).first + @versions = @domain.versions + end + private def set_domain diff --git a/app/models/ability.rb b/app/models/ability.rb index 61f1edb2e..82ffd7c2e 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -95,6 +95,7 @@ class Ability can :manage, ReservedDomain can :manage, ZonefileSetting can :manage, DomainVersion + can :manage, ContactVersion can :manage, Pricelist can :manage, User can :manage, ApiUser diff --git a/app/views/admin/contact_versions/index.haml b/app/views/admin/contact_versions/index.haml new file mode 100644 index 000000000..00cdb53ee --- /dev/null +++ b/app/views/admin/contact_versions/index.haml @@ -0,0 +1,80 @@ += render 'shared/title', name: t(:contacts) + +.row + .col-md-12 + = search_form_for [:admin, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f| + .row + .col-md-3 + .form-group + = f.label :name + = f.search_field :name, value: params[:q][:name], class: 'form-control', placeholder: t(:name) + .col-md-3 + .form-group + = f.label :id + = f.search_field :id, value: params[:q][:id], class: 'form-control', placeholder: t(:id) + .col-md-3 + .form-group + = f.label :ident + = f.search_field :ident, value: params[:q][:ident], class: 'form-control', placeholder: t(:ident) + .col-md-3 + .form-group + = f.label :phone + = f.search_field :phone, value: params[:q][:phone], class: 'form-control', placeholder: t(:phone) + .row + .col-md-3 + .col-md-3 + .col-md-3 + .form-group + = label_tag t(:results_per_page) + = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) + .col-md-3{style: 'padding-top: 25px;'} + %button.btn.btn-primary +   + %span.glyphicon.glyphicon-search +   + %button.btn.btn-default.js-reset-form + = t(:clear_fields) +%hr + + +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead + %tr + %th{class: 'col-xs-2'} + = t(:name) + %th{class: 'col-xs-2'} + = t(:id) + %th{class: 'col-xs-2'} + = t(:ident) + %th{class: 'col-xs-2'} + = t(:phone) + %th{class: 'col-xs-2'} + = t(:registrar) + %th{class: 'col-xs-2'} + = t(:action) + %tbody + - @versions.each do |version| + %tr + %td= version.reify.name + %td= version.reify.code + %td= ident_for(version.reify) + %td= version.reify.phone + %td + - if version.reify.registrar + = link_to(version.reify.registrar, admin_registrar_path(version.reify.registrar)) + %td= version.event + + +.row + .col-md-6 + = paginate @versions + .col-md-6.text-right + + +:coffee + $(".js-reset-form").on "click", (e) -> + e.preventDefault(); + window.location = "#{admin_contact_versions_path}" diff --git a/app/views/admin/domain_versions/archive.haml b/app/views/admin/domain_versions/archive.haml new file mode 100644 index 000000000..03334ca64 --- /dev/null +++ b/app/views/admin/domain_versions/archive.haml @@ -0,0 +1,73 @@ += render 'shared/title', name: t(:domains) + +.row + .col-md-12 + = search_form_for [:admin, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f| + .row + .col-md-3 + .form-group + = label_tag :name + = f.search_field :name, value: params[:q][:name], class: 'form-control', placeholder: t(:name) + .col-md-3 + .form-group + = label_tag :registrant + = f.search_field :registrant, value: params[:q][:registrant], class: 'form-control', placeholder: t(:registrant) + .col-md-3 + .form-group + = label_tag t(:registrar) + = f.search_field :registrar, value: params[:q][:registrar], class: 'form-control', placeholder: t(:registrant) + .col-md-3 + .form-group + = label_tag t(:results_per_page) + = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) + .row + .col-md-3 + .col-md-3 + .col-md-3 + .col-md-3{style: 'padding-top: 25px;'} + %button.btn.btn-primary +   + %span.glyphicon.glyphicon-search +   + %button.btn.btn-default.js-reset-form + = t(:clear_fields) +%hr + + +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead + %tr + %th{class: 'col-xs-2'} + = t(:name) + %th{class: 'col-xs-2'} + = t(:registrant) + %th{class: 'col-xs-2'} + = t(:registrar) + %th{class: 'col-xs-2'} + = t(:action) + %tbody + - @versions.each do |version| + %tr + %td= version.reify.name + %td + - if version.reify.registrant.ident + = link_to(version.reify.registrant, admin_registrant_path(version.reify.registrant)) + %td + - if version.reify.registrar + = link_to(version.reify.registrar, admin_registrar_path(version.reify.registrar)) + %td= version.event + + +.row + .col-md-6 + = paginate @versions + .col-md-6.text-right + + +:coffee + $(".js-reset-form").on "click", (e) -> + e.preventDefault(); + window.location = "#{admin_domain_versions_path}" diff --git a/app/views/admin/domains/partials/_version.haml b/app/views/admin/domains/partials/_version.haml new file mode 100644 index 000000000..fd449b4b0 --- /dev/null +++ b/app/views/admin/domains/partials/_version.haml @@ -0,0 +1,105 @@ +- statuses_link ||= false +- version ||= false +- domain ||= false +- pending_user ||= false + +- if domain.present? + - if version # normal history + - children = HashWithIndifferentAccess.new(version.children) + - nameservers = Nameserver.where(id: children[:nameservers]) + - tech_contacts = Contact.where(id: children[:tech_contacts]) + - admin_contacts = Contact.where(id: children[:admin_contacts]) + - registrant = Contact.where(id: children[:registrant]) + - event = version.event + - creator = plain_username(version.terminator) + - else # pending history + - nameservers = domain.nameservers + - tech_contacts = domain.tech_contacts + - admin_contacts = domain.admin_contacts + - registrant = [domain.registrant] + - creator = pending_user.try(:username) + - event = 'pending' + + %td + %p.nowrap + = l(domain.updated_at, format: :shorts) + - if statuses_link + %br= link_to t(:edit_statuses), edit_admin_domain_path(params[:domain_id]) + + %p.text-right + = event + %br + = creator + + %td + %p + - if domain.statuses.present? + - domain.statuses.each do |s| + = s + - if domain.status_notes.present? + - notes = domain.status_notes[s] + - if notes + %br + %i= notes + %br + - if domain.pending_json.present? + %p + = link_to t(:pending_epp), '#', class: 'js-pending-toggle' + + %td + %p + = "#{domain.period}#{domain.period_unit}" + %br + = "#{l(domain.valid_from, format: :date)}" + %br + = "#{l(domain.valid_to, format: :date)}" + + %td + - registrant.each do |r| + %p + = r[:name] + = r[:phone] + = r[:email] + %p + = r[:code] + + %td + - admin_contacts.each do |ac| + %p + = ac[:name] + = ac[:phone] + = ac[:email] + %p + = ac[:code] + + %td + - tech_contacts.each do |tc| + %p + = tc[:name] + = tc[:phone] + = tc[:email] + %p + = tc[:code] + + %td + %p + - nameservers.each do |ns| + = ns[:hostname] + %br + = ns[:ipv4] + = ns[:ipv6] + + %td + %p + = domain.registrar.name + + - if domain.pending_json.present? + %tr.js-pending{ style: 'display: none;' } + %td{colspan: 8} + = preserve do + %pre + - formatted_req = Nokogiri::XML(domain.pending_json['frame']) + - if formatted_req.errors.none? + = formatted_req + - else + = domain.pending_json['frame'] diff --git a/app/views/admin/domains/versions.haml b/app/views/admin/domains/versions.haml new file mode 100644 index 000000000..5224aa34a --- /dev/null +++ b/app/views/admin/domains/versions.haml @@ -0,0 +1,44 @@ +- content_for :actions do + = link_to(t(:back_to_domain), [:admin, @domain], class: 'btn btn-default') += render 'shared/title', name: "#{t(:history)}: #{@domain.name}" + +.row + .col-md-12 + .table-responsive + %table.table-hover.table-bordered.table-condensed + %thead + %tr + %th{class: 'col-xs-1'}= t(:timestap) + %th{class: 'col-xs-2'}= t(:statuses) + %th{class: 'col-xs-1'}= t(:period) + %th{class: 'col-xs-2'}= t(:registrant) + %th{class: 'col-xs-2'}= t(:admin) + %th{class: 'col-xs-2'}= t(:tech) + %th{class: 'col-xs-2'}= t(:nameservers) + %th{class: 'col-xs-2'}= t(:registrar) + + %tbody + - if @pending_domain.present? + %tr.small + = render 'admin/domains/partials/version', + domain: @pending_domain, pending_user: @pending_user, statuses_link: true + + -# current version + - if @domain.versions.present? + %tr.small + = render 'admin/domains/partials/version', + domain: @domain, version: @domain.versions.last + + -# all other older versions + - @domain.versions.not_creates.reverse.each do |version| + %tr.small + = render 'admin/domains/partials/version', + domain: version.reify, version: version.previous + +:coffee + $(document).on 'click', '.js-pending-toggle', (e) -> + e.preventDefault() + + $(document).on 'mousedown', '.js-pending-toggle', (e) -> + target = $(e.target) + target.parents('tr').next('tr.js-pending').toggle() diff --git a/app/views/layouts/admin/application.haml b/app/views/layouts/admin/application.haml index 6e3257740..6baef9abf 100644 --- a/app/views/layouts/admin/application.haml +++ b/app/views/layouts/admin/application.haml @@ -57,6 +57,10 @@ %li= link_to t(:invoices), admin_invoices_path %li= link_to t(:account_activities), admin_account_activities_path %li.divider + %li.dropdown-header= t(:archive) + %li= link_to t(:domains_history), admin_domain_versions_path + %li= link_to t(:contacts_history), admin_contact_versions_path + %li.divider %li.dropdown-header= t(:system) %li= link_to t(:settings), admin_settings_path %li= link_to t(:zonefile), admin_zonefile_settings_path diff --git a/config/routes.rb b/config/routes.rb index e0a331256..ec4264462 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -210,7 +210,7 @@ Rails.application.routes.draw do end resources :domains do - resources :domain_versions + resources :domain_versions, controller: 'domains', action: 'versions' resources :pending_updates resources :pending_deletes member do @@ -219,6 +219,18 @@ Rails.application.routes.draw do end end + resources :domain_versions do + collection do + get 'search' + end + end + + resources :contact_versions do + collection do + get 'search' + end + end + resources :settings resources :blocked_domains do