recurring_select 3.0.0 → 4.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -19
- data/Rakefile +1 -1
- 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 +10 -8
- data/lib/recurring_select/engine.rb +1 -0
- data/lib/recurring_select/version.rb +1 -1
- data/lib/recurring_select.rb +1 -1
- metadata +18 -43
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31e198de02d94e75927a32460fe0a56601c1da1f52b9df05d878ea7c2857d637
|
4
|
+
data.tar.gz: 351c9d4727459ffb8e5c58eb523a08123ca49b51de8d63fe1e66c13e85d04d87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ba0419fbb294618ab4846ed4ce767c057e1574201852b8e61923bcf9889c493cd078db6ab08ea413bb117d92c525c05f39f35d8fe8c1978d8e7104673acda44
|
7
|
+
data.tar.gz: '093da6c4eaf8a91da28dce5ce12878670cd3455d2098e5b7ad50c8641dbf69936bd33cc7c0b47386220489ab3350f0ef66b3e30457e3bdbe86cd5722bd65253e'
|
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# Recurring Select
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/
|
3
|
+
[![Build Status](https://travis-ci.org/gregschmit/recurring_select.svg?branch=master)](https://travis-ci.org/GetJobber/recurring_select) [![Code Climate](https://codeclimate.com/github/gregschmit/recurring_select.png)](https://codeclimate.com/github/gregschmit/recurring_select)
|
4
4
|
|
5
5
|
This gem adds selectors and helpers for working with recurring schedules in a Rails app. It uses [ice_cube](https://github.com/seejohnrun/ice_cube) recurring scheduling gem.
|
6
6
|
|
7
7
|
Created by the [Jobber](http://getjobber.com) team for Jobber, the leading business management tool for field service companies.
|
8
8
|
|
9
|
-
Check out the [live demo](http://recurring-select-demo.herokuapp.com/) (code in [spec/dummy](https://github.com/GetJobber/recurring_select/tree/master/spec/dummy) folder)
|
9
|
+
Check out the [live demo](http://recurring-select-demo.herokuapp.com/) (code in [spec/dummy](https://github.com/GetJobber/recurring_select/tree/master/spec/dummy) folder).
|
10
10
|
|
11
11
|
|
12
12
|
## Usage
|
@@ -26,6 +26,7 @@ gem 'recurring_select'
|
|
26
26
|
- application.css: `//= require recurring_select`
|
27
27
|
|
28
28
|
#### jQuery Mobile Interface:
|
29
|
+
- application.js: `//= require jquery`
|
29
30
|
- application.js: `//= require jquery-mobile-rs`
|
30
31
|
- application.css: `//= require jquery-mobile-rs`
|
31
32
|
|
@@ -99,8 +100,8 @@ You have to translate JavaScript texts too by including the locale file in your
|
|
99
100
|
|
100
101
|
For other languages include a JavaScript file like this:
|
101
102
|
|
102
|
-
```
|
103
|
-
|
103
|
+
```js
|
104
|
+
RecurringSelectDialog.config.texts = {
|
104
105
|
locale_iso_code: "fr"
|
105
106
|
repeat: "Repeat"
|
106
107
|
frequency: "Frequency"
|
@@ -125,8 +126,8 @@ $.fn.recurring_select.texts = {
|
|
125
126
|
|
126
127
|
Options include:
|
127
128
|
|
128
|
-
```
|
129
|
-
|
129
|
+
```js
|
130
|
+
RecurringSelectDialog.config.options = {
|
130
131
|
monthly: {
|
131
132
|
show_week: [true, true, true, true, false, false] //display week 1, 2 .... Last
|
132
133
|
}
|
@@ -135,31 +136,21 @@ $.fn.recurring_select.options = {
|
|
135
136
|
|
136
137
|
## Testing and Development
|
137
138
|
|
138
|
-
The dummy app uses a [Postgres](http://postgresapp.com/) database `recurring_select_development`. To get setup:
|
139
|
-
|
140
|
-
```console
|
141
|
-
bundle
|
142
|
-
rake db:create
|
143
|
-
```
|
144
|
-
|
145
139
|
Start the dummy server for clicking around the interface:
|
146
140
|
|
147
141
|
```console
|
148
142
|
rails s
|
149
143
|
```
|
150
144
|
|
151
|
-
Use [Guard](https://github.com/guard/guard) and RSpec for all tests. I'd
|
152
|
-
love to get Jasmine running also, but haven't had time yet.
|
153
|
-
|
154
145
|
Tests can be ran against different versions of Rails like so:
|
155
146
|
|
156
147
|
```
|
157
|
-
BUNDLE_GEMFILE=spec/gemfiles/
|
158
|
-
BUNDLE_GEMFILE=spec/gemfiles/
|
148
|
+
BUNDLE_GEMFILE=spec/gemfiles/rails-7 bundle install
|
149
|
+
BUNDLE_GEMFILE=spec/gemfiles/rails-7 bundle exec rspec spec
|
159
150
|
```
|
160
151
|
|
161
152
|
Feel free to open issues or send pull requests.
|
162
153
|
|
163
154
|
## Licensing
|
164
155
|
|
165
|
-
This project rocks and uses MIT
|
156
|
+
This project rocks and uses the MIT license.
|
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ Bundler::GemHelper.install_tasks
|
|
12
12
|
require 'rdoc/task'
|
13
13
|
RDoc::Task.new(:rdoc) do |rdoc|
|
14
14
|
rdoc.rdoc_dir = 'rdoc'
|
15
|
-
rdoc.title
|
15
|
+
rdoc.title = 'RecurringSelect'
|
16
16
|
rdoc.options << '--line-numbers'
|
17
17
|
rdoc.rdoc_files.include('README.rdoc')
|
18
18
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
@@ -0,0 +1,31 @@
|
|
1
|
+
const defaultConfig = {
|
2
|
+
options: {
|
3
|
+
monthly: {
|
4
|
+
show_week: [true, true, true, true, false, false]
|
5
|
+
}
|
6
|
+
},
|
7
|
+
texts: {
|
8
|
+
locale_iso_code: "en",
|
9
|
+
repeat: "Repeat",
|
10
|
+
last_day: "Last Day",
|
11
|
+
frequency: "Frequency",
|
12
|
+
daily: "Daily",
|
13
|
+
weekly: "Weekly",
|
14
|
+
monthly: "Monthly",
|
15
|
+
yearly: "Yearly",
|
16
|
+
every: "Every",
|
17
|
+
days: "day(s)",
|
18
|
+
weeks_on: "week(s) on",
|
19
|
+
months: "month(s)",
|
20
|
+
years: "year(s)",
|
21
|
+
day_of_month: "Day of month",
|
22
|
+
day_of_week: "Day of week",
|
23
|
+
cancel: "Cancel",
|
24
|
+
ok: "OK",
|
25
|
+
summary: "Summary",
|
26
|
+
first_day_of_week: 0,
|
27
|
+
days_first_letter: ["S", "M", "T", "W", "T", "F", "S" ],
|
28
|
+
order: ["1st", "2nd", "3rd", "4th", "5th", "Last"],
|
29
|
+
show_week: [true, true, true, true, false, false]
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
//= require recurring_select
|
2
|
+
//= require_self
|
3
|
+
|
4
|
+
const $ = jQuery
|
5
|
+
|
6
|
+
$(function() {
|
7
|
+
$(document).on("recurring_select:cancel recurring_select:save", ".recurring_select", function() {
|
8
|
+
$(this).selectmenu('refresh');
|
9
|
+
});
|
10
|
+
|
11
|
+
$(document).on("recurring_select:dialog_opened", ".rs_dialog_holder", function() {
|
12
|
+
$(this).find("select").attr("data-theme", $('.recurring_select').data("theme")).attr("data-mini", true).selectmenu();
|
13
|
+
$(this).find("input[type=text]").textinput();
|
14
|
+
|
15
|
+
$(this).on("recurring_select:dialog_positioned", ".rs_dialog", function() {
|
16
|
+
$(this).css({
|
17
|
+
"top" : $(window).scrollTop()+"px"});
|
18
|
+
});
|
19
|
+
});
|
20
|
+
});
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
RecurringSelectDialog.config.texts = {
|
2
2
|
locale_iso_code: "fr"
|
3
3
|
repeat: "Récurrence"
|
4
4
|
last_day: "Dernier jour"
|
@@ -21,4 +21,4 @@ $.fn.recurring_select.texts = {
|
|
21
21
|
days_first_letter: ["D", "L", "M", "M", "J", "V", "S" ]
|
22
22
|
order: ["1er", "2ème", "3ème", "4ème", "5ème", "Dernier"]
|
23
23
|
show_week: [true, true, true, true, false, false]
|
24
|
-
}
|
24
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
//= require recurring_select_dialog
|
2
|
+
//= require_self
|
3
|
+
|
4
|
+
document.addEventListener("DOMContentLoaded", () => {
|
5
|
+
document.addEventListener("focusin", (e) => {
|
6
|
+
if (e.target.matches(".recurring_select")) {
|
7
|
+
recurring_select.call(e.target, "set_initial_values")
|
8
|
+
}
|
9
|
+
})
|
10
|
+
|
11
|
+
document.addEventListener("input", (e) => {
|
12
|
+
if (e.target.matches(".recurring_select")) {
|
13
|
+
recurring_select.call(e.target, "changed")
|
14
|
+
}
|
15
|
+
})
|
16
|
+
})
|
17
|
+
|
18
|
+
const methods = {
|
19
|
+
set_initial_values() {
|
20
|
+
const str = this.querySelectorAll('option')[this.selectedIndex].textContent
|
21
|
+
this.setAttribute('data-initial-value-hash', this.value);
|
22
|
+
this.setAttribute('data-initial-value-str', str);
|
23
|
+
},
|
24
|
+
|
25
|
+
changed() {
|
26
|
+
if (this.value == "custom") {
|
27
|
+
methods.open.call(this);
|
28
|
+
} else {
|
29
|
+
methods.set_initial_values.call(this);
|
30
|
+
}
|
31
|
+
},
|
32
|
+
|
33
|
+
open() {
|
34
|
+
this.setAttribute("data-recurring-select-active", true);
|
35
|
+
new RecurringSelectDialog(this);
|
36
|
+
this.blur();
|
37
|
+
},
|
38
|
+
|
39
|
+
save(new_rule) {
|
40
|
+
this.querySelectorAll("option[data-custom]").forEach((el) => el.parentNode.removeChild(el) )
|
41
|
+
const new_json_val = JSON.stringify(new_rule.hash)
|
42
|
+
|
43
|
+
// TODO: check for matching name, and replace that value if found
|
44
|
+
|
45
|
+
const options = Array.from(this.querySelectorAll("option")).map(() => this.value)
|
46
|
+
if (!options.includes(new_json_val)) {
|
47
|
+
methods.insert_option.apply(this, [new_rule.str, new_json_val])
|
48
|
+
}
|
49
|
+
|
50
|
+
this.value = new_json_val
|
51
|
+
methods.set_initial_values.apply(this)
|
52
|
+
this.dispatchEvent(new CustomEvent("recurring_select:save"))
|
53
|
+
},
|
54
|
+
|
55
|
+
current_rule() {
|
56
|
+
return {
|
57
|
+
str: this.getAttribute("data-initial-value-str"),
|
58
|
+
hash: JSON.parse(this.getAttribute("data-initial-value-hash"))
|
59
|
+
};
|
60
|
+
},
|
61
|
+
|
62
|
+
cancel() {
|
63
|
+
this.value = this.getAttribute("data-initial-value-hash")
|
64
|
+
this.setAttribute("data-recurring-select-active", false);
|
65
|
+
this.dispatchEvent(new CustomEvent("recurring_select:cancel"))
|
66
|
+
},
|
67
|
+
|
68
|
+
|
69
|
+
insert_option(new_rule_str, new_rule_json) {
|
70
|
+
let separator = this.querySelectorAll("option[disabled]");
|
71
|
+
if (separator.length === 0) {
|
72
|
+
separator = this.querySelectorAll("option");
|
73
|
+
}
|
74
|
+
separator = separator[separator.length-1]
|
75
|
+
|
76
|
+
const new_option = document.createElement("option")
|
77
|
+
new_option.setAttribute("data-custom", true);
|
78
|
+
|
79
|
+
if (new_rule_str.substr(new_rule_str.length - 1) !== "*") {
|
80
|
+
new_rule_str+="*";
|
81
|
+
}
|
82
|
+
|
83
|
+
new_option.textContent = new_rule_str
|
84
|
+
new_option.value = new_rule_json
|
85
|
+
separator.parentNode.insertBefore(new_option, separator)
|
86
|
+
}
|
87
|
+
};
|
88
|
+
|
89
|
+
function recurring_select(method) {
|
90
|
+
this['recurring_select'] = this['recurring_select'] || recurring_select.bind(this)
|
91
|
+
if (method in methods) {
|
92
|
+
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
|
93
|
+
} else {
|
94
|
+
throw new Error( `Method ${method} does not exist on recurring_select` );
|
95
|
+
}
|
96
|
+
}
|