recurring_select 3.0.1 → 4.0.0.rc1
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/README.md +7 -13
- data/app/assets/javascripts/defaults.js +31 -0
- data/app/assets/javascripts/jquery-mobile-rs.js +20 -0
- data/app/assets/javascripts/recurring_select/{fr.js.coffee → fr.js} +2 -2
- data/app/assets/javascripts/recurring_select.js +96 -0
- data/app/assets/javascripts/recurring_select_dialog.js.erb +447 -0
- data/app/assets/javascripts/utils.js +70 -0
- data/app/assets/stylesheets/recurring_select.scss +37 -9
- data/lib/helpers/recurring_select_helper.rb +11 -10
- data/lib/recurring_select/engine.rb +1 -0
- data/lib/recurring_select/version.rb +1 -1
- data/lib/recurring_select.rb +1 -1
- metadata +16 -42
- data/app/assets/javascripts/jquery-mobile-rs.js.coffee +0 -15
- data/app/assets/javascripts/recurring_select.js.coffee +0 -105
- data/app/assets/javascripts/recurring_select_dialog.js.coffee.erb +0 -372
@@ -0,0 +1,70 @@
|
|
1
|
+
function css(el, styles) {
|
2
|
+
for (let rule in styles) {
|
3
|
+
el.style[rule] = styles[rule]
|
4
|
+
}
|
5
|
+
}
|
6
|
+
|
7
|
+
function trigger(el, eventName) {
|
8
|
+
el.dispatchEvent(new CustomEvent(eventName))
|
9
|
+
}
|
10
|
+
|
11
|
+
function isPlainObject(obj) {
|
12
|
+
return obj && obj.toString() === "[object Object]"
|
13
|
+
}
|
14
|
+
|
15
|
+
const eventHandlerRefsExpando = '__recurring_select_events'
|
16
|
+
|
17
|
+
function on(el, events, sel, handler) {
|
18
|
+
let eventHandler = sel
|
19
|
+
if (handler) {
|
20
|
+
eventHandler = (e) => {
|
21
|
+
if (e.target.matches(sel)) {
|
22
|
+
if (handler.call(this, e) === false) {
|
23
|
+
e.preventDefault()
|
24
|
+
e.stopPropagation()
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
el[eventHandlerRefsExpando] = el[eventHandlerRefsExpando] || []
|
31
|
+
|
32
|
+
events.trim().split(/ +/).forEach(type => {
|
33
|
+
el[eventHandlerRefsExpando].push([ type, eventHandler ])
|
34
|
+
el.addEventListener(type, eventHandler)
|
35
|
+
})
|
36
|
+
}
|
37
|
+
|
38
|
+
function off(el, events) {
|
39
|
+
const types = events.trim().split(/ +/)
|
40
|
+
|
41
|
+
el[eventHandlerRefsExpando] = (el[eventHandlerRefsExpando] || [])
|
42
|
+
.filter(([t, h], i) => {
|
43
|
+
if (types.includes(t)) {
|
44
|
+
el.removeEventListener(t, h)
|
45
|
+
return false
|
46
|
+
}
|
47
|
+
return true
|
48
|
+
})
|
49
|
+
}
|
50
|
+
|
51
|
+
function serialize(params, prefix) {
|
52
|
+
const query = Object.keys(params).map((key) => {
|
53
|
+
const value = params[key];
|
54
|
+
|
55
|
+
if (params.constructor === Array)
|
56
|
+
key = `${prefix}[]`;
|
57
|
+
else if (params.constructor === Object)
|
58
|
+
key = (prefix ? `${prefix}[${key}]` : key);
|
59
|
+
|
60
|
+
if (value === null)
|
61
|
+
return `${key}=`
|
62
|
+
|
63
|
+
if (typeof value === 'object')
|
64
|
+
return serialize(value, key);
|
65
|
+
else
|
66
|
+
return `${key}=${encodeURIComponent(value)}`;
|
67
|
+
});
|
68
|
+
|
69
|
+
return [].concat.apply([], query).join('&');
|
70
|
+
}
|
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
/* -------- resets ---------------*/
|
4
4
|
|
5
|
-
.rs_dialog_holder {
|
5
|
+
.rs_dialog_holder {
|
6
|
+
font-size:14px;
|
7
|
+
color:black;
|
6
8
|
a {color:black;}
|
7
9
|
input[type=button] {
|
8
10
|
font: small/normal Arial,sans-serif;
|
@@ -28,10 +30,29 @@ select {
|
|
28
30
|
option.bold {font-weight:bold; color:red;}
|
29
31
|
}
|
30
32
|
|
31
|
-
.rs_dialog_holder {
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
.rs_dialog_holder {
|
34
|
+
display: flex;
|
35
|
+
justify-content: center;
|
36
|
+
align-items: center;
|
37
|
+
position: fixed;
|
38
|
+
left:0px;
|
39
|
+
right:0px;
|
40
|
+
top:0px;
|
41
|
+
bottom:0px;
|
42
|
+
background-color:rgba(255,255,255,0.2);
|
43
|
+
z-index:50;
|
44
|
+
|
45
|
+
.rs_dialog {
|
46
|
+
background-color:#f6f6f6;
|
47
|
+
border:1px solid #acacac;
|
48
|
+
@include shadows(1px, 3px, 8px, rgba(0,0,0,0.25));
|
49
|
+
@include rounded_corners(7px);
|
50
|
+
min-width:200px;
|
51
|
+
overflow:hidden;
|
52
|
+
|
53
|
+
.rs_dialog_content {
|
54
|
+
padding:10px;
|
55
|
+
|
35
56
|
h1 { font-size:16px; padding:0px; margin:0 0 10px 0;
|
36
57
|
a {float:right; display:inline-block; height:16px; width:16px; background-image:image-url("recurring_select/cancel.png"); background-position:center; background-repeat:no-repeat;}
|
37
58
|
}
|
@@ -42,7 +63,8 @@ select {
|
|
42
63
|
|
43
64
|
a { -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
|
44
65
|
|
45
|
-
.freq_option_section {
|
66
|
+
.freq_option_section {
|
67
|
+
display:none;
|
46
68
|
label { font-weight: bold; }
|
47
69
|
.rs_interval {width:30px; text-align:center; display: inline-block;}
|
48
70
|
|
@@ -77,7 +99,10 @@ select {
|
|
77
99
|
}
|
78
100
|
|
79
101
|
|
80
|
-
.rs_summary {
|
102
|
+
.rs_summary {
|
103
|
+
padding: 0px;
|
104
|
+
margin-top: 15px;
|
105
|
+
border-top: 1px solid #ccc;
|
81
106
|
span {font-weight:bold; border-top:1px solid #fff; display:block; padding:10px 0 5px 0;}
|
82
107
|
&.fetching {color:#999;
|
83
108
|
span {background-image:image-url("recurring_select/throbber_13x13.gif"); background-position:center; background-repeat:no-repeat; display:inline-block; height:13px; width:13px; margin-top:-4px; padding-right:5px;}
|
@@ -85,8 +110,11 @@ select {
|
|
85
110
|
label {font-weight:normal;}
|
86
111
|
}
|
87
112
|
|
88
|
-
.controls {
|
89
|
-
|
113
|
+
.controls {
|
114
|
+
padding:10px 0px 5px 0px;
|
115
|
+
min-width:170px;
|
116
|
+
text-align:center;
|
117
|
+
input[type=button] { margin:0px 5px;
|
90
118
|
&.rs_save {color:#333; }
|
91
119
|
&.rs_cancel {color:#666;}
|
92
120
|
&.disabled {color:#aaa; }
|
@@ -6,6 +6,12 @@ module RecurringSelectHelper
|
|
6
6
|
RecurringSelectTag.new(object, method, self, default_schedules, options, html_options).render
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
10
|
+
module FormTagHelper
|
11
|
+
def select_recurring_tag(name, default_schedules = nil, options = {}, html_options = {})
|
12
|
+
RecurringSelectTag.new(nil, name, self, default_schedules, options, html_options).render
|
13
|
+
end
|
14
|
+
end
|
9
15
|
|
10
16
|
module FormBuilder
|
11
17
|
def select_recurring(method, default_schedules = nil, options = {}, html_options = {})
|
@@ -65,7 +71,7 @@ module RecurringSelectHelper
|
|
65
71
|
ar = [rule.to_s, rule.to_hash.to_json]
|
66
72
|
|
67
73
|
if custom
|
68
|
-
ar[0]
|
74
|
+
ar[0] += "*"
|
69
75
|
ar << {"data-custom" => true}
|
70
76
|
end
|
71
77
|
|
@@ -90,20 +96,15 @@ module RecurringSelectHelper
|
|
90
96
|
end
|
91
97
|
end
|
92
98
|
|
93
|
-
class RecurringSelectTag < ActionView::Helpers::Tags::
|
99
|
+
class RecurringSelectTag < ActionView::Helpers::Tags::Select
|
94
100
|
include RecurringSelectHelper::FormOptionsHelper
|
95
101
|
include SelectHTMLOptions
|
96
102
|
|
97
103
|
def initialize(object, method, template_object, default_schedules = nil, options = {}, html_options = {})
|
98
104
|
@default_schedules = default_schedules
|
99
|
-
|
100
|
-
|
101
|
-
@
|
102
|
-
@html_options = recurring_select_html_options(html_options)
|
103
|
-
@template_object = template_object
|
104
|
-
add_default_name_and_id(@html_options)
|
105
|
-
|
106
|
-
super(object, method, template_object, options)
|
105
|
+
html_options = recurring_select_html_options(html_options)
|
106
|
+
|
107
|
+
super(object, method, template_object, @default_schedules, options, html_options)
|
107
108
|
end
|
108
109
|
|
109
110
|
def render
|
@@ -6,6 +6,7 @@ module RecurringSelect
|
|
6
6
|
|
7
7
|
initializer "recurring_select.extending_form_builder" do |app|
|
8
8
|
ActionView::Helpers::FormHelper.send(:include, RecurringSelectHelper::FormHelper)
|
9
|
+
ActionView::Helpers::FormTagHelper.send(:include, RecurringSelectHelper::FormTagHelper)
|
9
10
|
ActionView::Helpers::FormOptionsHelper.send(:include, RecurringSelectHelper::FormOptionsHelper)
|
10
11
|
ActionView::Helpers::FormBuilder.send(:include, RecurringSelectHelper::FormBuilder)
|
11
12
|
end
|
data/lib/recurring_select.rb
CHANGED
@@ -59,7 +59,7 @@ module RecurringSelect
|
|
59
59
|
# this is soooooo ugly
|
60
60
|
if params[:validations][:day_of_week]
|
61
61
|
params[:validations][:day_of_week] ||= {}
|
62
|
-
if params[:validations][:day_of_week].length > 0 and not params[:validations][:day_of_week].keys.first =~ /\d/
|
62
|
+
if params[:validations][:day_of_week].length > 0 and not params[:validations][:day_of_week].keys.first.to_s =~ /\d/
|
63
63
|
params[:validations][:day_of_week].symbolize_keys!
|
64
64
|
else
|
65
65
|
originals = params[:validations][:day_of_week].dup
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: recurring_select
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jobber
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2024-09-09 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
@@ -19,28 +19,14 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '6.1'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: jquery-rails
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
requirements:
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: '3.0'
|
37
|
-
type: :runtime
|
38
|
-
prerelease: false
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '3.0'
|
29
|
+
version: '6.1'
|
44
30
|
- !ruby/object:Gem::Dependency
|
45
31
|
name: ice_cube
|
46
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,28 +47,14 @@ dependencies:
|
|
61
47
|
requirements:
|
62
48
|
- - ">="
|
63
49
|
- !ruby/object:Gem::Version
|
64
|
-
version: '
|
65
|
-
type: :runtime
|
66
|
-
prerelease: false
|
67
|
-
version_requirements: !ruby/object:Gem::Requirement
|
68
|
-
requirements:
|
69
|
-
- - ">="
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: '4.0'
|
72
|
-
- !ruby/object:Gem::Dependency
|
73
|
-
name: coffee-rails
|
74
|
-
requirement: !ruby/object:Gem::Requirement
|
75
|
-
requirements:
|
76
|
-
- - ">="
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: '3.1'
|
50
|
+
version: '5.0'
|
79
51
|
type: :runtime
|
80
52
|
prerelease: false
|
81
53
|
version_requirements: !ruby/object:Gem::Requirement
|
82
54
|
requirements:
|
83
55
|
- - ">="
|
84
56
|
- !ruby/object:Gem::Version
|
85
|
-
version: '
|
57
|
+
version: '5.0'
|
86
58
|
- !ruby/object:Gem::Dependency
|
87
59
|
name: bundler
|
88
60
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,10 +124,12 @@ files:
|
|
152
124
|
- Rakefile
|
153
125
|
- app/assets/images/recurring_select/cancel.png
|
154
126
|
- app/assets/images/recurring_select/throbber_13x13.gif
|
155
|
-
- app/assets/javascripts/
|
156
|
-
- app/assets/javascripts/
|
157
|
-
- app/assets/javascripts/recurring_select
|
158
|
-
- app/assets/javascripts/
|
127
|
+
- app/assets/javascripts/defaults.js
|
128
|
+
- app/assets/javascripts/jquery-mobile-rs.js
|
129
|
+
- app/assets/javascripts/recurring_select.js
|
130
|
+
- app/assets/javascripts/recurring_select/fr.js
|
131
|
+
- app/assets/javascripts/recurring_select_dialog.js.erb
|
132
|
+
- app/assets/javascripts/utils.js
|
159
133
|
- app/assets/stylesheets/jquery-mobile-rs.scss
|
160
134
|
- app/assets/stylesheets/recurring_select.scss
|
161
135
|
- app/assets/stylesheets/utilities.scss
|
@@ -168,7 +142,7 @@ files:
|
|
168
142
|
- lib/recurring_select.rb
|
169
143
|
- lib/recurring_select/engine.rb
|
170
144
|
- lib/recurring_select/version.rb
|
171
|
-
homepage: http://github.com/
|
145
|
+
homepage: http://github.com/gregschmit/recurring_select
|
172
146
|
licenses:
|
173
147
|
- MIT
|
174
148
|
metadata: {}
|
@@ -183,11 +157,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
183
157
|
version: '0'
|
184
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
159
|
requirements:
|
186
|
-
- - "
|
160
|
+
- - ">"
|
187
161
|
- !ruby/object:Gem::Version
|
188
|
-
version:
|
162
|
+
version: 1.3.1
|
189
163
|
requirements: []
|
190
|
-
rubygems_version: 3.
|
164
|
+
rubygems_version: 3.4.10
|
191
165
|
signing_key:
|
192
166
|
specification_version: 4
|
193
167
|
summary: A select helper which gives you magical powers to generate ice_cube rules.
|
@@ -1,15 +0,0 @@
|
|
1
|
-
#= require recurring_select
|
2
|
-
#= require_self
|
3
|
-
|
4
|
-
$ ->
|
5
|
-
$(document).on "recurring_select:cancel recurring_select:save", ".recurring_select", ->
|
6
|
-
$(this).selectmenu('refresh')
|
7
|
-
|
8
|
-
$(document).on "recurring_select:dialog_opened", ".rs_dialog_holder", ->
|
9
|
-
$(this).find("select").attr("data-theme", $('.recurring_select').data("theme")).attr("data-mini", true).selectmenu()
|
10
|
-
$(this).find("input[type=text]").textinput()
|
11
|
-
|
12
|
-
$(this).on "recurring_select:dialog_positioned", ".rs_dialog", ->
|
13
|
-
$(this).css
|
14
|
-
"top" : $(window).scrollTop()+"px"
|
15
|
-
|
@@ -1,105 +0,0 @@
|
|
1
|
-
#= require recurring_select_dialog
|
2
|
-
#= require_self
|
3
|
-
|
4
|
-
$ = jQuery
|
5
|
-
$ ->
|
6
|
-
$(document).on "focus", ".recurring_select", ->
|
7
|
-
$(this).recurring_select('set_initial_values')
|
8
|
-
|
9
|
-
$(document).on "change", ".recurring_select", ->
|
10
|
-
$(this).recurring_select('changed')
|
11
|
-
|
12
|
-
methods =
|
13
|
-
set_initial_values: ->
|
14
|
-
@data 'initial-value-hash', @val()
|
15
|
-
@data 'initial-value-str', $(@find("option").get()[@.prop("selectedIndex")]).text()
|
16
|
-
|
17
|
-
changed: ->
|
18
|
-
if @val() == "custom"
|
19
|
-
methods.open_custom.apply(@)
|
20
|
-
else
|
21
|
-
methods.set_initial_values.apply(@)
|
22
|
-
|
23
|
-
open_custom: ->
|
24
|
-
@data "recurring-select-active", true
|
25
|
-
new RecurringSelectDialog(@)
|
26
|
-
@blur()
|
27
|
-
|
28
|
-
save: (new_rule) ->
|
29
|
-
@find("option[data-custom]").remove()
|
30
|
-
new_json_val = JSON.stringify(new_rule.hash)
|
31
|
-
|
32
|
-
# TODO: check for matching name, and replace that value if found
|
33
|
-
|
34
|
-
if $.inArray(new_json_val, @find("option").map -> $(@).val()) == -1
|
35
|
-
methods.insert_option.apply @, [new_rule.str, new_json_val]
|
36
|
-
|
37
|
-
@val new_json_val
|
38
|
-
methods.set_initial_values.apply @
|
39
|
-
@.trigger "recurring_select:save"
|
40
|
-
|
41
|
-
current_rule: ->
|
42
|
-
str: @data("initial-value-str")
|
43
|
-
hash: $.parseJSON(@data("initial-value-hash"))
|
44
|
-
|
45
|
-
cancel: ->
|
46
|
-
@val @data("initial-value-hash")
|
47
|
-
@data "recurring-select-active", false
|
48
|
-
@.trigger "recurring_select:cancel"
|
49
|
-
|
50
|
-
|
51
|
-
insert_option: (new_rule_str, new_rule_json) ->
|
52
|
-
separator = @find("option:disabled")
|
53
|
-
if separator.length == 0
|
54
|
-
separator = @find("option")
|
55
|
-
separator = separator.last()
|
56
|
-
|
57
|
-
new_option = $(document.createElement("option"))
|
58
|
-
new_option.attr "data-custom", true
|
59
|
-
|
60
|
-
if new_rule_str.substr(new_rule_str.length - 1) != "*"
|
61
|
-
new_rule_str+="*"
|
62
|
-
|
63
|
-
new_option.text new_rule_str
|
64
|
-
new_option.val new_rule_json
|
65
|
-
new_option.insertBefore separator
|
66
|
-
|
67
|
-
methods: ->
|
68
|
-
methods
|
69
|
-
|
70
|
-
$.fn.recurring_select = (method) ->
|
71
|
-
if method of methods
|
72
|
-
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
|
73
|
-
else
|
74
|
-
$.error( "Method #{method} does not exist on jQuery.recurring_select" );
|
75
|
-
|
76
|
-
$.fn.recurring_select.options = {
|
77
|
-
monthly: {
|
78
|
-
show_week: [true, true, true, true, false, false]
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
$.fn.recurring_select.texts = {
|
83
|
-
locale_iso_code: "en"
|
84
|
-
repeat: "Repeat"
|
85
|
-
last_day: "Last Day"
|
86
|
-
frequency: "Frequency"
|
87
|
-
daily: "Daily"
|
88
|
-
weekly: "Weekly"
|
89
|
-
monthly: "Monthly"
|
90
|
-
yearly: "Yearly"
|
91
|
-
every: "Every"
|
92
|
-
days: "day(s)"
|
93
|
-
weeks_on: "week(s) on"
|
94
|
-
months: "month(s)"
|
95
|
-
years: "year(s)"
|
96
|
-
day_of_month: "Day of month"
|
97
|
-
day_of_week: "Day of week"
|
98
|
-
cancel: "Cancel"
|
99
|
-
ok: "OK"
|
100
|
-
summary: "Summary"
|
101
|
-
first_day_of_week: 0
|
102
|
-
days_first_letter: ["S", "M", "T", "W", "T", "F", "S" ]
|
103
|
-
order: ["1st", "2nd", "3rd", "4th", "5th", "Last"]
|
104
|
-
show_week: [true, true, true, true, false, false]
|
105
|
-
}
|