htmlgrid 1.1.0 → 1.1.5
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.
- checksums.yaml +5 -5
- data/Manifest.txt +2 -3
- data/lib/htmlgrid/component.rb +1 -1
- data/lib/htmlgrid/composite.rb +15 -13
- data/lib/htmlgrid/dojotoolkit.rb +50 -70
- data/lib/htmlgrid/errormessage.rb +1 -1
- data/lib/htmlgrid/grid.rb +258 -275
- data/lib/htmlgrid/label.rb +14 -14
- data/lib/htmlgrid/list.rb +23 -23
- data/lib/htmlgrid/template.rb +20 -4
- data/lib/htmlgrid/version.rb +1 -1
- data/test/suite.rb +0 -2
- data/test/test_add_row.rb +75 -56
- data/test/test_component.rb +5 -5
- data/test/test_composite.rb +230 -177
- data/test/test_dojotoolkit.rb +132 -0
- data/test/test_grid.rb +33 -39
- data/test/test_helper.rb +9 -0
- data/test/test_interaction_list.rb +244 -215
- data/test/test_label.rb +4 -0
- data/test/test_list.rb +1 -7
- data/test/test_select.rb +10 -19
- data/test/test_template.rb +24 -1
- metadata +19 -8
- data/History.txt +0 -56
- data/LICENCE.txt +0 -515
- data/test/rebuild.rb +0 -39
@@ -0,0 +1,132 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# HtmlGrid -- HyperTextMarkupLanguage Framework
|
4
|
+
# Copyright (C) 2003 ywesee - intellectual capital connected
|
5
|
+
# Andreas Schrafl, Benjamin Fay, Hannes Wyss, Markus Huggler
|
6
|
+
#
|
7
|
+
# This library is free software; you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU Lesser General Public
|
9
|
+
# License as published by the Free Software Foundation; either
|
10
|
+
# version 2.1 of the License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# This library is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
# Lesser General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public
|
18
|
+
# License along with this library; if not, write to the Free Software
|
19
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
+
#
|
21
|
+
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zuerich, Switzerland
|
22
|
+
# htmlgrid@ywesee.com, www.ywesee.com/htmlgrid
|
23
|
+
#
|
24
|
+
|
25
|
+
$: << File.expand_path('../lib', File.dirname(__FILE__))
|
26
|
+
$: << File.dirname(__FILE__)
|
27
|
+
|
28
|
+
require 'minitest/autorun'
|
29
|
+
require 'stub/cgi'
|
30
|
+
require 'htmlgrid/dojotoolkit'
|
31
|
+
require 'test_helper'
|
32
|
+
require 'flexmock/minitest'
|
33
|
+
require 'sbsm/lookandfeel'
|
34
|
+
|
35
|
+
class TestDojotoolkit < Minitest::Test
|
36
|
+
class StubAttributeComponent < HtmlGrid::Component
|
37
|
+
HTML_ATTRIBUTES = { "key" => "val" }
|
38
|
+
end
|
39
|
+
class StubInitComponent < HtmlGrid::Component
|
40
|
+
attr_reader :init_called
|
41
|
+
def init
|
42
|
+
@init_called = true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
class StubLabelComponent < HtmlGrid::Component
|
46
|
+
LABEL = true
|
47
|
+
end
|
48
|
+
class StubContainer
|
49
|
+
attr_accessor :onsubmit
|
50
|
+
end
|
51
|
+
def setup
|
52
|
+
@component = HtmlGrid::Component.new(nil, nil)
|
53
|
+
@session = flexmock('session') do |s|
|
54
|
+
s.should_receive(:user_agent).and_return('user_agent').by_default
|
55
|
+
end
|
56
|
+
@cgi = CGI.new
|
57
|
+
end
|
58
|
+
def test_dynamic_html
|
59
|
+
comp = HtmlGrid::Component.new("foo", @session)
|
60
|
+
comp.dojo_tooltip = 'my_tooltip'
|
61
|
+
assert_equal("foo", comp.model)
|
62
|
+
assert_equal(false, comp.label?)
|
63
|
+
result= comp.dynamic_html(@cgi)
|
64
|
+
assert(/href="my_tooltip"/.match(result))
|
65
|
+
end
|
66
|
+
def test_dynamic_html_with_msie
|
67
|
+
@session.should_receive(:user_agent).and_return('MSIE 4')
|
68
|
+
comp = HtmlGrid::Component.new("foo", @session)
|
69
|
+
comp.dojo_tooltip = 'my_tooltip'
|
70
|
+
assert_equal("foo", comp.model)
|
71
|
+
assert_equal(false, comp.label?)
|
72
|
+
result= comp.dynamic_html(@cgi)
|
73
|
+
assert(/href="my_tooltip"/.match(result))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
class StubTemplateLookandfeel < SBSM::Lookandfeel
|
77
|
+
RESOURCES = {
|
78
|
+
:css => "test.css"
|
79
|
+
}
|
80
|
+
DICTIONARIES = {
|
81
|
+
"de" => {
|
82
|
+
:html_title => "Test",
|
83
|
+
}
|
84
|
+
}
|
85
|
+
def lookandfeel
|
86
|
+
self
|
87
|
+
end
|
88
|
+
end
|
89
|
+
class StubTemplateSession
|
90
|
+
def flavor
|
91
|
+
"gcc"
|
92
|
+
end
|
93
|
+
def language
|
94
|
+
"de"
|
95
|
+
end
|
96
|
+
def http_protocol
|
97
|
+
'http'
|
98
|
+
end
|
99
|
+
def server_name
|
100
|
+
"testserver.com"
|
101
|
+
end
|
102
|
+
def server_port
|
103
|
+
'80'
|
104
|
+
end
|
105
|
+
alias :default_language :language
|
106
|
+
end
|
107
|
+
class PublicTemplate < HtmlGrid::Template
|
108
|
+
include HtmlGrid::DojoToolkit::DojoTemplate
|
109
|
+
COMPONENTS = {}
|
110
|
+
def dynamic_html_headers(context)
|
111
|
+
headers = super
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class TestTemplate < Minitest::Test
|
116
|
+
def setup
|
117
|
+
lookandfeel = StubTemplateLookandfeel.new(StubTemplateSession.new)
|
118
|
+
@template = PublicTemplate.new(nil, lookandfeel, nil)
|
119
|
+
end
|
120
|
+
def test_dynamic_html_headers
|
121
|
+
@cgi = CGI.new
|
122
|
+
result = @template.to_html(@cgi)
|
123
|
+
@session = flexmock('session')
|
124
|
+
comp = HtmlGrid::Component.new("foo", @session)
|
125
|
+
comp.dojo_tooltip = 'my_tooltip'
|
126
|
+
assert_equal("foo", comp.model)
|
127
|
+
assert_equal(false, comp.label?)
|
128
|
+
result= comp.to_html(@cgi)
|
129
|
+
skip 'tooltip test does not work'
|
130
|
+
assert(/href="my_tooltip"/.match(result))
|
131
|
+
end
|
132
|
+
end
|
data/test/test_grid.rb
CHANGED
@@ -28,20 +28,10 @@ $: << File.expand_path("../ext", File.dirname(__FILE__))
|
|
28
28
|
$: << File.dirname(__FILE__)
|
29
29
|
|
30
30
|
require 'minitest/autorun'
|
31
|
-
require 'rebuild'
|
32
31
|
require 'stub/cgi'
|
33
32
|
require 'htmlgrid/label'
|
34
33
|
require 'htmlgrid/grid'
|
35
|
-
|
36
|
-
module HtmlGrid
|
37
|
-
class Grid
|
38
|
-
class Row
|
39
|
-
class Field
|
40
|
-
attr_reader :attributes
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
34
|
+
require 'test_helper'
|
45
35
|
|
46
36
|
class TestGrid < Minitest::Test
|
47
37
|
class StubLabel
|
@@ -133,9 +123,9 @@ class TestGrid < Minitest::Test
|
|
133
123
|
def test_add_multiple__3
|
134
124
|
@grid.add(["test", nil, "foo"], 0, 0)
|
135
125
|
assert_equal(1, @grid.height)
|
136
|
-
expected = '<TABLE cellspacing="0"><TR><TD>
|
126
|
+
expected = '<TABLE cellspacing="0"><TR><TD>testfoo</TD></TR></TABLE>'
|
137
127
|
assert_equal(expected, @grid.to_html(CGI.new))
|
138
|
-
assert_equal(
|
128
|
+
assert_equal(1, @grid.width)
|
139
129
|
end
|
140
130
|
def test_add_fieldx
|
141
131
|
@grid.add("test", 1, 0)
|
@@ -235,7 +225,7 @@ class TestGrid < Minitest::Test
|
|
235
225
|
expected = '<TABLE cellspacing="0"><TR><TD class="foo"> </TD></TR></TABLE>'
|
236
226
|
assert_equal(expected, @grid.to_html(CGI.new))
|
237
227
|
@grid.add(nil, 1,1)
|
238
|
-
@grid.add_style('bar', 0, 1, 2)
|
228
|
+
@grid.add_style('bar', 0, 1, 2)
|
239
229
|
expected = '<TABLE cellspacing="0"><TR><TD class="foo"> </TD>'
|
240
230
|
expected << '<TD> </TD></TR><TR><TD class="bar"> </TD>'
|
241
231
|
expected << '<TD class="bar"> </TD></TR></TABLE>'
|
@@ -281,7 +271,7 @@ class TestGrid < Minitest::Test
|
|
281
271
|
assert_equal(expected, @grid.to_html(CGI.new))
|
282
272
|
end
|
283
273
|
def test_attributes
|
284
|
-
### this test has changed behavior: its not desirable to have magically
|
274
|
+
### this test has changed behavior: its not desirable to have magically
|
285
275
|
### transferred css information from a component to its container
|
286
276
|
@grid.add(StubGridComponent.new, 0,0)
|
287
277
|
expected = '<TABLE cellspacing="0"><TR><TD>bar</TD></TR></TABLE>'
|
@@ -319,7 +309,7 @@ class TestGrid < Minitest::Test
|
|
319
309
|
end
|
320
310
|
def test_set_row_attributes3
|
321
311
|
@grid.set_row_attributes({'foo' => 'bar'}, 1, 2)
|
322
|
-
|
312
|
+
expected = '<TABLE cellspacing="0"><TR><TD> </TD><TD> </TD></TR><TR foo="bar"><TD> </TD><TD> </TD></TR></TABLE>'
|
323
313
|
assert_equal(expected, @grid.to_html(CGI.new))
|
324
314
|
end
|
325
315
|
def test_insert_row
|
@@ -333,20 +323,24 @@ class TestGrid < Minitest::Test
|
|
333
323
|
expected = '<TABLE cellspacing="0"><TR><TD>testreihe</TD></TR><TR><TD> </TD></TR><TR><TD>testfeld</TD></TR></TABLE>'
|
334
324
|
assert_equal(expected, @grid.to_html(CGI.new))
|
335
325
|
end
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
326
|
+
|
327
|
+
# @todo
|
328
|
+
# What does this test? (gabage collection?)
|
329
|
+
def test_gc
|
330
|
+
100.times { |y|
|
331
|
+
200.times { |x|
|
332
|
+
str = "[#{x}, #{y}]: test"
|
333
|
+
@grid.add(str, x, y)
|
334
|
+
@grid.add(str, x, y)
|
335
|
+
@grid.add(str, x, y)
|
336
|
+
@grid.add(str, x, y)
|
337
|
+
}
|
338
|
+
}
|
339
|
+
assert_equal(100, @grid.height)
|
340
|
+
assert_equal(200, @grid.width)
|
341
|
+
@grid.to_html(CGI.new)
|
342
|
+
end
|
343
|
+
|
350
344
|
def test_label
|
351
345
|
label = StubLabel.new
|
352
346
|
@grid.add(label, 0,0)
|
@@ -363,7 +357,7 @@ class TestGrid < Minitest::Test
|
|
363
357
|
end
|
364
358
|
def test_nil_attribute2
|
365
359
|
thing = StubGridComponent.new
|
366
|
-
thing.set_attribute("class", nil)
|
360
|
+
thing.set_attribute("class", nil)
|
367
361
|
@grid.add(thing, 0,0)
|
368
362
|
@grid.to_html(CGI.new)
|
369
363
|
end
|
@@ -373,15 +367,15 @@ class TestGrid < Minitest::Test
|
|
373
367
|
@grid.to_html(CGI.new)
|
374
368
|
end
|
375
369
|
def test_add_negative
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
370
|
+
assert( @grid.add('foo', -1, 0) )
|
371
|
+
assert( @grid.add('foo', 0, -1) )
|
372
|
+
assert( @grid.add(['foo', 'bar'], -1, 0) )
|
373
|
+
assert( @grid.add(['foo', 'bar'], 0, -1) )
|
380
374
|
end
|
381
375
|
def test_add_style_negative
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
376
|
+
assert( @grid.add_style('bar', -1, 1) )
|
377
|
+
assert( @grid.add_style('bar', 1, -1) )
|
378
|
+
assert( @grid.add_style('bar', 1, 1, -1) )
|
379
|
+
assert( @grid.add_style('bar', 1, 1, 1,-1) )
|
386
380
|
end
|
387
381
|
end
|
data/test/test_helper.rb
ADDED
@@ -16,242 +16,271 @@ require 'htmlgrid/form'
|
|
16
16
|
require 'htmlgrid/list'
|
17
17
|
require 'htmlgrid/div'
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
19
|
+
module InteractionTest
|
20
|
+
class StubComposite < HtmlGrid::Composite
|
21
|
+
attr_writer :container
|
22
|
+
COMPONENTS = {
|
23
|
+
[0, 0, 0] => :baz,
|
24
|
+
[0, 0, 1] => :foo,
|
25
|
+
[0, 0, 2] => :baz,
|
26
|
+
[0, 1, 0] => :baz,
|
27
|
+
[0, 1, 1] => :baz,
|
28
|
+
}
|
29
|
+
LABELS = true
|
30
|
+
SYMBOL_MAP = {
|
31
|
+
:bar => HtmlGrid::InputText,
|
32
|
+
}
|
33
|
+
attr_reader :model, :session
|
34
|
+
public :resolve_offset, :labels?
|
35
|
+
def initialize(first, second, third = nil)
|
36
|
+
super(first, second)
|
37
|
+
end
|
38
|
+
def init
|
39
|
+
@barcount=0
|
40
|
+
super
|
41
|
+
end
|
42
|
+
def foo(model, session=@session)
|
43
|
+
"Foo"
|
44
|
+
end
|
45
|
+
def baz(model, session=@session)
|
46
|
+
@barcount += 1
|
47
|
+
"Baz#{@barcount}"
|
48
|
+
end
|
36
49
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
50
|
+
class StubCompositeComponent < HtmlGrid::Component
|
51
|
+
def to_html(context)
|
52
|
+
context.a(@attributes) { 'brafoo' }
|
53
|
+
end
|
40
54
|
end
|
41
|
-
|
42
|
-
|
55
|
+
class StubComposite2 < HtmlGrid::Composite
|
56
|
+
COMPONENTS = {
|
57
|
+
[0, 0] => StubCompositeComponent,
|
58
|
+
}
|
43
59
|
end
|
44
|
-
|
45
|
-
|
46
|
-
"Baz#{@barcount}"
|
60
|
+
class StubComposite3 < StubComposite2
|
61
|
+
COMPONENT_CSS_MAP = {[0, 0, 4, 4] => 'standard'}
|
47
62
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
context.a(@attributes) { 'brafoo' }
|
63
|
+
class StubComposite4 < StubComposite3
|
64
|
+
CSS_MAP = {[0, 0] => 'dradnats'}
|
65
|
+
COMPONENT_CSS_MAP = {[0, 0, 4, 4] => 'standard'}
|
52
66
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
}
|
58
|
-
end
|
59
|
-
class StubComposite3 < StubComposite2
|
60
|
-
COMPONENT_CSS_MAP = {[0,0,4,4]=>'standard'}
|
61
|
-
end
|
62
|
-
class StubComposite4 < StubComposite3
|
63
|
-
CSS_MAP = {[0,0]=>'dradnats'}
|
64
|
-
COMPONENT_CSS_MAP = {[0,0,4,4]=>'standard'}
|
65
|
-
end
|
66
|
-
class StubCompositeNoLabel < HtmlGrid::Composite
|
67
|
-
LABELS = false
|
68
|
-
COMPONENTS = {}
|
69
|
-
public :labels?
|
70
|
-
end
|
71
|
-
class StubCompositeModel
|
72
|
-
end
|
73
|
-
class StubCompositeLookandfeel
|
74
|
-
def attributes(key)
|
75
|
-
{}
|
67
|
+
class StubCompositeNoLabel < HtmlGrid::Composite
|
68
|
+
LABELS = false
|
69
|
+
COMPONENTS = {}
|
70
|
+
public :labels?
|
76
71
|
end
|
77
|
-
|
72
|
+
class StubCompositeModel
|
78
73
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
74
|
+
class StubCompositeLookandfeel
|
75
|
+
def attributes(key)
|
76
|
+
{}
|
77
|
+
end
|
78
|
+
def lookup(key)
|
79
|
+
end
|
80
|
+
def base_url
|
81
|
+
'http://www.oddb.org/de/gcc'
|
82
|
+
end
|
87
83
|
end
|
88
|
-
|
84
|
+
class StubCompositeSession
|
85
|
+
attr_accessor :event
|
86
|
+
def lookandfeel
|
87
|
+
StubCompositeLookandfeel.new
|
88
|
+
end
|
89
|
+
def error(key)
|
90
|
+
end
|
91
|
+
def user_agent
|
92
|
+
'user_agent'
|
93
|
+
end
|
89
94
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
EVENT = :foo
|
96
|
-
end
|
97
|
-
class StubCompositeColspan1 < HtmlGrid::Composite
|
98
|
-
COMPONENTS = {}
|
99
|
-
end
|
100
|
-
class StubCompositeColspan2 < HtmlGrid::Composite
|
101
|
-
COMPONENTS = {
|
102
|
-
[0,0] => :foo,
|
103
|
-
}
|
104
|
-
end
|
105
|
-
class StubCompositeColspan3 < HtmlGrid::Composite
|
106
|
-
COMPONENTS = {
|
107
|
-
[0,0] => :foo,
|
108
|
-
[1,0] => :bar,
|
109
|
-
}
|
110
|
-
end
|
111
|
-
class StubCompositeColspan4 < HtmlGrid::Composite
|
112
|
-
COMPONENTS = {
|
113
|
-
[0,0] => :foo,
|
114
|
-
[2,0] => :bar,
|
115
|
-
}
|
116
|
-
end
|
117
|
-
|
118
|
-
class StubInteractionChooserDrugList < HtmlGrid::List
|
119
|
-
attr_reader :model, :value
|
120
|
-
COMPONENTS = {
|
121
|
-
[0,0] => :info_drug,
|
122
|
-
}
|
123
|
-
CSS_MAP = {
|
124
|
-
[0,0] => 'css.info',
|
125
|
-
}
|
126
|
-
SORT_HEADER = false
|
127
|
-
SORT_DEFAULT = :foo
|
128
|
-
def initialize(models, session=@session)
|
129
|
-
super # must come first or it will overwrite @value
|
130
|
-
@value = []
|
131
|
-
models.each{ |model|
|
132
|
-
@value << StubInteractionChooserDrug.new(model, session)
|
133
|
-
}
|
95
|
+
class StubCompositeForm < HtmlGrid::Form
|
96
|
+
COMPONENTS = {
|
97
|
+
[0, 0] => StubComposite
|
98
|
+
}
|
99
|
+
EVENT = :foo
|
134
100
|
end
|
135
|
-
|
136
|
-
|
137
|
-
if @drugs and !@drugs.empty?
|
138
|
-
delete_all_link = HtmlGrid::Link.new(:delete, @model, @session, self)
|
139
|
-
delete_all_link.href = @lookandfeel._event_url(:delete_all, [])
|
140
|
-
delete_all_link.value = @lookandfeel.lookup(:interaction_chooser_delete_all)
|
141
|
-
delete_all_link.css_class = 'list'
|
142
|
-
div.value = delete_all_link
|
143
|
-
end
|
144
|
-
div.set_attribute('id', 'drugs')
|
145
|
-
@value << div unless @value.find{ |v| v.attributes['id'].eql?('drugs') }
|
146
|
-
super
|
101
|
+
class StubCompositeColspan1 < HtmlGrid::Composite
|
102
|
+
COMPONENTS = {}
|
147
103
|
end
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
def initialize(foo)
|
153
|
-
@foo = foo
|
104
|
+
class StubCompositeColspan2 < HtmlGrid::Composite
|
105
|
+
COMPONENTS = {
|
106
|
+
[0, 0] => :foo,
|
107
|
+
}
|
154
108
|
end
|
155
|
-
|
156
|
-
|
109
|
+
class StubCompositeColspan3 < HtmlGrid::Composite
|
110
|
+
COMPONENTS = {
|
111
|
+
[0, 0] => :foo,
|
112
|
+
[1, 0] => :bar,
|
113
|
+
}
|
157
114
|
end
|
158
|
-
|
159
|
-
|
115
|
+
class StubCompositeColspan4 < HtmlGrid::Composite
|
116
|
+
COMPONENTS = {
|
117
|
+
[0, 0] => :foo,
|
118
|
+
[2, 0] => :bar,
|
119
|
+
}
|
160
120
|
end
|
161
|
-
end
|
162
121
|
|
163
|
-
class
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
[2,0] => :delete,
|
168
|
-
}
|
169
|
-
CSS_MAP = {
|
170
|
-
[0,0] => 'small',
|
171
|
-
[1,0] => 'interaction-atc',
|
172
|
-
[2,0] => 'small',
|
173
|
-
}
|
174
|
-
HTML_ATTRIBUTES = {
|
175
|
-
'style' => 'background-color:greenyellow',
|
176
|
-
}
|
177
|
-
def init
|
178
|
-
super
|
179
|
-
end
|
180
|
-
def fachinfo(model, session=@session)
|
181
|
-
"fachinfo-#{model.foo}"
|
182
|
-
end
|
183
|
-
def atc(model, session=@session)
|
184
|
-
'atc'
|
185
|
-
end
|
186
|
-
def delete(model, session=@session)
|
187
|
-
'delete'
|
188
|
-
end
|
189
|
-
end
|
190
|
-
class StubInteractionChooserDrug < HtmlGrid::Composite
|
191
|
-
COMPONENTS = {
|
122
|
+
class StubInteractionChooserDrugList < HtmlGrid::List
|
123
|
+
attr_reader :model, :value
|
124
|
+
COMPONENTS = {
|
125
|
+
[0, 0] => :info_drug,
|
192
126
|
}
|
193
|
-
|
194
|
-
|
195
|
-
@@barcode ||= 0
|
196
|
-
def init
|
197
|
-
@@barcode += 1
|
198
|
-
components.store([0,0], :header_info)
|
199
|
-
css_map.store([0,0], 'subheading')
|
200
|
-
1.upto(@@barcode) { |idx|
|
201
|
-
components.store([0,idx], :text_info)
|
127
|
+
CSS_MAP = {
|
128
|
+
[0, 0] => 'css.info',
|
202
129
|
}
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
end
|
213
|
-
|
214
|
-
|
215
|
-
|
130
|
+
SORT_HEADER = false
|
131
|
+
SORT_DEFAULT = :foo
|
132
|
+
def initialize(models, session=@session)
|
133
|
+
@drugs = nil
|
134
|
+
super # must come first or it will overwrite @value
|
135
|
+
@value = []
|
136
|
+
models.each{ |model|
|
137
|
+
@value << StubInteractionChooserDrug.new(model, session)
|
138
|
+
}
|
139
|
+
end
|
140
|
+
def to_html(context)
|
141
|
+
div = HtmlGrid::Div.new(@model, @session, self)
|
142
|
+
if @drugs and !@drugs.empty?
|
143
|
+
link = HtmlGrid::Link.new(:delete, @model, @session, self)
|
144
|
+
link.href = @lookandfeel._event_url(:delete_all, [])
|
145
|
+
link.value = @lookandfeel.lookup(:interaction_chooser_delete_all)
|
146
|
+
link.css_class = 'list'
|
147
|
+
div.value = link
|
148
|
+
end
|
149
|
+
div.set_attribute('id', 'drugs')
|
150
|
+
@value << div unless @value.find{ |v| v.attributes['id'].eql?('drugs') }
|
151
|
+
super
|
152
|
+
end
|
216
153
|
end
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
154
|
+
|
155
|
+
class StubDrugModel
|
156
|
+
attr_reader :foo
|
157
|
+
def initialize(foo)
|
158
|
+
@foo = foo
|
159
|
+
end
|
160
|
+
def fachinfo
|
161
|
+
@foo
|
162
|
+
end
|
163
|
+
def drug
|
164
|
+
'Drug'
|
165
|
+
end
|
221
166
|
end
|
222
|
-
|
223
|
-
|
224
|
-
|
167
|
+
|
168
|
+
class StubInteractionChooserDrugHeader < HtmlGrid::Composite
|
169
|
+
COMPONENTS = {
|
170
|
+
[0, 0] => :fachinfo,
|
171
|
+
[1, 0] => :atc,
|
172
|
+
[2, 0] => :delete,
|
173
|
+
}
|
174
|
+
CSS_MAP = {
|
175
|
+
[0, 0] => 'small',
|
176
|
+
[1, 0] => 'interaction-atc',
|
177
|
+
[2, 0] => 'small',
|
178
|
+
}
|
179
|
+
HTML_ATTRIBUTES = {
|
180
|
+
'style' => 'background-color:greenyellow',
|
181
|
+
}
|
182
|
+
def init
|
183
|
+
super
|
184
|
+
end
|
185
|
+
def fachinfo(model, session=@session)
|
186
|
+
"fachinfo-#{model.foo}"
|
187
|
+
end
|
188
|
+
def atc(model, session=@session)
|
189
|
+
'atc'
|
190
|
+
end
|
191
|
+
def delete(model, session=@session)
|
192
|
+
'delete'
|
193
|
+
end
|
225
194
|
end
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
195
|
+
class StubInteractionChooserDrug < HtmlGrid::Composite
|
196
|
+
COMPONENTS = {
|
197
|
+
}
|
198
|
+
CSS_MAP = {}
|
199
|
+
CSS_CLASS = 'composite'
|
200
|
+
@@barcode ||= 0
|
201
|
+
def init
|
202
|
+
@@barcode += 1
|
203
|
+
components.store([0,0], :header_info)
|
204
|
+
css_map.store([0,0], 'subheading')
|
205
|
+
1.upto(@@barcode) { |idx|
|
206
|
+
components.store([0,idx], :text_info)
|
207
|
+
}
|
208
|
+
@attributes.store('id', 'drugs_' + @@barcode.to_s)
|
209
|
+
super
|
210
|
+
end
|
211
|
+
def header_info(model, session=@session)
|
212
|
+
StubInteractionChooserDrugHeader.new(model, session, self)
|
213
|
+
end
|
214
|
+
def text_info(model, session=@session)
|
215
|
+
"interaction for #{model.foo}"
|
216
|
+
end
|
234
217
|
end
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
218
|
+
class TestComposite < Minitest::Test
|
219
|
+
def setup
|
220
|
+
@composite = StubComposite.new(
|
221
|
+
StubCompositeModel.new, StubCompositeSession.new)
|
222
|
+
end
|
223
|
+
def test_create_method
|
224
|
+
foo = nil
|
225
|
+
foo = @composite.create(:foo, @composite.model)
|
226
|
+
assert_equal("Foo", foo)
|
227
|
+
end
|
228
|
+
def test_to_html
|
229
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ''), @composite.to_html(CGI.new))
|
230
|
+
<TABLE cellspacing="0">
|
231
|
+
<TR><TD>Baz1FooBaz2</TD></TR><TR><TD>Baz3Baz4</TD></TR>
|
232
|
+
</TABLE>
|
233
|
+
EXP
|
234
|
+
end
|
235
|
+
def test_component_css_map
|
236
|
+
table = StubComposite2.new(
|
237
|
+
StubCompositeModel.new, StubCompositeSession.new)
|
238
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ''), table.to_html(CGI.new))
|
239
|
+
<TABLE cellspacing="0">
|
240
|
+
<TR><TD><A>brafoo</A></TD></TR>
|
241
|
+
</TABLE>
|
242
|
+
EXP
|
243
|
+
table = StubComposite3.new(
|
244
|
+
StubCompositeModel.new, StubCompositeSession.new)
|
245
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ''), table.to_html(CGI.new))
|
246
|
+
<TABLE cellspacing="0">
|
247
|
+
<TR><TD><A class="standard">brafoo</A></TD></TR>
|
248
|
+
</TABLE>
|
249
|
+
EXP
|
250
|
+
table = StubComposite4.new(
|
251
|
+
StubCompositeModel.new, StubCompositeSession.new)
|
252
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ''), table.to_html(CGI.new))
|
253
|
+
<TABLE cellspacing=\"0\"><TR><TD class=\"dradnats\"><A class=\"standard\">brafoo</A></TD></TR></TABLE>
|
254
|
+
EXP
|
255
|
+
end
|
256
|
+
|
257
|
+
# @todo
|
258
|
+
# Spruce up lines in expectation
|
259
|
+
def test_interaction_list_to_html
|
260
|
+
models = [
|
261
|
+
StubDrugModel.new('Aspirin'),
|
262
|
+
StubDrugModel.new('Marcoumar'),
|
263
|
+
]
|
264
|
+
composite = StubInteractionChooserDrugList.new(
|
265
|
+
models, StubCompositeSession.new)
|
266
|
+
expected = [
|
267
|
+
'<TABLE cellspacing="0" class="composite" id="drugs_1">',
|
268
|
+
'<TR><TD class="subheading"><TABLE cellspacing="0" style="background-color:greenyellow">',
|
269
|
+
'<TR><TD class="small">fachinfo-Aspirin</TD><TD class="interaction-atc">atc</TD><TD class="small">delete</TD></TR></TABLE></TD></TR>',
|
270
|
+
'<TR><TD>interaction for Aspirin</TD></TR></TABLE> <TABLE cellspacing="0" class="composite" id="drugs_2">',
|
271
|
+
'<TR><TD class="subheading"><TABLE cellspacing="0" style="background-color:greenyellow">',
|
272
|
+
'<TR><TD class="small">fachinfo-Marcoumar</TD><TD class="interaction-atc">atc</TD><TD class="small">delete</TD></TR></TABLE></TD></TR>',
|
273
|
+
'<TR><TD>interaction for Marcoumar</TD></TR>',
|
274
|
+
'<TR><TD>interaction for Marcoumar</TD></TR></TABLE> <DIV id="drugs"></DIV><TABLE cellspacing="0">',
|
275
|
+
'<TR><TH> </TH></TR>',
|
276
|
+
'<TR><TD class="css.info"> </TD></TR>',
|
277
|
+
'<TR><TD class="css.info-bg"> </TD></TR></TABLE>',
|
278
|
+
]
|
279
|
+
html = composite.to_html(CGI.new)
|
280
|
+
expected.each_with_index do |line, idx|
|
281
|
+
assert(html.index(line), "#{idx}: missing #{line} in #{html}")
|
282
|
+
end
|
255
283
|
end
|
256
284
|
end
|
257
285
|
end
|
286
|
+
|