rbbt-rest 1.6.2 → 1.6.3

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/rest/common/misc.rb +10 -0
  3. data/lib/rbbt/rest/workflow/jobs.rb +8 -7
  4. data/share/views/compass/app.sass +278 -3
  5. data/share/views/compass/base/color.sass +66 -0
  6. data/share/views/compass/blocks.sass +0 -0
  7. data/share/views/compass/mixins/_blocks.sass +76 -80
  8. data/share/views/compass/mixins/_compass.sass +0 -0
  9. data/share/views/compass/mixins/_hide.sass +76 -1
  10. data/share/views/compass/table.sass +142 -0
  11. data/share/views/compass/variables/colors.sass +7 -0
  12. data/share/views/compass/variables/sizes.sass +5 -0
  13. data/share/views/entity_partials/action_card.haml +5 -5
  14. data/share/views/entity_partials/action_controller.haml +31 -33
  15. data/share/views/entity_partials/entity_card.haml +28 -27
  16. data/share/views/entity_partials/entity_list_card.haml +30 -42
  17. data/share/views/entity_partials/entity_map_card.haml +35 -43
  18. data/share/views/entity_partials/list_container.haml +6 -6
  19. data/share/views/layout.haml +53 -59
  20. data/share/views/layout/coda.haml +1 -0
  21. data/share/views/layout/doctype.haml +8 -0
  22. data/share/views/layout/footer.haml +36 -10
  23. data/share/views/layout/header.haml +47 -0
  24. data/share/views/layout/top_menu.haml +27 -13
  25. data/share/views/partials/form.haml +4 -4
  26. data/share/views/partials/table.haml +2 -1
  27. data/share/views/partials/table/column.haml +8 -9
  28. data/share/views/partials/table/files.haml +2 -2
  29. data/share/views/partials/table/filters.haml +16 -16
  30. data/share/views/partials/table/page.haml +9 -15
  31. data/share/views/public/js/ng-favourites.js +13 -0
  32. data/share/views/public/js/rbbt.aesthetics.js +51 -0
  33. data/share/views/public/js/rbbt.entity.js +62 -0
  34. data/share/views/public/js/rbbt.entity_list.js +54 -0
  35. data/share/views/public/js/rbbt.entity_map.js +52 -0
  36. data/share/views/public/js/rbbt.favourites.js +286 -0
  37. data/share/views/public/js/rbbt.favourites.js.old +195 -0
  38. data/share/views/public/js/rbbt.js +40 -0
  39. data/share/views/public/js/rbbt.knowledge_base.js +24 -0
  40. data/share/views/public/js/rbbt.page.js +32 -0
  41. data/share/views/public/js/rbbt/actions.js +15 -14
  42. data/share/views/public/js/rbbt/table.js +6 -4
  43. data/share/views/tools/cytoscape.haml +310 -0
  44. data/share/views/tools/protein_tool.haml +383 -0
  45. data/share/views/tools/protein_tool/controls.haml +315 -0
  46. metadata +23 -2
@@ -0,0 +1,195 @@
1
+
2
+
3
+ rbbt.favourites = {};
4
+
5
+ var fav_module = rbbt.favourites;
6
+
7
+ fav_module.update_favourite_entities = function(){
8
+ return m.request({method: 'GET', url: '/favourite_entities'}).then(function(data){
9
+ fav_module.favourite_entities = {}
10
+ for (type in data){
11
+ var type_data = data[type]
12
+ fav_module.favourite_entities[type] = {}
13
+ for (entity in type_data){
14
+ var info = type_data[entity]
15
+ info.id = entity
16
+ info.type = type
17
+ fav_module.favourite_entities[type][entity] = new Entity(info)
18
+ }
19
+ }
20
+ return data
21
+ })
22
+ }
23
+
24
+ fav_module.update_favourite_lists = function(){
25
+ return m.request({method: 'GET', url: '/favourite_entity_lists'}).then(function(data){
26
+ fav_module.favourite_lists = {}
27
+ for (type in data){
28
+ var type_data = data[type]
29
+ fav_module.favourite_lists[type] = {}
30
+ for (i in type_data){
31
+ var list = type_data[i]
32
+ info = {}
33
+ info.id = list
34
+ info.type = type
35
+ fav_module.favourite_lists[type][list] = new EntityList(info)
36
+ }
37
+ }
38
+ return data
39
+ }) //.then(fav_module.update_list_selects)
40
+ }
41
+
42
+ fav_module.update_favourites = function(){
43
+ return fav_module.update_favourite_entities().then(fav_module.update_favourite_lists)
44
+ }
45
+
46
+ fav_module.isFavourite_entity = function(entity){
47
+ var favourites = fav_module.favourite_entities
48
+ return favourites[entity.type] !== undefined && favourites[entity.type][entity.id] !== undefined
49
+ }
50
+
51
+ fav_module.isFavourite_list = function(list){
52
+ var favourites = fav_module.favourite_lists
53
+ return favourites[list.type] !== undefined && favourites[list.type][list.id] !== undefined
54
+ }
55
+
56
+ fav_module.toggleFavourite_entity = function(){
57
+ var entity = rbbt.page.entity();
58
+
59
+ if (fav_module.isFavourite_entity(entity)){
60
+ rbbt.post({url: '/remove_favourite_entity/' + entity.type + '/' + entity.id}).then(fav_module.update)
61
+ }else{
62
+ rbbt.post({url: '/add_favourite_entity/' + entity.type + '/' + entity.id, data: entity.info}).then(fav_module.update)
63
+ }
64
+ }
65
+
66
+ fav_module.toggleFavourite_list = function(){
67
+ var list = rbbt.page.list();
68
+
69
+ if (fav_module.isFavourite_list(list)){
70
+ rbbt.post({url: '/remove_favourite_entity_list/' + list.type + '/' + list.id}).then(fav_module.update)
71
+ }else{
72
+ rbbt.post({url: '/add_favourite_entity_list/' + list.type + '/' + list.id}).then(fav_module.update)
73
+ }
74
+ }
75
+
76
+ fav_module.toggleFavourite = function(){
77
+ if (! rbbt.page.entity())
78
+ if (! rbbt.page.list())
79
+ return
80
+ else
81
+ fav_module.toggleFavourite_list()
82
+ else
83
+ fav_module.toggleFavourite_entity()
84
+ }
85
+
86
+ //{{{ VIEWS
87
+
88
+ fav_module.star_view = function(){
89
+ if (! rbbt.page.entity())
90
+ if (! rbbt.page.list())
91
+ return
92
+ else
93
+ return m('i.icon.star', {class: (fav_module.isFavourite_list(rbbt.page.list()) ? 'favourite' : 'not_favourite')})
94
+ else
95
+ return m('i.icon.star', {class: (fav_module.isFavourite_entity(rbbt.page.entity()) ? 'favourite' : 'not_favourite')})
96
+ }
97
+
98
+ fav_module.draw_favourite_menu = function(){
99
+ var favourites = fav_module.favourite_entities
100
+ var types = Object.keys(favourites)
101
+
102
+ return m('.ui.menu',
103
+ m('.ui.dropdown.item', [
104
+ m('i.icon.dropdown'),
105
+ 'Entities',
106
+ m('.menu', types.map(function(type, index){
107
+ var _type = favourites[type]
108
+ var entities = Object.keys(_type)
109
+
110
+ return m('.ui.dropdown.item', [
111
+ m('i.icon.dropdown'),
112
+ type,
113
+ m('.menu', entities.map(function(entity, index){ url = _type[entity].url(); return m('a.item', {href: url}, _type[entity].name) }))
114
+ ]);
115
+ }))
116
+ ])
117
+ )
118
+ }
119
+
120
+ fav_module.draw_favourite_list_menu = function(){
121
+ var favourites = fav_module.favourite_lists
122
+ var types = Object.keys(favourites)
123
+
124
+ return m('.ui.menu',
125
+ m('.ui.dropdown.item', [
126
+ m('i.icon.dropdown'),
127
+ 'Lists',
128
+ m('.menu', types.map(function(type, index){
129
+ var _type = favourites[type]
130
+ var lists = Object.keys(_type)
131
+
132
+ return m('.ui.dropdown.item', [
133
+ m('i.icon.dropdown'),
134
+ type,
135
+ m('.menu', lists.map(function(lists, index){ url = _type[lists].url(); return m('a.item', {href: url}, _type[lists].name) }))
136
+ ]);
137
+ }))
138
+ ])
139
+ )
140
+ }
141
+ fav_module.view = function(){
142
+ m.render($('#top_menu > .favourite')[0], [
143
+ m('.item.pointer', {onclick: fav_module.toggleFavourite}, fav_module.star_view()),
144
+ m('.item', {style: 'padding: 0px'}, fav_module.draw_favourite_menu()),
145
+ m('.item', {style: 'padding: 0px'}, fav_module.draw_favourite_list_menu())
146
+ ])
147
+ }
148
+
149
+ fav_module.update = function(){
150
+ fav_module.update_favourites().then(fav_module.view).then(function(){ $('.dropdown:not([tabindex])').dropdown()})
151
+ }
152
+
153
+
154
+ fav_module._update_list_select= function(select, type, lists){
155
+ if (select.attr('attr-allow-empty') == 'true'){
156
+ var option = $('<option value="none" class="loaded">none</option>')
157
+ select.append(option);
158
+ }
159
+
160
+ var selected = null;
161
+
162
+ if (select.attr('attr-selected') != undefined ){
163
+ selected = select.attr('attr-selected');
164
+ }
165
+
166
+ $.each(lists, function(name, elems){
167
+ var option = null;
168
+ var name = elems
169
+ if (selected == null || name != selected){
170
+ option = $('<option attr-entity_type="' + type + '" class="automatic_load" value="' + name.id + '">' + name.id + '</option>');
171
+ }else{
172
+ option = $('<option attr-entity_type="' + type + '" class="automatic_load" selected=selected value="' + name.id + '">' + name.id + '</option>');
173
+ }
174
+ select.append(option);
175
+ return true
176
+ })
177
+ },
178
+
179
+ fav_module.update_list_selects= function(){
180
+ $('select.favourite_lists').find('option.automatic_load').remove()
181
+
182
+ $.each(fav_module.favourite_lists, function(type, lists){
183
+ $('select.favourite_lists[type=' + type + ']').each(function(){
184
+ var select = $(this);
185
+ fav_module._update_list_select(select, type, lists);
186
+ })
187
+ $('select.favourite_lists[type=All]').each(function(){
188
+ var select = $(this);
189
+ select.append($('<option class="automatic_load ui" disabled>'+ type +'</option>'));
190
+ fav_module._update_list_select(select, type, lists);
191
+ })
192
+ });
193
+ }
194
+
195
+ fav_module.update()
@@ -0,0 +1,40 @@
1
+
2
+ rbbt.post = function(params){
3
+ var req_params = {config: rbbt.post.asFormUrlEncoded, serialize: rbbt.post.serialize_data, method: 'POST'}
4
+ for (key in params)
5
+ req_params[key] = params[key]
6
+
7
+ return m.request(req_params)
8
+ }
9
+
10
+ rbbt.post.serialize_data = function(obj) {
11
+ var str = [];
12
+ for(var p in obj)
13
+ if (obj.hasOwnProperty(p)) {
14
+ str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
15
+ }
16
+
17
+ return str.join("&");
18
+ }
19
+
20
+ rbbt.post.asFormUrlEncoded = function(xhr){
21
+ xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
22
+ }
23
+
24
+ rbbt.log = function(obj){
25
+ console.log(obj)
26
+ }
27
+
28
+ rbbt.LS = {}
29
+
30
+ rbbt.LS.load = function(key){
31
+ var content = localStorage[key]
32
+ if (content === undefined)
33
+ return undefined
34
+ else
35
+ return JSON.parse(content)
36
+ }
37
+
38
+ rbbt.LS.store = function(key, value){
39
+ localStorage[key] = JSON.stringify(value)
40
+ }
@@ -0,0 +1,24 @@
1
+
2
+ var KB = rbbt.knowledge_base = {}
3
+
4
+ KB.children = function(database, entity){
5
+ var url = '/kb/user/' + database + '/children/' + entity.id
6
+ url = add_parameter(url, '_format', 'json')
7
+ return m.request({url: url, method: "GET", type: Entity})
8
+ }
9
+
10
+ KB.parents = function(database, entity){
11
+ var url = '/kb/user/' + database + '/parents/' + entity.id
12
+ url = add_parameter(url, '_format', 'json')
13
+ return m.request({url: url, method: "GET", type: Entity})
14
+ }
15
+
16
+ Entity.prototype.children = function(database){
17
+ return KB.children(database, this)
18
+ }
19
+
20
+ Entity.prototype.parents = function(database){
21
+ return KB.parents(database, this)
22
+ }
23
+
24
+
@@ -0,0 +1,32 @@
1
+
2
+ rbbt.page = {};
3
+ rbbt.page.entity = function(){
4
+ var card = $('.entity_card')
5
+ if (card.length == 0) return false
6
+
7
+ var entity = card.attr('data-entity')
8
+ var type = card.attr('data-entity-type')
9
+ var format = card.attr('data-entity-format')
10
+ var info = card.attr('data-entity-info')
11
+ var id = card.attr('data-entity-id')
12
+ return new Entity({id: id, code: entity, type: type, format: format, info: JSON.parse(info)})
13
+ }
14
+
15
+ rbbt.page.list = function(){
16
+ var card = $('.entity_list_card')
17
+ if (card.length == 0) return false
18
+
19
+ var list = card.attr('data-list')
20
+ var type = card.attr('data-list-type')
21
+ return new EntityList({id: list, type: type})
22
+ }
23
+
24
+ rbbt.page.map = function(){
25
+ var card = $('.entity_map_card')
26
+ if (card.length == 0) return false
27
+
28
+ var map = card.attr('data-map')
29
+ var type = card.attr('data-type')
30
+ var column = card.attr('data-column')
31
+ return new EntityMap({id: map, type: type, column: column})
32
+ }
@@ -71,7 +71,7 @@ $.widget("rbbt.action_controller", {
71
71
  var tool = this
72
72
  var controller = tool.element;
73
73
 
74
- controller.on('click', '> .actions .button', function(e){ tool._activate_action(this); return false});
74
+ controller.on('click', '> .action_menu .button', function(e){ tool._activate_action(this); return false});
75
75
  controller.on('click', '> .controls > .reload', function(e){ tool._reload_action(this); return false});
76
76
  controller.on('click', '> .controls > .parameters', function(e){ tool._display_parameters(this); return false});
77
77
  controller.on('click', '> .controls > .description', function(e){ tool._display_description(this); return false});
@@ -84,11 +84,11 @@ $.widget("rbbt.action_controller", {
84
84
 
85
85
  this.options.controller = controller
86
86
  this.options.action_controls = controller.find('> .controls')
87
- this.options.action_list = controller.find('> .actions')
87
+ this.options.action_list = controller.find('> .action_menu')
88
88
 
89
89
  this.options.complete = function(jqXHR, textStatus){
90
90
  var action_controller = tool.options.controller
91
- var action_list_item = action_controller.find('.actions > .loading, .actions > .active')
91
+ var action_list_item = action_controller.find('.action_menu > .loading, .action_menu > .active')
92
92
  var action_div = action_controller.next('.action_loader');
93
93
 
94
94
  if (jqXHR.status == 202){
@@ -98,14 +98,14 @@ $.widget("rbbt.action_controller", {
98
98
  var response = $(jqXHR.responseText)
99
99
  var stat = response.find('span.status').html()
100
100
  var message = response.find('.step_messages li:first').html()
101
+ var progress = response.find('.step.progress')
101
102
 
102
- if (undefined === message){
103
- action_div.html("<span class='loading ui message'>Loading [" + stat + "] ...</span>");
104
- }else{
105
- action_div.html("<span class='loading ui message'>Loading [" + stat + ": " + message + "] ...</span>");
106
- };
103
+ text = [$('<div class="header">').html(stat), $('<div class="content">').html(message)]
104
+ action_controller.find('> .progress').html("").append(text).append(progress);
105
+ update_rbbt()
107
106
  }
108
107
  }else{
108
+ action_controller.find('> .progress').html("");
109
109
  action_controller.removeClass('loading').removeClass('disabled');
110
110
  action_list_item.removeClass('loading').removeClass('disabled');
111
111
 
@@ -142,7 +142,7 @@ $.widget("rbbt.action_controller", {
142
142
 
143
143
  _activate_action: function(e){
144
144
  var action_list_item = $(e)
145
- var action_list = action_list_item.parent('.actions');
145
+ var action_list = action_list_item.parent('.action_menu');
146
146
  var link = action_list_item.find('> a')
147
147
  link = action_list_item
148
148
 
@@ -165,14 +165,14 @@ $.widget("rbbt.action_controller", {
165
165
 
166
166
  _unpin_parameters: function(){
167
167
  var controller = $(this.element)
168
- var action = controller.find('.actions .active a').first().html()
168
+ var action = controller.find('.action_menu .active a').first().html()
169
169
  this.options.saved[action] = undefined
170
170
  controller.find('> .controls > .pin').removeClass('saved')
171
171
  },
172
172
 
173
173
  _pin_parameters: function(){
174
174
  var controller = $(this.element)
175
- var action = $(this.element).find('.actions .active a').first().html()
175
+ var action = $(this.element).find('.action_menu .active a').first().html()
176
176
  var loader = $(this.element).next('.action_loader').first();
177
177
  this.options.saved[action] = loader.attr('form-params')
178
178
  controller.find('> .controls > .pin').addClass('saved')
@@ -180,7 +180,7 @@ $.widget("rbbt.action_controller", {
180
180
  },
181
181
 
182
182
  _toggle_pin: function(){
183
- var action = $(this.element).find('.actions .active a').first().html()
183
+ var action = $(this.element).find('.action_menu .active a').first().html()
184
184
 
185
185
  if (this.options.saved[action] != undefined){
186
186
  this._unpin_parameters();
@@ -212,7 +212,8 @@ $.widget("rbbt.action_controller", {
212
212
 
213
213
 
214
214
  _reload_action: function(e){
215
- if(! $(e).hasClass('active')){ return false}
215
+ if($(e).hasClass('disabled')){ return false}
216
+ console.log(1)
216
217
  var action_list_item = $(e);
217
218
  var action_list = action_list_item.parent('.controls');
218
219
  var action_controller = action_list.parent('.action_controller');
@@ -264,7 +265,7 @@ $.widget("rbbt.action_controller", {
264
265
  _load_action: function(link){
265
266
  var action_list_item = link.parent('.button');
266
267
  action_list_item = link
267
- var action_list = action_list_item.parent('.menu');
268
+ var action_list = action_list_item.parent('.action_menu');
268
269
  var action_controller = action_list.parents('.action_controller').first();
269
270
  var action_div = action_controller.next('.action_loader');
270
271
  var href = link.attr('href')
@@ -59,6 +59,7 @@ $.widget("rbbt.table", {
59
59
  $.scrollTo(table.find('tfoot'), {axis : 'y', offset: {top: - window.innerHeight + 100 }});
60
60
  }else{ complete() }
61
61
  if (tool.options.ellipsis !== undefined && ! $(table).hasClass('no_js')){
62
+ console.log($(table).hasClass('no_js'))
62
63
  tool._fix_long_table_cells(5);
63
64
  }
64
65
  });
@@ -98,7 +99,7 @@ $.widget("rbbt.table", {
98
99
 
99
100
  //{{{ Pagination
100
101
  //
101
- table.on('click', 'tfoot > tr > th > .table_pagination > .num > a:not(.active)', function(link){
102
+ table.on('click', 'tfoot > tr > th > .table_pagination > .num:not(.active)', function(link){
102
103
  var link = $(this)
103
104
 
104
105
  var stat = tool._status()
@@ -108,7 +109,7 @@ $.widget("rbbt.table", {
108
109
  return false
109
110
  })
110
111
 
111
- table.on('click', 'tfoot > tr > th > .table_pagination > .arrow > a.prev', function(link){
112
+ table.on('click', 'tfoot > tr > th > .table_pagination > .arrow.prev', function(link){
112
113
  var stat = tool._status()
113
114
 
114
115
  if (stat.num > 1){ stat.num = stat.num - 1 }
@@ -118,9 +119,9 @@ $.widget("rbbt.table", {
118
119
  return false
119
120
  })
120
121
 
121
- table.on('click', 'tfoot > tr > th > .table_pagination > .arrow > a.next', function(evt){
122
+ table.on('click', 'tfoot > tr > th > .table_pagination > .arrow.next', function(evt){
122
123
  var stat = tool._status();
123
- var last = parseInt($(this).parents('.table_pagination').first().find('.num').last().find('a').html())
124
+ var last = parseInt($(this).parents('.table_pagination').first().find('a.num').last().html())
124
125
 
125
126
  if (stat.num < last){ stat.num = stat.num + 1 }
126
127
 
@@ -275,6 +276,7 @@ $.widget("rbbt.table", {
275
276
  url = add_parameter(url, '_format', 'map')
276
277
  if (undefined != filter){ url = add_parameter(url, '_filter', escape(filter)) }
277
278
 
279
+ console.log(url)
278
280
  modal.modal('show_url', url)
279
281
  return false
280
282
  });
@@ -0,0 +1,310 @@
1
+ - id = "rand" << (rand * 1000).to_i.to_s unless defined? id and not (id.nil? or id.empty?)
2
+ - id = Misc.snake_case(id)
3
+ - static = false unless defined? static and not static.nil?
4
+ - knowledge_base = nil unless defined? knowledge_base and not knowledge_base.nil?
5
+ - kb_name = 'user' unless defined? kb_name and not kb_name.nil?
6
+
7
+ = link_css '/stylesheets/cytoscape'
8
+
9
+ - syndications = {}
10
+ - databases = []
11
+ - cytoscape.knowledge_base.all_databases.each do |database|
12
+ - database = database.to_s
13
+ - name, synd = database.split("@")
14
+ - if synd
15
+ - syndications[synd] ||= []
16
+ - syndications[synd] << database
17
+ - else
18
+ - databases << database
19
+
20
+ :sass
21
+ .tab.content
22
+ position: relative
23
+ .cytoscape_tool.fixable.preload(id=id)
24
+
25
+ .controls.ui.top.attached.tabular.menu
26
+ .ui.item(data-tab='Close')
27
+ %i.icon.close
28
+ .ui.item(data-tab='Edges') Edges
29
+ .ui.item(data-tab='Entities') Entities
30
+ .ui.item(data-tab='Aesthetics') Aesthetics
31
+ .ui.item(data-tab='Help') Help
32
+ .ui.tab.bottom.attached.very.basic.segment.content(data-tab='Close')
33
+ .ui.tab.bottom.attached.segment.content(data-tab='Edges')
34
+ .database_edges
35
+
36
+ %h5 Add edges between entities
37
+ .action_parameters
38
+ %form.action_parameter_form
39
+ - if databases.any?
40
+ .input.multiple.database
41
+ - databases.each do |database|
42
+ - name, *rest = database.split "@"
43
+ %span.cchoice
44
+ %label(for="database[#{database}]")=name
45
+ %input(id="database[#{database}]" type="checkbox" value="true" name="database[#{database}]")
46
+ - if syndications.any?
47
+ %dl.rbbt_tabs.subtle(style="margin:1em")
48
+ - syndications.each do |synd, databases|
49
+ %dt.next=synd
50
+ %dd
51
+ .input.database.multiple
52
+ - databases.each do |database|
53
+ - name, *rest = database.split "@"
54
+ %span.choice
55
+ %label(for="database[#{database}]")=name
56
+ %input(id="database[#{database}]" type="checkbox" value="true" name="database[#{database}]")
57
+
58
+ .input.submit
59
+ %input(type="submit")
60
+
61
+ .ui.tab.bottom.attached.segment.content(data-tab='Entities')
62
+ .add_gene_list
63
+ %h5 Add entities from a list
64
+ = action_parameters nil, {:klass => ''}, :action => '#' do
65
+ - input :entities, :select, "Entities to add", nil, :html_options => {:class => 'favourite_lists', :type => 'All'}
66
+
67
+ .database_neighbours
68
+ %h5 Add neighbours of entities
69
+ .action_parameters.ui.raised.segment
70
+ %form.ui.form
71
+ .field.input.select.database
72
+ %label knowledgebase
73
+ %select(type="All" name="database")
74
+ - databases.each do |database|
75
+ - name, *rest = database.split "@"
76
+ %option(value=database)=name
77
+ - syndications.each do |synd, databases|
78
+ %option(disabled=true)=synd
79
+ - databases.each do |database|
80
+ - name, *rest = database.split "@"
81
+ %option(value=database)=name
82
+ .field.submit
83
+ %input.ui.submit.button(type="submit")
84
+
85
+ .ui.tab.bottom.attached.segment.content(data-tab='Aesthetics')
86
+ .maps
87
+ %h5 Map entity aesthetic
88
+ = action_parameters nil, {:klass => ''}, :action => '#' do
89
+ - input :elem, :select, "Type of element", :nodes, :select_options => [:nodes, :edges]
90
+ - input :aesthetic, :select, "Aesthetic to map to", :opacity, :select_options => [:shape, :size, :color, :opacity, :borderWidth]
91
+ - input :field, :string, "Attribute to map", 'id', :select_options => {:textarea => "Use textarea"}, :html_options => {:class => 'favourite_maps', :type => 'All'}
92
+ - input :map, :select, "Select map to use", nil, :select_options => {:textarea => "Use textarea"}, :html_options => {:class => 'favourite_maps', :type => 'All'}
93
+ - input :map_tsv, :text, "Map", nil, :no_file => true
94
+
95
+ .select_gene_list
96
+ %h5 Highlight entities from a list
97
+ = action_parameters nil, {:klass => ''}, :action => '#' do
98
+ - input :entities, :select, "Genes to add", nil, :html_options => {:class => 'favourite_lists', :type => 'All'}
99
+
100
+ .ui.tab.bottom.attached.segment.content(data-tab='Help')
101
+
102
+ :documentation
103
+
104
+ ### Edges
105
+
106
+ You can connect your nodes using any of the databases in the `knowledgebase`.
107
+ This is configured in the `Edges` menu: check the databases you want to use,
108
+ if none is selected (by default) all of them are used.
109
+
110
+ ### Entities
111
+
112
+ The network comes preloaded with a list of entities (nodes), but you
113
+ can remove them or add new ones. To remove them use the context menu
114
+ (right-click over cytoscape window); you can remove one node, or the
115
+ selected list of nodes.
116
+
117
+ Adding nodes can be done using the `Entity` menu. You can add entities from
118
+ your `favourite` lists or add the neighbours of your entities using any of
119
+ the databases in the `knowledgebase`.
120
+
121
+ ### Aesthetics
122
+
123
+ Use the `Aesthetics` menu to change how your network looks. This can
124
+ help represent different sources of information. For now it works only
125
+ on nodes. You can change the value of different aesthetics, like
126
+ color, border width, size, shape, and opacity. You can `map` these
127
+ aesthetics to favourite `Entity Maps`, or use a custom mapping
128
+ in-place, as a space-separated TSV file (see example below). The
129
+ mappings can consider the identity of the node (type `id` in `field`;
130
+ default) or the type of node (type `entity_type` in `field`). For
131
+ instance:
132
+
133
+ aesthetic: color
134
+ field: entity_type
135
+ map: use_textarea
136
+ map_tsv:
137
+ GOTerm red
138
+ KeggPathway blue
139
+ Gene yellow
140
+
141
+ Another example use is to gather the `mutation/protein size` column on
142
+ the `COSMIC Overview` analysis bellow, and map it to the `opacity`
143
+ aesthetic of the genes (using the `id` as `field`).
144
+
145
+ .window.fixed_size(id="#{id}_window")
146
+
147
+
148
+ :deferjs
149
+ var cytoscape_id = '##{id}';
150
+
151
+ require_js(['/js/cytoscape/js/src/AC_OETags.js', '/js/cytoscape/js/src/cytoscapeweb.js', '/js/cytoscape'], function(){
152
+
153
+ $('.preload').removeClass('preload')
154
+
155
+ var tool = $(cytoscape_id).cytoscape_tool({
156
+ knowledge_base: '#{kb_name}',
157
+ namespace: '#{cytoscape.namespace}',
158
+ entities: #{cytoscape.entities.to_json},
159
+ network: #{cytoscape.network.to_json},
160
+ aesthetics: #{cytoscape.aesthetics.to_json},
161
+
162
+ node_click: function(event){
163
+ var target = event.target;
164
+
165
+ for (var i in target.data){
166
+ var variable_name = i;
167
+ var variable_value = target.data[i];
168
+ }
169
+
170
+ for (var i in target.data) {
171
+ var variable_name = i;
172
+ var variable_value = target.data[i];
173
+ }
174
+
175
+ var url = target.data.url;
176
+
177
+ $('#modal').modal('show_url', url, undefined, function(){
178
+ $('#modal').find(' > .header > .title').attr('entity', target.data.id).attr('type', target.data.entity_type)
179
+ })
180
+ return(false)
181
+ },
182
+
183
+ edge_click: function(event){
184
+ var target = event.target;
185
+ for (var i in target.data){
186
+ var variable_name = i;
187
+ var variable_value = target.data[i];
188
+ }
189
+
190
+ var pair = [target.data.source, target.data.target].join("~")
191
+ tool.cytoscape_tool('show_info', "user", target.data.database, pair);
192
+
193
+ return(false)
194
+ }
195
+
196
+ });
197
+
198
+ require_js('/js/controls/context_menu', function(){
199
+ cytoscape_context_menu(tool)
200
+ })
201
+
202
+ require_js('/js/controls/placement', function(){
203
+ cytoscape_placement(tool)
204
+ })
205
+
206
+ require_js('/js/controls/save', function(){
207
+ cytoscape_save(tool)
208
+ })
209
+
210
+
211
+ ///////////////////////////////////
212
+ //{{{ NETWORK INIT
213
+
214
+ tool.cytoscape_tool('draw');
215
+
216
+ //////////////////////////////////////////////////////////////////
217
+ //{{{ Controls
218
+
219
+ $('.cytoscape_tool .database_edges input[type=submit]').click(function(){
220
+ var form =$(this).parents('form').first()
221
+ var inputs = form.find('.input.database.multiple')
222
+ var databases = $.map(inputs.find('input[type=checkbox]:checked'), function(e){
223
+ return $(e).attr('name').match(/\[(.*)\]/)[1];
224
+ })
225
+
226
+ tool.cytoscape_tool('set_edges', databases)
227
+ tool.cytoscape_tool('draw');
228
+
229
+ return false;
230
+ })
231
+
232
+ $('.cytoscape_tool .database_neighbours input[type=submit]').click(function(){
233
+ var databases = $.map($(this).parents('form').first().find('.input.database').find('input[type=checkbox]:checked'), function(e){
234
+ return $(e).attr('name').match(/\[(.*)\]/)[1];
235
+ })
236
+ var option = $(this).closest('form').find('select').find('option:selected');
237
+ var database = option.attr('value')
238
+
239
+ tool.cytoscape_tool('add_neighbours', database)
240
+ tool.cytoscape_tool('draw');
241
+
242
+ return false;
243
+ })
244
+
245
+
246
+ $('.cytoscape_tool .add_gene_list input[type=submit]').click(function(){
247
+ var option = $(this).closest('form').find('select.favourite_lists').find('option:selected');
248
+ var type = option.attr('attr-entity_type')
249
+ var list_id = $(this).parents('form').first().find('select').val();
250
+ var list = list_entities(type, list_id);
251
+ var info = list_info(type, list_id);
252
+
253
+ tool.cytoscape_tool('add_entities', type, list)
254
+ tool.cytoscape_tool('draw');
255
+
256
+ return false;
257
+ })
258
+
259
+ $('.cytoscape_tool .select_gene_list input[type=submit]').click(function(){
260
+ var option = $(this).closest('form').find('select.favourite_lists').find('option:selected');
261
+ var type = option.attr('attr-entity_type')
262
+ var list_id = $(this).parents('form').first().find('select').val();
263
+ var list = list_entities(type, list_id);
264
+
265
+ tool.cytoscape_tool('select_entities', list)
266
+
267
+ return false;
268
+ })
269
+
270
+ $('.cytoscape_tool .maps input[type=submit]').click(function(){
271
+ var form = $(this).closest('form')
272
+
273
+
274
+ var elem = form.first().find('div.input.elem select').val();
275
+ var map_id = form.first().find('div.input.map select').val();
276
+ var field = form.first().find('div.input.field input').val();
277
+ var map_content = form.first().find('div.input.map_tsv textarea').val();
278
+ var option = form.first().find('div.input.map option:selected');
279
+ var type = option.attr('attr-entity_type')
280
+ var column = form.first().find('div.input.map select').find('option:selected').attr('attr-column');
281
+ var aesthetic = form.first().find('div.input.aesthetic select').val();
282
+
283
+ var map;
284
+
285
+ if (map_id == 'textarea'){
286
+ map_content = "#: :type=:single#:sep=/\\s/#:identifiers=Hsa/jan2013\n" + map_content
287
+ rbbt_job('TSVWorkflow', 'to_json', {tsv: map_content}, function(data){
288
+ var map = JSON.parse(data)
289
+ tool.cytoscape_tool('aesthetic', elem, aesthetic, map, field)
290
+ tool.cytoscape_tool('draw')
291
+ })
292
+ }else{
293
+ entity_map(type, column, map_id, function(map){
294
+ tool.cytoscape_tool('aesthetic', elem, aesthetic, map, field)
295
+ tool.cytoscape_tool('draw')
296
+ });
297
+ }
298
+
299
+ return false;
300
+ })
301
+ })
302
+ :javascript
303
+ $('.item[data-tab]').tab()
304
+ $('.item[data-tab=Close]').click(function(item){
305
+ var tool = $(this).parents('.cytoscape_tool').first()
306
+ tool.find('.tab.active, .item.active').removeClass('active')
307
+ return false
308
+ })
309
+
310
+