rbbt-views 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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()
|