combined_time_select 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## v0.0.1
2
+
3
+ * initial release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in combined_time_select.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Anthony Amoyal
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ Combined Time Select
2
+ ====================
3
+
4
+ This is a small gem for creating Google Calendar style 12 hour AM/PM
5
+ time_select fields for Rails 3. It's based off of [simple_time_select](https://github.com/tamoyal/simple_time_select) by tamoyal.
6
+
7
+ Usage
8
+ -----
9
+
10
+ Here we have a model called Event with the start_time attribute that we
11
+ will be using with combined_time_select.
12
+
13
+ Because Rails time_select fields submit separate values, there is some
14
+ overhead on the controller side when we combine the fields into one. We
15
+ can't rely on Rails to parse the input into a valid time anymore.
16
+
17
+ In the view you can do the following:
18
+
19
+ <%= f.time_select :start_time,
20
+ :combined => true,
21
+ :default => Time.now.change(:hour => 11, :min => 30),
22
+ :minute_interval => 15,
23
+ :time_separator => "",
24
+ :start_hour => 10,
25
+ :end_hour => 14 } %>
26
+
27
+ This will create a combined time select starting at 10 AM and going till
28
+ 2 PM with 15 minute intervals with a default of 11:30 AM. This will set the
29
+ value for the start_time attribute on the object this form was created
30
+ for.
31
+
32
+ On the controller side, we need to parse this attribute before we create
33
+ a new object. combined_time_select provides a nice method for this
34
+ called parse_time_select!. You can use this in your create action just
35
+ before you initialize the new model:
36
+
37
+ def create
38
+ params[:event].parse_time_select! :start_time
39
+ @event = Event.new params[:event]
40
+ end
41
+
42
+ And voila! You're all set.
43
+
44
+ Behind The Scenes
45
+ -----------------
46
+
47
+ When the form gets submitted we will recieve a params hash like so:
48
+
49
+ {"utf8"=>"✓", "event"=>{"start_time(5i)"=>"10:00:00"}, "commit"=>"Save changes"}
50
+
51
+ A normal time_select wil use start_time(4i) for the hours and
52
+ start_time(5i) for the minutes. The parse_time_select! will take all the
53
+ start_time(Xi) fields, parse them into a Time object and set the
54
+ params[:start_time] attribute to this object. The result after a
55
+ parse_time_select!(attribute) looks like this:
56
+
57
+ {"utf8"=>"✓", "event"=>{"start_time"=>Fri, 23 Dec 2011 10:00:00 UTC +00:00}, "commit"=>"Save changes"}
58
+
59
+ This allows you to also seamlessly use a date_select field with
60
+ combined_time_select.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "combined_time_select/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "combined_time_select"
7
+ s.version = CombinedTimeSelect::VERSION
8
+ s.authors = ["Chris Oliver"]
9
+ s.email = ["excid3@gmail.com"]
10
+ s.homepage = "https://github.com/excid3/combined_time_select"
11
+ s.summary = %q{A Rails time_select like Google Calendar with combined hour and minute time_select}
12
+ s.description = %q{Generates a time_select field like Google calendar.}
13
+
14
+ s.rubyforge_project = "combined_time_select"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rake"
22
+
23
+ # specify any dependencies here; for example:
24
+ # s.add_development_dependency "rspec"
25
+ # s.add_runtime_dependency "rest-client"
26
+ end
@@ -0,0 +1,120 @@
1
+ require "combined_time_select/version"
2
+
3
+ module CombinedTimeSelect
4
+ # Your code goes here...
5
+ end
6
+
7
+
8
+ module ActiveSupport
9
+ class HashWithIndifferentAccess < Hash
10
+ def parse_time_select!(attribute)
11
+ self[attribute] = Time.zone.parse("#{self["#{attribute}(1i)"]}-#{self["#{attribute}(2i)"]}-#{self["#{attribute}(3i)"]} #{self["#{attribute}(5i)"]}")
12
+ (1..5).each { |i| self.delete "#{attribute}(#{i}i)" }
13
+ self
14
+ end
15
+ end
16
+ end
17
+
18
+
19
+ module ActionView::Helpers
20
+ class DateTimeSelector
21
+ def select_minute_with_simple_time_select
22
+ return select_minute_without_simple_time_select unless @options[:combined].eql? true
23
+
24
+ # Although this is a datetime select, we only care about the time. Assume that the date will
25
+ # be set by some other control, and the date represented here will be overriden
26
+
27
+ val_minutes = @datetime.kind_of?(Time) ? @datetime.min + @datetime.hour*60 : @datetime
28
+
29
+ @options[:time_separator] = ""
30
+
31
+ # Default is 15 minute intervals
32
+ minute_interval = 15
33
+ if @options[:minute_interval]
34
+ minute_interval = @options[:minute_interval]
35
+ end
36
+
37
+ start_minute = 0
38
+ # @options[:start_hour] should be specified in military
39
+ # i.e. 0-23
40
+ if @options[:start_hour]
41
+ start_minute = @options[:start_hour] * 60
42
+ end
43
+
44
+ end_minute = 1439
45
+ # @options[:end_hour] should be specified in military
46
+ # i.e. 0-23
47
+ if @options[:end_hour]
48
+ end_minute = ( @options[:end_hour] + 1 ) * 60 - 1
49
+ end
50
+
51
+ if @options[:use_hidden] || @options[:discard_minute]
52
+ build_hidden(:minute, val)
53
+ else
54
+ minute_options = []
55
+ start_minute.upto(end_minute) do |minute|
56
+ if minute%minute_interval == 0
57
+ ampm = minute < 720 ? ' AM' : ' PM'
58
+ hour = minute/60
59
+ minute_padded = zero_pad_num(minute%60)
60
+ hour_padded = zero_pad_num(hour)
61
+ ampm_hour = ampm_hour(hour)
62
+
63
+ val = "#{hour_padded}:#{minute_padded}:00"
64
+ minute_options << ((val_minutes == minute) ?
65
+ %(<option value="#{val}" selected="selected">#{ampm_hour}:#{minute_padded}#{ampm}</option>\n) :
66
+ %(<option value="#{val}">#{ampm_hour}:#{minute_padded}#{ampm}</option>\n)
67
+ )
68
+ end
69
+ end
70
+ build_select(:minute, minute_options.join(' '))
71
+ end
72
+ end
73
+ alias_method_chain :select_minute, :simple_time_select
74
+
75
+
76
+ def select_hour_with_simple_time_select
77
+ return select_hour_without_simple_time_select unless @options[:combined].eql? true
78
+ # Don't build the hour select
79
+ #build_hidden(:hour, val)
80
+ end
81
+ alias_method_chain :select_hour, :simple_time_select
82
+
83
+ def select_second_with_simple_time_select
84
+ return select_second_without_simple_time_select unless @options[:combined].eql? true
85
+ # Don't build the seconds select
86
+ #build_hidden(:second, val)
87
+ end
88
+ alias_method_chain :select_second, :simple_time_select
89
+
90
+ def select_year_with_simple_time_select
91
+ return select_year_without_simple_time_select unless @options[:combined].eql? true
92
+ # Don't build the year select
93
+ #build_hidden(:year, val)
94
+ end
95
+ alias_method_chain :select_year, :simple_time_select
96
+
97
+ def select_month_with_simple_time_select
98
+ return select_month_without_simple_time_select unless @options[:combined].eql? true
99
+ # Don't build the month select
100
+ #build_hidden(:month, val)
101
+ end
102
+ alias_method_chain :select_month, :simple_time_select
103
+
104
+ def select_day_with_simple_time_select
105
+ return select_day_without_simple_time_select unless @options[:combined].eql? true
106
+ # Don't build the day select
107
+ #build_hidden(:day, val)
108
+ end
109
+ alias_method_chain :select_day, :simple_time_select
110
+
111
+ end
112
+ end
113
+
114
+ def ampm_hour(hour)
115
+ return hour == 12 ? 12 : (hour == 0 ? 12 : (hour / 12 == 1 ? hour % 12 : hour))
116
+ end
117
+
118
+ def zero_pad_num(num)
119
+ return num < 10 ? '0' + num.to_s : num.to_s
120
+ end
@@ -0,0 +1,3 @@
1
+ module CombinedTimeSelect
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: combined_time_select
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Oliver
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-23 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70360704093620 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70360704093620
25
+ description: Generates a time_select field like Google calendar.
26
+ email:
27
+ - excid3@gmail.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - CHANGELOG.md
34
+ - Gemfile
35
+ - LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - combined_time_select.gemspec
39
+ - lib/combined_time_select.rb
40
+ - lib/combined_time_select/version.rb
41
+ homepage: https://github.com/excid3/combined_time_select
42
+ licenses: []
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ segments:
54
+ - 0
55
+ hash: 2502057723234992945
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ segments:
63
+ - 0
64
+ hash: 2502057723234992945
65
+ requirements: []
66
+ rubyforge_project: combined_time_select
67
+ rubygems_version: 1.8.10
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: A Rails time_select like Google Calendar with combined hour and minute time_select
71
+ test_files: []