Module: Datagrid::Columns::InstanceMethods
- Defined in:
- lib/datagrid/columns.rb
Overview
ClassMethods
Instance Method Summary collapse
- #assets ⇒ Object
-
#available_columns ⇒ Object
Returns all columns available for current grid configuration.
-
#column(name, options_or_query = {}, options = {}, &block) ⇒ Object
Defines a column at instance level.
-
#column_by_name(name) ⇒ Object
Finds a column definition by name.
-
#columns(*args) ⇒ Object
Returns all columns selected in grid instance.
-
#data(*column_names) ⇒ Object
Returns Array of Arrays with data for each row in datagrid assets with header.
-
#data_columns(*names) ⇒ Object
Returns all columns that can be represented in plain data(non-html) way.
-
#data_hash ⇒ Object
Return Array of Hashes where keys are column names and values are column values for each row in filtered datagrid relation.
-
#data_row(asset) ⇒ Object
Returns an object representing a grid row.
-
#data_value(column_name, asset) ⇒ Object
Return a cell data value for given column name and asset.
-
#decorate(model) ⇒ Object
Returns a decorated version of given model if decorator is specified or the model otherwise.
-
#format(value, &block) ⇒ Object
Gives ability to have a different formatting for CSV and HTML column value.
-
#generic_value(column, model) ⇒ Object
:nodoc:.
-
#hash_for(asset) ⇒ Object
Returns
Hashwhere keys are column names and values are column values for the given asset. -
#header(*column_names) ⇒ Object
Returns
Arrayof human readable column names. -
#html_columns(*names) ⇒ Object
Returns all columns that can be represented in HTML table.
-
#html_value(column_name, context, asset) ⇒ Object
Return a cell HTML value for given column name and asset and view context.
-
#initialize ⇒ Object
:nodoc:.
-
#row_for(asset, *column_names) ⇒ Object
Returns
Arraycolumn values for given asset. -
#rows(*column_names) ⇒ Object
Returns Array of Arrays with data for each row in datagrid assets without header.
-
#to_csv(*column_names) ⇒ Object
Returns a CSV representation of the data in the grid You are able to specify which columns you want to see in CSV.
Instance Method Details
#assets ⇒ Object
263 264 265 266 267 268 269 |
# File 'lib/datagrid/columns.rb', line 263 def assets append_column_preload( driver.append_column_queries( super, columns.select(&:query) ) ) end |
#available_columns ⇒ Object
Returns all columns available for current grid configuration.
class MyGrid
filter(:search) {|scope, value| scope.full_text_search(value)}
column(:id)
column(:name, :mandatory => true)
column(:search_match, :if => proc {|grid| grid.search.present? }) do |model, grid|
search_match_line(model.searchable_content, grid.search)
end
end
grid = MyGrid.new
grid.columns # => [ #<Column:name> ]
grid.available_columns # => [ #<Column:id>, #<Column:name> ]
grid.search = "keyword"
grid.available_columns # => [ #<Column:id>, #<Column:name>, #<Column:search_match> ]
473 474 475 476 477 |
# File 'lib/datagrid/columns.rb', line 473 def available_columns columns_array.select do |column| column.enabled?(self) end end |
#column(name, options_or_query = {}, options = {}, &block) ⇒ Object
Defines a column at instance level
See Datagrid::Columns::ClassMethods#column for more info
446 447 448 |
# File 'lib/datagrid/columns.rb', line 446 def column(name, = {}, = {}, &block) #:nodoc: self.class.define_column(columns_array, name, , , &block) end |
#column_by_name(name) ⇒ Object
Finds a column definition by name
394 395 396 |
# File 'lib/datagrid/columns.rb', line 394 def column_by_name(name) self.class.find_column_by_name(columns_array, name) end |
#columns(*args) ⇒ Object
Returns all columns selected in grid instance
Examples:
MyGrid.new.columns # => all defined columns
grid = MyGrid.new(:column_names => [:id, :name])
grid.columns # => id and name columns
grid.columns(:id, :category) # => id and category column
373 374 375 |
# File 'lib/datagrid/columns.rb', line 373 def columns(*args) self.class.filter_columns(columns_array, *args).select {|column| column.enabled?(self)} end |
#data(*column_names) ⇒ Object
Returns Array of Arrays with data for each row in datagrid assets with header.
Arguments:
* <tt>column_names</tt> - list of column names if you want to limit data only to specified columns
316 317 318 |
# File 'lib/datagrid/columns.rb', line 316 def data(*column_names) self.rows(*column_names).unshift(self.header(*column_names)) end |
#data_columns(*names) ⇒ Object
Returns all columns that can be represented in plain data(non-html) way
378 379 380 381 382 383 |
# File 'lib/datagrid/columns.rb', line 378 def data_columns(*names) = names. [:data] = true names << self.columns(*names) end |
#data_hash ⇒ Object
Return Array of Hashes where keys are column names and values are column values for each row in filtered datagrid relation.
Example:
class MyGrid
scope { Model }
column(:id)
column(:name)
end
Model.create!(:name => "One")
Model.create!(:name => "Two")
MyGrid.new.data_hash # => [{:name => "One"}, {:name => "Two"}]
336 337 338 339 340 |
# File 'lib/datagrid/columns.rb', line 336 def data_hash map_with_batches do |asset| hash_for(asset) end end |
#data_row(asset) ⇒ Object
Returns an object representing a grid row. Allows to access column values
Example:
class MyGrid
scope { User }
column(:id)
column(:name)
column(:number_of_purchases) do |user|
user.purchases.count
end
end
row = MyGrid.new.data_row(User.last)
row.id # => user.id
row.number_of_purchases # => user.purchases.count
439 440 441 |
# File 'lib/datagrid/columns.rb', line 439 def data_row(asset) ::Datagrid::Columns::DataRow.new(self, asset) end |
#data_value(column_name, asset) ⇒ Object
Return a cell data value for given column name and asset
480 481 482 483 484 485 486 487 |
# File 'lib/datagrid/columns.rb', line 480 def data_value(column_name, asset) column = column_by_name(column_name) cache(column, asset, :data_value) do raise "no data value for #{column.name} column" unless column.data? result = generic_value(column, asset) result.is_a?(Datagrid::Columns::Column::ResponseFormat) ? result.call_data : result end end |
#decorate(model) ⇒ Object
Returns a decorated version of given model if decorator is specified or the model otherwise.
503 504 505 |
# File 'lib/datagrid/columns.rb', line 503 def decorate(model) self.class.decorate(model) end |
#format(value, &block) ⇒ Object
Gives ability to have a different formatting for CSV and HTML column value.
Example:
column(:name) do |model|
format(model.name) do |value|
content_tag(:strong, value)
end
end
column(:company) do |model|
format(model.company.name) do
render :partial => "company_with_logo", :locals => {:company => model.company }
end
end
413 414 415 416 417 418 419 420 |
# File 'lib/datagrid/columns.rb', line 413 def format(value, &block) if block_given? self.class.format(value, &block) else # don't override Object#format method super end end |
#generic_value(column, model) ⇒ Object
:nodoc:
507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 |
# File 'lib/datagrid/columns.rb', line 507 def generic_value(column, model) #:nodoc: cache(column, model, :generic_value) do presenter = decorate(model) unless column.enabled?(self) raise Datagrid::ColumnUnavailableError, "Column #{column.name} disabled for #{inspect}" end if column.data_block.arity >= 1 Datagrid::Utils.apply_args(presenter, self, data_row(model), &column.data_block) else presenter.instance_eval(&column.data_block) end end end |
#hash_for(asset) ⇒ Object
Returns Hash where keys are column names and values are column values for the given asset
292 293 294 295 296 297 298 |
# File 'lib/datagrid/columns.rb', line 292 def hash_for(asset) result = {} self.data_columns.each do |column| result[column.name] = data_value(column, asset) end result end |
#header(*column_names) ⇒ Object
Returns Array of human readable column names. See also “Localization” section
Arguments:
* <tt>column_names</tt> - list of column names if you want to limit data only to specified columns
276 277 278 |
# File 'lib/datagrid/columns.rb', line 276 def header(*column_names) data_columns(*column_names).map(&:header) end |
#html_columns(*names) ⇒ Object
Returns all columns that can be represented in HTML table
386 387 388 389 390 391 |
# File 'lib/datagrid/columns.rb', line 386 def html_columns(*names) = names. [:html] = true names << self.columns(*names) end |
#html_value(column_name, context, asset) ⇒ Object
Return a cell HTML value for given column name and asset and view context
490 491 492 493 494 495 496 497 498 499 500 |
# File 'lib/datagrid/columns.rb', line 490 def html_value(column_name, context, asset) column = column_by_name(column_name) cache(column, asset, :html_value) do if column.html? && column.html_block value_from_html_block(context, asset, column) else result = generic_value(column, asset) result.is_a?(Datagrid::Columns::Column::ResponseFormat) ? result.call_html(context) : result end end end |
#initialize ⇒ Object
:nodoc:
450 451 452 453 454 |
# File 'lib/datagrid/columns.rb', line 450 def initialize(*) #:nodoc: self.columns_array = self.class.columns_array.clone super instance_eval(&dynamic_block) if dynamic_block end |
#row_for(asset, *column_names) ⇒ Object
Returns Array column values for given asset
Arguments:
* <tt>column_names</tt> - list of column names if you want to limit data only to specified columns
285 286 287 288 289 |
# File 'lib/datagrid/columns.rb', line 285 def row_for(asset, *column_names) data_columns(*column_names).map do |column| data_value(column, asset) end end |
#rows(*column_names) ⇒ Object
Returns Array of Arrays with data for each row in datagrid assets without header.
Arguments:
* <tt>column_names</tt> - list of column names if you want to limit data only to specified columns
305 306 307 308 309 |
# File 'lib/datagrid/columns.rb', line 305 def rows(*column_names) map_with_batches do |asset| self.row_for(asset, *column_names) end end |
#to_csv(*column_names) ⇒ Object
Returns a CSV representation of the data in the grid You are able to specify which columns you want to see in CSV. All data columns are included by default Also you can specify options hash as last argument that is proxied to Ruby CSV library.
Example:
grid.to_csv
grid.to_csv(:id, :name)
grid.to_csv(:col_sep => ';')
353 354 355 356 357 358 359 360 361 362 |
# File 'lib/datagrid/columns.rb', line 353 def to_csv(*column_names) = column_names. csv_class.generate( {:headers => self.header(*column_names), :write_headers => true}.merge!() ) do |csv| each_with_batches do |asset| csv << row_for(asset, *column_names) end end end |