binco 2.0.1 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/app/assets/javascripts/binco.js +3 -1
- data/app/assets/javascripts/bootstrap-data-confirm.coffee +2 -2
- data/app/assets/stylesheets/_datepicker.scss +661 -0
- data/app/assets/stylesheets/binco.scss +34 -6
- data/app/helpers/binco/bootstrap_form_builder.rb +69 -16
- data/app/helpers/binco/image_helper.rb +9 -0
- data/app/helpers/binco/pagination_renderer.rb +35 -130
- data/app/views/binco/_breadcrumb.html.erb +1 -1
- data/lib/binco/engine.rb +3 -1
- data/lib/binco/version.rb +1 -1
- data/lib/generators/binco/install/install_generator.rb +1 -1
- data/lib/generators/binco/install/templates/_bootstrap_variables.scss +837 -0
- data/test/dummy/config/application.rb +0 -1
- metadata +104 -46
- data/lib/generators/binco/install/templates/_bootstrap-overrides.scss +0 -867
@@ -1,13 +1,41 @@
|
|
1
|
-
@import "
|
1
|
+
@import "bootstrap_variables";
|
2
2
|
@import "bootstrap";
|
3
3
|
@import "select2";
|
4
4
|
@import "select2-bootstrap";
|
5
|
-
@import "
|
5
|
+
@import "datepicker";
|
6
6
|
|
7
7
|
.field_with_errors {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
border-width: 1px;
|
8
|
+
input, select {
|
9
|
+
@extend .is-invalid;
|
10
|
+
@extend .was-validated;
|
12
11
|
}
|
13
12
|
}
|
13
|
+
|
14
|
+
.form-group > .field_with_errors {
|
15
|
+
display: inline;
|
16
|
+
}
|
17
|
+
|
18
|
+
.form-group > .field_with_errors:last-child {
|
19
|
+
display: block;
|
20
|
+
}
|
21
|
+
|
22
|
+
select.custom-select {
|
23
|
+
width: 100%;
|
24
|
+
}
|
25
|
+
|
26
|
+
.select2-container {
|
27
|
+
width: 100% !important;
|
28
|
+
}
|
29
|
+
|
30
|
+
.field_with_errors .select2-container .select2-selection--single {
|
31
|
+
border-color: $form-feedback-invalid-color;
|
32
|
+
}
|
33
|
+
|
34
|
+
.field_with_errors .custom-select {
|
35
|
+
border-color: $form-feedback-invalid-color;
|
36
|
+
}
|
37
|
+
|
38
|
+
.pagination {
|
39
|
+
margin-top: 1rem;
|
40
|
+
margin-bottom: 1rem;
|
41
|
+
}
|
@@ -1,31 +1,58 @@
|
|
1
1
|
module Binco
|
2
2
|
class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
|
3
3
|
alias_method :collection_select_original, :collection_select
|
4
|
+
alias_method :check_box_original, :check_box
|
4
5
|
alias_method :select_original, :select
|
6
|
+
alias_method :submit_original, :submit
|
7
|
+
|
8
|
+
CHECK_BOX_GROUP_CLASS = 'form-check'
|
9
|
+
CHECK_BOX_LABEL_CLASS = 'form-check-label'
|
10
|
+
FORM_ELEMENT_CLASS = 'form-control'
|
11
|
+
CHECK_BOX_INPUT_CLASS = 'form-check-input'
|
12
|
+
|
13
|
+
def initialize(object_name, object, template, options)
|
14
|
+
ActionView::Base::field_error_proc = Proc.new do |html_tag, instance|
|
15
|
+
if instance.respond_to?(:error_message) && instance.class.to_s != 'ActionView::Helpers::Tags::Label'
|
16
|
+
error_messages = instance.error_message.collect{ |error| "<div class=\"invalid-feedback\">#{error}</div>" }.join
|
17
|
+
|
18
|
+
"<div class=\"field_with_errors\">#{html_tag} #{error_messages}</div>".html_safe
|
19
|
+
else
|
20
|
+
"<div class=\"field_with_errors\">#{html_tag}</div>".html_safe
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
super(object_name, object, template, options)
|
25
|
+
end
|
5
26
|
|
6
27
|
def text_field(name, options = {})
|
7
|
-
options = add_class_to_options(
|
28
|
+
options = add_class_to_options(FORM_ELEMENT_CLASS, options)
|
8
29
|
super name, options
|
9
30
|
end
|
10
31
|
|
11
32
|
def telephone_field(name, options = {})
|
12
|
-
options = add_class_to_options(
|
33
|
+
options = add_class_to_options(FORM_ELEMENT_CLASS, options)
|
13
34
|
super name, options
|
14
35
|
end
|
36
|
+
alias_method :phone_field, :telephone_field
|
15
37
|
|
16
38
|
def select(method, choices = nil, options = {}, html_options = {}, &block)
|
17
|
-
html_options = add_class_to_options('
|
39
|
+
html_options = add_class_to_options('custom-select', html_options)
|
18
40
|
super method, choices, options, html_options, &block
|
19
41
|
end
|
20
42
|
|
43
|
+
def select2(method, choices = nil, options = {}, html_options = {}, &block)
|
44
|
+
html_options = add_class_to_options('select2-rails', html_options)
|
45
|
+
select_original method, choices, options, html_options, &block
|
46
|
+
end
|
47
|
+
|
21
48
|
def collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
22
49
|
if block_given?
|
23
50
|
super(method, collection, value_method, text_method, options, html_options, &block)
|
24
51
|
else
|
25
52
|
super method, collection, value_method, text_method, options, html_options do |b|
|
26
|
-
group_tag class:
|
27
|
-
b.label do
|
28
|
-
b.check_box + b.text
|
53
|
+
group_tag class: CHECK_BOX_GROUP_CLASS do
|
54
|
+
b.label class: CHECK_BOX_LABEL_CLASS do
|
55
|
+
b.check_box(class: CHECK_BOX_INPUT_CLASS) + " " + b.text
|
29
56
|
end
|
30
57
|
end
|
31
58
|
end
|
@@ -40,27 +67,27 @@ module Binco
|
|
40
67
|
end
|
41
68
|
|
42
69
|
def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
|
43
|
-
html_options = add_class_to_options('
|
70
|
+
html_options = add_class_to_options('custom-select', html_options)
|
44
71
|
super method, collection, value_method, text_method, options, html_options
|
45
72
|
end
|
46
73
|
|
47
74
|
def collection_select2(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
48
75
|
html_options = add_class_to_options('select2-rails', html_options)
|
49
|
-
|
76
|
+
collection_select_original(method, collection, value_method, text_method, options, html_options)
|
50
77
|
end
|
51
78
|
|
52
79
|
def email_field(name, options = {})
|
53
|
-
options = add_class_to_options(
|
80
|
+
options = add_class_to_options(FORM_ELEMENT_CLASS, options)
|
54
81
|
super name, options
|
55
82
|
end
|
56
83
|
|
57
84
|
def number_field(name, options = {})
|
58
|
-
options = add_class_to_options(
|
85
|
+
options = add_class_to_options(FORM_ELEMENT_CLASS, options)
|
59
86
|
super name, options
|
60
87
|
end
|
61
88
|
|
62
89
|
def password_field(name, options = {})
|
63
|
-
options = add_class_to_options(
|
90
|
+
options = add_class_to_options(FORM_ELEMENT_CLASS, options)
|
64
91
|
super name, options
|
65
92
|
end
|
66
93
|
|
@@ -70,20 +97,34 @@ module Binco
|
|
70
97
|
end
|
71
98
|
|
72
99
|
def text_area(method, options = {})
|
73
|
-
options = add_class_to_options(
|
100
|
+
options = add_class_to_options(FORM_ELEMENT_CLASS, options)
|
74
101
|
super(method, options)
|
75
102
|
end
|
76
103
|
|
77
104
|
def radio_button(method, tag_value, options = {})
|
78
|
-
options = add_class_to_options('radio', options)
|
79
105
|
super method, tag_value, options
|
80
106
|
end
|
81
107
|
|
82
108
|
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
|
83
|
-
options = add_class_to_options(
|
109
|
+
options = add_class_to_options(CHECK_BOX_INPUT_CLASS, options)
|
84
110
|
super method, options, checked_value, unchecked_value
|
85
111
|
end
|
86
112
|
|
113
|
+
def custom_check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
|
114
|
+
options = add_class_to_options('custom-control-input', options)
|
115
|
+
base_proc = ActionView::Base::field_error_proc
|
116
|
+
ActionView::Base::field_error_proc = Proc.new { |html_tag, instance| html_tag }
|
117
|
+
html = check_box_original(method, options, checked_value, unchecked_value)
|
118
|
+
ActionView::Base::field_error_proc = base_proc
|
119
|
+
|
120
|
+
return html
|
121
|
+
end
|
122
|
+
|
123
|
+
def file_field(method, options = {})
|
124
|
+
options = add_class_to_options('form-control-file', options)
|
125
|
+
super method, options
|
126
|
+
end
|
127
|
+
|
87
128
|
def submit(value = nil, options = {})
|
88
129
|
options = add_class_to_options('btn btn-success', options)
|
89
130
|
add_data_to_options({ disable_with: 'Enviando' }, options)
|
@@ -100,16 +141,28 @@ module Binco
|
|
100
141
|
group_tag options, &block
|
101
142
|
end
|
102
143
|
|
103
|
-
def
|
104
|
-
options = add_class_to_options(
|
144
|
+
def form_check(options = {}, &block)
|
145
|
+
options = add_class_to_options(CHECK_BOX_GROUP_CLASS, options)
|
105
146
|
group_tag options, &block
|
106
147
|
end
|
148
|
+
alias_method :check_box_group, :form_check
|
149
|
+
|
150
|
+
def check_label(method, options = {}, &block)
|
151
|
+
options = add_class_to_options(CHECK_BOX_LABEL_CLASS, options)
|
152
|
+
@template.label(@object_name, method, nil, objectify_options(options), &block)
|
153
|
+
end
|
154
|
+
alias_method :check_box_label, :check_label
|
107
155
|
|
108
156
|
def input_group(options = {}, &block)
|
109
157
|
options = add_class_to_options('input-group', options)
|
110
158
|
group_tag options, &block
|
111
159
|
end
|
112
160
|
|
161
|
+
def addon(icon, options = {})
|
162
|
+
options = add_class_to_options('input-group-addon', options)
|
163
|
+
@template.content_tag(:span, icon, options)
|
164
|
+
end
|
165
|
+
|
113
166
|
private
|
114
167
|
|
115
168
|
# Add the specified class_name the the options hash
|
@@ -1,159 +1,64 @@
|
|
1
|
+
require 'will_paginate/view_helpers/action_view'
|
2
|
+
|
1
3
|
module Binco
|
2
|
-
class PaginationRenderer <
|
3
|
-
|
4
|
-
# that conforms to that API
|
5
|
-
# * +options+ are forwarded from +will_paginate+ view helper
|
6
|
-
# * +template+ is the reference to the template being rendered
|
7
|
-
def prepare(collection, options, template)
|
8
|
-
super(collection, options)
|
9
|
-
@template = template
|
10
|
-
@container_attributes = @base_url_params = nil
|
11
|
-
end
|
4
|
+
class PaginationRenderer < WillPaginate::ActionView::LinkRenderer
|
5
|
+
ELLIPSIS = '…'
|
12
6
|
|
13
|
-
# Process it! This method returns the complete HTML string which contains
|
14
|
-
# pagination links. Feel free to subclass LinkRenderer and change this
|
15
|
-
# method as you see fit.
|
16
7
|
def to_html
|
17
|
-
|
18
|
-
item
|
19
|
-
|
20
|
-
|
8
|
+
list_items = pagination.map do |item|
|
9
|
+
case item
|
10
|
+
when Fixnum
|
11
|
+
page_number(item)
|
12
|
+
else
|
13
|
+
send(item)
|
14
|
+
end
|
21
15
|
end.join(@options[:link_separator])
|
22
16
|
|
23
|
-
|
17
|
+
list_wrapper = tag :ul, list_items, class: 'pagination', role: 'group'
|
18
|
+
tag :nav, list_wrapper, class: @options[:class]
|
24
19
|
end
|
25
20
|
|
26
|
-
# Returns the subset of +options+ this instance was initialized with that
|
27
|
-
# represent HTML attributes for the container element of pagination links.
|
28
21
|
def container_attributes
|
29
|
-
|
22
|
+
super.except(*[:link_options])
|
30
23
|
end
|
31
24
|
|
32
|
-
|
25
|
+
protected
|
33
26
|
|
34
27
|
def page_number(page)
|
35
|
-
|
36
|
-
tag(:li, link(page, page, rel: rel_value(page)))
|
37
|
-
else
|
38
|
-
tag(:li, link(page, '#'), class: 'active')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def gap
|
43
|
-
text = @template.will_paginate_translate(:page_gap) { '…' }
|
44
|
-
%(<li><a>#{text}</a></li>)
|
45
|
-
end
|
46
|
-
|
47
|
-
def previous_page
|
48
|
-
num = @collection.current_page > 1 && @collection.current_page - 1
|
49
|
-
previous_or_next_page(num, @options[:previous_label], 'previous_page')
|
50
|
-
end
|
28
|
+
link_options = @options[:link_options] || {}
|
51
29
|
|
52
|
-
|
53
|
-
|
54
|
-
previous_or_next_page(num, @options[:next_label], 'next_page')
|
55
|
-
end
|
56
|
-
|
57
|
-
def previous_or_next_page(page, text, classname)
|
58
|
-
if page
|
59
|
-
tag(:li, link(text, page, class: classname))
|
30
|
+
if page == current_page
|
31
|
+
tag :li, tag(:span, page, class: 'page-link'), class: 'page-item active'
|
60
32
|
else
|
61
|
-
|
33
|
+
link_options.merge! class: 'page-link', rel: rel_value(page)
|
34
|
+
tag :li, link(page, page, link_options), class: 'page-item'
|
62
35
|
end
|
63
36
|
end
|
64
37
|
|
65
|
-
def
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns URL params for +page_link_or_span+, taking the current GET params
|
70
|
-
# and <tt>:params</tt> option into account.
|
71
|
-
def default_url_params
|
72
|
-
{}
|
73
|
-
end
|
74
|
-
|
75
|
-
def url(page)
|
76
|
-
@base_url_params ||= begin
|
77
|
-
url_params = merge_get_params(default_url_params)
|
78
|
-
url_params[:only_path] = true
|
79
|
-
merge_optional_params(url_params)
|
80
|
-
end
|
81
|
-
|
82
|
-
url_params = @base_url_params.dup
|
83
|
-
add_current_page_param(url_params, page)
|
84
|
-
|
85
|
-
@template.url_for(url_params)
|
86
|
-
end
|
87
|
-
|
88
|
-
def merge_optional_params(url_params)
|
89
|
-
symbolized_update(url_params, @options[:params]) if @options[:params]
|
90
|
-
url_params
|
91
|
-
end
|
92
|
-
|
93
|
-
def merge_get_params(url_params)
|
94
|
-
if @template.respond_to? :request and @template.request and @template.request.get?
|
95
|
-
symbolized_update(url_params, @template.params)
|
96
|
-
end
|
97
|
-
url_params
|
98
|
-
end
|
38
|
+
def previous_or_next_page(page, text, classname)
|
39
|
+
link_options = @options[:link_options] || {}
|
99
40
|
|
100
|
-
|
101
|
-
|
102
|
-
|
41
|
+
if page
|
42
|
+
link_wrapper = link(text, page, link_options.merge(class: 'page-link'))
|
43
|
+
tag :li, link_wrapper, class: '%s page-item' % classname
|
103
44
|
else
|
104
|
-
|
105
|
-
|
45
|
+
span_wrapper = tag(:span, text, class: 'page-link')
|
46
|
+
tag :li, span_wrapper, class: '%s page-item disabled' % classname
|
106
47
|
end
|
107
48
|
end
|
108
49
|
|
109
|
-
|
110
|
-
|
111
|
-
def parse_query_parameters(params)
|
112
|
-
Rack::Utils.parse_nested_query(params)
|
113
|
-
end
|
114
|
-
|
115
|
-
def param_name
|
116
|
-
@options[:param_name].to_s
|
117
|
-
end
|
118
|
-
|
119
|
-
def link(text, target, attributes = {})
|
120
|
-
if target.is_a? Fixnum
|
121
|
-
attributes[:rel] = rel_value(target)
|
122
|
-
target = url(target)
|
123
|
-
end
|
124
|
-
attributes[:href] = target
|
125
|
-
tag(:a, text, attributes)
|
126
|
-
end
|
127
|
-
|
128
|
-
def tag(name, value, attributes = {})
|
129
|
-
string_attributes = attributes.inject('') do |attrs, pair|
|
130
|
-
unless pair.last.nil?
|
131
|
-
attrs << %( #{pair.first}="#{CGI::escapeHTML(pair.last.to_s)}")
|
132
|
-
end
|
133
|
-
attrs
|
134
|
-
end
|
135
|
-
"<#{name}#{string_attributes}>#{value}</#{name}>"
|
50
|
+
def gap
|
51
|
+
tag :li, tag(:i, ELLIPSIS, class: 'page-link'), class: 'page-item disabled'
|
136
52
|
end
|
137
53
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
141
|
-
when @collection.current_page + 1; 'next'
|
142
|
-
when 1; 'start'
|
143
|
-
end
|
54
|
+
def previous_page
|
55
|
+
num = @collection.current_page > 1 && @collection.current_page - 1
|
56
|
+
previous_or_next_page num, @options[:previous_label], 'previous'
|
144
57
|
end
|
145
58
|
|
146
|
-
def
|
147
|
-
|
148
|
-
|
149
|
-
existing = target[key]
|
150
|
-
|
151
|
-
if value.is_a?(Hash) and (existing.is_a?(Hash) or existing.nil?)
|
152
|
-
symbolized_update(existing || (target[key] = {}), value)
|
153
|
-
else
|
154
|
-
target[key] = value
|
155
|
-
end
|
156
|
-
end
|
59
|
+
def next_page
|
60
|
+
num = @collection.current_page < @collection.total_pages && @collection.current_page + 1
|
61
|
+
previous_or_next_page num, @options[:next_label], 'next'
|
157
62
|
end
|
158
63
|
end
|
159
64
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<ol class="breadcrumb">
|
2
2
|
<% breadcrumb.each do |route| %>
|
3
|
-
<li class="<%= 'active' if breadcrumb.last == route %>">
|
3
|
+
<li class="<%= 'active' if breadcrumb.last == route %> breadcrumb-item">
|
4
4
|
<% if route[:url] %>
|
5
5
|
<%= link_to route[:title], route[:url] %>
|
6
6
|
<% else %>
|
data/lib/binco/engine.rb
CHANGED
data/lib/binco/version.rb
CHANGED
@@ -13,7 +13,7 @@ module Binco
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def create_overrides
|
16
|
-
copy_file '
|
16
|
+
copy_file '_bootstrap_variables.scss', 'app/assets/stylesheets/_bootstrap_variables.scss'
|
17
17
|
end
|
18
18
|
|
19
19
|
def add_javascripts
|