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
Hash
where keys are column names and values are column values for the given asset. -
#header(*column_names) ⇒ Object
Returns
Array
of 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
Array
column 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
258 259 260 |
# File 'lib/datagrid/columns.rb', line 258 def assets 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> ]
464 465 466 467 468 |
# File 'lib/datagrid/columns.rb', line 464 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
437 438 439 |
# File 'lib/datagrid/columns.rb', line 437 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
385 386 387 |
# File 'lib/datagrid/columns.rb', line 385 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
364 365 366 |
# File 'lib/datagrid/columns.rb', line 364 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
307 308 309 |
# File 'lib/datagrid/columns.rb', line 307 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
369 370 371 372 373 374 |
# File 'lib/datagrid/columns.rb', line 369 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"}]
327 328 329 330 331 |
# File 'lib/datagrid/columns.rb', line 327 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
430 431 432 |
# File 'lib/datagrid/columns.rb', line 430 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
471 472 473 474 475 476 477 478 |
# File 'lib/datagrid/columns.rb', line 471 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.
494 495 496 |
# File 'lib/datagrid/columns.rb', line 494 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
404 405 406 407 408 409 410 411 |
# File 'lib/datagrid/columns.rb', line 404 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:
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 |
# File 'lib/datagrid/columns.rb', line 498 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
283 284 285 286 287 288 289 |
# File 'lib/datagrid/columns.rb', line 283 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
267 268 269 |
# File 'lib/datagrid/columns.rb', line 267 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
377 378 379 380 381 382 |
# File 'lib/datagrid/columns.rb', line 377 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
481 482 483 484 485 486 487 488 489 490 491 |
# File 'lib/datagrid/columns.rb', line 481 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:
441 442 443 444 445 |
# File 'lib/datagrid/columns.rb', line 441 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
276 277 278 279 280 |
# File 'lib/datagrid/columns.rb', line 276 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
296 297 298 299 300 |
# File 'lib/datagrid/columns.rb', line 296 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 => ';')
344 345 346 347 348 349 350 351 352 353 |
# File 'lib/datagrid/columns.rb', line 344 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 |