stay 0.1.3.5 → 0.1.4.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.
- data/README.md +53 -20
- data/Rakefile +1 -1
- data/lib/assets/javascripts/stay.js +165 -130
- data/stay.gemspec +2 -2
- metadata +6 -6
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Installation **stay** is simple. In Rails > 3.0 just add **stay** in your Gemfil
|
|
10
10
|
gem "tinymce-rails"
|
11
11
|
gem "stay"
|
12
12
|
```
|
13
|
-
|
13
|
+
|
14
14
|
Then include the following Javascript include into your assets/javascript.js.
|
15
15
|
|
16
16
|
```ruby
|
@@ -18,7 +18,7 @@ Then include the following Javascript include into your assets/javascript.js.
|
|
18
18
|
//= require tinymce-jquery
|
19
19
|
//= require stay
|
20
20
|
```
|
21
|
-
|
21
|
+
|
22
22
|
Then add javascript calling in your Javascript file
|
23
23
|
|
24
24
|
```javascript
|
@@ -29,14 +29,38 @@ Then add javascript calling in your Javascript file
|
|
29
29
|
|
30
30
|
or if you're using CoffeScript use
|
31
31
|
|
32
|
-
```
|
32
|
+
```
|
33
33
|
jQuery ->
|
34
34
|
jQuery(".stay").stay()
|
35
35
|
```
|
36
|
-
|
36
|
+
|
37
|
+
### Javascript Callback
|
38
|
+
**Stay** also accept callback arguments, currently **Stay** only have 3 callback attributes
|
39
|
+
- beforeSend
|
40
|
+
- onError
|
41
|
+
- onSuccess
|
42
|
+
|
43
|
+
Below is the examples how to implement **Stay** with callbacks, call this javascript when initalize **Stay**
|
44
|
+
|
45
|
+
```javascript
|
46
|
+
jQuery(".stay").stay({
|
47
|
+
beforeSend: function() {
|
48
|
+
// Do whatever you want before data is being sent to server, e.g. display the loading bar
|
49
|
+
},
|
50
|
+
onError: function(errs) {
|
51
|
+
// This method takes one argument contains array of errors similar with Obj.errors in Rails
|
52
|
+
return $.each(errs, function(key) {
|
53
|
+
return alert(key + " " + errs[key]);
|
54
|
+
});
|
55
|
+
},
|
56
|
+
onSuccess: function() {
|
57
|
+
// Do whatever you want when server said OK, e.g. hide the loading bar
|
58
|
+
}
|
59
|
+
});
|
60
|
+
```
|
37
61
|
## Usage
|
38
62
|
|
39
|
-
###
|
63
|
+
### In your View
|
40
64
|
|
41
65
|
```
|
42
66
|
stay object, field, OPTIONS{}
|
@@ -49,7 +73,7 @@ Example:
|
|
49
73
|
```ruby
|
50
74
|
stay @user, :name, type: :text_field
|
51
75
|
```
|
52
|
-
|
76
|
+
|
53
77
|
As default **type** will take :text_field, *for now* you can only pass :text_field, :text_area, :tiny_mce
|
54
78
|
|
55
79
|
**Stay** support sub-resources routes, therefore you can pass array into **object** param
|
@@ -59,7 +83,7 @@ Example:
|
|
59
83
|
```ruby
|
60
84
|
stay [@user, @article], :title, type: :text_area
|
61
85
|
```
|
62
|
-
|
86
|
+
|
63
87
|
You can use TinyMCE as text editor, just pass :tiny_mce to **type**
|
64
88
|
|
65
89
|
Example:
|
@@ -67,19 +91,19 @@ Example:
|
|
67
91
|
```ruby
|
68
92
|
stay [@user, @article], :body, type: :tiny_mce
|
69
93
|
```
|
70
|
-
|
94
|
+
|
71
95
|
This will use TinyMCE editor with "simple" theme, you can also change this theme by using
|
72
96
|
|
73
97
|
```ruby
|
74
98
|
stay [@user, @article], :body, type: [:tiny_mce, "advanced"]
|
75
|
-
```
|
99
|
+
```
|
76
100
|
Now you can pass width and height of tinyMCE using CSS string format
|
77
101
|
|
78
102
|
Example
|
79
103
|
|
80
104
|
```ruby
|
81
105
|
stay [@user, @article], :body, type: [:tiny_mce, "advanced", "100%", "200px"]
|
82
|
-
```
|
106
|
+
```
|
83
107
|
|
84
108
|
Remember to put width and height respectively
|
85
109
|
|
@@ -93,7 +117,7 @@ Example:
|
|
93
117
|
```ruby
|
94
118
|
stay [@user, @article], :body, type: [:tiny_mce, "advanced"], activator: "#id_of_activator"
|
95
119
|
```
|
96
|
-
|
120
|
+
|
97
121
|
To use external submit button, just passed **submitter:** followed by id of HTML element id.
|
98
122
|
Note that this external submit button will be hidden by **Stay** and will be visible once **Stay** editor is visible (stay triggered).
|
99
123
|
|
@@ -108,7 +132,7 @@ Due to **Stay** default submit event is triggered by blur **Stay** will raise Ar
|
|
108
132
|
```ruby
|
109
133
|
stay [@user, @article], :body, type: [:tiny_mce, "advanced"], activator: "#id_of_activator", submitter: "#id_of_submit_button", canceller: "#id_of_cancel_button"
|
110
134
|
```
|
111
|
-
|
135
|
+
|
112
136
|
Example of complete use:
|
113
137
|
|
114
138
|
```ruby
|
@@ -117,10 +141,10 @@ Example of complete use:
|
|
117
141
|
<%= link_to "Click me to submit", "#", id: "submit_here" #this will be hide by Stay %>
|
118
142
|
```
|
119
143
|
|
120
|
-
###
|
144
|
+
### In your Controller
|
121
145
|
|
122
146
|
stay_response object
|
123
|
-
|
147
|
+
|
124
148
|
Example of complete use:
|
125
149
|
|
126
150
|
```ruby
|
@@ -137,10 +161,19 @@ Example of complete use:
|
|
137
161
|
end
|
138
162
|
```
|
139
163
|
|
140
|
-
|
141
|
-
|
164
|
+
## Changelog
|
165
|
+
Just some good releases changelog:
|
142
166
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
167
|
+
**v0.1.4.0**
|
168
|
+
- Complete rewrite Javascript, made it modular
|
169
|
+
- Add ability to initialize Stay with callback
|
170
|
+
|
171
|
+
**v0.1.3.5**
|
172
|
+
- Add Canceller
|
173
|
+
- Hide Submitter and Canceller until Stay is activated
|
174
|
+
|
175
|
+
**v0.1.3.4.4**
|
176
|
+
- Add error callback to the JSON
|
177
|
+
|
178
|
+
**v0.1.0.0**
|
179
|
+
- Initial release, February 4th 2012
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('stay', '0.1.
|
5
|
+
Echoe.new('stay', '0.1.4.0') do |p|
|
6
6
|
p.description = "Form ajax helper with tinymce support"
|
7
7
|
p.summary = "Helper for building ajax form, inspired by best_in_place, with some modifications, support tinymce as editor"
|
8
8
|
p.url = "http://github.com/tejanium/stay"
|
@@ -1,140 +1,175 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
var Stay, isset;
|
2
|
+
jQuery.fn.stay = function(args) {
|
3
|
+
return this.each(function() {
|
4
|
+
return new Stay(this, args);
|
4
5
|
});
|
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
|
-
if(
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
this.stayTinyMCE.tinymce({
|
46
|
-
theme: self.tinyMCETheme,
|
47
|
-
setup : function(ed) {
|
48
|
-
ed.onInit.add(function(ed, evt) {
|
49
|
-
var dom = ed.dom;
|
50
|
-
var doc = tinymce.isGecko ? ed.getDoc() : ed.getWin();
|
51
|
-
if(typeof self.submitter_id === "undefined"){
|
52
|
-
tinymce.dom.Event.add(doc, 'blur', function(e) {
|
53
|
-
self.stayFormForm.submit();
|
54
|
-
});
|
55
|
-
}else{
|
56
|
-
self.submitter.click(function(){
|
57
|
-
self.stayFormForm.submit();
|
58
|
-
});
|
59
|
-
}
|
60
|
-
if(typeof self.canceller_id === "undefined"){
|
61
|
-
tinymce.dom.Event.add(doc, 'keydown', function(e) {
|
62
|
-
if (e.keyCode == 27) {
|
63
|
-
self.reShowObject();
|
64
|
-
}
|
65
|
-
});
|
66
|
-
}else{
|
67
|
-
jQuery(self.canceller_id).click(function(){
|
68
|
-
self.reShowObject();
|
69
|
-
});
|
70
|
-
}
|
71
|
-
});
|
72
|
-
}
|
73
|
-
});
|
6
|
+
};
|
7
|
+
jQuery.fn.disable = function() {
|
8
|
+
return this.attr("disabled", "disabled");
|
9
|
+
};
|
10
|
+
jQuery.fn.enable = function() {
|
11
|
+
return this.removeAttr("disabled");
|
12
|
+
};
|
13
|
+
isset = function(o) {
|
14
|
+
return typeof o !== "undefined";
|
15
|
+
};
|
16
|
+
Stay = (function() {
|
17
|
+
function Stay(e, args) {
|
18
|
+
var activator, canceller, submitter;
|
19
|
+
this.hooks = args || {};
|
20
|
+
this.stayWrapper = jQuery(e);
|
21
|
+
this.stayObjectContainer = this.stayWrapper.find(".stay-object");
|
22
|
+
this.stayFormContainer = this.stayWrapper.find(".stay-form");
|
23
|
+
this.stayActualForm = this.stayFormContainer.find("form");
|
24
|
+
this.stayFormInput = this.stayActualForm.find(".stay-input");
|
25
|
+
this.usingTinyMCE = this.stayFormInput.hasClass("stay-tiny-mce");
|
26
|
+
activator = this.stayWrapper.data("activator");
|
27
|
+
this.usingActivator = isset(activator);
|
28
|
+
this.activator = (this.usingActivator ? jQuery(activator) : this.stayObjectContainer);
|
29
|
+
submitter = this.stayWrapper.data("submitter");
|
30
|
+
if (this.usingSubmitter = isset(submitter)) {
|
31
|
+
this.submitter = jQuery(submitter);
|
32
|
+
this.submitter.hide();
|
33
|
+
} else {
|
34
|
+
this.submitter = this.stayFormInput;
|
35
|
+
}
|
36
|
+
canceller = this.stayWrapper.data("canceller");
|
37
|
+
if (this.usingCanceller = isset(canceller)) {
|
38
|
+
this.canceller = jQuery(canceller);
|
39
|
+
this.canceller.hide();
|
40
|
+
}
|
41
|
+
this.bindActivator();
|
42
|
+
if (this.usingTinyMCE) {
|
43
|
+
this.initTinyMCE();
|
44
|
+
} else {
|
45
|
+
this.initDefault();
|
74
46
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
47
|
+
this.bindCallback();
|
48
|
+
}
|
49
|
+
Stay.prototype.initTinyMCE = function() {
|
50
|
+
var stay;
|
51
|
+
stay = this;
|
52
|
+
return stay.stayFormInput.tinymce({
|
53
|
+
theme: stay.stayWrapper.data("tinymce-theme") || "simple",
|
54
|
+
setup: function(ed) {
|
55
|
+
return ed.onInit.add(function(ed, ev) {
|
56
|
+
var doc;
|
57
|
+
doc = (tinymce.isGecko ? ed.getDoc() : ed.getWin());
|
58
|
+
stay.bindSubmitter(doc);
|
59
|
+
return stay.bindCanceller(doc);
|
60
|
+
});
|
61
|
+
}
|
62
|
+
});
|
63
|
+
};
|
64
|
+
Stay.prototype.initDefault = function() {
|
65
|
+
this.bindSubmitter();
|
66
|
+
return this.bindCanceller();
|
67
|
+
};
|
68
|
+
Stay.prototype.bindActivator = function() {
|
69
|
+
var stay;
|
70
|
+
stay = this;
|
71
|
+
return stay.activator.click(function() {
|
72
|
+
stay.hideObject();
|
73
|
+
if (stay.usingTinyMCE) {
|
74
|
+
return stay.stayFormInput.tinymce().focus();
|
75
|
+
} else {
|
76
|
+
return stay.stayFormInput.focus();
|
92
77
|
}
|
93
78
|
});
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
79
|
+
};
|
80
|
+
Stay.prototype.bindSubmitter = function(doc) {
|
81
|
+
var stay;
|
82
|
+
stay = this;
|
83
|
+
if (stay.usingSubmitter) {
|
84
|
+
return stay.submitter.click(function() {
|
85
|
+
return stay.submitEvent();
|
100
86
|
});
|
101
|
-
|
102
|
-
if(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
jQuery(self.canceller_id).click(function(){
|
110
|
-
self.reShowObject();
|
87
|
+
} else {
|
88
|
+
if (isset(doc)) {
|
89
|
+
return tinymce.dom.Event.add(doc, "blur", function(e) {
|
90
|
+
return stay.submitEvent();
|
91
|
+
});
|
92
|
+
} else {
|
93
|
+
return stay.submitter.blur(function() {
|
94
|
+
return stay.submitEvent();
|
111
95
|
});
|
112
96
|
}
|
113
97
|
}
|
114
|
-
}
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
98
|
+
};
|
99
|
+
Stay.prototype.bindCanceller = function(doc) {
|
100
|
+
var stay;
|
101
|
+
stay = this;
|
102
|
+
if (stay.usingCanceller) {
|
103
|
+
return stay.canceller.click(function() {
|
104
|
+
return stay.showObject();
|
105
|
+
});
|
106
|
+
} else {
|
107
|
+
if (isset(doc)) {
|
108
|
+
return tinymce.dom.Event.add(doc, "keydown", function(e) {
|
109
|
+
return stay.cancelEvent(e);
|
110
|
+
});
|
111
|
+
} else {
|
112
|
+
return stay.stayFormInput.keydown(function(e) {
|
113
|
+
return stay.cancelEvent(e);
|
114
|
+
});
|
115
|
+
}
|
116
|
+
}
|
117
|
+
};
|
118
|
+
Stay.prototype.bindCallback = function() {
|
119
|
+
var stay;
|
120
|
+
stay = this;
|
121
|
+
stay.stayActualForm.bind("ajax:success", function(e, data) {
|
122
|
+
stay.processCallback(data);
|
123
|
+
if (isset(stay.hooks.onSuccess)) {
|
124
|
+
return stay.hooks.onSuccess();
|
125
|
+
}
|
123
126
|
});
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
127
|
+
return stay.stayActualForm.bind("ajax:error", function(e, data) {
|
128
|
+
var cb;
|
129
|
+
cb = jQuery.parseJSON(data.responseText);
|
130
|
+
stay.processCallback(cb);
|
131
|
+
if (isset(stay.hooks.onError)) {
|
132
|
+
return stay.hooks.onError(cb.errors);
|
133
|
+
}
|
130
134
|
});
|
131
|
-
}
|
132
|
-
|
133
|
-
|
134
|
-
this.
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
this.
|
139
|
-
|
140
|
-
|
135
|
+
};
|
136
|
+
Stay.prototype.processCallback = function(cb) {
|
137
|
+
this.stayFormInput.val(cb.input || "");
|
138
|
+
this.stayObjectContainer.html(cb.display || "");
|
139
|
+
return this.showObject();
|
140
|
+
};
|
141
|
+
Stay.prototype.hideObject = function() {
|
142
|
+
this.stayFormContainer.show();
|
143
|
+
if (this.usingSubmitter) {
|
144
|
+
this.submitter.show();
|
145
|
+
}
|
146
|
+
if (this.usingCanceller) {
|
147
|
+
this.canceller.show();
|
148
|
+
}
|
149
|
+
return this.stayObjectContainer.hide();
|
150
|
+
};
|
151
|
+
Stay.prototype.showObject = function() {
|
152
|
+
this.stayFormContainer.hide();
|
153
|
+
if (this.usingSubmitter) {
|
154
|
+
this.submitter.hide();
|
155
|
+
}
|
156
|
+
if (this.usingCanceller) {
|
157
|
+
this.canceller.hide();
|
158
|
+
}
|
159
|
+
this.stayObjectContainer.show();
|
160
|
+
return this.stayFormInput.enable();
|
161
|
+
};
|
162
|
+
Stay.prototype.cancelEvent = function(e) {
|
163
|
+
if (e.keyCode === 27) {
|
164
|
+
return this.showObject();
|
165
|
+
}
|
166
|
+
};
|
167
|
+
Stay.prototype.submitEvent = function(e) {
|
168
|
+
if (isset(this.hooks.beforeSend)) {
|
169
|
+
this.hooks.beforeSend();
|
170
|
+
}
|
171
|
+
this.stayActualForm.submit();
|
172
|
+
return this.stayFormInput.disable();
|
173
|
+
};
|
174
|
+
return Stay;
|
175
|
+
})();
|
data/stay.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "stay"
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.4.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Teja Sophista"]
|
9
|
-
s.date = "2012-03-
|
9
|
+
s.date = "2012-03-10"
|
10
10
|
s.description = "Form ajax helper with tinymce support"
|
11
11
|
s.email = "tejanium@yahoo.com"
|
12
12
|
s.extra_rdoc_files = ["README.md", "README.rdoc", "lib/assets/javascripts/stay.js", "lib/stay.rb", "lib/stay/controller_extensions.rb", "lib/stay/engine.rb", "lib/stay/helper.rb", "lib/stay/string_extensions.rb"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-10 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jquery-rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &16640280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16640280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: tinymce-rails
|
27
|
-
requirement: &
|
27
|
+
requirement: &16639820 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16639820
|
36
36
|
description: Form ajax helper with tinymce support
|
37
37
|
email: tejanium@yahoo.com
|
38
38
|
executables: []
|