puffer 0.0.7 → 0.0.8
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/VERSION +1 -1
- data/app/cells/puffer/base/additional.html.erb +13 -5
- data/app/helpers/puffer_helper.rb +6 -1
- data/app/views/layouts/puffer.html.erb +5 -3
- data/app/views/puffer/_form.html.erb +1 -1
- data/app/views/puffer/associated/one.js.erb +9 -0
- data/app/views/puffer/edit.html.erb +1 -1
- data/app/views/puffer/index.html.erb +7 -7
- data/app/views/puffer/new.html.erb +1 -1
- data/app/views/puffer/show.html.erb +4 -4
- data/lib/generators/puffer/install/templates/puffer/javascripts/application.js +10 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/rails-src.js +36 -378
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter-src.js +621 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter.js +18 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/stylesheets/puffer.css +107 -6
- data/lib/puffer/base.rb +4 -3
- data/lib/puffer/controller/actions.rb +4 -70
- data/lib/puffer/controller/dsl.rb +23 -5
- data/lib/puffer/controller/generated.rb +65 -0
- data/lib/puffer/extensions/activerecord.rb +3 -3
- data/lib/puffer/extensions/core.rb +14 -0
- data/lib/puffer/extensions/mapper.rb +20 -0
- data/lib/puffer/fields.rb +11 -2
- data/lib/puffer/fields/field.rb +24 -1
- data/lib/puffer/inputs.rb +1 -3
- data/lib/puffer/inputs/association.rb +27 -1
- data/lib/puffer/inputs/base.rb +12 -4
- data/lib/puffer/inputs/boolean.rb +1 -1
- data/lib/puffer/inputs/date_time.rb +1 -1
- data/lib/puffer/resource.rb +1 -1
- data/lib/puffer/resource/routing.rb +2 -2
- data/lib/puffer/resource/scoping.rb +5 -1
- data/puffer.gemspec +15 -5
- data/spec/dummy/app/controllers/admin/profiles_controller.rb +2 -2
- data/spec/dummy/app/views/admin/users/index.html.erb +3 -1
- data/spec/dummy/config/database.yml +1 -1
- data/spec/dummy/public/puffer/javascripts/application.js +10 -0
- data/spec/dummy/public/puffer/javascripts/rails-src.js +36 -378
- data/spec/dummy/public/puffer/javascripts/right-autocompleter-src.js +621 -0
- data/spec/dummy/public/puffer/javascripts/right-autocompleter.js +18 -0
- data/spec/dummy/public/puffer/javascripts/right-autocompleter.js.gz +0 -0
- data/spec/dummy/public/puffer/stylesheets/puffer.css +107 -6
- data/spec/lib/extensions/core_spec.rb +29 -0
- data/spec/lib/resource/routing_spec.rb +11 -11
- metadata +28 -18
- data/lib/generators/puffer/install/templates/puffer/javascripts/rails.js +0 -14
- data/spec/dummy/public/puffer/javascripts/rails.js +0 -14
@@ -60,6 +60,11 @@ module Puffer
|
|
60
60
|
|
61
61
|
collection do
|
62
62
|
post :create, options
|
63
|
+
controller._collections.each do |args|
|
64
|
+
opts = args.extract_options!.dup
|
65
|
+
args.push options.reverse_merge(opts)
|
66
|
+
send *args
|
67
|
+
end
|
63
68
|
end
|
64
69
|
|
65
70
|
new do
|
@@ -71,6 +76,11 @@ module Puffer
|
|
71
76
|
get :show, options
|
72
77
|
put :update, options
|
73
78
|
delete :destroy, options
|
79
|
+
controller._members.each do |args|
|
80
|
+
opts = args.extract_options!.dup
|
81
|
+
args.push options.reverse_merge(opts)
|
82
|
+
send *args
|
83
|
+
end
|
74
84
|
end
|
75
85
|
|
76
86
|
end
|
@@ -111,6 +121,11 @@ module Puffer
|
|
111
121
|
collection do
|
112
122
|
get :index, options
|
113
123
|
post :create, options
|
124
|
+
controller._collections.each do |args|
|
125
|
+
opts = args.extract_options!.dup
|
126
|
+
args.push options.reverse_merge(opts)
|
127
|
+
send *args
|
128
|
+
end
|
114
129
|
end
|
115
130
|
|
116
131
|
new do
|
@@ -122,6 +137,11 @@ module Puffer
|
|
122
137
|
get :show, options
|
123
138
|
put :update, options
|
124
139
|
delete :destroy, options
|
140
|
+
controller._members.each do |args|
|
141
|
+
opts = args.extract_options!.dup
|
142
|
+
args.push options.reverse_merge(opts)
|
143
|
+
send *args
|
144
|
+
end
|
125
145
|
end
|
126
146
|
end
|
127
147
|
|
data/lib/puffer/fields.rb
CHANGED
@@ -19,20 +19,29 @@ module Puffer
|
|
19
19
|
:password if field.name =~ /password/
|
20
20
|
end
|
21
21
|
offer_type do |field|
|
22
|
-
field.
|
22
|
+
swallow_nil{ field.reflection.macro }
|
23
23
|
end
|
24
24
|
|
25
25
|
def field *args
|
26
26
|
push Field.new(*args)
|
27
|
+
last
|
27
28
|
end
|
28
29
|
|
29
30
|
def searchable
|
30
|
-
@searchable ||=
|
31
|
+
@searchable ||= map { |f| f if f.column && [:text, :string, :integer, :decimal, :float].include?(f.column.type) }.compact
|
32
|
+
end
|
33
|
+
|
34
|
+
def searches query
|
35
|
+
searchable.map { |f| "#{f.query_column} like '%#{query}%'" if f.query_column.present? }.compact.join(' or ') if query
|
31
36
|
end
|
32
37
|
|
33
38
|
def boolean
|
34
39
|
@boolean ||= reject { |f| f.type != :boolean }
|
35
40
|
end
|
36
41
|
|
42
|
+
def includes
|
43
|
+
@includes ||= map {|f| f.path unless f.native?}.compact.to_includes
|
44
|
+
end
|
45
|
+
|
37
46
|
end
|
38
47
|
end
|
data/lib/puffer/fields/field.rb
CHANGED
@@ -15,7 +15,11 @@ module Puffer
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def name
|
18
|
-
field.split('.').last
|
18
|
+
@name ||= field.split('.').last
|
19
|
+
end
|
20
|
+
|
21
|
+
def path
|
22
|
+
@path ||= field.split('.')[0..-2].join('.')
|
19
23
|
end
|
20
24
|
|
21
25
|
def label
|
@@ -34,6 +38,14 @@ module Puffer
|
|
34
38
|
field
|
35
39
|
end
|
36
40
|
|
41
|
+
def reflection
|
42
|
+
@reflection ||= model.reflect_on_association(name.to_sym)
|
43
|
+
end
|
44
|
+
|
45
|
+
def collection?
|
46
|
+
[:has_many, :has_and_belongs_to_many].include? type
|
47
|
+
end
|
48
|
+
|
37
49
|
def input_options
|
38
50
|
{}
|
39
51
|
end
|
@@ -50,6 +62,17 @@ module Puffer
|
|
50
62
|
@model
|
51
63
|
end
|
52
64
|
|
65
|
+
def association_fields
|
66
|
+
raise "Can`t find records for association building. Please set :search_fields option for '#{field}' field." unless options[:search_fields].present?
|
67
|
+
@reflection_fields ||= begin
|
68
|
+
fields = Puffer::Fields.new
|
69
|
+
options[:search_fields].each do |field_name|
|
70
|
+
fields.field reflection.klass, field_name
|
71
|
+
end
|
72
|
+
fields
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
53
76
|
def column
|
54
77
|
@column ||= model.columns_hash[name]
|
55
78
|
end
|
data/lib/puffer/inputs.rb
CHANGED
@@ -6,7 +6,6 @@ module Puffer
|
|
6
6
|
|
7
7
|
def self.map_type *args
|
8
8
|
to = args.extract_options![:to]
|
9
|
-
raise ArgumentError, "You need to give :to as option to map_type" unless to
|
10
9
|
args.each { |type| mappings[type] = to }
|
11
10
|
end
|
12
11
|
|
@@ -15,8 +14,7 @@ module Puffer
|
|
15
14
|
map_type :date, :time, :datetime, :timestamp, :to => Puffer::Inputs::DateTime
|
16
15
|
|
17
16
|
def self.map_field field
|
18
|
-
mappings[field.type] || (
|
19
|
-
"Puffer::Inputs::#{field.type.to_s.classify}".constantize : Puffer::Inputs::Base)
|
17
|
+
mappings[field.type] || ("Puffer::Inputs::#{field.type.to_s.classify}".constantize rescue Puffer::Inputs::Base)
|
20
18
|
end
|
21
19
|
|
22
20
|
end
|
@@ -3,7 +3,33 @@ module Puffer
|
|
3
3
|
class Association < Puffer::Inputs::Base
|
4
4
|
|
5
5
|
def input
|
6
|
-
|
6
|
+
<<-INPUT
|
7
|
+
<div class="association">
|
8
|
+
#{text_field_tag field, value, field.input_options.merge(
|
9
|
+
:autocomplete => :off,
|
10
|
+
:disabled => (true if builder.object.send(field.name)),
|
11
|
+
'data-autocompleter' => "{url: '#{resource.collection_path(:action => "associated_#{field}_choosing")}', onDone: association_done}"
|
12
|
+
)}
|
13
|
+
<div class="association_clear">×</div>
|
14
|
+
#{builder.hidden_field field.reflection.primary_key_name}
|
15
|
+
</div>
|
16
|
+
INPUT
|
17
|
+
end
|
18
|
+
|
19
|
+
def value
|
20
|
+
value = [
|
21
|
+
swallow_nil{builder.object.send(field.name)[field.reflection.primary_key_column.name.to_sym]},
|
22
|
+
swallow_nil{builder.object.send(field.name).to_title}
|
23
|
+
].compact.join(' - ')
|
24
|
+
end
|
25
|
+
|
26
|
+
def label
|
27
|
+
label_tag field
|
28
|
+
end
|
29
|
+
|
30
|
+
def error
|
31
|
+
builder.object.errors[field.reflection.primary_key_name.to_sym].first ||
|
32
|
+
builder.object.errors[field.name.to_sym].first.presence
|
7
33
|
end
|
8
34
|
|
9
35
|
end
|
data/lib/puffer/inputs/base.rb
CHANGED
@@ -11,13 +11,17 @@ module Puffer
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def render
|
14
|
-
|
14
|
+
html.html_safe
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def html
|
18
18
|
<<-INPUT
|
19
|
-
|
20
|
-
|
19
|
+
<div class="label">
|
20
|
+
#{label}
|
21
|
+
<div class="field_error">
|
22
|
+
#{error}
|
23
|
+
</div>
|
24
|
+
</div>
|
21
25
|
#{input}
|
22
26
|
INPUT
|
23
27
|
end
|
@@ -34,6 +38,10 @@ module Puffer
|
|
34
38
|
builder.object.errors[field.name.to_sym].first
|
35
39
|
end
|
36
40
|
|
41
|
+
def method_missing method, *args, &block
|
42
|
+
template.send method, *args, &block if template.respond_to? method
|
43
|
+
end
|
44
|
+
|
37
45
|
end
|
38
46
|
end
|
39
47
|
end
|
@@ -8,7 +8,7 @@ module Puffer
|
|
8
8
|
when :time then '%H:%M:%S'
|
9
9
|
when :datetime, :timestamp then '%Y-%m-%d %H:%M:%S'
|
10
10
|
end
|
11
|
-
builder.text_field field, field.input_options.merge("data-calendar" => "{showButtons: true, listYears: true, format: '#{format}'}")
|
11
|
+
builder.text_field field, field.input_options.merge("data-calendar" => "{showButtons: true, listYears: true, format: '#{format}'}", :autocomplete => :off)
|
12
12
|
end
|
13
13
|
|
14
14
|
end
|
data/lib/puffer/resource.rb
CHANGED
@@ -96,7 +96,7 @@ module Puffer
|
|
96
96
|
|
97
97
|
def collection
|
98
98
|
scope = parent ? parent.member.send(model_name.pluralize) : model
|
99
|
-
scope.includes(includes).joins(includes).order(order).paginate :page => params[:page]
|
99
|
+
scope.includes(includes).joins(includes).where(searches(params[:search])).order(order).paginate :page => params[:page]
|
100
100
|
end
|
101
101
|
|
102
102
|
def member
|
@@ -5,11 +5,11 @@ module Puffer
|
|
5
5
|
include ActionController::UrlFor
|
6
6
|
include Rails.application.routes.url_helpers
|
7
7
|
|
8
|
-
def
|
8
|
+
def collection_url *args
|
9
9
|
polymorphic_url *route_args(route_member(controller_name), *args)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def member_url *args
|
13
13
|
suggest = args.shift if args.first.is_a? ActiveRecord::Base
|
14
14
|
polymorphic_url *route_args(route_member(suggest), *args)
|
15
15
|
end
|
data/puffer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{puffer}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["pyromaniac"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-02-02}
|
13
13
|
s.description = %q{In Soviet Russia puffer admins you}
|
14
14
|
s.email = %q{kinwizard@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -34,6 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
"app/views/puffer/associated/_many.html.erb",
|
35
35
|
"app/views/puffer/associated/_one.html.erb",
|
36
36
|
"app/views/puffer/associated/many.rjs",
|
37
|
+
"app/views/puffer/associated/one.js.erb",
|
37
38
|
"app/views/puffer/associated/one.rjs",
|
38
39
|
"app/views/puffer/association/_many.html.erb",
|
39
40
|
"app/views/puffer/association/_one.html.erb",
|
@@ -50,8 +51,11 @@ Gem::Specification.new do |s|
|
|
50
51
|
"lib/generators/puffer/install/USAGE",
|
51
52
|
"lib/generators/puffer/install/install_generator.rb",
|
52
53
|
"lib/generators/puffer/install/templates/puffer.rb",
|
54
|
+
"lib/generators/puffer/install/templates/puffer/javascripts/application.js",
|
53
55
|
"lib/generators/puffer/install/templates/puffer/javascripts/rails-src.js",
|
54
|
-
"lib/generators/puffer/install/templates/puffer/javascripts/
|
56
|
+
"lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter-src.js",
|
57
|
+
"lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter.js",
|
58
|
+
"lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter.js.gz",
|
55
59
|
"lib/generators/puffer/install/templates/puffer/javascripts/right-calendar-src.js",
|
56
60
|
"lib/generators/puffer/install/templates/puffer/javascripts/right-calendar.js",
|
57
61
|
"lib/generators/puffer/install/templates/puffer/javascripts/right-calendar.js.gz",
|
@@ -77,6 +81,7 @@ Gem::Specification.new do |s|
|
|
77
81
|
"lib/puffer/controller/actions.rb",
|
78
82
|
"lib/puffer/controller/config.rb",
|
79
83
|
"lib/puffer/controller/dsl.rb",
|
84
|
+
"lib/puffer/controller/generated.rb",
|
80
85
|
"lib/puffer/controller/helpers.rb",
|
81
86
|
"lib/puffer/controller/mutate.rb",
|
82
87
|
"lib/puffer/engine.rb",
|
@@ -154,8 +159,11 @@ Gem::Specification.new do |s|
|
|
154
159
|
"spec/dummy/public/javascripts/effects.js",
|
155
160
|
"spec/dummy/public/javascripts/prototype.js",
|
156
161
|
"spec/dummy/public/javascripts/rails.js",
|
162
|
+
"spec/dummy/public/puffer/javascripts/application.js",
|
157
163
|
"spec/dummy/public/puffer/javascripts/rails-src.js",
|
158
|
-
"spec/dummy/public/puffer/javascripts/
|
164
|
+
"spec/dummy/public/puffer/javascripts/right-autocompleter-src.js",
|
165
|
+
"spec/dummy/public/puffer/javascripts/right-autocompleter.js",
|
166
|
+
"spec/dummy/public/puffer/javascripts/right-autocompleter.js.gz",
|
159
167
|
"spec/dummy/public/puffer/javascripts/right-calendar-src.js",
|
160
168
|
"spec/dummy/public/puffer/javascripts/right-calendar.js",
|
161
169
|
"spec/dummy/public/puffer/javascripts/right-calendar.js.gz",
|
@@ -184,6 +192,7 @@ Gem::Specification.new do |s|
|
|
184
192
|
"spec/fabricators/tags_fabricator.rb",
|
185
193
|
"spec/fabricators/users_fabricator.rb",
|
186
194
|
"spec/integration/navigation_spec.rb",
|
195
|
+
"spec/lib/extensions/core_spec.rb",
|
187
196
|
"spec/lib/fields_spec.rb",
|
188
197
|
"spec/lib/params_spec.rb",
|
189
198
|
"spec/lib/render_fallback_spec.rb",
|
@@ -194,7 +203,7 @@ Gem::Specification.new do |s|
|
|
194
203
|
]
|
195
204
|
s.homepage = %q{http://github.com/puffer/puffer}
|
196
205
|
s.require_paths = ["lib"]
|
197
|
-
s.rubygems_version = %q{1.4.
|
206
|
+
s.rubygems_version = %q{1.4.2}
|
198
207
|
s.summary = %q{Admin interface builder}
|
199
208
|
s.test_files = [
|
200
209
|
"spec/dummy/app/controllers/admin/categories_controller.rb",
|
@@ -240,6 +249,7 @@ Gem::Specification.new do |s|
|
|
240
249
|
"spec/fabricators/tags_fabricator.rb",
|
241
250
|
"spec/fabricators/users_fabricator.rb",
|
242
251
|
"spec/integration/navigation_spec.rb",
|
252
|
+
"spec/lib/extensions/core_spec.rb",
|
243
253
|
"spec/lib/fields_spec.rb",
|
244
254
|
"spec/lib/params_spec.rb",
|
245
255
|
"spec/lib/render_fallback_spec.rb",
|
@@ -5,14 +5,14 @@ class Admin::ProfilesController < Puffer::Base
|
|
5
5
|
end
|
6
6
|
|
7
7
|
index do
|
8
|
-
field
|
8
|
+
field 'user.email'
|
9
9
|
field :name
|
10
10
|
field :surname
|
11
11
|
field :birth_date
|
12
12
|
end
|
13
13
|
|
14
14
|
form do
|
15
|
-
field :user
|
15
|
+
field :user, :search_fields => [:email, :password]
|
16
16
|
field :name
|
17
17
|
field :surname
|
18
18
|
field :birth_date
|
@@ -0,0 +1,10 @@
|
|
1
|
+
var association_done = function(event) {
|
2
|
+
current = this.first('li.current')
|
3
|
+
this.input.next('input[type=hidden]').value(current.get('data-id'));
|
4
|
+
this.input.value(current.find('.title').first().html().stripTags()).disable();
|
5
|
+
}
|
6
|
+
|
7
|
+
'.association_clear'.on('click', function(event) {
|
8
|
+
this.prev('input[type=text]').value('').enable();
|
9
|
+
this.next('input[type=hidden]').value('');
|
10
|
+
});
|
@@ -1,115 +1,16 @@
|
|
1
|
-
/**
|
2
|
-
* The Ruby On Rails plugin for RightJS
|
3
|
-
* http://github.com/MadRabbit/right-rails
|
4
|
-
*
|
5
|
-
* Copyright (C) 2009-2010 Nikolay Nemshilov
|
6
|
-
*/
|
7
1
|
(function(window, document, RightJS) {
|
8
|
-
/**
|
9
|
-
* Underscored aliases for Ruby On Rails
|
10
|
-
*
|
11
|
-
* Copyright (C) 2009-2010 Nikolay Nemshilov
|
12
|
-
*/
|
13
2
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
*/
|
3
|
+
var $ = RightJS.$,
|
4
|
+
$$ = RightJS.$$,
|
5
|
+
$E = RightJS.$E,
|
6
|
+
Xhr = RightJS.Xhr;
|
19
7
|
|
20
|
-
var
|
21
|
-
|
22
|
-
|
23
|
-
$E = RightJS.$E,
|
24
|
-
Xhr = RightJS.Xhr,
|
25
|
-
Object = RightJS.Object;
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
// the language and window level aliases
|
30
|
-
R([
|
31
|
-
RightJS.String.prototype,
|
32
|
-
RightJS.Array.prototype,
|
33
|
-
RightJS.Function.prototype,
|
34
|
-
RightJS.Object,
|
35
|
-
RightJS.Options,
|
36
|
-
RightJS.Observer,
|
37
|
-
RightJS.Observer.prototype,
|
38
|
-
window,
|
39
|
-
document
|
40
|
-
]).each(function(object) {
|
41
|
-
for (var key in object) {
|
42
|
-
try { // some keys are not accessable
|
43
|
-
|
44
|
-
if (/[A-Z]/.test(key) && typeof(object[key]) === 'function') {
|
45
|
-
var u_key = R(key).underscored();
|
46
|
-
if (object[u_key] === null || object[u_key] === undefined) {
|
47
|
-
object[u_key] = object[key];
|
48
|
-
}
|
49
|
-
}
|
50
|
-
} catch (e) {}
|
51
|
-
}
|
52
|
-
});
|
53
|
-
|
54
|
-
|
55
|
-
// DOM package aliases
|
56
|
-
R([
|
57
|
-
RightJS.Element,
|
58
|
-
RightJS.Event,
|
59
|
-
RightJS.Form,
|
60
|
-
RightJS.Input
|
61
|
-
]).each(function(object) {
|
62
|
-
if (!object) { return; }
|
63
|
-
|
64
|
-
var aliases = {}, methods = object.prototype;
|
65
|
-
|
66
|
-
for (var key in methods) {
|
67
|
-
if (/[A-Z]/.test(key) && typeof(methods[key]) === 'function') {
|
68
|
-
object.prototype[R(key).underscored()] = methods[key];
|
69
|
-
}
|
8
|
+
var cancel = function(element) {
|
9
|
+
var message = element.get('data-confirm');
|
10
|
+
return(message && !confirm(message));
|
70
11
|
}
|
71
|
-
});
|
72
12
|
|
73
|
-
|
74
|
-
RightJS.$alias(RightJS.String.prototype, {
|
75
|
-
index_of: 'indexOf',
|
76
|
-
last_index_of: 'lastIndexOf',
|
77
|
-
to_f: 'toFloat',
|
78
|
-
to_i: 'toInt',
|
79
|
-
gsub: 'replace',
|
80
|
-
downcase: 'toLowerCase',
|
81
|
-
upcase: 'toUpperCase',
|
82
|
-
index: 'indexOf',
|
83
|
-
rindex: 'lastIndexOf',
|
84
|
-
strip: 'trim'
|
85
|
-
});
|
86
|
-
|
87
|
-
RightJS.$alias(RightJS.Array.prototype, {
|
88
|
-
collect: 'map',
|
89
|
-
detect: 'filter',
|
90
|
-
index_of: 'indexOf',
|
91
|
-
last_index_of: 'lastIndexOf',
|
92
|
-
index: 'indexOf',
|
93
|
-
rindex: 'lastIndexOf'
|
94
|
-
});
|
95
|
-
|
96
|
-
/**
|
97
|
-
* Rails 3 UJS support module
|
98
|
-
*
|
99
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
100
|
-
*/
|
101
|
-
(function() {
|
102
|
-
// tries to cancel the event via confirmation
|
103
|
-
var user_cancels = function(event, element) {
|
104
|
-
var message = element.get('data-confirm');
|
105
|
-
if (message && !confirm(message)) {
|
106
|
-
event.stop();
|
107
|
-
return true;
|
108
|
-
}
|
109
|
-
};
|
110
|
-
|
111
|
-
// adds XHR events to the element
|
112
|
-
var add_xhr_events = function(element, options) {
|
13
|
+
var xhr_events = function(element, options) {
|
113
14
|
return Object.merge({
|
114
15
|
onCreate: function() { element.fire('ajax:loading', this); },
|
115
16
|
onComplete: function() { element.fire('ajax:complete', this); },
|
@@ -117,283 +18,40 @@ RightJS.$alias(RightJS.Array.prototype, {
|
|
117
18
|
onFailure: function() { element.fire('ajax:failure', this); }
|
118
19
|
}, options);
|
119
20
|
};
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
21
|
+
|
22
|
+
'form[data-remote]'.on('submit', function(event) {
|
23
|
+
event.stop();
|
24
|
+
this.send();
|
25
|
+
});
|
26
|
+
|
27
|
+
'a[data-confirm], a[data-method], a[data-remote]'.on('click', function(event) {
|
28
|
+
if (cancel(this)) { event.stop(); return; }
|
29
|
+
|
30
|
+
var method = this.get('data-method') || 'get',
|
31
|
+
remote = !!this.get('data-remote'),
|
32
|
+
url = this.get('href');
|
33
|
+
|
34
|
+
if (method != 'get' || remote) { event.stop(); }
|
35
|
+
|
131
36
|
if (remote) {
|
132
|
-
Xhr.load(url,
|
133
|
-
method: method
|
134
|
-
spinner:
|
37
|
+
Xhr.load(url, xhr_events(this, {
|
38
|
+
method: method,
|
39
|
+
spinner: this.get('data-spinner')
|
135
40
|
}));
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
41
|
+
}
|
42
|
+
|
43
|
+
if (method != 'get') {
|
44
|
+
var param = $$('meta[name=csrf-param]')[0].get('content'),
|
45
|
+
token = $$('meta[name=csrf-token]')[0].get('content'),
|
140
46
|
form = $E('form', {action: url, method: 'post'});
|
141
|
-
|
47
|
+
|
142
48
|
if (param && token) {
|
143
|
-
form.insert('<input type="hidden" name="'+param
|
49
|
+
form.insert('<input type="hidden" name="' + param + '" value="' + token + '" />');
|
144
50
|
}
|
145
|
-
|
146
|
-
form.insert('<input type="hidden" name="_method" value="'+method+'"/>')
|
147
|
-
.insertTo(document.body).submit();
|
148
|
-
}
|
149
|
-
};
|
150
51
|
|
151
|
-
|
152
|
-
|
153
|
-
click: function(event) {
|
154
|
-
var tag = event.target._.tagName;
|
155
|
-
if (tag === 'A' || tag === 'BUTTON') {
|
156
|
-
try_link_submit(event);
|
157
|
-
}
|
158
|
-
},
|
159
|
-
|
160
|
-
submit: function(event) {
|
161
|
-
var form = event.target;
|
162
|
-
if (form.has('data-remote') && !user_cancels(event, form)) {
|
163
|
-
event.stop();
|
164
|
-
form.send(add_xhr_events(form, {
|
165
|
-
spinner: form.get('data-spinner') || form.first('.spinner')
|
166
|
-
}));
|
167
|
-
}
|
52
|
+
form.insert('<input type="hidden" name="_method" value="' + method + '"/>')
|
53
|
+
.insertTo(document.body).submit();
|
168
54
|
}
|
169
55
|
});
|
170
|
-
})();
|
171
|
-
|
172
|
-
|
173
|
-
/**
|
174
|
-
* RR is the common ajax operations wrapper for ruby on rails
|
175
|
-
*
|
176
|
-
* Copyright (C) 2009-2010 Nikolay Nemshilov
|
177
|
-
*/
|
178
|
-
var RR = {
|
179
|
-
/**
|
180
|
-
* Basic options
|
181
|
-
*
|
182
|
-
* NOTE: DO NOT CHANGE this hash right here
|
183
|
-
* Use your application.js file to alter the options
|
184
|
-
*/
|
185
|
-
Options: {
|
186
|
-
format: 'js', // the working format for remote requests over the application
|
187
|
-
|
188
|
-
flashId: 'flashes', // the flashes element id
|
189
|
-
flashHideFx: 'slide', // use null if you don't want any fx in here
|
190
|
-
flashHideDelay: 3200, // use -1 to disable the flash element hidding
|
191
|
-
|
192
|
-
highlightUpdates: true,
|
193
|
-
|
194
|
-
removeFx: 'fade', // blocks removing fx
|
195
|
-
insertFx: 'fade', // blocks insertion fx
|
196
|
-
|
197
|
-
insertPosition: 'bottom', // default insert position
|
198
|
-
|
199
|
-
linkToAjaxEdit: '.ajax_edit',
|
200
|
-
linkToAjaxDelete: '.ajax_delete',
|
201
|
-
|
202
|
-
rescanWithScopes: true // if it should rescan only updated elements
|
203
|
-
},
|
204
|
-
|
205
|
-
/**
|
206
|
-
* Updates the flashes block with the source
|
207
|
-
*
|
208
|
-
* @param String new content
|
209
|
-
* @return RR this
|
210
|
-
*/
|
211
|
-
update_flash: function(content) {
|
212
|
-
var element = $(this.Options.flashId);
|
213
|
-
if (element) {
|
214
|
-
this.replace(element, content).hide_flash();
|
215
|
-
}
|
216
|
-
return this;
|
217
|
-
},
|
218
|
-
|
219
|
-
/**
|
220
|
-
* Initializes the delayed flashes hide call
|
221
|
-
*
|
222
|
-
* @return RR this
|
223
|
-
*/
|
224
|
-
hide_flash: function() {
|
225
|
-
if (this.Options.flashHideDelay > -1) {
|
226
|
-
var element = $(this.Options.flashId);
|
227
|
-
if (element && element.visible()) {
|
228
|
-
element.hide.bind(element, this.Options.flashHideFx).delay(this.Options.flashHideDelay);
|
229
|
-
}
|
230
|
-
}
|
231
|
-
return this;
|
232
|
-
},
|
233
|
-
|
234
|
-
/**
|
235
|
-
* Highlights the element according to the options
|
236
|
-
*
|
237
|
-
* @param String element id
|
238
|
-
* @return RR this
|
239
|
-
*/
|
240
|
-
highlight: function(id) {
|
241
|
-
if ($(id) && this.Options.highlightUpdates) {
|
242
|
-
$(id).highlight();
|
243
|
-
}
|
244
|
-
return this;
|
245
|
-
},
|
246
|
-
|
247
|
-
/**
|
248
|
-
* Inserts the content into the given element
|
249
|
-
*
|
250
|
-
* @param destination String destination id
|
251
|
-
* @param content String content
|
252
|
-
* @param position String position
|
253
|
-
* @return RR this
|
254
|
-
*/
|
255
|
-
insert: function(where, what, in_position) {
|
256
|
-
var position = in_position || this.Options.insertPosition, new_element,
|
257
|
-
container = $(where).insert(what, position);
|
258
|
-
|
259
|
-
// trying to find the new block
|
260
|
-
switch (position) {
|
261
|
-
case 'bottom': new_element = container.children().last(); break;
|
262
|
-
case 'top': new_element = container.first(); break;
|
263
|
-
case 'before': new_element = container.prev(); break;
|
264
|
-
case 'after': new_element = container.next(); break;
|
265
|
-
}
|
266
|
-
|
267
|
-
// necely displaying the new block
|
268
|
-
if (new_element && this.Options.insertFx) {
|
269
|
-
new_element.hide().show(this.Options.insertFx, {
|
270
|
-
onFinish: this.highlight.bind(this, new_element)
|
271
|
-
});
|
272
|
-
} else {
|
273
|
-
this.highlight(new_element);
|
274
|
-
}
|
275
|
-
|
276
|
-
return this.rescan(where);
|
277
|
-
},
|
278
|
-
|
279
|
-
/**
|
280
|
-
* Replaces the given element with a new content
|
281
|
-
*
|
282
|
-
* @param destination String destination id
|
283
|
-
* @param content String content
|
284
|
-
* @return RR this
|
285
|
-
*/
|
286
|
-
replace: function(id, source) {
|
287
|
-
$(id).replace(source);
|
288
|
-
return this.highlight(id).rescan(id);
|
289
|
-
},
|
290
|
-
|
291
|
-
/**
|
292
|
-
* removes the element by id
|
293
|
-
*
|
294
|
-
* @param String element id
|
295
|
-
* @return RR this
|
296
|
-
*/
|
297
|
-
remove: function(id) {
|
298
|
-
if ($(id)) {
|
299
|
-
$(id).remove(this.Options.removeFx);
|
300
|
-
}
|
301
|
-
},
|
302
|
-
|
303
|
-
/**
|
304
|
-
* Makes a remote form out of the form
|
305
|
-
*
|
306
|
-
* @param String form id
|
307
|
-
* @return RR this
|
308
|
-
*/
|
309
|
-
remotize_form: function(id) {
|
310
|
-
var form = $(id);
|
311
|
-
if (form) {
|
312
|
-
form.remotize().enable()._.action += '.'+this.Options.format;
|
313
|
-
}
|
314
|
-
return this;
|
315
|
-
},
|
316
|
-
|
317
|
-
/**
|
318
|
-
* Replaces the form with new content and makes it remote
|
319
|
-
*
|
320
|
-
* @param form id String form id
|
321
|
-
* @param content String content
|
322
|
-
* @return RR this
|
323
|
-
*/
|
324
|
-
replace_form: function(id, source) {
|
325
|
-
var form = $(id);
|
326
|
-
if (form) {
|
327
|
-
form.replace(source);
|
328
|
-
this.remotize_form(id);
|
329
|
-
}
|
330
|
-
|
331
|
-
return this.rescan(id);
|
332
|
-
},
|
333
|
-
|
334
|
-
/**
|
335
|
-
* Inserts the form source into the given element
|
336
|
-
*
|
337
|
-
* @param target id String target id
|
338
|
-
* @param source String form source
|
339
|
-
* @return RR this
|
340
|
-
*/
|
341
|
-
show_form_for: function(id, source) {
|
342
|
-
$(id).select('form').each('remove'); // removing old forms
|
343
|
-
$(id).insert(source);
|
344
|
-
|
345
|
-
return this.remotize_form($(id).first('form')).rescan(id);
|
346
|
-
},
|
347
|
-
|
348
|
-
/**
|
349
|
-
* watches link clicks and processes the ajax edit/delete operations
|
350
|
-
*
|
351
|
-
* @param Event event
|
352
|
-
*/
|
353
|
-
process_click: function(event) {
|
354
|
-
var link;
|
355
|
-
|
356
|
-
if ((link = event.find('a'+ this.Options.linkToAjaxEdit))) {
|
357
|
-
event.stop();
|
358
|
-
Xhr.load(link.get('href') + '.' + this.Options.format);
|
359
|
-
} else if ((link = event.find('a'+ this.Options.linkToAjaxDelete)) && link.has('onclick')) {
|
360
|
-
event.stop();
|
361
|
-
eval('({f:'+ link.onclick.toString().replace('.submit', '.send')+'})').f.call(link);
|
362
|
-
}
|
363
|
-
},
|
364
|
-
|
365
|
-
/**
|
366
|
-
* Scans for updated elements
|
367
|
-
*
|
368
|
-
* @return RR this
|
369
|
-
*/
|
370
|
-
rescan: function(scope) {
|
371
|
-
$w('Draggable Droppable Tabs Slider Selectable').each(function(name) {
|
372
|
-
if (name in window) {
|
373
|
-
window[name].rescan(this.Options.rescanWithScopes ? scope : null);
|
374
|
-
}
|
375
|
-
}, this);
|
376
|
-
|
377
|
-
|
378
|
-
return this;
|
379
|
-
}
|
380
|
-
};
|
381
56
|
|
382
|
-
|
383
|
-
/**
|
384
|
-
* the document onload hooks
|
385
|
-
*
|
386
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
387
|
-
*/
|
388
|
-
$(document).on({
|
389
|
-
ready: function() {
|
390
|
-
RR.hide_flash();
|
391
|
-
},
|
392
|
-
|
393
|
-
click: function(event) {
|
394
|
-
RR.process_click(event);
|
395
|
-
}
|
396
|
-
});
|
397
|
-
|
398
|
-
window.RR = RR;
|
399
|
-
})(window, document, RightJS);
|
57
|
+
})(window, document, RightJS);
|