wice_grid 3.4.2 → 3.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +31 -2
- data/MIT-LICENSE +1 -1
- data/README.rdoc +371 -286
- data/lib/generators/wice_grid/templates/wice_grid_config.rb +22 -0
- data/lib/wice/columns.rb +54 -1
- data/lib/wice/columns/column_datetime.rb +3 -3
- data/lib/wice/columns/column_integer.rb +22 -4
- data/lib/wice/grid_renderer.rb +20 -4
- data/lib/wice/helpers/wice_grid_view_helpers.rb +80 -48
- data/lib/wice/memory_adapter.rb +172 -0
- data/lib/wice/wice_grid_controller.rb +1 -1
- data/lib/wice_grid.rb +1 -1
- data/vendor/assets/javascripts/wice_grid_init.js.coffee +19 -7
- data/wice_grid.gemspec +2 -2
- metadata +9 -12
@@ -66,6 +66,28 @@ if defined?(Wice::Defaults)
|
|
66
66
|
Wice::Defaults::NEGATION_IN_STRING_FILTERS = false
|
67
67
|
|
68
68
|
|
69
|
+
# Each WiceGrid filter column is defined in two classes, one used for rendering the filter, the other
|
70
|
+
# for generating query conditions. All these columns are in lib/wice/columns/*.rb .
|
71
|
+
# File lib/wice/columns/column_processor_index.rb lists all predefined processors.
|
72
|
+
# In most cases a processor is chosen automatically based on the DB column type,
|
73
|
+
# for example, integer columns
|
74
|
+
# can have two of processors, the default one with one input field, and a processor called "range",
|
75
|
+
# with 2 input fields. In this case it is possible to specify a processor in the column definition:
|
76
|
+
#
|
77
|
+
# g.column filter_type: :range
|
78
|
+
#
|
79
|
+
# It is also possible to define you own processors:
|
80
|
+
#
|
81
|
+
# Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS = {
|
82
|
+
# some_key_identifying_new_column_type: ['AViewColumnProcessorClass', 'ConditionsGeneratorClass'],
|
83
|
+
# another_key_identifying_new_column_type: ['AnotherViewColumnProcessorClass', 'AnotherConditionsGeneratorClass']
|
84
|
+
# }
|
85
|
+
#
|
86
|
+
# Column processor keys/names should not coincide with the existing keys/names (see lib/wice/columns/column_processor_index.rb)
|
87
|
+
# the value is a 2-element array with 2 strings, the first should be a name of view processor class inherited from
|
88
|
+
# Wice::Columns::ViewColumn, the second should be a name of conditions generator class inherited from
|
89
|
+
# Wice::Columns::ConditionsGeneratorColumn .
|
90
|
+
|
69
91
|
|
70
92
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
71
93
|
# Showing All Queries #
|
data/lib/wice/columns.rb
CHANGED
@@ -3,7 +3,10 @@ module Wice #:nodoc:
|
|
3
3
|
|
4
4
|
module Columns #:nodoc:
|
5
5
|
|
6
|
+
mattr_reader :handled_type_view, :handled_type_conditions_generator
|
7
|
+
|
6
8
|
class << self #:nodoc:
|
9
|
+
|
7
10
|
def load_column_processors #:nodoc:
|
8
11
|
|
9
12
|
require_columns
|
@@ -12,6 +15,51 @@ module Wice #:nodoc:
|
|
12
15
|
|
13
16
|
@@handled_type_view = build_table_of_processors 'view'
|
14
17
|
@@handled_type_conditions_generator = build_table_of_processors 'conditions_generator'
|
18
|
+
|
19
|
+
if Wice::Defaults.const_defined?(:ADDITIONAL_COLUMN_PROCESSORS)
|
20
|
+
|
21
|
+
common_error_prefix = "Error loading Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS. "
|
22
|
+
|
23
|
+
Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS.each do |key, value|
|
24
|
+
unless key.is_a?(Symbol)
|
25
|
+
raise common_error_prefix + "A key of Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS should be a Symbol!"
|
26
|
+
end
|
27
|
+
|
28
|
+
if @@handled_type_view.has_key?(key)
|
29
|
+
raise common_error_prefix +
|
30
|
+
"Column with key \"#{key}\" already exists in WiceGrid, overwriting existing columns is forbidden, please choose another key!"
|
31
|
+
end
|
32
|
+
|
33
|
+
if ! value.is_a?(Array) || value.size != 2
|
34
|
+
raise common_error_prefix +
|
35
|
+
"A value of Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS should be a a 2-element array!"
|
36
|
+
end
|
37
|
+
|
38
|
+
view_processor, conditions_generator = value.map(&:to_s).map do |klass|
|
39
|
+
begin
|
40
|
+
eval(klass)
|
41
|
+
rescue NameError
|
42
|
+
raise common_error_prefix + "Class #{klass} is not defined!"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
unless view_processor.ancestors.include?(::Wice::Columns::ViewColumn)
|
47
|
+
raise common_error_prefix +
|
48
|
+
"#{view_processor} should be inherited from Wice::Columns::ViewColumn!"
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
unless conditions_generator.ancestors.include?(::Wice::Columns::ConditionsGeneratorColumn)
|
53
|
+
raise common_error_prefix +
|
54
|
+
"#{conditions_generator} should be inherited from Wice::Columns::ConditionsGeneratorColumn!"
|
55
|
+
end
|
56
|
+
|
57
|
+
@@handled_type_view[key] = view_processor
|
58
|
+
@@handled_type_conditions_generator[key] = conditions_generator
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
15
63
|
end
|
16
64
|
|
17
65
|
def get_view_column_processor(column_type) #:nodoc:
|
@@ -88,6 +136,7 @@ module Wice #:nodoc:
|
|
88
136
|
|
89
137
|
|
90
138
|
def add_css_class(klass_value)
|
139
|
+
self.html ||= {}
|
91
140
|
if html[:class].nil?
|
92
141
|
html[:class] = klass_value
|
93
142
|
else
|
@@ -97,7 +146,11 @@ module Wice #:nodoc:
|
|
97
146
|
end
|
98
147
|
|
99
148
|
def css_class #:nodoc:
|
100
|
-
html[:class]
|
149
|
+
if html && html[:class]
|
150
|
+
html[:class]
|
151
|
+
else
|
152
|
+
''
|
153
|
+
end
|
101
154
|
end
|
102
155
|
|
103
156
|
def yield_declaration_of_column_filter #:nodoc:
|
@@ -109,12 +109,12 @@ module Wice
|
|
109
109
|
conditions = [[]]
|
110
110
|
if opts[:fr]
|
111
111
|
conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} >= ? "
|
112
|
-
conditions << opts[:fr]
|
112
|
+
conditions << opts[:fr].to_date
|
113
113
|
end
|
114
114
|
|
115
115
|
if opts[:to]
|
116
|
-
conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name}
|
117
|
-
conditions << opts[:to]
|
116
|
+
conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} < ? "
|
117
|
+
conditions << (opts[:to].to_date + 1)
|
118
118
|
end
|
119
119
|
|
120
120
|
return false if conditions.size == 1
|
@@ -35,6 +35,23 @@ module Wice
|
|
35
35
|
|
36
36
|
|
37
37
|
class ConditionsGeneratorColumnInteger < ConditionsGeneratorColumn #:nodoc:
|
38
|
+
def get_op_and_value(val)
|
39
|
+
num = nil
|
40
|
+
op = nil
|
41
|
+
|
42
|
+
# remove spaces
|
43
|
+
val = val.gsub(' ','')
|
44
|
+
|
45
|
+
first_digit_or_dot_index = val =~ /[0-9.]/
|
46
|
+
if first_digit_or_dot_index
|
47
|
+
op = val[0...first_digit_or_dot_index]
|
48
|
+
op = '=' if op == ''
|
49
|
+
num = Float(val[first_digit_or_dot_index..-1]) rescue nil
|
50
|
+
|
51
|
+
op = nil unless ['<','>','<=','>=','='].include?(op)
|
52
|
+
end
|
53
|
+
[op, num]
|
54
|
+
end
|
38
55
|
|
39
56
|
def generate_conditions(table_alias, opts) #:nodoc:
|
40
57
|
unless opts.kind_of? Hash
|
@@ -43,9 +60,10 @@ module Wice
|
|
43
60
|
end
|
44
61
|
conditions = [[]]
|
45
62
|
if opts[:eq]
|
46
|
-
|
47
|
-
|
48
|
-
conditions <<
|
63
|
+
op, num = get_op_and_value(opts[:eq])
|
64
|
+
if op && num
|
65
|
+
conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} " + op + " ? "
|
66
|
+
conditions << num
|
49
67
|
else
|
50
68
|
opts.delete(:eq)
|
51
69
|
end
|
@@ -62,4 +80,4 @@ module Wice
|
|
62
80
|
end
|
63
81
|
|
64
82
|
end
|
65
|
-
end
|
83
|
+
end
|
data/lib/wice/grid_renderer.rb
CHANGED
@@ -11,6 +11,7 @@ module Wice
|
|
11
11
|
attr_reader :page_parameter_name
|
12
12
|
attr_reader :after_row_handler
|
13
13
|
attr_reader :before_row_handler
|
14
|
+
attr_reader :replace_row_handler
|
14
15
|
attr_reader :blank_slate_handler
|
15
16
|
attr_reader :last_row_handler
|
16
17
|
attr_reader :grid
|
@@ -311,6 +312,7 @@ module Wice
|
|
311
312
|
end
|
312
313
|
|
313
314
|
if options[:class]
|
315
|
+
options[:html] ||= {}
|
314
316
|
Wice::WgHash.add_or_append_class_value!(options[:html], options[:class])
|
315
317
|
options.delete(:class)
|
316
318
|
end
|
@@ -409,6 +411,12 @@ module Wice
|
|
409
411
|
@before_row_handler = block
|
410
412
|
end
|
411
413
|
|
414
|
+
# Can be used to replace the HTML code (for example to make a multi-column spanning row) of a row.
|
415
|
+
# Nothing is replaced if the block return +false+ or +nil+.
|
416
|
+
def replace_row(&block)
|
417
|
+
@replace_row_handler = block
|
418
|
+
end
|
419
|
+
|
412
420
|
# Can be used to add HTML code (calculation results, for example) after all rows.
|
413
421
|
# Nothing is added if the block return +false+ or +nil+.
|
414
422
|
def last_row(&block)
|
@@ -464,16 +472,14 @@ module Wice
|
|
464
472
|
end
|
465
473
|
|
466
474
|
new_params[:only_path] = false
|
467
|
-
base_link_with_pp_info = controller.url_for(new_params)
|
475
|
+
base_link_with_pp_info = omit_empty_query controller.url_for(new_params)
|
468
476
|
|
469
477
|
if new_params[@grid.name]
|
470
478
|
new_params[@grid.name].delete(:pp) # and reset back to pagination if show all mode is on
|
471
479
|
end
|
472
|
-
[base_link_with_pp_info, controller.url_for(new_params)
|
480
|
+
[base_link_with_pp_info, omit_empty_query(controller.url_for(new_params))]
|
473
481
|
end
|
474
482
|
|
475
|
-
|
476
|
-
|
477
483
|
def link_for_export(controller, format, extra_parameters = {}) #:nodoc:
|
478
484
|
new_params = Wice::WgHash.deep_clone controller.params
|
479
485
|
new_params.merge!(extra_parameters)
|
@@ -519,5 +525,15 @@ module Wice
|
|
519
525
|
method_name ? @columns.select(&method_name) : @columns
|
520
526
|
end
|
521
527
|
|
528
|
+
def omit_empty_query(url) #:nodoc:
|
529
|
+
# /foo? --> /foo
|
530
|
+
# /foo?grid= --> /foo
|
531
|
+
# /foo?grid=&page=1 --> /foo?page=1
|
532
|
+
# /foo?grid=some_value --> /foo?grid=some_value
|
533
|
+
|
534
|
+
empty_hash_rx = Regexp.new "([&?])#{Regexp.escape @grid.name}=([&?]|$)" # c.f., issue #140
|
535
|
+
url.gsub(empty_hash_rx, '\1').gsub /\?+$/, ''
|
536
|
+
end
|
537
|
+
|
522
538
|
end
|
523
539
|
end
|
@@ -166,6 +166,56 @@ module Wice
|
|
166
166
|
extra_argument ? block.call(ar, extra_argument) : block.call(ar)
|
167
167
|
end
|
168
168
|
|
169
|
+
def get_row_content(rendering, ar, sorting_dependant_row_cycling)
|
170
|
+
cell_value_of_the_ordered_column = nil
|
171
|
+
row_content = ''
|
172
|
+
rendering.each_column(:in_html) do |column|
|
173
|
+
cell_block = column.cell_rendering_block
|
174
|
+
|
175
|
+
opts = column.html
|
176
|
+
|
177
|
+
opts = opts ? opts.clone : {}
|
178
|
+
|
179
|
+
column_block_output = if column.class == Columns.get_view_column_processor(:action)
|
180
|
+
cell_block.call(ar, params)
|
181
|
+
else
|
182
|
+
call_block(cell_block, ar)
|
183
|
+
end
|
184
|
+
|
185
|
+
if column_block_output.kind_of?(Array)
|
186
|
+
|
187
|
+
unless column_block_output.size == 2
|
188
|
+
raise WiceGridArgumentError.new('When WiceGrid column block returns an array it is expected to contain 2 elements only - '+
|
189
|
+
'the first is the contents of the table cell and the second is a hash containing HTML attributes for the <td> tag.')
|
190
|
+
end
|
191
|
+
|
192
|
+
column_block_output, additional_opts = column_block_output
|
193
|
+
|
194
|
+
unless additional_opts.is_a?(Hash)
|
195
|
+
raise WiceGridArgumentError.new('When WiceGrid column block returns an array its second element is expected to be a ' +
|
196
|
+
"hash containing HTML attributes for the <td> tag. The returned value is #{additional_opts.inspect}. Read documentation.")
|
197
|
+
end
|
198
|
+
|
199
|
+
additional_css_class = nil
|
200
|
+
if additional_opts.has_key?(:class)
|
201
|
+
additional_css_class = additional_opts[:class]
|
202
|
+
additional_opts.delete(:class)
|
203
|
+
elsif additional_opts.has_key?('class')
|
204
|
+
additional_css_class = additional_opts['class']
|
205
|
+
additional_opts.delete('class')
|
206
|
+
end
|
207
|
+
opts.merge!(additional_opts)
|
208
|
+
Wice::WgHash.add_or_append_class_value!(opts, additional_css_class) unless additional_css_class.blank?
|
209
|
+
end
|
210
|
+
|
211
|
+
if sorting_dependant_row_cycling && column.attribute && grid.ordered_by?(column)
|
212
|
+
cell_value_of_the_ordered_column = column_block_output
|
213
|
+
end
|
214
|
+
row_content += content_tag(:td, column_block_output, opts)
|
215
|
+
end
|
216
|
+
[row_content, cell_value_of_the_ordered_column]
|
217
|
+
end
|
218
|
+
|
169
219
|
# the longest method? :(
|
170
220
|
def grid_html(grid, options, rendering, reuse_last_column_for_filter_buttons) #:nodoc:
|
171
221
|
|
@@ -192,7 +242,7 @@ module Wice
|
|
192
242
|
# Ruby 1.9.x
|
193
243
|
grid.output_buffer.force_encoding('UTF-8') if grid.output_buffer.respond_to?(:force_encoding)
|
194
244
|
|
195
|
-
grid.output_buffer << %!<div class="wice-grid-container" id="#{grid.name}"><div id="#{grid.name}_title">!
|
245
|
+
grid.output_buffer << %!<div class="wice-grid-container" data-grid-name="#{grid.name}" id="#{grid.name}"><div id="#{grid.name}_title">!
|
196
246
|
grid.output_buffer << content_tag(:h3, grid.saved_query.name) if grid.saved_query
|
197
247
|
grid.output_buffer << "</div><table #{tag_options(table_html_attrs, true)}>"
|
198
248
|
grid.output_buffer << "<caption>#{rendering.kaption}</caption>" if rendering.kaption
|
@@ -241,6 +291,13 @@ module Wice
|
|
241
291
|
|
242
292
|
column_name = column.name
|
243
293
|
|
294
|
+
opts = column.html
|
295
|
+
|
296
|
+
opts = opts ? opts.clone : {}
|
297
|
+
|
298
|
+
Wice::WgHash.add_or_append_class_value!(opts, column.css_class)
|
299
|
+
|
300
|
+
|
244
301
|
if column.attribute && column.ordering
|
245
302
|
|
246
303
|
column.add_css_class('active-filter') if grid.filtered_by?(column)
|
@@ -258,7 +315,7 @@ module Wice
|
|
258
315
|
rendering.column_link(column, direction, params, options[:extra_request_parameters]),
|
259
316
|
:class => link_style)
|
260
317
|
|
261
|
-
grid.output_buffer << content_tag(:th, col_link,
|
318
|
+
grid.output_buffer << content_tag(:th, col_link, opts)
|
262
319
|
|
263
320
|
else
|
264
321
|
if reuse_last_column_for_filter_buttons && last
|
@@ -266,7 +323,7 @@ module Wice
|
|
266
323
|
hide_show_icon(filter_row_id, grid, filter_shown, no_filter_row, options[:show_filters], rendering)
|
267
324
|
)
|
268
325
|
else
|
269
|
-
grid.output_buffer << content_tag(:th, column_name)
|
326
|
+
grid.output_buffer << content_tag(:th, column_name, opts)
|
270
327
|
end
|
271
328
|
end
|
272
329
|
end
|
@@ -299,23 +356,27 @@ module Wice
|
|
299
356
|
grid.output_buffer << '>'
|
300
357
|
|
301
358
|
rendering.each_column_aware_of_one_last_one(:in_html) do |column, last|
|
359
|
+
|
360
|
+
opts = column.html ? column.html.clone : {}
|
361
|
+
Wice::WgHash.add_or_append_class_value!(opts, column.css_class)
|
362
|
+
|
302
363
|
if column.filter_shown?
|
303
364
|
|
304
365
|
filter_html_code = column.render_filter.html_safe
|
305
366
|
if column.detach_with_id
|
306
|
-
grid.output_buffer << content_tag(:th, '',
|
367
|
+
grid.output_buffer << content_tag(:th, '', opts)
|
307
368
|
grid.output_buffer.add_filter(column.detach_with_id, filter_html_code)
|
308
369
|
else
|
309
|
-
grid.output_buffer << content_tag(:th, filter_html_code,
|
370
|
+
grid.output_buffer << content_tag(:th, filter_html_code, opts)
|
310
371
|
end
|
311
372
|
else
|
312
373
|
if reuse_last_column_for_filter_buttons && last
|
313
374
|
grid.output_buffer << content_tag(:th,
|
314
375
|
reset_submit_buttons(options, grid, rendering),
|
315
|
-
Wice::WgHash.add_or_append_class_value!(
|
376
|
+
Wice::WgHash.add_or_append_class_value!(opts, 'filter_icons')
|
316
377
|
)
|
317
378
|
else
|
318
|
-
grid.output_buffer << content_tag(:th, '',
|
379
|
+
grid.output_buffer << content_tag(:th, '', opts)
|
319
380
|
end
|
320
381
|
end
|
321
382
|
end
|
@@ -359,48 +420,19 @@ module Wice
|
|
359
420
|
nil
|
360
421
|
end
|
361
422
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
column_block_output = if column.class == Columns.get_view_column_processor(:action)
|
369
|
-
cell_block.call(ar, params)
|
370
|
-
else
|
371
|
-
call_block(cell_block, ar)
|
372
|
-
end
|
373
|
-
|
374
|
-
if column_block_output.kind_of?(Array)
|
375
|
-
|
376
|
-
unless column_block_output.size == 2
|
377
|
-
raise WiceGridArgumentError.new('When WiceGrid column block returns an array it is expected to contain 2 elements only - '+
|
378
|
-
'the first is the contents of the table cell and the second is a hash containing HTML attributes for the <td> tag.')
|
379
|
-
end
|
380
|
-
|
381
|
-
column_block_output, additional_opts = column_block_output
|
382
|
-
|
383
|
-
unless additional_opts.is_a?(Hash)
|
384
|
-
raise WiceGridArgumentError.new('When WiceGrid column block returns an array its second element is expected to be a ' +
|
385
|
-
"hash containing HTML attributes for the <td> tag. The returned value is #{additional_opts.inspect}. Read documentation.")
|
386
|
-
end
|
387
|
-
|
388
|
-
additional_css_class = nil
|
389
|
-
if additional_opts.has_key?(:class)
|
390
|
-
additional_css_class = additional_opts[:class]
|
391
|
-
additional_opts.delete(:class)
|
392
|
-
elsif additional_opts.has_key?('class')
|
393
|
-
additional_css_class = additional_opts['class']
|
394
|
-
additional_opts.delete('class')
|
395
|
-
end
|
396
|
-
opts.merge!(additional_opts)
|
397
|
-
Wice::WgHash.add_or_append_class_value!(opts, additional_css_class) unless additional_css_class.blank?
|
398
|
-
end
|
423
|
+
replace_row_output = if rendering.replace_row_handler
|
424
|
+
call_block(rendering.replace_row_handler, ar, number_of_columns_for_extra_rows)
|
425
|
+
else
|
426
|
+
nil
|
427
|
+
end
|
399
428
|
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
429
|
+
row_content = if replace_row_output
|
430
|
+
no_rightmost_column = true
|
431
|
+
replace_row_output
|
432
|
+
else
|
433
|
+
row_content, tmp_cell_value_of_the_ordered_column = get_row_content(rendering,ar,sorting_dependant_row_cycling)
|
434
|
+
cell_value_of_the_ordered_column = tmp_cell_value_of_the_ordered_column if tmp_cell_value_of_the_ordered_column
|
435
|
+
row_content
|
404
436
|
end
|
405
437
|
|
406
438
|
row_attributes = rendering.get_row_attributes(ar)
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Wice
|
3
|
+
module MemoryAdapter
|
4
|
+
class MemoryAdapter
|
5
|
+
def initialize(rows, columns, kaminarafy = true)
|
6
|
+
@rows = rows
|
7
|
+
@klass = MemoryAdapterKlass.new(columns, self)
|
8
|
+
@columns = Set.new
|
9
|
+
columns.each do |col|
|
10
|
+
@columns << col.name.to_sym
|
11
|
+
end
|
12
|
+
@page_num = 1
|
13
|
+
@per_page = 20
|
14
|
+
end
|
15
|
+
|
16
|
+
def klass
|
17
|
+
@klass
|
18
|
+
end
|
19
|
+
|
20
|
+
def total_count
|
21
|
+
length
|
22
|
+
end
|
23
|
+
|
24
|
+
def length
|
25
|
+
@rows.length
|
26
|
+
end
|
27
|
+
|
28
|
+
# 1-based page number
|
29
|
+
def current_page
|
30
|
+
@page_num
|
31
|
+
end
|
32
|
+
|
33
|
+
def limit_value
|
34
|
+
@per_page
|
35
|
+
end
|
36
|
+
|
37
|
+
def total_pages
|
38
|
+
total_pages=(length.to_f / @per_page).ceil
|
39
|
+
total_pages
|
40
|
+
end
|
41
|
+
|
42
|
+
# 0-based index into array
|
43
|
+
def offset_value
|
44
|
+
@page_num = total_pages if current_page > total_pages
|
45
|
+
|
46
|
+
offset_value = (current_page-1) * @per_page
|
47
|
+
offset_value
|
48
|
+
end
|
49
|
+
|
50
|
+
def num_pages
|
51
|
+
total_pages
|
52
|
+
end
|
53
|
+
|
54
|
+
def last_page?
|
55
|
+
last_page = current_page==total_pages
|
56
|
+
last_page
|
57
|
+
end
|
58
|
+
|
59
|
+
def includes(*opts)
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def joins(*opts)
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
def order(*opts)
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
def where(*opts)
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def page(num)
|
76
|
+
@page_num=num.to_i
|
77
|
+
@page_num =1 if @page_num < 1
|
78
|
+
self
|
79
|
+
end
|
80
|
+
|
81
|
+
def per(num)
|
82
|
+
@per_page=num.to_i
|
83
|
+
@per_page = 1 if @per_page < 1
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
def each
|
88
|
+
start_index = offset_value
|
89
|
+
end_index = offset_value + @per_page
|
90
|
+
slice = @rows[start_index...end_index]
|
91
|
+
if slice
|
92
|
+
slice.each do |row|
|
93
|
+
yield Row.new(row, self)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def has_column?(col)
|
99
|
+
@columns.include?(col)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class MemoryAdapterKlass
|
104
|
+
def initialize(columns, memory_adapter)
|
105
|
+
@columns = columns
|
106
|
+
@memory_adapter = memory_adapter
|
107
|
+
end
|
108
|
+
|
109
|
+
def columns
|
110
|
+
@columns
|
111
|
+
end
|
112
|
+
|
113
|
+
def table_name
|
114
|
+
SecureRandom.hex
|
115
|
+
end
|
116
|
+
|
117
|
+
def merge_conditions(*conditions)
|
118
|
+
""
|
119
|
+
end
|
120
|
+
|
121
|
+
def unscoped(&code)
|
122
|
+
#@memory_adapter.unscope
|
123
|
+
code.call
|
124
|
+
self
|
125
|
+
end
|
126
|
+
|
127
|
+
def connection
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class Row
|
132
|
+
def initialize(row, memory_adapter)
|
133
|
+
@row=row
|
134
|
+
@memory_adapter = memory_adapter
|
135
|
+
end
|
136
|
+
|
137
|
+
def method_missing(m, *args, &block)
|
138
|
+
if @memory_adapter.has_column?(m)
|
139
|
+
@row[m]
|
140
|
+
else
|
141
|
+
super
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class Column
|
147
|
+
def initialize(name)
|
148
|
+
@name = name.to_s
|
149
|
+
@model = Model.new
|
150
|
+
end
|
151
|
+
|
152
|
+
def name
|
153
|
+
@name
|
154
|
+
end
|
155
|
+
|
156
|
+
def model
|
157
|
+
@model
|
158
|
+
end
|
159
|
+
|
160
|
+
def model=(model)
|
161
|
+
@model=model
|
162
|
+
end
|
163
|
+
|
164
|
+
def type
|
165
|
+
:string
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
class Model
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|