Class: Para::Markup::ResourcesTable

Inherits:
Component
  • Object
show all
Defined in:
lib/para/markup/resources_table.rb

Instance Attribute Summary collapse

Attributes inherited from Component

#view

Instance Method Summary collapse

Constructor Details

#initialize(component, view) ⇒ ResourcesTable

Returns a new instance of ResourcesTable.



9
10
11
12
# File 'lib/para/markup/resources_table.rb', line 9

def initialize(component, view)
  @component = component
  super(view)
end

Instance Attribute Details

#actionsObject (readonly)

Returns the value of attribute actions.



7
8
9
# File 'lib/para/markup/resources_table.rb', line 7

def actions
  @actions
end

#componentObject (readonly)

Returns the value of attribute component.



7
8
9
# File 'lib/para/markup/resources_table.rb', line 7

def component
  @component
end

#modelObject (readonly)

Returns the value of attribute model.



7
8
9
# File 'lib/para/markup/resources_table.rb', line 7

def model
  @model
end

#orderableObject (readonly)

Returns the value of attribute orderable.



7
8
9
# File 'lib/para/markup/resources_table.rb', line 7

def orderable
  @orderable
end

Instance Method Details

#actions_cell(resource) ⇒ Object



137
138
139
140
141
142
143
144
145
# File 'lib/para/markup/resources_table.rb', line 137

def actions_cell(resource)
  buttons = ResourcesButtons.new(component, view)

  (:td, class: 'table-row-actions') do
    actions.map do |type|
      buttons.send(:"#{ type }_button", resource)
    end.compact.join.html_safe
  end
end

#container(options = {}, &block) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/para/markup/resources_table.rb', line 14

def container(options = {}, &block)
  @model = options.delete(:model)

  if !options.key?(:orderable) || options.delete(:orderable)
    @orderable = model.orderable? && view.can?(:order, model)
  end

  @actions = build_actions(options.delete(:actions))

  merge_class!(options, 'table')
  merge_class!(options, 'para-component-relation-table')
  merge_class!(options, 'table-hover') if options.fetch(:hover, true)

  if orderable
    merge_class!(options, 'orderable')
    options[:data] ||= {}
    options[:data][:'order-url'] = component.relation_path(model.model_name.route_key, action: :order)
  end

  table = (:table, options) do
    capture { block.call(self) }
  end

  if options.fetch(:responsive, true)
    (:div, table, class: 'table-responsive')
  else
    table
  end
end

#data_for(*args, &block) ⇒ Object

Data for can accept 2 versions of arguments :

- resource, field_name, type : cell value will be retrieved from
    the field_value_for helper

- a single value : The value to display in the cell directly
    which will be processed to be shorter than 100 chars


113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/para/markup/resources_table.rb', line 113

def data_for(*args, &block)
  value = if args.length >= 2
    resource, field_name, type = args
    view.field_value_for(resource, field_name, type).to_s
  elsif block
    capture { block.call }
  else
    view.excerpt_value_for(args.first)
  end

  (:td) do
    value
  end
end

#header(&block) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/para/markup/resources_table.rb', line 44

def header(&block)
  cells = []
  # Add orderable empty header
  cells << (:th, '') if orderable
  # Append cells
  cells << capture { block.call }
  # Append actions empty cell
  cells << (:th, '', class: 'table-row-actions') if actions

  # Output full header
  (:thead) do
    (:tr, cells.join("\n").html_safe)
  end
end

#header_for(field_name = nil, options = {}, &block) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/para/markup/resources_table.rb', line 80

def header_for(field_name = nil, options = {}, &block)
  if Hash === field_name
    options = field_name
    field_name = nil
  end

  label = if Symbol === field_name
    model.human_attribute_name(field_name)
  elsif block
    capture { block.call }
  else
    field_name
  end

  (:th, options) do
    if search && (sort = options.delete(:sort))
      view.sort_link(search, *sort, label, hide_indicator: true)
    elsif search && searchable?(field_name)
      view.sort_link(search, field_name, label, hide_indicator: true)
    else
      label
    end
  end
end

#order_cell(resource) ⇒ Object



128
129
130
131
132
133
134
135
# File 'lib/para/markup/resources_table.rb', line 128

def order_cell(resource)
  order_cell = (:td) do
    view.reorder_anchor(
      value: resource.position,
      data: { id: resource.id }
    )
  end
end

#row(resource, &block) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/para/markup/resources_table.rb', line 68

def row(resource, &block)
  cells = []
  # Add orderable cell with "move" thumb
  cells << order_cell(resource) if orderable
  # Add data cells
  cells << capture { block.call(resource) }
  # Add actions links to the last cell
  cells << actions_cell(resource) if actions

  cells.join("\n").html_safe
end

#rows(resources, &block) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/para/markup/resources_table.rb', line 59

def rows(resources, &block)
  rows = resources.each_with_object(ActiveSupport::SafeBuffer.new('')) do |resource, buffer|
    buffer << (:tr, row(resource, &block))
  end

  # Output full header
  (:tbody, rows)
end