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

Methods inherited from Component

#initialize

Constructor Details

This class inherits a constructor from Para::Markup::Component

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



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

def actions_cell(resource)
  (:td) do
    (:div, class: 'pull-right btn-group') do
      actions.map do |type|
        send(:"#{ type }_button", resource)
      end.compact.join.html_safe
    end
  end
end

#clone_button(resource) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/para/markup/resources_table.rb', line 145

def clone_button(resource)
  return unless resource.class.cloneable?

  path = component.relation_path(
    resource, action: :clone, return_to: view.request.fullpath
  )

  options = {
    method: :post,
    class: 'btn btn-info'
  }

  view.link_to(path, options) do
    (:i, '', class: 'fa fa-refresh')
  end
end

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



9
10
11
12
13
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
# File 'lib/para/markup/resources_table.rb', line 9

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

  if !options.key?(:orderable) || options.delete(:orderable)
    @orderable = model.orderable?
  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


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

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

#delete_button(resource) ⇒ Object



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/para/markup/resources_table.rb', line 172

def delete_button(resource)
  path = component.relation_path(resource)

  options = {
    method: :delete,
    data: {
      confirm: ::I18n.t('para.list.delete_confirmation')
    },
    class: 'btn btn-danger'
  }

  view.link_to(path, options) do
    (:i, '', class: 'fa fa-trash')
  end
end

#edit_button(resource) ⇒ Object



162
163
164
165
166
167
168
169
170
# File 'lib/para/markup/resources_table.rb', line 162

def edit_button(resource)
  path = component.relation_path(
    resource, action: :edit, return_to: view.request.fullpath
  )

  view.link_to(path, class: 'btn btn-primary') do
    (:i, '', class: 'fa fa-pencil')
  end
end

#header(&block) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/para/markup/resources_table.rb', line 40

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: 'actions', width: 1) if actions

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

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



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

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

  sort = options.delete(:sort) || field_name

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

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

#order_cell(resource) ⇒ Object



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

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

#row(resource, &block) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/para/markup/resources_table.rb', line 64

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



55
56
57
58
59
60
61
62
# File 'lib/para/markup/resources_table.rb', line 55

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