rbbt-rest 1.7.19 → 1.7.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/rest/common/cache.rb +13 -1
- data/lib/rbbt/rest/common/misc.rb +4 -2
- data/lib/rbbt/rest/common/users.rb +5 -0
- data/lib/rbbt/rest/entity.rb +2 -1
- data/lib/rbbt/rest/knowledge_base.rb +5 -2
- data/lib/rbbt/rest/knowledge_base/helpers.rb +9 -0
- data/lib/rbbt/rest/main.rb +2 -0
- data/share/views/compass/app.sass +6 -0
- data/share/views/layout/header.haml +8 -4
- data/share/views/public/js/helpers/defer.js +11 -9
- data/share/views/public/js/helpers/helpers.js +23 -5
- data/share/views/public/js/rbbt.basic.js +32 -1
- data/share/views/public/js/rbbt.entity.basic.js +41 -17
- data/share/views/public/js/rbbt.knowledge_base.js +60 -9
- data/share/views/public/js/rbbt.page.js +0 -1
- data/share/views/public/js/rbbt.plots/rbbt.plots.aes.js +195 -0
- data/share/views/public/js/{rbbt.aesthetics.js → rbbt.plots/rbbt.plots.aesthetics.js} +0 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.basic.js +2 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.adapters.js +216 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.js +138 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.kb.js +72 -0
- data/share/views/public/js/{rbbt.plots.js → rbbt.plots/rbbt.plots.list.js} +1 -4
- data/share/views/public/js/rbbt/actions.js +0 -1
- data/share/views/public/plugins/js-cookie/js/js.cookie.js +145 -0
- data/share/views/public/plugins/mithril/js/mithril.js +1819 -833
- metadata +10 -5
- data/share/views/public/js/rbbt.aes_plots.js +0 -381
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a40ff490d992383fabd6576ad3b06df0c1a9e7c4
|
4
|
+
data.tar.gz: d6ea9091bd3dca0e92f0628ef84b477a6e43f344
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b813d5e2dfe4bbd36b1676a569393f7903eb8f1eb14c9392ed583991fa22cbdfea40b63f910642c5cce50610040154925aa23987855ed7c0112d15b2881754c
|
7
|
+
data.tar.gz: b70426b8a0d31ce739e551c23ca91ab6823aa2bc9b6036f31cf988b6327fd33bb15577ae6aef3c1c740288d46ba7139b53506df9cdb9eaad8ce8557c651aa03c
|
@@ -58,9 +58,21 @@ module RbbtRESTHelpers
|
|
58
58
|
clean_url = remove_GET_param(clean_url, :_update)
|
59
59
|
clean_url = remove_GET_param(clean_url, :_)
|
60
60
|
|
61
|
-
class << step
|
61
|
+
class << step
|
62
|
+
def url
|
63
|
+
@url
|
64
|
+
end
|
65
|
+
|
66
|
+
def knowledge_base(organism = Organism.default_code("Hsa"))
|
67
|
+
@_kb ||= begin
|
68
|
+
kb_dir = self.file('knowledge_base')
|
69
|
+
KnowledgeBase.new kb_dir, organism
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
62
73
|
step.instance_variable_set(:@url, clean_url)
|
63
74
|
|
75
|
+
Thread.current["step_path"] = step.path
|
64
76
|
# Issue
|
65
77
|
if not step.started?
|
66
78
|
if cache_type == :synchronous or cache_type == :sync
|
@@ -264,12 +264,14 @@ module Haml::Filters::DeferJS
|
|
264
264
|
include Haml::Filters::Base
|
265
265
|
|
266
266
|
def render(text)
|
267
|
+
step_path = Thread.current["step_path"]
|
267
268
|
defer_text =<<-EOF
|
268
269
|
%script
|
269
270
|
:plain
|
270
|
-
defer(function(){
|
271
|
+
defer(function(step_path){
|
272
|
+
|
271
273
|
#{text.gsub(/^/," ")}
|
272
|
-
})
|
274
|
+
}, '#{step_path}')
|
273
275
|
EOF
|
274
276
|
Haml::Engine.new(defer_text).to_html
|
275
277
|
end
|
data/lib/rbbt/rest/entity.rb
CHANGED
@@ -542,7 +542,8 @@ module Sinatra
|
|
542
542
|
begin
|
543
543
|
res = list.send(property,*args)
|
544
544
|
rescue
|
545
|
-
|
545
|
+
Log.exception $!
|
546
|
+
if list.respond_to?(:format) and list.base_type.respond_to?(:default_format) and list.format != list.base_type.default_format
|
546
547
|
list = list.to(:default)
|
547
548
|
Log.warn "Error computing property #{property} for list. Automatically changing list format to default"
|
548
549
|
retry
|
@@ -309,8 +309,9 @@ module Sinatra
|
|
309
309
|
source_type = kb.source_type(database)
|
310
310
|
target_type = kb.target_type(database)
|
311
311
|
fields = kb.fields(database)
|
312
|
-
source_entity_options = kb.entity_options_for source_type
|
313
|
-
target_entity_options = kb.entity_options_for target_type
|
312
|
+
source_entity_options = kb.entity_options_for source_type, database
|
313
|
+
target_entity_options = kb.entity_options_for target_type, database
|
314
|
+
undirected = kb.undirected(database) == 'undirected'
|
314
315
|
|
315
316
|
info = {
|
316
317
|
:source => source,
|
@@ -320,6 +321,7 @@ module Sinatra
|
|
320
321
|
:source_entity_options => source_entity_options,
|
321
322
|
:target_entity_options => target_entity_options,
|
322
323
|
:fields => fields,
|
324
|
+
:undirected => undirected,
|
323
325
|
}
|
324
326
|
|
325
327
|
halt 200, info.to_json
|
@@ -539,6 +541,7 @@ module Sinatra
|
|
539
541
|
content_type "application/json"
|
540
542
|
halt 200, serialize_entities(list).to_json
|
541
543
|
end
|
544
|
+
|
542
545
|
end
|
543
546
|
end
|
544
547
|
end
|
@@ -53,6 +53,10 @@ module KnowledgeBaseRESTHelpers
|
|
53
53
|
|
54
54
|
def get_knowledge_base(name=:user, namespace = nil)
|
55
55
|
kb = case name.to_s
|
56
|
+
when 'step'
|
57
|
+
dir = cookies[:step_path] + '.files/knowledge_base'
|
58
|
+
iii dir
|
59
|
+
KnowledgeBase.load(dir)
|
56
60
|
when "user"
|
57
61
|
user_kb(user)
|
58
62
|
else
|
@@ -90,4 +94,9 @@ module KnowledgeBaseRESTHelpers
|
|
90
94
|
{:id => e, :name => name, :type => e.base_type, :info => e.info}
|
91
95
|
end
|
92
96
|
end
|
97
|
+
|
98
|
+
def get_matrix(code)
|
99
|
+
name, study = code.split("@")
|
100
|
+
Study.setup(study).matrix(name)
|
101
|
+
end
|
93
102
|
end
|
data/lib/rbbt/rest/main.rb
CHANGED
@@ -7,6 +7,7 @@ require 'ruby-prof'
|
|
7
7
|
require 'sinatra/base'
|
8
8
|
require 'sinatra/cross_origin'
|
9
9
|
require "sinatra/multi_route"
|
10
|
+
require "sinatra/cookies"
|
10
11
|
require 'json'
|
11
12
|
|
12
13
|
module Sinatra
|
@@ -41,6 +42,7 @@ module Sinatra
|
|
41
42
|
|
42
43
|
helpers RbbtRESTHelpers
|
43
44
|
register Sinatra::RbbtAuth
|
45
|
+
helpers Sinatra::Cookies
|
44
46
|
|
45
47
|
add_sass_load_path Rbbt.share.views.compass.find(:lib)
|
46
48
|
|
@@ -30,9 +30,12 @@
|
|
30
30
|
requirejs.config({baseUrl: '/js-find'})
|
31
31
|
|
32
32
|
|
33
|
+
-# Cookies
|
34
|
+
- record_js '/plugins/js-cookie/js/js.cookie.js'
|
33
35
|
|
34
36
|
-# JQUERY JS
|
35
|
-
|
37
|
+
-# %w(jquery-2.1.1 jquery.cookie jquery.form).each do |jquery_file|
|
38
|
+
- %w(jquery-2.1.1 jquery.form).each do |jquery_file|
|
36
39
|
- record_js File.join('/plugins/jquery/js/', jquery_file)
|
37
40
|
|
38
41
|
- record_js '/plugins/jquery-ui/js/jquery-ui-1.8.14.custom.min.js'
|
@@ -53,8 +56,6 @@
|
|
53
56
|
- record_js '/plugins/cola/js/cola.js'
|
54
57
|
- record_js '/plugins/mithril-node-render/js/index.js'
|
55
58
|
|
56
|
-
|
57
|
-
|
58
59
|
- %w(helpers _md5 _ajax_replace _ellipsis).each do |file|
|
59
60
|
- record_js "/js-find/helpers/#{ file }"
|
60
61
|
|
@@ -65,7 +66,10 @@
|
|
65
66
|
- %w(rbbt rbbt.basic rbbt.exception rbbt.job rbbt.page rbbt.entity.basic rbbt.entity rbbt.entity_list rbbt.entity_map rbbt.views rbbt.favourites rbbt.modal).each do |file|
|
66
67
|
- record_js "/js-find/#{ file }"
|
67
68
|
|
68
|
-
- %w(rbbt.knowledge_base
|
69
|
+
- %w(rbbt.knowledge_base).each do |file|
|
69
70
|
- record_js "/js-find/#{ file }"
|
70
71
|
|
72
|
+
- %w(rbbt.plots.basic rbbt.plots.aes rbbt.plots.graph rbbt.plots.graph.kb rbbt.plots.graph.adapters rbbt.plots.aesthetics rbbt.plots.list).each do |file|
|
73
|
+
- record_js "/js-find/rbbt.plots/#{ file }"
|
74
|
+
|
71
75
|
- record_js "/js-find/app"
|
@@ -1,25 +1,27 @@
|
|
1
1
|
var deferred_execution = [];
|
2
2
|
|
3
|
-
function defer(deps, func){
|
3
|
+
function defer(deps, func, step_path){
|
4
|
+
if (typeof func == 'string'){
|
5
|
+
step_path = func
|
6
|
+
func = deps
|
7
|
+
deps = undefined;
|
8
|
+
}
|
4
9
|
if (undefined === func){
|
5
10
|
func = deps;
|
6
11
|
deps = undefined;
|
7
12
|
}
|
8
|
-
|
9
|
-
|
10
|
-
}else{
|
11
|
-
deferred_execution.push(func)
|
12
|
-
}
|
13
|
+
document.step_path = step_path
|
14
|
+
deferred_execution.push([func, deps, step_path]);
|
13
15
|
}
|
14
16
|
|
15
17
|
function start_deferred(){
|
16
18
|
var tmp = $.unique(deferred_execution);
|
17
19
|
deferred_execution = [];
|
18
20
|
$(tmp).each(function(pos,func){
|
19
|
-
if (
|
20
|
-
|
21
|
+
if (undefined === func[1]){
|
22
|
+
rbbt.try(func[0])(func[2])
|
21
23
|
}else{
|
22
|
-
|
24
|
+
require_js(func[1], func[0], func[2]);
|
23
25
|
}
|
24
26
|
})
|
25
27
|
return(false)
|
@@ -57,7 +57,7 @@ function parse_parameters(params){
|
|
57
57
|
}
|
58
58
|
|
59
59
|
var required_js = [];
|
60
|
-
function require_js(url, success){
|
60
|
+
function require_js(url, success, script){
|
61
61
|
if (typeof url == 'object'){
|
62
62
|
if (url.length > 1){
|
63
63
|
var u = url.shift()
|
@@ -82,9 +82,9 @@ function require_js(url, success){
|
|
82
82
|
url = url.replace('/js/', '/js-find/')
|
83
83
|
|
84
84
|
if ($.inArray(url, required_js) >= 0){
|
85
|
-
if (typeof success == 'function'){ success.call() }
|
85
|
+
if (typeof success == 'function'){ success.call(script) }
|
86
86
|
}else{
|
87
|
-
var _success = function(){ required_js.push(url); if (typeof success == 'function'){ success.call() }; }
|
87
|
+
var _success = function(){ required_js.push(url); if (typeof success == 'function'){ success.call(script) }; }
|
88
88
|
$.ajax({url: url, cache:cache, dataType:'script', async: async, success: _success} ).fail(function(jqxhr, settings, exception){ console.log('Failed to load ' + url) })
|
89
89
|
}
|
90
90
|
}
|
@@ -105,6 +105,16 @@ function merge_hash(destination, source){
|
|
105
105
|
return destination;
|
106
106
|
}
|
107
107
|
|
108
|
+
function clean_hash(h){
|
109
|
+
var clean = {}
|
110
|
+
|
111
|
+
forHash(h, function(k,v){
|
112
|
+
if (undefined !== v) clean[k] = v
|
113
|
+
})
|
114
|
+
|
115
|
+
return clean
|
116
|
+
}
|
117
|
+
|
108
118
|
function array_values(hash){
|
109
119
|
var tmp_arr = [], key = '';
|
110
120
|
for (key in hash) {
|
@@ -195,12 +205,16 @@ function get_gradient(values, color1, color2){
|
|
195
205
|
var color2 = Color(color2)
|
196
206
|
var steps = values.length
|
197
207
|
var clean_values = []
|
198
|
-
forArray(values,function(v){
|
208
|
+
forArray(values,function(v){
|
209
|
+
if (typeof v == 'string') v = parseFloat(v)
|
210
|
+
if (typeof v == 'number' && ! isNaN(v)) clean_values.push(v)
|
211
|
+
})
|
199
212
|
var max = Math.max.apply(null,clean_values)
|
200
213
|
var min = Math.min.apply(null,clean_values)
|
201
214
|
var diff = max - min
|
202
215
|
var colors = []
|
203
216
|
forArray(values, function(value){
|
217
|
+
if (typeof value == 'string') value = parseFloat(value)
|
204
218
|
if (typeof value == 'number'){
|
205
219
|
var a = (value - min)/diff
|
206
220
|
colors.push(color1.blend(color2, a).toString())
|
@@ -218,11 +232,15 @@ function get_sign_gradient(values, color1, color0, color2){
|
|
218
232
|
var color2 = Color(color2)
|
219
233
|
var steps = values.length
|
220
234
|
var clean_values = []
|
221
|
-
forArray(values,function(v){
|
235
|
+
forArray(values,function(v){
|
236
|
+
if (typeof v == 'string') v = parseFloat(v)
|
237
|
+
if (typeof v == 'number' && ! isNaN(v)) clean_values.push(v)
|
238
|
+
})
|
222
239
|
var max = Math.max.apply(null,clean_values)
|
223
240
|
var min = Math.min.apply(null,clean_values)
|
224
241
|
var colors = []
|
225
242
|
forArray(values, function(value){
|
243
|
+
if (typeof value == 'string') value = parseFloat(value)
|
226
244
|
if (typeof value == 'number'){
|
227
245
|
if (value > 0){
|
228
246
|
var a = value/max
|
@@ -11,7 +11,21 @@ rbbt.ajax = function(params){
|
|
11
11
|
}else{
|
12
12
|
params.config = function(xhr, options){ xhr.setRequestHeader( "X-Requested-With", "XMLHttpRequest"); return xhr; }
|
13
13
|
}
|
14
|
-
|
14
|
+
|
15
|
+
if (params.cookies){
|
16
|
+
forHash(params.cookies, function(k,v){rbbt.set_cookie(k,v)})
|
17
|
+
params.cookies_set = true
|
18
|
+
params.onreadystatechange = function(){
|
19
|
+
if (params.cookies_set){
|
20
|
+
forHash(params.cookies, function(k,v){rbbt.remove_cookie(k)})
|
21
|
+
params.cookies_set = false
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
req = m.request(params)
|
27
|
+
|
28
|
+
return req
|
15
29
|
}
|
16
30
|
|
17
31
|
rbbt.insist_request = function(params, deferred, timeout, missing){
|
@@ -54,6 +68,7 @@ rbbt.post = function(url, data, params){
|
|
54
68
|
if (undefined === params.url) params.url = url
|
55
69
|
|
56
70
|
request_params = {url: url, method: "POST", data: data, serialize: function(formData){return formData} }
|
71
|
+
forHash(params, function(k,v){request_params[k] = v})
|
57
72
|
}
|
58
73
|
|
59
74
|
if (undefined === request_params.method) request_params.method = 'POST'
|
@@ -74,6 +89,22 @@ rbbt.post = function(url, data, params){
|
|
74
89
|
return rbbt.insist_request(request_params)
|
75
90
|
}
|
76
91
|
|
92
|
+
// Cookies
|
93
|
+
|
94
|
+
rbbt.set_cookie = function(name,value){
|
95
|
+
Cookies.set(name, value)
|
96
|
+
}
|
97
|
+
|
98
|
+
rbbt.get_cookie = function(name){
|
99
|
+
if (undefined === name)
|
100
|
+
return Cookies.get()
|
101
|
+
else
|
102
|
+
return Cookies.get(name)
|
103
|
+
}
|
104
|
+
|
105
|
+
rbbt.remove_cookie = function(name){
|
106
|
+
Cookies.remove(name)
|
107
|
+
}
|
77
108
|
|
78
109
|
// LocalStorage
|
79
110
|
|
@@ -38,21 +38,37 @@ rbbt.entity_array.property = function(codes, type, info, name, args){
|
|
38
38
|
return rbbt.post(url, data)
|
39
39
|
}
|
40
40
|
|
41
|
-
rbbt.entity_array.parents = function(codes, type,
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
41
|
+
rbbt.entity_array.parents = function(codes, type, database_code){
|
42
|
+
var parts = rbbt.knowledge_base.parse_db(database_code)
|
43
|
+
var kb,database,params
|
44
|
+
kb = parts[0]; database = parts[1], cookies = parts[2]
|
45
|
+
|
46
|
+
var params = {}
|
47
|
+
|
48
|
+
params.cookies = cookies
|
49
|
+
|
50
|
+
var url = '/knowledge_base/'+kb+'/' + database + '/collection_parents'
|
51
|
+
|
52
|
+
var collection = {}
|
53
|
+
collection[type] = codes
|
54
|
+
|
55
|
+
var data = {}
|
56
|
+
data.collection = collection
|
57
|
+
data._format = 'tsv_json'
|
58
|
+
|
59
|
+
return rbbt.post(url, data,params)
|
52
60
|
}
|
53
61
|
|
54
|
-
rbbt.entity_array.children = function(codes, type,
|
55
|
-
|
62
|
+
rbbt.entity_array.children = function(codes, type, database_code){
|
63
|
+
var parts = rbbt.knowledge_base.parse_db(database_code)
|
64
|
+
var kb,database,params
|
65
|
+
kb = parts[0]; database = parts[1], cookies = parts[2]
|
66
|
+
|
67
|
+
var params = {}
|
68
|
+
|
69
|
+
params.cookies = cookies
|
70
|
+
|
71
|
+
var url = '/knowledge_base/'+kb+'/' + database + '/collection_children'
|
56
72
|
|
57
73
|
var collection = {}
|
58
74
|
collection[type] = codes
|
@@ -61,11 +77,19 @@ rbbt.entity_array.children = function(codes, type, database){
|
|
61
77
|
data.collection = collection
|
62
78
|
data._format = 'tsv_json'
|
63
79
|
|
64
|
-
return rbbt.post(url, data)
|
80
|
+
return rbbt.post(url, data,params)
|
65
81
|
}
|
66
82
|
|
67
|
-
rbbt.entity_array.subset = function(
|
68
|
-
|
83
|
+
rbbt.entity_array.subset = function(database_code, source, target){
|
84
|
+
var parts = rbbt.knowledge_base.parse_db(database_code)
|
85
|
+
var kb,database,params
|
86
|
+
kb = parts[0]; database = parts[1], cookies = parts[2]
|
87
|
+
|
88
|
+
var params = {}
|
89
|
+
|
90
|
+
params.cookies = cookies
|
91
|
+
|
92
|
+
var url = '/knowledge_base/' + kb + '/' + database + '/subset'
|
69
93
|
|
70
94
|
var data = {}
|
71
95
|
var source = source.join(",")
|
@@ -73,5 +97,5 @@ rbbt.entity_array.subset = function(database, source, target){
|
|
73
97
|
data.source = source
|
74
98
|
if (target) data.target = target.join(",")
|
75
99
|
|
76
|
-
return rbbt.post(url, data)
|
100
|
+
return rbbt.post(url, data, params)
|
77
101
|
}
|
@@ -14,21 +14,72 @@ var KB = rbbt.knowledge_base = {}
|
|
14
14
|
// return m.request({url: url, method: "GET", type: Entity})
|
15
15
|
//}
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
rbbt.step_path = function(path, func){
|
18
|
+
if (undefined === path){
|
19
|
+
if (typeof step_path == 'string')
|
20
|
+
return step_path
|
21
|
+
if (rbbt._step_path)
|
22
|
+
return rbbt._step_path
|
23
|
+
else{
|
24
|
+
if (document.step_path)
|
25
|
+
return document.step_path
|
26
|
+
else
|
27
|
+
return undefined
|
28
|
+
}
|
29
|
+
}else{
|
30
|
+
old = rbbt._step_path
|
31
|
+
rbbt._step_path = path
|
32
|
+
}
|
33
|
+
|
34
|
+
if (undefined === func)
|
35
|
+
return
|
36
|
+
else{
|
37
|
+
func()
|
38
|
+
rbbt._step_path = old
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
KB.parse_db = function(database_code){
|
43
|
+
var kb = 'user'
|
44
|
+
var database
|
45
|
+
|
46
|
+
if (database_code.indexOf(':') > 0){
|
47
|
+
var parts = database_code.split(":")
|
48
|
+
kb = parts[0]
|
49
|
+
database = parts[1]
|
50
|
+
}else{
|
51
|
+
database = database_code
|
52
|
+
}
|
53
|
+
|
54
|
+
if (kb == 'step'){
|
55
|
+
var path
|
56
|
+
if (typeof step_path != 'undefined') path = step_path
|
57
|
+
if (undefined === path) path = rbbt.step_path()
|
58
|
+
cookies = {step_path: path}
|
59
|
+
}else
|
60
|
+
cookies = undefined
|
61
|
+
|
62
|
+
return [kb, database, cookies]
|
63
|
+
}
|
64
|
+
|
65
|
+
KB.database_info = function(database_code){
|
66
|
+
var parts = rbbt.knowledge_base.parse_db(database_code)
|
67
|
+
var kb,database,params
|
68
|
+
kb = parts[0]; database = parts[1], cookies = parts[2]
|
69
|
+
|
70
|
+
var url = '/knowledge_base/' + kb + '/' + database + '/info'
|
71
|
+
|
72
|
+
url = add_parameter(url, '_format', 'json')
|
73
|
+
|
74
|
+
params = {url: url, method: "GET", cookies: cookies}
|
75
|
+
|
76
|
+
return rbbt.insist_request(params)
|
21
77
|
}
|
22
78
|
|
23
79
|
KB.list_parents = function(database, list){
|
24
80
|
return list.get().then(function(list_info){
|
25
81
|
var url = '/knowledge_base/user/' + database + '/collection_parents'
|
26
82
|
|
27
|
-
//url = add_parameter(url, 'collection', JSON.stringify(collection))
|
28
|
-
//return m.request({url: url, method: "POST", data:{collection:collection}})
|
29
|
-
//url = add_parameter(url, '_format', 'tsv_json')
|
30
|
-
//return rbbt.post(url, {collection: collection})
|
31
|
-
|
32
83
|
var collection = {}
|
33
84
|
collection[list.type] = list_info.entities
|
34
85
|
|