simple_form-bootstrap 1.0.1 → 1.1.0
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.
- checksums.yaml +4 -4
- data/Rakefile +12 -5
- data/app/assets/javascripts/simple_form-bootstrap.js +24 -24
- data/app/assets/javascripts/simple_form-bootstrap/date_time_input.js +76 -76
- data/app/assets/javascripts/simple_form-bootstrap/select_input.js +12 -12
- data/lib/simple_form/bootstrap.rb +26 -26
- data/lib/simple_form/bootstrap/engine.rb +2 -2
- data/lib/simple_form/bootstrap/form_builders.rb +9 -9
- data/lib/simple_form/bootstrap/form_builders/button.rb +23 -25
- data/lib/simple_form/bootstrap/form_builders/date_time.rb +26 -27
- data/lib/simple_form/bootstrap/inputs.rb +7 -7
- data/lib/simple_form/bootstrap/inputs/date_time_input.rb +134 -134
- data/lib/simple_form/bootstrap/railtie.rb +5 -5
- data/lib/simple_form/bootstrap/setup.rb +189 -155
- data/lib/simple_form/bootstrap/version.rb +4 -4
- metadata +87 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c16d3f9a42c7904818b88f8ba467cc2933c207f
|
4
|
+
data.tar.gz: 74210a6d9b771e55cfca00e1c9587cec64f71035
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ba9d2e78f15f8afc6b1790d1a78bc8122c68488e960d9e4536d79497a77996882280dfbc92599aebf2c466f0c44b312b50723ff4f84b01165631f83ac7d0973
|
7
|
+
data.tar.gz: a5090b762a5c5a0d13d6ad1fec5eb2540a9ed61fd699537bf413ead4ea1ada1d78574d6b34d638d6d6559cb1c4bb394ac2a4c25b1497ee3bac380db125b801bc
|
data/Rakefile
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
-
begin
|
2
|
-
require 'bundler/setup'
|
3
|
-
rescue LoadError
|
4
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
-
end
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require "rspec/core/rake_task"
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new
|
10
|
+
|
11
|
+
task :default => :spec
|
12
|
+
task :test => :spec
|
@@ -1,24 +1,24 @@
|
|
1
|
-
//= require simple_form-bootstrap/date_time_input
|
2
|
-
|
3
|
-
(function($) {
|
4
|
-
'use strict';
|
5
|
-
function initializeComponents(node) {
|
6
|
-
// Enable our date/time pickers
|
7
|
-
var datePickers = $('input.bootstrap-datepicker', node);
|
8
|
-
datePickers.datetimepicker();
|
9
|
-
|
10
|
-
// Enable our styled Bootstrap select controls, except Twitter Typeahead controls.
|
11
|
-
var selects = $('select.form-control:not(.typeahead)', node);
|
12
|
-
selects.selectpicker();
|
13
|
-
}
|
14
|
-
|
15
|
-
$(document).on('ready', function(e) {
|
16
|
-
initializeComponents(document);
|
17
|
-
});
|
18
|
-
$(document).on('DOMNodeInserted', function(e) {
|
19
|
-
initializeComponents(e.target);
|
20
|
-
});
|
21
|
-
$(document).on('nested:fieldAdded', function(e) {
|
22
|
-
initializeComponents(e.field);
|
23
|
-
});
|
24
|
-
})(jQuery);
|
1
|
+
//= require simple_form-bootstrap/date_time_input
|
2
|
+
|
3
|
+
(function($) {
|
4
|
+
'use strict';
|
5
|
+
function initializeComponents(node) {
|
6
|
+
// Enable our date/time pickers
|
7
|
+
var datePickers = $('input.bootstrap-datepicker', node);
|
8
|
+
datePickers.datetimepicker();
|
9
|
+
|
10
|
+
// Enable our styled Bootstrap select controls, except Twitter Typeahead controls.
|
11
|
+
var selects = $('select.form-control:not(.typeahead)', node);
|
12
|
+
selects.selectpicker();
|
13
|
+
}
|
14
|
+
|
15
|
+
$(document).on('ready', function(e) {
|
16
|
+
initializeComponents(document);
|
17
|
+
});
|
18
|
+
$(document).on('DOMNodeInserted', function(e) {
|
19
|
+
initializeComponents(e.target);
|
20
|
+
});
|
21
|
+
$(document).on('nested:fieldAdded', function(e) {
|
22
|
+
initializeComponents(e.field);
|
23
|
+
});
|
24
|
+
})(jQuery);
|
@@ -1,76 +1,76 @@
|
|
1
|
-
// Hijacks the default Bootstrap date-time picker to always format dates in the specified format
|
2
|
-
// through the use of a hidden field.
|
3
|
-
(function($) {
|
4
|
-
'use strict';
|
5
|
-
/* global moment */
|
6
|
-
|
7
|
-
// Machine-readable formats used to store dates in hidden fields
|
8
|
-
var DATE_FORMAT = 'YYYY-MM-DD';
|
9
|
-
var DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ssZZ';
|
10
|
-
var DATETIME_FORMAT_RAILS = 'YYYY-MM-DD HH:mm:ss ZZ';
|
11
|
-
|
12
|
-
var oldDateTimePicker = $.fn.datetimepicker;
|
13
|
-
if (!oldDateTimePicker) {
|
14
|
-
return;
|
15
|
-
}
|
16
|
-
|
17
|
-
var methods = {
|
18
|
-
initialise: function(arg) {
|
19
|
-
// Synchronise the proper display format
|
20
|
-
this.each(methods.initialiseFormat);
|
21
|
-
|
22
|
-
// Create the controls
|
23
|
-
arg = arg || {};
|
24
|
-
oldDateTimePicker.call(
|
25
|
-
this.filter(':not(input.bootstrap-timepicker)').parent(),
|
26
|
-
$.extend({}, arg, { pickTime: false }));
|
27
|
-
oldDateTimePicker.call(
|
28
|
-
this.filter('input.bootstrap-timepicker').parent(),
|
29
|
-
arg);
|
30
|
-
|
31
|
-
// Hide the backing date picker and show the actual date picker.
|
32
|
-
this.attr('type', 'text');
|
33
|
-
this.parent().css('display', '');
|
34
|
-
this.parent().next('input[type=text]').attr('type', 'hidden');
|
35
|
-
|
36
|
-
return this;
|
37
|
-
},
|
38
|
-
|
39
|
-
initialiseFormat: function() {
|
40
|
-
var $textField = $(this);
|
41
|
-
var displayFormat = $textField.data('dateFormat');
|
42
|
-
|
43
|
-
// Parse date in field (if provided)
|
44
|
-
var thisDate = moment($textField.val(), [DATETIME_FORMAT_RAILS, displayFormat]);
|
45
|
-
if (thisDate.isValid()) {
|
46
|
-
// Set displayed text field
|
47
|
-
$textField.val(thisDate.format(displayFormat));
|
48
|
-
|
49
|
-
// Set hidden field
|
50
|
-
var hiddenFormat = $textField.hasClass('bootstrap-timepicker') ? DATETIME_FORMAT :
|
51
|
-
DATE_FORMAT;
|
52
|
-
$textField.parent().next('input').val(thisDate.format(hiddenFormat));
|
53
|
-
}
|
54
|
-
}
|
55
|
-
};
|
56
|
-
|
57
|
-
// Replace the datetimepicker prototypes
|
58
|
-
$.fn.datetimepicker = function(arg) {
|
59
|
-
return methods.initialise.call(this, arg);
|
60
|
-
};
|
61
|
-
$.fn.datetimepicker.defaults = oldDateTimePicker.defaults;
|
62
|
-
|
63
|
-
// Ensure that the dates are properly formatted in the text field.
|
64
|
-
$(document).on('dp.change dp.show', '.bootstrap-datepicker:' +
|
65
|
-
'not(.bootstrap-timepicker)', function (e) {
|
66
|
-
var date = e.date;
|
67
|
-
var rails_date_format = date.format(DATE_FORMAT);
|
68
|
-
$(this).next('input[type=hidden]').val(rails_date_format);
|
69
|
-
});
|
70
|
-
|
71
|
-
$(document).on('dp.change dp.show', '.bootstrap-timepicker', function (e) {
|
72
|
-
var date = e.date;
|
73
|
-
var rails_date_format = date.format(DATETIME_FORMAT);
|
74
|
-
$(this).next('input[type=hidden]').val(rails_date_format);
|
75
|
-
});
|
76
|
-
}(jQuery));
|
1
|
+
// Hijacks the default Bootstrap date-time picker to always format dates in the specified format
|
2
|
+
// through the use of a hidden field.
|
3
|
+
(function($) {
|
4
|
+
'use strict';
|
5
|
+
/* global moment */
|
6
|
+
|
7
|
+
// Machine-readable formats used to store dates in hidden fields
|
8
|
+
var DATE_FORMAT = 'YYYY-MM-DD';
|
9
|
+
var DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ssZZ';
|
10
|
+
var DATETIME_FORMAT_RAILS = 'YYYY-MM-DD HH:mm:ss ZZ';
|
11
|
+
|
12
|
+
var oldDateTimePicker = $.fn.datetimepicker;
|
13
|
+
if (!oldDateTimePicker) {
|
14
|
+
return;
|
15
|
+
}
|
16
|
+
|
17
|
+
var methods = {
|
18
|
+
initialise: function(arg) {
|
19
|
+
// Synchronise the proper display format
|
20
|
+
this.each(methods.initialiseFormat);
|
21
|
+
|
22
|
+
// Create the controls
|
23
|
+
arg = arg || {};
|
24
|
+
oldDateTimePicker.call(
|
25
|
+
this.filter(':not(input.bootstrap-timepicker)').parent(),
|
26
|
+
$.extend({}, arg, { pickTime: false }));
|
27
|
+
oldDateTimePicker.call(
|
28
|
+
this.filter('input.bootstrap-timepicker').parent(),
|
29
|
+
arg);
|
30
|
+
|
31
|
+
// Hide the backing date picker and show the actual date picker.
|
32
|
+
this.attr('type', 'text');
|
33
|
+
this.parent().css('display', '');
|
34
|
+
this.parent().next('input[type=text]').attr('type', 'hidden');
|
35
|
+
|
36
|
+
return this;
|
37
|
+
},
|
38
|
+
|
39
|
+
initialiseFormat: function() {
|
40
|
+
var $textField = $(this);
|
41
|
+
var displayFormat = $textField.data('dateFormat');
|
42
|
+
|
43
|
+
// Parse date in field (if provided)
|
44
|
+
var thisDate = moment($textField.val(), [DATETIME_FORMAT_RAILS, displayFormat]);
|
45
|
+
if (thisDate.isValid()) {
|
46
|
+
// Set displayed text field
|
47
|
+
$textField.val(thisDate.format(displayFormat));
|
48
|
+
|
49
|
+
// Set hidden field
|
50
|
+
var hiddenFormat = $textField.hasClass('bootstrap-timepicker') ? DATETIME_FORMAT :
|
51
|
+
DATE_FORMAT;
|
52
|
+
$textField.parent().next('input').val(thisDate.format(hiddenFormat));
|
53
|
+
}
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|
57
|
+
// Replace the datetimepicker prototypes
|
58
|
+
$.fn.datetimepicker = function(arg) {
|
59
|
+
return methods.initialise.call(this, arg);
|
60
|
+
};
|
61
|
+
$.fn.datetimepicker.defaults = oldDateTimePicker.defaults;
|
62
|
+
|
63
|
+
// Ensure that the dates are properly formatted in the text field.
|
64
|
+
$(document).on('dp.change dp.show', '.bootstrap-datepicker:' +
|
65
|
+
'not(.bootstrap-timepicker)', function (e) {
|
66
|
+
var date = e.date;
|
67
|
+
var rails_date_format = date.format(DATE_FORMAT);
|
68
|
+
$(this).next('input[type=hidden]').val(rails_date_format);
|
69
|
+
});
|
70
|
+
|
71
|
+
$(document).on('dp.change dp.show', '.bootstrap-timepicker', function (e) {
|
72
|
+
var date = e.date;
|
73
|
+
var rails_date_format = date.format(DATETIME_FORMAT);
|
74
|
+
$(this).next('input[type=hidden]').val(rails_date_format);
|
75
|
+
});
|
76
|
+
}(jQuery));
|
@@ -1,12 +1,12 @@
|
|
1
|
-
// Hijacks the default Bootstrap date-time picker to always format dates in the specified format
|
2
|
-
// through the use of a hidden field.
|
3
|
-
(function($) {
|
4
|
-
'use strict';
|
5
|
-
if ($.fn.selectpicker) {
|
6
|
-
return;
|
7
|
-
}
|
8
|
-
|
9
|
-
$.fn.selectpicker = function(arg) {
|
10
|
-
return methods.initialise.call(this, arg);
|
11
|
-
};
|
12
|
-
}(jQuery));
|
1
|
+
// Hijacks the default Bootstrap date-time picker to always format dates in the specified format
|
2
|
+
// through the use of a hidden field.
|
3
|
+
(function($) {
|
4
|
+
'use strict';
|
5
|
+
if ($.fn.selectpicker) {
|
6
|
+
return;
|
7
|
+
}
|
8
|
+
|
9
|
+
$.fn.selectpicker = function(arg) {
|
10
|
+
return methods.initialise.call(this, arg);
|
11
|
+
};
|
12
|
+
}(jQuery));
|
@@ -1,26 +1,26 @@
|
|
1
|
-
module SimpleForm::Bootstrap
|
2
|
-
extend ActiveSupport::Autoload
|
3
|
-
|
4
|
-
autoload :Setup
|
5
|
-
autoload :FormBuilders
|
6
|
-
|
7
|
-
eager_autoload do
|
8
|
-
autoload :Inputs
|
9
|
-
end
|
10
|
-
|
11
|
-
# Because we are augmenting Simple Form with our input fields, we need to load even when eager
|
12
|
-
# loading is not enabled
|
13
|
-
SimpleForm::Bootstrap::FormBuilders.load!
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
if defined?(Rails)
|
24
|
-
require 'simple_form/bootstrap/railtie'
|
25
|
-
require 'simple_form/bootstrap/engine'
|
26
|
-
end
|
1
|
+
module SimpleForm::Bootstrap
|
2
|
+
extend ActiveSupport::Autoload
|
3
|
+
|
4
|
+
autoload :Setup
|
5
|
+
autoload :FormBuilders
|
6
|
+
|
7
|
+
eager_autoload do
|
8
|
+
autoload :Inputs
|
9
|
+
end
|
10
|
+
|
11
|
+
# Because we are augmenting Simple Form with our input fields, we need to load even when eager
|
12
|
+
# loading is not enabled
|
13
|
+
SimpleForm::Bootstrap::FormBuilders.load!
|
14
|
+
end
|
15
|
+
|
16
|
+
module SimpleForm
|
17
|
+
class << self
|
18
|
+
# Extend the normal Simple Form configuration options with ours.
|
19
|
+
prepend SimpleForm::Bootstrap::Setup
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if defined?(Rails)
|
24
|
+
require 'simple_form/bootstrap/railtie'
|
25
|
+
require 'simple_form/bootstrap/engine'
|
26
|
+
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
class SimpleForm::Bootstrap::Engine < Rails::Engine
|
2
|
-
end
|
1
|
+
class SimpleForm::Bootstrap::Engine < Rails::Engine
|
2
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
module SimpleForm::Bootstrap::FormBuilders
|
2
|
-
extend ActiveSupport::Autoload
|
3
|
-
|
4
|
-
def self.load!
|
5
|
-
Dir.glob("#{__dir__}/form_builders/*") do |path|
|
6
|
-
require path
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
1
|
+
module SimpleForm::Bootstrap::FormBuilders
|
2
|
+
extend ActiveSupport::Autoload
|
3
|
+
|
4
|
+
def self.load!
|
5
|
+
Dir.glob("#{__dir__}/form_builders/*") do |path|
|
6
|
+
require path
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -1,25 +1,23 @@
|
|
1
|
-
module SimpleForm::Bootstrap::FormBuilders::Button
|
2
|
-
# Adds the btn-default class selectively to buttons which do not have an explicit button type.
|
3
|
-
def
|
4
|
-
options = args.extract_options!.dup
|
5
|
-
options[:class] = [*options[:class]]
|
6
|
-
|
7
|
-
# Add the specified class type.
|
8
|
-
if options[:class].select { |cls| cls.length < 4 || cls[0, 4] == 'btn-' }.empty?
|
9
|
-
if type.to_s == :submit.to_s.freeze
|
10
|
-
options[:class] << 'btn-primary'
|
11
|
-
else
|
12
|
-
options[:class] << 'btn-default'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
args << options
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
SimpleForm::FormBuilder.class_eval do
|
22
|
-
|
23
|
-
|
24
|
-
alias_method_chain :button, :bootstrap
|
25
|
-
end
|
1
|
+
module SimpleForm::Bootstrap::FormBuilders::Button
|
2
|
+
# Adds the btn-default class selectively to buttons which do not have an explicit button type.
|
3
|
+
def button(type, *args, &proc)
|
4
|
+
options = args.extract_options!.dup
|
5
|
+
options[:class] = [*options[:class]]
|
6
|
+
|
7
|
+
# Add the specified class type.
|
8
|
+
if options[:class].select { |cls| cls.length < 4 || cls[0, 4] == 'btn-' }.empty?
|
9
|
+
if type.to_s == :submit.to_s.freeze
|
10
|
+
options[:class] << 'btn-primary'
|
11
|
+
else
|
12
|
+
options[:class] << 'btn-default'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
args << options
|
16
|
+
|
17
|
+
super(type, *args, &proc)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
SimpleForm::FormBuilder.class_eval do
|
22
|
+
prepend SimpleForm::Bootstrap::FormBuilders::Button
|
23
|
+
end
|
@@ -1,27 +1,26 @@
|
|
1
|
-
module SimpleForm::Bootstrap::FormBuilders::DateTime
|
2
|
-
DATE_TIME_COLUMN_TYPES = [
|
3
|
-
'datetime',
|
4
|
-
'timestamp',
|
5
|
-
'timestamp without time zone'
|
6
|
-
].freeze
|
7
|
-
|
8
|
-
DATE_COLUMN_TYPES = [
|
9
|
-
'date'
|
10
|
-
].freeze
|
11
|
-
|
12
|
-
def
|
13
|
-
if (options.is_a?(Hash) ? options[:as] : @options[:as]).nil? && !column.nil?
|
14
|
-
return :bootstrap_date_time if DATE_TIME_COLUMN_TYPES.include?(column.sql_type)
|
15
|
-
return :bootstrap_date if DATE_COLUMN_TYPES.include?(column.sql_type)
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
SimpleForm::FormBuilder.class_eval do
|
23
|
-
|
24
|
-
|
25
|
-
map_type :bootstrap_date_time, :bootstrap_date, to: SimpleForm::Bootstrap::Inputs::DateTimeInput
|
26
|
-
|
27
|
-
end
|
1
|
+
module SimpleForm::Bootstrap::FormBuilders::DateTime
|
2
|
+
DATE_TIME_COLUMN_TYPES = [
|
3
|
+
'datetime',
|
4
|
+
'timestamp',
|
5
|
+
'timestamp without time zone'
|
6
|
+
].freeze
|
7
|
+
|
8
|
+
DATE_COLUMN_TYPES = [
|
9
|
+
'date'
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
def default_input_type(attribute_name, column, options, *args, &block)
|
13
|
+
if (options.is_a?(Hash) ? options[:as] : @options[:as]).nil? && !column.nil?
|
14
|
+
return :bootstrap_date_time if DATE_TIME_COLUMN_TYPES.include?(column.sql_type)
|
15
|
+
return :bootstrap_date if DATE_COLUMN_TYPES.include?(column.sql_type)
|
16
|
+
end
|
17
|
+
|
18
|
+
super(attribute_name, column, options, *args, &block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
SimpleForm::FormBuilder.class_eval do
|
23
|
+
prepend SimpleForm::Bootstrap::FormBuilders::DateTime
|
24
|
+
|
25
|
+
map_type :bootstrap_date_time, :bootstrap_date, to: SimpleForm::Bootstrap::Inputs::DateTimeInput
|
26
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
module SimpleForm::Bootstrap::Inputs
|
2
|
-
extend ActiveSupport::Autoload
|
3
|
-
|
4
|
-
eager_autoload do
|
5
|
-
autoload :DateTimeInput
|
6
|
-
end
|
7
|
-
end
|
1
|
+
module SimpleForm::Bootstrap::Inputs
|
2
|
+
extend ActiveSupport::Autoload
|
3
|
+
|
4
|
+
eager_autoload do
|
5
|
+
autoload :DateTimeInput
|
6
|
+
end
|
7
|
+
end
|
@@ -1,134 +1,134 @@
|
|
1
|
-
# Inspired by this StackOverflow answer: http://stackoverflow.com/a/19018501
|
2
|
-
# I have modified this to work with dates AND times, and also to work better
|
3
|
-
# with browsers with JavaScript disabled.
|
4
|
-
class SimpleForm::Bootstrap::Inputs::DateTimeInput < SimpleForm::Inputs::Base
|
5
|
-
def input(_ = nil)
|
6
|
-
text_field_options = input_html_options.with_indifferent_access
|
7
|
-
format = text_field_options.delete(:format) || default_format
|
8
|
-
|
9
|
-
# Integrate with Bootstrap's styling
|
10
|
-
text_field_options[:class] << 'form-control'
|
11
|
-
|
12
|
-
hidden_field_options = text_field_options.dup
|
13
|
-
hidden_field_options[:class] = text_field_options[:class].dup # so they won't work with same array object
|
14
|
-
hidden_field_options[:id] = "#{attribute_name}_hidden"
|
15
|
-
hidden_field_options[:value] ||= value(object).try(:to_s)
|
16
|
-
text_field_options[:class] << 'bootstrap-datepicker'
|
17
|
-
text_field_options[:class] << 'bootstrap-timepicker' if input_type == :bootstrap_date_time
|
18
|
-
text_field_options[:value] ||= format_date(value(object), format)
|
19
|
-
text_field_options[:data] = { 'date-format' => strftime_to_momentjs_format(format) }
|
20
|
-
|
21
|
-
text_field_group_classes = text_field_options[:class].dup
|
22
|
-
text_field_group_classes.delete('form-control')
|
23
|
-
|
24
|
-
return_string = <<-END_INPUT
|
25
|
-
<div class="input-group #{text_field_group_classes.join(' ')}" style="display: none">
|
26
|
-
#{@builder.hidden_field(attribute_name, text_field_options.to_hash)}
|
27
|
-
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
|
28
|
-
</div>
|
29
|
-
#{@builder.text_field(attribute_name, hidden_field_options.to_hash)}
|
30
|
-
END_INPUT
|
31
|
-
return_string.html_safe
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
|
36
|
-
# Gets the format suitable for this field.
|
37
|
-
def default_format
|
38
|
-
case input_type
|
39
|
-
when :bootstrap_date
|
40
|
-
I18n.t('date.formats.default')
|
41
|
-
when :bootstrap_date_time
|
42
|
-
I18n.t('time.formats.default')
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def value(object)
|
47
|
-
object.send @attribute_name if object
|
48
|
-
end
|
49
|
-
|
50
|
-
def format_date(value, format)
|
51
|
-
value.try(:strftime, format)
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
# rubocop:disable Style/CyclomaticComplexity, Style/MethodLength
|
57
|
-
def strftime_to_momentjs_format(format)
|
58
|
-
format.gsub(/([^%]%|^%)([_\-\^][a-zA-Z]|[a-zA-Z])/i) do |match|
|
59
|
-
last_match = Regexp.last_match(2)
|
60
|
-
|
61
|
-
# Preprocess the last match:
|
62
|
-
# - %_m is blank-padding
|
63
|
-
# - %-m is no padding
|
64
|
-
# - %^B is uppercase
|
65
|
-
padding = 0 # zero padding; 1 = blank, 2 = none
|
66
|
-
case last_match[0]
|
67
|
-
when '_'
|
68
|
-
padding = 1
|
69
|
-
last_match = last_match[1]
|
70
|
-
when '-'
|
71
|
-
padding = 2
|
72
|
-
last_match = last_match[1]
|
73
|
-
when '^'
|
74
|
-
last_match = last_match[1]
|
75
|
-
end
|
76
|
-
|
77
|
-
specifier =
|
78
|
-
case last_match
|
79
|
-
when 'a' # Abbreviated day
|
80
|
-
'ddd'
|
81
|
-
when 'A' # Full day
|
82
|
-
'dddd'
|
83
|
-
when 'd' # Day of month, with leading 0
|
84
|
-
padding == 2 ? 'D' : 'DD'
|
85
|
-
when 'u' # Day of year, with leading 0's (3 digits)
|
86
|
-
'DDDD'
|
87
|
-
when 'w' # Day of week, Sunday = 0
|
88
|
-
'd'
|
89
|
-
|
90
|
-
when 'b', 'h' # Abbreviated month
|
91
|
-
'MMM'
|
92
|
-
when 'B' # Full month
|
93
|
-
'MMMM'
|
94
|
-
when 'm' # Two digit representation of month (01 = Jan)
|
95
|
-
padding == 2 ? 'M' : 'MM'
|
96
|
-
|
97
|
-
when 'y' # Two digit representation of the year
|
98
|
-
'YY'
|
99
|
-
when 'Y' # Four digit representation of the year
|
100
|
-
'YYYY'
|
101
|
-
|
102
|
-
when 'H' # Two digit representation of the hour in 24-hour format
|
103
|
-
'HH'
|
104
|
-
when 'k' # Two digit representation of the hour in 24-hour format, padded with space
|
105
|
-
'H'
|
106
|
-
when 'I' # Two digit representation of the hour in 12-hour format
|
107
|
-
'hh'
|
108
|
-
when 'l' # Two digit representation of the hour in 12-hour format, padded with space
|
109
|
-
'h'
|
110
|
-
|
111
|
-
when 'M' # Two digit representation of minute
|
112
|
-
'mm'
|
113
|
-
when 'p' # Uppercase AM or PM
|
114
|
-
'A'
|
115
|
-
when 'P' # Lowercase AM or PM
|
116
|
-
'a'
|
117
|
-
when 'S' # Two digit representation of seconds
|
118
|
-
'ss'
|
119
|
-
|
120
|
-
when 'z' # The time zone offset. e.g. -0500
|
121
|
-
'ZZ'
|
122
|
-
when 'Z' # The time zone offset. e.g. EST
|
123
|
-
'z'
|
124
|
-
else
|
125
|
-
match
|
126
|
-
end
|
127
|
-
|
128
|
-
# Strip the % and return the new specifier
|
129
|
-
match = Regexp.last_match(1)
|
130
|
-
(match.slice(0, match.length - 1) || '') + specifier
|
131
|
-
end
|
132
|
-
end
|
133
|
-
# rubocop:enable Style/CyclomaticComplexity, Style/MethodLength
|
134
|
-
end
|
1
|
+
# Inspired by this StackOverflow answer: http://stackoverflow.com/a/19018501
|
2
|
+
# I have modified this to work with dates AND times, and also to work better
|
3
|
+
# with browsers with JavaScript disabled.
|
4
|
+
class SimpleForm::Bootstrap::Inputs::DateTimeInput < SimpleForm::Inputs::Base
|
5
|
+
def input(_ = nil)
|
6
|
+
text_field_options = input_html_options.with_indifferent_access
|
7
|
+
format = text_field_options.delete(:format) || default_format
|
8
|
+
|
9
|
+
# Integrate with Bootstrap's styling
|
10
|
+
text_field_options[:class] << 'form-control'
|
11
|
+
|
12
|
+
hidden_field_options = text_field_options.dup
|
13
|
+
hidden_field_options[:class] = text_field_options[:class].dup # so they won't work with same array object
|
14
|
+
hidden_field_options[:id] = "#{attribute_name}_hidden"
|
15
|
+
hidden_field_options[:value] ||= value(object).try(:to_s)
|
16
|
+
text_field_options[:class] << 'bootstrap-datepicker'
|
17
|
+
text_field_options[:class] << 'bootstrap-timepicker' if input_type == :bootstrap_date_time
|
18
|
+
text_field_options[:value] ||= format_date(value(object), format)
|
19
|
+
text_field_options[:data] = { 'date-format' => strftime_to_momentjs_format(format) }
|
20
|
+
|
21
|
+
text_field_group_classes = text_field_options[:class].dup
|
22
|
+
text_field_group_classes.delete('form-control')
|
23
|
+
|
24
|
+
return_string = <<-END_INPUT
|
25
|
+
<div class="input-group #{text_field_group_classes.join(' ')}" style="display: none">
|
26
|
+
#{@builder.hidden_field(attribute_name, text_field_options.to_hash)}
|
27
|
+
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
|
28
|
+
</div>
|
29
|
+
#{@builder.text_field(attribute_name, hidden_field_options.to_hash)}
|
30
|
+
END_INPUT
|
31
|
+
return_string.html_safe
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
# Gets the format suitable for this field.
|
37
|
+
def default_format
|
38
|
+
case input_type
|
39
|
+
when :bootstrap_date
|
40
|
+
I18n.t('date.formats.default')
|
41
|
+
when :bootstrap_date_time
|
42
|
+
I18n.t('time.formats.default')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def value(object)
|
47
|
+
object.send @attribute_name if object
|
48
|
+
end
|
49
|
+
|
50
|
+
def format_date(value, format)
|
51
|
+
value.try(:strftime, format)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# rubocop:disable Style/CyclomaticComplexity, Style/MethodLength
|
57
|
+
def strftime_to_momentjs_format(format)
|
58
|
+
format.gsub(/([^%]%|^%)([_\-\^][a-zA-Z]|[a-zA-Z])/i) do |match|
|
59
|
+
last_match = Regexp.last_match(2)
|
60
|
+
|
61
|
+
# Preprocess the last match:
|
62
|
+
# - %_m is blank-padding
|
63
|
+
# - %-m is no padding
|
64
|
+
# - %^B is uppercase
|
65
|
+
padding = 0 # zero padding; 1 = blank, 2 = none
|
66
|
+
case last_match[0]
|
67
|
+
when '_'
|
68
|
+
padding = 1
|
69
|
+
last_match = last_match[1]
|
70
|
+
when '-'
|
71
|
+
padding = 2
|
72
|
+
last_match = last_match[1]
|
73
|
+
when '^'
|
74
|
+
last_match = last_match[1]
|
75
|
+
end
|
76
|
+
|
77
|
+
specifier =
|
78
|
+
case last_match
|
79
|
+
when 'a' # Abbreviated day
|
80
|
+
'ddd'
|
81
|
+
when 'A' # Full day
|
82
|
+
'dddd'
|
83
|
+
when 'd' # Day of month, with leading 0
|
84
|
+
padding == 2 ? 'D' : 'DD'
|
85
|
+
when 'u' # Day of year, with leading 0's (3 digits)
|
86
|
+
'DDDD'
|
87
|
+
when 'w' # Day of week, Sunday = 0
|
88
|
+
'd'
|
89
|
+
|
90
|
+
when 'b', 'h' # Abbreviated month
|
91
|
+
'MMM'
|
92
|
+
when 'B' # Full month
|
93
|
+
'MMMM'
|
94
|
+
when 'm' # Two digit representation of month (01 = Jan)
|
95
|
+
padding == 2 ? 'M' : 'MM'
|
96
|
+
|
97
|
+
when 'y' # Two digit representation of the year
|
98
|
+
'YY'
|
99
|
+
when 'Y' # Four digit representation of the year
|
100
|
+
'YYYY'
|
101
|
+
|
102
|
+
when 'H' # Two digit representation of the hour in 24-hour format
|
103
|
+
'HH'
|
104
|
+
when 'k' # Two digit representation of the hour in 24-hour format, padded with space
|
105
|
+
'H'
|
106
|
+
when 'I' # Two digit representation of the hour in 12-hour format
|
107
|
+
'hh'
|
108
|
+
when 'l' # Two digit representation of the hour in 12-hour format, padded with space
|
109
|
+
'h'
|
110
|
+
|
111
|
+
when 'M' # Two digit representation of minute
|
112
|
+
'mm'
|
113
|
+
when 'p' # Uppercase AM or PM
|
114
|
+
'A'
|
115
|
+
when 'P' # Lowercase AM or PM
|
116
|
+
'a'
|
117
|
+
when 'S' # Two digit representation of seconds
|
118
|
+
'ss'
|
119
|
+
|
120
|
+
when 'z' # The time zone offset. e.g. -0500
|
121
|
+
'ZZ'
|
122
|
+
when 'Z' # The time zone offset. e.g. EST
|
123
|
+
'z'
|
124
|
+
else
|
125
|
+
match
|
126
|
+
end
|
127
|
+
|
128
|
+
# Strip the % and return the new specifier
|
129
|
+
match = Regexp.last_match(1)
|
130
|
+
(match.slice(0, match.length - 1) || '') + specifier
|
131
|
+
end
|
132
|
+
end
|
133
|
+
# rubocop:enable Style/CyclomaticComplexity, Style/MethodLength
|
134
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'rails/railtie'
|
2
|
-
|
3
|
-
class SimpleForm::Bootstrap::Railtie < Rails::Railtie
|
4
|
-
config.eager_load_namespaces << SimpleForm::Bootstrap
|
5
|
-
end
|
1
|
+
require 'rails/railtie'
|
2
|
+
|
3
|
+
class SimpleForm::Bootstrap::Railtie < Rails::Railtie
|
4
|
+
config.eager_load_namespaces << SimpleForm::Bootstrap
|
5
|
+
end
|
@@ -1,155 +1,189 @@
|
|
1
|
-
# Handles configuration Simple Form with Bootstrap defaults.
|
2
|
-
module SimpleForm::Bootstrap::Setup
|
3
|
-
def setup
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
end
|
1
|
+
# Handles configuration Simple Form with Bootstrap defaults.
|
2
|
+
module SimpleForm::Bootstrap::Setup
|
3
|
+
def setup
|
4
|
+
super do |config|
|
5
|
+
yield config
|
6
|
+
configure_simple_form(config)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def configure_simple_form(config)
|
13
|
+
config.error_notification_tag = :div
|
14
|
+
config.error_notification_class = 'alert alert-danger'
|
15
|
+
config.button_class = 'btn'
|
16
|
+
config.boolean_style = :nested
|
17
|
+
config.boolean_label_class = nil
|
18
|
+
|
19
|
+
configure_wrappers(config)
|
20
|
+
|
21
|
+
# Wrappers for forms and inputs using the Bootstrap toolkit.
|
22
|
+
# Check the Bootstrap docs (http://getbootstrap.com)
|
23
|
+
# to learn about the different styles for forms and inputs,
|
24
|
+
# buttons and other elements.
|
25
|
+
config.default_wrapper = :vertical_form
|
26
|
+
config.wrapper_mappings = {
|
27
|
+
check_boxes: :vertical_radio_and_checkboxes,
|
28
|
+
radio_buttons: :vertical_radio_and_checkboxes,
|
29
|
+
file: :vertical_file_input,
|
30
|
+
boolean: :vertical_boolean,
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def configure_wrappers(config)
|
35
|
+
configure_vertical_form_wrapper(config)
|
36
|
+
configure_vertical_file_input_wrapper(config)
|
37
|
+
configure_vertical_boolean_wrapper(config)
|
38
|
+
configure_vertical_radio_and_checkboxes_wrapper(config)
|
39
|
+
configure_horizontal_form_wrapper(config)
|
40
|
+
configure_horizontal_file_input_wrapper(config)
|
41
|
+
configure_horizontal_boolean_wrapper(config)
|
42
|
+
configure_horizontal_radio_and_checkboxes_wrapper(config)
|
43
|
+
configure_inline_form_wrapper(config)
|
44
|
+
end
|
45
|
+
|
46
|
+
def configure_vertical_form_wrapper(config)
|
47
|
+
config.wrappers :vertical_form, tag: 'div', class: 'form-group',
|
48
|
+
error_class: 'has-error' do |b|
|
49
|
+
b.use :html5
|
50
|
+
b.use :placeholder
|
51
|
+
b.optional :maxlength
|
52
|
+
b.optional :pattern
|
53
|
+
b.optional :min_max
|
54
|
+
b.optional :readonly
|
55
|
+
b.use :label, class: 'control-label'
|
56
|
+
|
57
|
+
b.use :input, class: 'form-control'
|
58
|
+
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
59
|
+
b.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def configure_vertical_file_input_wrapper(config)
|
64
|
+
config.wrappers :vertical_file_input, tag: 'div', class: 'form-group',
|
65
|
+
error_class: 'has-error' do |b|
|
66
|
+
b.use :html5
|
67
|
+
b.use :placeholder
|
68
|
+
b.optional :maxlength
|
69
|
+
b.optional :readonly
|
70
|
+
b.use :label, class: 'control-label'
|
71
|
+
|
72
|
+
b.use :input
|
73
|
+
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
74
|
+
b.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def configure_vertical_boolean_wrapper(config)
|
79
|
+
config.wrappers :vertical_boolean, tag: 'div', class: 'form-group',
|
80
|
+
error_class: 'has-error' do |b|
|
81
|
+
b.use :html5
|
82
|
+
b.optional :readonly
|
83
|
+
|
84
|
+
b.wrapper tag: 'div', class: 'checkbox' do |ba|
|
85
|
+
ba.use :label_input
|
86
|
+
end
|
87
|
+
|
88
|
+
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
89
|
+
b.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def configure_vertical_radio_and_checkboxes_wrapper(config)
|
94
|
+
config.wrappers :vertical_radio_and_checkboxes, tag: 'div', class: 'form-group',
|
95
|
+
error_class: 'has-error' do |b|
|
96
|
+
b.use :html5
|
97
|
+
b.optional :readonly
|
98
|
+
b.use :label, class: 'control-label'
|
99
|
+
b.use :input
|
100
|
+
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
101
|
+
b.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def configure_horizontal_form_wrapper(config)
|
106
|
+
config.wrappers :horizontal_form, tag: 'div', class: 'form-group',
|
107
|
+
error_class: 'has-error' do |b|
|
108
|
+
b.use :html5
|
109
|
+
b.use :placeholder
|
110
|
+
b.optional :maxlength
|
111
|
+
b.optional :pattern
|
112
|
+
b.optional :min_max
|
113
|
+
b.optional :readonly
|
114
|
+
b.use :label, class: 'col-sm-3 control-label'
|
115
|
+
|
116
|
+
b.wrapper tag: 'div', class: 'col-sm-9' do |ba|
|
117
|
+
ba.use :input, class: 'form-control'
|
118
|
+
ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
119
|
+
ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def configure_horizontal_file_input_wrapper(config)
|
125
|
+
config.wrappers :horizontal_file_input, tag: 'div', class: 'form-group',
|
126
|
+
error_class: 'has-error' do |b|
|
127
|
+
b.use :html5
|
128
|
+
b.use :placeholder
|
129
|
+
b.optional :maxlength
|
130
|
+
b.optional :readonly
|
131
|
+
b.use :label, class: 'col-sm-3 control-label'
|
132
|
+
|
133
|
+
b.wrapper tag: 'div', class: 'col-sm-9' do |ba|
|
134
|
+
ba.use :input
|
135
|
+
ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
136
|
+
ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def configure_horizontal_boolean_wrapper(config)
|
142
|
+
config.wrappers :horizontal_boolean, tag: 'div', class: 'form-group',
|
143
|
+
error_class: 'has-error' do |b|
|
144
|
+
b.use :html5
|
145
|
+
b.optional :readonly
|
146
|
+
|
147
|
+
b.wrapper tag: 'div', class: 'col-sm-offset-3 col-sm-9' do |wr|
|
148
|
+
wr.wrapper tag: 'div', class: 'checkbox' do |ba|
|
149
|
+
ba.use :label_input, class: 'col-sm-9'
|
150
|
+
end
|
151
|
+
|
152
|
+
wr.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
153
|
+
wr.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def configure_horizontal_radio_and_checkboxes_wrapper(config)
|
159
|
+
config.wrappers :horizontal_radio_and_checkboxes, tag: 'div', class: 'form-group',
|
160
|
+
error_class: 'has-error' do |b|
|
161
|
+
b.use :html5
|
162
|
+
b.optional :readonly
|
163
|
+
|
164
|
+
b.use :label, class: 'col-sm-3 control-label'
|
165
|
+
|
166
|
+
b.wrapper tag: 'div', class: 'col-sm-9' do |ba|
|
167
|
+
ba.use :input
|
168
|
+
ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
169
|
+
ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def configure_inline_form_wrapper(config)
|
175
|
+
config.wrappers :inline_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b|
|
176
|
+
b.use :html5
|
177
|
+
b.use :placeholder
|
178
|
+
b.optional :maxlength
|
179
|
+
b.optional :pattern
|
180
|
+
b.optional :min_max
|
181
|
+
b.optional :readonly
|
182
|
+
b.use :label, class: 'sr-only'
|
183
|
+
|
184
|
+
b.use :input, class: 'form-control'
|
185
|
+
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
186
|
+
b.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module SimpleForm; end
|
2
|
-
module SimpleForm::Bootstrap
|
3
|
-
VERSION = '1.0
|
4
|
-
end
|
1
|
+
module SimpleForm; end
|
2
|
+
module SimpleForm::Bootstrap
|
3
|
+
VERSION = '1.1.0'
|
4
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form-bootstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Low
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bootstrap-sass
|
@@ -66,6 +66,90 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '4.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: railties
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec-html-matchers
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: coveralls
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: codeclimate-test-reporter
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
69
153
|
description: Initialises Simple Form to automatically produce Bootstrap 3-friendly
|
70
154
|
markup
|
71
155
|
email: joel@joelsplace.sg
|
@@ -107,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
191
|
version: '0'
|
108
192
|
requirements: []
|
109
193
|
rubyforge_project:
|
110
|
-
rubygems_version: 2.
|
194
|
+
rubygems_version: 2.4.5
|
111
195
|
signing_key:
|
112
196
|
specification_version: 4
|
113
197
|
summary: Initialises Simple Form to automatically produce Bootstrap 3-friendly markup.
|