tabulatr2 0.9.20 → 0.9.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +17 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +4 -0
  5. data/Gemfile +4 -0
  6. data/app/assets/javascripts/tabulatr/_events.js +252 -0
  7. data/app/assets/javascripts/tabulatr/_pagination.js +85 -0
  8. data/app/assets/javascripts/tabulatr/_tabulatr.js +70 -372
  9. data/app/assets/javascripts/tabulatr/application.js +2 -0
  10. data/app/views/tabulatr/_tabulatr_actual_table.html.slim +7 -7
  11. data/app/views/tabulatr/_tabulatr_filter_dialog.html.slim +1 -1
  12. data/app/views/tabulatr/_tabulatr_static_table.html.slim +5 -3
  13. data/lib/tabulatr/data/data.rb +1 -1
  14. data/lib/tabulatr/data/dsl.rb +62 -86
  15. data/lib/tabulatr/data/filtering.rb +32 -52
  16. data/lib/tabulatr/data/sorting.rb +1 -1
  17. data/lib/tabulatr/params_builder.rb +50 -0
  18. data/lib/tabulatr/rails/action_view.rb +2 -2
  19. data/lib/tabulatr/rails/active_record.rb +3 -8
  20. data/lib/tabulatr/renderer/action.rb +1 -1
  21. data/lib/tabulatr/renderer/association.rb +3 -3
  22. data/lib/tabulatr/renderer/buttons.rb +1 -1
  23. data/lib/tabulatr/renderer/column.rb +40 -125
  24. data/lib/tabulatr/renderer/columns_from_block.rb +10 -7
  25. data/lib/tabulatr/renderer/renderer.rb +26 -15
  26. data/lib/tabulatr/version.rb +1 -1
  27. data/lib/tabulatr.rb +1 -0
  28. data/spec/dummy/app/controllers/products_controller.rb +5 -6
  29. data/spec/dummy/app/tabulatr_data/product_tabulatr_data.rb +6 -6
  30. data/spec/dummy/app/views/products/stupid_array.html.erb +20 -6
  31. data/spec/dummy/app/views/products/with_styling.html.erb +1 -1
  32. data/spec/dummy/app/views/products/without_filters.html.erb +1 -0
  33. data/spec/dummy/config/routes.rb +1 -0
  34. data/spec/features/tabulatrs_spec.rb +7 -2
  35. data/spec/lib/tabulatr/data/data_spec.rb +2 -2
  36. data/spec/lib/tabulatr/data/dsl_spec.rb +54 -4
  37. data/spec/lib/tabulatr/data/filtering_spec.rb +164 -7
  38. data/spec/lib/tabulatr/data/formatting_spec.rb +2 -2
  39. data/spec/lib/tabulatr/data/sorting_spec.rb +6 -6
  40. data/spec/lib/tabulatr/params_builder_spec.rb +19 -0
  41. data/spec/lib/tabulatr/renderer/association_spec.rb +29 -0
  42. data/spec/lib/tabulatr/renderer/renderer_spec.rb +8 -0
  43. data/spec/rails_helper.rb +4 -0
  44. metadata +13 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8628bfd7be6d2d9e801984acaeef9057dd98aa24
4
- data.tar.gz: 07d356b31c00175e286fdb09d84681ec71a41492
3
+ metadata.gz: 56841eb8e3e3607969b5d1c47e3883491379b89e
4
+ data.tar.gz: 0d4161bd6fc978cb2eb49798da66e3ec55733330
5
5
  SHA512:
6
- metadata.gz: 7c313558231faee3dbbe107378401c04e517aba77caafd879b03f2104ef77dcdc7df50516fe01e078f801f3ad158185f8a8603bde668cb41f308b926de5b9d04
7
- data.tar.gz: e4835fbbb8ed8be42acf6ffde94deb2d3b8e8ba0e4e2948c4ef15002a0fa2534a9f560570c3f753a822def719e35b2b82bcaddd8a3eeb7d1160369bc0d24a49e
6
+ metadata.gz: 25d64c35946e6f69017326178eb33e80d8cebf8bf10aaf58f55408fd46986eddcd59a98f8ce2e95f3ee65cd240763f57d18c9f3c7f16d7173c8fe9eddf07cffa
7
+ data.tar.gz: b6aa5878acc666f2f5f17ac07230ab73c2c91032a0f9ac0f60bfa55236d2861da8f0e6ff44ba30244c8771879e25cf08e5aa07dbea88c6cd240905afcdb75f90
data/.codeclimate.yml ADDED
@@ -0,0 +1,17 @@
1
+ ---
2
+ engines:
3
+ rubocop:
4
+ enabled: true
5
+ eslint:
6
+ enabled: true
7
+ csslint:
8
+ enabled: true
9
+ ratings:
10
+ paths:
11
+ - "**.rb"
12
+ - "**.js"
13
+ - "**.jsx"
14
+ - "**.css"
15
+ exclude_paths:
16
+ - spec/**/*
17
+ - coverage/**/*
data/.gitignore CHANGED
@@ -8,3 +8,4 @@ log
8
8
  .DS_Store
9
9
  .rake_tasks~
10
10
  tabulatr2*.gem
11
+ coverage
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## UNRELEASED
2
+ * Rename `filter` option of `table_for` to `filters` to not conceal the
3
+ `table_option` also named `filter`.
4
+
1
5
  ## 0.9.20
2
6
  * Add `filter` to DSL to define custom filters
3
7
 
data/Gemfile CHANGED
@@ -9,6 +9,10 @@ group :development, :test do
9
9
  gem 'binding_of_caller', platforms: :ruby
10
10
  end
11
11
 
12
+ group :test do
13
+ gem 'simplecov', :require => false
14
+ end
15
+
12
16
 
13
17
  group :development, :test do
14
18
  gem 'sqlite3', :require => 'sqlite3'
@@ -0,0 +1,252 @@
1
+ $(document).on('ready page:load', function(){
2
+ tabulatr_tables = [];
3
+
4
+ $('th.tabulatr-sortable').click(function(){
5
+ var th = $(this);
6
+ var sort_by = th.data('tabulatr-column-name');
7
+ var dir = th.attr('data-sorted');
8
+ var table = th.parents('table');
9
+ var tableId = table.attr('id');
10
+ var table_obj;
11
+ for(var i = 0; i < tabulatr_tables.length; i++){
12
+ if(tabulatr_tables[i].id === tableId){
13
+ table_obj = tabulatr_tables[i];
14
+ }
15
+ }
16
+ var tableName = table_obj.id.split('_')[0];
17
+ table.find('th.tabulatr-sortable.sorted').removeClass('sorted').removeAttr('data-sorted');
18
+ dir = (dir === 'asc') ? 'desc' : 'asc';
19
+ th.addClass('sorted').attr('data-sorted', dir);
20
+ $('.tabulatr_filter_form[data-table='+ tableId +'] input[name='+ tableName +'_sort]').val(sort_by + ' '+ dir);
21
+ if(!table_obj.moreResults){
22
+ table_obj.moreResults = true;
23
+ if(table_obj.hasInfiniteScrolling){
24
+ $('.pagination_trigger[data-table='+ tableId +']').bind('inview', cbfn);
25
+ }
26
+ }
27
+ $($(this).parents('table').find('tbody tr')).remove();
28
+
29
+ $('.tabulatr_mark_all[data-table='+ tableName +']').prop('checked', false).prop('indeterminate', false);
30
+ table_obj.updateTable({});
31
+ });
32
+
33
+
34
+ $('.tabulatr_table').each(function(ix, el){
35
+ if($('.pagination[data-table="'+ $(el).attr('id') +'"]').length === 0){
36
+ $('.pagination_trigger[data-table="'+ $(el).attr('id') +'"]').bind('inview', cbfn);
37
+ }
38
+ });
39
+
40
+ $('.batch-action-inputs').click(function(){
41
+ var a = $(this);
42
+ var name = a.data('do-batch-action-name');
43
+ var key = a.data('do-batch-action');
44
+ var tableId = a.data('table-id');
45
+ var params = {page: 1};
46
+ params[name] = key;
47
+ params.tabulatr_checked = {checked_ids: jQuery.map($('#'+ tableId +' .tabulatr-checkbox:checked'), function(el){return $(el).val();}).join(',')};
48
+ var confirmation = true;
49
+ if(params.tabulatr_checked.checked_ids === ''){
50
+ confirmation = window.confirm(a.parents('ul').data('confirm-text'));
51
+ }
52
+ if(confirmation){
53
+ $('.tabulatr_mark_all[data-table='+ tableId +']').prop('indeterminate', false).prop('checked', false);
54
+ $('#'+ tableId +' .tabulatr-wrench').addClass('disabled');
55
+ var table_obj;
56
+ for(var i = 0; i < tabulatr_tables.length; i++){
57
+ if(tabulatr_tables[i].id === tableId){
58
+ table_obj = tabulatr_tables[i];
59
+ }
60
+ }
61
+ table_obj.updateTable(params, true);
62
+ }
63
+ });
64
+
65
+ $('form.tabulatr-fuzzy-search').submit(function(){
66
+ var tableId = $(this).data('table');
67
+ var table_obj;
68
+ for(var i = 0; i < tabulatr_tables.length; i++){
69
+ if(tabulatr_tables[i].id === tableId){
70
+ table_obj = tabulatr_tables[i];
71
+ }
72
+ }
73
+ if(table_obj.hasInfiniteScrolling){
74
+ $('.pagination_trigger[data-table='+ tableId +']').unbind('inview', cbfn);
75
+ $('.pagination_trigger[data-table='+ tableId +']').bind('inview', cbfn);
76
+ }
77
+ table_obj.updateTable({page: 1, append: false}, true);
78
+ return false;
79
+ });
80
+
81
+ $('form.tabulatr_filter_form input, form.tabulatr_filter_form select').change(function(){
82
+ $(this).parents('form.tabulatr_filter_form').submit();
83
+ });
84
+
85
+ $('form.tabulatr_filter_form').submit(function(){
86
+ var tableId = $(this).data('table');
87
+ var table_obj;
88
+ for(var i = 0; i < tabulatr_tables.length; i++){
89
+ if(tabulatr_tables[i].id === tableId){
90
+ table_obj = tabulatr_tables[i];
91
+ }
92
+ }
93
+ table_obj.submitFilterForm();
94
+ return false;
95
+ });
96
+
97
+ $('.tabulatr_mark_all').click(function(){
98
+ var tableId = $(this).parents('table').prop('id');
99
+ var table_obj;
100
+ for(var i = 0; i < tabulatr_tables.length; i++){
101
+ if(tabulatr_tables[i].id === tableId){
102
+ table_obj = tabulatr_tables[i];
103
+ }
104
+ }
105
+ if($(this).is(':checked')){
106
+ $('#'+ tableId +' tr[data-page]:visible input[type=checkbox]').prop('checked', true);
107
+ $('#'+ tableId +' .tabulatr-wrench').removeClass('disabled');
108
+ }else{
109
+ $('#'+ tableId +' tr[data-page]:visible input[type=checkbox]').prop('checked', false);
110
+ if(table_obj.checkIfCheckboxesAreMarked()){
111
+ $('#'+ tableId +' .tabulatr-wrench').removeClass('disabled');
112
+ }else{
113
+ $('#'+ tableId +' .tabulatr-wrench').addClass('disabled');
114
+ }
115
+ }
116
+ });
117
+
118
+ $('.tabulatr_table').on('click', 'input.tabulatr-checkbox', function(){
119
+ var $table = $(this).closest('.tabulatr_table');
120
+ var tableId = $table.attr('id');
121
+ var $markAllCheckbox = $table.find('.tabulatr_mark_all');
122
+ var table_obj;
123
+ for(var i = 0; i < tabulatr_tables.length; i++){
124
+ if(tabulatr_tables[i].id === tableId){
125
+ table_obj = tabulatr_tables[i];
126
+ }
127
+ }
128
+ if($(this).is(':checked')){
129
+ if($('#'+ tableId +' tr[data-page]:visible input[type=checkbox]').not(':checked').length > 0){
130
+ $markAllCheckbox.prop("indeterminate", true);
131
+ }else{
132
+ $markAllCheckbox.prop('indeterminate', false);
133
+ $markAllCheckbox.prop('checked', true);
134
+ }
135
+ $('#'+ tableId +' .tabulatr-wrench').removeClass('disabled');
136
+ }else{
137
+ if($('#'+ tableId +' tr[data-page]:visible input[type=checkbox]:checked').length > 0){
138
+ $markAllCheckbox.prop('indeterminate', true);
139
+ $('#'+ tableId +' .tabulatr-wrench').removeClass('disabled');
140
+ }else{
141
+ $markAllCheckbox.prop('indeterminate', false);
142
+ $markAllCheckbox.prop('checked', false);
143
+ if(table_obj.checkIfCheckboxesAreMarked()){
144
+ $('#'+ tableId +' .tabulatr-wrench').removeClass('disabled');
145
+ }else{
146
+ $('#'+ tableId +' .tabulatr-wrench').addClass('disabled');
147
+ }
148
+ }
149
+ }
150
+ });
151
+
152
+ $('.tabulatr-per-page a').click(function(){
153
+ if($(this).hasClass('active')){ return false; }
154
+ $(this).closest('div').find('a').removeClass('active');
155
+ $(this).addClass('active');
156
+ var tableId = $(this).closest('div').data('table');
157
+ var table_obj;
158
+ for(var i = 0; i < tabulatr_tables.length; i++){
159
+ if(tabulatr_tables[i].id === tableId){
160
+ table_obj = tabulatr_tables[i];
161
+ }
162
+ }
163
+ table_obj.moreResults = true;
164
+ if(table_obj.hasInfiniteScrolling){
165
+ $('.pagination_trigger[data-table='+ tableId +']').bind('inview', cbfn);
166
+ }
167
+ if(typeof(Storage) !== undefined){
168
+ localStorage.tabulatr_page_display_count = $(this).data('items-per-page');
169
+ }
170
+ table_obj.updateTable({page: 1}, true);
171
+ });
172
+
173
+ $(document).on('click', 'a[data-tabulatr-reset]',function(){
174
+ var a = $(this);
175
+ var tableObj;
176
+ var tableId = a.data('tabulatrReset');
177
+ a.parents('.tabulatr-outer-wrapper').removeClass('filtered');
178
+ for(var i = 0; i < tabulatr_tables.length; i++){
179
+ if(tabulatr_tables[i].id === tableId){
180
+ tableObj = tabulatr_tables[i];
181
+ tableObj.resetTable();
182
+ return false;
183
+ }
184
+ }
185
+ });
186
+
187
+ if($('.tabulatr_table:not(".tabulatr_static_table")').length > 0){
188
+ if(typeof(Storage) !== undefined){
189
+ var count = localStorage.tabulatr_page_display_count;
190
+ if(count !== undefined){
191
+ $('.tabulatr-per-page a').removeClass('active');
192
+ $('.tabulatr-per-page a[data-items-per-page='+ count +']').
193
+ addClass('active');
194
+ }
195
+ }
196
+ var tableObj, tableId, tabulatrTable;
197
+ $('.tabulatr_table:not(".tabulatr_static_table")').each(function(ix, el){
198
+ tableId = $(el).attr('id');
199
+ tabulatrTable = new Tabulatr(tableId);
200
+ if($(el).data('persistent')){
201
+ tabulatrTable.isAPersistedTable = true;
202
+ }
203
+ if($('.pagination[data-table='+ tableId +']').length === 0){
204
+ tabulatrTable.hasInfiniteScrolling = true;
205
+ }
206
+ tabulatr_tables.push(tabulatrTable);
207
+ for(var i = 0; i < tabulatr_tables.length; i++){
208
+ if(tabulatr_tables[i].id === tableId){
209
+ tableObj = tabulatr_tables[i];
210
+ }
211
+ }
212
+ tableObj.updateTable({}, false);
213
+ });
214
+ }
215
+
216
+ $(document).on('click', 'a[data-show-filters-for]', function(){
217
+ var a = $(this);
218
+ a.parents('.tabulatr-outer-wrapper').addClass('filtered');
219
+ });
220
+
221
+ });
222
+
223
+ $(document).on('click', '.pagination a[data-page]', function(){
224
+ var a = $(this);
225
+ if(a.parent().hasClass('active') ||
226
+ a.parent().hasClass('disabled')){
227
+ return false;
228
+ }
229
+ var tableId = $(a).closest('.pagination').data('table');
230
+ $('.tabulatr_mark_all[data-table='+ tableId +']').prop('checked', false);
231
+ $('.tabulatr_mark_all[data-table='+ tableId +']').prop('indeterminate', false);
232
+ var table_obj;
233
+ for(var i = 0; i < tabulatr_tables.length; i++){
234
+ if(tabulatr_tables[i].id === tableId){
235
+ table_obj = tabulatr_tables[i];
236
+ }
237
+ }
238
+ table_obj.updateTable({append: false, page: a.data('page')});
239
+ return false;
240
+ });
241
+
242
+
243
+ $(document).on('change', 'select[data-tabulatr-date-filter]', function() {
244
+ var select = $(this);
245
+ var option = select.find('option:selected');
246
+ var val = option.val();
247
+ if (val === 'from_to') {
248
+ select.parents('.tabulatr-filter-row').find(".from_to").show().removeClass('hidden');
249
+ } else {
250
+ select.parents('.tabulatr-filter-row').find(".from_to").hide().val('');
251
+ }
252
+ });
@@ -0,0 +1,85 @@
1
+ function TabulatrPagination(pageCount, tableId){
2
+ this.pageCount = pageCount;
3
+ this.tableId = tableId;
4
+ }
5
+
6
+ TabulatrPagination.prototype = {
7
+ constructor: TabulatrPagination,
8
+
9
+ createPaginationListItem: function(page, active){
10
+ var $page = $('<li><a href="" data-page="'+ page +'">'+ page +'</a></li>');
11
+ if(active){
12
+ $page.addClass('active');
13
+ }
14
+ return $page;
15
+ },
16
+
17
+ updatePagination: function(currentPage){
18
+ var $paginatorUl = $('.pagination[data-table='+ this.tableId +'] > ul');
19
+ $paginatorUl.html(this.createResetButton());
20
+ if(this.pageCount < 13){
21
+ for(var i = 1; i <= this.pageCount; i++){
22
+ $paginatorUl.append(this.createPaginationListItem(i, (i == currentPage)));
23
+ }
24
+ }else{
25
+ if(currentPage > 1){
26
+ $paginatorUl.append(this.createPaginationListItem(1, false));
27
+ }
28
+
29
+ var between = Math.floor((1 + currentPage) / 2);
30
+ if(between > 1 && between < currentPage - 2){
31
+ $paginatorUl.append('<li><span>...</span></li>');
32
+ $paginatorUl.append(this.createPaginationListItem(between, false));
33
+ }
34
+
35
+ if(currentPage > 4){
36
+ $paginatorUl.append('<li><span>...</span></li>');
37
+ }
38
+
39
+ if(currentPage > 3){
40
+ $paginatorUl.append(this.createPaginationListItem(currentPage-2, false));
41
+ }
42
+
43
+ if(currentPage > 2){
44
+ $paginatorUl.append(this.createPaginationListItem(currentPage-1, false));
45
+ }
46
+
47
+ $paginatorUl.append(this.createPaginationListItem(currentPage, true));
48
+
49
+ if(currentPage < this.pageCount - 1){
50
+ $paginatorUl.append(this.createPaginationListItem(currentPage+1, false));
51
+ }
52
+
53
+ if(currentPage < this.pageCount - 2){
54
+ $paginatorUl.append(this.createPaginationListItem(currentPage+2, false));
55
+ }
56
+
57
+ if(currentPage < this.pageCount - 3){
58
+ $paginatorUl.append('<li><span>...</span></li>');
59
+ }
60
+
61
+ between = Math.floor((currentPage + this.pageCount) / 2);
62
+
63
+ if(this.additionalPlaceholderNeeded(between, currentPage)){
64
+ $paginatorUl.append(this.createPaginationListItem(between, false));
65
+ $paginatorUl.append('<li><span>...</span></li>');
66
+ }
67
+ if(currentPage < this.pageCount){
68
+ $paginatorUl.append(this.createPaginationListItem(this.pageCount, false));
69
+ }
70
+ }
71
+
72
+ },
73
+
74
+ createResetButton: function() {
75
+ var html = '';
76
+ if($('table#'+ this.tableId).data('persistent')){
77
+ html = '<li><a href="#" data-tabulatr-reset="'+ this.tableId +'"><i class="fa fa-refresh"></i></a></li>';
78
+ }
79
+ return html;
80
+ },
81
+
82
+ additionalPlaceholderNeeded: function(pageToCompare, currentPage){
83
+ return pageToCompare > currentPage + 3 && pageToCompare < this.pageCount - 1;
84
+ }
85
+ }