aurita-gui 0.3.7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +10 -0
- data/aurita-gui.gemspec +1 -1
- data/lib/aurita-gui.rb +1 -0
- data/lib/aurita-gui/element.rb +106 -11
- data/lib/aurita-gui/element_fixed.rb +609 -0
- data/lib/aurita-gui/form.rb +4 -0
- data/lib/aurita-gui/form/checkbox_field.rb +4 -1
- data/lib/aurita-gui/form/options_field.rb +4 -1
- data/lib/aurita-gui/form/selection_list.rb +32 -10
- data/lib/aurita-gui/javascript.rb +6 -6
- data/lib/aurita-gui/table.rb +109 -55
- data/lib/aurita-gui/widget.rb +27 -0
- data/spec/element.rb +4 -4
- data/spec/table.rb +53 -0
- metadata +36 -35
- data/History.txt +0 -85
- data/README +0 -10
- data/lib/aurita-gui/builtest.rb +0 -15
- data/lib/aurita-gui/selection_list_test.rb +0 -12
data/lib/aurita-gui/form.rb
CHANGED
@@ -390,6 +390,7 @@ module GUI
|
|
390
390
|
# TODO: Should overwrite previous field element
|
391
391
|
# with same field name.
|
392
392
|
def add(form_field_element)
|
393
|
+
touch()
|
393
394
|
field_name = form_field_element.name.to_s
|
394
395
|
form_field_element.value = @values[field_name] unless form_field_element.value.to_s != ''
|
395
396
|
if !form_field_element.dom_id then
|
@@ -410,6 +411,7 @@ module GUI
|
|
410
411
|
# form.fields = [ :name, :description, :date ]
|
411
412
|
#
|
412
413
|
def fields=(attrib_array)
|
414
|
+
touch()
|
413
415
|
@custom_fields = true
|
414
416
|
@fields = attrib_array.flatten.collect { |fieldname| fieldname.to_s }
|
415
417
|
@elements.each { |field|
|
@@ -425,6 +427,7 @@ module GUI
|
|
425
427
|
# form.values = { :name => 'Foo', :description => 'Bar', :date => '20081012' }
|
426
428
|
#
|
427
429
|
def values=(value_hash={})
|
430
|
+
touch()
|
428
431
|
@values = value_hash
|
429
432
|
@values.each_pair { |field_name, value|
|
430
433
|
element = @element_map[field_name.to_s]
|
@@ -435,6 +438,7 @@ module GUI
|
|
435
438
|
|
436
439
|
# Set all elements to readonly rendering mode.
|
437
440
|
def readonly!
|
441
|
+
touch()
|
438
442
|
@elements.each { |e|
|
439
443
|
e.readonly!
|
440
444
|
}
|
@@ -30,7 +30,10 @@ module GUI
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def element
|
33
|
-
|
33
|
+
element_attrib = @attrib.dup.update({ :class => :checkbox_options })
|
34
|
+
element_attrib.delete(:name)
|
35
|
+
element_attrib.delete(:value)
|
36
|
+
HTML.ul(element_attrib) {
|
34
37
|
option_elements().map { |o| HTML.li() { o } }
|
35
38
|
}
|
36
39
|
end
|
@@ -172,7 +172,10 @@ module GUI
|
|
172
172
|
end
|
173
173
|
|
174
174
|
def options=(options)
|
175
|
-
if options.kind_of?
|
175
|
+
if options.kind_of? ArrayFields then
|
176
|
+
@option_values = options.fields
|
177
|
+
@option_labels = options.values
|
178
|
+
elsif options.kind_of? Array then
|
176
179
|
@option_values = options
|
177
180
|
@option_labels = options
|
178
181
|
elsif options.kind_of? Range then
|
@@ -102,7 +102,7 @@ module GUI
|
|
102
102
|
params.delete(:select_field)
|
103
103
|
params.delete(:selectable_options)
|
104
104
|
super(params)
|
105
|
-
set_value(@value)
|
105
|
+
set_value(@value)
|
106
106
|
add_css_class(:selection_list_field)
|
107
107
|
end
|
108
108
|
|
@@ -118,6 +118,7 @@ module GUI
|
|
118
118
|
|
119
119
|
# Set list of active selection options as array.
|
120
120
|
def value=(value)
|
121
|
+
return unless value
|
121
122
|
super(value)
|
122
123
|
@selectable_options = []
|
123
124
|
options().each_pair { |value, name|
|
@@ -130,12 +131,13 @@ module GUI
|
|
130
131
|
# decorated by @option_field_decorator
|
131
132
|
# (see comments on Selection_List_Field).
|
132
133
|
def option_elements
|
133
|
-
|
134
|
+
base_id = @attrib[:id]
|
135
|
+
base_id ||= @attrib[:name]
|
134
136
|
elements = []
|
135
137
|
options().each_pair { |opt_value, opt_label|
|
136
138
|
selected = @value.map { |v| v.to_s }.include?(opt_value.to_s)
|
137
139
|
if selected then
|
138
|
-
elements << HTML.li(:id => "#{
|
140
|
+
elements << HTML.li(:id => "#{base_id}_#{opt_value}") {
|
139
141
|
@option_field_decorator.new(:name => @attrib[:name],
|
140
142
|
:value => opt_value,
|
141
143
|
:label => opt_label,
|
@@ -150,31 +152,51 @@ module GUI
|
|
150
152
|
# as select field element containing additionally
|
151
153
|
# available options.
|
152
154
|
def element
|
153
|
-
select_options =
|
155
|
+
select_options = []
|
156
|
+
select_option_ids = []
|
154
157
|
@selectable_options.each { |v|
|
155
|
-
|
158
|
+
select_option_ids << v
|
159
|
+
select_options << @option_labels[v]
|
156
160
|
}
|
157
|
-
|
161
|
+
select_options.fields = select_option_ids
|
162
|
+
|
163
|
+
base_id = @attrib[:id]
|
164
|
+
base_id ||= @attrib[:name]
|
158
165
|
|
159
166
|
if @value && @value.length > 0 then
|
160
167
|
HTML.div(@attrib) {
|
161
|
-
HTML.ul(:id => "#{
|
168
|
+
HTML.ul(:id => "#{base_id}_selected_options") {
|
162
169
|
option_elements()
|
163
170
|
} +
|
164
|
-
@select_field_class.new(:id => "#{
|
171
|
+
@select_field_class.new(:id => "#{base_id}_select",
|
165
172
|
:options => select_options,
|
173
|
+
:parent => self,
|
166
174
|
:name => "#{@attrib[:name]}" )
|
167
175
|
}
|
168
176
|
else
|
169
177
|
HTML.div(@attrib) {
|
170
|
-
HTML.ul(:id => "#{
|
171
|
-
@select_field_class.new(:id => "#{
|
178
|
+
HTML.ul(:id => "#{base_id}_selected_options", :force_closing_tag => true) +
|
179
|
+
@select_field_class.new(:id => "#{base_id}_select",
|
172
180
|
:options => select_options,
|
181
|
+
:parent => self,
|
173
182
|
:name => "#{@attrib[:name]}" )
|
174
183
|
}
|
175
184
|
end
|
176
185
|
end
|
177
186
|
|
187
|
+
def readonly_element
|
188
|
+
base_id = @attrib[:id]
|
189
|
+
base_id ||= @attrib[:name]
|
190
|
+
elements = HTML.ul.readonly_selection_list { }
|
191
|
+
options().each_pair { |opt_value, opt_label|
|
192
|
+
selected = @value.map { |v| v.to_s }.include?(opt_value.to_s)
|
193
|
+
if selected then
|
194
|
+
elements << HTML.li(:id => "#{base_id}_#{opt_value}") { opt_label }
|
195
|
+
end
|
196
|
+
}
|
197
|
+
elements
|
198
|
+
end
|
199
|
+
|
178
200
|
end
|
179
201
|
|
180
202
|
end
|
@@ -119,9 +119,9 @@ module GUI
|
|
119
119
|
args_string = args.join(',') if args.size > 0
|
120
120
|
meth = meth.to_s
|
121
121
|
# Uppercase method => method call
|
122
|
-
meth << '(' << args_string.to_s << '); ' if meth[0] > 96
|
122
|
+
meth << '(' << args_string.to_s << '); ' if meth[0].to_i > 96
|
123
123
|
# Uppercase method => Namespace
|
124
|
-
meth << '.' if meth[0] < 97
|
124
|
+
meth << '.' if meth[0].to_i < 97
|
125
125
|
@script << meth
|
126
126
|
return self
|
127
127
|
end
|
@@ -134,19 +134,19 @@ module GUI
|
|
134
134
|
|
135
135
|
def to_js(arg)
|
136
136
|
case arg
|
137
|
-
when String
|
137
|
+
when String then
|
138
138
|
arg.gsub!("'","\\\\'")
|
139
139
|
"'#{arg}'"
|
140
|
-
when Hash
|
140
|
+
when Hash then
|
141
141
|
obj = []
|
142
142
|
arg.each_pair { |k,v|
|
143
143
|
v = to_js(v)
|
144
144
|
obj << "#{k}: #{v}"
|
145
145
|
}
|
146
146
|
"{#{obj.join(', ')}}"
|
147
|
-
when Symbol
|
147
|
+
when Symbol then
|
148
148
|
arg.to_s
|
149
|
-
else
|
149
|
+
else
|
150
150
|
arg
|
151
151
|
end
|
152
152
|
end
|
data/lib/aurita-gui/table.rb
CHANGED
@@ -8,7 +8,7 @@ module GUI
|
|
8
8
|
# Usage:
|
9
9
|
#
|
10
10
|
# table = Table.new(:headers => [ 'user', 'phone', 'mobile', 'email' ])
|
11
|
-
# table.add_row('fuchsto', '+49 89 123456', '+49 89 987654', '
|
11
|
+
# table.add_row('fuchsto', '+49 89 123456', '+49 89 987654', 'fuchs@wortundform.de')
|
12
12
|
#
|
13
13
|
# A row element may be of type Aurita::GUI::Element.
|
14
14
|
# In this case, method #string is invoked to render the cell.
|
@@ -16,43 +16,73 @@ module GUI
|
|
16
16
|
# More examples:
|
17
17
|
#
|
18
18
|
# t = Table.new(:headers => ['user', 'phone', 'email'],
|
19
|
-
# :
|
20
|
-
#
|
21
|
-
# t.add_row(
|
22
|
-
|
19
|
+
# :class => 'css_class',
|
20
|
+
# :id => 'test_table' )
|
21
|
+
# t.add_row('a','b','c' )
|
22
|
+
#
|
23
|
+
# t[0].class == Table_Cell
|
23
24
|
# t[0][0].value = 'foo'
|
24
25
|
# t[0][0].value = 45
|
25
26
|
# t[1][0].onclick = 'test();'
|
26
27
|
# t[0][1] = HTML.a(:href => 'http://google.com') { 'google' }
|
27
|
-
|
28
|
+
#
|
28
29
|
# t[0][1].value.href = 'other'
|
29
30
|
# t[0][1].value.content = 'clickme'
|
30
|
-
|
31
|
+
#
|
31
32
|
# puts t[0][1].value.string
|
32
|
-
|
33
|
+
#
|
33
34
|
# t[0].class = 'highlighted'
|
34
35
|
#
|
35
36
|
class Table < Element
|
36
37
|
|
37
|
-
attr_accessor :columns, :headers, :rows, :template, :row_css_classes, :column_css_classes, :
|
38
|
+
attr_accessor :columns, :headers, :rows, :template, :row_css_classes, :column_css_classes, :row_class
|
38
39
|
|
39
40
|
def initialize(params={}, &block)
|
40
|
-
|
41
|
-
@
|
42
|
-
@
|
43
|
-
@num_columns
|
44
|
-
@
|
45
|
-
@
|
46
|
-
@
|
41
|
+
params[:tag] = :table
|
42
|
+
@headers ||= params[:headers]
|
43
|
+
@num_columns ||= params[:num_columns]
|
44
|
+
@num_columns ||= @headers.length if (!@columns && @headers)
|
45
|
+
@columns ||= []
|
46
|
+
@rows ||= []
|
47
|
+
@headers ||= []
|
48
|
+
@row_class ||= params[:row_class]
|
49
|
+
@row_class ||= Table_Row
|
47
50
|
@row_css_classes = params[:row_css_classes]
|
48
51
|
@row_css_classes ||= []
|
52
|
+
@row_css_classes = [ @row_css_classes ] unless @row_css_classes.is_a?(Array)
|
49
53
|
@column_css_classes = params[:column_css_classes]
|
50
54
|
@column_css_classes ||= []
|
51
|
-
|
55
|
+
@column_css_classes = [ @column_css_classes ] unless @column_css_classes.is_a?(Array)
|
56
|
+
params[:cellpadding] = 0 unless params[:cellpadding]
|
57
|
+
params[:cellspacing] = 0 unless params[:cellspacing]
|
58
|
+
params.delete(:headers)
|
59
|
+
params.delete(:num_columns)
|
60
|
+
params.delete(:row_css_classes)
|
61
|
+
params.delete(:column_css_classes)
|
62
|
+
set_headers(@headers)
|
63
|
+
super(params, &block)
|
64
|
+
end
|
65
|
+
|
66
|
+
def headers=(headers)
|
67
|
+
@headers = headers
|
68
|
+
if @headers.length > 0 then
|
69
|
+
@headers.map! { |cell|
|
70
|
+
if cell.is_a? Element then
|
71
|
+
cell
|
72
|
+
else
|
73
|
+
HTML.th { cell }
|
74
|
+
end
|
75
|
+
}
|
76
|
+
end
|
52
77
|
end
|
78
|
+
alias set_headers headers=
|
53
79
|
|
54
|
-
def add_row(row_data)
|
55
|
-
|
80
|
+
def add_row(*row_data)
|
81
|
+
if row_data.first.is_a?(Array) then
|
82
|
+
row_data = row_data.first
|
83
|
+
end
|
84
|
+
# TODO: This should happen in #string
|
85
|
+
row = @row_class.new(row_data, :parent => self)
|
56
86
|
@rows << row
|
57
87
|
|
58
88
|
# Add row content to columns
|
@@ -64,9 +94,12 @@ module GUI
|
|
64
94
|
end
|
65
95
|
|
66
96
|
def string
|
67
|
-
|
68
|
-
|
69
|
-
|
97
|
+
t = []
|
98
|
+
if @headers.length > 0 then
|
99
|
+
t = HTML.tr { @headers.collect { |cell| if cell.is_a? Element then cell else HTML.th { cell } end } }
|
100
|
+
end
|
101
|
+
t += rows()
|
102
|
+
set_content(t)
|
70
103
|
super()
|
71
104
|
end
|
72
105
|
alias to_s string
|
@@ -75,20 +108,21 @@ module GUI
|
|
75
108
|
end
|
76
109
|
|
77
110
|
def set_data(row_array)
|
111
|
+
@rows = []
|
78
112
|
row_array.each { |row|
|
79
|
-
@rows <<
|
113
|
+
@rows << @row_class.new(row, :parent => self)
|
80
114
|
}
|
81
115
|
end
|
82
116
|
|
83
117
|
def cell(column, row)
|
84
|
-
|
118
|
+
rows[row][column]
|
85
119
|
end
|
86
120
|
|
87
121
|
def [](row_index)
|
88
|
-
|
122
|
+
rows[row_index]
|
89
123
|
end
|
90
124
|
def []=(row_index, row_data)
|
91
|
-
|
125
|
+
rows[row_index] = row_data
|
92
126
|
end
|
93
127
|
|
94
128
|
def columns
|
@@ -98,34 +132,57 @@ module GUI
|
|
98
132
|
end
|
99
133
|
|
100
134
|
class Table_Row < Element
|
135
|
+
|
136
|
+
attr_accessor :cells, :parent
|
137
|
+
|
101
138
|
def initialize(cell_data, params={})
|
102
|
-
|
103
|
-
|
139
|
+
params[:tag] = :tr
|
140
|
+
|
141
|
+
@parent ||= params[:parent]
|
142
|
+
@cell_class ||= Table_Cell
|
143
|
+
@cell_data ||= cell_data
|
144
|
+
@cells ||= []
|
145
|
+
@touched = false
|
146
|
+
column_index = 0
|
147
|
+
|
104
148
|
@cell_data.each { |cell|
|
105
|
-
@cells <<
|
149
|
+
@cells << @cell_class.new(cell, :parent => self, :column_index => column_index)
|
150
|
+
column_index += 1
|
106
151
|
}
|
107
|
-
|
152
|
+
set_content(@cells)
|
153
|
+
@content = @cells
|
154
|
+
|
108
155
|
super(params)
|
156
|
+
add_css_classes(@parent.row_css_classes) if @parent.row_css_classes.length > 0
|
109
157
|
end
|
110
158
|
|
111
159
|
def table
|
112
|
-
@
|
160
|
+
@parent
|
113
161
|
end
|
114
162
|
|
115
163
|
def [](column_index)
|
116
164
|
@cells[column_index]
|
117
165
|
end
|
118
166
|
def []=(column_index, cell_data)
|
167
|
+
touch()
|
119
168
|
@cells[column_index].value = cell_data
|
120
169
|
end
|
121
170
|
|
122
171
|
def string
|
123
|
-
|
172
|
+
if @touched then
|
173
|
+
@cells = []
|
174
|
+
@cell_data.each { |cell|
|
175
|
+
@cells << @cell_class.new(cell, :parent => self, :column_index => column_index)
|
176
|
+
column_index += 1
|
177
|
+
}
|
178
|
+
set_content(@cells)
|
179
|
+
@touched = false
|
180
|
+
end
|
124
181
|
super()
|
125
182
|
end
|
126
183
|
|
127
184
|
def inspect
|
128
|
-
'[' << @cells.collect { |c| c.
|
185
|
+
'Row[' << @cells.collect { |c| c.inspect }.join(',') + ']'
|
129
186
|
end
|
130
187
|
end
|
131
188
|
|
@@ -152,37 +209,34 @@ module GUI
|
|
152
209
|
#
|
153
210
|
class Table_Cell < Element
|
154
211
|
|
155
|
-
attr_accessor :value, :presentation_class
|
212
|
+
attr_accessor :value, :presentation_class, :parent
|
156
213
|
|
157
214
|
def initialize(cell_element, params={})
|
158
|
-
params[:tag]
|
159
|
-
@
|
215
|
+
params[:tag] = :td
|
216
|
+
@content ||= cell_element
|
217
|
+
@value ||= cell_element
|
218
|
+
@presentation_class ||= false
|
219
|
+
@column_index = params[:column_index]
|
220
|
+
@parent ||= params[:parent]
|
221
|
+
params.delete(:column_index)
|
160
222
|
super(params)
|
161
|
-
|
162
|
-
|
223
|
+
column_css_classes = @parent.parent.column_css_classes[@column_index]
|
224
|
+
add_css_classes(column_css_classes) if column_css_classes
|
163
225
|
end
|
164
226
|
|
165
|
-
def value=(val)
|
166
|
-
@value = val
|
167
|
-
@content = val.to_s
|
168
|
-
if @presentation_class then
|
169
|
-
@content = @presentation_class.new(@value).string
|
170
|
-
else
|
171
|
-
@content = @value.to_s
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
227
|
def set_presentation(presentation_class)
|
176
228
|
@presentation_class = presentation_class
|
177
229
|
end
|
230
|
+
alias presentation= set_presentation
|
178
231
|
|
179
|
-
def
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
232
|
+
def value=(val)
|
233
|
+
@value = val
|
234
|
+
set_content(@value) unless @presentation_class
|
235
|
+
set_content(@presentation_class.new(@value)) if @presentation_class
|
236
|
+
end
|
237
|
+
|
238
|
+
def inspect
|
239
|
+
'Cell[' << @value + ']'
|
186
240
|
end
|
187
241
|
|
188
242
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
require('delegate')
|
3
|
+
require('aurita-gui/element')
|
4
|
+
|
5
|
+
module Aurita
|
6
|
+
module GUI
|
7
|
+
|
8
|
+
class Widget < DelegateClass(Element)
|
9
|
+
include Aurita::GUI
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
super(element())
|
13
|
+
end
|
14
|
+
|
15
|
+
def element
|
16
|
+
raise ::Exception.new('Missing method #element for ' << self.class.to_s)
|
17
|
+
end
|
18
|
+
|
19
|
+
def js_initialize
|
20
|
+
''
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|