rbbt-rest 1.6.28 → 1.7.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/entity.rb +71 -1
- data/lib/rbbt/rest/entity/render.rb +3 -2
- data/lib/rbbt/rest/knowledge_base.rb +81 -28
- data/lib/rbbt/rest/main.rb +3 -0
- data/lib/rbbt/rest/workflow.rb +1 -1
- data/lib/rbbt/rest/workflow/jobs.rb +5 -4
- data/share/views/compass/app.sass +21 -11
- data/share/views/layout/footer.haml +0 -1
- data/share/views/layout/header.haml +9 -6
- data/share/views/layout/top_menu.haml +1 -0
- data/share/views/partials/table.haml +7 -1
- data/share/views/public/js/_ajax_replace.js +2 -0
- data/share/views/public/js/defer.js +1 -1
- data/share/views/public/js/helpers.js +89 -18
- data/share/views/public/js/rbbt.aesthetics.js +145 -34
- data/share/views/public/js/rbbt.basic.js +20 -0
- data/share/views/public/js/rbbt.entity.js +12 -2
- data/share/views/public/js/rbbt.entity_list.js +51 -5
- data/share/views/public/js/rbbt.exception.js +9 -1
- data/share/views/public/js/rbbt.job.js +2 -2
- data/share/views/public/js/rbbt.js +5 -1
- data/share/views/public/js/rbbt.knowledge_base.js +40 -0
- data/share/views/public/js/rbbt.modal.js +82 -75
- data/share/views/public/js/rbbt.plots.js +276 -0
- data/share/views/public/js/rbbt/list.js +2 -2
- data/share/views/public/plugins/cola/js/cola.v3.min.js +3 -0
- data/share/views/public/plugins/d3js/js/d3.js +9503 -0
- data/share/views/public/plugins/d3js/js/d3js.min.js +5 -0
- data/share/views/public/plugins/mithril-node-render/js/index.js +115 -0
- data/share/views/public/plugins/mithril/js/mithril.js +212 -77
- data/share/views/public/plugins/mithril/js/mithril.min.js +2 -2
- data/share/views/public/plugins/mithril/js/mithril.min.js.map +1 -1
- data/share/views/public/plugins/nvd3/css/nv.d3.css +641 -0
- data/share/views/public/plugins/nvd3/js/nv.d3.js +13298 -0
- data/share/views/public/plugins/svg-pan-zoom/js/svg-pan-zoom.js +1861 -0
- data/share/views/tools/nvd3.haml +16 -0
- data/share/views/tools/nvd3/chart.haml +55 -0
- data/share/views/tools/nvd3/histogram.haml +19 -0
- data/share/views/tools/nvd3/pie.haml +24 -0
- data/share/views/tools/nvd3/scatter.haml +33 -0
- data/share/views/wait.haml +2 -2
- metadata +15 -3
- data/share/views/public/plugins/d3js/d3js.min.js +0 -5
@@ -10,6 +10,7 @@
|
|
10
10
|
%form.collapse(action='/find' method="POST")
|
11
11
|
%input(type="search" name="term" placeholder='Search')
|
12
12
|
|
13
|
+
#aesthetics.item
|
13
14
|
- if defined? Sinatra::RbbtRESTWorkflow and Sinatra::RbbtRESTWorkflow::WORKFLOWS
|
14
15
|
- expoted_workflows = Sinatra::RbbtRESTWorkflow::WORKFLOWS.collect do |workflow|
|
15
16
|
- next if workflow.asynchronous_exports.empty? and workflow.synchronous_exports.empty? and workflow.exec_exports.empty?
|
@@ -49,7 +49,13 @@
|
|
49
49
|
- list_id = "#{ Misc.humanize(table_id) }: #{header[i]} for #{row.first}" if list_links and table_id and header and AnnotatedArray === value
|
50
50
|
- field = header ? header[i] : nil
|
51
51
|
- val = table_value(value, field, :list_id => list_id, :unnamed => unnamed, :entity_options => entity_options, :span => span)
|
52
|
-
|
52
|
+
- case val.to_s
|
53
|
+
- when 'true'
|
54
|
+
%td.true= val.to_s
|
55
|
+
- when 'false'
|
56
|
+
%td.false= val.to_s
|
57
|
+
- else
|
58
|
+
%td= Float === val ? "%.5g" % val : val.to_s
|
53
59
|
|
54
60
|
|
55
61
|
-#{{{ TFOOT
|
@@ -98,6 +98,8 @@ function replace_object(object, href, embedd, complete){
|
|
98
98
|
if (embedd === undefined){ embedd = false; }
|
99
99
|
var clean_href = remove_parameter(remove_parameter(href,'_'), '_update')
|
100
100
|
|
101
|
+
object.find('.mithril-mount').map(function(i,obj){ m.mount(obj, null) });
|
102
|
+
|
101
103
|
object.addClass("embedded").attr('target-href', href)
|
102
104
|
|
103
105
|
$.ajax({
|
@@ -14,6 +14,7 @@ function defer(deps, func){
|
|
14
14
|
|
15
15
|
function start_deferred(){
|
16
16
|
var tmp = $.unique(deferred_execution);
|
17
|
+
deferred_execution = [];
|
17
18
|
$(tmp).each(function(pos,func){
|
18
19
|
if (typeof(func) == 'object'){
|
19
20
|
require_js(func[0], func[1]);
|
@@ -21,7 +22,6 @@ function start_deferred(){
|
|
21
22
|
rbbt.try(func).call()
|
22
23
|
}
|
23
24
|
})
|
24
|
-
deferred_execution = [];
|
25
25
|
return(false)
|
26
26
|
}
|
27
27
|
|
@@ -96,32 +96,41 @@ function remove_from_array(array, elem){
|
|
96
96
|
});
|
97
97
|
}
|
98
98
|
|
99
|
+
function merge_hash(destination, source){
|
100
|
+
for (var property in source) {
|
101
|
+
if (source.hasOwnProperty(property)) {
|
102
|
+
destination[property] = source[property];
|
103
|
+
}
|
104
|
+
}
|
105
|
+
return destination;
|
106
|
+
}
|
107
|
+
|
99
108
|
function array_values(hash){
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
109
|
+
var tmp_arr = [], key = '';
|
110
|
+
for (key in hash) {
|
111
|
+
tmp_arr[tmp_arr.length] = hash[key];
|
112
|
+
}
|
104
113
|
|
105
|
-
|
114
|
+
return tmp_arr;
|
106
115
|
}
|
107
116
|
|
108
117
|
function clean_attr(text){
|
109
|
-
|
118
|
+
return encodeURIComponent(text)
|
110
119
|
}
|
111
120
|
|
112
121
|
function uniq(ary) {
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
122
|
+
var seen = {};
|
123
|
+
return ary.filter(function(elem) {
|
124
|
+
var k = elem;
|
125
|
+
return (seen[k] === 1) ? 0 : seen[k] = 1;
|
126
|
+
})
|
118
127
|
}
|
119
128
|
function uniqBy(ary, key) {
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
129
|
+
var seen = {};
|
130
|
+
return ary.filter(function(elem) {
|
131
|
+
var k = key(elem);
|
132
|
+
return (seen[k] === 1) ? 0 : seen[k] = 1;
|
133
|
+
})
|
125
134
|
}
|
126
135
|
|
127
136
|
|
@@ -129,8 +138,8 @@ function unique(arrayName) {
|
|
129
138
|
var newArray=new Array();
|
130
139
|
label:for(var i=0; i<arrayName.length;i++ ){
|
131
140
|
for(var j=0; j<newArray.length;j++ ){
|
132
|
-
|
133
|
-
|
141
|
+
if(newArray[j]==arrayName[i])
|
142
|
+
continue label;
|
134
143
|
}
|
135
144
|
newArray[newArray.length] = arrayName[i];
|
136
145
|
}
|
@@ -166,3 +175,65 @@ function forArray(obj, fn, thisObj){
|
|
166
175
|
}
|
167
176
|
return forArray;
|
168
177
|
}
|
178
|
+
|
179
|
+
function contains(a, obj) {
|
180
|
+
for (var i = 0; i < a.length; i++) {
|
181
|
+
if (a[i] === obj) {
|
182
|
+
return true;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
return false;
|
186
|
+
}
|
187
|
+
|
188
|
+
function return_same(obj){ return obj }
|
189
|
+
|
190
|
+
function pvalue_score(pvalue){ if (undefined === pvalue || null == pvalue || pvalue == ""){ return pvalue }; if (pvalue < 0){ return 10 * Math.log10(-pvalue)}else{ return -10 * Math.log10(pvalue) }}
|
191
|
+
|
192
|
+
function get_gradient(values, color1, color2){
|
193
|
+
var Color = net.brehaut.Color;
|
194
|
+
var color1 = Color(color1)
|
195
|
+
var color2 = Color(color2)
|
196
|
+
var steps = values.length
|
197
|
+
var clean_values = []
|
198
|
+
forArray(values,function(v){ if (typeof v == 'number' && ! isNaN(v)) clean_values.push(v) })
|
199
|
+
var max = Math.max.apply(null,clean_values)
|
200
|
+
var min = Math.min.apply(null,clean_values)
|
201
|
+
var diff = max - min
|
202
|
+
var colors = []
|
203
|
+
forArray(values, function(value){
|
204
|
+
if (typeof value == 'number'){
|
205
|
+
var a = (value - min)/diff
|
206
|
+
colors.push(color1.blend(color2, a).toString())
|
207
|
+
}else{
|
208
|
+
colors.push(undefined)
|
209
|
+
}
|
210
|
+
})
|
211
|
+
return colors
|
212
|
+
}
|
213
|
+
|
214
|
+
function get_sign_gradient(values, color1, color0, color2){
|
215
|
+
var Color = net.brehaut.Color;
|
216
|
+
var color1 = Color(color1)
|
217
|
+
var color0 = Color(color0)
|
218
|
+
var color2 = Color(color2)
|
219
|
+
var steps = values.length
|
220
|
+
var clean_values = []
|
221
|
+
forArray(values,function(v){ if (typeof v == 'number' && ! isNaN(v)) clean_values.push(v) })
|
222
|
+
var max = Math.max.apply(null,clean_values)
|
223
|
+
var min = Math.min.apply(null,clean_values)
|
224
|
+
var colors = []
|
225
|
+
forArray(values, function(value){
|
226
|
+
if (typeof value == 'number'){
|
227
|
+
if (value > 0){
|
228
|
+
var a = value/max
|
229
|
+
colors.push(color0.blend(color1, a).toString())
|
230
|
+
}else{
|
231
|
+
var a = value/min
|
232
|
+
colors.push(color0.blend(color2, a).toString())
|
233
|
+
}
|
234
|
+
}else{
|
235
|
+
colors.push(undefined)
|
236
|
+
}
|
237
|
+
})
|
238
|
+
return colors
|
239
|
+
}
|
@@ -3,54 +3,165 @@ rbbt.aesthetics = {LS_key: "rbbt.aesthetics"}
|
|
3
3
|
var aes_module = rbbt.aesthetics
|
4
4
|
|
5
5
|
aes_module.load = function(){
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
}
|
6
|
+
this.aesthetics = rbbt.LS.load(this.LS_key)
|
7
|
+
if (undefined === this.aesthetics)
|
8
|
+
this.aesthetics = []
|
9
|
+
}.bind(aes_module)
|
10
10
|
|
11
11
|
aes_module.store = function(){
|
12
12
|
rbbt.LS.store(this.LS_key, this.aesthetics)
|
13
|
-
}
|
13
|
+
}.bind(aes_module)
|
14
14
|
|
15
|
-
aes_module.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
aes_module.map_aesthetic = function(aes, mapper, map_obj){
|
16
|
+
switch(mapper){
|
17
|
+
case false:
|
18
|
+
case undefined:
|
19
|
+
case null:
|
20
|
+
case 'direct':
|
21
|
+
return aes;
|
22
|
+
case 'gradient':
|
23
|
+
return get_gradient(aes, 'green', 'red')
|
24
|
+
case 'sign-gradient':
|
25
|
+
return get_sign_gradient(aes, 'green', 'white', 'red')
|
26
|
+
case 'map':
|
27
|
+
return aes.map(function(value){ map_obj[value] })
|
23
28
|
}
|
24
29
|
}
|
25
30
|
|
26
|
-
aes_module.
|
27
|
-
var
|
31
|
+
aes_module.get_list_aesthetics = function(list, rules) {
|
32
|
+
var result = {}
|
33
|
+
var promises = []
|
34
|
+
var deferred = m.deferred()
|
35
|
+
var mappers = {}
|
28
36
|
|
29
|
-
|
30
|
-
|
37
|
+
if (undefined === rules) rules = this.aesthetics
|
38
|
+
forArray(rules, function(rule){
|
39
|
+
var aes = rule.aes
|
40
|
+
result[aes] = m.prop()
|
41
|
+
mappers[aes] = rule.mapper
|
42
|
+
|
43
|
+
var args = rule.args
|
44
|
+
var extract = rule.extract
|
45
|
+
|
46
|
+
var promise
|
47
|
+
|
48
|
+
if (rule.property){
|
49
|
+
promise = list.property(rule.property, args)
|
31
50
|
|
32
|
-
|
51
|
+
if (undefined === extract){
|
52
|
+
promises.push(promise.then(result[aes]))
|
53
|
+
}else{
|
54
|
+
promises.push(promise.then(function(v){return v.map(extract)}).then(result[aes]))
|
55
|
+
}
|
56
|
+
}
|
33
57
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
58
|
+
if (rule.workflow){
|
59
|
+
promise = rbbt.job(rule.workflow, rule.task, args,true)
|
60
|
+
if (undefined === extract){
|
61
|
+
promises.push(promise.then(result[aes]))
|
62
|
+
}else{
|
63
|
+
promises.push(m.sync([list.get(), promise]).then(function(res){
|
64
|
+
list_info = res[0]
|
65
|
+
data = res[1]
|
66
|
+
return list_info.entities.map(function(e){ return extract.call(null, data, e) })
|
67
|
+
}).then(result[aes]))
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
if (rule.knowledge_base){
|
72
|
+
if (rule.parents)
|
73
|
+
promise = rbbt.knowledge_base.list_parents([rule.parents, rule.knowledge_base].join("@"), list)
|
74
|
+
if (rule.children)
|
75
|
+
promise = rbbt.knowledge_base.list_children([rule.children, rule.knowledge_base].join("@"), list)
|
76
|
+
|
77
|
+
promise = promise.then(function(data){
|
78
|
+
var matches = {}
|
79
|
+
forHash(data, function(key, values){
|
80
|
+
var source = values[0]
|
81
|
+
var target = values[1]
|
82
|
+
if (matches[source] === undefined) matches[source] = {}
|
83
|
+
matches[source][target] = values.slice(2)
|
84
|
+
})
|
85
|
+
return matches
|
86
|
+
})
|
87
|
+
|
88
|
+
if (undefined === extract){
|
89
|
+
promises.push(m.sync([list.get(), promise]).then(function(res){
|
90
|
+
list_info = res[0]
|
91
|
+
data = res[1]
|
92
|
+
return list_info.entities.map(function(e){ return data[e] })
|
93
|
+
}).then(result[aes]))
|
94
|
+
}else{
|
95
|
+
promises.push(m.sync([list.get(), promise]).then(function(res){
|
96
|
+
list_info = res[0]
|
97
|
+
data = res[1]
|
98
|
+
return list_info.entities.map(function(e){ return extract.call(null, data, e) })
|
99
|
+
}).then(result[aes]))
|
100
|
+
}
|
101
|
+
}
|
42
102
|
})
|
43
|
-
}
|
44
103
|
|
45
|
-
|
46
|
-
|
104
|
+
var mapped_result = {}
|
105
|
+
m.sync(promises).then(function(){
|
106
|
+
forHash(result, function(aes, values){
|
107
|
+
var mapper = mappers[aes]
|
108
|
+
mapped_result[aes] = rbbt.aesthetics.map_aesthetic(values(), mapper)
|
109
|
+
})
|
110
|
+
return mapped_result
|
111
|
+
}).then(function(){ deferred.resolve(mapped_result) })
|
112
|
+
|
113
|
+
return deferred.promise
|
47
114
|
}
|
48
115
|
|
49
|
-
aes_module.
|
50
|
-
|
51
|
-
aes_module.aesthetics
|
52
|
-
|
53
|
-
aes_module.apply_aesthetic(aesthetic)
|
116
|
+
aes_module.add = function(rule){
|
117
|
+
aes_module.aesthetics.push(rule)
|
118
|
+
aes_module.aesthetics = unique(aes_module.aesthetics)
|
119
|
+
aes_module.store()
|
54
120
|
}
|
55
121
|
|
122
|
+
aes_module.apply = function(){
|
123
|
+
}
|
124
|
+
|
125
|
+
//aes_module.add = function(selector, aes, value){
|
126
|
+
// var mod = this
|
127
|
+
// if (typeof selector == 'function'){
|
128
|
+
// return selector.then(function(_selector){
|
129
|
+
// mod.aesthetics.push({selector: _selector, aes: aes, value: value})
|
130
|
+
// })
|
131
|
+
// }else{
|
132
|
+
// this.aesthetics.push({selector: selector, aes: aes, value: value})
|
133
|
+
// }
|
134
|
+
//}
|
135
|
+
//
|
136
|
+
//aes_module.clear_aesthetic = function(aes){
|
137
|
+
// var data_key = 'data-aes-' + aesthetic.aes
|
138
|
+
//
|
139
|
+
// $('[' + data_key + ']').attr(data_key, 'none')
|
140
|
+
//}
|
141
|
+
//
|
142
|
+
//aes_module.apply_aesthetic = function(aesthetic){
|
143
|
+
//
|
144
|
+
// if (typeof aesthetic.selector == "string"){
|
145
|
+
// targets = $(aesthetic.selector)
|
146
|
+
// }else{
|
147
|
+
// var items = aesthetic.selector
|
148
|
+
// if (typeof items[0] == 'object') items = $.map(items, function(i){return i.id})
|
149
|
+
// targets = $('.entity').filter(function(index){
|
150
|
+
// var id = $(this).attr('data-entity-id')
|
151
|
+
// return items.indexOf(id) >= 0
|
152
|
+
// })
|
153
|
+
// }
|
154
|
+
//
|
155
|
+
// var data_key = 'data-aes-' + aesthetic.aes
|
156
|
+
// targets.attr(data_key, aesthetic.value)
|
157
|
+
//}
|
158
|
+
//
|
159
|
+
//aes_module.apply = function(aesthetic){
|
160
|
+
// if (undefined === aesthetic)
|
161
|
+
// aes_module.aesthetics.map(aes_module.apply_aesthetic)
|
162
|
+
// else
|
163
|
+
// aes_module.apply_aesthetic(aesthetic)
|
164
|
+
//}
|
165
|
+
//
|
166
|
+
|
56
167
|
aes_module.load()
|
@@ -3,11 +3,31 @@ rbbt.mlog = function(data){
|
|
3
3
|
console.log(data)
|
4
4
|
}
|
5
5
|
|
6
|
+
// AJAX
|
7
|
+
|
6
8
|
rbbt.ajax = function(params){
|
7
9
|
params.config = function(xhr, options){ xhr.setRequestHeader( "X-Requested-With", "XMLHttpRequest"); return xhr; }
|
10
|
+
if (undefined === params.method) params.method = "GET"
|
8
11
|
return m.request(params)
|
9
12
|
}
|
10
13
|
|
14
|
+
rbbt.post = function(url, data, params){
|
15
|
+
var formData = new FormData()
|
16
|
+
|
17
|
+
if (undefined === params) params = {}
|
18
|
+
if (undefined === params.method) params.method = 'POST'
|
19
|
+
if (undefined === params.url) params.url = url
|
20
|
+
if (undefined === params.serialize) params.serialize = function(formData) {return formData}
|
21
|
+
|
22
|
+
|
23
|
+
forHash(data, function(key,value){
|
24
|
+
formData.append(key, value)
|
25
|
+
})
|
26
|
+
|
27
|
+
var request_params = {url: url, method: "POST", data: formData, serialize: function(formData){return formData} }
|
28
|
+
return rbbt.ajax(request_params)
|
29
|
+
}
|
30
|
+
|
11
31
|
rbbt.insist_request = function(params, deferred, timeout, missing){
|
12
32
|
if (undefined === deferred) deferred = m.deferred()
|
13
33
|
if (undefined === timeout) timeout = 1000
|
@@ -1,5 +1,4 @@
|
|
1
1
|
var Entity = function(data){
|
2
|
-
this.id = data.id
|
3
2
|
this.code = data.code
|
4
3
|
|
5
4
|
if (data.name !== undefined)
|
@@ -9,7 +8,11 @@ var Entity = function(data){
|
|
9
8
|
|
10
9
|
this.type = data.type
|
11
10
|
this.format = data.format
|
12
|
-
|
11
|
+
if (undefined === data.info)
|
12
|
+
this.info = {}
|
13
|
+
else
|
14
|
+
this.info = data.info
|
15
|
+
this.info = {}
|
13
16
|
if (this.format === undefined && this.info !== undefined) this.format = this.info['format']
|
14
17
|
|
15
18
|
this.full_type = function(){
|
@@ -30,6 +33,13 @@ var Entity = function(data){
|
|
30
33
|
url = add_parameters(url, this.link_info())
|
31
34
|
return url
|
32
35
|
}
|
36
|
+
|
37
|
+
this.property = function(name, args){
|
38
|
+
var url = "/entity_property/" + name + "/" + this.full_type() + "/" + this.code
|
39
|
+
url = add_parameters(url, this.link_info())
|
40
|
+
if (undefined !== args) url = add_parameter(url, "args", JSON.stringify(args))
|
41
|
+
return rbbt.insist_request({url: url})
|
42
|
+
}
|
33
43
|
}
|
34
44
|
|
35
45
|
var FavouriteEntities = function(by_type){
|
@@ -16,14 +16,60 @@ var EntityList = function(data){
|
|
16
16
|
this.get = function(){
|
17
17
|
var url = this.url()
|
18
18
|
url = add_parameter(url, '_format', 'json')
|
19
|
-
|
19
|
+
if (undefined === this.entities && ! this.loading){
|
20
|
+
list = this
|
21
|
+
this.loading = m.request({url: url, method: 'GET'}).then(this.entities).then(function(x){ list.loading = undefined; return x})
|
22
|
+
return this.loading
|
23
|
+
}else{
|
24
|
+
var deferred = m.deferred()
|
25
|
+
if (this.loading)
|
26
|
+
this.loading.then(function(x){ deferred.resolve(x)})
|
27
|
+
else
|
28
|
+
deferred.resolve(this.entities)
|
29
|
+
return deferred.promise
|
30
|
+
}
|
20
31
|
}
|
21
32
|
|
22
|
-
this.
|
23
|
-
|
24
|
-
|
25
|
-
|
33
|
+
this.get_entities = function(func){
|
34
|
+
var result = m.deferred();
|
35
|
+
|
36
|
+
this.get().then(function(list_data){
|
37
|
+
var item_values = []
|
38
|
+
forArray(list_data.entities, function(entity_code){
|
39
|
+
item_values.push(new Entity({code: entity_code, info: list_data.info}))
|
40
|
+
})
|
41
|
+
result.resolve(item_values)
|
42
|
+
})
|
43
|
+
|
44
|
+
return(result.promise)
|
45
|
+
}
|
46
|
+
|
47
|
+
this.property = function(name, args){
|
48
|
+
var url = "/entity_list_property/" + name + "/" + this.full_type() + "/" + clean_element(this.id)
|
49
|
+
if (undefined !== args)
|
50
|
+
if ('string' === typeof args)
|
51
|
+
url = add_parameter(url, "args", args)
|
52
|
+
else
|
53
|
+
url = add_parameter(url, "args", JSON.stringify(args))
|
54
|
+
return rbbt.insist_request({url: url})
|
55
|
+
}
|
56
|
+
|
57
|
+
this.children = function(knowledgebase, database){
|
58
|
+
var db_key = [database, knowledgebase].join("@")
|
59
|
+
return rbbt.knowledge_base.list_children(db_key, this)
|
26
60
|
}
|
61
|
+
|
62
|
+
this.parents = function(knowledgebase, database){
|
63
|
+
var db_key = [database, knowledgebase].join("@")
|
64
|
+
return rbbt.knowledge_base.list_parents(db_key, this)
|
65
|
+
}
|
66
|
+
|
67
|
+
this.subset = function(knowledgebase, database){
|
68
|
+
var db_key = [database, knowledgebase].join("@")
|
69
|
+
return rbbt.knowledge_base.list_subset(db_key, this)
|
70
|
+
}
|
71
|
+
|
72
|
+
|
27
73
|
}
|
28
74
|
|
29
75
|
var FavouriteLists = function(by_type){
|