Skip to content

Commit

Permalink
Refactor table visible columns feature
Browse files Browse the repository at this point in the history
The set_visible_columns functionality has been refactored
and the entry point of feature relocated from Controller to DSL module.
The respective Ajax calls have also been updated to target a new end-point.

Reusability has been improved, making it easier to manage table column visibility in future projects.

example:
to enable "visible columns" feature call method in you AA DSL `enable_visible_columns_feature!`
  • Loading branch information
Ivanov-Anton committed Jul 17, 2024
1 parent 3a9fcd1 commit 02da5eb
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 22 deletions.
5 changes: 1 addition & 4 deletions app/admin/cdr/cdrs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
config.batch_actions = false
config.sort_order = 'time_start_desc'
acts_as_cdr_stat
enable_visible_columns_feature!

decorate_with CdrDecorator

Expand All @@ -24,10 +25,6 @@
end

controller do
def columns_visibility?
true
end

def scoped_collection
if params[:as] == 'table'
super.preload(
Expand Down
7 changes: 2 additions & 5 deletions app/assets/javascripts/index_as_table_visible_columns.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,7 @@ $(document).ready(function(){
var $select = $(this).closest('#block_available_columns').find('select'),
selected_fields = $select.val();
$(this).parent().find('.ui-dialog-buttonset').text('Loading...');
$.getJSON(
this.href,
{index_table_visible_columns: selected_fields}
).success(function(){
$.getJSON(window.location.pathname + '/visible_index_columns', { index_table_visible_columns: selected_fields }, function() {
window.location.reload();
});
},
Expand All @@ -27,7 +24,7 @@ $(document).ready(function(){
});

$('#reset_visible_columns').click(function(){
$.getJSON(this.href, {index_table_visible_columns: ''}).success(function(){
$.getJSON(window.location.pathname + '/visible_index_columns', { index_table_visible_columns: '' }, function() {
window.location.reload();
});
});
Expand Down
13 changes: 0 additions & 13 deletions lib/active_admin/index_as_table_visible_columns/controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,13 @@ module Controller
included do
before_action only: :index do
if columns_visibility?
set_visible_columns
@visible_columns = []
if current_admin_user.visible_columns[visible_columns_key].is_a?(Array)
@visible_columns = current_admin_user.visible_columns[visible_columns_key]
end
end
end

def set_visible_columns
if request.xhr?
# Set or clear values
if params.key?(:index_table_visible_columns)
visible_columns_storage = current_admin_user.visible_columns
visible_columns_storage[visible_columns_key] = params[:index_table_visible_columns]
current_admin_user.update_column(:visible_columns, visible_columns_storage)
render(json: { visible_columns: visible_columns_storage[visible_columns_key] }) && return
end
end
end

protected

def columns_visibility?
Expand Down
29 changes: 29 additions & 0 deletions lib/active_admin/index_as_table_visible_columns/dsl.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal : true

module ActiveAdmin
module IndexAsTableVisibleColumns
module DSL
#
# This feature is disabled by default to enable it you need to call this method in your ActiveAdmin resource
# allow you to determine which columns are visible for the index table
def enable_visible_columns_feature!
controller do
def columns_visibility?
true
end
end

collection_action :visible_index_columns, only: :index do
if params.key?(:index_table_visible_columns)
visible_columns_storage = current_admin_user.visible_columns
visible_columns_storage[visible_columns_key] = params[:index_table_visible_columns]
current_admin_user.update_column(:visible_columns, visible_columns_storage)
render json: { visible_columns: visible_columns_storage[visible_columns_key] }
end
end
end
end
end
end

ActiveAdmin::ResourceDSL.send :include, ActiveAdmin::IndexAsTableVisibleColumns::DSL
29 changes: 29 additions & 0 deletions spec/features/cdr/cdr_history/cdrs_index_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,33 @@
expect(page).to have_table_cell(column: 'ID', exact_text: cdr.id)
end
end

describe 'Visible columns feature' do
context 'when click to "Visible columns" link' do
before do
visit cdrs_path
click_link 'Visible columns'
end

it 'should display "Visible columns" popup', js: true do
expect(page).to have_selector '.ui-widget'
expect(page).to have_selector '.ui-dialog-title', exact_text: 'Visible table columns'
within '.ui-dialog' do
expect(page).to have_button :Show
expect(page).to have_button :Cancel
end
end
end

context 'when click to "Reset" link' do
let!(:admin_user) { create :admin_user, visible_columns: { cdrs: %w[id] } }

before { visit cdrs_path }

it 'should click to "Reset" link', js: true do
click_link :Reset
expect(admin_user.reload).to have_attributes(visible_columns: { 'cdrs' => '' })
end
end
end
end

0 comments on commit 02da5eb

Please sign in to comment.