r_kit 0.5 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/r_kit/active_record_utility/active_record_extend.rb +28 -12
- data/lib/r_kit/active_record_utility/utilities/series.rb +115 -77
- data/lib/r_kit/active_record_utility/utilities/tag.rb +6 -2
- data/lib/r_kit/active_record_utility.rb +2 -0
- data/lib/r_kit/core/loader.rb +1 -1
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/base/typography/hr.scss +5 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/base/typography/links.scss +2 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/base/typography/paragraphs.scss +3 -1
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/base/typography/titles.scss +4 -2
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/base/typography.scss +1 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/components/btn.scss +3 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins/alignments.scss +7 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins/blocks.scss +4 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins/box-shadows/curved-shadows.scss +1 -1
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins/box-shadows/straight-shadows.scss +1 -1
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins/links.scss +12 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins/titles.scss +6 -10
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/mixins.scss +2 -0
- data/lib/r_kit/css/lib/assets/stylesheets/r_kit/variables/colors.scss +1 -1
- data/lib/r_kit/css/sass_extend.rb +1 -2
- data/lib/r_kit/css.rb +13 -11
- data/lib/r_kit/decoration/action_view_base_extend.rb +1 -2
- data/lib/r_kit/decoration/base/collection.rb +11 -11
- data/lib/r_kit/decoration/base/object.rb +0 -18
- data/lib/r_kit/decoration/base.rb +39 -2
- data/lib/r_kit/decoration/class.rb +26 -55
- data/lib/r_kit/decoration/dsl.rb +14 -83
- data/lib/r_kit/decoration/enumerable_extend.rb +5 -1
- data/lib/r_kit/decoration/object_extend.rb +5 -0
- data/lib/r_kit/decoration.rb +4 -7
- data/lib/r_kit/dsl/base/thrust.rb +6 -2
- data/lib/r_kit/dsl/base.rb +9 -3
- data/lib/r_kit/dsl/dsl_extend.rb +1 -1
- data/lib/r_kit/dsl/test.rb +81 -0
- data/lib/r_kit/dsl.rb +1 -6
- data/lib/r_kit/frame/collection_dsl.rb +24 -0
- data/lib/r_kit/frame/empty_frame.rb +7 -0
- data/lib/r_kit/frame/instance_dsl.rb +30 -0
- data/lib/r_kit/frame.rb +14 -0
- data/lib/r_kit/grid/base/grid.rb +69 -19
- data/lib/r_kit/grid/base/grid_col.rb +22 -19
- data/lib/r_kit/grid/base.rb +1 -15
- data/lib/r_kit/grid/binding.rb +3 -10
- data/lib/r_kit/grid/lib/assets/stylesheets/r_kit/base/grid.scss +15 -18
- data/lib/r_kit/grid/lib/assets/stylesheets/r_kit/base/grid_flex.scss +19 -0
- data/lib/r_kit/grid/lib/assets/stylesheets/r_kit/base/grid_items.scss +5 -0
- data/lib/r_kit/grid/lib/assets/stylesheets/r_kit/grid.scss +2 -0
- data/lib/r_kit/grid/lib/assets/stylesheets/r_kit/mixins/{gris.scss → grid.scss} +0 -0
- data/lib/r_kit/grid.rb +2 -3
- data/lib/r_kit/override/base.rb +125 -0
- data/lib/r_kit/override/method_extend.rb +8 -0
- data/lib/r_kit/override/module_extend.rb +53 -0
- data/lib/r_kit/override/pattern.rb +53 -0
- data/lib/r_kit/override/perfs.rb +117 -0
- data/lib/r_kit/override/test.rb +466 -0
- data/lib/r_kit/override/unbound_method_extend.rb +8 -0
- data/lib/r_kit/override.rb +15 -0
- data/lib/r_kit/pagination/base/page.rb +5 -23
- data/lib/r_kit/pagination/base.rb +32 -62
- data/lib/r_kit/pagination/dsl.rb +10 -0
- data/lib/r_kit/pagination/enumerable_extend.rb +7 -0
- data/lib/r_kit/pagination.rb +29 -2
- data/lib/r_kit/parser/base.rb +19 -0
- data/lib/r_kit/parser/leaf.rb +72 -0
- data/lib/r_kit/parser/test.rb +76 -0
- data/lib/r_kit/parser/tree.rb +22 -0
- data/lib/r_kit/parser.rb +8 -0
- data/lib/r_kit/struct/collection_delegator.rb +0 -6
- data/lib/r_kit/utility/basic_object_extend.rb +9 -0
- data/lib/r_kit/utility/kernel_extend.rb +9 -3
- data/lib/r_kit/utility/main_extend.rb +22 -0
- data/lib/r_kit/utility/module_extend.rb +18 -11
- data/lib/r_kit/utility/simple_delegator_extend.rb +1 -1
- data/lib/r_kit/utility/symbol_extend.rb +1 -1
- data/lib/r_kit/utility.rb +4 -2
- data/lib/r_kit/version.rb +1 -1
- metadata +29 -5
- data/lib/r_kit/grid/base/grid_row.rb +0 -29
- data/lib/r_kit/grid/kernel_extend.rb +0 -14
@@ -0,0 +1,466 @@
|
|
1
|
+
|
2
|
+
class A
|
3
|
+
def x
|
4
|
+
"x"
|
5
|
+
end
|
6
|
+
|
7
|
+
override_method :x do
|
8
|
+
__olddef__ << "y"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# overide classic
|
13
|
+
puts "A: xy -> #{ A.new.x }"
|
14
|
+
|
15
|
+
class B
|
16
|
+
def x
|
17
|
+
"x"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class C < B
|
22
|
+
override_method :x do
|
23
|
+
__olddef__ << "y"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# override w/ inheritance
|
28
|
+
puts "C: xy -> #{ C.new.x }"
|
29
|
+
|
30
|
+
class D
|
31
|
+
override_method :x do
|
32
|
+
__olddef__ || "y"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# override when no previous def
|
37
|
+
puts "D: y -> #{ D.new.x }"
|
38
|
+
|
39
|
+
class E
|
40
|
+
def x
|
41
|
+
"x"
|
42
|
+
end
|
43
|
+
|
44
|
+
override_method :x do
|
45
|
+
__olddef__ << "y"
|
46
|
+
end
|
47
|
+
|
48
|
+
override_methods do
|
49
|
+
def x
|
50
|
+
__olddef__ << "z"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# override many
|
56
|
+
puts "E: xyz -> #{ E.new.x }"
|
57
|
+
|
58
|
+
class F < B
|
59
|
+
def a
|
60
|
+
"a"
|
61
|
+
end
|
62
|
+
|
63
|
+
override_methods do
|
64
|
+
def a
|
65
|
+
__olddef__ << "b"
|
66
|
+
end
|
67
|
+
|
68
|
+
def x
|
69
|
+
__olddef__ << "y"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# multi override don't collapse
|
75
|
+
f = F.new
|
76
|
+
puts "F: ab -> #{ f.a }"
|
77
|
+
puts "F: xy -> #{ f.x }"
|
78
|
+
puts "F: ab -> #{ f.a }"
|
79
|
+
puts "F: xy -> #{ f.x }"
|
80
|
+
|
81
|
+
|
82
|
+
class G
|
83
|
+
def initialize(s)
|
84
|
+
@s = s
|
85
|
+
end
|
86
|
+
|
87
|
+
def should?
|
88
|
+
@s
|
89
|
+
end
|
90
|
+
|
91
|
+
def x
|
92
|
+
"x"
|
93
|
+
end
|
94
|
+
|
95
|
+
depend_pattern = ->{
|
96
|
+
if should?
|
97
|
+
__newdef__
|
98
|
+
else
|
99
|
+
nil
|
100
|
+
end
|
101
|
+
}
|
102
|
+
|
103
|
+
override_method :x, pattern: depend_pattern do
|
104
|
+
__olddef__ << "y"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# override w/ depend pattern
|
109
|
+
puts "G: -> #{ G.new(false).x }"
|
110
|
+
puts "G: xy -> #{ G.new(true).x }"
|
111
|
+
|
112
|
+
class H
|
113
|
+
def x(str)
|
114
|
+
"x" << str
|
115
|
+
end
|
116
|
+
|
117
|
+
override_method :x do |str, str_end|
|
118
|
+
__olddef__(str) << "y" << str_end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# override w/ args
|
123
|
+
puts "H: xXyY -> #{ H.new.x('X', 'Y') }"
|
124
|
+
|
125
|
+
class I
|
126
|
+
def x(str)
|
127
|
+
"x" << str
|
128
|
+
end
|
129
|
+
|
130
|
+
override_methods do
|
131
|
+
def x(str, str_end)
|
132
|
+
__olddef__(str) << "y" << str_end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# override many w/ args
|
138
|
+
puts "I: xXyY -> #{ I.new.x('X', 'Y') }"
|
139
|
+
|
140
|
+
class J
|
141
|
+
def initialize(s)
|
142
|
+
@s = s
|
143
|
+
end
|
144
|
+
|
145
|
+
def should?
|
146
|
+
@s
|
147
|
+
end
|
148
|
+
|
149
|
+
def x
|
150
|
+
"x"
|
151
|
+
end
|
152
|
+
|
153
|
+
if_pattern = ->{
|
154
|
+
if should?
|
155
|
+
__newdef__
|
156
|
+
else
|
157
|
+
__olddef__
|
158
|
+
end
|
159
|
+
}
|
160
|
+
|
161
|
+
override_method :x, pattern: if_pattern do
|
162
|
+
__olddef__ << "y"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# override w/ if pattern
|
167
|
+
puts "J: x -> #{ J.new(false).x }"
|
168
|
+
puts "J: xy -> #{ J.new(true).x }"
|
169
|
+
|
170
|
+
class K < SimpleDelegator
|
171
|
+
override_method :x do
|
172
|
+
__olddef__ << "y"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# override in delegator
|
177
|
+
puts "K: xy -> #{ K.new(B.new).x }"
|
178
|
+
|
179
|
+
class L
|
180
|
+
def initialize
|
181
|
+
@should_load = true
|
182
|
+
end
|
183
|
+
|
184
|
+
def load
|
185
|
+
"not implemented"
|
186
|
+
end
|
187
|
+
|
188
|
+
override_method :load do
|
189
|
+
if @should_load
|
190
|
+
@should_load = false
|
191
|
+
"load"
|
192
|
+
else
|
193
|
+
"nothing"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# change instance values inside overrided method
|
199
|
+
l = L.new
|
200
|
+
puts "L: load -> #{ l.load }"
|
201
|
+
puts "L: nothing -> #{ l.load }"
|
202
|
+
|
203
|
+
class M
|
204
|
+
def initialize
|
205
|
+
@loaded = false
|
206
|
+
end
|
207
|
+
|
208
|
+
def loaded?
|
209
|
+
@loaded
|
210
|
+
end
|
211
|
+
|
212
|
+
def load
|
213
|
+
"not implemented"
|
214
|
+
end
|
215
|
+
|
216
|
+
override_method :load do
|
217
|
+
@loaded = true
|
218
|
+
self
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
# return self in overrided method
|
223
|
+
puts "M: false -> #{ M.new.loaded? }"
|
224
|
+
puts "M: true -> #{ M.new.load.loaded? }"
|
225
|
+
|
226
|
+
class N
|
227
|
+
class << self
|
228
|
+
def x
|
229
|
+
"x"
|
230
|
+
end
|
231
|
+
|
232
|
+
override_method :x do
|
233
|
+
__olddef__ << "y"
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
# override singleton method using '<<' syntax
|
239
|
+
puts "N: xy -> #{ N.x }"
|
240
|
+
|
241
|
+
class O
|
242
|
+
def self.x
|
243
|
+
"x"
|
244
|
+
end
|
245
|
+
|
246
|
+
override_methods do
|
247
|
+
def self.x
|
248
|
+
__olddef__ << "y"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
# override singleton method using 'self.' syntax
|
254
|
+
puts "O: xy -> #{ O.x }"
|
255
|
+
|
256
|
+
class P < SimpleDelegator
|
257
|
+
def initialize(obj, should)
|
258
|
+
super(obj)
|
259
|
+
@should = should
|
260
|
+
end
|
261
|
+
|
262
|
+
if_pattern = ->{
|
263
|
+
if @should
|
264
|
+
__newdef__
|
265
|
+
else
|
266
|
+
__olddef__
|
267
|
+
end
|
268
|
+
}
|
269
|
+
|
270
|
+
override_method :x, pattern: if_pattern do
|
271
|
+
__olddef__ << "y"
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
# override in delegator w/ if pattern
|
276
|
+
puts "P: x -> #{ P.new(B.new, false).x }"
|
277
|
+
puts "P: xy -> #{ P.new(B.new, true).x }"
|
278
|
+
|
279
|
+
module Q
|
280
|
+
override_method :x do
|
281
|
+
__olddef__ << "y" rescue 'hahah'
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
class R
|
286
|
+
prepend Q
|
287
|
+
|
288
|
+
def x
|
289
|
+
"x"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
# override in a prepended module from a class
|
294
|
+
puts "R: xy -> #{ (r = R.new).x }"
|
295
|
+
puts "R: xy -> #{ r.x }"
|
296
|
+
|
297
|
+
module S
|
298
|
+
def x
|
299
|
+
"x"
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
class T
|
304
|
+
|
305
|
+
override_method :x do
|
306
|
+
__olddef__ << "y"
|
307
|
+
end
|
308
|
+
|
309
|
+
include S
|
310
|
+
|
311
|
+
end
|
312
|
+
|
313
|
+
# override in a included module from a class
|
314
|
+
puts "T: xy -> #{ (t = T.new).x }"
|
315
|
+
puts "T: xy -> #{ t.x }"
|
316
|
+
|
317
|
+
class U < SimpleDelegator
|
318
|
+
override_method :x do
|
319
|
+
__olddef__ || 'y'
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
# delegate w/ no previous def in delegated object
|
324
|
+
puts "U: y -> #{ U.new(Class.new.new).x }"
|
325
|
+
|
326
|
+
class V
|
327
|
+
def self.x
|
328
|
+
"x"
|
329
|
+
end
|
330
|
+
|
331
|
+
override_singleton_method :x do
|
332
|
+
__olddef__ << "y"
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
# override singleton method w/ specific method
|
337
|
+
puts "V: xy -> #{ V.x }"
|
338
|
+
|
339
|
+
class W
|
340
|
+
def self.x
|
341
|
+
"x"
|
342
|
+
end
|
343
|
+
|
344
|
+
override_singleton_methods do
|
345
|
+
def x
|
346
|
+
__olddef__ << "y"
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
# override singleton methods w/ specific method
|
352
|
+
puts "W: xy -> #{ W.x }"
|
353
|
+
|
354
|
+
class X
|
355
|
+
def self.x
|
356
|
+
"x"
|
357
|
+
end
|
358
|
+
|
359
|
+
override_singleton_method :x do
|
360
|
+
__olddef__ << "y"
|
361
|
+
end
|
362
|
+
|
363
|
+
override_singleton_methods do
|
364
|
+
def x
|
365
|
+
__olddef__ << "z"
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
# override many in singleton
|
371
|
+
puts "X: xyz -> #{ X.x }"
|
372
|
+
|
373
|
+
class Y
|
374
|
+
def self.a
|
375
|
+
"a"
|
376
|
+
end
|
377
|
+
|
378
|
+
def self.x
|
379
|
+
"x"
|
380
|
+
end
|
381
|
+
|
382
|
+
override_singleton_methods do
|
383
|
+
def a
|
384
|
+
__olddef__ << "b"
|
385
|
+
end
|
386
|
+
|
387
|
+
def x
|
388
|
+
__olddef__ << "y"
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
# multi singleton override don't collapse
|
394
|
+
puts "Y: ab -> #{ Y.a }"
|
395
|
+
puts "Y: xy -> #{ Y.x }"
|
396
|
+
puts "Y: ab -> #{ Y.a }"
|
397
|
+
puts "Y: xy -> #{ Y.x }"
|
398
|
+
|
399
|
+
|
400
|
+
class Z
|
401
|
+
def self.meta_x method_name_1
|
402
|
+
singleton_class.send :define_method, method_name_1 do
|
403
|
+
# p method_name_1.object_id
|
404
|
+
method_name_1
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
override_singleton_method :meta_x do |name|
|
409
|
+
|
410
|
+
__olddef__(name).tap do |method_name_2|
|
411
|
+
|
412
|
+
override_singleton_method method_name_2 do
|
413
|
+
# p __olddef__.object_id
|
414
|
+
__olddef__ << method_name_2.to_s
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
meta_x 'x'
|
420
|
+
meta_x 'y'
|
421
|
+
meta_x 'z'
|
422
|
+
|
423
|
+
end
|
424
|
+
|
425
|
+
# overide nested
|
426
|
+
puts "Z: xx -> #{ Z.x }"
|
427
|
+
puts "Z: yy -> #{ Z.y }"
|
428
|
+
puts "Z: zz -> #{ Z.z }"
|
429
|
+
puts "!Z: xx -> #{ Z.x }"
|
430
|
+
puts "!Z: yy -> #{ Z.y }"
|
431
|
+
puts "!Z: zz -> #{ Z.z }"
|
432
|
+
puts "NOTE: this behavior is because `__olddef__' (the nested one) get as a result `method_name_1'"
|
433
|
+
puts "NOTE: as `method_name_1' is actually a local variable, it is passed as a reference, so it will be modified"
|
434
|
+
puts "NOTE: as `method_name_1' is modified, it will change the behavior of `__olddef__'"
|
435
|
+
puts "NOTE: see below a correct implementation of this"
|
436
|
+
|
437
|
+
class Z2
|
438
|
+
def self.meta_x method_name_1
|
439
|
+
singleton_class.send :define_method, method_name_1 do
|
440
|
+
method_name_1.dup
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
override_singleton_method :meta_x do |name|
|
445
|
+
|
446
|
+
__olddef__(name).tap do |method_name_2|
|
447
|
+
|
448
|
+
override_singleton_method method_name_2 do
|
449
|
+
__olddef__ << method_name_2.to_s
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
meta_x 'x'
|
455
|
+
meta_x 'y'
|
456
|
+
meta_x 'z'
|
457
|
+
|
458
|
+
end
|
459
|
+
|
460
|
+
# overide nested
|
461
|
+
puts "Z: xx -> #{ Z2.x }"
|
462
|
+
puts "Z: yy -> #{ Z2.y }"
|
463
|
+
puts "Z: zz -> #{ Z2.z }"
|
464
|
+
puts "Z: xx -> #{ Z2.x }"
|
465
|
+
puts "Z: yy -> #{ Z2.y }"
|
466
|
+
puts "Z: zz -> #{ Z2.z }"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class RKit::Override
|
2
|
+
|
3
|
+
load_path __FILE__,
|
4
|
+
'base',
|
5
|
+
'method_extend',
|
6
|
+
'module_extend',
|
7
|
+
'pattern',
|
8
|
+
'unbound_method_extend'
|
9
|
+
|
10
|
+
# load_path __FILE__, 'test'
|
11
|
+
# load_path __FILE__, 'perfs'
|
12
|
+
|
13
|
+
# TODO: config for 'simple_override' -> active or not ?
|
14
|
+
|
15
|
+
end
|
@@ -11,43 +11,25 @@ class RKit::Pagination::Base::Page
|
|
11
11
|
RKit::Decoration::Dsl.domain self
|
12
12
|
acts_as_decorables do
|
13
13
|
|
14
|
-
# TODO: we tried to cancel the underscored alias of __getobj__
|
15
|
-
# cause the class name is also an attr_name
|
16
|
-
# but this doesn't work, cause when you use a block, the decorator class creation will be processed after
|
17
|
-
# so, in decoration, we might whant to alias only if method not already defined
|
18
|
-
def page
|
19
|
-
__getobj__.page
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
14
|
after_initialize do
|
24
|
-
if
|
15
|
+
if page == base.page
|
25
16
|
alias :page_tag :disabled_link_to_page
|
26
17
|
end
|
27
18
|
end
|
28
19
|
|
29
20
|
|
30
|
-
def page_tag name =
|
21
|
+
def page_tag name = page
|
31
22
|
link_to_page name
|
32
23
|
end
|
33
24
|
|
34
25
|
|
35
|
-
def link_to_page name =
|
36
|
-
view.link_to name, view.url_for(page:
|
26
|
+
def link_to_page name = page
|
27
|
+
view.link_to name, view.url_for(page: page), class: :btn
|
37
28
|
end
|
38
29
|
|
39
|
-
def disabled_link_to_page name =
|
30
|
+
def disabled_link_to_page name = page
|
40
31
|
view.content_tag :span, name, class: :'btn-disabled'
|
41
32
|
end
|
42
|
-
|
43
33
|
end
|
44
34
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
# this need
|
49
|
-
# current_page
|
50
|
-
|
51
|
-
# and a decorator
|
52
|
-
|
53
35
|
end
|
@@ -12,8 +12,10 @@ class RKit::Pagination::Base < CollectionDelegator
|
|
12
12
|
@per_page = options[:per_page] || RKit::Pagination.config.per_page[collection.klass]
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
def paginated?() true end
|
16
|
+
|
17
|
+
|
18
|
+
tap_attr_accessor :page, :per_page, typecast: :to_i
|
17
19
|
|
18
20
|
def total_pages
|
19
21
|
(collection.count / per_page.to_f).ceil
|
@@ -31,17 +33,25 @@ class RKit::Pagination::Base < CollectionDelegator
|
|
31
33
|
|
32
34
|
|
33
35
|
def limited_collection
|
34
|
-
collection
|
36
|
+
@limited_collection ||= collection
|
35
37
|
.limit(per_page)
|
36
38
|
.offset((page-1) * per_page)
|
37
39
|
end
|
38
40
|
|
41
|
+
include Enumerable
|
42
|
+
|
39
43
|
def each &block
|
40
|
-
limited_collection.each
|
44
|
+
limited_collection.each(&block)
|
41
45
|
end
|
42
46
|
|
43
47
|
delegate :inspect, to: :limited_collection
|
44
48
|
|
49
|
+
def reverse
|
50
|
+
reversed = limited_collection.reverse
|
51
|
+
@limited_collection.clear.concat(reversed)
|
52
|
+
|
53
|
+
self
|
54
|
+
end
|
45
55
|
|
46
56
|
|
47
57
|
def pages
|
@@ -62,73 +72,33 @@ class RKit::Pagination::Base < CollectionDelegator
|
|
62
72
|
|
63
73
|
RKit::Decoration::Dsl.domain self
|
64
74
|
acts_as_decorables do
|
75
|
+
after_initialize do
|
76
|
+
# TODO: I need this definition here
|
77
|
+
# Otherwise, the base definition in enumerable_extend is found first
|
65
78
|
|
66
|
-
|
67
|
-
|
68
|
-
def each &block
|
69
|
-
limited_collection.decorate.each &block
|
79
|
+
define_singleton_method :paginated?, ->{ true }
|
70
80
|
end
|
71
81
|
|
72
82
|
|
73
|
-
|
74
|
-
|
75
|
-
|
83
|
+
depend on: :pages do
|
84
|
+
def pagination_tag
|
85
|
+
view.content_tag :nav, class: :pagination do
|
86
|
+
[previous_page_tag, pages_tag, next_page_tag].reduce(:safe_concat)
|
87
|
+
end
|
76
88
|
end
|
77
|
-
end
|
78
89
|
|
79
|
-
|
80
|
-
|
81
|
-
|
90
|
+
def previous_page_tag
|
91
|
+
previous_page.decorate.page_tag "<"
|
92
|
+
end
|
82
93
|
|
83
|
-
|
84
|
-
|
85
|
-
|
94
|
+
def pages_tag
|
95
|
+
pages.map(&:decorate).map(&:page_tag).reduce(:safe_concat)
|
96
|
+
end
|
86
97
|
|
87
|
-
|
88
|
-
|
98
|
+
def next_page_tag
|
99
|
+
next_page.decorate.page_tag ">"
|
100
|
+
end
|
89
101
|
end
|
90
102
|
end
|
91
103
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
# TODO: limited_collection, total_pages & pages can change, based on scopes or "page & per_page" config
|
96
|
-
# So we need a "@loaded" instance_variable
|
97
|
-
# that will have the same role as in AR::Relation
|
98
|
-
# -> either, can't scope if loaded
|
99
|
-
# -> either, empty the 3 "based on scope/config" variables
|
100
|
-
# --
|
101
|
-
# or, we don't memoize the 3 problematic vars
|
102
|
-
# wich will be my choice right now
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
# I need
|
108
|
-
# collection, records/instances/results/paginated_collection/limited_collection(as we use SQL 'limit')
|
109
|
-
# current page, total nb items, total pages
|
110
|
-
|
111
|
-
# calling could be : Articles.paginate(page: 2, per_page: 15).published
|
112
|
-
# note that published is _after_, but we still want to display 15 records
|
113
|
-
# Alternative call Articles.paginate.page(2).per_page(15)
|
114
|
-
# --
|
115
|
-
# the "per_page" will be settable either by an arg in the method,
|
116
|
-
# or by an option, per model, in the dsl (access by Article.all.instance_variable_get "@klass")
|
117
|
-
# or in the "pagination" config
|
118
|
-
# the "current page" will be 1 by default
|
119
|
-
|
120
|
-
# Raise an error if the collection has a "limit" or an "offset" (before or after pagination initialization)
|
121
|
-
# here is the pagination method scope : Paginator::Collection.new(scoped).limit(per).offset((page-1) * per)
|
122
|
-
|
123
|
-
|
124
|
-
# We also need a method "pagination_tag", in the view
|
125
|
-
# maybe use a decorator to do so.
|
126
|
-
|
127
|
-
# Define an option to use pagination based on instance, in this case, the "per_page" is set to one
|
128
|
-
# and the "pagination_tag" accept a block to display the "page number"
|
129
|
-
|
130
|
-
|
131
|
-
# Idea, the "current_page" info (to disable the current page link) could be an instance of a class (pagination::Page)
|
132
|
-
# so in that class, (or in her decorator), we could define the "link_to_page" method
|
133
|
-
# (and the "disabled_link_to", wich we will alias on self)
|
134
104
|
end
|
data/lib/r_kit/pagination/dsl.rb
CHANGED
@@ -5,11 +5,21 @@ module RKit::Pagination::Dsl
|
|
5
5
|
method :acts_as_paginables
|
6
6
|
domain ActiveRecord::Base
|
7
7
|
|
8
|
+
params ->(per_page: nil){}
|
9
|
+
|
8
10
|
methods :class do
|
9
11
|
|
12
|
+
# TODO: to move in 'before_acts_as_paginables' callback, once this is available in 'dsl'
|
13
|
+
if pagination_dsl.params.per_page
|
14
|
+
RKit::Pagination.config.per_page[self] = pagination_dsl.params.per_page
|
15
|
+
end
|
16
|
+
|
17
|
+
|
10
18
|
def paginate page: nil, per_page: nil
|
11
19
|
RKit::Pagination::Base.new(all, page: page, per_page: per_page)
|
12
20
|
end
|
13
21
|
|
22
|
+
def paginated?() false end
|
23
|
+
|
14
24
|
end
|
15
25
|
end
|