tabulatr2 0.9.15 → 0.9.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +5 -1
- data/app/assets/javascripts/tabulatr/_tabulatr.js +79 -83
- data/app/assets/stylesheets/{tabulatr/application.css.scss → tabulatr.scss} +8 -4
- data/app/views/tabulatr/_tabulatr_batch_actions_menu.html.slim +1 -1
- data/app/views/tabulatr/_tabulatr_buttons.html.slim +0 -1
- data/app/views/tabulatr/_tabulatr_filter_dialog.html.slim +5 -0
- data/lib/tabulatr/generators/tabulatr/templates/tabulatr.yml +4 -0
- data/lib/tabulatr/renderer/column.rb +5 -1
- data/lib/tabulatr/version.rb +1 -1
- data/spec/dummy/app/assets/stylesheets/application.scss +2 -0
- data/spec/dummy/app/models/product.rb +3 -0
- data/spec/dummy/app/tabulatr_data/product_tabulatr_data.rb +2 -1
- data/spec/dummy/app/views/products/simple_index.html.erb +1 -1
- data/spec/dummy/config/locales/tabulatr.yml +4 -1
- data/spec/dummy/db/migrate/20141223164833_add_status_to_products.rb +5 -0
- data/spec/dummy/db/schema.rb +3 -1
- data/spec/features/tabulatrs_spec.rb +33 -10
- data/spec/lib/tabulatr/data/dsl_spec.rb +8 -8
- data/spec/lib/tabulatr/data/filtering_spec.rb +2 -2
- data/spec/lib/tabulatr/data/formatting_spec.rb +2 -2
- data/spec/lib/tabulatr/data/pagination_spec.rb +2 -2
- data/spec/lib/tabulatr/data/sorting_spec.rb +3 -2
- data/spec/lib/tabulatr/renderer/checkbox_spec.rb +3 -1
- data/spec/rails_helper.rb +2 -1
- data/spec/support/wait_for_ajax.rb +16 -0
- metadata +10 -7
- data/app/assets/stylesheets/tabulatr.css.scss +0 -2
- data/spec/dummy/app/assets/stylesheets/application.css.scss +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b70faeab636c745520f3c94de294232af0540e1d
|
4
|
+
data.tar.gz: b3feca6e1aeabdf69b5b5ada582b2a6a91834957
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44a287bc0b2493272e229cf0646b3829a2c9f79424e8ca5a5e1717531cb56bd9349774c4b69139b6423c672dfd3f04e180687e3a9399706d6e3ce8e47cf68ab0
|
7
|
+
data.tar.gz: 30052dc24ecf51e7975bd54fd5adcf75d1cbea36295bb1b100fc070fbffdda79cacd01a07defe1f91d98ae84dafa91caaeccc813cea0d538f50f98a365cf7d21
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -18,11 +18,15 @@ gem 'tabulatr2'
|
|
18
18
|
After that run `bundle install`.
|
19
19
|
|
20
20
|
Also add `//= require tabulatr` to your application js file and `*= require tabulatr` to your CSS asset
|
21
|
-
pipeline.
|
21
|
+
pipeline. Make sure to add it after including the `bootstrap` assets.
|
22
22
|
|
23
23
|
In order to get the provided `i18n` language files run
|
24
24
|
`rails g tabulatr:install`
|
25
25
|
|
26
|
+
## Example
|
27
|
+
|
28
|
+
![example](https://cloud.githubusercontent.com/assets/570608/5580201/661c63c0-9047-11e4-9993-f71a0f1f4c00.png)
|
29
|
+
|
26
30
|
## The DSL
|
27
31
|
|
28
32
|
`Tabulatr` provides an easy to use DSL to define the data to be used in your table. It is defined in `TabulatrData`
|
@@ -9,6 +9,19 @@ function Tabulatr(id){
|
|
9
9
|
this.hasInfiniteScrolling = false;
|
10
10
|
}
|
11
11
|
|
12
|
+
var cbfn = function(event, isInView, visiblePartX, visiblePartY) {
|
13
|
+
if (isInView && visiblePartY !== 'top' && visiblePartY !== 'bottom') {
|
14
|
+
var tableId = $(event.currentTarget).data('table');
|
15
|
+
var table_obj;
|
16
|
+
for(var i = 0; i < tabulatr_tables.length; i++){
|
17
|
+
if(tabulatr_tables[i].id === tableId){
|
18
|
+
table_obj = tabulatr_tables[i];
|
19
|
+
}
|
20
|
+
}
|
21
|
+
table_obj.updateTable({append: true});
|
22
|
+
}
|
23
|
+
};
|
24
|
+
|
12
25
|
var tabulatr_tables;
|
13
26
|
Tabulatr.prototype = {
|
14
27
|
constructor: Tabulatr,
|
@@ -108,7 +121,6 @@ Tabulatr.prototype = {
|
|
108
121
|
}
|
109
122
|
if(this.locked){ return; }
|
110
123
|
this.locked = true;
|
111
|
-
var curTable = this;
|
112
124
|
this.showLoadingSpinner();
|
113
125
|
if(this.initialRequest && this.isAPersistedTable && localStorage[this.id]){
|
114
126
|
data = JSON.parse(localStorage[this.id]);
|
@@ -150,7 +162,7 @@ Tabulatr.prototype = {
|
|
150
162
|
}
|
151
163
|
},
|
152
164
|
|
153
|
-
handleError: function(
|
165
|
+
handleError: function(){
|
154
166
|
if(this.isAPersistedTable && this.initialRequest){
|
155
167
|
this.initialRequest = false;
|
156
168
|
this.locked = false;
|
@@ -161,54 +173,36 @@ Tabulatr.prototype = {
|
|
161
173
|
insertTabulatrData: function(response){
|
162
174
|
var tableId = response.meta.table_id;
|
163
175
|
var tbody = $('#'+ tableId +' tbody');
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
var
|
183
|
-
var
|
184
|
-
var
|
185
|
-
|
186
|
-
if(
|
187
|
-
|
188
|
-
delete data._row_config.data;
|
176
|
+
|
177
|
+
this.prepareTableForInsert(tableId, response.meta.append, response.data.length, response.meta.count);
|
178
|
+
|
179
|
+
|
180
|
+
// insert the actual data
|
181
|
+
for(var i = 0; i < response.data.length; i++){
|
182
|
+
var data = response.data[i];
|
183
|
+
var id = data.id;
|
184
|
+
var tr = $('#'+ tableId +' tr.empty_row').clone();
|
185
|
+
tr.removeClass('empty_row');
|
186
|
+
if(data._row_config.data){
|
187
|
+
tr.data(data._row_config.data);
|
188
|
+
delete data._row_config.data;
|
189
|
+
}
|
190
|
+
tr.attr(data._row_config);
|
191
|
+
tr.attr('data-page', response.meta.page);
|
192
|
+
tr.attr('data-id', id);
|
193
|
+
tr.find('td').each(function(index,element) {
|
194
|
+
var td = $(element);
|
195
|
+
var coltype = td.data('tabulatr-type');
|
196
|
+
var name = td.data('tabulatr-column-name');
|
197
|
+
var cont = data[name];
|
198
|
+
if(coltype === 'checkbox') {
|
199
|
+
cont = $("<input>").attr('type', 'checkbox').val(id).addClass('tabulatr-checkbox');
|
189
200
|
}
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
tr.find('td').each(function(index,element) {
|
194
|
-
var td = $(element);
|
195
|
-
var coltype = td.data('tabulatr-type');
|
196
|
-
var name = td.data('tabulatr-column-name');
|
197
|
-
var cont = data[name];
|
198
|
-
if(coltype === 'checkbox') {
|
199
|
-
cont = $("<input>").attr('type', 'checkbox').val(id).addClass('tabulatr-checkbox');
|
200
|
-
}
|
201
|
-
td.html(cont);
|
202
|
-
});
|
203
|
-
tbody.append(tr);
|
204
|
-
}
|
201
|
+
td.html(cont);
|
202
|
+
});
|
203
|
+
tbody.append(tr);
|
205
204
|
}
|
206
|
-
|
207
|
-
count_string = count_string.replace(/%\{current\}/, response.meta.count);
|
208
|
-
count_string = count_string.replace(/%\{total\}/, response.meta.total);
|
209
|
-
count_string = count_string.replace(/%\{per_page\}/,
|
210
|
-
response.meta.pagesize);
|
211
|
-
$('.tabulatr_count[data-table='+ tableId +']').html(count_string);
|
205
|
+
this.updateInfoString(tableId, response);
|
212
206
|
|
213
207
|
if(this.isAPersistedTable){
|
214
208
|
this.retrieveTableFromLocalStorage(response);
|
@@ -216,7 +210,7 @@ Tabulatr.prototype = {
|
|
216
210
|
},
|
217
211
|
|
218
212
|
|
219
|
-
replacer: function(match, attribute
|
213
|
+
replacer: function(match, attribute){
|
220
214
|
return this.currentData[attribute];
|
221
215
|
},
|
222
216
|
|
@@ -267,7 +261,7 @@ Tabulatr.prototype = {
|
|
267
261
|
return hash;
|
268
262
|
},
|
269
263
|
|
270
|
-
localDate: function(value
|
264
|
+
localDate: function(value){
|
271
265
|
return new Date(value).toLocaleString();
|
272
266
|
},
|
273
267
|
|
@@ -279,6 +273,29 @@ Tabulatr.prototype = {
|
|
279
273
|
this.initialRequest = false;
|
280
274
|
this.locked = false;
|
281
275
|
$('.tabulatr-spinner-box[data-table="'+ this.id +'"]').hide();
|
276
|
+
},
|
277
|
+
|
278
|
+
updateInfoString: function(tableId, response){
|
279
|
+
var count_string = $('.tabulatr_count[data-table='+ tableId +']').data('format-string');
|
280
|
+
count_string = count_string.replace(/%\{current\}/, response.meta.count);
|
281
|
+
count_string = count_string.replace(/%\{total\}/, response.meta.total);
|
282
|
+
count_string = count_string.replace(/%\{per_page\}/,
|
283
|
+
response.meta.pagesize);
|
284
|
+
$('.tabulatr_count[data-table='+ tableId +']').html(count_string);
|
285
|
+
},
|
286
|
+
|
287
|
+
prepareTableForInsert: function(tableId, append, dataCount, actualCount){
|
288
|
+
if(!append){
|
289
|
+
if(this.storePage){
|
290
|
+
$('#'+ tableId +' tbody tr').hide();
|
291
|
+
}else{
|
292
|
+
$('#'+ tableId +' tbody').html('');
|
293
|
+
}
|
294
|
+
}
|
295
|
+
if(dataCount === 0 || this.currentCount() + dataCount >= actualCount){
|
296
|
+
this.moreResults = false;
|
297
|
+
$('.pagination_trigger[data-table='+ tableId +']').unbind('inview');
|
298
|
+
}
|
282
299
|
}
|
283
300
|
|
284
301
|
};
|
@@ -294,7 +311,7 @@ $(document).on('ready page:load', function(){
|
|
294
311
|
var tableId = table.attr('id');
|
295
312
|
var table_obj;
|
296
313
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
297
|
-
if(tabulatr_tables[i].id
|
314
|
+
if(tabulatr_tables[i].id === tableId){
|
298
315
|
table_obj = tabulatr_tables[i];
|
299
316
|
}
|
300
317
|
}
|
@@ -334,7 +351,7 @@ $(document).on('ready page:load', function(){
|
|
334
351
|
$('#'+ tableId +' .tabulatr-wrench').addClass('disabled');
|
335
352
|
var table_obj;
|
336
353
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
337
|
-
if(tabulatr_tables[i].id
|
354
|
+
if(tabulatr_tables[i].id === tableId){
|
338
355
|
table_obj = tabulatr_tables[i];
|
339
356
|
}
|
340
357
|
}
|
@@ -345,7 +362,7 @@ $(document).on('ready page:load', function(){
|
|
345
362
|
var tableId = $(this).data('table');
|
346
363
|
var table_obj;
|
347
364
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
348
|
-
if(tabulatr_tables[i].id
|
365
|
+
if(tabulatr_tables[i].id === tableId){
|
349
366
|
table_obj = tabulatr_tables[i];
|
350
367
|
}
|
351
368
|
}
|
@@ -365,7 +382,7 @@ $(document).on('ready page:load', function(){
|
|
365
382
|
var tableId = $(this).data('table');
|
366
383
|
var table_obj;
|
367
384
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
368
|
-
if(tabulatr_tables[i].id
|
385
|
+
if(tabulatr_tables[i].id === tableId){
|
369
386
|
table_obj = tabulatr_tables[i];
|
370
387
|
}
|
371
388
|
}
|
@@ -377,7 +394,7 @@ $(document).on('ready page:load', function(){
|
|
377
394
|
var tableId = $(this).parents('table').prop('id');
|
378
395
|
var table_obj;
|
379
396
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
380
|
-
if(tabulatr_tables[i].id
|
397
|
+
if(tabulatr_tables[i].id === tableId){
|
381
398
|
table_obj = tabulatr_tables[i];
|
382
399
|
}
|
383
400
|
}
|
@@ -400,7 +417,7 @@ $(document).on('ready page:load', function(){
|
|
400
417
|
var $markAllCheckbox = $table.find('.tabulatr_mark_all');
|
401
418
|
var table_obj;
|
402
419
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
403
|
-
if(tabulatr_tables[i].id
|
420
|
+
if(tabulatr_tables[i].id === tableId){
|
404
421
|
table_obj = tabulatr_tables[i];
|
405
422
|
}
|
406
423
|
}
|
@@ -435,7 +452,7 @@ $(document).on('ready page:load', function(){
|
|
435
452
|
var tableId = $(this).closest('div').data('table');
|
436
453
|
var table_obj;
|
437
454
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
438
|
-
if(tabulatr_tables[i].id
|
455
|
+
if(tabulatr_tables[i].id === tableId){
|
439
456
|
table_obj = tabulatr_tables[i];
|
440
457
|
}
|
441
458
|
}
|
@@ -451,11 +468,11 @@ $(document).on('ready page:load', function(){
|
|
451
468
|
|
452
469
|
$(document).on('click', 'a[data-tabulatr-reset]',function(){
|
453
470
|
var a = $(this);
|
454
|
-
var tableObj
|
471
|
+
var tableObj;
|
455
472
|
var tableId = a.data('tabulatrReset');
|
456
|
-
a.parents('.tabulatr-outer-wrapper').removeClass('filtered')
|
473
|
+
a.parents('.tabulatr-outer-wrapper').removeClass('filtered');
|
457
474
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
458
|
-
if(tabulatr_tables[i].id
|
475
|
+
if(tabulatr_tables[i].id === tableId){
|
459
476
|
tableObj = tabulatr_tables[i];
|
460
477
|
tableObj.resetTable();
|
461
478
|
return false;
|
@@ -484,7 +501,7 @@ $(document).on('ready page:load', function(){
|
|
484
501
|
}
|
485
502
|
tabulatr_tables.push(tabulatrTable);
|
486
503
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
487
|
-
if(tabulatr_tables[i].id
|
504
|
+
if(tabulatr_tables[i].id === tableId){
|
488
505
|
tableObj = tabulatr_tables[i];
|
489
506
|
}
|
490
507
|
}
|
@@ -510,7 +527,7 @@ $(document).on('click', '.pagination a[data-page]', function(){
|
|
510
527
|
$('.tabulatr_mark_all[data-table='+ tableId +']').prop('indeterminate', false);
|
511
528
|
var table_obj;
|
512
529
|
for(var i = 0; i < tabulatr_tables.length; i++){
|
513
|
-
if(tabulatr_tables[i].id
|
530
|
+
if(tabulatr_tables[i].id === tableId){
|
514
531
|
table_obj = tabulatr_tables[i];
|
515
532
|
}
|
516
533
|
}
|
@@ -529,24 +546,3 @@ $(document).on('change', 'select[data-tabulatr-date-filter]', function() {
|
|
529
546
|
select.parents('.tabulatr-filter-row').find(".from_to").hide().val('');
|
530
547
|
}
|
531
548
|
});
|
532
|
-
|
533
|
-
|
534
|
-
var cbfn = function(event, isInView, visiblePartX, visiblePartY) {
|
535
|
-
if (isInView) {
|
536
|
-
// element is now visible in the viewport
|
537
|
-
if (visiblePartY == 'top') {
|
538
|
-
// top part of element is visible
|
539
|
-
} else if (visiblePartY == 'bottom') {
|
540
|
-
// bottom part of element is visible
|
541
|
-
} else {
|
542
|
-
var tableId = $(event.currentTarget).data('table');
|
543
|
-
var table_obj;
|
544
|
-
for(var i = 0; i < tabulatr_tables.length; i++){
|
545
|
-
if(tabulatr_tables[i].id == tableId){
|
546
|
-
table_obj = tabulatr_tables[i];
|
547
|
-
}
|
548
|
-
}
|
549
|
-
table_obj.updateTable({append: true});
|
550
|
-
}
|
551
|
-
}
|
552
|
-
};
|
@@ -57,10 +57,6 @@
|
|
57
57
|
opacity: 1;
|
58
58
|
}
|
59
59
|
|
60
|
-
.popover .tabulatr_filter_form {
|
61
|
-
width: 400px;
|
62
|
-
}
|
63
|
-
|
64
60
|
.tabulatr_filtered_column{
|
65
61
|
text-decoration: underline;
|
66
62
|
}
|
@@ -192,4 +188,12 @@
|
|
192
188
|
position: relative;
|
193
189
|
text-align: center;
|
194
190
|
}
|
191
|
+
|
192
|
+
.tabulatr-filter-row{
|
193
|
+
label{
|
194
|
+
display: block;
|
195
|
+
}
|
196
|
+
}
|
195
197
|
}
|
198
|
+
|
199
|
+
@import 'font-awesome';
|
@@ -23,7 +23,7 @@
|
|
23
23
|
- iname = "#{formatted_name}_batch"
|
24
24
|
.dropdown
|
25
25
|
a.btn.btn-default data-toggle="dropdown" href="#"
|
26
|
-
i.icon-cog.glyphicon.glyphicon-cog.fa.fa-cog
|
26
|
+
i.icon-cog.glyphicon.glyphicon-cog.fa.fa-cog>
|
27
27
|
i.icon-caret-down.glyphicon.glyphicon-chevron-down.fa.fa-caret-down
|
28
28
|
ul.dropdown-menu role="menu" aria-labelledby="dLabel"
|
29
29
|
- table_options[:batch_actions].each do |key, label|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
//{:buttons=>[{:icon=>:"eye-open", :path=>"/products/1", :options=>{:class=>"btn-success"}}, {:icon=>:pencil, :path=>"/products/1/edit", :options=>{:class=>"btn-warning"}}], :submenu=>[{:icon=>:star, :path=>"/products/1", :label=>"Dolle Sache"}, :divider, {:icon=>:"trash-o", :path=>"/products/1", :label=>"Löschen", :options=>{:confirm=>"echt?", :class=>"btn-danger", :method=>:delete}}]}
|
2
1
|
.btn-group
|
3
2
|
- buttons[:buttons].each do |button|
|
4
3
|
- o = (button[:options] || {}).merge(class: "btn btn-sm btn-default #{button[:options].try(:[], :class)}")
|
@@ -89,5 +89,10 @@
|
|
89
89
|
label.control-label for="#{formatted_name}_#{name}_filter_from"
|
90
90
|
= "Bis"
|
91
91
|
input.tabulatr_filter.form-control.date-picker.from_to.hidden type="text" id="#{formatted_name}_#{name}_filter_to" name="#{iname}[date][to]"
|
92
|
+
- elsif column.filter == :enum
|
93
|
+
select.form-control name=iname data-tabulatr-attribute=name
|
94
|
+
option= I18n.t('tabulatr.enum_filter.none')
|
95
|
+
- column.klass.try(column.name.to_s.pluralize.to_sym).each do |key, value|
|
96
|
+
option value=value = key
|
92
97
|
- else
|
93
98
|
input.tabulatr_filter.form-control type="text" data-tabulatr-attribute="#{name}" name="#{iname}[like]"
|
@@ -182,7 +182,11 @@ class Tabulatr::Renderer::Column
|
|
182
182
|
def determine_appropriate_filter!
|
183
183
|
case self.klass.columns_hash[self.name.to_s].try(:type)
|
184
184
|
when :integer, :float, :decimal
|
185
|
-
self.
|
185
|
+
if self.klass.respond_to?(:defined_enums) && self.klass.defined_enums.keys.include?(self.name.to_s)
|
186
|
+
self.filter = :enum
|
187
|
+
else
|
188
|
+
self.filter = :exact
|
189
|
+
end
|
186
190
|
when :string, :text
|
187
191
|
self.filter = :like
|
188
192
|
when :date, :time, :datetime, :timestamp
|
data/lib/tabulatr/version.rb
CHANGED
@@ -8,6 +8,7 @@ class ProductTabulatrData < Tabulatr::Data
|
|
8
8
|
|
9
9
|
column :title
|
10
10
|
column :id
|
11
|
+
column :status
|
11
12
|
column :price, table_column_options: {filter: :range} do "#{record.price} EUR" end # <- Block evaluiert im Kontext EINES Records
|
12
13
|
column :edit_link do link_to "edit #{record.title}", product_path(record) end
|
13
14
|
# column :name,
|
@@ -36,7 +37,7 @@ class ProductTabulatrData < Tabulatr::Data
|
|
36
37
|
b.submenu do |s|
|
37
38
|
s.button :star, product_path(r), label: 'Dolle Sache'
|
38
39
|
s.divider
|
39
|
-
s.button :'trash-o', product_path(r), label: 'Löschen',
|
40
|
+
s.button :'trash-o', product_path(r), label: 'Löschen', class: 'btn-danger', method: :delete, data: {confirm: 'echt?'}
|
40
41
|
end
|
41
42
|
"haha!"
|
42
43
|
end
|
@@ -1,4 +1,4 @@
|
|
1
1
|
<%= table_for Product, paginate: true, persistent: false,
|
2
2
|
batch_actions: {a: "Hallo", b: "Du da!"},
|
3
|
-
columns: [:'_buttons', :title, :price, :active, :vendor_product_name, :updated_at,
|
3
|
+
columns: [:'_buttons', :title, :price, :active, :vendor_product_name, :updated_at, :status,
|
4
4
|
{vendor: :name}, 'tags:title'] %>
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20141223164833) do
|
15
15
|
|
16
16
|
create_table "products", force: true do |t|
|
17
17
|
t.integer "vendor_id"
|
@@ -21,6 +21,8 @@ ActiveRecord::Schema.define(version: 20140128140114) do
|
|
21
21
|
t.datetime "created_at"
|
22
22
|
t.datetime "updated_at"
|
23
23
|
t.datetime "publish_at"
|
24
|
+
t.string "type"
|
25
|
+
t.integer "status", default: 0
|
24
26
|
end
|
25
27
|
|
26
28
|
add_index "products", ["vendor_id"], name: "index_products_on_vendor_id"
|
@@ -131,14 +131,12 @@ feature "Tabulatr" do
|
|
131
131
|
visit simple_index_products_path
|
132
132
|
click_link 'Filter'
|
133
133
|
fill_in("product_filter[products:title][like]", with: "ore")
|
134
|
-
find('.tabulatr-submit-table').click
|
135
134
|
expect(page).to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'lorem')
|
136
135
|
expect(page).to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'labore')
|
137
136
|
expect(page).to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'dolore')
|
138
137
|
|
139
138
|
within(".tabulatr_filter_form") do
|
140
139
|
fill_in("product_filter[products:title][like]", :with => "loreem")
|
141
|
-
find('.tabulatr-submit-table').click
|
142
140
|
end
|
143
141
|
expect(page).not_to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'lorem')
|
144
142
|
expect(page).not_to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'labore')
|
@@ -151,7 +149,6 @@ feature "Tabulatr" do
|
|
151
149
|
visit simple_index_products_path
|
152
150
|
click_link 'Filter'
|
153
151
|
find('form.tabulatr_filter_form').fill_in("product_filter[vendor:name]", with: "producer")
|
154
|
-
find('.tabulatr-submit-table').click
|
155
152
|
expect(page).not_to have_selector('td[data-tabulatr-column-name="vendor:name"]', text: @vendor1.name)
|
156
153
|
expect(page).to have_selector('td[data-tabulatr-column-name="vendor:name"]', text: @vendor2.name)
|
157
154
|
end
|
@@ -164,18 +161,45 @@ feature "Tabulatr" do
|
|
164
161
|
click_link 'Filter'
|
165
162
|
within('.tabulatr_filter_form') do
|
166
163
|
fill_in("product_filter[products:price][from]", :with => 4)
|
164
|
+
wait_for_ajax
|
167
165
|
fill_in("product_filter[products:price][to]", :with => 10)
|
168
|
-
|
166
|
+
wait_for_ajax
|
169
167
|
end
|
170
|
-
expect(page).to
|
171
|
-
expect(page).to
|
168
|
+
expect(page).to have_no_css('.tabulatr-spinner-box')
|
169
|
+
expect(page).to have_css(".tabulatr_table tbody tr", text: 'foo')
|
170
|
+
expect(page).to have_no_css(".tabulatr_table tbody tr", text: 'bar')
|
172
171
|
within('.tabulatr_filter_form') do
|
173
172
|
fill_in("product_filter[products:price][from]", :with => 12)
|
173
|
+
wait_for_ajax
|
174
174
|
fill_in("product_filter[products:price][to]", :with => 19)
|
175
|
-
|
175
|
+
wait_for_ajax
|
176
176
|
end
|
177
|
-
expect(page).to
|
178
|
-
expect(page).to
|
177
|
+
expect(page).to have_no_css('.tabulatr-spinner-box')
|
178
|
+
expect(page).to have_css(".tabulatr_table tbody tr", text: 'bar')
|
179
|
+
expect(page).to have_no_css(".tabulatr_table tbody tr", text: 'foo')
|
180
|
+
end
|
181
|
+
|
182
|
+
scenario "filters enums", js: true do
|
183
|
+
skip unless Product.respond_to?(:enum)
|
184
|
+
Product.create!([{title: 'foo', price: 5, status: 'in_stock'},
|
185
|
+
{title: 'bar', price: 10, status: 'out_of_stock'}])
|
186
|
+
visit simple_index_products_path
|
187
|
+
expect(page).to have_css('.tabulatr_table tbody', text: 'foo')
|
188
|
+
expect(page).to have_css('.tabulatr_table tbody', text: 'bar')
|
189
|
+
click_link 'Filter'
|
190
|
+
within('.tabulatr_filter_form') do
|
191
|
+
select 'in_stock', from: 'product_filter[products:status]'
|
192
|
+
end
|
193
|
+
expect(page).to have_no_css('.tabulatr-spinner-box')
|
194
|
+
expect(page).to have_css('.tabulatr_table tbody', text: 'foo')
|
195
|
+
expect(page).to have_no_css('.tabulatr_table tbody', text: 'bar')
|
196
|
+
within('.tabulatr_filter_form') do
|
197
|
+
select 'out_of_stock', from: 'product_filter[products:status]'
|
198
|
+
end
|
199
|
+
expect(page).to have_no_css('.tabulatr-spinner-box')
|
200
|
+
expect(page).to have_css('.tabulatr_table tbody', text: 'bar')
|
201
|
+
expect(page).to have_no_css('.tabulatr_table tbody', text: 'foo')
|
202
|
+
|
179
203
|
end
|
180
204
|
|
181
205
|
scenario 'removes the filters', js: true do
|
@@ -184,7 +208,6 @@ feature "Tabulatr" do
|
|
184
208
|
click_link 'Filter'
|
185
209
|
within(".tabulatr_filter_form") do
|
186
210
|
fill_in("product_filter[products:title][like]", with: "foo")
|
187
|
-
find('.tabulatr-submit-table').click
|
188
211
|
end
|
189
212
|
expect(page).not_to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'bar')
|
190
213
|
expect(page).to have_selector('td[data-tabulatr-column-name="products:title"]', text: 'foo')
|
@@ -1,19 +1,19 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
describe Tabulatr::Data::DSL do
|
4
|
-
class
|
4
|
+
class DummyDSLClass
|
5
5
|
extend Tabulatr::Data::DSL
|
6
6
|
end
|
7
7
|
|
8
8
|
before(:each) do
|
9
|
-
|
9
|
+
DummyDSLClass.instance_variable_set('@table_columns', [])
|
10
10
|
end
|
11
11
|
|
12
12
|
describe '#column' do
|
13
13
|
it 'escapes table and column names' do
|
14
|
-
allow(
|
15
|
-
|
16
|
-
table_column =
|
14
|
+
allow(DummyDSLClass).to receive(:main_class).and_return(Product)
|
15
|
+
DummyDSLClass.column(:active)
|
16
|
+
table_column = DummyDSLClass.instance_variable_get('@table_columns').first
|
17
17
|
expect(table_column.filter_sql).to match(/\"products\".\"active\"/)
|
18
18
|
expect(table_column.sort_sql).to match(/\"products\".\"active\"/)
|
19
19
|
end
|
@@ -21,9 +21,9 @@ describe Tabulatr::Data::DSL do
|
|
21
21
|
|
22
22
|
describe '#association' do
|
23
23
|
it 'escapes table and column names' do
|
24
|
-
allow(
|
25
|
-
|
26
|
-
table_column =
|
24
|
+
allow(DummyDSLClass).to receive(:main_class).and_return(Product)
|
25
|
+
DummyDSLClass.association(:vendor, :name)
|
26
|
+
table_column = DummyDSLClass.instance_variable_get('@table_columns').first
|
27
27
|
expect(table_column.filter_sql).to match(/\"vendors\".\"name\"/)
|
28
28
|
expect(table_column.sort_sql).to match(/\"vendors\".\"name\"/)
|
29
29
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
describe Tabulatr::Data::Filtering do
|
4
|
-
class
|
4
|
+
class DummyFilteringClass
|
5
5
|
include Tabulatr::Data::Filtering
|
6
6
|
end
|
7
7
|
|
8
8
|
before(:each) do
|
9
|
-
@dummy =
|
9
|
+
@dummy = DummyFilteringClass.new
|
10
10
|
@dummy.instance_variable_set('@relation', Product.all)
|
11
11
|
@yesterday = Product.create!(publish_at: DateTime.new(2013, 12, 31, 0, 0))
|
12
12
|
@today = Product.create!(publish_at: DateTime.new(2014, 1, 1, 15, 0))
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
describe Tabulatr::Data::Formatting do
|
4
|
-
class
|
4
|
+
class DummyFormattingClass
|
5
5
|
include Tabulatr::Data::Formatting
|
6
6
|
def table_columns; end
|
7
7
|
end
|
8
8
|
|
9
9
|
before(:each) do
|
10
|
-
@dummy =
|
10
|
+
@dummy = DummyFormattingClass.new
|
11
11
|
@dummy.instance_variable_set('@relation', Product.all)
|
12
12
|
column = Tabulatr::Renderer::Column.from(
|
13
13
|
name: :title,
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
describe Tabulatr::Data::Pagination do
|
4
|
-
class
|
4
|
+
class DummyPaginationClass
|
5
5
|
include Tabulatr::Data::Pagination
|
6
6
|
end
|
7
7
|
|
8
8
|
before(:all) do
|
9
|
-
@dummy =
|
9
|
+
@dummy = DummyPaginationClass.new
|
10
10
|
end
|
11
11
|
describe '.compute_pagination' do
|
12
12
|
it "computes an offset" do
|
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
describe Tabulatr::Data::Sorting do
|
4
|
-
class
|
4
|
+
class DummySortingClass
|
5
5
|
include Tabulatr::Data::Sorting
|
6
|
+
def table_columns; end
|
6
7
|
end
|
7
8
|
|
8
9
|
before(:each) do
|
9
|
-
@dummy =
|
10
|
+
@dummy = DummySortingClass.new
|
10
11
|
@dummy.instance_variable_set('@relation', Product.all)
|
11
12
|
@dummy.instance_variable_set('@table_name', 'products')
|
12
13
|
@dummy.instance_variable_set('@base', Product)
|
@@ -6,7 +6,9 @@ describe Tabulatr::Renderer::Checkbox do
|
|
6
6
|
|
7
7
|
it "generates a checkbox" do
|
8
8
|
checkbox = Tabulatr::Renderer::Checkbox.new
|
9
|
-
expect(checkbox.human_name).to
|
9
|
+
expect(checkbox.human_name).to match(/\A<input.+\/>\z/)
|
10
|
+
expect(checkbox.human_name).to match(/class="tabulatr_mark_all"/)
|
11
|
+
expect(checkbox.human_name).to match(/type="checkbox"/)
|
10
12
|
end
|
11
13
|
|
12
14
|
end
|
data/spec/rails_helper.rb
CHANGED
@@ -14,9 +14,10 @@ Capybara.register_driver :poltergeist do |app|
|
|
14
14
|
Capybara::Poltergeist::Driver.new(app, {js_errors: true})
|
15
15
|
end
|
16
16
|
|
17
|
+
|
17
18
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
18
19
|
# in spec/support/ and its subdirectories.
|
19
|
-
Dir[Rails.root.join("
|
20
|
+
Dir[Rails.root.join("../support/**/*.rb")].each { |f| require f }
|
20
21
|
|
21
22
|
RSpec.configure do |config|
|
22
23
|
config.use_transactional_fixtures = false
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# from http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara
|
2
|
+
module WaitForAjax
|
3
|
+
def wait_for_ajax
|
4
|
+
Timeout.timeout(Capybara.default_wait_time) do
|
5
|
+
loop until finished_all_ajax_requests?
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def finished_all_ajax_requests?
|
10
|
+
page.evaluate_script('jQuery.active').zero?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.include WaitForAjax, type: :feature
|
16
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabulatr2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Horn
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2015-03-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -125,8 +125,7 @@ files:
|
|
125
125
|
- app/assets/javascripts/tabulatr/_tabulatr.js
|
126
126
|
- app/assets/javascripts/tabulatr/application.js
|
127
127
|
- app/assets/javascripts/tabulatr/jquery.inview.min.js
|
128
|
-
- app/assets/stylesheets/tabulatr.
|
129
|
-
- app/assets/stylesheets/tabulatr/application.css.scss
|
128
|
+
- app/assets/stylesheets/tabulatr.scss
|
130
129
|
- app/views/tabulatr/_tabulatr_actual_table.html.slim
|
131
130
|
- app/views/tabulatr/_tabulatr_batch_actions_menu.html.slim
|
132
131
|
- app/views/tabulatr/_tabulatr_buttons.html.slim
|
@@ -177,7 +176,7 @@ files:
|
|
177
176
|
- spec/dummy/Rakefile
|
178
177
|
- spec/dummy/app/assets/images/.keep
|
179
178
|
- spec/dummy/app/assets/javascripts/application.js
|
180
|
-
- spec/dummy/app/assets/stylesheets/application.
|
179
|
+
- spec/dummy/app/assets/stylesheets/application.scss
|
181
180
|
- spec/dummy/app/controllers/application_controller.rb
|
182
181
|
- spec/dummy/app/controllers/concerns/.keep
|
183
182
|
- spec/dummy/app/controllers/products_controller.rb
|
@@ -225,6 +224,7 @@ files:
|
|
225
224
|
- spec/dummy/db/migrate/20130730132321_create_products.rb
|
226
225
|
- spec/dummy/db/migrate/20130730132348_create_tags.rb
|
227
226
|
- spec/dummy/db/migrate/20140128140114_add_publish_at_to_products.rb
|
227
|
+
- spec/dummy/db/migrate/20141223164833_add_status_to_products.rb
|
228
228
|
- spec/dummy/db/schema.rb
|
229
229
|
- spec/dummy/lib/assets/.keep
|
230
230
|
- spec/dummy/log/.keep
|
@@ -244,6 +244,7 @@ files:
|
|
244
244
|
- spec/lib/tabulatr/renderer/renderer_spec.rb
|
245
245
|
- spec/rails_helper.rb
|
246
246
|
- spec/spec_helper.rb
|
247
|
+
- spec/support/wait_for_ajax.rb
|
247
248
|
- tabulatr.gemspec
|
248
249
|
homepage: http://github.com/metaminded/tabulatr2
|
249
250
|
licenses:
|
@@ -266,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
266
267
|
version: '0'
|
267
268
|
requirements: []
|
268
269
|
rubyforge_project:
|
269
|
-
rubygems_version: 2.
|
270
|
+
rubygems_version: 2.4.5
|
270
271
|
signing_key:
|
271
272
|
specification_version: 4
|
272
273
|
summary: A tight DSL to build tables of ActiveRecord models with sorting, pagination,
|
@@ -277,7 +278,7 @@ test_files:
|
|
277
278
|
- spec/dummy/Rakefile
|
278
279
|
- spec/dummy/app/assets/images/.keep
|
279
280
|
- spec/dummy/app/assets/javascripts/application.js
|
280
|
-
- spec/dummy/app/assets/stylesheets/application.
|
281
|
+
- spec/dummy/app/assets/stylesheets/application.scss
|
281
282
|
- spec/dummy/app/controllers/application_controller.rb
|
282
283
|
- spec/dummy/app/controllers/concerns/.keep
|
283
284
|
- spec/dummy/app/controllers/products_controller.rb
|
@@ -325,6 +326,7 @@ test_files:
|
|
325
326
|
- spec/dummy/db/migrate/20130730132321_create_products.rb
|
326
327
|
- spec/dummy/db/migrate/20130730132348_create_tags.rb
|
327
328
|
- spec/dummy/db/migrate/20140128140114_add_publish_at_to_products.rb
|
329
|
+
- spec/dummy/db/migrate/20141223164833_add_status_to_products.rb
|
328
330
|
- spec/dummy/db/schema.rb
|
329
331
|
- spec/dummy/lib/assets/.keep
|
330
332
|
- spec/dummy/log/.keep
|
@@ -344,3 +346,4 @@ test_files:
|
|
344
346
|
- spec/lib/tabulatr/renderer/renderer_spec.rb
|
345
347
|
- spec/rails_helper.rb
|
346
348
|
- spec/spec_helper.rb
|
349
|
+
- spec/support/wait_for_ajax.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
-
* listed below.
|
4
|
-
*
|
5
|
-
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
-
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
-
*
|
8
|
-
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
-
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
-
*
|
11
|
-
*= require_self
|
12
|
-
*= require tabulatr
|
13
|
-
*/
|
14
|
-
|
15
|
-
@import "bootstrap";
|