table_on_steroids 0.1.0.5 → 0.1.1.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: 461a53274c2bf291e7b89db8d818875153976f2d65473d3f041f2ed4810c5c89
4
- data.tar.gz: 1558e8e8b3287e65ccc86b939e967a0ebe2497a50cb8f1f592dec444a418a868
3
+ metadata.gz: 2d4edd10e8041898d2a51d6ce362e6317579c0e16f8862bff1fcbc82f1111ff2
4
+ data.tar.gz: c51917c51b558e9a4a158b8e5d3ed688064e945a44c689be91a3c759e23ee719
5
5
  SHA512:
6
- metadata.gz: d94a64d6d4236385d4278c799dbf1e2d675257c726b88b19e99cc02be2d3641a2d6d5126f8240753a19ae9e2cdfb17f45573443791e5e388975ad04e7cf8c806
7
- data.tar.gz: 41874617183a0abd085e9f799701be203dab310b8fe98413a266cde3afdd49d3356443b4caa439425fac53d3c54923c71618ded10452aa9503ad3418ab48d3cc
6
+ metadata.gz: 7f83e38d52722c6bcac3b3a9078a3a6bcc38f88200b50632348d207af53c6f15f48cd4e80abe2cab53cc0fd5eef17dcc7dfbca094bd88c465f85c0512006f845
7
+ data.tar.gz: 2666272c49fc25c18b35a175d61c83553d96f818229dfbfde48fac496b47b71c35bdce376a0a5d5c33cd654ded83b5d29fc9ff36d8744c89c63db82a503c61f9
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- table_on_steroids (0.1.0.5)
4
+ table_on_steroids (0.1.1.0)
5
5
  bootstrap-datepicker-rails (~> 1)
6
6
  bootstrap-multiselect-rails (~> 0.9)
7
7
  kaminari (~> 1.1)
data/README.md CHANGED
@@ -22,7 +22,94 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ ### Add assets
26
+
27
+ application.js
28
+
29
+ ```
30
+ //= require table_on_steroids
31
+ ```
32
+
33
+ application.scss
34
+ ```
35
+ @import "table_on_steroids";
36
+ ```
37
+
38
+ ### In the controller
39
+ #### Add the concern
40
+
41
+ ```
42
+ require 'table_on_steroids'
43
+ include TableOnSteroids::TableConcern
44
+ ```
45
+
46
+ #### Define a global search (optional)*
47
+ ```
48
+ def global_search
49
+ @global_search_lambda ||= nil #put whatever lambda you want here -> (objects, query) { objects.deep_search(query) }
50
+ end
51
+ ```
52
+
53
+ #### Define your columns
54
+
55
+ The columns are defined by a hash:
56
+ Key: a key defining the column
57
+
58
+ options:
59
+ - *label*: column title
60
+ - *type*:
61
+ - *value_lambda*: how to get the value of this object. "context" is the view context. You can use it to call view methods (eg: `context.link_to` ... ; `context.render` ...)
62
+ - array : array lambdas for search and order
63
+ - filter_lambda
64
+ - order_lambda
65
+ - search_lambda
66
+ - activerecord : activerecord lambdas for search and order
67
+ - filter_lambda
68
+ - order_lambda
69
+ - search_lambda
70
+
71
+
72
+ ```
73
+ def columns_on_steroid
74
+ @columns_on_steroid ||= {
75
+ 'email' => {
76
+ label: "email",
77
+ type: 'order',
78
+ array: {
79
+ order_lambda: -> (objects) { objects.sort_by{ |o| o.user.email.downcase } }
80
+ },
81
+ activerecord: {
82
+ search_lambda: -> (objects, v) { objects.joins(:user).where('users.email ilike ?', ("%" + v + "%")) }
83
+ },
84
+ value_lambda: -> (object, context) { object.user.email }
85
+ }, ..
86
+ ```
87
+ #### Use the columns to search and order
88
+ ```
89
+ @objects = filter_and_order(@objects, columns_on_steroid, global_search)
90
+ ```
91
+ #### Use the columns to create a csv
92
+ add *download_value_lambda* to your table columns
93
+ ```
94
+ table_csv(@objects , columns_on_steroid_fulfillment)
95
+ ```
96
+
97
+ ### In the view
98
+
99
+ Render the table
100
+
101
+ ```
102
+ = render partial: 'table_on_steroids/table_on_steroids', locals: { objects: @objects, columns: @columns_on_steroid}
103
+
104
+ ```
105
+
106
+ _locals extra options:_
107
+ - title
108
+ - download_csv: the link of the download csv
109
+ - table_on_steroid_id
110
+ - omit_columns
111
+
112
+
26
113
 
27
114
  ## Development
28
115
 
@@ -27,6 +27,7 @@
27
27
  #
28
28
  #####
29
29
  require 'kaminari'
30
+ require 'csv'
30
31
 
31
32
  module TableOnSteroids
32
33
  module TableConcern
@@ -35,8 +36,8 @@ module TableOnSteroids
35
36
  included do
36
37
  OBJECTS_PER_PAGE = 50
37
38
  end
38
-
39
- def filter_and_order(objects, columns_on_steroid, global_search=nil, include_counts=false )
39
+
40
+ def filter_and_order(objects, columns_on_steroid, global_search=nil, include_counts=false, all_pages=false )
40
41
  # execute the global search if you have one
41
42
  objects = global_search.call(objects,params[:search]) if global_search && params[:search].present?
42
43
 
@@ -69,7 +70,7 @@ module TableOnSteroids
69
70
  end
70
71
 
71
72
  #pagination
72
-
73
+ return (include_counts ? [objects, 1, objects.count] : objects) if all_pages
73
74
  if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
74
75
  objects = objects.page(params[:page]).per(OBJECTS_PER_PAGE)
75
76
  total_pages = objects.total_pages
@@ -82,8 +83,23 @@ module TableOnSteroids
82
83
  end
83
84
  include_counts ? [objects, total_pages, total_count] : objects
84
85
  end
85
-
86
-
86
+
87
+ def table_csv(objects, columns_on_steroid)
88
+ titles = []
89
+ csvs = CSV.generate do |csv|
90
+ columns_on_steroid.select{ |c,v| v[:download_value_lambda].present? }.each{ |c,v| ((v[:download_label].present?) ? titles.push(*v[:download_label]) : titles << v[:label]) }
91
+ csv << titles
92
+ objects.each do |o|
93
+ vals = []
94
+ columns_on_steroid.select{ |c,v| v[:download_value_lambda].present? }.each do |c,v|
95
+ vals.push(*v[:download_value_lambda].call(o))
96
+ end
97
+ csv << vals
98
+ end
99
+ end
100
+ end
101
+
102
+
87
103
  def objects_where(objects, columns_on_steroid, t)
88
104
  columns_on_steroid.select{
89
105
  |c,v| v[t] && v[t][:search_lambda].present? }.each{
@@ -10,6 +10,7 @@
10
10
  <% title ||= nil %>
11
11
  <% subtext ||= nil %>
12
12
  <% subtext_partial ||= nil %>
13
+ <% csv_image ||= nil %>
13
14
  <% param_hash = CGI::parse(request.query_string) %>
14
15
  <% expected_column_keys = columns.map{|col,col_values| col }+columns.map{|col,col_values|("search_" + col)}+columns.map{|col,col_values|("search_operator_" + col)} %>
15
16
  <div class="table-on-steroids" id="<%= table_on_steroid_id %>">
@@ -54,8 +55,8 @@
54
55
  </div>
55
56
  <% if(download_csv) %>
56
57
  <div class="float-right">
57
- <a href="<%= (download_csv + "?filter=#{request.query_string.to_s}") %>" style="float:right">
58
- <%= image_tag "csv.png", :height => "25", :style => "padding-top:5px;" %>
58
+ <a href="<%= (download_csv + "?filter=#{request.query_string.to_s}") %>" style="float:right" target="_blank">
59
+ <%= image_tag csv_image || "csv.png", :height => "25", :style => "padding-top:5px;" %>
59
60
  </a>
60
61
  </div>
61
62
  <% end %>
@@ -3,7 +3,7 @@
3
3
  <% columns_on_steroid.each_pair do | k , v | %>
4
4
  <td class="column column-<%= k %> <%= 'd-none' unless selected_columns.include?(k) %> filter-cell-left <%= v[:css_class].join(' ') if(v[:css_class]) %> <%= table_on_steroid_id %>">
5
5
  <% if v[:type] == 'filter' %>
6
- <%= select_tag("filters[#{k}]", options_for_select(v[:select_values], params[:filters] && params[:filters][k]), multiple: v[:multiselect], class: 'selectpicker form-control filter-control', form: "knowledge_base_filters#{table_on_steroid_id}", data: { "none-selected-text" => v[:label], style: 'table-on-steroids-selectpicker ', table_on_steroid_id: table_on_steroid_id}, table_on_steroid_id: table_on_steroid_id ) %>
6
+ <%= select_tag("filters[#{k}]", options_for_select(v[:select_values], params[:filters] && params[:filters][k]), multiple: v[:multiselect], class: 'form-control filter-control', form: "knowledge_base_filters#{table_on_steroid_id}", data: { "none-selected-text" => v[:label], style: 'table-on-steroids-selectpicker ', table_on_steroid_id: table_on_steroid_id}, table_on_steroid_id: table_on_steroid_id ) %>
7
7
  <% elsif((v[:activerecord].present? && v[:activerecord][:search_lambda].present?) || (v[:array].present? && v[:array][:search_lambda].present?)) %>
8
8
  <% operator_present = (v[:datatype].present? && ['date','integer'].include?(v[:datatype])) %>
9
9
  <% if operator_present %>
@@ -1,3 +1,3 @@
1
1
  module TableOnSteroids
2
- VERSION = "0.1.0.5"
2
+ VERSION = "0.1.1.0"
3
3
  end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: table_on_steroids
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.5
4
+ version: 0.1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marieke Gueye
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-02-25 00:00:00.000000000 Z
12
+ date: 2019-05-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bootstrap-datepicker-rails
@@ -126,6 +126,7 @@ files:
126
126
  - lib/table_on_steroids.rb
127
127
  - lib/table_on_steroids/version.rb
128
128
  - table_on_steroids.gemspec
129
+ - vendor/assets/images/csv.png
129
130
  - vendor/assets/javascripts/table_on_steroids.js
130
131
  - vendor/assets/stylesheets/table_on_steroids.scss
131
132
  homepage: http://www.github.com/mariekou