action_table 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6e8c82366ee5b6617d572217e5fe97b46b899ec4b0c56d427c4684488901b76
4
- data.tar.gz: d0a6e30baf0df782de4d3f49db62b5511bcb3b176cdd77e1fcb76223e4ae7f9e
3
+ metadata.gz: 764eb83721f4fdcb2d2ba4d83b4e475193dfd942ba092ba66fa51d9b99500792
4
+ data.tar.gz: 28cf0551ac9a6db16b109c45e9fd480876112989480dc87d3b7a5e77604e8ccc
5
5
  SHA512:
6
- metadata.gz: 906cab2332e2eee5af9642e44ec5f12d2634b1202ec0b1a72fa743898c3f1789a452d413901616b02d1ebbf40ff5ff70058c986473240ad9d2b5ffd1e5e924db
7
- data.tar.gz: 2c30d01e88ea05929947f753e454eb518957941ca5be2a8716d2ae694fbeba8a607dfc79f07bdead36c0e59d37065aa725815338ba739081b7e25f2e9d8cf139
6
+ metadata.gz: 2c54233fa2ff645ba5068bad3dec99e22f77459f400fc559e828c48c998a6d40529847cebcf110df09fbaae6055f20461edd4685ce6290ed6708528e5a8bfec2
7
+ data.tar.gz: 0b4595270ccfb5cbff0e08d51614eabc82658e0a949d02d174f2c785b1c6cc511bce64c9ec47f837993855abe8cd610782d09e62541ceef56784b3186546f7b5
@@ -0,0 +1,17 @@
1
+ # ActionTable - Change Log
2
+
3
+ ## HEAD
4
+
5
+
6
+ ## v0.3.0
7
+
8
+ - Validate styles params against known Bootstrap styles
9
+ - Add support for responsive tables
10
+ - Remove `View#styles_class` in favor of `View#styles` that returns an instance of `BootstrapStyles`
11
+ - Update default value of `Configuration#links` to be empty
12
+ - Change `View#cols` to `View#columns`
13
+ - Change `Configuration#link_method` to `Configuration#links`
14
+
15
+ ---
16
+
17
+ _The rest is history.._
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ActionTable
2
2
 
3
- Render ActiveModel or ActiveRecord objects as HTML tables with one line of Ruby - supports some simple configuration options.
3
+ Render ActiveRecord objects as HTML tables with one line of Ruby - supports some simple configuration options.
4
4
 
5
5
  :warning: Only works with Ruby on Rails.
6
6
 
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ['Jacob Burenstam']
11
11
  spec.email = ['burenstam@gmail.com']
12
12
 
13
- spec.summary = 'Render ActiveModel or ActiveRecord objects as HTML tables with one line of Ruby.'
14
- spec.description = 'Render ActiveModel or ActiveRecord objects as HTML tables with one line of Ruby - supports some simple configuration options.'
13
+ spec.summary = 'Render ActiveRecord objects as HTML tables with one line of Ruby.'
14
+ spec.description = 'Render ActiveRecord objects as HTML tables with one line of Ruby - supports some simple configuration options.'
15
15
  spec.homepage = 'https://github.com/buren/action_table'
16
16
  spec.license = 'MIT'
17
17
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'action_table/version'
4
- require 'action_table/railtie'
4
+ require 'action_table/railtie' if defined?(Rails)
5
5
 
6
6
  module ActionTable
7
7
  def self.configuration
@@ -18,14 +18,14 @@ module ActionTable
18
18
  end
19
19
 
20
20
  class Configuration
21
- attr_accessor :styles, :actions, :link_method
21
+ attr_accessor :styles, :actions, :links
22
22
  attr_writer :rails_host_app
23
23
 
24
24
  def initialize
25
25
  @rails_host_app = nil
26
26
  @styles = []
27
27
  @actions = []
28
- @link_method = :name
28
+ @links = []
29
29
  end
30
30
 
31
31
  def rails_host_app
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionTable
4
+ class BootstrapStyles
5
+ BOOTSTRAP_TABLE_WRAPERS = Set.new(
6
+ %w[
7
+ responsive
8
+ responsive-sm
9
+ responsive-md
10
+ responsive-lg
11
+ responsive-xl
12
+ ],
13
+ ).freeze
14
+
15
+ # All the below can be used on <table>, <thead>, <tr>, <td>
16
+ BOOTSTRAP_UTILS = Set.new(
17
+ %w[
18
+ dark
19
+ light
20
+ primary
21
+ success
22
+ danger
23
+ info
24
+ warning
25
+ active
26
+ secondary
27
+ ],
28
+ )
29
+
30
+ # .thead-light or .thead-dark
31
+ # <th scope="row">1</th>
32
+ # <caption>List of users</caption> # directly under <table>
33
+ BOOTSTRAP_TABLE_STYLES = (
34
+ Set.new(
35
+ %w[
36
+ striped
37
+ sm
38
+ bordered
39
+ hover
40
+ borderless
41
+ ],
42
+ ) + BOOTSTRAP_UTILS
43
+ ).freeze
44
+
45
+ def initialize(styles)
46
+ @styles = Array(styles).map { |style| style.to_s.tr('_', '-') }
47
+ @responsive_wrapper_class = nil
48
+ @table_classes = nil
49
+
50
+ validate_styles!(@styles)
51
+ end
52
+
53
+ def responsive_wrapper_class
54
+ return @responsive_wrapper_class if @responsive_wrapper_class
55
+
56
+ wrappers = BOOTSTRAP_TABLE_WRAPERS.select { |style| @styles.include?(style) }
57
+ return if wrappers.empty?
58
+
59
+ @responsive_wrapper_class = wrappers.map do |style|
60
+ "table-#{style}" if wrapper_class?(style)
61
+ end.join(' ')
62
+ end
63
+
64
+ def table_classes
65
+ return @table_classes if @table_classes
66
+
67
+ style_classes = @styles.map do |style|
68
+ "table-#{style}" if table_class?(style)
69
+ end.compact
70
+
71
+ @table_classes = "table #{style_classes.join(' ')}"
72
+ end
73
+
74
+ private
75
+
76
+ def table_class?(style)
77
+ BOOTSTRAP_TABLE_STYLES.include?(style)
78
+ end
79
+
80
+ def wrapper_class?(style)
81
+ BOOTSTRAP_TABLE_WRAPERS.include?(style)
82
+ end
83
+
84
+ def validate_styles!(styles)
85
+ styles.each do |style|
86
+ next if table_class?(style) || wrapper_class?(style)
87
+
88
+ raise(
89
+ ArgumentError,
90
+ "unknown bootstrap style #{style}, must be in #{BOOTSTRAP_TABLE_STYLES}",
91
+ )
92
+ end
93
+ end
94
+ end
95
+ end
@@ -13,8 +13,8 @@ module ActionTable
13
13
  # table columns (must map to methods on each ActiveRecord instance)
14
14
  # @param styles [Array<String>, Array<Symbol>]
15
15
  # no, one or many of bootstrap table styles (table- prefix will be added)
16
- # @param link [Symbol]
17
- # method name for the default name to use for anchor-tags
16
+ # @param link [String, Symbol, Array<String>, Array<Symbol>]
17
+ # field(s) that will link to the resource
18
18
  # @param paginate [true, false]
19
19
  # whether to render pagination links (default: false)
20
20
  # @param actions [Array<String>, Array<Symbol>]
@@ -23,15 +23,15 @@ module ActionTable
23
23
  records,
24
24
  fields,
25
25
  paginate: false,
26
- link: ActionTable.config.link_method,
26
+ links: ActionTable.config.links,
27
27
  actions: ActionTable.config.actions,
28
28
  styles: ActionTable.config.styles
29
29
  )
30
30
  action_table = View.new(
31
- cols: fields,
31
+ columns: fields,
32
32
  records: records,
33
33
  paginate: paginate,
34
- link: link,
34
+ links: links,
35
35
  actions: actions,
36
36
  styles: styles,
37
37
  )
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActionTable
4
- VERSION = '0.2.0'.freeze
4
+ VERSION = '0.3.0'.freeze
5
5
  end
@@ -1,34 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'set'
4
+ require 'action_table/bootstrap_styles'
4
5
 
5
6
  module ActionTable
6
7
  class View
7
8
  include ActionView::Helpers::UrlHelper
8
9
  include ActionTable.config.rails_host_app.routes.url_helpers
9
10
 
10
- attr_reader :model_name, :rows
11
+ attr_reader :model_name, :rows, :styles
11
12
 
12
13
  def initialize(
13
- cols:,
14
+ columns:,
14
15
  records:,
15
16
  paginate: false,
16
- link: ActionTable.config.link_method,
17
+ links: ActionTable.config.links,
17
18
  actions: ActionTable.config.actions,
18
19
  styles: ActionTable.config.styles
19
20
  )
20
- @col_names = cols.map(&:to_s)
21
+ @columns = columns.map(&:to_s)
21
22
  @rows = records
22
23
  @table_name = records.table_name
23
24
  @model_name = @table_name.singularize
24
25
  @paginate = paginate
25
- @link = Set.new(Array(link.to_s)).reject(&:empty?)
26
+ @links = Set.new(Array(links).map(&:to_s)).reject(&:empty?)
26
27
  @actions = Array(actions).map(&:to_s)
27
- @styles = Array(styles)
28
+ @styles = BootstrapStyles.new(styles)
28
29
  end
29
30
 
30
31
  def headers
31
- @headers ||= @col_names.map { |name| t_col(name) }
32
+ @headers ||= @columns.map { |name| t_col(name) }
32
33
  end
33
34
 
34
35
  # add header column padding for actions
@@ -36,17 +37,17 @@ module ActionTable
36
37
  @actions_header ||= [''] * @actions.length
37
38
  end
38
39
 
39
- def cols(record)
40
- attribute_columns = @col_names.map do |name|
40
+ def columns(record)
41
+ attribute_columns = @columns.map do |name|
41
42
  title = record.public_send(name)
42
- if title.present? && @link.include?(name)
43
+ if title.present? && @links.include?(name)
43
44
  link_to(title, record_path(record))
44
45
  else
45
46
  title
46
47
  end
47
48
  end
48
49
 
49
- actions = t_actions.zip(@actions).map do |data|
50
+ actions = t_actions.zip(@actions).map! do |data|
50
51
  title, name = data
51
52
  link_to(title, record_path(record, action: name))
52
53
  end
@@ -54,10 +55,6 @@ module ActionTable
54
55
  attribute_columns + actions
55
56
  end
56
57
 
57
- def styles_class
58
- @styles.map { |style| "table-#{style}" }.join(' ')
59
- end
60
-
61
58
  def paginate?
62
59
  @paginate
63
60
  end
@@ -1,4 +1,10 @@
1
- <table class="table <%= table.styles_class %>">
1
+ <% wrapper_class = table.styles.responsive_wrapper_class %>
2
+
3
+ <% if wrapper_class %>
4
+ <div class="<%= wrapper_class %>">
5
+ <% end %>
6
+
7
+ <table class="<%= table.styles.table_classes %>">
2
8
  <thead>
3
9
  <% table.headers.each do |header| %>
4
10
  <th><%= header %></th>
@@ -10,7 +16,7 @@
10
16
  <tbody>
11
17
  <% table.rows.each do |row| %>
12
18
  <tr>
13
- <% table.cols(row).each do |col| %>
19
+ <% table.columns(row).each do |col| %>
14
20
  <td><%= col %></td>
15
21
  <% end %>
16
22
  </tr>
@@ -18,6 +24,10 @@
18
24
  </tbody>
19
25
  </table>
20
26
 
27
+ <% if wrapper_class %>
28
+ </div>
29
+ <% end %>
30
+
21
31
  <% if table.paginate? %>
22
32
  <%= paginate table.rows, param_name: table.paginate_param_name %>
23
33
  <% end %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_table
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Burenstam
@@ -66,8 +66,8 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
- description: Render ActiveModel or ActiveRecord objects as HTML tables with one line
70
- of Ruby - supports some simple configuration options.
69
+ description: Render ActiveRecord objects as HTML tables with one line of Ruby - supports
70
+ some simple configuration options.
71
71
  email:
72
72
  - burenstam@gmail.com
73
73
  executables: []
@@ -79,6 +79,7 @@ files:
79
79
  - ".rubocop.yml"
80
80
  - ".ruby-style-guide.yml"
81
81
  - ".travis.yml"
82
+ - CHANGELOG.md
82
83
  - Gemfile
83
84
  - LICENSE
84
85
  - README.md
@@ -87,6 +88,7 @@ files:
87
88
  - bin/console
88
89
  - bin/setup
89
90
  - lib/action_table.rb
91
+ - lib/action_table/bootstrap_styles.rb
90
92
  - lib/action_table/helper.rb
91
93
  - lib/action_table/railtie.rb
92
94
  - lib/action_table/version.rb
@@ -115,6 +117,5 @@ rubyforge_project:
115
117
  rubygems_version: 2.7.6
116
118
  signing_key:
117
119
  specification_version: 4
118
- summary: Render ActiveModel or ActiveRecord objects as HTML tables with one line of
119
- Ruby.
120
+ summary: Render ActiveRecord objects as HTML tables with one line of Ruby.
120
121
  test_files: []