rbbt-rest 1.7.20 → 1.8.0
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 +4 -4
- data/lib/rbbt/rest/common/forms.rb +6 -2
- data/lib/rbbt/rest/common/locate.rb +27 -1
- data/lib/rbbt/rest/entity.rb +9 -4
- data/lib/rbbt/rest/entity/locate.rb +156 -143
- data/lib/rbbt/rest/entity/rest.rb +2 -2
- data/lib/rbbt/rest/main.rb +15 -1
- data/share/views/compass/app.sass +3 -0
- data/share/views/entity_partials/entity_map_card.haml +9 -5
- data/share/views/layout/coda.haml +1 -0
- data/share/views/partials/table/filters.haml +6 -6
- data/share/views/public/js/helpers/helpers.js +7 -5
- data/share/views/public/js/rbbt.entity_list.js +5 -1
- data/share/views/public/js/rbbt.plots/rbbt.plots.aes.js +13 -1
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.adapters.js +0 -1
- data/share/views/public/js/rbbt/list.js +1 -1
- data/share/views/public/js/rbbt/map.js +103 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33b3e5b0e58772dc57de97948285d38035eccbec
|
4
|
+
data.tar.gz: a8b907196c822fed834fe8c7ef116b68a78ea74e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b1b63cb4665226a0ece4345bec78f3cb74885ac003a1e3eb3d31f999f28060d49cc79cc490106752465af7d177b9b805c5f5ff3d7bd2a72a79509c5e7185073
|
7
|
+
data.tar.gz: e27f644d02bb2745e6295cb989ad4f0dfaf06dc59ed7d3f07bbe05f0049cd303560ec985819f53ddd3dc8a2ead90f1e18d413caa046001adeef6d96e5a758c2a
|
@@ -99,8 +99,12 @@ module RbbtRESTHelpers
|
|
99
99
|
1
|
100
100
|
end
|
101
101
|
|
102
|
-
|
103
|
-
|
102
|
+
if input_type == 'hidden'
|
103
|
+
html_tag("input", nil, html_options.merge(:type => input_type, :name => name, :value => value, :id => id, :step => step))
|
104
|
+
else
|
105
|
+
input_label(id, name, description, default, extra) +
|
106
|
+
html_tag("input", nil, html_options.merge(:type => input_type, :name => name, :value => value, :id => id, :step => step))
|
107
|
+
end
|
104
108
|
|
105
109
|
when :tsv, :array, :text, :file
|
106
110
|
value = current.nil? ? default : current
|
@@ -81,7 +81,7 @@ module RbbtRESTHelpers
|
|
81
81
|
#{{{ JAVASCRIPT
|
82
82
|
|
83
83
|
def self.javascript_resources
|
84
|
-
@javascript_resources ||= [Rbbt.share.views.public.find(:lib), Rbbt.share.views.public.js.find(:lib)]
|
84
|
+
@javascript_resources ||= [Rbbt.share.views.public.find(:lib), Rbbt.share.views.public.js.find(:lib), Rbbt.share.views.public.plugins.find(:lib)]
|
85
85
|
end
|
86
86
|
|
87
87
|
def javascript_resources
|
@@ -103,4 +103,30 @@ module RbbtRESTHelpers
|
|
103
103
|
|
104
104
|
raise TemplateMissing, "Script #{ script } not found"
|
105
105
|
end
|
106
|
+
|
107
|
+
#{{{ CSS
|
108
|
+
|
109
|
+
def self.css_resources
|
110
|
+
@css_resources ||= [Rbbt.share.views.public.find(:lib), Rbbt.share.views.public.css.find(:lib), Rbbt.share.views.public.plugins.find(:lib)]
|
111
|
+
end
|
112
|
+
|
113
|
+
def css_resources
|
114
|
+
RbbtRESTHelpers.css_resources
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def locate_css_from_resource(resource, script)
|
119
|
+
path = resource[script + '.css']
|
120
|
+
return path if path.exists?
|
121
|
+
resource[script]
|
122
|
+
end
|
123
|
+
|
124
|
+
def locate_css(script)
|
125
|
+
css_resources.each do |resource|
|
126
|
+
path = locate_css_from_resource(resource, script)
|
127
|
+
return path if path.exists?
|
128
|
+
end
|
129
|
+
|
130
|
+
raise TemplateMissing, "Script #{ script } not found"
|
131
|
+
end
|
106
132
|
end
|
data/lib/rbbt/rest/entity.rb
CHANGED
@@ -362,6 +362,7 @@ module Sinatra
|
|
362
362
|
halt 200, TSV.open(file).to_json
|
363
363
|
else
|
364
364
|
map = Entity::Map.load_map(entity_type.split(":").first, column, map_id, user)
|
365
|
+
raise "Map not found: #{ map_id }" if map.nil?
|
365
366
|
entity_map_render(map_id, entity_type.split(":").first, column)
|
366
367
|
end
|
367
368
|
end
|
@@ -386,7 +387,8 @@ module Sinatra
|
|
386
387
|
column = Entity::REST.restore_element(params[:column])
|
387
388
|
map_id = Entity::REST.restore_element(params[:map_id])
|
388
389
|
|
389
|
-
|
390
|
+
base_type = entity_type.split(":").first
|
391
|
+
map = Entity::Map.load_map(base_type, column, map_id, user)
|
390
392
|
|
391
393
|
Entity::Map.save_map(entity_type, column, new_id, map, user)
|
392
394
|
|
@@ -402,15 +404,18 @@ module Sinatra
|
|
402
404
|
|
403
405
|
entity_type = consume_parameter :entity_type
|
404
406
|
column = consume_parameter :column
|
407
|
+
column2 = consume_parameter :column2
|
405
408
|
entity_type = Entity::REST.restore_element(entity_type)
|
406
409
|
column = Entity::REST.restore_element(column)
|
407
410
|
|
408
411
|
file1 = Entity::Map.map_file(entity_type.split(":").first, column, map1, user)
|
409
412
|
file1 = Entity::Map.map_file(entity_type.split(":").first, column, map1, nil) unless File.exists? file1
|
410
|
-
|
413
|
+
raise "Map not found: #{ map1 }" unless File.exists? file1
|
414
|
+
tsv1 = TSV.open(file1)
|
411
415
|
|
412
|
-
file2 = Entity::Map.map_file(entity_type.split(":").first,
|
413
|
-
file2 = Entity::Map.map_file(entity_type.split(":").first,
|
416
|
+
file2 = Entity::Map.map_file(entity_type.split(":").first, column2, map2, user)
|
417
|
+
file2 = Entity::Map.map_file(entity_type.split(":").first, column2, map2, nil) unless File.exists? file2
|
418
|
+
raise "Map not found: #{ map2 } - #{ file2 }" unless File.exists? file2
|
414
419
|
tsv2 = TSV.open(file2)
|
415
420
|
|
416
421
|
tsv1.attach tsv2, :fields => tsv2.fields
|
@@ -8,6 +8,32 @@ module EntityRESTHelpers
|
|
8
8
|
[Rbbt.share.views.find(:lib)] + EntityRESTHelpers.entity_resources
|
9
9
|
end
|
10
10
|
|
11
|
+
#{{{ CHECKS
|
12
|
+
|
13
|
+
def reject_template(path,binding)
|
14
|
+
check_file = path.sub(/\.haml$/, '.check')
|
15
|
+
|
16
|
+
if Path === path
|
17
|
+
path.annotate check_file
|
18
|
+
return false unless check_file.exists?
|
19
|
+
else
|
20
|
+
return false unless File.exists?(check_file)
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
code = Open.read(check_file)
|
25
|
+
accept = eval code, binding, check_file, 0
|
26
|
+
Log.debug{"Checking action template: #{path} - #{accept ? 'accepted' : 'rejected'}"}
|
27
|
+
return ! accept
|
28
|
+
rescue
|
29
|
+
Log.exception $!
|
30
|
+
iii path
|
31
|
+
ppp code
|
32
|
+
return true
|
33
|
+
end
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
11
37
|
#{{{ ENTITY
|
12
38
|
|
13
39
|
def locate_entity_template_from_resource(resource, entity)
|
@@ -54,59 +80,10 @@ module EntityRESTHelpers
|
|
54
80
|
|
55
81
|
#{{{ ENTITY ACTION
|
56
82
|
|
57
|
-
def find_all_entity_action_templates_from_resource(resource, entity)
|
58
|
-
if entity == "Default"
|
59
|
-
resource.entity["Default"].glob("*.haml").sort
|
60
|
-
else
|
61
|
-
entity.annotation_types.collect do |annotation|
|
62
|
-
resource.entity[annotation].glob('*.haml')
|
63
|
-
end.compact.flatten.sort
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def find_all_entity_action_templates(entity, check = false)
|
68
|
-
paths = []
|
69
|
-
|
70
|
-
if entity.respond_to? :dir and Path === entity.dir
|
71
|
-
paths.concat find_all_entity_action_templates_from_resource(entity.dir.www.views, entity)
|
72
|
-
end
|
73
|
-
|
74
|
-
entity_resources.each do |resource|
|
75
|
-
paths.concat find_all_entity_action_templates_from_resource(resource, entity)
|
76
|
-
end
|
77
|
-
|
78
|
-
entity_resources.each do |resource|
|
79
|
-
paths.concat find_all_entity_action_templates_from_resource(resource, "Default")
|
80
|
-
end
|
81
|
-
|
82
|
-
if check
|
83
|
-
paths = paths.reject do |path|
|
84
|
-
check_file = path.sub(/\.haml$/, '.check')
|
85
|
-
case
|
86
|
-
when (path.basename == "edit.haml" or path.basename == 'new.haml')
|
87
|
-
true
|
88
|
-
when File.exists?(check_file)
|
89
|
-
begin
|
90
|
-
Log.debug{"Checking action template: #{path}"}
|
91
|
-
code = File.read(check_file)
|
92
|
-
accept = eval code
|
93
|
-
not accept
|
94
|
-
rescue
|
95
|
-
Log.debug{"Error Checking action template #{path}: #{$!.message}"}
|
96
|
-
true
|
97
|
-
end
|
98
|
-
else
|
99
|
-
false
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
paths.collect{|file| file.basename.sub('.haml', '') }.uniq
|
105
|
-
end
|
106
|
-
|
107
83
|
def locate_entity_action_template_from_resource(resource, entity, action)
|
108
84
|
if entity == "Default"
|
109
85
|
path = resource.entity["Default"][action.to_s + ".haml"]
|
86
|
+
raise "This action was rejected: #{ action }" if path and reject_template(path,binding)
|
110
87
|
if path.exists?
|
111
88
|
return path
|
112
89
|
else
|
@@ -116,6 +93,7 @@ module EntityRESTHelpers
|
|
116
93
|
|
117
94
|
entity.annotation_types.each do |annotation|
|
118
95
|
path = resource.entity[annotation][action.to_s + ".haml"]
|
96
|
+
raise "This action was rejected: #{ action }" if path and reject_template(path,binding)
|
119
97
|
return path if path.exists?
|
120
98
|
end
|
121
99
|
|
@@ -136,12 +114,56 @@ module EntityRESTHelpers
|
|
136
114
|
|
137
115
|
entity_resources.each do |resource|
|
138
116
|
path = locate_entity_action_template_from_resource(resource, "Default", action)
|
117
|
+
raise "This action was rejected: #{ action }" if reject_template(path,binding)
|
139
118
|
return path if path and path.exists?
|
140
119
|
end
|
141
120
|
|
142
121
|
raise "Template not found for action #{action}: #{ entity } (#{entity.annotation_types * ", "})"
|
143
122
|
end
|
144
123
|
|
124
|
+
def find_all_entity_action_templates_from_resource(resource, entity)
|
125
|
+
if entity == "Default"
|
126
|
+
resource.entity["Default"].glob("*.haml").sort
|
127
|
+
else
|
128
|
+
entity.annotation_types.collect do |annotation|
|
129
|
+
resource.entity[annotation].glob('*.haml')
|
130
|
+
end.compact.flatten.sort
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_all_entity_action_templates(entity, check = false)
|
135
|
+
paths = []
|
136
|
+
|
137
|
+
if entity.respond_to? :dir and Path === entity.dir
|
138
|
+
paths.concat find_all_entity_action_templates_from_resource(entity.dir.www.views, entity)
|
139
|
+
end
|
140
|
+
|
141
|
+
entity_resources.each do |resource|
|
142
|
+
paths.concat find_all_entity_action_templates_from_resource(resource, entity)
|
143
|
+
end
|
144
|
+
|
145
|
+
entity_resources.each do |resource|
|
146
|
+
paths.concat find_all_entity_action_templates_from_resource(resource, "Default")
|
147
|
+
end
|
148
|
+
|
149
|
+
if check
|
150
|
+
paths = paths.reject do |path|
|
151
|
+
(path.basename == "edit.haml" or path.basename == 'new.haml')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
actions = paths.collect{|file| file.basename.sub('.haml', '') }.uniq
|
156
|
+
|
157
|
+
actions.select! do |action|
|
158
|
+
begin
|
159
|
+
locate_entity_action_template(entity, action)
|
160
|
+
rescue Exception
|
161
|
+
false
|
162
|
+
end
|
163
|
+
end if check
|
164
|
+
|
165
|
+
actions
|
166
|
+
end
|
145
167
|
#{{{ ENTITY LIST
|
146
168
|
|
147
169
|
def locate_entity_list_template_from_resource(resource, list)
|
@@ -189,61 +211,11 @@ module EntityRESTHelpers
|
|
189
211
|
|
190
212
|
#{{{ ENTITY LIST ACTION
|
191
213
|
|
192
|
-
def find_all_entity_list_action_templates_from_resource(resource, entity)
|
193
|
-
|
194
|
-
if entity == "Default"
|
195
|
-
resource.entity_list["Default"].glob("*.haml").sort
|
196
|
-
else
|
197
|
-
entity.annotation_types.collect do |annotation|
|
198
|
-
resource.entity_list[annotation].glob('*.haml')
|
199
|
-
end.compact.flatten.sort
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
def find_all_entity_list_action_templates(list, check = false)
|
204
|
-
paths = []
|
205
|
-
|
206
|
-
if list.respond_to? :dir and Path === list.dir
|
207
|
-
paths.concat find_all_entity_list_action_templates_from_resource(list.dir.www.views, list)
|
208
|
-
end
|
209
|
-
|
210
|
-
entity_resources.each do |resource|
|
211
|
-
paths.concat find_all_entity_list_action_templates_from_resource(resource, list)
|
212
|
-
end
|
213
|
-
|
214
|
-
entity_resources.each do |resource|
|
215
|
-
paths.concat find_all_entity_list_action_templates_from_resource(resource, "Default")
|
216
|
-
end
|
217
|
-
|
218
|
-
if check
|
219
|
-
paths = paths.reject do |path|
|
220
|
-
check_file = path.sub(/\.haml$/, '.check')
|
221
|
-
case
|
222
|
-
when (path.basename == "edit.haml" or path.basename == 'new.haml')
|
223
|
-
true
|
224
|
-
when File.exists?(check_file)
|
225
|
-
begin
|
226
|
-
Log.debug{ "Checking action template: #{path}" }
|
227
|
-
code = File.read(check_file)
|
228
|
-
accept = eval code
|
229
|
-
not accept
|
230
|
-
rescue
|
231
|
-
Log.debug{ "Error Checking action template #{path}: #{$!.message}" }
|
232
|
-
true
|
233
|
-
end
|
234
|
-
else
|
235
|
-
false
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
paths.collect{|file| file.basename.sub('.haml', '') }.uniq
|
241
|
-
end
|
242
|
-
|
243
214
|
|
244
215
|
def locate_entity_list_action_template_from_resource(resource, list, action)
|
245
216
|
if list == "Default"
|
246
217
|
path = resource.entity_list["Default"][action.to_s + ".haml"]
|
218
|
+
raise "This action was rejected: #{ action }" if path and reject_template(path,binding)
|
247
219
|
if path.exists?
|
248
220
|
return path
|
249
221
|
else
|
@@ -253,6 +225,7 @@ module EntityRESTHelpers
|
|
253
225
|
|
254
226
|
list.annotation_types.each do |annotation|
|
255
227
|
path = resource.entity_list[annotation][action.to_s + ".haml"]
|
228
|
+
raise "This action was rejected: #{ action }" if path and reject_template(path,binding)
|
256
229
|
return path if path.exists?
|
257
230
|
end
|
258
231
|
|
@@ -279,6 +252,51 @@ module EntityRESTHelpers
|
|
279
252
|
raise "Template not found for list #{ action } (#{list.annotation_types * ", "})"
|
280
253
|
end
|
281
254
|
|
255
|
+
def find_all_entity_list_action_templates_from_resource(resource, entity)
|
256
|
+
|
257
|
+
if entity == "Default"
|
258
|
+
resource.entity_list["Default"].glob("*.haml").sort
|
259
|
+
else
|
260
|
+
entity.annotation_types.collect do |annotation|
|
261
|
+
resource.entity_list[annotation].glob('*.haml')
|
262
|
+
end.compact.flatten.sort
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def find_all_entity_list_action_templates(list, check = false)
|
267
|
+
paths = []
|
268
|
+
|
269
|
+
if list.respond_to? :dir and Path === list.dir
|
270
|
+
paths.concat find_all_entity_list_action_templates_from_resource(list.dir.www.views, list)
|
271
|
+
end
|
272
|
+
|
273
|
+
entity_resources.each do |resource|
|
274
|
+
paths.concat find_all_entity_list_action_templates_from_resource(resource, list)
|
275
|
+
end
|
276
|
+
|
277
|
+
entity_resources.each do |resource|
|
278
|
+
paths.concat find_all_entity_list_action_templates_from_resource(resource, "Default")
|
279
|
+
end
|
280
|
+
|
281
|
+
if check
|
282
|
+
paths = paths.reject do |path|
|
283
|
+
(path.basename == "edit.haml" or path.basename == 'new.haml')
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
actions = paths.collect{|file| file.basename.sub('.haml', '') }.uniq
|
288
|
+
|
289
|
+
actions.select! do |action|
|
290
|
+
begin
|
291
|
+
locate_entity_list_action_template(list, action)
|
292
|
+
rescue Exception
|
293
|
+
false
|
294
|
+
end
|
295
|
+
end if check
|
296
|
+
|
297
|
+
actions
|
298
|
+
end
|
299
|
+
|
282
300
|
#{{{ ENTITY MAP
|
283
301
|
|
284
302
|
def locate_entity_map_template_from_resource(resource, type)
|
@@ -314,7 +332,7 @@ module EntityRESTHelpers
|
|
314
332
|
|
315
333
|
#{{{ ENTITY MAP ACTION
|
316
334
|
|
317
|
-
def
|
335
|
+
def locate_entity_map_action_template_from_resource(resource, map, action)
|
318
336
|
field = map.key_field
|
319
337
|
|
320
338
|
if map.entity_templates[field]
|
@@ -325,45 +343,26 @@ module EntityRESTHelpers
|
|
325
343
|
|
326
344
|
annotation_types += ["Default"]
|
327
345
|
|
328
|
-
annotation_types.
|
329
|
-
resource.entity_map[annotation].
|
330
|
-
|
346
|
+
annotation_types.each do |annotation|
|
347
|
+
path = resource.entity_map[annotation][action.to_s + ".haml"]
|
348
|
+
raise "This action was rejected: #{ action }" if path and reject_template(path,binding)
|
349
|
+
return path if path.exists?
|
350
|
+
end
|
351
|
+
|
352
|
+
nil
|
331
353
|
end
|
332
354
|
|
333
|
-
def
|
334
|
-
paths = []
|
355
|
+
def locate_entity_map_action_template(map, action)
|
335
356
|
|
336
357
|
entity_resources.each do |resource|
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
if check
|
341
|
-
paths = paths.reject do |path|
|
342
|
-
check_file = path.sub(/\.haml$/, '.check')
|
343
|
-
case
|
344
|
-
when (path.basename == "edit.haml" or path.basename == 'new.haml')
|
345
|
-
true
|
346
|
-
when File.exists?(check_file)
|
347
|
-
begin
|
348
|
-
Log.debug{ "Checking action template: #{path}" }
|
349
|
-
code = File.read(check_file)
|
350
|
-
accept = eval code
|
351
|
-
not accept
|
352
|
-
rescue
|
353
|
-
Log.debug{ "Error Checking action template #{path}: #{$!.message}" }
|
354
|
-
true
|
355
|
-
end
|
356
|
-
else
|
357
|
-
false
|
358
|
-
end
|
359
|
-
end
|
358
|
+
path = locate_entity_map_action_template_from_resource(resource, map, action)
|
359
|
+
return path if path and path.exists?
|
360
360
|
end
|
361
361
|
|
362
|
-
|
362
|
+
raise "Template not found for map #{ action } (#{map.key_field * ", "})"
|
363
363
|
end
|
364
364
|
|
365
|
-
|
366
|
-
def locate_entity_map_action_template_from_resource(resource, map, action)
|
365
|
+
def find_all_entity_map_action_templates_from_resource(resource, map)
|
367
366
|
field = map.key_field
|
368
367
|
|
369
368
|
if map.entity_templates[field]
|
@@ -374,22 +373,36 @@ module EntityRESTHelpers
|
|
374
373
|
|
375
374
|
annotation_types += ["Default"]
|
376
375
|
|
377
|
-
annotation_types.
|
378
|
-
|
379
|
-
|
380
|
-
end
|
381
|
-
|
382
|
-
nil
|
376
|
+
annotation_types.collect do |annotation|
|
377
|
+
resource.entity_map[annotation].glob('*.haml')
|
378
|
+
end.compact.flatten
|
383
379
|
end
|
384
380
|
|
385
|
-
def
|
381
|
+
def find_all_entity_map_action_templates(map, check = false)
|
382
|
+
paths = []
|
386
383
|
|
387
384
|
entity_resources.each do |resource|
|
388
|
-
|
389
|
-
return path if path and path.exists?
|
385
|
+
paths.concat find_all_entity_map_action_templates_from_resource(resource, map)
|
390
386
|
end
|
391
387
|
|
392
|
-
|
388
|
+
if check
|
389
|
+
paths = paths.reject do |path|
|
390
|
+
(path.basename == "edit.haml" or path.basename == 'new.haml')
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
actions = paths.collect{|file| file.basename.sub('.haml', '') }.uniq
|
395
|
+
|
396
|
+
actions.select! do |action|
|
397
|
+
begin
|
398
|
+
locate_entity_map_action_template(map, action)
|
399
|
+
rescue Exception
|
400
|
+
false
|
401
|
+
end
|
402
|
+
end if check
|
403
|
+
|
404
|
+
actions
|
393
405
|
end
|
394
406
|
|
407
|
+
|
395
408
|
end
|
@@ -14,11 +14,11 @@ module Entity
|
|
14
14
|
#{{{ MISC
|
15
15
|
|
16
16
|
def self.clean_element(elem)
|
17
|
-
elem.gsub('/', '
|
17
|
+
elem.gsub('/', '-..-').gsub('%', 'o-o').gsub('[','(.-(').gsub(']',').-)')
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.restore_element(elem)
|
21
|
-
CGI.unescape(CGI.unescape(elem.gsub('
|
21
|
+
CGI.unescape(CGI.unescape(elem.gsub('-..-', '/').gsub('o-o', '%').gsub('(.-(','[').gsub(').-)',']')))
|
22
22
|
end
|
23
23
|
|
24
24
|
def entity_link_params
|
data/lib/rbbt/rest/main.rb
CHANGED
@@ -27,7 +27,10 @@ module Sinatra
|
|
27
27
|
|
28
28
|
RbbtRESTHelpers.add_sass_load_path path.compass if path.compass.exists?
|
29
29
|
|
30
|
-
RbbtRESTHelpers.javascript_resources.unshift path.public.js if path.public.js.exists?
|
30
|
+
RbbtRESTHelpers.javascript_resources.unshift path.public.js if path.public.js.exists?
|
31
|
+
RbbtRESTHelpers.css_resources.unshift path.public.css if path.public.css.exists?
|
32
|
+
RbbtRESTHelpers.javascript_resources.unshift path.public.plugins if path.public.plugins.exists?
|
33
|
+
RbbtRESTHelpers.css_resources.unshift path.public.plugins if path.public.plugins.exists?
|
31
34
|
RbbtRESTHelpers.sass_resources.unshift path.compass if path.compass.exists?
|
32
35
|
end
|
33
36
|
|
@@ -140,6 +143,17 @@ module Sinatra
|
|
140
143
|
send_file script_file
|
141
144
|
end
|
142
145
|
|
146
|
+
get %r{/css-find/(.*)(.css)?} do
|
147
|
+
name = consume_parameter(:captures).first
|
148
|
+
|
149
|
+
script_file = locate_css(name)
|
150
|
+
|
151
|
+
content_type 'text/css', :charset => 'utf-8' if script_file =~ /\.js$/
|
152
|
+
cache_control :public, :max_age => 360000 if production?
|
153
|
+
send_file script_file
|
154
|
+
end
|
155
|
+
|
156
|
+
|
143
157
|
get '/stylesheets/*' do
|
144
158
|
name = consume_parameter :splat
|
145
159
|
|
@@ -14,13 +14,13 @@
|
|
14
14
|
.info.ui.compact.segment
|
15
15
|
.meta
|
16
16
|
.map_management.ui.buttons
|
17
|
-
= reveal "Rename", nil, :class => 'ui small button' do
|
18
|
-
%form.
|
17
|
+
= reveal "Rename", nil, :class => 'ui small button rename_map' do
|
18
|
+
%form.rename_map
|
19
19
|
%label New name
|
20
20
|
%input(name='rename' value=map_id)
|
21
21
|
%input(type='submit')
|
22
22
|
|
23
|
-
- if %w(pvalue p.value p-value pvalues p.values p-values qvalue q.value q-value qvalues q.values q-values)
|
23
|
+
- if (%w(pvalue p.value p-value pvalues p.values p-values qvalue q.value q-value qvalues q.values q-values) & map.fields.first.downcase.split(/\s+/)).any? and map.fields.first.downcase !~ /score$/
|
24
24
|
- url = add_GET_param(@fullpath, '_format', 'pvalue_score')
|
25
25
|
%a.ui.small.button(href=url) Pvalue score
|
26
26
|
|
@@ -40,15 +40,19 @@
|
|
40
40
|
- if NumericValue == Entity.formats[map.fields.first] or (map.entity_templates[map.fields.first] and map.entity_templates[map.fields.first].annotation_types.include? NumericValue)
|
41
41
|
- $page_entity_base_type = page_entity_base_type
|
42
42
|
- $page_entity_map_column = page_entity_map_column
|
43
|
-
= reveal
|
43
|
+
= reveal "Rank products", nil, :class => 'ui small button rank_product' do
|
44
44
|
= action_parameters nil, :class => 'rank_products' do
|
45
45
|
- input :map, :select, "Select map to use", nil, :html_options => {:class => 'favourite_maps', :type => $page_entity_base_type, :column => $page_entity_map_column}
|
46
46
|
|
47
|
+
= reveal "Compare plot", nil, :class => 'ui small button plot' do
|
48
|
+
= action_parameters nil, :class => 'plot' do
|
49
|
+
- input :map, :select, "Select map to use", nil, :html_options => {:class => 'favourite_maps', :type => $page_entity_base_type, :column => $page_entity_map_column}
|
50
|
+
|
47
51
|
|
48
52
|
|
49
53
|
.content
|
50
54
|
.description
|
51
|
-
= table :class => 'ui collapsing table' do
|
55
|
+
= table :class => 'ui collapsing table', :table_id => map_id do
|
52
56
|
- map
|
53
57
|
- if card.action_controller
|
54
58
|
.actions
|
@@ -16,10 +16,10 @@
|
|
16
16
|
:markdown
|
17
17
|
Filters can be specified in several ways:
|
18
18
|
|
19
|
-
- *String of text*: perfect match (e.g. `Cancer`)
|
20
|
-
- *Regular expression*: flexible match (e.g.
|
21
|
-
- *Numeric comparison*: lower of grater than (e.g.
|
22
|
-
- *Names*: for entities
|
23
|
-
- *Length*: for lists (e.g.
|
24
|
-
- *Negation*: Any of the rules above can be negated by prepending the `!` character (e.g.
|
19
|
+
- *String of text*: perfect match (e.g. `'Cancer'`)
|
20
|
+
- *Regular expression*: flexible match (e.g. `'/(bladder|breast)\s+cancer/i'`)
|
21
|
+
- *Numeric comparison*: lower of grater than (e.g. `'< 0.1'` or `'>= 2'`)
|
22
|
+
- *Names*: for entities having 'human-friendly' names, such as genes or pathways; regular expression accepted (e.g. `':name: SF3B1'` or `':name: /CDK\d/'`)
|
23
|
+
- *Length*: for lists (e.g. `':length: > 2'`)
|
24
|
+
- *Negation*: Any of the rules above can be negated by prepending the `!` character (e.g. `'!:name:/^IG/'`)
|
25
25
|
|
@@ -37,11 +37,11 @@ function remove_parameter(url, parameter){
|
|
37
37
|
}
|
38
38
|
|
39
39
|
function clean_element(elem){
|
40
|
-
return elem.replace(/\//g, '
|
40
|
+
return elem.replace(/\//g, '-..-').replace(/%/g,'o-o').replace(/\[/g,'(.-(').replace(/\]/g,').-)')
|
41
41
|
}
|
42
42
|
|
43
43
|
function restore_element(elem){
|
44
|
-
return unescape(elem.replace(
|
44
|
+
return unescape(elem.replace(/-\.\.-/g, '/').replace(/o-o/g,'%')).replace(/\(\.-\(/g,'[').replace(/\)\.-\)/g,']');
|
45
45
|
}
|
46
46
|
|
47
47
|
function parse_parameters(params){
|
@@ -70,7 +70,7 @@ function require_js(url, success, script){
|
|
70
70
|
}
|
71
71
|
}else{
|
72
72
|
var async = true;
|
73
|
-
if (
|
73
|
+
if (typeof production == 'undefined') production = false
|
74
74
|
var cache = production;
|
75
75
|
|
76
76
|
if (undefined === success){
|
@@ -79,12 +79,14 @@ function require_js(url, success, script){
|
|
79
79
|
async = true;
|
80
80
|
}
|
81
81
|
|
82
|
-
url = url.replace('
|
82
|
+
url = url.replace('^/js/', '/js-find/')
|
83
83
|
|
84
84
|
if ($.inArray(url, required_js) >= 0){
|
85
85
|
if (typeof success == 'function'){ success.call(script) }
|
86
86
|
}else{
|
87
|
-
var _success = function(){ required_js.push(url); if (typeof success == 'function'){ success
|
87
|
+
var _success = function(script_text){ required_js.push(url); console.log("Required and loaded JS: " + url); if (typeof success == 'function'){ success(script) }; }
|
88
|
+
if (typeof rbbt.proxy != 'undefined')
|
89
|
+
url = rbbt.proxy + url
|
88
90
|
$.ajax({url: url, cache:cache, dataType:'script', async: async, success: _success} ).fail(function(jqxhr, settings, exception){ console.log('Failed to load ' + url) })
|
89
91
|
}
|
90
92
|
}
|
@@ -142,7 +142,11 @@ FavouriteLists.get = function(){
|
|
142
142
|
}
|
143
143
|
|
144
144
|
FavouriteLists.deserialize = function(data){
|
145
|
-
|
145
|
+
try{
|
146
|
+
data = JSON.parse(data)
|
147
|
+
}catch(err){
|
148
|
+
data = {}
|
149
|
+
}
|
146
150
|
favourite_lists = {}
|
147
151
|
|
148
152
|
forHash(data, function(type, type_data){
|
@@ -39,6 +39,7 @@ rbbt.plots.aes.map_aesthetic = function(aes, mapper, map_obj){
|
|
39
39
|
return map_obj(aes)
|
40
40
|
}
|
41
41
|
}
|
42
|
+
|
42
43
|
rbbt.plots.aes.get_properties = function(list, rules){
|
43
44
|
if (undefined === rules) rules == []
|
44
45
|
if (undefined === list.properties) list.properties = {}
|
@@ -190,6 +191,17 @@ rbbt.plots.aes.set_aes = function(list, aes_rules){
|
|
190
191
|
if (undefined === property && name == 'code') property = list.codes
|
191
192
|
if (undefined === property) return
|
192
193
|
|
193
|
-
|
194
|
+
var aes_values = rbbt.plots.aes.map_aesthetic(property, mapper, mapper_obj)
|
195
|
+
|
196
|
+
if (undefined === list.aes[aes]){
|
197
|
+
list.aes[aes] = aes_values
|
198
|
+
}else{
|
199
|
+
for(i in aes_values){
|
200
|
+
var v = aes_values[i]
|
201
|
+
if (undefined !== v){
|
202
|
+
list.aes[aes][i] = v
|
203
|
+
}
|
204
|
+
}
|
205
|
+
}
|
194
206
|
})
|
195
207
|
}
|
@@ -110,7 +110,6 @@ rbbt.plots.graph.view_cytoscapejs = function(graph_model, elem, style, layout, e
|
|
110
110
|
|
111
111
|
var deferred = m.deferred()
|
112
112
|
|
113
|
-
console.log(graph_model)
|
114
113
|
rbbt.plots.graph.update(graph_model).then(function(updated_model){
|
115
114
|
var cy_model = rbbt.plots.graph.build_cytoscapejs(updated_model)
|
116
115
|
|
@@ -121,7 +121,7 @@ body.on('click', '.edit_list input[type=submit]', function(){
|
|
121
121
|
|
122
122
|
if (undefined !== format){ entity_type = entity_type + ':' + clean_element(format) }
|
123
123
|
|
124
|
-
var url = '/entity_list/' + entity_type + '/' + new_list_id
|
124
|
+
var url = '/entity_list/' + clean_element(entity_type) + '/' + clean_element(new_list_id )
|
125
125
|
|
126
126
|
get_ajax({url: url, type: 'POST', async: false, data: {annotations: JSON.stringify(annotations), entities: entities}}, function(){ window.location = url })
|
127
127
|
|
@@ -1,18 +1,116 @@
|
|
1
1
|
function entity_map(type, column, id, complete){
|
2
2
|
var url = "/entity_map" + '/' + clean_element(type) + '/' + clean_element(column) + '/' + clean_element(id);
|
3
|
-
return
|
3
|
+
return rbbt.ajax({url: url, async: false, method: "GET", data: {_format: 'json'}}, complete)
|
4
4
|
}
|
5
5
|
|
6
|
+
$('body').on('click', '#modal form.rename_map input[type=submit]', function(){
|
7
|
+
console.log(1)
|
8
|
+
var map = rbbt.page.map();
|
9
|
+
var map_id = map.id
|
10
|
+
|
11
|
+
var submit = $(this);
|
12
|
+
var input = submit.closest('form').find('input[name=rename]')
|
13
|
+
var new_name = input.val();
|
14
|
+
var entity_type = map.type
|
15
|
+
var column = map.column
|
16
|
+
url = '/entity_map/rename/'+ clean_element(entity_type) + '/'+ clean_element(column) +'/' + clean_element(map_id) + '?new_name=' + clean_element(new_name)
|
17
|
+
window.location = url
|
18
|
+
return false
|
19
|
+
})
|
20
|
+
|
6
21
|
$('body').on('click', '.rank_products form input[type=submit]', function(){
|
7
|
-
var
|
22
|
+
var map = rbbt.page.map();
|
23
|
+
var map1 = map.id;
|
8
24
|
|
9
25
|
var input = $(this);
|
10
26
|
var select = input.closest('form').find('select')
|
11
27
|
var map2 = select.val();
|
12
|
-
var entity_type =
|
13
|
-
var column =
|
14
|
-
|
28
|
+
var entity_type = map.type
|
29
|
+
var column = map.column
|
30
|
+
var column2 = select.find('option:selected').attr('attr-column')
|
31
|
+
url = "/entity_map/rank_products?map1=" + clean_element(map1) + "&map2=" + clean_element(map2) + '&entity_type=' + entity_type + "&column=" + column + "&column2=" + column2
|
15
32
|
window.location = url
|
16
33
|
return false
|
17
34
|
})
|
18
35
|
|
36
|
+
$('body').on('click', '.plot form input[type=submit]', function(){
|
37
|
+
var map = rbbt.page.map();
|
38
|
+
var map1 = map.id;
|
39
|
+
|
40
|
+
var input = $(this);
|
41
|
+
var select = input.closest('form').find('select')
|
42
|
+
var map2 = select.val();
|
43
|
+
var entity_type = map.type
|
44
|
+
var column = map.column
|
45
|
+
var column2 = select.find('option:selected').attr('attr-column')
|
46
|
+
|
47
|
+
m.sync([entity_map(entity_type,column,map1), entity_map(entity_type,column2, map2)]).then(function(res){
|
48
|
+
var modal = $('#modal')
|
49
|
+
var container = $('<div>').addClass('plot_container')
|
50
|
+
|
51
|
+
var res1, res2
|
52
|
+
res1 = res[0]
|
53
|
+
res2 = res[1]
|
54
|
+
|
55
|
+
var tmp_data = []
|
56
|
+
forHash(res1,function(k,v1){
|
57
|
+
var v2 = res2[k]
|
58
|
+
if (undefined !== v2)
|
59
|
+
tmp_data.push([v1,v2,k])
|
60
|
+
})
|
61
|
+
tmp_data = tmp_data.sort(function(a,b){ return a[0] - b[0] })
|
62
|
+
|
63
|
+
var data = []
|
64
|
+
var keys = []
|
65
|
+
|
66
|
+
for(i in tmp_data){
|
67
|
+
var k,v1,v2
|
68
|
+
v1 = tmp_data[i][0]
|
69
|
+
v2 = tmp_data[i][1]
|
70
|
+
k = tmp_data[i][2]
|
71
|
+
|
72
|
+
keys.push(k)
|
73
|
+
data.push([v1,v2])
|
74
|
+
}
|
75
|
+
|
76
|
+
require_js('https://code.highcharts.com/highcharts.js', function(){
|
77
|
+
container.highcharts({
|
78
|
+
title: {
|
79
|
+
text: map1 + ' vs. ' + map2,
|
80
|
+
x: -20 //center
|
81
|
+
},
|
82
|
+
subtitle: {
|
83
|
+
text: 'Comparison plot',
|
84
|
+
x: -20
|
85
|
+
},
|
86
|
+
xAxis: {
|
87
|
+
title: {
|
88
|
+
text: map1 + ': ' + column
|
89
|
+
},
|
90
|
+
},
|
91
|
+
yAxis: {
|
92
|
+
title: {
|
93
|
+
text: map2 + ': ' + column2
|
94
|
+
},
|
95
|
+
},
|
96
|
+
legend: {
|
97
|
+
layout: 'vertical',
|
98
|
+
align: 'right',
|
99
|
+
verticalAlign: 'middle',
|
100
|
+
borderWidth: 0
|
101
|
+
},
|
102
|
+
series: [{
|
103
|
+
name: 'Comparison',
|
104
|
+
data: data,
|
105
|
+
labels: keys,
|
106
|
+
}]
|
107
|
+
});
|
108
|
+
|
109
|
+
modal.find('.content').append(container)
|
110
|
+
|
111
|
+
})
|
112
|
+
})
|
113
|
+
|
114
|
+
return false
|
115
|
+
})
|
116
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|