rbbt-views 1.0.0 → 1.0.1
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/lib/rbbt/workflow/rest.rb +150 -7
- data/lib/rbbt/workflow/rest/auth.rb +4 -4
- data/lib/rbbt/workflow/rest/entity.rb +115 -17
- data/lib/rbbt/workflow/rest/helpers.rb +49 -0
- data/lib/rbbt/workflow/rest/render.rb +64 -73
- data/lib/rbbt/workflow/rest/util.rb +124 -11
- data/share/views/compass/form.sass +0 -1
- data/share/views/compass/layout.sass +93 -2
- data/share/views/edit_list.haml +39 -0
- data/share/views/entity/GenomicMutation.haml +11 -1
- data/share/views/entity/KeggPathway.haml +4 -2
- data/share/views/entity/MutatedIsoform.haml +5 -33
- data/share/views/entity/MutatedIsoform/marked_svg.haml +3 -0
- data/share/views/entity/MutatedIsoform/pdbs.haml +33 -0
- data/share/views/entity/NCIBioCartaPathway.haml +11 -0
- data/share/views/entity/NCINaturePathway.haml +11 -0
- data/share/views/entity/NCIReactomePathway.haml +11 -0
- data/share/views/entity/Protein.haml +5 -0
- data/share/views/entity_list/Default.haml +1 -10
- data/share/views/js/app.js +336 -39
- data/share/views/layout.haml +20 -1
- data/share/views/partials/_form.haml +3 -1
- data/share/views/partials/_result_table.haml +4 -1
- data/share/views/public/plugins/jquery/js/jquery.cookie.js +47 -0
- data/share/views/user_lists.haml +10 -0
- metadata +14 -10
- data/share/views/entity/NCIBioCartaPathways.haml +0 -9
- data/share/views/entity/NCINaturePathways.haml +0 -9
- data/share/views/entity/NCIReactomePathways.haml +0 -9
@@ -19,37 +19,53 @@ module RbbtHTMLHelpers
|
|
19
19
|
|
20
20
|
# workflow = workflow.to_s unless workflow.nil? or String === workflow
|
21
21
|
|
22
|
-
path =
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
when (not workflow_dir_views.nil? and workflow_dir_views[workflow][file].exists?)
|
37
|
-
workflow_dir_views[workflow][file]
|
38
|
-
when (not workflow_dir_views.nil? and workflow_dir_views[file].exists?)
|
39
|
-
workflow_dir_views[file]
|
40
|
-
|
41
|
-
when global_views[workflow][task][file].exists?
|
42
|
-
global_views[workflow][task][file]
|
43
|
-
when global_views[task][file].exists?
|
44
|
-
global_views[task][file]
|
45
|
-
when global_views[workflow][file].exists?
|
46
|
-
global_views[workflow][file]
|
47
|
-
when global_views[file].exists?
|
48
|
-
global_views[file]
|
49
|
-
else
|
50
|
-
raise "File not found: #{[workflow, task, file].compact * ", "}"
|
51
|
-
end
|
22
|
+
path = nil
|
23
|
+
[webapp_dir_views, workflow_dir_views, global_views].compact.each do |resource|
|
24
|
+
path = case
|
25
|
+
when resource[workflow][task][file].exists?
|
26
|
+
resource[workflow][task][file]
|
27
|
+
when resource[task][file].exists?
|
28
|
+
resource[task][file]
|
29
|
+
when resource[workflow][file].exists?
|
30
|
+
resource[workflow][file]
|
31
|
+
when resource[file].exists?
|
32
|
+
resource[file]
|
33
|
+
end
|
34
|
+
break unless path.nil?
|
35
|
+
end
|
52
36
|
|
37
|
+
# path = case
|
38
|
+
# when webapp_dir_views[workflow][task][file].exists?
|
39
|
+
# webapp_dir_views[workflow][task][file]
|
40
|
+
# when webapp_dir_views[task][file].exists?
|
41
|
+
# webapp_dir_views[task][file]
|
42
|
+
# when webapp_dir_views[workflow][file].exists?
|
43
|
+
# webapp_dir_views[workflow][file]
|
44
|
+
# when webapp_dir_views[file].exists?
|
45
|
+
# webapp_dir_views[file]
|
46
|
+
#
|
47
|
+
# when (not workflow_dir_views.nil? and workflow_dir_views[workflow][task][file].exists?)
|
48
|
+
# workflow_dir_views[workflow][task][file]
|
49
|
+
# when (not workflow_dir_views.nil? and workflow_dir_views[task][file].exists?)
|
50
|
+
# workflow_dir_views[task][file]
|
51
|
+
# when (not workflow_dir_views.nil? and workflow_dir_views[workflow][file].exists?)
|
52
|
+
# workflow_dir_views[workflow][file]
|
53
|
+
# when (not workflow_dir_views.nil? and workflow_dir_views[file].exists?)
|
54
|
+
# workflow_dir_views[file]
|
55
|
+
#
|
56
|
+
# when global_views[workflow][task][file].exists?
|
57
|
+
# global_views[workflow][task][file]
|
58
|
+
# when global_views[task][file].exists?
|
59
|
+
# global_views[task][file]
|
60
|
+
# when global_views[workflow][file].exists?
|
61
|
+
# global_views[workflow][file]
|
62
|
+
# when global_views[file].exists?
|
63
|
+
# global_views[file]
|
64
|
+
# else
|
65
|
+
# raise "File not found: #{[workflow, task, file].compact * ", "}"
|
66
|
+
# end
|
67
|
+
|
68
|
+
raise "File not found: #{[workflow, task, file].compact * ", "}" if path.nil?
|
53
69
|
Log.debug "File #{[workflow, task, file].collect{|v| "'#{ v }'"} * ", "} located at #{ path }"
|
54
70
|
path
|
55
71
|
end
|
@@ -129,7 +145,6 @@ module RbbtHTMLHelpers
|
|
129
145
|
[rows, total]
|
130
146
|
end
|
131
147
|
|
132
|
-
#def workflow_render(file, workflow = nil, task = nil, locals = {}, &block)
|
133
148
|
def workflow_render(file, *args, &block)
|
134
149
|
locals = Hash === args.last ? args.pop : {}
|
135
150
|
|
@@ -247,10 +262,9 @@ module RbbtHTMLHelpers
|
|
247
262
|
|
248
263
|
size = locals.delete(:_size) || locals.delete("_size") || :normal
|
249
264
|
|
250
|
-
workflow = WorkflowREST.workflows.last
|
251
|
-
|
252
265
|
entity = locals[:entity]
|
253
266
|
|
267
|
+
|
254
268
|
entity_class = case
|
255
269
|
when Entity.formats.include?(format)
|
256
270
|
Entity.formats[format]
|
@@ -260,6 +274,8 @@ module RbbtHTMLHelpers
|
|
260
274
|
nil
|
261
275
|
end
|
262
276
|
|
277
|
+
workflow = Workflow === entity_class ? entity_class : WorkflowREST.workflows.last
|
278
|
+
|
263
279
|
path = case
|
264
280
|
when (entity.respond_to? :template and not entity.template.nil?)
|
265
281
|
entity.template
|
@@ -330,9 +346,6 @@ module RbbtHTMLHelpers
|
|
330
346
|
type, format = type.split ":"
|
331
347
|
|
332
348
|
size = locals.delete(:_size) || locals.delete("_size") || :normal
|
333
|
-
|
334
|
-
workflow = WorkflowREST.workflows.last
|
335
|
-
|
336
349
|
entity = locals[:entity]
|
337
350
|
|
338
351
|
entity_class = case
|
@@ -344,6 +357,8 @@ module RbbtHTMLHelpers
|
|
344
357
|
nil
|
345
358
|
end
|
346
359
|
|
360
|
+
workflow = Workflow === entity_class ? entity_class : WorkflowREST.workflows.last
|
361
|
+
|
347
362
|
path = case
|
348
363
|
when (entity.respond_to? :action_template and Hash === entity.action_template and not entity.action_template[action].nil?)
|
349
364
|
entity.action_template[action]
|
@@ -415,9 +430,10 @@ module RbbtHTMLHelpers
|
|
415
430
|
|
416
431
|
size = locals.delete(:_size) || locals.delete("_size") || :normal
|
417
432
|
|
418
|
-
|
433
|
+
locals[:type] = type
|
434
|
+
locals[:format] = format
|
419
435
|
|
420
|
-
list = locals[:list] = Entity::REST.load_list(locals[:id])
|
436
|
+
list = locals[:list] = Entity::REST.load_list(locals[:type], locals[:id], user)
|
421
437
|
|
422
438
|
entity_class = case
|
423
439
|
when Entity.formats.include?(format)
|
@@ -428,6 +444,8 @@ module RbbtHTMLHelpers
|
|
428
444
|
nil
|
429
445
|
end
|
430
446
|
|
447
|
+
workflow = Workflow === entity_class ? entity_class : WorkflowREST.workflows.last
|
448
|
+
|
431
449
|
path = case
|
432
450
|
when (list.respond_to? :list_template and not list.list_template.nil?)
|
433
451
|
list.list_template
|
@@ -436,7 +454,7 @@ module RbbtHTMLHelpers
|
|
436
454
|
else
|
437
455
|
path = nil
|
438
456
|
|
439
|
-
[format, type].compact.each do |file|
|
457
|
+
[format, type, "Default"].compact.each do |file|
|
440
458
|
break unless path.nil?
|
441
459
|
begin
|
442
460
|
case size.to_sym
|
@@ -457,24 +475,10 @@ module RbbtHTMLHelpers
|
|
457
475
|
next
|
458
476
|
end
|
459
477
|
end
|
460
|
-
raise "List
|
478
|
+
raise "List template not found for type, format: #{[type, format] * ", "}" if path.nil?
|
461
479
|
path
|
462
480
|
end
|
463
481
|
|
464
|
-
if entity_class
|
465
|
-
entity_class.setup(list, *locals.values_at(*entity_class.annotations).collect{|v|
|
466
|
-
case v
|
467
|
-
when "false"
|
468
|
-
false
|
469
|
-
when "true"
|
470
|
-
true
|
471
|
-
else
|
472
|
-
v
|
473
|
-
end
|
474
|
-
})
|
475
|
-
list.format = format if list.respond_to? :format
|
476
|
-
end
|
477
|
-
|
478
482
|
layout = locals[:_layout]
|
479
483
|
layout = false if locals[:_xhr] and layout.nil?
|
480
484
|
layout = true if layout.nil?
|
@@ -493,16 +497,15 @@ module RbbtHTMLHelpers
|
|
493
497
|
end
|
494
498
|
end
|
495
499
|
|
496
|
-
|
500
|
+
|
497
501
|
|
498
502
|
def entity_list_action_render(type, action, locals, &block)
|
499
503
|
type, format = type.split ":"
|
500
504
|
|
501
505
|
size = locals.delete(:_size) || locals.delete("_size") || :normal
|
502
506
|
|
503
|
-
|
504
|
-
|
505
|
-
list = locals[:list] = Entity::REST.load_list(locals[:id])
|
507
|
+
list = locals[:list] = Entity::REST.load_list(type, locals[:id], user)
|
508
|
+
locals[:type] = type
|
506
509
|
|
507
510
|
entity_class = case
|
508
511
|
when Entity.formats.include?(format)
|
@@ -513,6 +516,8 @@ module RbbtHTMLHelpers
|
|
513
516
|
nil
|
514
517
|
end
|
515
518
|
|
519
|
+
workflow = Workflow === entity_class ? entity_class : WorkflowREST.workflows.last
|
520
|
+
|
516
521
|
path = case
|
517
522
|
when (list.respond_to? :list_action_template and Hash === list.list_action_template and not list.list_action_template[action].nil?)
|
518
523
|
list.list_action_template[action]
|
@@ -547,20 +552,6 @@ module RbbtHTMLHelpers
|
|
547
552
|
path
|
548
553
|
end
|
549
554
|
|
550
|
-
if entity_class
|
551
|
-
entity_class.setup(list, *locals.values_at(*entity_class.annotations).collect{|v|
|
552
|
-
case v
|
553
|
-
when "false"
|
554
|
-
false
|
555
|
-
when "true"
|
556
|
-
true
|
557
|
-
else
|
558
|
-
v
|
559
|
-
end
|
560
|
-
})
|
561
|
-
list.format = format if list.respond_to? :format
|
562
|
-
end
|
563
|
-
|
564
555
|
layout = locals[:_layout]
|
565
556
|
layout = false if locals[:_xhr] and layout.nil?
|
566
557
|
layout = true if layout.nil?
|
@@ -577,7 +568,7 @@ module RbbtHTMLHelpers
|
|
577
568
|
else
|
578
569
|
renderer.render(self, locals, &block)
|
579
570
|
end
|
580
|
-
|
571
|
+
|
581
572
|
end
|
582
573
|
end
|
583
574
|
|
@@ -8,18 +8,130 @@ module Sinatra
|
|
8
8
|
ENV.include? "RACK_ENV" and not ENV["RACK_ENV"].nil? and ENV['RACK_ENV'].downcase == "production"
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def old_cache(path, check)
|
12
|
+
return false if check.nil?
|
13
|
+
return false if not File.exists? path
|
14
|
+
check = [check] unless Array === check
|
15
|
+
return check.select{|file| not File.exists?(file) or File.mtime(file) > File.mtime(path)}.any?
|
16
|
+
end
|
17
|
+
|
18
|
+
def cache(type, options, &block)
|
19
|
+
cache_type, update, check = Misc.process_options options, :cache_type, :update, :check
|
20
|
+
|
21
|
+
check = [check] if not check.nil? and not Array === check
|
22
|
+
|
12
23
|
name = type + ":" + Misc.hash2md5(options)
|
24
|
+
|
13
25
|
if production?
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
26
|
+
cache_type ||= :memory
|
27
|
+
else
|
28
|
+
cache_type = :none
|
29
|
+
end
|
30
|
+
|
31
|
+
case cache_type.to_sym
|
32
|
+
when :sync, :synchronous
|
33
|
+
|
34
|
+
path = File.join(settings.cache_dir, "sinatra", name)
|
35
|
+
task = Task.setup(:name => "Sinatra cache", :result_type => :string, &block)
|
36
|
+
step = Step.new(path, task, nil, nil, self)
|
37
|
+
|
38
|
+
step.clean if old_cache(path, check)
|
39
|
+
|
40
|
+
begin
|
41
|
+
case
|
42
|
+
when (not step.started? and not update == 'check')
|
43
|
+
step.run
|
44
|
+
when (step.started? and update == 'reload')
|
45
|
+
step.clean
|
46
|
+
step.run
|
47
|
+
end
|
48
|
+
rescue
|
49
|
+
end
|
50
|
+
|
51
|
+
begin
|
52
|
+
case
|
53
|
+
when step.error?
|
54
|
+
status 500
|
55
|
+
status = step.status || "error"
|
56
|
+
messages = step.messages || []
|
57
|
+
backtrace = step.info[:backtrace] || []
|
58
|
+
step.clean
|
59
|
+
"<span class='cache_status'>" << status.to_s << "</span> " << "\n" <<
|
60
|
+
"<span class='cache_message'>" << messages.last << "</span> " << "\n" <<
|
61
|
+
"<ul class='backtrace'>" + backtrace.collect{|line| "<li>" << line << "</li>"} * "\n"
|
62
|
+
when step.done?
|
63
|
+
step.load
|
64
|
+
else
|
65
|
+
if request.xhr?
|
66
|
+
status 202
|
67
|
+
"<span class='cache_status'>" << (step.status || "starting").to_s << "</span>"
|
68
|
+
else
|
69
|
+
retry unless step.done? and not step.error?
|
70
|
+
step.load
|
71
|
+
end
|
72
|
+
end
|
21
73
|
end
|
22
|
-
|
74
|
+
|
75
|
+
|
76
|
+
when :async
|
77
|
+
|
78
|
+
path = File.join(settings.cache_dir, "sinatra", name)
|
79
|
+
task = Task.setup(:result_type => :string, &block)
|
80
|
+
step = Step.new(path, task, nil, nil, self)
|
81
|
+
|
82
|
+
step.clean if old_cache(path, check)
|
83
|
+
|
84
|
+
case
|
85
|
+
when (not step.started? and not update == 'check')
|
86
|
+
step.fork
|
87
|
+
sleep 0.5
|
88
|
+
sleep 2 unless step.done?
|
89
|
+
when (step.started? and update == 'reload')
|
90
|
+
step.clean
|
91
|
+
step.fork
|
92
|
+
sleep 0.5
|
93
|
+
sleep 2 unless step.done?
|
94
|
+
end
|
95
|
+
|
96
|
+
begin
|
97
|
+
case
|
98
|
+
when (not step.started?)
|
99
|
+
status 202
|
100
|
+
"<span class='cache_status'>" << "not started" << "</span>"
|
101
|
+
when step.error?
|
102
|
+
status 500
|
103
|
+
status = step.status || "error"
|
104
|
+
messages = step.messages || []
|
105
|
+
backtrace = step.info[:backtrace] || []
|
106
|
+
step.clean
|
107
|
+
"<span class='cache_status'>" << status.to_s << "</span> " << "\n" <<
|
108
|
+
"<span class='cache_message'>" << messages.last << "</span> " << "\n" <<
|
109
|
+
"<ul class='backtrace'>" + backtrace.collect{|line| "<li>" << line << "</li>"} * "\n"
|
110
|
+
|
111
|
+
when step.done?
|
112
|
+
step.load
|
113
|
+
else
|
114
|
+
if request.xhr?
|
115
|
+
status 202
|
116
|
+
"<span class='cache_status'>" << (step.status || "starting").to_s << "</span>"
|
117
|
+
else
|
118
|
+
step.join
|
119
|
+
case
|
120
|
+
when step.error?
|
121
|
+
retry
|
122
|
+
when step.done?
|
123
|
+
step.load
|
124
|
+
else
|
125
|
+
retry
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
when :memory
|
132
|
+
@@cache ||= {}
|
133
|
+
@@cache.delete name if not check.nil?
|
134
|
+
@@cache[name] ||= yield
|
23
135
|
else
|
24
136
|
yield
|
25
137
|
end
|
@@ -40,14 +152,14 @@ module Sinatra
|
|
40
152
|
@result_cache[workflow][task] ||= {}
|
41
153
|
@result_cache[workflow][task][jobname] ||= yield
|
42
154
|
end
|
43
|
-
|
155
|
+
|
44
156
|
def context_job(workflow, task)
|
45
157
|
return nil if not defined? session
|
46
158
|
return nil if not session.include? "context"
|
47
159
|
return nil if not session["context"].include? workflow
|
48
160
|
return nil if not session["context"][workflow].include? task
|
49
161
|
jobname = session["context"][workflow][task]
|
50
|
-
|
162
|
+
|
51
163
|
if authorized?
|
52
164
|
real_jobname = File.join(user, jobname)
|
53
165
|
else
|
@@ -154,6 +266,7 @@ module Sinatra
|
|
154
266
|
|
155
267
|
page = params.delete :_page
|
156
268
|
|
269
|
+
|
157
270
|
filter = params.delete :_filter
|
158
271
|
|
159
272
|
size = params.delete(:_size) || params.delete("_size")
|
@@ -51,7 +51,7 @@ ul.job_control
|
|
51
51
|
margin-right: 15px
|
52
52
|
|
53
53
|
#content
|
54
|
-
|
54
|
+
width: 100%
|
55
55
|
#main
|
56
56
|
width: auto
|
57
57
|
padding: 10px
|
@@ -108,7 +108,7 @@ a.entity, a.entity_list, a.entity_action, a.entity_list_action
|
|
108
108
|
white-space: nowrap
|
109
109
|
word-spacing: 0px
|
110
110
|
|
111
|
-
a.replace
|
111
|
+
a.replace, a.check_replace
|
112
112
|
+border_radius(4px, 4px)
|
113
113
|
+shadowed_box()
|
114
114
|
display: inline-block
|
@@ -131,3 +131,94 @@ span.user
|
|
131
131
|
|
132
132
|
a.button
|
133
133
|
+button_link()
|
134
|
+
|
135
|
+
span.cache_status
|
136
|
+
margin: 0px 15px
|
137
|
+
color: gray
|
138
|
+
text-decoration: none
|
139
|
+
|
140
|
+
span.note
|
141
|
+
color: gray
|
142
|
+
|
143
|
+
.embedded
|
144
|
+
position: relative
|
145
|
+
& > span.cache_status
|
146
|
+
position: absolute
|
147
|
+
top: 9px
|
148
|
+
right: 150px
|
149
|
+
text-align: center
|
150
|
+
color: red
|
151
|
+
|
152
|
+
header, .contracted_embedded
|
153
|
+
font-size: 1.8em
|
154
|
+
ul.embedded_control
|
155
|
+
float: right
|
156
|
+
font-size: 12px
|
157
|
+
+clean_list()
|
158
|
+
li > a
|
159
|
+
+button_link()
|
160
|
+
margin-left: 3px
|
161
|
+
|
162
|
+
a.retry_error, a.start_checked
|
163
|
+
+button_link()
|
164
|
+
|
165
|
+
.selected_entity
|
166
|
+
font-weight: bold
|
167
|
+
|
168
|
+
#lists
|
169
|
+
position: absolute
|
170
|
+
top: 40px
|
171
|
+
right: 10px
|
172
|
+
width: auto
|
173
|
+
min-width: 300px
|
174
|
+
padding: 20px
|
175
|
+
padding-left: 30px
|
176
|
+
background-color: #fefefe
|
177
|
+
+shadowed_box
|
178
|
+
ul.entity_list
|
179
|
+
li
|
180
|
+
display: block
|
181
|
+
|
182
|
+
|
183
|
+
span.list_dropdown
|
184
|
+
float: right
|
185
|
+
margin-right: 20px
|
186
|
+
a
|
187
|
+
+button_link
|
188
|
+
color: gray
|
189
|
+
|
190
|
+
a.remove_list, a.select_list
|
191
|
+
font-size: 0.7em
|
192
|
+
+button_link
|
193
|
+
|
194
|
+
a.view_list
|
195
|
+
margin-left: 10px
|
196
|
+
|
197
|
+
#lists
|
198
|
+
display: none
|
199
|
+
ul
|
200
|
+
+clean_list()
|
201
|
+
a
|
202
|
+
text-decoration: none
|
203
|
+
|
204
|
+
a.remove_entity_from_list
|
205
|
+
+button_link()
|
206
|
+
|
207
|
+
.edit_controls
|
208
|
+
padding: 10px
|
209
|
+
display: none
|
210
|
+
|
211
|
+
a.open_edit_controls
|
212
|
+
+button_link()
|
213
|
+
|
214
|
+
h5.loaded_lists
|
215
|
+
margin: 5px 0px
|
216
|
+
font-style: italic
|
217
|
+
|
218
|
+
.list_control
|
219
|
+
header
|
220
|
+
font-size: 1.2em
|
221
|
+
span.list_id
|
222
|
+
font-style: italic
|
223
|
+
a
|
224
|
+
+button_link()
|