action_table 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []