date_and_time_input 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,6 @@
1
+ *~
2
+ .*~
3
+ /tmp
4
+ TAGS
5
+ /bin
6
+ /.bundle
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "rake"
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # DateAndTimeInput
2
+
3
+ DateAndTimeInput is a Rails extension, providing a form input for DateTime attributes
4
+ arranged as two input fields, for date and time, respectively.
5
+
6
+ ## Installation
7
+
8
+ $ gem install date_and_time_input
9
+
10
+ ## Usage
11
+
12
+ To use DateAndTimeInput in your view templates,
13
+ you need to specify the input presentation as follows:
14
+
15
+ date_and_time_field :letter, :sent_at
16
+
17
+ or, as a `form_for` field:
18
+
19
+ f.date_and_time :sent_at
20
+
21
+ and that's it.
22
+
23
+ ## Authors
24
+
25
+ - [Slava Kravchenko](https://github.com/cordawyn)
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << "lib" << "test"
8
+ t.test_files = FileList["test/**/*_test.rb"]
9
+ t.verbose = true
10
+ end
@@ -0,0 +1,24 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'date_and_time_input'
3
+ gem.authors = ['Slava Kravchenko']
4
+ gem.email = ['slava.kravchenko@gmail.com']
5
+ gem.version = ("$Release: 0.0.1 $" =~ /[\.\d]+/) && $&
6
+ gem.platform = Gem::Platform::RUBY
7
+ gem.homepage = "https://github.com/cordawyn/date_and_time_input"
8
+ gem.summary = "Rails extension for Datetime 2-field inputs"
9
+ gem.description = <<HERE
10
+ DateAndTimeInput is a Rails extension, providing a form input for DateTime attributes
11
+ arranged as two input fields, for date and time, respectively.
12
+ HERE
13
+
14
+ gem.files = `git ls-files`.split($\) - ["Gemfile.lock"]
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ["lib"]
18
+
19
+ gem.add_dependency "actionpack", "~> 3.2.0"
20
+
21
+ gem.license = "The MIT License (MIT)"
22
+ gem.extra_rdoc_files = ['README.md']
23
+ gem.has_rdoc = false
24
+ end
@@ -0,0 +1,73 @@
1
+ module ActionView
2
+ module Helpers
3
+ module DateAndTimeHelper
4
+ DEFAULT_PREFIX = 'object'.freeze
5
+ POSITION = { :date => 1, :time => 2 }.freeze
6
+
7
+ def date_and_time_field(object_name, method, options = {}, html_options = {})
8
+ InstanceTag.new(object_name, method, self, options.delete(:object)).to_date_and_time_field_tag(options, html_options).html_safe
9
+ end
10
+ end
11
+
12
+ class InstanceTag
13
+ def to_date_and_time_field_tag(options = {}, html_options = {})
14
+ options = options.stringify_keys
15
+ html_options = html_options.stringify_keys
16
+
17
+ options["include_position"] = true unless options.has_key?("include_position")
18
+ options["prefix"] ||= @object_name
19
+
20
+ html_options["value"] = html_options.fetch("value"){ value_before_type_cast(object) }
21
+ html_options["value"] &&= ERB::Util.html_escape(html_options["value"])
22
+ { date: value_to_date(html_options["value"]),
23
+ time: value_to_time(html_options["value"])
24
+ }.inject("") do |output, (field_type, value)|
25
+ html_options.merge!("id" => input_id_from_type(field_type, options),
26
+ "name" => input_name_from_type(field_type, options),
27
+ "type" => field_type,
28
+ "value" => value)
29
+ output << tag("input", html_options)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def value_to_date(value)
36
+ value && value.to_date.to_s
37
+ end
38
+
39
+ def value_to_time(value)
40
+ value && value.strftime("%H:%M")
41
+ end
42
+
43
+ # Returns the name attribute for the input tag.
44
+ # => post[written_on(1)]
45
+ def input_name_from_type(type, options = {})
46
+ prefix = options["prefix"] || ActionView::Helpers::DateAndTimeHelper::DEFAULT_PREFIX
47
+ prefix += "[#{options['index']}]" if options.has_key?("index")
48
+
49
+ field_name = method_name.dup
50
+ if options["include_position"]
51
+ field_name += "(#{ActionView::Helpers::DateAndTimeHelper::POSITION[type]})"
52
+ end
53
+
54
+ options["discard_type"] ? prefix : "#{prefix}[#{field_name}]"
55
+ end
56
+
57
+ # Returns the id attribute for the input tag.
58
+ # => "post_written_on_1"
59
+ def input_id_from_type(type, options = {})
60
+ id = input_name_from_type(type, options).gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '')
61
+ id = options["namespace"] + '_' + id if options["namespace"]
62
+
63
+ id
64
+ end
65
+ end
66
+
67
+ class FormBuilder
68
+ def date_and_time(method, options = {})
69
+ @template.date_and_time_field(@object_name, method, options)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,29 @@
1
+ module ActiveRecord
2
+ # ActiveRecord (temporal) extension to handle 2-field datetime attribute assignment
3
+ module DatetimeMultiparameterAttribute
4
+ private
5
+
6
+ def read_value_from_parameter(name, values_hash_from_param)
7
+ klass = (self.class.reflect_on_aggregation(name.to_sym) || column_for_attribute(name)).klass
8
+ if (klass == Time || klass == Datetime) && values_hash_from_param.size == 2
9
+ t = Time.zone.parse("#{values_hash_from_param[1]} #{values_hash_from_param[2]}")
10
+ if t
11
+ values = {
12
+ 1 => t.year,
13
+ 2 => t.month,
14
+ 3 => t.day,
15
+ 4 => t.hour,
16
+ 5 => t.min,
17
+ 6 => t.sec,
18
+ 7 => t.usec
19
+ }
20
+ read_other_parameter_value(klass, name, values)
21
+ else
22
+ nil
23
+ end
24
+ else
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ if defined?(::ActionView)
2
+ require "action_view/helpers/date_and_time_helper"
3
+ ActionView::Helpers.send :autoload, :DateAndTimeHelper
4
+ ActionView::Helpers.send :include, ActionView::Helpers::DateAndTimeHelper
5
+ end
6
+
7
+ if defined?(::ActiveRecord)
8
+ require "active_record/datetime_multiparameter_attribute"
9
+ ActiveRecord::Base.send :include, ActiveRecord::DatetimeMultiparameterAttribute
10
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ describe ActionView::Helpers::DateAndTimeHelper do
4
+ include ActionView::Helpers::DateAndTimeHelper
5
+
6
+ describe "date_and_time_field" do
7
+ subject { date_and_time_field(:object, :created_at) }
8
+
9
+ it "must produce proper markup" do
10
+ subject.must_equal "<input id=\"object_created_at_1\" name=\"object[created_at(1)]\" type=\"date\" /><input id=\"object_created_at_2\" name=\"object[created_at(2)]\" type=\"time\" />"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ require "minitest/autorun"
2
+
3
+ require "action_view"
4
+ require "date_and_time_input"
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: date_and_time_input
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Slava Kravchenko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ none: false
21
+ name: actionpack
22
+ type: :runtime
23
+ prerelease: false
24
+ requirement: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: 3.2.0
29
+ none: false
30
+ description: ! 'DateAndTimeInput is a Rails extension, providing a form input for
31
+ DateTime attributes
32
+
33
+ arranged as two input fields, for date and time, respectively.
34
+
35
+ '
36
+ email:
37
+ - slava.kravchenko@gmail.com
38
+ executables: []
39
+ extensions: []
40
+ extra_rdoc_files:
41
+ - README.md
42
+ files:
43
+ - .gitignore
44
+ - Gemfile
45
+ - README.md
46
+ - Rakefile
47
+ - date_and_time_input.gemspec
48
+ - lib/action_view/helpers/date_and_time_helper.rb
49
+ - lib/active_record/datetime_multiparameter_attribute.rb
50
+ - lib/date_and_time_input.rb
51
+ - test/action_view/helpers/date_and_time_helper_test.rb
52
+ - test/test_helper.rb
53
+ homepage: https://github.com/cordawyn/date_and_time_input
54
+ licenses:
55
+ - The MIT License (MIT)
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ none: false
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ none: false
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 1.8.24
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: Rails extension for Datetime 2-field inputs
78
+ test_files:
79
+ - test/action_view/helpers/date_and_time_helper_test.rb
80
+ - test/test_helper.rb
81
+ has_rdoc: false