views: add table builder abstraction.
This commit is contained in:
@@ -197,6 +197,11 @@ module ApplicationHelper
|
|||||||
simple_form_for(:search, method: method, url: url, defaults: defaults, html: html_options, &block)
|
simple_form_for(:search, method: method, url: url, defaults: defaults, html: html_options, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def table_for(*options, &block)
|
||||||
|
table = TableBuilder.new(*options, &block)
|
||||||
|
render "table_builder/table", table: table
|
||||||
|
end
|
||||||
|
|
||||||
def body_attributes(user = CurrentUser.user)
|
def body_attributes(user = CurrentUser.user)
|
||||||
attributes = %i[id name level level_string theme] + User::BOOLEAN_ATTRIBUTES.map(&:to_sym)
|
attributes = %i[id name level level_string theme] + User::BOOLEAN_ATTRIBUTES.map(&:to_sym)
|
||||||
attributes += User::Roles.map { |role| :"is_#{role}?" }
|
attributes += User::Roles.map { |role| :"is_#{role}?" }
|
||||||
|
|||||||
38
app/logical/table_builder.rb
Normal file
38
app/logical/table_builder.rb
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
class TableBuilder
|
||||||
|
class Column
|
||||||
|
attr_reader :attribute, :name, :block, :html_attributes
|
||||||
|
|
||||||
|
def initialize(attribute = nil, name: attribute.to_s.titleize, **html_attributes, &block)
|
||||||
|
@attribute = attribute
|
||||||
|
@html_attributes = html_attributes
|
||||||
|
@name = name
|
||||||
|
@block = block
|
||||||
|
end
|
||||||
|
|
||||||
|
def value(item)
|
||||||
|
if block.present?
|
||||||
|
block.call(item, self)
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
item.send(attribute)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
attr_reader :columns, :html_attributes, :items
|
||||||
|
|
||||||
|
def initialize(items, **html_attributes)
|
||||||
|
@items = items
|
||||||
|
@columns = []
|
||||||
|
@html_attributes = html_attributes
|
||||||
|
yield self if block_given?
|
||||||
|
end
|
||||||
|
|
||||||
|
def column(*options, &block)
|
||||||
|
@columns << Column.new(*options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def row_attributes(item)
|
||||||
|
{ id: "#{item.model_name.singular}-#{item.id}", "data-id": item.id }
|
||||||
|
end
|
||||||
|
end
|
||||||
21
app/views/table_builder/_table.html.erb
Normal file
21
app/views/table_builder/_table.html.erb
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<%= tag.table table.html_attributes do %>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<% table.columns.each do |column| %>
|
||||||
|
<th><%= column.name %></th>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<% table.items.each do |item| %>
|
||||||
|
<%= tag.tr table.row_attributes(item) do %>
|
||||||
|
<% table.columns.each do |column| %>
|
||||||
|
<%= tag.td column.html_attributes do %>
|
||||||
|
<%= column.value(item) %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
<% end %>
|
||||||
Reference in New Issue
Block a user