cuca 0.05 → 0.06
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +12 -3
- data/README +34 -0
- data/application_skeleton/app/index.rb +1 -1
- data/application_skeleton/scripts/console.rb +1 -1
- data/lib/cuca/app.rb +9 -11
- data/lib/cuca/const.rb +1 -1
- data/lib/cuca/controller.rb +9 -3
- data/lib/cuca/generator/markaby.rb +16 -13
- data/lib/cuca/generator/view.rb +17 -18
- data/lib/cuca/sessionpage.rb +6 -1
- data/lib/cuca/stdlib/arform.rb +54 -178
- data/lib/cuca/stdlib/form.rb +120 -90
- data/lib/cuca/stdlib/formelements.rb +135 -0
- data/lib/cuca/stdlib/listwidget/dblist.rb +10 -5
- data/lib/cuca/stdlib/listwidget/list.rb +37 -68
- data/lib/cuca/stdlib/listwidget/querydef.rb +5 -4
- data/lib/cuca/stdlib/old_arform.rb +254 -0
- data/lib/cuca/test/helpers.rb +3 -2
- data/lib/cuca_console.rb +2 -0
- data/tests/controller.rb +37 -0
- metadata +71 -65
data/CHANGELOG
CHANGED
@@ -1,13 +1,22 @@
|
|
1
|
+
* 2009/03/04 - 0.06
|
2
|
+
- Fixed sorting bug of filters with priority specified
|
3
|
+
- Nicer pagination on listwidget for large lists
|
4
|
+
- Allowing to tune default query definitions on listwidget
|
5
|
+
- Fixed bad rescue of NameError which resulted in misleading exception tracebacks
|
6
|
+
- Catch exceptions on loading/parsing the controller code
|
7
|
+
- Changed FormWidget and ARFormWidget, added FormElements module
|
8
|
+
- 'stop' can switch off after filters with :no_after_filters option
|
9
|
+
- Console will automatically load root support files
|
10
|
+
- Delete method for session.page variables
|
1
11
|
|
2
|
-
*
|
3
|
-
- Widget can be
|
12
|
+
* 2008/08/20 - 0.05
|
13
|
+
- Widget definition can be done within the action controller file.
|
4
14
|
- Fixed minor typos in application skeleton conf/config.rb
|
5
15
|
- Fix to catch exceptions in conf/config and conf/environment
|
6
16
|
- Fixes & minor changes in stdlib/form
|
7
17
|
- Stdlib listwidget rewrite_hooks will pass named hash instead of plain array
|
8
18
|
as row data
|
9
19
|
- fixed script/console to load support files
|
10
|
-
- Fixed bad error rescueing in generators that displayed irritating errors
|
11
20
|
|
12
21
|
* 2008/06/17 - 0.04
|
13
22
|
- Fixed error-message displaying traceback but not the actual exception
|
data/README
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
== Installing Cuca
|
3
|
+
|
4
|
+
To use the source code you can simply run:
|
5
|
+
sudo renew.sh
|
6
|
+
|
7
|
+
To install the gem from the internet use
|
8
|
+
gem install --remote cuca
|
9
|
+
|
10
|
+
See http://cuca.rubyforge.org for more information how to get started.
|
11
|
+
|
12
|
+
|
13
|
+
== Coding on the Framework
|
14
|
+
|
15
|
+
You can tell your application to load the cuca framework from a
|
16
|
+
different location instead from rubygems. For that create a new dispatcher
|
17
|
+
cgi script, a minimal version would be:
|
18
|
+
|
19
|
+
#!/usr/bin/ruby
|
20
|
+
|
21
|
+
FRAMEWORK_PATH = '/home/bones/path/to/cuca-framework/lib'
|
22
|
+
$: << FRAMEWORK_PATH
|
23
|
+
|
24
|
+
require 'cuca'
|
25
|
+
require 'rubygems'
|
26
|
+
|
27
|
+
application = Cuca::App.new
|
28
|
+
application.cgicall
|
29
|
+
|
30
|
+
|
31
|
+
And tell your webserver to use this new handler (or edit the script/server*
|
32
|
+
files).
|
33
|
+
|
34
|
+
|
@@ -17,7 +17,7 @@ class IndexController < ApplicationController
|
|
17
17
|
h2 { "If you want to learn cuca" }
|
18
18
|
ul do
|
19
19
|
li { text "Have a look at the Demo Widgets: "; SLink('demo', 'Here') }
|
20
|
-
li { text "Checkout the cuca website: "; SLink("http://cuca.rubyforge.
|
20
|
+
li { text "Checkout the cuca website: "; SLink("http://cuca.rubyforge.net") }
|
21
21
|
li { text "Read the source code of these examples" }
|
22
22
|
end
|
23
23
|
|
data/lib/cuca/app.rb
CHANGED
@@ -232,7 +232,7 @@ class App
|
|
232
232
|
# 3rd: Load additional files
|
233
233
|
load_support_files(@urlmap)
|
234
234
|
|
235
|
-
|
235
|
+
test = ApplicationController.new
|
236
236
|
|
237
237
|
|
238
238
|
# 4th: Now let's run the actual page script code
|
@@ -245,20 +245,18 @@ class App
|
|
245
245
|
controller_module = @urlmap.action_module
|
246
246
|
|
247
247
|
|
248
|
-
|
248
|
+
# things fail in this block get error logged and/or displayed in browser
|
249
|
+
begin
|
250
|
+
# load controller
|
251
|
+
controller_module.module_eval(File.open(script).read, script) unless \
|
249
252
|
controller_module.const_defined?(controller_class_name.intern)
|
250
253
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
return
|
255
|
-
end
|
254
|
+
# Catch a common user error
|
255
|
+
raise Cuca::ApplicationException.new("Could not find #{controller_class_name} defined in #{script}") \
|
256
|
+
unless controller_module.const_defined?(controller_class_name.intern)
|
256
257
|
|
257
|
-
#
|
258
|
-
# Load the controller
|
259
|
-
#
|
260
|
-
begin
|
261
258
|
|
259
|
+
# run controller
|
262
260
|
(status, mime, content) = Sandbox.run(controller_class_name,
|
263
261
|
@urlmap.action_module, @urlmap.assigns,
|
264
262
|
@cgi.request_method, @urlmap.subcall)
|
data/lib/cuca/const.rb
CHANGED
data/lib/cuca/controller.rb
CHANGED
@@ -197,7 +197,7 @@ class Controller < Widget
|
|
197
197
|
filters << [mp[0], mp[1]]
|
198
198
|
end
|
199
199
|
|
200
|
-
sorted_filters = filters.sort { |a,b| a[1] <=> b[1] }
|
200
|
+
sorted_filters = filters.sort { |a,b| a[1].to_i <=> b[1].to_i }
|
201
201
|
|
202
202
|
sorted_filters.each do |f|
|
203
203
|
break if @cancel_execution
|
@@ -226,7 +226,8 @@ class Controller < Widget
|
|
226
226
|
# run defined after_filters
|
227
227
|
public
|
228
228
|
def run_after_filters
|
229
|
-
run_filters(:def_after_filter, 'After Filters')
|
229
|
+
run_filters(:def_after_filter, 'After Filters') \
|
230
|
+
unless @_stop_no_after_filters
|
230
231
|
ce = @cancel_execution
|
231
232
|
@cancel_execution = false
|
232
233
|
run_filters(:def_priority_after_filter, 'Priority After Filters')
|
@@ -238,9 +239,10 @@ class Controller < Widget
|
|
238
239
|
# it's usefull to break somewhere in the middle or to
|
239
240
|
# set a different layout
|
240
241
|
# flags can be
|
241
|
-
# :layout - Set a new layout
|
242
|
+
# :layout - Set a new layout, or 'false' for no layout
|
242
243
|
# :redirect - redirect to a different page
|
243
244
|
# :error - An error message (for application errors)
|
245
|
+
# :no_after_filters - Do not execute any after filters defined
|
244
246
|
def stop(flags = {})
|
245
247
|
raise BreakControllerException.new(flags)
|
246
248
|
end
|
@@ -252,6 +254,10 @@ class Controller < Widget
|
|
252
254
|
@_layout = e.flags[:layout]
|
253
255
|
end
|
254
256
|
|
257
|
+
if e.flags.has_key?(:no_after_filters) then
|
258
|
+
@_stop_no_after_filters = true
|
259
|
+
end
|
260
|
+
|
255
261
|
if e.flags.has_key?(:redirect) then
|
256
262
|
@_layout = false
|
257
263
|
to = e.flags[:redirect]
|
@@ -8,21 +8,24 @@ class ::Markaby::Builder # :nodoc:
|
|
8
8
|
def method_missing(sym, *args, &block ) # :nodoc:
|
9
9
|
class_name = sym.id2name
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
return old_method_missing(sym, *args, &block) if
|
12
|
+
(class_name[0].chr.upcase != class_name[0].chr)
|
13
|
+
|
14
|
+
if Object.const_defined?(class_name+'Widget') then
|
15
|
+
c = Object::const_get(class_name+"Widget")
|
16
|
+
else
|
17
|
+
# try to find the widget in the action namespace
|
18
|
+
return old_method_missing(sym, *args,&block) if $app.nil?
|
19
|
+
|
20
|
+
am = $app.urlmap.action_module
|
21
|
+
if am.const_defined?(class_name+'Widget') then
|
22
|
+
c = am.const_get(class_name+'Widget')
|
23
|
+
else
|
24
|
+
return old_method_missing(sym, *args, &block)
|
25
|
+
end
|
23
26
|
end
|
24
27
|
|
25
|
-
|
28
|
+
# $stderr.puts "Widget in markaby: Class: #{class_name}, \n\n assigns: #{@assigns.inspect} \n\n"
|
26
29
|
|
27
30
|
widget = c.new({:args => args,
|
28
31
|
:assigns => @assigns },
|
data/lib/cuca/generator/view.rb
CHANGED
@@ -52,37 +52,36 @@ module View
|
|
52
52
|
@base = base_object
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
55
|
def method_missing(sym, *args, &block )
|
58
56
|
class_name = sym.id2name
|
59
|
-
|
60
|
-
# $stderr.puts "View: Method missing: #{class_name}: #{@base.class.name}"
|
61
57
|
|
58
|
+
|
62
59
|
# 1st try to find method in the base widget
|
63
60
|
if @base.methods.include?(class_name) then
|
64
|
-
|
61
|
+
return @base.send(class_name, *args, &block)
|
65
62
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
63
|
+
c = nil
|
64
|
+
# 2nd try to find a widget
|
65
|
+
if Object.const_defined?(class_name+'Widget') then
|
66
|
+
c = Object::const_get(class_name+'Widget')
|
67
|
+
else
|
68
|
+
# ...try to find in action namespace
|
69
|
+
mod = $app.urlmap.action_module
|
70
|
+
c = mod.const_get(class_name+'Widget') if mod.const_defined?(class_name+'Widget')
|
73
71
|
end
|
74
|
-
|
75
|
-
raise "Undefined method: #{
|
76
|
-
|
72
|
+
|
73
|
+
raise NameError.new "Undefined method: #{class_name}" unless c
|
74
|
+
|
77
75
|
widget = c.new({:args => args,
|
78
76
|
:assigns => @assigns },
|
79
77
|
&block)
|
80
78
|
|
81
|
-
|
79
|
+
# $stderr.puts "Widget:" + widget.inspect
|
82
80
|
return widget.to_s
|
81
|
+
|
82
|
+
# $stderr.puts "Good"
|
83
83
|
end
|
84
|
-
|
85
|
-
|
84
|
+
end
|
86
85
|
|
87
86
|
# VIEW_DIR = $cuca_path+'app/_views'
|
88
87
|
|
data/lib/cuca/sessionpage.rb
CHANGED
@@ -18,7 +18,7 @@ class SessionPage
|
|
18
18
|
@ses = session
|
19
19
|
@ses[:SessionPage] ||= {}
|
20
20
|
pagemem[pagekey] ||= {}
|
21
|
-
session.cgi.parameters.each_pair { |k,v| self[k] = v }
|
21
|
+
session.cgi.parameters.each_pair { |k,v| self[k] = v if v.kind_of?(String) }
|
22
22
|
expire
|
23
23
|
end
|
24
24
|
|
@@ -29,6 +29,11 @@ class SessionPage
|
|
29
29
|
def []=(key,value)
|
30
30
|
pagemem[pagekey][key] = value
|
31
31
|
end
|
32
|
+
|
33
|
+
# remove a variable from page memory
|
34
|
+
def delete(key)
|
35
|
+
pagemem[pagekey].delete(key)
|
36
|
+
end
|
32
37
|
|
33
38
|
private
|
34
39
|
def expire
|
data/lib/cuca/stdlib/arform.rb
CHANGED
@@ -1,64 +1,65 @@
|
|
1
1
|
require 'cuca/stdlib/form'
|
2
2
|
require 'cuca/stdlib/formerrors'
|
3
|
+
require 'cuca/stdlib/formelements'
|
3
4
|
require 'cuca/generator/markaby'
|
4
5
|
|
5
6
|
# == Form's for ActiveRecord
|
6
|
-
# AR Form
|
7
|
+
# AR Form build a form by providing one model of ActiveRecord.
|
7
8
|
# Likly that you want to overwrite the form method to
|
8
|
-
# run a custom layout.
|
9
|
-
# build form elements for the model columns definition.
|
9
|
+
# run a custom layout.
|
10
10
|
#
|
11
11
|
# This Widget will call <form_name>_submit(model) if Form is submitted
|
12
|
-
# and validation passed. You still have to
|
12
|
+
# and validation of the model is passed. You still have to save the model.
|
13
13
|
#
|
14
14
|
# = Example:
|
15
15
|
#
|
16
16
|
# ARForm('user_edit', User.find_by_username('bones'),
|
17
17
|
# :disable_on_update => ['username', 'created'])
|
18
18
|
#
|
19
|
+
|
20
|
+
|
19
21
|
class ARFormWidget < FormWidget
|
20
22
|
|
21
23
|
include Cuca::Generator::Markaby
|
24
|
+
include Cuca::FormElements
|
22
25
|
|
23
26
|
# valid options
|
24
27
|
# * :disabled_on_create => ['field_name_1', 'field_name_2', ..]
|
25
28
|
# switch off fields on new records
|
26
29
|
# * :diabled_on_update => ['field_name_1', 'field_name_2', ..]
|
27
30
|
# switch off fields on existing records
|
31
|
+
# * .. options from FormWidgets ...
|
28
32
|
def output(form_name, model, options = {})
|
29
33
|
@model = model
|
30
34
|
@disabled_on_update = options[:disabled_on_update] || []
|
31
35
|
@disabled_on_create = options[:disabled_on_create] || []
|
32
36
|
@hidden_on_update = options[:hidden_on_update] || []
|
33
37
|
@hidden_on_create = options[:hidden_on_create] || []
|
38
|
+
|
39
|
+
options[:default_values] = model.attributes.merge(options[:default_values] || {})
|
40
|
+
|
34
41
|
super(form_name, options)
|
35
42
|
end
|
36
43
|
|
44
|
+
|
45
|
+
# On submit will pass the model to the callback on the controller
|
37
46
|
def on_submit
|
38
47
|
controller.send(@form_name+'_submit', @model) unless controller.nil?
|
39
|
-
|
40
|
-
# this is to reload the form with the new values in case the formname_submit did
|
41
|
-
# save something:
|
42
48
|
clear
|
43
|
-
form
|
44
49
|
end
|
45
50
|
|
46
|
-
# overwrite this method to perform modifications
|
47
|
-
# before validateing the data
|
48
|
-
def before_validate(variables)
|
49
|
-
variables
|
50
|
-
end
|
51
51
|
|
52
|
-
|
52
|
+
|
53
|
+
#
|
54
|
+
# Validate will check on ActiveRecord validation errors
|
55
|
+
#
|
56
|
+
def validate(variables)
|
53
57
|
form if @_content.empty? # password fields might write hints to the validator...
|
54
|
-
|
55
|
-
|
58
|
+
clear
|
59
|
+
@form_errors = {}
|
60
|
+
p = variables
|
56
61
|
p.delete(@submit_name)
|
57
62
|
|
58
|
-
|
59
|
-
p = before_validate(p)
|
60
|
-
|
61
|
-
|
62
63
|
if @model.new_record? then
|
63
64
|
@disabled_on_create.each { |d| p.delete(d) }
|
64
65
|
@hidden_on_create.each { |d| p.delete(d) }
|
@@ -67,13 +68,12 @@ class ARFormWidget < FormWidget
|
|
67
68
|
@hidden_on_update.each { |d| p.delete(d) }
|
68
69
|
end
|
69
70
|
|
70
|
-
|
71
71
|
# don't save empty passwords!!
|
72
72
|
@password_fields ||= []
|
73
73
|
@password_fields.each do |pwf|
|
74
74
|
p.delete(pwf) if p[pwf].chomp.empty?
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
@model.attributes = p
|
78
78
|
|
79
79
|
return true if @model.valid?
|
@@ -82,20 +82,17 @@ class ARFormWidget < FormWidget
|
|
82
82
|
@form_errors[k] = v
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
n.to_s.length == 1 ? "0"+n.to_s : n.to_s
|
90
|
-
end
|
91
|
-
|
92
|
-
def field_enable?(fname)
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
def field_enable?(fname)
|
93
89
|
if @model.new_record? then
|
94
90
|
return @disabled_on_create.include?(fname) ? false : true
|
95
91
|
else
|
96
92
|
return @disabled_on_update.include?(fname) ? false : true
|
97
93
|
end
|
98
94
|
end
|
95
|
+
|
99
96
|
def field_hidden?(fname)
|
100
97
|
if @model.new_record? then
|
101
98
|
return @hidden_on_create.include?(fname) ? true : false
|
@@ -103,173 +100,52 @@ class ARFormWidget < FormWidget
|
|
103
100
|
return @hidden_on_update.include?(fname) ? true : false
|
104
101
|
end
|
105
102
|
end
|
106
|
-
|
107
|
-
|
108
|
-
private
|
109
|
-
def fe_text(name, value,enabled)
|
110
|
-
"<input type='text' name='#{name}' value='#{value}' #{'disabled' unless enabled}>"
|
111
|
-
end
|
112
|
-
|
113
|
-
private
|
114
|
-
def fe_textarea(name, value, enabled, rows=4, cols = 50)
|
115
|
-
"<textarea name='#{name}' rows='#{rows}' cols='#{cols}'>#{value}</textarea>"
|
116
|
-
end
|
117
103
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
private
|
122
|
-
def fe_password(name,enabled)
|
123
|
-
@password_fields ||= []
|
124
|
-
@password_fields << name
|
125
|
-
r = "<input type='password' name='#{name}' #{'disabled' unless enabled}>"
|
126
|
-
if !@model.new_record? then
|
127
|
-
r << "<br><small>Leave empty to keep current password</small>"
|
128
|
-
end
|
129
|
-
return r
|
130
|
-
end
|
131
|
-
|
132
|
-
# this is to build a select box, example:
|
133
|
-
# fe_select('gender', [['f', 'female'],['m','Male']], true) or
|
134
|
-
# fe_select('gender', ['f','m'], true)
|
135
|
-
private
|
136
|
-
def fe_select(name, options, enabled)
|
137
|
-
r = "<select name='#{name}' #{'disabled' unless enabled}>\n"
|
138
|
-
options.each do |o|
|
139
|
-
ov = o.instance_of?(Array) ? o[0] : o
|
140
|
-
sel = ''
|
141
|
-
sel = ' selected' if @model.send(name.intern) == ov
|
142
|
-
if o.instance_of?(Array) then
|
143
|
-
r+="<option value='#{o[0]}'#{sel}>#{o[1]}</option>\n"
|
144
|
-
else
|
145
|
-
r+="<option value='#{o}'#{sel}>#{o}</option>\n"
|
146
|
-
end
|
147
|
-
end
|
148
|
-
r+="</option>\n"
|
149
|
-
end
|
150
|
-
|
151
|
-
|
152
|
-
def fe_datetime(name, v,enabled)
|
153
|
-
v = Time.now unless v
|
154
|
-
v = "#{v.year}/#{twodig(v.month)}/#{twodig(v.day)} #{v.hour}:#{v.min}" if v.instance_of?(Time)
|
155
|
-
r = <<-EOS
|
156
|
-
<input type='text' name='#{name}' id='i_#{name}' value='#{v}' #{'disabled' unless enabled}>
|
157
|
-
EOS
|
158
|
-
if enabled then
|
159
|
-
r << <<-EOS
|
160
|
-
<input type='submit' id='s_#{name}' value='...'>
|
161
|
-
<script type="text/javascript">
|
162
|
-
Calendar.setup({
|
163
|
-
inputField : "i_#{name}", // id of the input field
|
164
|
-
ifFormat : "%Y/%m/%d %H:%M", // format of the input field
|
165
|
-
showsTime : true, // will display a time selector
|
166
|
-
button : "s_#{name}", // trigger for the calendar (button ID)
|
167
|
-
singleClick : true, // double-click mode
|
168
|
-
step : 1 // show all years in drop-down boxes (instead of every other year as default)
|
169
|
-
});
|
170
|
-
</script>
|
171
|
-
</input>
|
172
|
-
EOS
|
173
|
-
end
|
174
|
-
return r
|
175
|
-
end
|
176
|
-
|
177
|
-
# select date.. no time
|
178
|
-
def fe_date(name, v,enabled)
|
179
|
-
v = Time.now unless v
|
180
|
-
r = <<-EOS
|
181
|
-
<input type='text' name='#{name}' id='i_#{name}' value='#{v.year}/#{twodig(v.month)}/#{twodig(v.day)}' #{'disabled' unless enabled}>
|
182
|
-
EOS
|
183
|
-
if enabled then
|
184
|
-
r << <<-EOS
|
185
|
-
<input type='submit' id='s_#{name}' value='...'>
|
186
|
-
<script type="text/javascript">
|
187
|
-
Calendar.setup({
|
188
|
-
inputField : "i_#{name}", // id of the input field
|
189
|
-
ifFormat : "%Y/%m/%d", // format of the input field
|
190
|
-
showsTime : false, // will display a time selector
|
191
|
-
button : "s_#{name}", // trigger for the calendar (button ID)
|
192
|
-
singleClick : true, // double-click mode
|
193
|
-
step : 1 // show all years in drop-down boxes (instead of every other year as default)
|
194
|
-
});
|
195
|
-
</script>
|
196
|
-
</input>
|
197
|
-
EOS
|
198
|
-
end
|
199
|
-
return r
|
200
|
-
end
|
201
|
-
|
202
|
-
def fe_time(name,v,enabled)
|
203
|
-
"<input name='#{name}' size=5 type='text' value='#{v || '0:00'}'#{' disabled' unless enabled}>"
|
204
|
-
end
|
205
|
-
|
206
|
-
def fe_bool(name,v,enabled)
|
207
|
-
r = ''
|
208
|
-
r << "<select name='#{name}' #{'disabled' unless enabled}>\n"
|
209
|
-
r << "<option #{"selected" if v} value='t'>true</option>\n"
|
210
|
-
r << "<option #{"selected" if !v} value='f'>false</option>\n"
|
211
|
-
r << "</select>\n"
|
212
|
-
end
|
213
|
-
|
214
|
-
def fe_int(name,v,enabled)
|
215
|
-
"<input type='text' name='#{name}' value='#{v}' #{'disabled' unless enabled} size=5>"
|
216
|
-
end
|
217
|
-
|
218
|
-
def fe(type, name, value='')
|
104
|
+
|
105
|
+
|
106
|
+
def fe(type, name)
|
219
107
|
return '' if field_hidden?(name)
|
220
|
-
|
108
|
+
attribs = {}
|
109
|
+
attribs[:disabled] = '' unless field_enable?(name)
|
221
110
|
r = ""
|
222
111
|
case(type)
|
223
112
|
when :string
|
224
|
-
r << fe_text(name,
|
113
|
+
r << fe_text(name, attribs)
|
225
114
|
when :boolean
|
226
|
-
r << fe_bool(name,
|
115
|
+
r << fe_bool(name, attribs)
|
227
116
|
when :integer
|
228
|
-
r << fe_int(name,
|
117
|
+
r << fe_int(name, attribs)
|
229
118
|
when :datetime
|
230
|
-
r << fe_datetime(name,
|
119
|
+
r << fe_datetime(name, attribs)
|
231
120
|
when :date
|
232
|
-
r << fe_date(name,
|
233
|
-
when :time
|
234
|
-
r << fe_time(name, value, enabled)
|
121
|
+
r << fe_date(name, attribs)
|
235
122
|
when :password
|
236
|
-
r << fe_password(name,
|
123
|
+
r << fe_password(name, attribs)
|
237
124
|
end
|
238
125
|
return r
|
239
126
|
end
|
240
|
-
|
241
|
-
# build a form element for column name
|
242
|
-
def fe_for(column_name, hint='')
|
243
|
-
col = @model.column_for_attribute(column_name)
|
244
|
-
fe(col.type, col.name, @model.send(column_name.intern))
|
245
|
-
end
|
246
|
-
|
247
127
|
|
248
|
-
|
249
|
-
def
|
250
|
-
|
251
|
-
|
252
|
-
end
|
128
|
+
# build a form element for column name
|
129
|
+
def fe_for(column_name)
|
130
|
+
col = @model.column_for_attribute(column_name)
|
131
|
+
fe(col.type, col.name)
|
253
132
|
end
|
254
133
|
|
255
|
-
|
134
|
+
# you might want to replace this method
|
256
135
|
public
|
257
136
|
def form
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
137
|
+
mab do
|
138
|
+
FormErrors(@form_errors)
|
139
|
+
fe_formstart
|
140
|
+
table do
|
141
|
+
@model.class.columns.each do |col|
|
142
|
+
next if field_hidden?(col.name)
|
143
|
+
tr { td { col.name }; td { fe(col.type, col.name) } }
|
144
|
+
end
|
145
|
+
tr { td {} ; td { fe_submit }}
|
146
|
+
end
|
147
|
+
fe_formend
|
266
148
|
end
|
267
|
-
r << "<tr><td><br/></td></tr>"
|
268
|
-
r << "<tr><td></td><td><input type='submit' value=#{@model.new_record? ? 'Save' : 'Update'} name='#{@submit_name}'></td></tr>"
|
269
|
-
r << "</table>\n</form>\n"
|
270
|
-
@_content = r
|
271
149
|
end
|
272
|
-
|
273
|
-
|
274
150
|
end
|
275
151
|
|