bogdan / datagrid

Gem to create tables grids with sortable columns and filters
MIT License
1.02k stars 115 forks source link

Unable to change column position unless the model grid file is updated #300

Closed edulima closed 2 years ago

edulima commented 2 years ago

@bogdan I am trying to generate the columns of my table with data coming from a table that stores the order of each column that was created when the user rearrange the columns. e.g in my property_grid.rb file I am trying to generate the columns from ["Attribute 1", "Attribute 2", "Attribute 3"]. This works great the first time I reload the page but when the attribute array becomes ["Attribute 3", "Attribute 2", "Attribute 1"] it doesn't change. If I add a comment or anything else to the property_grid.rb file than it seems to work. I don't understand why it only works if I manually add something to this file. Any idea why this is happening?

bogdan commented 2 years ago

Your description is pretty unclear: see its hard to understand the difference between "a table" and "my table".

Can you share the grid source code? Can you try to reproduce the issue in console and send me the snippet? How do you generate columns from attributes array? Are you using column_names attribute?

edulima commented 2 years ago

@bogdan here is the same questions more elaborated I posted on Stackoverflow https://stackoverflow.com/questions/73120544/unable-to-change-column-position-dynamically-datagrid-rails-gem/73120805#73120805

edulima commented 2 years ago

Here is how the columns are generated. There are some custom methods there too. But I don't see an issue with them.

  user_layout = UserLayout.find_by(user_id: Current.user.id)
  if !user_layout.blank? 
    // returns and array of columns names ['Is available', 'Created at'] etc
    user_layout = user_layout.layout['unit']['table'].split(",")
  else
    user_layout = ["Address1", "Property", "Created at", "Updated at"]
  end

  user_layout.each do |a|
    case a
      when 'Is available'
        boolean_column(:is_available)  
      when 'Date available'
        column(:date_available)  
      when 'Is advertised'
        boolean_column(:is_advertised)
      when 'Date advertised'
        column(:date_advertised)
      when 'Is vacant'
        boolean_column(:is_vacant)
      when 'Date vacant'
        column(:date_vacant)
      when 'Created at'
        datetime_column(:created_at)
      when 'Updated at'
        datetime_column(:updated_at)   
    end
  end
bogdan commented 2 years ago

Try this

class PropertyGrid
  include Datagrid
  scope { ... }

  def define_layout(user_layout)
    user_layout.each do |a|
    case a
      when 'Is available'
        boolean_column(:is_available)  
      when 'Date available'
        column(:date_available)  
      when 'Is advertised'
        boolean_column(:is_advertised)
      when 'Date advertised'
        column(:date_advertised)
      when 'Is vacant'
        boolean_column(:is_vacant)
      when 'Date vacant'
        column(:date_vacant)
      when 'Created at'
        datetime_column(:created_at)
      when 'Updated at'
        datetime_column(:updated_at)   
    end
 end

class MyController
  def index
    user_layout = UserLayout.find_by(user_id: Current.user.id)
  if !user_layout.blank? 
    // returns and array of columns names ['Is available', 'Created at'] etc
    user_layout = user_layout.layout['unit']['table'].split(",")
  else
    user_layout = ["Address1", "Property", "Created at", "Updated at"]
  end
  @grid = PropertyGrid.new(params[:property_grid])
  @grid.define_layout(user_layout)
  end
end
edulima commented 2 years ago

This works @bogdan thanks for your help. Can you please point me to the documentation where I would be able to find this solutions? Just want to read a make sure I understand it. Thanks

bogdan commented 2 years ago

Here it is:

https://github.com/bogdan/datagrid/wiki/Columns#dynamic-columns