listview 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/listview.rb +55 -80
- metadata +1 -1
data/lib/listview.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'date'
|
2
2
|
|
3
|
+
#this is included in rails, but unfortunately not in the general ruby date library
|
3
4
|
class DateTime
|
4
5
|
def to_i
|
5
6
|
seconds_since_unix_epoch.to_i
|
@@ -15,99 +16,73 @@ end
|
|
15
16
|
class ListView
|
16
17
|
|
17
18
|
class << self
|
18
|
-
#example use:
|
19
|
-
#
|
20
|
-
#class ObjectThatRespondsToDate
|
21
|
-
# attr_accessor :date
|
22
|
-
#end
|
23
|
-
#
|
24
|
-
#obj1 = ObjectThatRespondsToDate.new
|
25
|
-
#obj1.date = DateTime.now
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#get_events(events: [obj1], events_per_page: 5, page: 0)
|
29
|
-
def get_events vars
|
30
|
-
get_events_that_havent_happened_yet(vars[:events], vars[:events_per_page], (vars[:page].to_i)*vars[:events_per_page])[:events_that_havent_happened_yet]
|
31
|
-
end
|
32
|
-
|
33
|
-
#example use:
|
34
|
-
#
|
35
|
-
#get_events(events: [obj1], events_per_page: 5, page: 0, date_format: "%B, %d")
|
36
|
-
#date_format help: http://ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html#method-i-to_date
|
37
|
-
def organization_events_by_day vars
|
38
|
-
vars[:date_format] ||= "%B, %d"
|
39
|
-
events_dict = get_events_that_havent_happened_yet(vars[:events], vars[:events_per_page], (vars[:page].to_i)*vars[:events_per_page])
|
40
|
-
|
41
|
-
organized_events = events_dict[:events_that_havent_happened_yet]
|
42
|
-
rightmost_page = events_dict[:rightmost_page]
|
43
|
-
leftmost_page = events_dict[:leftmost_page]
|
44
19
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
current_day = event.date
|
57
|
-
events_organized_by_day += [date: event_date(event.date, vars[:date_format]), events: [event]]
|
58
|
-
elsif index == 0
|
59
|
-
events_organized_by_day += [date: event_date(event.date, vars[:date_format]), events: [event]]
|
60
|
-
else
|
61
|
-
events_organized_by_day[-1][:events] += [event]
|
62
|
-
end
|
63
|
-
end
|
20
|
+
#parameters: vars[:events], vars[:date], vars[:page], vars[:events_per_page], vars[:date_format]
|
21
|
+
def get_events_and_page_info vars
|
22
|
+
vars[:date] ||= DateTime.now
|
23
|
+
event_closed_to_today = get_event_closed_to_today(vars[:events], vars[:date])
|
24
|
+
next_event = event_closed_to_today + (vars[:page].to_i * vars[:events_per_page].to_i)
|
25
|
+
events = get_events(events: vars[:events],
|
26
|
+
date: vars[:date],
|
27
|
+
page: vars[:page],
|
28
|
+
events_per_page: vars[:events_per_page])
|
29
|
+
rightmost_page = rightmost_page(events: vars[:events].length, next_event: next_event, events_per_page: vars[:events_per_page])
|
30
|
+
leftmost_page = leftmost_page(next_event: next_event, events_per_page: vars[:events_per_page])
|
64
31
|
return {
|
65
|
-
events:
|
32
|
+
events: events,
|
66
33
|
rightmost_page: rightmost_page,
|
67
34
|
leftmost_page: leftmost_page,
|
68
35
|
}
|
69
36
|
end
|
70
37
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
events_that_havent_happened_yet.sort_by! {|event| event.date}
|
80
|
-
closest_to_today = get_event_closed_to_today(events_that_havent_happened_yet)
|
81
|
-
|
82
|
-
return_var = {}
|
83
|
-
return_var[:events_that_havent_happened_yet] = []
|
84
|
-
event_index = closest_to_today + offset
|
85
|
-
return_var[:leftmost_page] = -((event_index / number_of_events_per_page).to_i)
|
86
|
-
return_var[:rightmost_page] = (((events_that_havent_happened_yet.length - 1) - (event_index)) / number_of_events_per_page).to_i
|
87
|
-
|
88
|
-
return return_var if closest_to_today.nil?
|
89
|
-
|
90
|
-
start_event_index = [closest_to_today + offset, 0].max
|
91
|
-
return_var[:events_that_havent_happened_yet] = events_that_havent_happened_yet[start_event_index, number_of_events_per_page]
|
92
|
-
return return_var
|
38
|
+
#parameters: vars[:events], vars[:date], vars[:page], vars[:events_per_page]
|
39
|
+
def get_events vars
|
40
|
+
vars[:date] ||= DateTime.now
|
41
|
+
events_closed_to_today = get_event_closed_to_today(vars[:events], vars[:date])
|
42
|
+
sorted_events = vars[:events].sort{ |x,y| x.date <=> y.date }
|
43
|
+
left_most_index = events_closed_to_today + (vars[:page].to_i * vars[:events_per_page].to_i)
|
44
|
+
if left_most_index < 0
|
45
|
+
return sorted_events[0, vars[:events_per_page].to_i + left_most_index] || []
|
93
46
|
end
|
47
|
+
sorted_events[left_most_index, vars[:events_per_page].to_i] || []
|
48
|
+
end
|
94
49
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
50
|
+
def get_event_closed_to_today events, the_date=nil
|
51
|
+
the_date ||= DateTime.now
|
52
|
+
closest_to_today = nil
|
53
|
+
sorted_events = events.sort{ |x,y| x.date <=> y.date }
|
54
|
+
sorted_events.each_with_index do |event, index|
|
55
|
+
if event.date.to_i > the_date.to_i
|
56
|
+
if closest_to_today == nil
|
57
|
+
closest_to_today = index
|
58
|
+
else
|
59
|
+
if event.date.to_i - the_date.to_i < sorted_events[closest_to_today].date.to_i - the_date.to_i
|
101
60
|
closest_to_today = index
|
102
|
-
else
|
103
|
-
if event.date.to_i - today.to_i < events[closest_to_today].date.to_i - today.to_i
|
104
|
-
closest_to_today = index
|
105
|
-
end
|
106
61
|
end
|
107
62
|
end
|
108
63
|
end
|
109
|
-
return closest_to_today
|
110
64
|
end
|
111
|
-
|
65
|
+
return closest_to_today
|
66
|
+
end
|
112
67
|
|
68
|
+
#parameters: vars[:events_per_page], vars[:next_event]
|
69
|
+
def leftmost_page vars
|
70
|
+
if vars[:events_per_page] > vars[:next_event]
|
71
|
+
return -1
|
72
|
+
elsif vars[:events_per_page] == 0
|
73
|
+
return 0
|
74
|
+
end
|
75
|
+
-(((vars[:next_event].to_i) / vars[:events_per_page].to_f).ceil)
|
76
|
+
end
|
77
|
+
|
78
|
+
#parameters:
|
79
|
+
#vars[:events],
|
80
|
+
#vars[:next_event]
|
81
|
+
#vars[:events_per_page]
|
82
|
+
def rightmost_page vars
|
83
|
+
events_after_today_minus_page_zero = (vars[:events] - (vars[:next_event] + vars[:events_per_page]))
|
84
|
+
(events_after_today_minus_page_zero / vars[:events_per_page].to_f).ceil
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
113
88
|
end
|