aurita-gui 0.5.0 → 0.5.9
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/Manifest.txt +55 -0
- data/aurita-gui.gemspec +58 -8
- data/lib/aurita-gui/element.rb +7 -2
- data/lib/aurita-gui/form.rb +104 -28
- data/lib/aurita-gui/form/fieldset.rb +82 -7
- data/lib/aurita-gui/form/form_field.rb +0 -7
- data/lib/aurita-gui/form/time_field.rb +2 -1
- data/lib/aurita-gui/table.rb +18 -6
- data/lib/aurita-gui/widget.rb +40 -0
- data/spec/fieldset.rb +127 -0
- data/spec/form.rb +19 -1
- data/spec/table.rb +7 -7
- metadata +57 -56
data/Manifest.txt
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
./README.txt
|
2
|
+
./Manifest.txt
|
3
|
+
./spec
|
4
|
+
./spec/html.rb
|
5
|
+
./spec/form.rb
|
6
|
+
./spec/element.rb
|
7
|
+
./spec/options.rb
|
8
|
+
./spec/fieldset.rb
|
9
|
+
./spec/javascript.rb
|
10
|
+
./spec/marshal.rb
|
11
|
+
./spec/selection_list.rb
|
12
|
+
./spec/init_code.rb
|
13
|
+
./spec/table.rb
|
14
|
+
./TODO
|
15
|
+
./samples
|
16
|
+
./samples/putstest.rb
|
17
|
+
./samples/recurse.rb
|
18
|
+
./samples/cheatsheet.rb
|
19
|
+
./samples/valuetest.rb
|
20
|
+
./samples/pushtest.rb
|
21
|
+
./aurita-gui.gemspec
|
22
|
+
./lib
|
23
|
+
./lib/aurita-gui.rb
|
24
|
+
./lib/aurita-gui
|
25
|
+
./lib/aurita-gui/element_fixed.rb
|
26
|
+
./lib/aurita-gui/html.rb
|
27
|
+
./lib/aurita-gui/form.rb
|
28
|
+
./lib/aurita-gui/widget.rb
|
29
|
+
./lib/aurita-gui/button.rb
|
30
|
+
./lib/aurita-gui/element.rb
|
31
|
+
./lib/aurita-gui/form
|
32
|
+
./lib/aurita-gui/form/datetime_field.rb
|
33
|
+
./lib/aurita-gui/form/input_field.rb
|
34
|
+
./lib/aurita-gui/form/radio_field.rb
|
35
|
+
./lib/aurita-gui/form/checkbox_field.rb
|
36
|
+
./lib/aurita-gui/form/time_field.rb
|
37
|
+
./lib/aurita-gui/form/date_field.rb
|
38
|
+
./lib/aurita-gui/form/form_field.rb
|
39
|
+
./lib/aurita-gui/form/options_field.rb
|
40
|
+
./lib/aurita-gui/form/password_field.rb
|
41
|
+
./lib/aurita-gui/form/text_field.rb
|
42
|
+
./lib/aurita-gui/form/textarea_field.rb
|
43
|
+
./lib/aurita-gui/form/select_field.rb
|
44
|
+
./lib/aurita-gui/form/file_field.rb
|
45
|
+
./lib/aurita-gui/form/hidden_field.rb
|
46
|
+
./lib/aurita-gui/form/template_helper.rb
|
47
|
+
./lib/aurita-gui/form/boolean_field.rb
|
48
|
+
./lib/aurita-gui/form/form_error.rb
|
49
|
+
./lib/aurita-gui/form/fieldset.rb
|
50
|
+
./lib/aurita-gui/form/selection_list.rb
|
51
|
+
./lib/aurita-gui/javascript.rb
|
52
|
+
./lib/aurita-gui/marshal.rb
|
53
|
+
./lib/aurita-gui/table.rb
|
54
|
+
./bin
|
55
|
+
./LICENSE
|
data/aurita-gui.gemspec
CHANGED
@@ -14,19 +14,69 @@ 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
15
|
part of Aurita in a single gem with no dependencies on aurita itself.
|
16
16
|
EOF
|
17
|
-
s.version = '0.5.
|
17
|
+
s.version = '0.5.9'
|
18
18
|
s.author = 'Tobias Fuchs'
|
19
19
|
s.email = 'fuchs@wortundform.de'
|
20
20
|
s.date = Time.now
|
21
21
|
s.files = '*.rb'
|
22
22
|
s.add_dependency('arrayfields', '>= 4.6.0')
|
23
|
-
s.files =
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
s.files = [
|
24
|
+
'./README.txt',
|
25
|
+
'./Manifest.txt',
|
26
|
+
'./spec',
|
27
|
+
'./spec/html.rb',
|
28
|
+
'./spec/form.rb',
|
29
|
+
'./spec/element.rb',
|
30
|
+
'./spec/options.rb',
|
31
|
+
'./spec/fieldset.rb',
|
32
|
+
'./spec/javascript.rb',
|
33
|
+
'./spec/marshal.rb',
|
34
|
+
'./spec/selection_list.rb',
|
35
|
+
'./spec/init_code.rb',
|
36
|
+
'./spec/table.rb',
|
37
|
+
'./TODO',
|
38
|
+
'./samples',
|
39
|
+
'./samples/putstest.rb',
|
40
|
+
'./samples/recurse.rb',
|
41
|
+
'./samples/cheatsheet.rb',
|
42
|
+
'./samples/valuetest.rb',
|
43
|
+
'./samples/pushtest.rb',
|
44
|
+
'./aurita-gui.gemspec',
|
45
|
+
'./lib',
|
46
|
+
'./lib/aurita-gui.rb',
|
47
|
+
'./lib/aurita-gui',
|
48
|
+
'./lib/aurita-gui/element_fixed.rb',
|
49
|
+
'./lib/aurita-gui/html.rb',
|
50
|
+
'./lib/aurita-gui/form.rb',
|
51
|
+
'./lib/aurita-gui/widget.rb',
|
52
|
+
'./lib/aurita-gui/button.rb',
|
53
|
+
'./lib/aurita-gui/element.rb',
|
54
|
+
'./lib/aurita-gui/form',
|
55
|
+
'./lib/aurita-gui/form/datetime_field.rb',
|
56
|
+
'./lib/aurita-gui/form/input_field.rb',
|
57
|
+
'./lib/aurita-gui/form/radio_field.rb',
|
58
|
+
'./lib/aurita-gui/form/checkbox_field.rb',
|
59
|
+
'./lib/aurita-gui/form/time_field.rb',
|
60
|
+
'./lib/aurita-gui/form/date_field.rb',
|
61
|
+
'./lib/aurita-gui/form/form_field.rb',
|
62
|
+
'./lib/aurita-gui/form/options_field.rb',
|
63
|
+
'./lib/aurita-gui/form/password_field.rb',
|
64
|
+
'./lib/aurita-gui/form/text_field.rb',
|
65
|
+
'./lib/aurita-gui/form/textarea_field.rb',
|
66
|
+
'./lib/aurita-gui/form/select_field.rb',
|
67
|
+
'./lib/aurita-gui/form/file_field.rb',
|
68
|
+
'./lib/aurita-gui/form/hidden_field.rb',
|
69
|
+
'./lib/aurita-gui/form/template_helper.rb',
|
70
|
+
'./lib/aurita-gui/form/boolean_field.rb',
|
71
|
+
'./lib/aurita-gui/form/form_error.rb',
|
72
|
+
'./lib/aurita-gui/form/fieldset.rb',
|
73
|
+
'./lib/aurita-gui/form/selection_list.rb',
|
74
|
+
'./lib/aurita-gui/javascript.rb',
|
75
|
+
'./lib/aurita-gui/marshal.rb',
|
76
|
+
'./lib/aurita-gui/table.rb',
|
77
|
+
'./bin',
|
78
|
+
'./LICENSE'
|
79
|
+
]
|
30
80
|
|
31
81
|
s.has_rdoc = true
|
32
82
|
s.rdoc_options << '--title' << 'Aurita::GUI' <<
|
data/lib/aurita-gui/element.rb
CHANGED
@@ -203,7 +203,7 @@ module GUI
|
|
203
203
|
@content = params[:content] unless @content
|
204
204
|
end
|
205
205
|
# DON'T EVER USE @content.string UNLESS FOR RENDERING!!
|
206
|
-
# @content = nil if @content.to_s.length == 0
|
206
|
+
# @content = nil if @content.to_s.length == 0 # <--- NOOOOooo!
|
207
207
|
# instead, do:
|
208
208
|
@content = nil if !@content.is_a?(Element) && ((@content.respond_to?(:length) && @content.length == 0))
|
209
209
|
@content = [ @content ] unless (@content.kind_of? Array or @content.nil?)
|
@@ -222,6 +222,10 @@ module GUI
|
|
222
222
|
super(@content)
|
223
223
|
end
|
224
224
|
|
225
|
+
def inspect
|
226
|
+
"#{self.class.to_s}: <#{@tag}>, #{@attrib.inspect} { #{@content.inspect} }"
|
227
|
+
end
|
228
|
+
|
225
229
|
# To definitely tell if a class is
|
226
230
|
# anyhow derived from Element, use
|
227
231
|
#
|
@@ -241,7 +245,8 @@ module GUI
|
|
241
245
|
def touch
|
242
246
|
@touched = true
|
243
247
|
@string = nil
|
244
|
-
|
248
|
+
# Don't re-touch! Parent could have been caller!
|
249
|
+
@parent.touch() if (@parent && !@parent.touched?)
|
245
250
|
end
|
246
251
|
alias touch! touch
|
247
252
|
def touched?
|
data/lib/aurita-gui/form.rb
CHANGED
@@ -42,7 +42,7 @@ module GUI
|
|
42
42
|
# To use your own implementation as defaut, overload Form.initialize
|
43
43
|
# like
|
44
44
|
#
|
45
|
-
# class My_Form < Aurita::GUI::
|
45
|
+
# class My_Form < Aurita::GUI::For
|
46
46
|
# def initialize(params={}, &block)
|
47
47
|
# super(params, &block)
|
48
48
|
# @field_decorator = My_Field_Decorator
|
@@ -313,7 +313,29 @@ module GUI
|
|
313
313
|
#
|
314
314
|
class Form < Element
|
315
315
|
|
316
|
-
|
316
|
+
# Array of form field names ordered by appearance in the form.
|
317
|
+
# It is used to determine which fields to render, and in which
|
318
|
+
# order.
|
319
|
+
attr_accessor :fields
|
320
|
+
|
321
|
+
# Array of Form_Field instances includes in this form.
|
322
|
+
attr_accessor :elements
|
323
|
+
|
324
|
+
# Hash mapping field names to Form_Field instances.
|
325
|
+
attr_accessor :element_map
|
326
|
+
|
327
|
+
# Hash mapping form field names to their values.
|
328
|
+
attr_accessor :values
|
329
|
+
|
330
|
+
# Field decorator class to use for decorating single fields.
|
331
|
+
attr_accessor :field_decorator
|
332
|
+
|
333
|
+
# Decorator class to use for decorating the form content.
|
334
|
+
attr_accessor :content_decorator
|
335
|
+
|
336
|
+
# Array of fieldsets in this form, ordered by appearance in
|
337
|
+
# the form.
|
338
|
+
attr_reader :fieldsets
|
317
339
|
|
318
340
|
def initialize(params={}, &block)
|
319
341
|
@fields = params[:fields]
|
@@ -321,6 +343,7 @@ module GUI
|
|
321
343
|
@fields ||= []
|
322
344
|
@elements = []
|
323
345
|
@element_map = {}
|
346
|
+
@fieldsets = {}
|
324
347
|
@values ||= {}
|
325
348
|
@title = false
|
326
349
|
@custom_fields = false
|
@@ -351,6 +374,7 @@ module GUI
|
|
351
374
|
# parameter is of type Numeric, by name otherwhise)
|
352
375
|
def [](index)
|
353
376
|
return @elements[index] if index.kind_of? Numeric
|
377
|
+
return @element_map[index] if @element_map[index]
|
354
378
|
return @element_map[index.to_s]
|
355
379
|
end
|
356
380
|
|
@@ -391,13 +415,21 @@ module GUI
|
|
391
415
|
# with same field name.
|
392
416
|
def add(form_field_element)
|
393
417
|
touch()
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
418
|
+
if form_field_element.is_a?(Fieldset) then
|
419
|
+
form_field_element.field_decorator = @field_decorator
|
420
|
+
form_field_element.content_decorator = @content_decorator
|
421
|
+
@element_map.update(form_field_element.element_map)
|
422
|
+
@elements << form_field_element
|
423
|
+
@fieldsets[form_field_element.name.to_s] = form_field_element
|
424
|
+
else
|
425
|
+
field_name = form_field_element.name.to_s
|
426
|
+
form_field_element.value = @values[field_name] unless form_field_element.value.to_s != ''
|
427
|
+
if !form_field_element.dom_id then
|
428
|
+
form_field_element.dom_id = field_name.gsub('.','_')
|
429
|
+
end
|
430
|
+
@element_map[field_name] = form_field_element
|
431
|
+
@elements << form_field_element
|
398
432
|
end
|
399
|
-
@element_map[field_name] = form_field_element
|
400
|
-
@elements << form_field_element
|
401
433
|
@content = false # Invalidate
|
402
434
|
end
|
403
435
|
|
@@ -413,10 +445,50 @@ module GUI
|
|
413
445
|
def fields=(attrib_array)
|
414
446
|
touch()
|
415
447
|
@custom_fields = true
|
416
|
-
@fields = attrib_array.
|
448
|
+
@fields = attrib_array.map { |field|
|
449
|
+
(field.is_a?(Hash))? field : field.to_s
|
450
|
+
}
|
451
|
+
attrib_array.each { |attrib|
|
452
|
+
if attrib.is_a?(Hash) then
|
453
|
+
attrib.each_pair { |fieldset_name, fieldset_fields|
|
454
|
+
legend = false
|
455
|
+
if fieldset_fields.is_a?(Hash) then
|
456
|
+
legend = fieldset_fields[:legend]
|
457
|
+
fieldset_fields = fieldset_fields[:fields]
|
458
|
+
end
|
459
|
+
# This is a configuration for a fieldset.
|
460
|
+
# There are two cases:
|
461
|
+
fieldset = @fieldsets[fieldset_name.to_s]
|
462
|
+
if fieldset then
|
463
|
+
# - The fieldset already has been added to this form.
|
464
|
+
# In this case, just pass field settings along to
|
465
|
+
# the fieldset.
|
466
|
+
fieldset.fields = fieldset_fields
|
467
|
+
else
|
468
|
+
# - There is no fieldset with given name in this form.
|
469
|
+
# In this case, we expect that at least the given
|
470
|
+
# form fields are present in this form, and we
|
471
|
+
# implicitly create a Fieldset instance here.
|
472
|
+
fieldset = Fieldset.new(:name => fieldset_name, :legend => legend)
|
473
|
+
fieldset_fields.each { |field|
|
474
|
+
existing_field = @element_map[field.to_s]
|
475
|
+
fieldset.add(existing_field) if existing_field
|
476
|
+
}
|
477
|
+
fieldset.fields = fieldset_fields
|
478
|
+
add(fieldset)
|
479
|
+
end
|
480
|
+
}
|
481
|
+
end
|
482
|
+
}
|
417
483
|
@elements.each { |field|
|
418
|
-
|
484
|
+
if field.is_a?(Form_Field) then
|
485
|
+
# Update element map only if referenced eleemnt is a
|
486
|
+
# Form_Field, do not include Fieldset elements.
|
487
|
+
@element_map[field.name.to_s] = field
|
488
|
+
elsif field.is_a?(Fieldset) then
|
489
|
+
end
|
419
490
|
}
|
491
|
+
@content = false # Invalidate
|
420
492
|
end
|
421
493
|
alias set_field_config fields=
|
422
494
|
|
@@ -436,21 +508,18 @@ module GUI
|
|
436
508
|
end
|
437
509
|
alias set_values values=
|
438
510
|
|
439
|
-
# Set all elements to readonly rendering mode.
|
440
|
-
def readonly!
|
441
|
-
touch()
|
442
|
-
@elements.each { |e|
|
443
|
-
e.readonly!
|
444
|
-
}
|
445
|
-
end
|
446
|
-
|
447
511
|
# Return array of field names currently
|
448
512
|
# available for rendering.
|
449
513
|
def fields()
|
450
514
|
if !@custom_fields || @fields.length == 0 then
|
451
515
|
@elements.each { |field|
|
452
|
-
|
453
|
-
|
516
|
+
if field.is_a?(Form_Field) then
|
517
|
+
@fields << field.name
|
518
|
+
@element_map[field.name.to_s] = field
|
519
|
+
elsif field.is_a?(Fieldset) then
|
520
|
+
@fields << { field.name => field.fields }
|
521
|
+
@element_map.update(field.element_map)
|
522
|
+
end
|
454
523
|
}
|
455
524
|
end
|
456
525
|
@fields.uniq!
|
@@ -475,19 +544,26 @@ module GUI
|
|
475
544
|
# Return underlying HTML element instance (HTML.ul),
|
476
545
|
# without wrapping HTML.form element.
|
477
546
|
def content
|
478
|
-
# TODO: Provide Fieldset instances
|
479
547
|
@content = []
|
480
548
|
if @title then
|
481
549
|
@content << HTML.h1(:class => :form_title) { @title }
|
482
550
|
end
|
483
551
|
fields().each { |field|
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
@content <<
|
489
|
-
|
490
|
-
|
552
|
+
if field.is_a?(Hash) then
|
553
|
+
# This is a fieldset
|
554
|
+
field.each_pair { |fieldset_name, fieldset_fields|
|
555
|
+
# Get Fieldset instance by name from @element_map:
|
556
|
+
@content << HTML.li { @fieldsets[fieldset_name.to_s] }
|
557
|
+
}
|
558
|
+
else
|
559
|
+
element = @element_map[field.to_s]
|
560
|
+
if element then
|
561
|
+
element = element.to_hidden_field() if element.hidden?
|
562
|
+
if element.kind_of? Aurita::GUI::Hidden_Field then
|
563
|
+
@content << element
|
564
|
+
else
|
565
|
+
@content << @field_decorator.new(element)
|
566
|
+
end
|
491
567
|
end
|
492
568
|
end
|
493
569
|
}
|
@@ -5,24 +5,45 @@ module Aurita
|
|
5
5
|
module GUI
|
6
6
|
|
7
7
|
class Fieldset < Element
|
8
|
-
attr_accessor :legend
|
8
|
+
attr_accessor :legend
|
9
|
+
|
10
|
+
attr_accessor :label
|
11
|
+
|
12
|
+
attr_accessor :name
|
13
|
+
|
14
|
+
attr_accessor :element_map
|
15
|
+
|
16
|
+
attr_accessor :elements
|
17
|
+
|
18
|
+
attr_accessor :field_decorator
|
19
|
+
|
20
|
+
attr_accessor :content_dacorator
|
9
21
|
|
10
22
|
def initialize(params, &block)
|
11
|
-
params[:tag]
|
12
|
-
|
13
|
-
@
|
23
|
+
params[:tag] = :fieldset
|
24
|
+
params[:id] = params[:name] unless params[:id]
|
25
|
+
@name = params[:name]
|
26
|
+
@fields = []
|
27
|
+
@elements = []
|
28
|
+
@element_map = {}
|
29
|
+
@field_decorator = Aurita::GUI::Form_Field_Wrapper
|
30
|
+
@content_decorator = Aurita::GUI::Form_Content_Wrapper
|
31
|
+
|
14
32
|
if block_given? then
|
15
33
|
yield.each { |field_element|
|
16
34
|
add(field_element)
|
17
35
|
}
|
18
36
|
end
|
37
|
+
|
19
38
|
legend_element = params[:legend]
|
20
39
|
legend_element ||= params[:label]
|
21
|
-
set_legend(legend_element)
|
40
|
+
set_legend(legend_element) if legend_element
|
22
41
|
params.delete(:legend)
|
23
42
|
params.delete(:label)
|
24
43
|
params.delete(:name)
|
25
44
|
super(params, &block)
|
45
|
+
|
46
|
+
@content = false
|
26
47
|
end
|
27
48
|
alias legend label
|
28
49
|
|
@@ -36,19 +57,73 @@ module GUI
|
|
36
57
|
alias set_legend legend=
|
37
58
|
alias label= legend=
|
38
59
|
|
60
|
+
def each(&block)
|
61
|
+
@elements.each(&block)
|
62
|
+
end
|
63
|
+
|
39
64
|
def add(field_element)
|
40
65
|
@elements << field_element
|
66
|
+
@element_map[field_element.name.to_s] = field_element
|
67
|
+
@fields << field_element.name
|
68
|
+
|
69
|
+
touch()
|
70
|
+
end
|
71
|
+
|
72
|
+
def fields=(attrib_array)
|
73
|
+
@fields = attrib_array.map { |f| f.to_s }
|
74
|
+
touch()
|
75
|
+
end
|
76
|
+
|
77
|
+
def fields
|
78
|
+
@fields
|
79
|
+
end
|
80
|
+
|
81
|
+
# Set all elements to readonly rendering mode.
|
82
|
+
def readonly!
|
83
|
+
@elements.each { |e|
|
84
|
+
e.readonly!
|
85
|
+
}
|
86
|
+
touch()
|
87
|
+
end
|
88
|
+
# Set all form elements to editable mode.
|
89
|
+
def editable!
|
90
|
+
@elements.each { |e|
|
91
|
+
e.editable!
|
92
|
+
}
|
93
|
+
touch()
|
94
|
+
end
|
95
|
+
|
96
|
+
def length
|
97
|
+
@elements.length
|
41
98
|
end
|
42
99
|
|
43
100
|
def content
|
101
|
+
return @content if (@content && !@touched)
|
102
|
+
|
103
|
+
@content = fields().map { |field|
|
104
|
+
element = @element_map[field.to_s]
|
105
|
+
STDERR.puts "What the? #{field.inspect}" unless element
|
106
|
+
@field_decorator.new(element) if element
|
107
|
+
}
|
108
|
+
|
109
|
+
@content = @content_decorator.new() { @content }
|
110
|
+
@content.add_css_class(:fieldset)
|
111
|
+
|
44
112
|
if @legend then
|
45
|
-
@content =
|
113
|
+
@content = HTML.fieldset { @legend + @content }
|
46
114
|
else
|
47
|
-
@content = @
|
115
|
+
@content = HTML.fieldset { @content}
|
48
116
|
end
|
117
|
+
|
49
118
|
return @content
|
50
119
|
end
|
51
120
|
|
121
|
+
def string
|
122
|
+
content().to_s
|
123
|
+
end
|
124
|
+
alias to_s string
|
125
|
+
alias to_str string
|
126
|
+
|
52
127
|
end
|
53
128
|
|
54
129
|
end
|
@@ -131,13 +131,6 @@ module GUI
|
|
131
131
|
super(params)
|
132
132
|
end
|
133
133
|
|
134
|
-
=begin
|
135
|
-
def form=(form_instance)
|
136
|
-
@form = form_instance
|
137
|
-
@params[:parent] = @form
|
138
|
-
end
|
139
|
-
=end
|
140
|
-
|
141
134
|
# Virtual method.
|
142
135
|
def element
|
143
136
|
raise Form_Error.new('Form_Field@element not set') unless @element
|
@@ -44,6 +44,7 @@ module GUI
|
|
44
44
|
:class => :minute_select,
|
45
45
|
:value => @minute, :options => options)
|
46
46
|
end
|
47
|
+
@minute_element
|
47
48
|
end
|
48
49
|
def second_element
|
49
50
|
if !@second_element then
|
@@ -58,7 +59,7 @@ module GUI
|
|
58
59
|
|
59
60
|
def element
|
60
61
|
select_fields = []
|
61
|
-
@time_format.
|
62
|
+
@time_format.to_s.split('').each { |c|
|
62
63
|
case c
|
63
64
|
when 'h' then
|
64
65
|
select_fields << hour_element()
|
data/lib/aurita-gui/table.rb
CHANGED
@@ -53,8 +53,8 @@ module GUI
|
|
53
53
|
@column_css_classes = params[:column_css_classes]
|
54
54
|
@column_css_classes ||= []
|
55
55
|
@column_css_classes = [ @column_css_classes ] unless @column_css_classes.is_a?(Array)
|
56
|
-
params[:cellpadding]
|
57
|
-
params[:cellspacing]
|
56
|
+
params[:cellpadding] = 0 unless params[:cellpadding]
|
57
|
+
params[:cellspacing] = 0 unless params[:cellspacing]
|
58
58
|
params.delete(:headers)
|
59
59
|
params.delete(:num_columns)
|
60
60
|
params.delete(:row_css_classes)
|
@@ -63,8 +63,9 @@ module GUI
|
|
63
63
|
super(params, &block)
|
64
64
|
end
|
65
65
|
|
66
|
-
def headers=(headers)
|
66
|
+
def headers=(*headers)
|
67
67
|
@headers = headers
|
68
|
+
@headers = headers.first if headers.is_a?(Array)
|
68
69
|
if @headers.length > 0 then
|
69
70
|
@headers.map! { |cell|
|
70
71
|
if cell.is_a? Element then
|
@@ -77,6 +78,13 @@ module GUI
|
|
77
78
|
end
|
78
79
|
alias set_headers headers=
|
79
80
|
|
81
|
+
def column_css_classes=(*classes)
|
82
|
+
@column_css_classes = classes
|
83
|
+
@column_css_classes.flatten!
|
84
|
+
# touch()
|
85
|
+
end
|
86
|
+
alias set_column_css_classes column_css_classes=
|
87
|
+
|
80
88
|
def add_row(*row_data)
|
81
89
|
if row_data.first.is_a?(Array) then
|
82
90
|
row_data = row_data.first
|
@@ -114,13 +122,17 @@ module GUI
|
|
114
122
|
}
|
115
123
|
end
|
116
124
|
|
125
|
+
# Returns cell at given column and row (like x, y coordinates)
|
117
126
|
def cell(column, row)
|
118
127
|
rows[row][column]
|
119
128
|
end
|
120
129
|
|
130
|
+
# Returns Table_Row instance at given row index in table.
|
121
131
|
def [](row_index)
|
122
132
|
rows[row_index]
|
123
133
|
end
|
134
|
+
|
135
|
+
# Sets Table_Row instance at given row index in table.
|
124
136
|
def []=(row_index, row_data)
|
125
137
|
rows[row_index] = row_data
|
126
138
|
end
|
@@ -169,7 +181,7 @@ module GUI
|
|
169
181
|
end
|
170
182
|
|
171
183
|
def string
|
172
|
-
if
|
184
|
+
if touched? then
|
173
185
|
@cells = []
|
174
186
|
@cell_data.each { |cell|
|
175
187
|
@cells << @cell_class.new(cell, :parent => self, :column_index => column_index)
|
@@ -205,14 +217,14 @@ module GUI
|
|
205
217
|
#
|
206
218
|
# cell = my_table[row][column]
|
207
219
|
# cell.content = 'New cell content'
|
208
|
-
# cell.class
|
220
|
+
# cell.class = 'table_cell_css_class'
|
209
221
|
#
|
210
222
|
class Table_Cell < Element
|
211
223
|
|
212
224
|
attr_accessor :value, :presentation_class, :parent
|
213
225
|
|
214
226
|
def initialize(cell_element, params={})
|
215
|
-
params[:tag]
|
227
|
+
params[:tag] = :td
|
216
228
|
@content ||= cell_element
|
217
229
|
@value ||= cell_element
|
218
230
|
@presentation_class ||= false
|
data/lib/aurita-gui/widget.rb
CHANGED
@@ -5,6 +5,46 @@ require('aurita-gui/element')
|
|
5
5
|
module Aurita
|
6
6
|
module GUI
|
7
7
|
|
8
|
+
# Widget is a proxy / factory for an actual Aurita::GUI::Element.
|
9
|
+
# Method #element has to be overloaded that defines the Element
|
10
|
+
# instance the class is delegating to.
|
11
|
+
#
|
12
|
+
# A simple widget could look like this:
|
13
|
+
#
|
14
|
+
# class Annotated_Image < Aurita::GUI::Widget
|
15
|
+
#
|
16
|
+
# attr_accessor :src, :title, :description
|
17
|
+
#
|
18
|
+
# def initialize(params={})
|
19
|
+
# @src = params[:src]
|
20
|
+
# @title = params[:title]
|
21
|
+
# @description = params[:description]
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# def element
|
25
|
+
# HTML.div.annotated_image {
|
26
|
+
# HTML.img(:src => @src, :title => @title, :alt => @title) +
|
27
|
+
# HTML.p { @description }
|
28
|
+
# }
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# end # class
|
32
|
+
#
|
33
|
+
# It then can be used like a regular Element instance:
|
34
|
+
#
|
35
|
+
# image = Annotated_Image.new(:src => '/images/wombat.jpg',
|
36
|
+
# :title => 'wombat',
|
37
|
+
# :description => 'A cute wombat')
|
38
|
+
# image.add_css_class(:active)
|
39
|
+
# puts image.string
|
40
|
+
#
|
41
|
+
# -->
|
42
|
+
#
|
43
|
+
# <div class="annotated_image active">
|
44
|
+
# <img src="/images/wombat.jpg" title="wombat" alt="wombat" />
|
45
|
+
# <p>A cute wombat</p>
|
46
|
+
# </div>
|
47
|
+
#
|
8
48
|
class Widget < DelegateClass(Element)
|
9
49
|
include Aurita::GUI
|
10
50
|
|
data/spec/fieldset.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
|
2
|
+
require('rubygems')
|
3
|
+
require('aurita-gui/form')
|
4
|
+
|
5
|
+
include Aurita::GUI
|
6
|
+
|
7
|
+
describe Aurita::GUI::Form, "basic rendering" do
|
8
|
+
before do
|
9
|
+
@form = Form.new()
|
10
|
+
@first_input_field = Input_Field.new(:name => :first_input_field, :value => 42)
|
11
|
+
@second_input_field = Input_Field.new(:name => :second_input_field)
|
12
|
+
@fieldset = Fieldset.new(:legend => 'First fieldset', :name => :the_fieldset) {
|
13
|
+
@first_input_field + @second_input_field
|
14
|
+
}
|
15
|
+
@third_input_field = Input_Field.new(:name => :third_input_field)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should provide method #add to add form fields" do
|
19
|
+
@form.add(@third_input_field)
|
20
|
+
@form.add(@fieldset)
|
21
|
+
|
22
|
+
@form.elements.length.should == 2
|
23
|
+
|
24
|
+
@form[:first_input_field].value.should == 42
|
25
|
+
@form[:second_input_field].value = 23
|
26
|
+
@form[:second_input_field].value.should == 23
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should allow access to form fields by index" do
|
30
|
+
@form.add(@fieldset)
|
31
|
+
@form.add(@third_input_field)
|
32
|
+
@form.elements[0].should == @fieldset
|
33
|
+
@form.elements[1].should == @third_input_field
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should render as a <fieldset> element" do
|
37
|
+
@form.add(@fieldset)
|
38
|
+
@form.add(@third_input_field)
|
39
|
+
|
40
|
+
expected = <<END
|
41
|
+
<form method="POST" enctype="multipart/form-data">
|
42
|
+
<ul class="form_fields">
|
43
|
+
<li>
|
44
|
+
<fieldset>
|
45
|
+
<legend>First fieldset</legend>
|
46
|
+
<ul class="form_fields fieldset">
|
47
|
+
<li class="input_field_wrap form_field" id="first_input_field_wrap">
|
48
|
+
<input type="text" value="42" name="first_input_field" id="first_input_field" />
|
49
|
+
</li>
|
50
|
+
|
51
|
+
<li class="input_field_wrap form_field" id="second_input_field_wrap">
|
52
|
+
<input type="text" name="second_input_field" id="second_input_field" />
|
53
|
+
</li>
|
54
|
+
</ul>
|
55
|
+
</fieldset>
|
56
|
+
|
57
|
+
</li>
|
58
|
+
|
59
|
+
<li class="input_field_wrap form_field" id="third_input_field_wrap">
|
60
|
+
<input type="text" name="third_input_field" id="third_input_field" />
|
61
|
+
</li>
|
62
|
+
</ul>
|
63
|
+
</form>
|
64
|
+
END
|
65
|
+
@form.to_s.gsub("\n",'').gsub(/>\s*</,'><').should == expected.gsub("\n",'').gsub(/>\s*</,'><')
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should allow applying field settings to a form's fieldsets" do
|
69
|
+
form = Form.new()
|
70
|
+
|
71
|
+
first = Text_Field.new(:name => :first, :value => 1)
|
72
|
+
second = Text_Field.new(:name => :second, :value => 2)
|
73
|
+
third = Text_Field.new(:name => :third, :value => 3)
|
74
|
+
|
75
|
+
form.add(first)
|
76
|
+
form.add(second)
|
77
|
+
form.add(third)
|
78
|
+
|
79
|
+
form.fields = [ { :the_legend => [ :first, :third ] }, :second ]
|
80
|
+
|
81
|
+
expected = <<END
|
82
|
+
<form method="POST" enctype="multipart/form-data">
|
83
|
+
<ul class="form_fields">
|
84
|
+
<li>
|
85
|
+
<fieldset>
|
86
|
+
<ul class="form_fields fieldset">
|
87
|
+
<li class="text_field_wrap form_field" id="first_wrap">
|
88
|
+
<input type="text" value="1" name="first" id="first" />
|
89
|
+
</li>
|
90
|
+
<li class="text_field_wrap form_field" id="third_wrap">
|
91
|
+
<input type="text" value="3" name="third" id="third" />
|
92
|
+
</li>
|
93
|
+
</ul>
|
94
|
+
</fieldset>
|
95
|
+
</li>
|
96
|
+
<li class="text_field_wrap form_field" id="second_wrap">
|
97
|
+
<input type="text" value="2" name="second" id="second" />
|
98
|
+
</li>
|
99
|
+
</ul>
|
100
|
+
</form>
|
101
|
+
END
|
102
|
+
|
103
|
+
form.to_s.gsub("\n",'').gsub(/>\s*</,'><').should == expected.gsub("\n",'').gsub(/>\s*</,'><')
|
104
|
+
|
105
|
+
form.fields = [ { :the_legend => [ :third ] }, :second ]
|
106
|
+
expected = <<END
|
107
|
+
<form method="POST" enctype="multipart/form-data">
|
108
|
+
<ul class="form_fields">
|
109
|
+
<li>
|
110
|
+
<fieldset>
|
111
|
+
<ul class="form_fields fieldset">
|
112
|
+
<li class="text_field_wrap form_field" id="third_wrap">
|
113
|
+
<input type="text" value="3" name="third" id="third" />
|
114
|
+
</li>
|
115
|
+
</ul>
|
116
|
+
</fieldset>
|
117
|
+
</li>
|
118
|
+
<li class="text_field_wrap form_field" id="second_wrap">
|
119
|
+
<input type="text" value="2" name="second" id="second" />
|
120
|
+
</li>
|
121
|
+
</ul>
|
122
|
+
</form>
|
123
|
+
END
|
124
|
+
form.to_s.gsub("\n",'').gsub(/>\s*</,'><').should == expected.gsub("\n",'').gsub(/>\s*</,'><')
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
data/spec/form.rb
CHANGED
@@ -10,7 +10,7 @@ describe Aurita::GUI::Form, "basic rendering" do
|
|
10
10
|
@text_field = Input_Field.new(:name => :textfield)
|
11
11
|
end
|
12
12
|
|
13
|
-
it "should
|
13
|
+
it "should provide method #add to add form fields" do
|
14
14
|
@form.add(@text_field)
|
15
15
|
end
|
16
16
|
|
@@ -25,4 +25,22 @@ describe Aurita::GUI::Form, "basic rendering" do
|
|
25
25
|
@form.to_s.should == '<form method="POST" enctype="multipart/form-data"><ul class="form_fields"><li class="input_field_wrap form_field" id="textfield_wrap"><input type="text" name="textfield" id="textfield" /></li></ul></form>'
|
26
26
|
end
|
27
27
|
|
28
|
+
it "should provide reordering of form fields" do
|
29
|
+
form = Form.new
|
30
|
+
|
31
|
+
text_1 = Text_Field.new(:name => :first, :value => 1)
|
32
|
+
checkbox = Checkbox_Field.new(:name => :second, :options => { 'foo' => 1, 'bar' => 2 } )
|
33
|
+
|
34
|
+
form.add(text_1)
|
35
|
+
form.add(checkbox)
|
36
|
+
|
37
|
+
form.fields = [ 'first' ]
|
38
|
+
|
39
|
+
puts form.to_s.gsub('><', ">\n<")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should provide disabling form fields for rendering" do
|
43
|
+
|
44
|
+
end
|
45
|
+
|
28
46
|
end
|
data/spec/table.rb
CHANGED
@@ -9,44 +9,44 @@ describe Aurita::GUI::Table, "basic rendering" do
|
|
9
9
|
it "should provide headers" do
|
10
10
|
table = Table.new(:headers => [ :username, :email, 'last login' ],
|
11
11
|
:class => 'spectable')
|
12
|
-
table.to_s.should == '<table class="spectable"><tr><th>username</th><th>email</th><th>last login</th></tr></table>'
|
12
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0" class="spectable"><tr><th>username</th><th>email</th><th>last login</th></tr></table>'
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should be possible to add rows" do
|
16
16
|
table = Table.new(:headers => [ :username, :email, 'last login' ],
|
17
17
|
:class => 'spectable')
|
18
18
|
table.add_row('a','b','c')
|
19
|
-
table.to_s.should == '<table class="spectable"><tr><th>username</th><th>email</th><th>last login</th></tr><tr><td>a</td><td>b</td><td>c</td></tr></table>'
|
19
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0" class="spectable"><tr><th>username</th><th>email</th><th>last login</th></tr><tr><td>a</td><td>b</td><td>c</td></tr></table>'
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should be possible to change cell values" do
|
23
23
|
table = Table.new(:class => 'spectable')
|
24
24
|
table.add_row('a','b','c')
|
25
25
|
table[0][1] = 'changed'
|
26
|
-
table.to_s.should == '<table class="spectable"><tr><td>a</td><td>changed</td><td>c</td></tr></table>'
|
26
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0" class="spectable"><tr><td>a</td><td>changed</td><td>c</td></tr></table>'
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should be possible to modify Table_Cell elements" do
|
30
30
|
table = Table.new(:column_css_classes => [ :c1, :c2, :c3 ] )
|
31
31
|
table.add_row('a','b','c')
|
32
|
-
table.to_s.should == '<table><tr><td class="c1">a</td><td class="c2">b</td><td class="c3">c</td></tr></table>'
|
32
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0"><tr><td class="c1">a</td><td class="c2">b</td><td class="c3">c</td></tr></table>'
|
33
33
|
table.add_row('a','b','c')
|
34
34
|
table[0].add_css_class(:gnarg)
|
35
35
|
table[0][1].add_css_class(:knorg)
|
36
|
-
table.to_s.should == '<table><tr class="gnarg"><td class="c1">a</td><td class="c2 knorg">b</td><td class="c3">c</td></tr><tr><td class="c1">a</td><td class="c2">b</td><td class="c3">c</td></tr></table>'
|
36
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0"><tr class="gnarg"><td class="c1">a</td><td class="c2 knorg">b</td><td class="c3">c</td></tr><tr><td class="c1">a</td><td class="c2">b</td><td class="c3">c</td></tr></table>'
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should be possible to set CSS classes for columns" do
|
40
40
|
table = Table.new(:class => 'spectable', :column_css_classes => [ :c1, :c2, :c3 ] )
|
41
41
|
table.add_row('a','b','c')
|
42
|
-
table.to_s.should == '<table class="spectable"><tr><td class="c1">a</td><td class="c2">b</td><td class="c3">c</td></tr></table>'
|
42
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0" class="spectable"><tr><td class="c1">a</td><td class="c2">b</td><td class="c3">c</td></tr></table>'
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should be possible to set CSS classes for rows" do
|
46
46
|
table = Table.new(:class => 'spectable', :row_css_classes => :trow )
|
47
47
|
table.add_row('a','b','c')
|
48
48
|
table.add_row('a','b','c')
|
49
|
-
table.to_s.should == '<table class="spectable"><tr class="trow"><td>a</td><td>b</td><td>c</td></tr><tr class="trow"><td>a</td><td>b</td><td>c</td></tr></table>'
|
49
|
+
table.to_s.should == '<table cellpadding="0" cellspacing="0" class="spectable"><tr class="trow"><td>a</td><td>b</td><td>c</td></tr><tr class="trow"><td>a</td><td>b</td><td>c</td></tr></table>'
|
50
50
|
end
|
51
51
|
|
52
52
|
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.5.
|
4
|
+
version: 0.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Fuchs
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08-
|
12
|
+
date: 2009-08-31 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -31,60 +31,61 @@ extensions: []
|
|
31
31
|
extra_rdoc_files: []
|
32
32
|
|
33
33
|
files:
|
34
|
-
-
|
35
|
-
-
|
36
|
-
- spec
|
37
|
-
-
|
38
|
-
-
|
39
|
-
-
|
40
|
-
-
|
41
|
-
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
-
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
52
|
-
-
|
53
|
-
-
|
54
|
-
-
|
55
|
-
- lib
|
56
|
-
- lib/aurita-gui
|
57
|
-
- lib/aurita-gui
|
58
|
-
- lib/aurita-gui/
|
59
|
-
- lib/aurita-gui/
|
60
|
-
- lib/aurita-gui/form
|
61
|
-
- lib/aurita-gui/
|
62
|
-
- lib/aurita-gui/
|
63
|
-
- lib/aurita-gui/
|
64
|
-
- lib/aurita-gui/form
|
65
|
-
- lib/aurita-gui/form/
|
66
|
-
- lib/aurita-gui/form/
|
67
|
-
- lib/aurita-gui/form/
|
68
|
-
- lib/aurita-gui/form/
|
69
|
-
- lib/aurita-gui/form/
|
70
|
-
- lib/aurita-gui/form/
|
71
|
-
- lib/aurita-gui/form/
|
72
|
-
- lib/aurita-gui/form/
|
73
|
-
- lib/aurita-gui/form/
|
74
|
-
-
|
75
|
-
-
|
76
|
-
-
|
77
|
-
-
|
78
|
-
-
|
79
|
-
-
|
80
|
-
-
|
81
|
-
-
|
82
|
-
-
|
83
|
-
-
|
84
|
-
-
|
85
|
-
-
|
86
|
-
-
|
87
|
-
-
|
34
|
+
- ./README.txt
|
35
|
+
- ./Manifest.txt
|
36
|
+
- ./spec
|
37
|
+
- ./spec/html.rb
|
38
|
+
- ./spec/form.rb
|
39
|
+
- ./spec/element.rb
|
40
|
+
- ./spec/options.rb
|
41
|
+
- ./spec/fieldset.rb
|
42
|
+
- ./spec/javascript.rb
|
43
|
+
- ./spec/marshal.rb
|
44
|
+
- ./spec/selection_list.rb
|
45
|
+
- ./spec/init_code.rb
|
46
|
+
- ./spec/table.rb
|
47
|
+
- ./TODO
|
48
|
+
- ./samples
|
49
|
+
- ./samples/putstest.rb
|
50
|
+
- ./samples/recurse.rb
|
51
|
+
- ./samples/cheatsheet.rb
|
52
|
+
- ./samples/valuetest.rb
|
53
|
+
- ./samples/pushtest.rb
|
54
|
+
- ./aurita-gui.gemspec
|
55
|
+
- ./lib
|
56
|
+
- ./lib/aurita-gui.rb
|
57
|
+
- ./lib/aurita-gui
|
58
|
+
- ./lib/aurita-gui/element_fixed.rb
|
59
|
+
- ./lib/aurita-gui/html.rb
|
60
|
+
- ./lib/aurita-gui/form.rb
|
61
|
+
- ./lib/aurita-gui/widget.rb
|
62
|
+
- ./lib/aurita-gui/button.rb
|
63
|
+
- ./lib/aurita-gui/element.rb
|
64
|
+
- ./lib/aurita-gui/form
|
65
|
+
- ./lib/aurita-gui/form/datetime_field.rb
|
66
|
+
- ./lib/aurita-gui/form/input_field.rb
|
67
|
+
- ./lib/aurita-gui/form/radio_field.rb
|
68
|
+
- ./lib/aurita-gui/form/checkbox_field.rb
|
69
|
+
- ./lib/aurita-gui/form/time_field.rb
|
70
|
+
- ./lib/aurita-gui/form/date_field.rb
|
71
|
+
- ./lib/aurita-gui/form/form_field.rb
|
72
|
+
- ./lib/aurita-gui/form/options_field.rb
|
73
|
+
- ./lib/aurita-gui/form/password_field.rb
|
74
|
+
- ./lib/aurita-gui/form/text_field.rb
|
75
|
+
- ./lib/aurita-gui/form/textarea_field.rb
|
76
|
+
- ./lib/aurita-gui/form/select_field.rb
|
77
|
+
- ./lib/aurita-gui/form/file_field.rb
|
78
|
+
- ./lib/aurita-gui/form/hidden_field.rb
|
79
|
+
- ./lib/aurita-gui/form/template_helper.rb
|
80
|
+
- ./lib/aurita-gui/form/boolean_field.rb
|
81
|
+
- ./lib/aurita-gui/form/form_error.rb
|
82
|
+
- ./lib/aurita-gui/form/fieldset.rb
|
83
|
+
- ./lib/aurita-gui/form/selection_list.rb
|
84
|
+
- ./lib/aurita-gui/javascript.rb
|
85
|
+
- ./lib/aurita-gui/marshal.rb
|
86
|
+
- ./lib/aurita-gui/table.rb
|
87
|
+
- ./bin
|
88
|
+
- ./LICENSE
|
88
89
|
has_rdoc: true
|
89
90
|
homepage: http://aurita.wortundform.de/
|
90
91
|
post_install_message:
|