on_the_spot 0.0.17 → 0.0.18
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/History.md +5 -0
- data/README.markdown +67 -1
- data/VERSION +1 -1
- data/app/assets/css/on_the_spot.css +1 -0
- data/app/assets/javascripts/on_the_spot_code.js +5 -3
- data/lib/generators/on_the_spot/install/install_generator.rb +1 -1
- data/lib/on_the_spot/controller_extension.rb +35 -7
- data/lib/on_the_spot/on_the_spot_helpers.rb +16 -18
- data/on_the_spot.gemspec +3 -2
- data/spec/on_the_spot_spec.rb +18 -1
- metadata +5 -4
data/History.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Change History / Release Notes
|
2
2
|
|
3
|
+
## Version 0.0.18 (11/12/2011)
|
4
|
+
|
5
|
+
* added support for a `:display_method` which will make working with formatted editable content much easier
|
6
|
+
* added the option to specify a function to verify the access
|
7
|
+
|
3
8
|
## Version 0.0.17 (1/11/2011)
|
4
9
|
|
5
10
|
* added support for `onblur` action: when focus is lost, allow to autosave.
|
data/README.markdown
CHANGED
@@ -4,6 +4,17 @@
|
|
4
4
|
|
5
5
|
On-the-spot is a Rails3 compliant unobtrusive javascript in-place-editing plugin, using jEditable, and depends on jQuery.
|
6
6
|
|
7
|
+
## Features
|
8
|
+
|
9
|
+
* built on proven jQuery plugin `jEditable`
|
10
|
+
* works on index-pages, nested objects, ...
|
11
|
+
* can generate simple edit-boxes, textareas, dropdown lists, checkboxes
|
12
|
+
* will check your server-side validations and show the error
|
13
|
+
* you can check the access-rights before doing any update (to check against tampering)
|
14
|
+
* you can use custom display methods, e.g when using markdown
|
15
|
+
* watch the demo-project [here]() ([source](https://github.com/nathanvda/on_the_spot_tester))
|
16
|
+
|
17
|
+
|
7
18
|
## Installation
|
8
19
|
|
9
20
|
Inside your `Gemfile` add the following:
|
@@ -26,6 +37,14 @@ Or, inside your `application.html.haml` you could still include the needed javas
|
|
26
37
|
|
27
38
|
= javascript_include_tag :on_the_spot
|
28
39
|
|
40
|
+
To use the default styling, add the following to application.css so it compiles to the asset_pipeline
|
41
|
+
|
42
|
+
//= require on_the_spot
|
43
|
+
|
44
|
+
Or, inside your `application.html.haml` you could still include the needed css, using
|
45
|
+
|
46
|
+
= stylesheet_link_tag :on_the_spot
|
47
|
+
|
29
48
|
|
30
49
|
### Rails 3.0.x
|
31
50
|
|
@@ -37,6 +56,15 @@ or using erb, you write
|
|
37
56
|
|
38
57
|
<%= javascript_include_tag :on_the_spot %>
|
39
58
|
|
59
|
+
To use the default styling, inside your `application.html.haml` you will need to add below the default CSS:
|
60
|
+
|
61
|
+
= stylesheet_link_tag :on_the_spot
|
62
|
+
|
63
|
+
or using erb, you write
|
64
|
+
|
65
|
+
<%= stylesheet_link_tag :on_the_spot %>
|
66
|
+
|
67
|
+
|
40
68
|
### Routes (for all Rails 3 versions)
|
41
69
|
|
42
70
|
Inside your `routes.rb` you need to provide the following route :
|
@@ -44,12 +72,14 @@ Inside your `routes.rb` you need to provide the following route :
|
|
44
72
|
resources :posts do
|
45
73
|
collection do
|
46
74
|
put :update_attribute_on_the_spot
|
75
|
+
get :get_attribute_on_the_spot
|
47
76
|
end
|
48
77
|
end
|
49
78
|
|
50
79
|
You need to do this for each controller that uses the on-the-spot editing.
|
51
|
-
For the moment i do not know of any better solution, but i am always open for suggestions!
|
52
80
|
|
81
|
+
You only need to specify the route for `get_attribute_on_the_spot` if you make use of the `:display_method` option,
|
82
|
+
and do not want to supply your own load-function.
|
53
83
|
|
54
84
|
That is all you need to do to start using it!
|
55
85
|
|
@@ -89,10 +119,21 @@ The `on_the_spot_edit` also accepts options:
|
|
89
119
|
* `:url`: URL to post to if you don't want to use the standard routes
|
90
120
|
* `:selected`: Text selected by default on edit (boolean, default is false)
|
91
121
|
* `:callback`: The name of a javascript function that is called after form has been submitted
|
122
|
+
* `:display_method`: the name of a method that is used to get the value to display of a field. When you use this, we will automatically
|
123
|
+
attempt to look up the raw value of the field to edit. This differs from the `:display_text` option, as this will also be called after update.
|
124
|
+
This supersedes the `:display_text` option.
|
92
125
|
|
93
126
|
|
94
127
|
For the texts: if a text is not specified, the default is taken from the `on_the_spot.en.yml` (or your current language).
|
95
128
|
|
129
|
+
## Styling
|
130
|
+
|
131
|
+
Each element that is editable will have the `on_the_spot_editing` class.
|
132
|
+
|
133
|
+
When an element is moused over, it will get the `on_the_spot_over` class.
|
134
|
+
|
135
|
+
You can use these classes to style the elements.
|
136
|
+
|
96
137
|
## Example Usages
|
97
138
|
|
98
139
|
### Edit field
|
@@ -119,6 +160,31 @@ For the texts: if a text is not specified, the default is taken from the `on_the
|
|
119
160
|
<%= on_the_spot_edit @user, :name, :callback => 'testCallback' %>
|
120
161
|
|
121
162
|
|
163
|
+
## Using together with `cancan`
|
164
|
+
|
165
|
+
When using `on_the_spot` together with `cancan`, you will have to explicitly exclude the on_the_spot method,
|
166
|
+
like so:
|
167
|
+
|
168
|
+
before_filter :load_and_authorize_resource, :except => [:update_attribute_on_the_spot]
|
169
|
+
|
170
|
+
The `load_and_authorize_resource` will try to find the object, based on the id in the parameters, but `on_the_spot` uses a different
|
171
|
+
encoding to store the object, field and id in one attribute. So if you exclude that, there will not be a problem.
|
172
|
+
|
173
|
+
|
174
|
+
## Using together with an authorization system (e.g. Cancan)
|
175
|
+
|
176
|
+
If you want to test access-rights, you can do so by specifying a method which will be called
|
177
|
+
|
178
|
+
In your controller write:
|
179
|
+
|
180
|
+
can_edit_on_the_spot :check_access
|
181
|
+
|
182
|
+
def check_access(object, field)
|
183
|
+
# verify that the current user has access to edit/see the field of given object
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
|
122
188
|
## Example project
|
123
189
|
|
124
190
|
There is an example rails3-project called [on_the_spot_tester](http://github.com/nathanvda/on_the_spot_tester)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.18
|
@@ -0,0 +1 @@
|
|
1
|
+
.on_the_spot_over { background: #EEF2A0; }
|
@@ -1,10 +1,10 @@
|
|
1
1
|
$(document).ready(function() {
|
2
2
|
|
3
3
|
$(".on_the_spot_editing").mouseover(function() {
|
4
|
-
|
4
|
+
$(this).addClass('on_the_spot_over');
|
5
5
|
});
|
6
6
|
$(".on_the_spot_editing").mouseout(function() {
|
7
|
-
|
7
|
+
$(this).removeClass('on_the_spot_over');
|
8
8
|
});
|
9
9
|
$('.on_the_spot_editing').each(initializeOnTheSpot);
|
10
10
|
|
@@ -24,6 +24,7 @@ function initializeOnTheSpot(n){
|
|
24
24
|
load_url = el.attr('data-loadurl'),
|
25
25
|
selected = el.attr('data-selected'),
|
26
26
|
onblur_action = el.attr('data-onblur') || 'cancel',
|
27
|
+
method_name = el.attr('data-display-method') || '',
|
27
28
|
callback = el.attr('data-callback');
|
28
29
|
|
29
30
|
|
@@ -42,6 +43,7 @@ function initializeOnTheSpot(n){
|
|
42
43
|
onblur: onblur_action,
|
43
44
|
submitdata: {
|
44
45
|
authenticity_token: auth_token,
|
46
|
+
display_method: method_name,
|
45
47
|
_method: 'put'
|
46
48
|
},
|
47
49
|
callback: callback ? new Function("value", "settings", "return "+callback+"(this, value, settings);") : null
|
@@ -63,5 +65,5 @@ function initializeOnTheSpot(n){
|
|
63
65
|
options.cols = columns;
|
64
66
|
}
|
65
67
|
|
66
|
-
el.editable(data_url, options)
|
68
|
+
el.editable(data_url, options);
|
67
69
|
}
|
@@ -13,7 +13,7 @@ module OnTheSpot
|
|
13
13
|
if ::Rails.version[0..2].to_f >= 3.1
|
14
14
|
#puts "The javascripts do not need to be installed since Rails 3.1"
|
15
15
|
else
|
16
|
-
copy_file "../../../../../app/assets/javascripts/
|
16
|
+
copy_file "../../../../../app/assets/javascripts/on_the_spot_code.js", "public/javascripts/on_the_spot.js"
|
17
17
|
copy_file "../../../../../app/assets/javascripts/jquery.jeditable.mini.js", "public/javascripts/jquery.jeditable.mini.js"
|
18
18
|
copy_file "../../../../../app/assets/javascripts/jquery.jeditable.checkbox.js", "public/javascripts/jquery.jeditable.checkbox.js"
|
19
19
|
end
|
@@ -8,20 +8,48 @@ module OnTheSpot
|
|
8
8
|
# if this method is called inside a controller, the edit-on-the-spot
|
9
9
|
# controller action is added that will allow to edit fields in place
|
10
10
|
module ClassMethods
|
11
|
-
def can_edit_on_the_spot
|
11
|
+
def can_edit_on_the_spot(check_acces_method=nil)
|
12
12
|
define_method :update_attribute_on_the_spot do
|
13
13
|
klass, field, id = params[:id].split('__')
|
14
14
|
select_data = params[:select_array]
|
15
|
+
display_method = params[:display_method]
|
16
|
+
|
15
17
|
object = klass.camelize.constantize.find(id)
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
|
19
|
+
is_allowed = check_acces_method.present? ? self.send(check_acces_method, object, field) : true
|
20
|
+
|
21
|
+
if is_allowed
|
22
|
+
if object.update_attributes(field => params[:value])
|
23
|
+
if select_data.nil?
|
24
|
+
field_or_method = if display_method.present?
|
25
|
+
object.send(display_method)
|
26
|
+
else
|
27
|
+
CGI::escapeHTML(object.send(field).to_s)
|
28
|
+
end
|
29
|
+
render :text => field_or_method
|
30
|
+
else
|
31
|
+
parsed_data = JSON.parse(select_data.gsub("'", '"'))
|
32
|
+
render :text => parsed_data[object.send(field).to_s]
|
33
|
+
end
|
19
34
|
else
|
20
|
-
|
21
|
-
render :text => parsed_data[object.send(field).to_s]
|
35
|
+
render :text => object.errors.full_messages.join("\n"), :status => 422
|
22
36
|
end
|
23
37
|
else
|
24
|
-
render :text =>
|
38
|
+
render :text => "Acces is not allowed", :status => 422
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
define_method :get_attribute_on_the_spot do
|
43
|
+
klass, field, id = params[:id].split('__')
|
44
|
+
|
45
|
+
object = klass.camelize.constantize.find(id)
|
46
|
+
|
47
|
+
is_allowed = check_acces_method.present? ? self.send(check_acces_method, object, field) : true
|
48
|
+
|
49
|
+
if is_allowed
|
50
|
+
render :text => object.send(field)
|
51
|
+
else
|
52
|
+
render :text => "Acces is not allowed", :status => 422
|
25
53
|
end
|
26
54
|
end
|
27
55
|
end
|
@@ -20,14 +20,6 @@ module OnTheSpot
|
|
20
20
|
# selected : (optional) boolean, text selected on edit
|
21
21
|
# callback : (optional) a javascript function that is called after form has been submitted
|
22
22
|
def on_the_spot_edit(object, field, options={})
|
23
|
-
#!!! to do: translate options to data-fields
|
24
|
-
# Possible fields:
|
25
|
-
# type: textarea or not
|
26
|
-
# button-translations ok-Text, cancel-Text
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
23
|
options.reverse_merge!(:ok_text => t('on_the_spot.ok'),
|
32
24
|
:cancel_text => t('on_the_spot.cancel'),
|
33
25
|
:tooltip => t('on_the_spot.tooltip'),
|
@@ -52,21 +44,27 @@ module OnTheSpot
|
|
52
44
|
raise OnTheSpotMissingParameters.new("Using type select needs either data or loadurl to function!") if select_data.nil?
|
53
45
|
html_options[:'data-select'] = convert_array_to_json(select_data, field_value)
|
54
46
|
elsif editable_type == :textarea
|
55
|
-
html_options[:'data-rows']
|
56
|
-
html_options[:'data-columns']
|
47
|
+
html_options[:'data-rows'] = options[:rows]
|
48
|
+
html_options[:'data-columns'] = options[:columns]
|
49
|
+
end
|
50
|
+
html_options[:'data-ok'] = options[:ok_text]
|
51
|
+
html_options[:'data-cancel'] = options[:cancel_text]
|
52
|
+
html_options[:'data-tooltip'] = options[:tooltip]
|
53
|
+
html_options[:'data-auth'] = form_authenticity_token if defined? form_authenticity_token
|
54
|
+
html_options[:'data-selected'] = options[:selected]
|
55
|
+
html_options[:'data-callback'] = options[:callback]
|
56
|
+
html_options[:'data-onblur'] = options[:onblur] if options[:onblur] && ['cancel','submit', 'ignore'].include?(options[:onblur])
|
57
|
+
html_options[:'data-loadurl'] = options[:loadurl] unless options[:loadurl].nil?
|
58
|
+
html_options[:'data-display-method'] = options[:display_method] unless options[:display_method].nil?
|
59
|
+
if html_options[:'data-display-method'].present? && html_options[:'data-loadurl'].nil?
|
60
|
+
html_options[:'data-loadurl'] = url_for(:action => 'get_attribute_on_the_spot')
|
57
61
|
end
|
58
|
-
html_options[:'data-ok'] = options[:ok_text]
|
59
|
-
html_options[:'data-cancel'] = options[:cancel_text]
|
60
|
-
html_options[:'data-tooltip'] = options[:tooltip]
|
61
|
-
html_options[:'data-auth'] = form_authenticity_token if defined? form_authenticity_token
|
62
|
-
html_options[:'data-selected'] = options[:selected]
|
63
|
-
html_options[:'data-callback'] = options[:callback]
|
64
|
-
html_options[:'data-onblur'] = options[:onblur] if options[:onblur] && ['cancel','submit', 'ignore'].include?(options[:onblur])
|
65
|
-
html_options[:'data-loadurl'] = options[:loadurl] unless options[:loadurl].nil?
|
66
62
|
|
67
63
|
content_tag("span", html_options) do
|
68
64
|
if options[:display_text]
|
69
65
|
options[:display_text]
|
66
|
+
elsif options[:display_method]
|
67
|
+
object.send(options[:display_method].to_sym).to_s
|
70
68
|
elsif editable_type == :select && options[:loadurl].nil?
|
71
69
|
lookup_display_value(select_data, field_value)
|
72
70
|
else
|
data/on_the_spot.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{on_the_spot}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.18"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nathan Van der Auwera"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-12-12}
|
13
13
|
s.description = %q{Unobtrusive in place editing, using jEditable; only works in Rails 3}
|
14
14
|
s.email = %q{nathan@dixis.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"README.markdown",
|
29
29
|
"Rakefile",
|
30
30
|
"VERSION",
|
31
|
+
"app/assets/css/on_the_spot.css",
|
31
32
|
"app/assets/javascripts/jquery.jeditable.checkbox.js",
|
32
33
|
"app/assets/javascripts/jquery.jeditable.mini.js",
|
33
34
|
"app/assets/javascripts/on_the_spot.js",
|
data/spec/on_the_spot_spec.rb
CHANGED
@@ -67,6 +67,23 @@ describe "OnTheSpot" do
|
|
67
67
|
@result.should == "<span class=\"on_the_spot_editing\" data-cancel=\"cancel\" data-ok=\"ok\" data-tooltip=\"tooltip\" data-url=\"/bla\" id=\"r_spec/mocks/mock__content__123\">jediknight</span>"
|
68
68
|
end
|
69
69
|
|
70
|
+
it "makes the correct html for an edit-field and use the display-method as string" do
|
71
|
+
@dummy.should_receive(:changed_content).and_return("test-changed")
|
72
|
+
@tester.should_receive(:url_for).with({:action => 'get_attribute_on_the_spot'}).and_return('/bla-again')
|
73
|
+
|
74
|
+
@result = @tester.on_the_spot_edit @dummy, :content, :display_method => 'changed_content'
|
75
|
+
@result.should == "<span class=\"on_the_spot_editing\" data-cancel=\"cancel\" data-display-method=\"changed_content\" data-loadurl=\"/bla-again\" data-ok=\"ok\" data-tooltip=\"tooltip\" data-url=\"/bla\" id=\"r_spec/mocks/mock__content__123\">test-changed</span>"
|
76
|
+
end
|
77
|
+
|
78
|
+
it "makes the correct html for an edit-field and use the display-method (as symbol)" do
|
79
|
+
@dummy.should_receive(:changed_content).and_return("test-changed")
|
80
|
+
@tester.should_receive(:url_for).with({:action => 'get_attribute_on_the_spot'}).and_return('/bla-again')
|
81
|
+
|
82
|
+
@result = @tester.on_the_spot_edit @dummy, :content, :display_method => :changed_content
|
83
|
+
@result.should == "<span class=\"on_the_spot_editing\" data-cancel=\"cancel\" data-display-method=\"changed_content\" data-loadurl=\"/bla-again\" data-ok=\"ok\" data-tooltip=\"tooltip\" data-url=\"/bla\" id=\"r_spec/mocks/mock__content__123\">test-changed</span>"
|
84
|
+
end
|
85
|
+
|
86
|
+
|
70
87
|
it "makes the correct html for a text-area" do
|
71
88
|
@result = @tester.on_the_spot_edit @dummy, :content, :type => :textarea
|
72
89
|
@result.should == "<span class=\"on_the_spot_editing\" data-cancel=\"cancel\" data-columns=\"40\" data-edittype=\"textarea\" data-ok=\"ok\" data-rows=\"5\" data-tooltip=\"tooltip\" data-url=\"/bla\" id=\"r_spec/mocks/mock__content__123\">test</span>"
|
@@ -109,7 +126,7 @@ describe "OnTheSpot" do
|
|
109
126
|
@result.should == "<span class=\"on_the_spot_editing\" data-cancel=\"cancel\" data-edittype=\"select\" data-loadurl=\"/load/data\" data-ok=\"ok\" data-tooltip=\"tooltip\" data-url=\"/bla\" id=\"r_spec/mocks/mock__content__123\">test</span>"
|
110
127
|
end
|
111
128
|
|
112
|
-
it "
|
129
|
+
it "use the display-text preferrably" do
|
113
130
|
@result = @tester.on_the_spot_edit @dummy, :content, :type => :select, :loadurl => '/load/data', :display_text => 'ninja'
|
114
131
|
@result.should == "<span class=\"on_the_spot_editing\" data-cancel=\"cancel\" data-edittype=\"select\" data-loadurl=\"/load/data\" data-ok=\"ok\" data-tooltip=\"tooltip\" data-url=\"/bla\" id=\"r_spec/mocks/mock__content__123\">ninja</span>"
|
115
132
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: on_the_spot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 59
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 18
|
10
|
+
version: 0.0.18
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nathan Van der Auwera
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-12-12 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- README.markdown
|
89
89
|
- Rakefile
|
90
90
|
- VERSION
|
91
|
+
- app/assets/css/on_the_spot.css
|
91
92
|
- app/assets/javascripts/jquery.jeditable.checkbox.js
|
92
93
|
- app/assets/javascripts/jquery.jeditable.mini.js
|
93
94
|
- app/assets/javascripts/on_the_spot.js
|