aurita-gui 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,16 @@
1
1
 
2
+ == 0.3.6 / 2009-01-31
3
+
4
+ * Added Selection_List_Field.
5
+ * Several minor fixes in Options_Field, and Form
6
+ * Added more specs.
7
+
8
+ == 0.3.5 / 2009-01-27
9
+
10
+ * Element instances now behave like arrays (nested content is delegated).
11
+ * Object trees now can be iterated recursively via Element#recurse { |element| ... }
12
+ * Added more specs.
13
+
2
14
  === 0.3.4 / 2009-01-26
3
15
 
4
16
  * Added retreiving elements from object tree
data/README ADDED
@@ -0,0 +1,10 @@
1
+
2
+ Current documentation is online at
3
+
4
+ http://intra.wortundform.de/aurita-gui
5
+
6
+ Mail your requests to fuchs@wortundform.de,
7
+ i'll respond within 24 hours.
8
+
9
+ have fun!
10
+ Tobi
@@ -12,14 +12,14 @@ of primitive and complex HTML elements, such as tables and forms.
12
12
  It is a core module of the Aurita application framework, but it can be used
13
13
  as stand-alone library in any context (such as rails).
14
14
  As there seems to be a lack of ruby form generators, i decided to release this
15
- part of Aurita in a single gem with no dependencies.
15
+ part of Aurita in a single gem with no dependencies on aurita itself.
16
16
  EOF
17
- s.version = '0.3.5'
17
+ s.version = '0.3.6'
18
18
  s.author = 'Tobias Fuchs'
19
- s.email = 'fuchs@atomnode.net'
19
+ s.email = 'fuchs@wortundform.de'
20
20
  s.date = Time.now
21
21
  s.files = '*.rb'
22
- # s.add_dependency('postgres', '>= 0.1')
22
+ s.add_dependency('arrayfields', '>= 4.6.0')
23
23
  s.files = FileList['*',
24
24
  'lib/*',
25
25
  'lib/aurita-gui/*',
@@ -0,0 +1,15 @@
1
+
2
+ require 'rubygems'
3
+ require 'aurita-gui'
4
+
5
+ include Aurita::GUI
6
+
7
+ puts Builder.new {
8
+ div.outer {
9
+ div.header {
10
+ h2 { 'header here' }
11
+ div.content { 'content here' }
12
+ }
13
+ }
14
+ }.to_s
15
+
@@ -471,6 +471,43 @@ module GUI
471
471
  end
472
472
 
473
473
  end # class
474
+
475
+ class Buffered_Element < Element
476
+
477
+ def initialize(buffer, *args, &block)
478
+ @output_buffer = buffer
479
+ super(*args, &block)
480
+ end
481
+
482
+ def method_missing(meth, value=nil, &block)
483
+ if block_given? then
484
+ @attrib[:class] = meth
485
+ @attrib.update(value) if value.is_a? Hash
486
+ c = yield
487
+ c = [ c ] unless c.is_a?(Array)
488
+ __setobj__(c)
489
+
490
+ return string()
491
+ elsif !value.nil? && !meth.to_s.include?('=') then
492
+ @attrib[:class] = meth
493
+ case value
494
+ when Hash then
495
+ @attrib.update(value)
496
+ c = value[:content]
497
+ c = [ c ] if (c && !c.is_a?(Array))
498
+ __setobj__(c) if c
499
+ when String then
500
+ __setobj__([value])
501
+ end
502
+
503
+ return string()
504
+ else
505
+ return @attrib[meth] unless value or meth.to_s.include? '='
506
+ @attrib[meth.to_s.gsub('=','').intern] = value
507
+ end
508
+ end
509
+
510
+ end
474
511
 
475
512
  end # module
476
513
  end # module
@@ -17,6 +17,7 @@ require('aurita-gui/form/file_field')
17
17
  require('aurita-gui/form/boolean_field')
18
18
  require('aurita-gui/form/text_field')
19
19
  require('aurita-gui/form/password_field')
20
+ require('aurita-gui/form/selection_list')
20
21
 
21
22
  module Aurita
22
23
  module GUI
@@ -11,6 +11,20 @@ module GUI
11
11
  params[:options] = [ 1 ]
12
12
  super(params, &block)
13
13
  end
14
+ def option_elements
15
+ elements = []
16
+ options().each_pair { |k,v|
17
+ box_attribs = { :type => :checkbox,
18
+ :value => k,
19
+ :name => @attrib[:name] }
20
+ checked = (@value && k.to_s == @value.to_s)? true : nil
21
+ box_attribs[:checked] = checked
22
+ element = []
23
+ element << HTML.input(box_attribs)
24
+ elements << element
25
+ }
26
+ elements
27
+ end
14
28
  end
15
29
 
16
30
  end
@@ -10,40 +10,23 @@ module GUI
10
10
  #
11
11
  class Checkbox_Field < Options_Field
12
12
  def option_elements
13
- options = []
14
- @option_elements.each { |option|
15
- if option.kind_of? Hash then
16
- # Options have been set as value/label pair, like
17
- #
18
- # @options = { 1 => 'first', 2 => 'second' }
19
- #
20
- option.each_pair { |k,v|
21
- box_attribs = { :type => :checkbox,
22
- :value => k,
23
- :name => @attrib[:name] }
24
- box_attribs[:checked] = true if (v.to_s == @value.to_s)
25
- options << HTML.input(box_attribs)
26
- }
27
- elsif option.kind_of? Element then
28
- # Option element has been built externally, like in
29
- #
30
- # @options = [ HTML.option(:class => :custom, :label => 'built manually') ]
31
- #
32
- option.name = @attrib[:name]
33
- option.tag = :input
34
- option.type = :checkbox
35
- options << option
36
- else
37
- # For @options = [ :foo, :bar, 'wombat' ],
38
- #
39
- box_attribs = { :type => :checkbox,
40
- :value => option.to_s,
41
- :name => @attrib[:name] }
42
- box_attribs[:checked] = true if (option.to_s == @value.to_s)
43
- options << HTML.input(box_attribs)
13
+ elements = []
14
+ options().each_pair { |k,v|
15
+ box_attribs = { :type => :checkbox,
16
+ :value => k,
17
+ :name => @attrib[:name] }
18
+ if @value.is_a?(Array) then
19
+ checked = (@value.map { |v| v.to_s }.include?(k))? true : nil
20
+ else
21
+ checked = (@value && k.to_s == @value.to_s)? true : nil
44
22
  end
23
+ box_attribs[:checked] = checked
24
+ element = []
25
+ element << HTML.input(box_attribs)
26
+ element << HTML.label(:for => option_id) { v } if v
27
+ elements << element
45
28
  }
46
- options
29
+ elements
47
30
  end
48
31
 
49
32
  def element
@@ -86,6 +86,7 @@ module GUI
86
86
  :month => date.month,
87
87
  :day => date.day }
88
88
  else
89
+ return
89
90
  end
90
91
  @year, @month, @day = @value[:year], @value[:month], @value[:day]
91
92
  end
@@ -140,7 +140,7 @@ module GUI
140
140
 
141
141
  # Virtual method.
142
142
  def element
143
- raise Form_Error.new('Cannot render abstract class Form_Field') unless @element
143
+ raise Form_Error.new('Form_Field@element not set') unless @element
144
144
  @element
145
145
  end
146
146
 
@@ -1,5 +1,6 @@
1
1
 
2
2
  require('aurita-gui/form/form_field')
3
+ require('arrayfields')
3
4
 
4
5
  module Aurita
5
6
  module GUI
@@ -69,14 +70,9 @@ module GUI
69
70
  # Set option values as array, labels as hash:
70
71
  #
71
72
  # s1 = Select_Field.new(:name => :test,
72
- # :label => { 'Pick one' => [ 'foo', 'bar', 'wombat' ] },
73
- # :options => [ 1,2,3 ])
74
- # Same as
75
- #
76
- # s1 = Select_Field.new(:name => :test,
77
73
  # :label => 'Pick one',
78
- # :option_labels => [ 'foo', 'bar', 'wombat' ],
79
- # :options => [ 1,2,3 ] )
74
+ # :option_labels => [ 'foo', 'bar', 'wombat' ] },
75
+ # :option_values => [ 1,2,3 ])
80
76
  # Ranges are ok, too:
81
77
  #
82
78
  # s1 = Select_Field.new(:name => :test,
@@ -93,20 +89,11 @@ module GUI
93
89
  # Change option labels using a hash.
94
90
  # Compared to using an array, this is useful
95
91
  # in case you don't know the order of option
96
- # values.
92
+ # values. You can also rename some or all option
93
+ # labels this way.
97
94
  #
98
95
  # s1.option_labels = { 1 => 'ras', 2 => 'dwa', 3 => 'tri' }
99
96
  #
100
- # Overwriting the labels field does the same,
101
- # but this way, you also can change the
102
- # field label:
103
- #
104
- # s1.label = { 'Select one' => [ 'foo', 'bar', 'wombat' ] }
105
- #
106
- # Or
107
- #
108
- # s1.label = { 'Select one' => { 1 => 'foo', 2 => 'bar', 3 => 'wombat' } }
109
- #
110
97
  # Of yourse you can replace all option values
111
98
  # and their labels at once by overwriting
112
99
  # the options field:
@@ -116,20 +103,18 @@ module GUI
116
103
  #
117
104
  class Options_Field < Form_Field
118
105
 
119
- attr_accessor :options, :options_range, :option_labels, :value
106
+ attr_accessor :option_values, :option_labels
107
+ attr_reader :value
120
108
 
121
109
  def initialize(params, &block)
122
- @options = params[:options]
123
- @options = @options.to_a if @options.kind_of? Range
124
- @options_range = params[:options_range]
125
110
  @option_labels = params[:option_labels]
126
- set_option_labels(params[:option_labels]) if params[:option_labels]
127
111
  @option_labels ||= []
128
- @options ||= {}
129
- @options_range ||= []
130
- @option_elements ||= []
112
+ @option_values = params[:option_values]
113
+ @option_values ||= []
131
114
  @value = params[:value]
132
115
 
116
+ set_options(params[:options]) if params[:options]
117
+
133
118
  if block_given? then
134
119
  yield.each { |option|
135
120
  add_option(option)
@@ -140,52 +125,74 @@ module GUI
140
125
  params.delete(:options)
141
126
  # Option fields don't have a value attribute themselves
142
127
  params.delete(:value)
143
- params.delete(:options_range)
128
+ params.delete(:option_values)
144
129
  params.delete(:option_labels)
145
130
  super(params)
146
131
  end
147
132
 
133
+ def options
134
+ @option_labels = @option_values.dup unless @option_labels.length > 0
135
+ @option_labels.fields = @option_values.map { |v| v.to_s }
136
+ @option_labels
137
+ end
138
+
139
+ def option_hash
140
+ options().to_hash
141
+ end
142
+
148
143
  def option_labels=(labels)
149
- @option_labels = labels
150
- renamed_options = {}
151
- if @options.kind_of? Hash then
152
- index = 0
153
- @options.each_pair { |value,label|
154
- renamed_options[value] = labels[value]
155
- index += 1
144
+ # [ :red, :blue, :green, :yellow ]
145
+ if labels.kind_of? Array then
146
+ @option_labels = labels
147
+ # { 0 => :red, 1 => :blue }
148
+ elsif labels.kind_of? Hash then
149
+ @option_labels ||= []
150
+ @option_values ||= []
151
+ # Ensure keys and values are strings:
152
+ labels.each_pair { |k,v|
153
+ labels.delete(k)
154
+ labels[k.to_s] = v
156
155
  }
157
- elsif @options.kind_of? Array then
158
- index = 0
159
- @options.each { |value|
160
- renamed_options[value] = labels[index]
161
- index += 1
156
+ opt_field = options()
157
+ labels.sort.each { |pair|
158
+ opt_field[pair[0].to_s] = pair[1]
162
159
  }
163
160
  end
164
- @options = renamed_options
165
- @option_elements = [ @options ]
166
161
  end
167
162
  alias set_option_labels option_labels=
168
163
 
169
164
  def add_option(option={})
170
165
  if option.kind_of? Array then
171
- @option_elements += option
172
- elsif option.kind_of? Hash then
173
- @option_elements << options
166
+ @option_values += option
174
167
  elsif option.kind_of? Range then
175
- @option_elements += option.to_a
168
+ @option_values += option.to_a
169
+ elsif option.kind_of? Hash then
170
+ # @option_elements << options
176
171
  end
177
- # @option_elements << option
178
172
  end
179
173
 
180
174
  def options=(options)
181
175
  if options.kind_of? Array then
182
- @option_elements = options
183
- elsif options.kind_of? Hash then
184
- @option_elements = [ options ]
176
+ @option_values = options
177
+ @option_labels = options
185
178
  elsif options.kind_of? Range then
186
- @option_elements = options.to_a
179
+ @option_values = options.to_a
180
+ @option_labels = options.to_a
181
+ elsif options.kind_of? Hash then
182
+ @option_values = []
183
+ @option_labels = []
184
+ options.sort.each { |pair|
185
+ @option_values << pair[0]
186
+ @option_labels << pair[1]
187
+ }
187
188
  end
188
189
  end
190
+ alias set_options options=
191
+
192
+ def value=(value)
193
+ @value = value
194
+ end
195
+ alias set_value value=
189
196
 
190
197
  def [](index)
191
198
  @option_elements[index]
@@ -195,7 +202,7 @@ module GUI
195
202
  end
196
203
 
197
204
  def element
198
- raise Form_Error.new('Method #element from Abstract class Options_Field has not been overloaded.')
205
+ raise Form_Error.new('Method #element from Abstract class Options_Field has not been overloaded in ' << self.class.to_s)
199
206
  end
200
207
 
201
208
  def content
@@ -24,24 +24,18 @@ module GUI
24
24
  class Radio_Field < Options_Field
25
25
 
26
26
  # Returns array of option elements for this
27
- # radio field.
27
+ # radio field, i.e. an array of <input type="checkbox" ... />.
28
28
  # Each option is a radio input field with
29
29
  # @name as common name attribute.
30
30
  def option_elements
31
- options = []
32
- @option_elements.each { |option|
33
- if option.kind_of? Hash then
34
- option.each_pair { |k,v|
35
- options << HTML.input(:type => :radio, :value => k, :name => @attrib[:name] ) { v }
36
- }
37
- elsif option.kind_of? Element then
38
- option.name = @attrib[:name]
39
- option.tag = :input
40
- option.type = :radio
41
- options << option
42
- end
31
+ elements = []
32
+ options().each_pair { |k,v|
33
+ element = []
34
+ element << HTML.input(:type => :radio, :value => k, :name => @attrib[:name] )
35
+ element << HTML.label(:for => option_id) { v } if v
36
+ elements << element
43
37
  }
44
- options
38
+ elements
45
39
  end
46
40
 
47
41
  # Renders this radio field to a HTML.ul element,
@@ -5,24 +5,18 @@ module Aurita
5
5
  module GUI
6
6
 
7
7
  class Select_Field < Options_Field
8
+
9
+ # Returns array of option elements for this
10
+ # select field.
8
11
  def option_elements
9
- options = []
10
- @option_elements.each { |option|
11
- if option.kind_of? Hash then
12
- option.each_pair { |k,v|
13
- selected = (@value && k.to_s == @value.to_s)? true : nil
14
- options << HTML.option(:value => k, :selected => selected) { v }
15
- }
16
- elsif option.kind_of? Element then
17
- option.tag = :option
18
- options << option
19
- else
20
- selected = (@value && option.to_s == @value.to_s)? true : nil
21
- options << HTML.option(:value => option, :selected => selected) { option }
22
- end
12
+ elements = []
13
+ options().each_pair { |k,v|
14
+ selected = (@value && k.to_s == @value.to_s)? true : nil
15
+ elements << HTML.option(:value => k, :selected => selected) { v }
23
16
  }
24
- options
17
+ elements
25
18
  end
19
+
26
20
  def element
27
21
  HTML.select(@attrib) {
28
22
  option_elements()
@@ -30,7 +24,7 @@ module GUI
30
24
  end
31
25
  def readonly_element
32
26
  HTML.div(@attrib) {
33
- @options[@value]
27
+ options()[@value]
34
28
  }
35
29
  end
36
30
  end
@@ -0,0 +1,181 @@
1
+
2
+ require('aurita-gui/form/form_field')
3
+ require('aurita-gui/form/select_field')
4
+ require('aurita-gui/form/options_field')
5
+
6
+ module Aurita
7
+ module GUI
8
+
9
+ class Selection_List_Option_Field < Form_Field
10
+ def initialize(params={})
11
+ params.delete(:selection_list_params)
12
+ super(params)
13
+ end
14
+ def element
15
+ HTML.div(:id => "selection_option_#{@attrib[:name]}_#{@value}", :class => :selection_list_option) {
16
+ HTML.label { @label.to_s } +
17
+ Hidden_Field.new(:value => @value, :name => @attrib[:name].to_s + '_selected[]')
18
+ }
19
+ end
20
+ end
21
+
22
+ # A selection list maintains a list of
23
+ # available options and a select field of
24
+ # further available options.
25
+ #
26
+ # == Example:
27
+ #
28
+ # Selection_List_Field.new(:name => :the_list,
29
+ # :value => ['10','30' ] # Active selection from options
30
+ # :options => { '10' => :blue, # List of all options
31
+ # '20' => :red,
32
+ # '30' => :green }
33
+ #
34
+ # In the example, any combination of 'blue',
35
+ # 'red' and 'green' could be selected,
36
+ # here it is 'blue' and 'green'.
37
+ # The select field contains 20 => 'red',
38
+ # the only additionally available option
39
+ # (as it is not already set in value).
40
+ #
41
+ # Use case: Assign user to categories.
42
+ # Options is all available categories,
43
+ # value is an array of category ids
44
+ # already assigned to this user.
45
+ #
46
+ # == Customization
47
+ #
48
+ # You can override the Form_Field class
49
+ # rendering the option list elements, as
50
+ # well as the Form_Field class rendering
51
+ # the select field.
52
+ #
53
+ # Use #option_field_decorator to override
54
+ # rendering of option fields.
55
+ # Default is Selection_List_Option_Field.
56
+ #
57
+ # Example for custom option field decorator:
58
+ #
59
+ # class Delete_Option_Decorator < Form_Field
60
+ # def element
61
+ # HTML.div {
62
+ # HTML.img(:src => '/images/delete.png') + @label
63
+ # }
64
+ # end
65
+ # end
66
+ #
67
+ # selection_list.option_field_decorator = Delete_Option_Decorator
68
+ #
69
+ # Example for custom select field class:
70
+ #
71
+ # Note that Selection_List_Field will initialize
72
+ # @select_field_class with parameter :options, a
73
+ # key / label map of available options.
74
+ #
75
+ # class Ajax_Selection_Field < Form_Field
76
+ # def initialize(params={})
77
+ # super(params)
78
+ # params[:onchange] = js.do_something.ajaxian.with(:this, @options)
79
+ # end
80
+ # def element
81
+ # HTML.div {
82
+ # Input_Field.new(@attrib)
83
+ # }
84
+ # end
85
+ # end
86
+ #
87
+ # selection_list.select_field_class = Ajax_Selection_Field
88
+ #
89
+ class Selection_List_Field < Options_Field
90
+
91
+ attr_accessor :option_field_decorator, :select_field_class, :selectable_options
92
+
93
+ def initialize(params={})
94
+ @option_field_decorator = params[:option_field]
95
+ @select_field_class = params[:select_field]
96
+ @option_field_decorator ||= Selection_List_Option_Field
97
+ @select_field_class ||= Select_Field
98
+ @selectable_options = params[:selectable_options]
99
+ @selectable_options ||= []
100
+
101
+ params.delete(:option_field)
102
+ params.delete(:select_field)
103
+ params.delete(:selectable_options)
104
+ super(params)
105
+ set_value(@value)
106
+ add_css_class(:selection_list_field)
107
+ end
108
+
109
+ # Set list of all options as value / label hash.
110
+ def options=(options)
111
+ super(options)
112
+ if !@selectable_options || @selectable_options.length == 0 then
113
+ options().each_pair { |value, name|
114
+ @selectable_options << value unless (@value.is_a?(Array) && @value.map { |v| v.to_s }.include?(value.to_s))
115
+ }
116
+ end
117
+ end
118
+
119
+ # Set list of active selection options as array.
120
+ def value=(value)
121
+ super(value)
122
+ @selectable_options = []
123
+ options().each_pair { |value, name|
124
+ @selectable_options << value unless @value.map { |v| v.to_s }.include? value.to_s
125
+ }
126
+ end
127
+ alias set_value value=
128
+
129
+ # Returns array of available options,
130
+ # decorated by @option_field_decorator
131
+ # (see comments on Selection_List_Field).
132
+ def option_elements
133
+ id_prefix = "#{@attrib[:id]}_" if @attrib[:id]
134
+ elements = []
135
+ options().each_pair { |opt_value, opt_label|
136
+ selected = @value.map { |v| v.to_s }.include?(opt_value.to_s)
137
+ if selected then
138
+ elements << HTML.li(:id => "#{id_prefix}#{@attrib[:name]}_#{opt_value}") {
139
+ @option_field_decorator.new(:name => @attrib[:name],
140
+ :value => opt_value,
141
+ :label => opt_label,
142
+ :parent => self)
143
+ }
144
+ end
145
+ }
146
+ elements
147
+ end
148
+
149
+ # Renders list of active options, as well
150
+ # as select field element containing additionally
151
+ # available options.
152
+ def element
153
+ select_options = {}
154
+ @selectable_options.each { |v|
155
+ select_options[v] = @option_labels[v]
156
+ }
157
+ id_prefix = "#{@attrib[:id]}_" if @attrib[:id]
158
+
159
+ if @value && @value.length > 0 then
160
+ HTML.div(@attrib) {
161
+ HTML.ul(:id => "#{id_prefix}#{@attrib[:name]}") {
162
+ option_elements()
163
+ } +
164
+ @select_field_class.new(:id => "#{id_prefix}#{@attrib[:name]}_select",
165
+ :options => select_options,
166
+ :name => "#{@attrib[:name]}" )
167
+ }
168
+ else
169
+ HTML.div(@attrib) {
170
+ @select_field_class.new(:id => "#{id_prefix}#{@attrib[:name]}_select",
171
+ :options => select_options,
172
+ :name => "#{@attrib[:name]}" )
173
+ }
174
+ end
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+ end
181
+
@@ -298,11 +298,6 @@ module GUI
298
298
  Element.new(:tag => :pseudo) { self.class_eval(&block) }
299
299
  end
300
300
 
301
-
302
- def self.a(*attribs, &block)
303
- render(:a, *attribs, &block)
304
- end
305
-
306
301
  # p is defined in Kernel, so we have to
307
302
  # redirect it manually (method_missing won't be
308
303
  # triggered for it)
@@ -315,7 +310,7 @@ module GUI
315
310
  end
316
311
 
317
312
  def self.puts(arg)
318
- arg
313
+ HTML.build { arg }
319
314
  end
320
315
 
321
316
  =begin
@@ -331,6 +326,44 @@ EOC
331
326
  =end
332
327
 
333
328
  end # class
329
+
330
+ class Builder
331
+
332
+ def initialize(&block)
333
+ raise ::Exception.new('Missing block for Builder') unless block_given?
334
+ @output_buffer = ''
335
+ instance_eval(&block)
336
+ end
337
+
338
+ # Statically defined as <br /> must not have any attributes.
339
+ def br
340
+ @output_buffer << '<br />'
341
+ end
342
+
343
+ def render(meth_name, *args, &block)
344
+ raise ::Exception.new('Missing attributes for HTML.' << meth_name.inspect) unless args
345
+ e = Buffered_Element.new(@output_buffer, *args, &block)
346
+ e.tag = meth_name
347
+ @output_buffer << e.string
348
+ e
349
+ end
350
+
351
+ # p is defined in Kernel, so we have to
352
+ # redirect it manually (method_missing won't be
353
+ # triggered for it)
354
+ def p(*attribs, &block)
355
+ render(:p, *attribs, &block)
356
+ end
357
+
358
+ def method_missing(meth_name, *attribs, &block)
359
+ render(meth_name, *attribs, &block)
360
+ end
361
+
362
+ def to_s
363
+ @output_buffer
364
+ end
365
+
366
+ end
334
367
 
335
368
  end # module
336
369
  end # module
@@ -0,0 +1,12 @@
1
+
2
+ require('aurita')
3
+ Aurita.load_project :default
4
+ Aurita.import_module :gui, :custom_form_elements
5
+
6
+ include Aurita::GUI
7
+
8
+ sl = Selection_List_Field.new(:name => :the_list,
9
+ :value => ['10','30' ]
10
+ :options => { '10' => :blue, '20' => :red, '30' => :green }
11
+
12
+ puts sl.to_s.gsub('><',">\n<")
@@ -24,11 +24,11 @@ describe Aurita::GUI::Javascript, "basic rendering" do
24
24
 
25
25
  it "should extend class HTML by a helper method '.js'" do
26
26
  e = HTML.build {
27
- div.outer(:onclick => js.Wombat.alert('message')) {
27
+ div.outer(:id => :unit, :onclick => js.Wombat.alert('message')) {
28
28
  p.inner 'click me'
29
29
  }
30
30
  }
31
- e.to_s.should == '<div class="outer" onclick="Wombat.alert(\'message\'); "><p class="inner">click me</p></div>'
31
+ e[:unit].onclick.to_s.should == 'Wombat.alert(\'message\'); '
32
32
  end
33
33
 
34
34
  end
@@ -0,0 +1,44 @@
1
+
2
+ require('rubygems')
3
+ require('aurita-gui/form')
4
+
5
+ include Aurita::GUI
6
+
7
+ describe Aurita::GUI::Options_Field, "values and labels" do
8
+ before do
9
+ end
10
+
11
+ it "should allow setting option as array, using values as labels" do
12
+ s = Select_Field.new(:name => :color)
13
+ s.value = :red
14
+ s.options = [ :blue, :red, :green, :yellow ]
15
+ end
16
+
17
+ it "should allow setting values as Hash (key / value map)" do
18
+ s = Select_Field.new(:name => :color)
19
+ s.value = 20
20
+ s.options = { 10 => :blue, 20 => :red, 30 => :green, 40 => :yellow }
21
+ end
22
+
23
+ it "should be possible to set values and labels seperately" do
24
+ s = Select_Field.new(:name => :color)
25
+ s.value = 20
26
+ s.option_values = [ 10, 20, 30, 40 ]
27
+ s.option_labels = [ :apple, :orange, :pear, :banana ]
28
+ end
29
+
30
+ it "should be possible to set/rename labels with a hash, mapping { value => label }" do
31
+ s = Radio_Field.new(:name => :color)
32
+ s.value = 'foo'
33
+ s.option_values = [ 10, 'foo', 30, 40 ]
34
+ s.option_labels = { 10 => :bleu, 'foo' => :rouge }
35
+ s.options['10'].should == :bleu
36
+ s.options['10'] = :noire
37
+ s.options['10'].should == :noire
38
+ s.options['foo'].should == :rouge
39
+ s.options['30'].should == 30
40
+ s.options['40'].should == 40
41
+ s.options[s.value.to_s].should == :rouge
42
+ end
43
+
44
+ end
@@ -0,0 +1,17 @@
1
+
2
+ require('rubygems')
3
+ require('aurita-gui/form')
4
+
5
+ include Aurita::GUI
6
+
7
+ describe Aurita::GUI::Options_Field, "values and labels" do
8
+ before do
9
+ end
10
+
11
+ it "should provide the same interface as an option field" do
12
+ s = Selection_List_Field.new(:name => :the_list)
13
+ s.options = { 0 => :foo, 1 => :bar, 2 => :batz, 3 => :bla, 4 => :gna}
14
+ s.value = [ 1, 3 ]
15
+ end
16
+
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aurita-gui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Fuchs
@@ -9,12 +9,20 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-27 00:00:00 +01:00
12
+ date: 2009-01-31 00:00:00 +01:00
13
13
  default_executable:
14
- dependencies: []
15
-
16
- description: Aurita::GUI provides an intuitive and flexible API for object-oriented creation of primitive and complex HTML elements, such as tables and forms. It is a core module of the Aurita application framework, but it can be used as stand-alone library in any context (such as rails). As there seems to be a lack of ruby form generators, i decided to release this part of Aurita in a single gem with no dependencies.
17
- email: fuchs@atomnode.net
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: arrayfields
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 4.6.0
23
+ version:
24
+ description: Aurita::GUI provides an intuitive and flexible API for object-oriented creation of primitive and complex HTML elements, such as tables and forms. It is a core module of the Aurita application framework, but it can be used as stand-alone library in any context (such as rails). As there seems to be a lack of ruby form generators, i decided to release this part of Aurita in a single gem with no dependencies on aurita itself.
25
+ email: fuchs@wortundform.de
18
26
  executables: []
19
27
 
20
28
  extensions: []
@@ -26,6 +34,7 @@ files:
26
34
  - History.txt
27
35
  - lib
28
36
  - samples
37
+ - README
29
38
  - aurita-gui.gemspec
30
39
  - bin
31
40
  - TODO
@@ -38,9 +47,11 @@ files:
38
47
  - lib/aurita-gui/button.rb
39
48
  - lib/aurita-gui/form.rb
40
49
  - lib/aurita-gui/html.rb
50
+ - lib/aurita-gui/builtest.rb
41
51
  - lib/aurita-gui/table.rb
42
52
  - lib/aurita-gui/form
43
53
  - lib/aurita-gui/element.rb
54
+ - lib/aurita-gui/selection_list_test.rb
44
55
  - lib/aurita-gui/form/password_field.rb
45
56
  - lib/aurita-gui/form/options_field.rb
46
57
  - lib/aurita-gui/form/file_field.rb
@@ -51,6 +62,7 @@ files:
51
62
  - lib/aurita-gui/form/datetime_field.rb
52
63
  - lib/aurita-gui/form/boolean_field.rb
53
64
  - lib/aurita-gui/form/fieldset.rb
65
+ - lib/aurita-gui/form/selection_list.rb
54
66
  - lib/aurita-gui/form/select_field.rb
55
67
  - lib/aurita-gui/form/radio_field.rb
56
68
  - lib/aurita-gui/form/hidden_field.rb
@@ -67,6 +79,8 @@ files:
67
79
  - spec/javascript.rb
68
80
  - spec/form.rb
69
81
  - spec/html.rb
82
+ - spec/options.rb
83
+ - spec/selection_list.rb
70
84
  - spec/element.rb
71
85
  has_rdoc: true
72
86
  homepage: http://aurita.wortundform.de/