ajax_scaffold_generator 3.0.4 → 3.1.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/ajax_scaffold_generator.rb +13 -15
- data/templates/ajax_scaffold.css +80 -55
- data/templates/ajax_scaffold.js +1 -1
- data/templates/controller.rb +13 -5
- data/templates/fixtures.yml +5 -0
- data/templates/helper.rb +6 -2
- data/templates/lib_ajax_scaffold.rb +208 -0
- data/templates/model.rb +5 -0
- data/templates/partial_column_headings.rhtml +13 -9
- data/templates/partial_item.rhtml +4 -4
- data/templates/partial_new_edit.rhtml +12 -10
- data/templates/rjs_cancel.rjs +12 -0
- data/templates/unit_test.rb +10 -0
- metadata +7 -3
- data/templates/ajax_scaffold_helper.rb +0 -99
data/ajax_scaffold_generator.rb
CHANGED
@@ -5,7 +5,7 @@ class AjaxScaffoldingSandbox < ScaffoldingSandbox
|
|
5
5
|
Proc.new { |record, column| "<div class=\"form-element\">\n <label for=\"#{record}_#{column.name}\">#{column.human_name}</label>\n #{input(record, column.name)}\n</div>\n" }
|
6
6
|
end
|
7
7
|
|
8
|
-
def all_input_tags(record, record_name, options)
|
8
|
+
def all_input_tags(record, record_name, options)
|
9
9
|
input_block = options[:input_block] || default_input_block
|
10
10
|
|
11
11
|
if !options[:exclude].blank?
|
@@ -49,8 +49,12 @@ class AjaxScaffoldGenerator < ScaffoldGenerator
|
|
49
49
|
|
50
50
|
# Check for class naming collisions.
|
51
51
|
m.class_collisions controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}ControllerTest", "#{controller_class_name}Helper"
|
52
|
+
m.class_collisions class_path, class_name, "#{singular_name}Test"
|
52
53
|
|
53
|
-
#
|
54
|
+
# Model, controller, helper, views, and test directories.
|
55
|
+
m.directory File.join('app/models', class_path)
|
56
|
+
m.directory File.join('test/unit', class_path)
|
57
|
+
m.directory File.join('test/fixtures', class_path)
|
54
58
|
m.directory File.join('app/controllers', controller_class_path)
|
55
59
|
m.directory File.join('app/helpers', controller_class_path)
|
56
60
|
m.directory File.join('app/views', controller_class_path, controller_file_name)
|
@@ -58,9 +62,11 @@ class AjaxScaffoldGenerator < ScaffoldGenerator
|
|
58
62
|
m.directory File.join('public/images')
|
59
63
|
m.directory File.join('test/functional', controller_class_path)
|
60
64
|
|
61
|
-
#
|
62
|
-
m.
|
63
|
-
|
65
|
+
# Model class, unit test, and fixtures.
|
66
|
+
m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
|
67
|
+
m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
|
68
|
+
m.template 'fixtures.yml', File.join('test/fixtures', class_path, "#{table_name}.yml")
|
69
|
+
|
64
70
|
# Scaffolded forms.
|
65
71
|
m.complex_template 'form.rhtml',
|
66
72
|
File.join('app/views',
|
@@ -129,10 +135,6 @@ class AjaxScaffoldGenerator < ScaffoldGenerator
|
|
129
135
|
File.join('app/helpers',
|
130
136
|
controller_class_path,
|
131
137
|
"#{controller_file_name}_helper.rb")
|
132
|
-
|
133
|
-
m.template 'ajax_scaffold_helper.rb',
|
134
|
-
File.join('app/helpers',
|
135
|
-
"ajax_scaffold_helper.rb")
|
136
138
|
|
137
139
|
# Layout and stylesheet.
|
138
140
|
m.template 'layout.rhtml',
|
@@ -164,19 +166,15 @@ class AjaxScaffoldGenerator < ScaffoldGenerator
|
|
164
166
|
end
|
165
167
|
|
166
168
|
def scaffold_rjs_templates
|
167
|
-
%w( create destroy edit new update )
|
169
|
+
%w( create destroy edit new update cancel )
|
168
170
|
end
|
169
171
|
|
170
172
|
def scaffold_partials
|
171
173
|
%w( form_messages messages column_headings new_edit pagination_links )
|
172
174
|
end
|
173
|
-
|
174
|
-
def scaffold_helpers
|
175
|
-
%w( helper ajax_scaffold_helper )
|
176
|
-
end
|
177
175
|
|
178
176
|
def scaffold_lib
|
179
|
-
%w(
|
177
|
+
%w( ajax_scaffold )
|
180
178
|
end
|
181
179
|
|
182
180
|
def scaffold_images
|
data/templates/ajax_scaffold.css
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
AjaxScaffoldGenerator version 3.
|
2
|
+
AjaxScaffoldGenerator version 3.1.0
|
3
3
|
(c) 2006 Richard White <rrwhite@gmail.com>
|
4
4
|
|
5
5
|
AjaxScaffoldGenerator is freely distributable under the terms of an MIT-style license.
|
@@ -16,11 +16,6 @@ margin: 0;
|
|
16
16
|
padding: 0;
|
17
17
|
}
|
18
18
|
|
19
|
-
.ajax-scaffold a {
|
20
|
-
color: #06c;
|
21
|
-
text-decoration: none;
|
22
|
-
}
|
23
|
-
|
24
19
|
.ajax-scaffold {
|
25
20
|
margin: 5px 0;
|
26
21
|
}
|
@@ -29,6 +24,15 @@ margin: 5px 0;
|
|
29
24
|
width: 100%;
|
30
25
|
}
|
31
26
|
|
27
|
+
.ajax-scaffold a {
|
28
|
+
color: #06c;
|
29
|
+
text-decoration: none;
|
30
|
+
}
|
31
|
+
|
32
|
+
.ajax-scaffold a:hover {
|
33
|
+
background: #ff8;
|
34
|
+
}
|
35
|
+
|
32
36
|
/* Header Styling
|
33
37
|
======================== */
|
34
38
|
|
@@ -69,26 +73,55 @@ text-align: right;
|
|
69
73
|
margin-bottom: -3px;
|
70
74
|
}
|
71
75
|
|
76
|
+
/* Header Styling : Nested
|
77
|
+
======================== */
|
78
|
+
|
79
|
+
.ajax-scaffold .ajax-scaffold {
|
80
|
+
margin: 2px 5px;
|
81
|
+
}
|
82
|
+
|
83
|
+
.ajax-scaffold .ajax-scaffold .ajax-scaffold-header h2 {
|
84
|
+
font-size: 13px;
|
85
|
+
font-weight: bold;
|
86
|
+
}
|
87
|
+
|
88
|
+
.ajax-scaffold .ajax-scaffold .ajax-scaffold-header div.actions a {
|
89
|
+
font: bold 11px verdana, sans-serif;
|
90
|
+
padding: 0 2px 1px 17px;
|
91
|
+
}
|
92
|
+
|
93
|
+
.ajax-scaffold .ajax-scaffold .ajax-scaffold-header div.actions {
|
94
|
+
top: 4px;
|
95
|
+
}
|
96
|
+
|
72
97
|
/* Table Column Headers
|
73
98
|
============================= */
|
74
99
|
|
75
100
|
.ajax-scaffold th {
|
76
|
-
font-size: 11px;
|
77
|
-
color: #fff;
|
78
101
|
background: #555;
|
79
|
-
letter-spacing: 0;
|
80
|
-
font-family: Arial, sans-serif;
|
81
102
|
text-align: left;
|
82
103
|
}
|
83
104
|
|
105
|
+
.ajax-scaffold th a,
|
106
|
+
.ajax-scaffold th p {
|
107
|
+
font: bold 11px arial, sans-serif;
|
108
|
+
display: block;
|
109
|
+
background: #555;
|
110
|
+
}
|
111
|
+
|
84
112
|
.ajax-scaffold th a {
|
85
113
|
color: #fff;
|
86
114
|
padding: 2px 15px 2px 5px;
|
87
|
-
|
115
|
+
}
|
116
|
+
|
117
|
+
.ajax-scaffold th p {
|
118
|
+
color: #eee;
|
119
|
+
padding: 2px 5px;
|
88
120
|
}
|
89
121
|
|
90
122
|
.ajax-scaffold th a:hover {
|
91
123
|
background: #000;
|
124
|
+
color: #ff8;
|
92
125
|
}
|
93
126
|
|
94
127
|
.ajax-scaffold th.sorted {
|
@@ -115,11 +148,11 @@ background: #333 url(/images/indicator-small.gif) right 50% no-repeat;
|
|
115
148
|
|
116
149
|
.ajax-scaffold td {
|
117
150
|
padding: 5px 4px;
|
118
|
-
border-bottom: solid 1px #C5DBF7;
|
119
151
|
color: #333;
|
120
152
|
font-family: Verdana, sans-serif;
|
121
153
|
font-size: 11px;
|
122
154
|
background-color: #E6F2FF;
|
155
|
+
border-bottom: solid 1px #C5DBF7;
|
123
156
|
border-left: solid 1px #C5DBF7;
|
124
157
|
}
|
125
158
|
|
@@ -133,18 +166,13 @@ border-left: solid 1px #ddd;
|
|
133
166
|
}
|
134
167
|
|
135
168
|
.ajax-scaffold tr td.sorted {
|
136
|
-
background-color: #
|
137
|
-
border-bottom: solid 1px #
|
169
|
+
background-color: #B9DCFF;
|
170
|
+
border-bottom: solid 1px #AFD0F5;
|
138
171
|
}
|
139
172
|
|
140
173
|
.ajax-scaffold tr.even td.sorted {
|
141
|
-
background-color: #
|
142
|
-
border-bottom: solid 1px #
|
143
|
-
}
|
144
|
-
|
145
|
-
.ajax-scaffold .update td,
|
146
|
-
.ajax-scaffold .create td {
|
147
|
-
padding: 4px;
|
174
|
+
background-color: #E6F2FF;
|
175
|
+
border-bottom: solid 1px #AFD0F5;
|
148
176
|
}
|
149
177
|
|
150
178
|
.ajax-scaffold td.empty {
|
@@ -155,44 +183,28 @@ text-align: center;
|
|
155
183
|
/* Table Actions (Edit, Delete) Styling
|
156
184
|
============================= */
|
157
185
|
|
158
|
-
.ajax-scaffold td
|
159
|
-
font: bold 11px verdana, sans-serif;
|
160
|
-
letter-spacing: -1px;
|
161
|
-
padding: 2px;
|
162
|
-
line-height: 16px;
|
163
|
-
}
|
164
|
-
|
165
|
-
.ajax-scaffold td a:hover {
|
166
|
-
background: #ff8;
|
167
|
-
}
|
168
|
-
|
169
|
-
.ajax-scaffold .update td,
|
170
|
-
.ajax-scaffold .create td {
|
171
|
-
background: #DAFFCD;
|
172
|
-
}
|
173
|
-
|
174
|
-
.ajax-scaffold .update td,
|
175
|
-
.ajax-scaffold .create td {
|
176
|
-
border-left: solid 1px #7FcF00;
|
177
|
-
border-bottom: solid 1px #7FcF00;
|
178
|
-
border-right: solid 1px #7FcF00;
|
179
|
-
}
|
180
|
-
|
181
|
-
.ajax-scaffold .actions {
|
186
|
+
.ajax-scaffold td.actions {
|
182
187
|
padding: 0;
|
183
|
-
width:
|
188
|
+
width: 1%;
|
184
189
|
}
|
185
190
|
|
186
|
-
.ajax-scaffold .actions table {
|
191
|
+
.ajax-scaffold td.actions table {
|
187
192
|
float: right;
|
188
193
|
width: auto;
|
189
194
|
margin-right: 5px;
|
190
195
|
}
|
191
196
|
|
192
|
-
.ajax-scaffold .actions table td {
|
197
|
+
.ajax-scaffold td.actions table td {
|
193
198
|
border: none;
|
194
199
|
text-align: right;
|
195
|
-
padding: 0
|
200
|
+
padding: 0 2px;
|
201
|
+
}
|
202
|
+
|
203
|
+
.ajax-scaffold td.actions a {
|
204
|
+
font: bold 11px verdana, sans-serif;
|
205
|
+
letter-spacing: -1px;
|
206
|
+
padding: 2px;
|
207
|
+
line-height: 16px;
|
196
208
|
}
|
197
209
|
|
198
210
|
/* ajax-scaffold Footer Styling
|
@@ -235,7 +247,8 @@ border-right: solid 1px #ccc;
|
|
235
247
|
/* Messages
|
236
248
|
========================= */
|
237
249
|
|
238
|
-
.ajax-scaffold .messages-container
|
250
|
+
.ajax-scaffold .messages-container,
|
251
|
+
.ajax-scaffold .ajax-scaffold .messages-container{
|
239
252
|
padding: 0;
|
240
253
|
margin: 0 7px;
|
241
254
|
border: none;
|
@@ -356,6 +369,21 @@ margin-bottom: 3px;
|
|
356
369
|
|
357
370
|
/* Form Styling
|
358
371
|
============================== */
|
372
|
+
|
373
|
+
.ajax-scaffold td.update,
|
374
|
+
.ajax-scaffold td.create {
|
375
|
+
background: #DAFFCD;
|
376
|
+
padding: 4px;
|
377
|
+
border: solid 1px #7FcF00;
|
378
|
+
border-top: none;
|
379
|
+
}
|
380
|
+
|
381
|
+
.ajax-scaffold .ajax-scaffold td.update,
|
382
|
+
.ajax-scaffold .ajax-scaffold td.create {
|
383
|
+
background: #ffb;
|
384
|
+
border: solid 1px #DDDF37;
|
385
|
+
border-top: none;
|
386
|
+
}
|
359
387
|
|
360
388
|
.ajax-scaffold .submit {
|
361
389
|
font-weight: bold;
|
@@ -389,11 +417,8 @@ letter-spacing: -1px;
|
|
389
417
|
font: bold 16px arial;
|
390
418
|
}
|
391
419
|
|
392
|
-
.ajax-scaffold .
|
393
|
-
|
394
|
-
font-size: 14px;
|
395
|
-
font-weight: bold;
|
396
|
-
font-family: Arial, sans-serif;
|
420
|
+
.ajax-scaffold p.form-footer a {
|
421
|
+
font: bold 14px arial, sans-serif;
|
397
422
|
letter-spacing: 0;
|
398
423
|
}
|
399
424
|
|
data/templates/ajax_scaffold.js
CHANGED
data/templates/controller.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class <%= controller_class_name %>Controller < ApplicationController
|
2
|
-
include
|
2
|
+
include AjaxScaffold::Controller
|
3
3
|
|
4
4
|
after_filter :clear_flashes
|
5
5
|
|
@@ -32,15 +32,15 @@ class <%= controller_class_name %>Controller < ApplicationController
|
|
32
32
|
else
|
33
33
|
# If this is from a client without javascript we want to update the session parameters and then delegate
|
34
34
|
# back to whatever page is displaying the scaffold, which will then rerender all scaffolds with these update parameters
|
35
|
-
update_params :default_scaffold_id => "<%= singular_name %>", :default_sort =>
|
35
|
+
update_params :default_scaffold_id => "<%= singular_name %>", :default_sort => nil, :default_sort_direction => "asc"
|
36
36
|
return_to_main
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
def component
|
41
|
-
update_params :default_scaffold_id => "<%= singular_name %>", :default_sort =>
|
42
|
-
|
43
|
-
@sort_by =
|
41
|
+
update_params :default_scaffold_id => "<%= singular_name %>", :default_sort => nil, :default_sort_direction => "asc"
|
42
|
+
|
43
|
+
@sort_by = current_sort(params).nil? ? "<%= plural_name %>.id asc" : <%= model_name %>.scaffold_columns_hash[current_sort(params)].sort_sql + " " + current_sort_direction(params)
|
44
44
|
@paginator, @<%= plural_name %> = paginate(:<%= plural_name %>, :order_by => @sort_by, :per_page => default_per_page)
|
45
45
|
|
46
46
|
render :action => "component", :layout => false
|
@@ -126,4 +126,12 @@ class <%= controller_class_name %>Controller < ApplicationController
|
|
126
126
|
# Javascript disabled fallback
|
127
127
|
return_to_main
|
128
128
|
end
|
129
|
+
|
130
|
+
def cancel
|
131
|
+
@successful = true
|
132
|
+
|
133
|
+
return if request.xhr?
|
134
|
+
|
135
|
+
return_to_main
|
136
|
+
end
|
129
137
|
end
|
data/templates/helper.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
module <%= controller_class_name %>Helper
|
2
|
-
include
|
2
|
+
include AjaxScaffold::Helper
|
3
3
|
|
4
4
|
def num_columns
|
5
|
-
|
5
|
+
scaffold_columns.length + 1
|
6
|
+
end
|
7
|
+
|
8
|
+
def scaffold_columns
|
9
|
+
<%= model_name %>.scaffold_columns
|
6
10
|
end
|
7
11
|
|
8
12
|
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
module AjaxScaffold
|
2
|
+
|
3
|
+
class ScaffoldColumn
|
4
|
+
|
5
|
+
attr_reader :name, :eval, :sort_sql, :label
|
6
|
+
|
7
|
+
# Only options[:name] is required. It will infer the eval and sort values
|
8
|
+
# based on the given class.
|
9
|
+
def initialize(klass, options)
|
10
|
+
@name = options[:name]
|
11
|
+
@eval = options[:eval].nil? ? klass.to_s.downcase + "." + @name : options[:eval]
|
12
|
+
@label = options[:label].nil? ? Inflector.titleize(@name) : options[:label]
|
13
|
+
@sortable = options[:sortable].nil? ? true : options[:sortable]
|
14
|
+
@sort_sql = options[:sort_sql].nil? ? Inflector.tableize(klass.to_s) + "." + @name : options[:sort_sql] unless !@sortable
|
15
|
+
end
|
16
|
+
|
17
|
+
def sortable?
|
18
|
+
@sortable
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
module Model
|
24
|
+
module ClassMethods
|
25
|
+
|
26
|
+
def build_scaffold_columns
|
27
|
+
scaffold_columns = Array.new
|
28
|
+
content_columns.each do |column|
|
29
|
+
scaffold_columns << ScaffoldColumn.new(self, { :name => column.name })
|
30
|
+
end
|
31
|
+
scaffold_columns
|
32
|
+
end
|
33
|
+
|
34
|
+
def build_scaffold_columns_hash
|
35
|
+
scaffold_columns_hash = Hash.new
|
36
|
+
scaffold_columns.each do |scaffold_column|
|
37
|
+
scaffold_columns_hash[scaffold_column.name] = scaffold_column
|
38
|
+
end
|
39
|
+
scaffold_columns_hash
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module Common
|
45
|
+
def current_sort(params)
|
46
|
+
session[params[:scaffold_id]][:sort]
|
47
|
+
end
|
48
|
+
|
49
|
+
def current_sort_direction(params)
|
50
|
+
session[params[:scaffold_id]][:sort_direction]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module Controller
|
55
|
+
include AjaxScaffold::Common
|
56
|
+
|
57
|
+
def default_per_page
|
58
|
+
25
|
59
|
+
end
|
60
|
+
|
61
|
+
def clear_flashes
|
62
|
+
#We want to clear flashes so they don't appear on a page reload
|
63
|
+
if request.xhr?
|
64
|
+
flash.keys.each do |flash_key|
|
65
|
+
flash[flash_key] = nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def store_or_get_from_session(id_key, value_key)
|
71
|
+
session[id_key][value_key] = params[value_key] if !params[value_key].nil?
|
72
|
+
params[value_key] ||= session[id_key][value_key]
|
73
|
+
end
|
74
|
+
|
75
|
+
def update_params(options)
|
76
|
+
@scaffold_id = params[:scaffold_id] ||= options[:default_scaffold_id]
|
77
|
+
session[@scaffold_id] ||= {:sort => options[:default_sort], :sort_direction => options[:default_sort_direction], :page => 1}
|
78
|
+
|
79
|
+
store_or_get_from_session(@scaffold_id, :sort)
|
80
|
+
store_or_get_from_session(@scaffold_id, :sort_direction)
|
81
|
+
store_or_get_from_session(@scaffold_id, :page)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
module Helper
|
87
|
+
include AjaxScaffold::Common
|
88
|
+
|
89
|
+
def format_column(column_value)
|
90
|
+
if column_empty?(column_value)
|
91
|
+
empty_column_text
|
92
|
+
elsif column_value.instance_of? Time
|
93
|
+
format_time(column_value)
|
94
|
+
elsif column_value.instance_of? Date
|
95
|
+
format_date(column_value)
|
96
|
+
else
|
97
|
+
column_value.to_s
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def format_time(time)
|
102
|
+
time.strftime("%m/%d/%Y %I:%M %p")
|
103
|
+
end
|
104
|
+
|
105
|
+
def format_date(date)
|
106
|
+
date.strftime("%m/%d/%Y")
|
107
|
+
end
|
108
|
+
|
109
|
+
def column_empty?(column_value)
|
110
|
+
column_value.nil? || (column_value.empty? rescue false)
|
111
|
+
end
|
112
|
+
|
113
|
+
def empty_column_text
|
114
|
+
"-"
|
115
|
+
end
|
116
|
+
|
117
|
+
# Generates a temporary id for creating a new element
|
118
|
+
def generate_temporary_id
|
119
|
+
(Time.now.to_f*1000).to_i.to_s
|
120
|
+
end
|
121
|
+
|
122
|
+
def pagination_ajax_links(paginator, params)
|
123
|
+
pagination_links_each(paginator, {}) do |n|
|
124
|
+
link_to_remote n,
|
125
|
+
{ :url => params.merge(:page => n ),
|
126
|
+
:loading => "Element.show('#{loading_indicator_id(params.merge(:action => 'pagination'))}');",
|
127
|
+
:update => scaffold_content_id(params) },
|
128
|
+
{ :href => url_for(params.merge(:page => n )) }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def column_sort_direction(column_name, params)
|
133
|
+
column_name && current_sort_direction(params) == "asc" ? "desc" : "asc"
|
134
|
+
end
|
135
|
+
|
136
|
+
def column_class(column_name, column_value, sort_column)
|
137
|
+
class_name = String.new
|
138
|
+
class_name += "empty " if column_empty?(column_value)
|
139
|
+
class_name += "sorted " if (!sort_column.nil? && column_name == sort_column)
|
140
|
+
class_name
|
141
|
+
end
|
142
|
+
|
143
|
+
def loading_indicator_tag(options)
|
144
|
+
image_filename = "indicator.gif"
|
145
|
+
"<img src=\"/images/#{image_filename}\" style=\"display: none;\" id=\"#{loading_indicator_id(options)}\" alt=\"loading indicator\" class=\"loading-indicator\" />"
|
146
|
+
end
|
147
|
+
|
148
|
+
# The following are a bunch of helper methods to produce the common scaffold view id's
|
149
|
+
|
150
|
+
def scaffold_content_id(options)
|
151
|
+
"#{options[:scaffold_id]}-content"
|
152
|
+
end
|
153
|
+
|
154
|
+
def scaffold_column_header_id(options)
|
155
|
+
"#{options[:scaffold_id]}-#{options[:column_name]}"
|
156
|
+
end
|
157
|
+
|
158
|
+
def scaffold_tbody_id(options)
|
159
|
+
"#{options[:scaffold_id]}-tbody"
|
160
|
+
end
|
161
|
+
|
162
|
+
def scaffold_messages_id(options)
|
163
|
+
"#{options[:scaffold_id]}-messages"
|
164
|
+
end
|
165
|
+
|
166
|
+
def empty_message_id(options)
|
167
|
+
"#{options[:scaffold_id]}-empty-message"
|
168
|
+
end
|
169
|
+
|
170
|
+
def element_row_id(options)
|
171
|
+
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}"
|
172
|
+
end
|
173
|
+
|
174
|
+
def element_cell_id(options)
|
175
|
+
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-cell"
|
176
|
+
end
|
177
|
+
|
178
|
+
def element_form_id(options)
|
179
|
+
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-form"
|
180
|
+
end
|
181
|
+
|
182
|
+
def loading_indicator_id(options)
|
183
|
+
if options[:id].nil?
|
184
|
+
"#{options[:scaffold_id]}-#{options[:action]}-loading-indicator"
|
185
|
+
else
|
186
|
+
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-loading-indicator"
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def element_messages_id(options)
|
191
|
+
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-messages"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
class ActiveRecord::Base
|
197
|
+
extend AjaxScaffold::Model::ClassMethods
|
198
|
+
|
199
|
+
@scaffold_columns = nil
|
200
|
+
def self.scaffold_columns
|
201
|
+
@scaffold_columns ||= build_scaffold_columns
|
202
|
+
end
|
203
|
+
|
204
|
+
@scaffold_columns_hash = nil
|
205
|
+
def self.scaffold_columns_hash
|
206
|
+
@scaffold_columns_hash ||= build_scaffold_columns_hash
|
207
|
+
end
|
208
|
+
end
|
data/templates/model.rb
ADDED
@@ -1,13 +1,17 @@
|
|
1
|
-
<%%
|
2
|
-
|
3
|
-
|
4
|
-
<%%
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
<%% for scaffold_column in scaffold_columns %>
|
2
|
+
<%% column_sort_direction = column_sort_direction(scaffold_column.name, params) %>
|
3
|
+
<%% sort_params = params.merge(:controller => '<%= controller_file_path %>', :action => 'component_update', :sort => scaffold_column.name, :sort_direction => column_sort_direction, :page => 1) %>
|
4
|
+
<%% column_header_id = scaffold_column_header_id(sort_params.merge(:column_name => scaffold_column.name)) %>
|
5
|
+
<th id="<%%= column_header_id %>" <%%= "class=\"sorted #{current_sort_direction(params)}\"" if scaffold_column.name == current_sort(params) %>>
|
6
|
+
<%% if scaffold_column.sortable? %>
|
7
|
+
<%%= link_to_remote scaffold_column.label,
|
8
8
|
{ :url => sort_params,
|
9
|
-
:loading => "Element.addClassName('#{
|
9
|
+
:loading => "Element.addClassName('#{column_header_id}','loading');",
|
10
10
|
:update => scaffold_content_id(sort_params) },
|
11
|
-
{ :href => url_for(sort_params) }
|
11
|
+
{ :href => url_for(sort_params) } %>
|
12
|
+
<%% else %>
|
13
|
+
<p><%%= scaffold_column.label %></p>
|
14
|
+
<%% end %>
|
15
|
+
</th>
|
12
16
|
<%% end %>
|
13
17
|
<th></th>
|
@@ -3,10 +3,10 @@
|
|
3
3
|
<%% @options = params.merge(:controller => '<%= controller_file_path %>', :action => "view", :id => <%= singular_name %>.id) %>
|
4
4
|
|
5
5
|
<tr <%%= classAttr %> id="<%%= element_row_id(@options) %>" <%%= "style=\"display: none;\"" if hidden %>>
|
6
|
-
<%% for
|
7
|
-
<%% column_value =
|
8
|
-
<td class="<%%= column_class(
|
9
|
-
<%%=
|
6
|
+
<%% for scaffold_column in scaffold_columns %>
|
7
|
+
<%% column_value = eval(scaffold_column.eval) rescue nil %>
|
8
|
+
<td class="<%%= column_class(scaffold_column.name, column_value, current_sort(params)) %>" >
|
9
|
+
<%%= format_column(column_value) %>
|
10
10
|
</td>
|
11
11
|
<%% end %>
|
12
12
|
<td class="actions">
|
@@ -2,8 +2,8 @@
|
|
2
2
|
<table class="ajax-scaffold" cellpadding="0" cellspacing="0">
|
3
3
|
<tbody>
|
4
4
|
<%% end %>
|
5
|
-
<tr id="<%%= element_row_id(@options) %>"
|
6
|
-
<td id="<%%= element_cell_id(@options) %>" colspan="<%%= num_columns %>">
|
5
|
+
<tr id="<%%= element_row_id(@options) %>" <%%= "style=\"display:none;\"" if request.xhr? %>>
|
6
|
+
<td id="<%%= element_cell_id(@options) %>" class="<%%= @options[:action] %>" colspan="<%%= num_columns %>">
|
7
7
|
|
8
8
|
<%%= form_remote_tag :url => @options.merge(:controller => '<%= controller_file_path %>'),
|
9
9
|
:loading => "Element.show('#{loading_indicator_id(@options)}');",
|
@@ -22,17 +22,19 @@
|
|
22
22
|
|
23
23
|
<%%= render :partial => 'form' %>
|
24
24
|
|
25
|
-
<p>
|
25
|
+
<p class="form-footer">
|
26
26
|
<%%= submit_tag Inflector.titleize(@options[:action]), :class => "submit" %>
|
27
|
-
<%%
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
<%%= link_to_function "Cancel", on_cancel,
|
33
|
-
:href => url_for(:controller => '<%= controller_file_path %>', :action => 'return_to_main') %>
|
27
|
+
<%% cancel_params = @options.merge(:controller => '<%= controller_file_path %>', :action => 'cancel', :referring_action => @options[:action]) %>
|
28
|
+
<%%= link_to_remote "Cancel",
|
29
|
+
{ :url => cancel_params,
|
30
|
+
:loading => "Element.show('#{loading_indicator_id(@options)}');" },
|
31
|
+
{ :href => url_for(cancel_params) } %>
|
34
32
|
<%%= loading_indicator_tag @options %>
|
35
33
|
</p>
|
36
34
|
<%%= end_form_tag %>
|
37
35
|
</td>
|
38
36
|
</tr>
|
37
|
+
<%% if not request.xhr? %>
|
38
|
+
</tbody>
|
39
|
+
</table>
|
40
|
+
<%% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
@options = { :scaffold_id => params[:scaffold_id], :action => params[:referring_action], :id => params[:id] }
|
2
|
+
|
3
|
+
if @successful
|
4
|
+
page.remove element_row_id(@options)
|
5
|
+
if @options[:action] == "update"
|
6
|
+
page.show element_row_id(@options.merge(:action => "view"))
|
7
|
+
elsif @options[:action] == "create"
|
8
|
+
page << "AjaxScaffold.displayMessageIfEmpty('#{scaffold_tbody_id(@options)}','#{empty_message_id(@options)}');"
|
9
|
+
end
|
10
|
+
else
|
11
|
+
page.hide loading_indicator_id(@options)
|
12
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ajax_scaffold_generator
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 3.0
|
7
|
-
date: 2006-04-
|
6
|
+
version: 3.1.0
|
7
|
+
date: 2006-04-18 00:00:00 -04:00
|
8
8
|
summary: Ajax scaffold generator is a rails generator for ajaxified scaffolds
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,11 +35,13 @@ files:
|
|
35
35
|
- templates/warning.gif
|
36
36
|
- templates/view_list.rhtml
|
37
37
|
- templates/view_component.rhtml
|
38
|
+
- templates/unit_test.rb
|
38
39
|
- templates/rjs_update.rjs
|
39
40
|
- templates/rjs_new.rjs
|
40
41
|
- templates/rjs_edit.rjs
|
41
42
|
- templates/rjs_destroy.rjs
|
42
43
|
- templates/rjs_create.rjs
|
44
|
+
- templates/rjs_cancel.rjs
|
43
45
|
- templates/rico_corner.js
|
44
46
|
- templates/partial_pagination_links.rhtml
|
45
47
|
- templates/partial_new_edit.rhtml
|
@@ -47,8 +49,10 @@ files:
|
|
47
49
|
- templates/partial_item.rhtml
|
48
50
|
- templates/partial_form_messages.rhtml
|
49
51
|
- templates/partial_column_headings.rhtml
|
52
|
+
- templates/model.rb
|
50
53
|
- templates/lib_content_column_patch.rb
|
51
54
|
- templates/lib_ajax_scaffold_util.rb
|
55
|
+
- templates/lib_ajax_scaffold.rb
|
52
56
|
- templates/layout.rhtml
|
53
57
|
- templates/information.gif
|
54
58
|
- templates/indicator.gif
|
@@ -57,11 +61,11 @@ files:
|
|
57
61
|
- templates/functional_test.rb
|
58
62
|
- templates/form_scaffolding.rhtml
|
59
63
|
- templates/form.rhtml
|
64
|
+
- templates/fixtures.yml
|
60
65
|
- templates/error.gif
|
61
66
|
- templates/controller.rb
|
62
67
|
- templates/arrow_up.gif
|
63
68
|
- templates/arrow_down.gif
|
64
|
-
- templates/ajax_scaffold_helper.rb
|
65
69
|
- templates/ajax_scaffold.js
|
66
70
|
- templates/ajax_scaffold.css
|
67
71
|
- templates/add.gif
|
@@ -1,99 +0,0 @@
|
|
1
|
-
module AjaxScaffoldHelper
|
2
|
-
|
3
|
-
def column_value(data_object, column)
|
4
|
-
column_value = data_object.send(column.name)
|
5
|
-
|
6
|
-
if column_value.instance_of? Time
|
7
|
-
column_value = format_time(column_value)
|
8
|
-
elsif column_value.instance_of? Date
|
9
|
-
column_value = format_date(column_value)
|
10
|
-
end
|
11
|
-
|
12
|
-
column_value
|
13
|
-
end
|
14
|
-
|
15
|
-
def format_time(time)
|
16
|
-
time.strftime("%m/%d/%Y %I:%M %p")
|
17
|
-
end
|
18
|
-
|
19
|
-
def format_date(date)
|
20
|
-
date.strftime("%m/%d/%Y")
|
21
|
-
end
|
22
|
-
|
23
|
-
# Generates a temporary id for creating a new element
|
24
|
-
def generate_temporary_id
|
25
|
-
(Time.now.to_f*1000).to_i.to_s
|
26
|
-
end
|
27
|
-
|
28
|
-
def pagination_ajax_links(paginator, params)
|
29
|
-
pagination_links_each(paginator, {}) do |n|
|
30
|
-
link_to_remote n,
|
31
|
-
{ :url => params.merge(:page => n ),
|
32
|
-
:update => scaffold_content_id(params) },
|
33
|
-
{ :href => url_for(params.merge(:page => n )) }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def column_class(column_name, column_value, sort_column)
|
38
|
-
class_name = String.new
|
39
|
-
class_name += "empty " if column_empty?(column_value)
|
40
|
-
class_name += "sorted " if (!sort_column.nil? && column_name == sort_column)
|
41
|
-
class_name
|
42
|
-
end
|
43
|
-
|
44
|
-
def column_empty?(column_value)
|
45
|
-
column_value.nil? || (column_value.empty? rescue false)
|
46
|
-
end
|
47
|
-
|
48
|
-
def loading_indicator_tag(options)
|
49
|
-
image_filename = "indicator.gif"
|
50
|
-
"<img src=\"/images/#{image_filename}\" style=\"display: none;\" id=\"#{loading_indicator_id(options)}\" alt=\"loading indicator\" class=\"loading-indicator\" />"
|
51
|
-
end
|
52
|
-
|
53
|
-
# The following are a bunch of helper methods to produce the common scaffold view id's
|
54
|
-
|
55
|
-
def scaffold_content_id(options)
|
56
|
-
"#{options[:scaffold_id]}-content"
|
57
|
-
end
|
58
|
-
|
59
|
-
def scaffold_column_header_id(options)
|
60
|
-
"#{options[:scaffold_id]}-#{options[:column_name]}"
|
61
|
-
end
|
62
|
-
|
63
|
-
def scaffold_tbody_id(options)
|
64
|
-
"#{options[:scaffold_id]}-tbody"
|
65
|
-
end
|
66
|
-
|
67
|
-
def scaffold_messages_id(options)
|
68
|
-
"#{options[:scaffold_id]}-messages"
|
69
|
-
end
|
70
|
-
|
71
|
-
def empty_message_id(options)
|
72
|
-
"#{options[:scaffold_id]}-empty-message"
|
73
|
-
end
|
74
|
-
|
75
|
-
def element_row_id(options)
|
76
|
-
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}"
|
77
|
-
end
|
78
|
-
|
79
|
-
def element_cell_id(options)
|
80
|
-
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-cell"
|
81
|
-
end
|
82
|
-
|
83
|
-
def element_form_id(options)
|
84
|
-
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-form"
|
85
|
-
end
|
86
|
-
|
87
|
-
def loading_indicator_id(options)
|
88
|
-
if options[:id].nil?
|
89
|
-
"#{options[:scaffold_id]}-#{options[:action]}-loading-indicator"
|
90
|
-
else
|
91
|
-
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-loading-indicator"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def element_messages_id(options)
|
96
|
-
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-messages"
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|