rbbt-rest 1.4.13 → 1.5.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/Rakefile +1 -1
- data/lib/rbbt/rest/common/misc.rb +1 -1
- data/lib/rbbt/rest/common/render.rb +8 -4
- data/lib/rbbt/rest/common/table.rb +1 -0
- data/lib/rbbt/rest/common/users.rb +9 -5
- data/lib/rbbt/rest/entity/helpers.rb +1 -1
- data/lib/rbbt/rest/entity/rest.rb +6 -5
- data/lib/rbbt/rest/main.rb +1 -1
- data/share/views/compass/menu.sass +1 -0
- data/share/views/layout/top_menu.haml +0 -24
- data/share/views/public/js/_ajax_replace.js +5 -0
- data/share/views/public/js/app.js +3 -0
- data/share/views/public/js/helpers.js +1 -1
- data/share/views/public/js/rbbt/actions.js +44 -40
- data/share/views/public/js/rbbt/favourites.js +1 -1
- data/share/views/public/js/rbbt/list.js +4 -4
- data/share/views/public/js/rbbt/modal.js +4 -4
- data/share/views/public/js/rbbt/table.js +5 -5
- data/share/views/wait.haml +1 -0
- metadata +2 -20
- data/lib/rbbt/rest/client.rb +0 -56
- data/lib/rbbt/rest/client/adaptor.rb +0 -66
- data/lib/rbbt/rest/client/get.rb +0 -96
- data/lib/rbbt/rest/client/step.rb +0 -164
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 373227cb24541cc0b77e52a7228c1e8b4f7dafc8
|
4
|
+
data.tar.gz: f4fcde8a61a88c37f99e4e3ab64cc2b413eba217
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1f78d6a708dee3e21eea2cfe7825d951babf1bb6f226322a33fd1ad36245787344e205bd45c2b5730bb0d471f33c579c834052b12e32e05f585440b6dcc4f42
|
7
|
+
data.tar.gz: 1fb872b28cffc3bf7b656fbde9318fb201193bdcf811390327524d277cd15ad8dc3826befde3bea35d76f5372375a501bcf92f52ec0d3240cac804b5b1e0b696
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ begin
|
|
15
15
|
gem.add_dependency('rake')
|
16
16
|
gem.add_dependency('sinatra')
|
17
17
|
gem.add_dependency('modular-scale')
|
18
|
-
gem.add_dependency('zurb-foundation')
|
18
|
+
#gem.add_dependency('zurb-foundation')
|
19
19
|
gem.add_dependency('compass')
|
20
20
|
gem.add_dependency('json')
|
21
21
|
gem.add_dependency('haml')
|
@@ -31,7 +31,7 @@ module RbbtRESTHelpers
|
|
31
31
|
@layout = false if @layout.nil? and @ajax
|
32
32
|
@layout = true if @layout.nil? and not @ajax
|
33
33
|
@layout = false if @layout == "false"
|
34
|
-
@layout = true
|
34
|
+
@layout = true if @layout == "true"
|
35
35
|
|
36
36
|
@format = consume_parameter(:_format)
|
37
37
|
@format = :html if @format.nil?
|
@@ -56,14 +56,14 @@ module RbbtRESTHelpers
|
|
56
56
|
template_file = template_file.find if template_file.respond_to? :find
|
57
57
|
if layout_file
|
58
58
|
Tilt::HamlTemplate.new(layout_file, :filename => layout_file, :ugly => production?).render(self, locals) do
|
59
|
+
Log.debug{ "Rendering #{template_file} with layout" }
|
59
60
|
cache(cache, locals.merge(:_template_file => template_file, :user => user).merge(cache_options)) do
|
60
|
-
Log.debug{ "Rendering #{template_file} with layout" }
|
61
61
|
Tilt::HamlTemplate.new(template_file, :filename => template_file, :ugly => production?).render(self, locals)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
else
|
65
|
+
Log.debug{ "Rendering #{template_file} without layout" }
|
65
66
|
cache(cache, locals.merge(:_template_file => template_file, :user => user).merge(cache_options)) do
|
66
|
-
Log.debug{ "Rendering #{template_file} without layout" }
|
67
67
|
Tilt::HamlTemplate.new(template_file, :filename => template_file, :ugly => production?).render(self, locals)
|
68
68
|
end
|
69
69
|
end
|
@@ -196,12 +196,16 @@ module RbbtRESTHelpers
|
|
196
196
|
end
|
197
197
|
end
|
198
198
|
|
199
|
-
def reveal(text, id = nil, &block)
|
199
|
+
def reveal(text, id = nil, options = nil, &block)
|
200
200
|
id ||= "rbbt_reveal_" << (rand * 10000).to_i.to_s
|
201
201
|
|
202
202
|
content_html = capture_haml(&block)
|
203
203
|
|
204
|
-
|
204
|
+
options = {} if options.nil?
|
205
|
+
options = {:href => "#", "data-reveal-id" => 'modal1', 'attr-reveal_id' => id}.merge(options)
|
206
|
+
options[:class] ||= ''
|
207
|
+
options[:class] << ' rbbt_reveal_trigger'
|
208
|
+
str = html_tag('a', text.to_s, options) <<
|
205
209
|
"\n" <<
|
206
210
|
html_tag('div', "\n" << content_html << "\n", :id => id, 'class' => 'rbbt_reveal_content') <<
|
207
211
|
"\n"
|
@@ -37,11 +37,15 @@ module Sinatra
|
|
37
37
|
end
|
38
38
|
|
39
39
|
app.get '/login' do
|
40
|
-
"<form class='login' method='POST' action='/login'>" +
|
41
|
-
"<
|
42
|
-
"<
|
43
|
-
"<
|
44
|
-
"
|
40
|
+
"<form class='login ui form' method='POST' action='/login'>" +
|
41
|
+
"<div class='ui field'>" +
|
42
|
+
"<label for='login_name' class='ui label'>Name: </label>" +
|
43
|
+
"<input id='login_name' class='ui input' type='text' name='user'>" +
|
44
|
+
"</div>" +
|
45
|
+
"<div class='ui field'>" +
|
46
|
+
"<label for='login_pass' class='ui label'>Pass: </label>" +
|
47
|
+
"<input id='login_pass' class='ui input' type='password' name='pass'>" +
|
48
|
+
"</div>" +
|
45
49
|
"<input type='submit'>" +
|
46
50
|
"</form>"
|
47
51
|
end
|
@@ -63,7 +63,7 @@ module EntityRESTHelpers
|
|
63
63
|
locals[:description] = description
|
64
64
|
locals = locals.merge(form_options)
|
65
65
|
|
66
|
-
html_tag :div, partial_render('partials/form', locals), {:class => 'action_parameters'}.merge(action_options)
|
66
|
+
html_tag :div, partial_render('partials/form', locals), {:class => 'action_parameters ui raised segment'}.merge(action_options)
|
67
67
|
end
|
68
68
|
|
69
69
|
def page_type(path = nil)
|
@@ -49,9 +49,7 @@ module Entity
|
|
49
49
|
link_params = include_entity_params ? entity_link_params : {}
|
50
50
|
|
51
51
|
%w(class style title).each do |at|
|
52
|
-
attributes[at.to_sym] = options.delete(at.to_sym) ||
|
53
|
-
options.delete(at.to_s) ||
|
54
|
-
nil
|
52
|
+
attributes[at.to_sym] = options.delete(at.to_sym) || options.delete(at.to_s) || nil
|
55
53
|
end
|
56
54
|
|
57
55
|
attributes[:class] = attributes[:class].split(" ") if String === attributes[:class]
|
@@ -122,6 +120,7 @@ module Entity
|
|
122
120
|
#return self.tap{|a| a.extend AnnotatedArray}.collect{|e| e.link(text, options) } if Array === self
|
123
121
|
return self.collect{|e| e.link(text, options) } if Array === self
|
124
122
|
return self.split(";").collect{|e| self.annotate(e).link(text, options) } * ", " if self.include? ";"
|
123
|
+
return nil if self.empty?
|
125
124
|
|
126
125
|
klasses = self.klasses
|
127
126
|
klasses << 'entity'
|
@@ -183,7 +182,8 @@ module Entity
|
|
183
182
|
|
184
183
|
attributes, link_params = process_link_options(options)
|
185
184
|
|
186
|
-
attributes[:class]
|
185
|
+
attributes[:class] ||= ''
|
186
|
+
attributes[:class] << klasses
|
187
187
|
attributes[:href] = Entity::REST.entity_list_url(id, entity_type.to_s)
|
188
188
|
|
189
189
|
attributes[:title] = id
|
@@ -205,7 +205,8 @@ module Entity
|
|
205
205
|
|
206
206
|
attributes, link_params = process_link_options({:title => [action, id] * ": " }.merge(options), false)
|
207
207
|
|
208
|
-
attributes[:class]
|
208
|
+
attributes[:class] ||= ''
|
209
|
+
attributes[:class] << klasses
|
209
210
|
attributes[:href] = Entity::REST.entity_list_action_url(id, entity_type.to_s, action, link_params)
|
210
211
|
|
211
212
|
attributes[:title] = id if attributes[:title].nil?
|
data/lib/rbbt/rest/main.rb
CHANGED
@@ -142,7 +142,7 @@ module Sinatra
|
|
142
142
|
cache_control :public, :max_age => 360000 if production?
|
143
143
|
|
144
144
|
cache("css: #{File.basename(file)}", :_template_file => file, :_send_file => true, :cache_type => production? ? :synchronous : :none) do
|
145
|
-
Log.debug{ "Rendering
|
145
|
+
Log.debug{ "Rendering stylesheet: #{ file }" }
|
146
146
|
render_sass(file)
|
147
147
|
end
|
148
148
|
end
|
@@ -18,27 +18,3 @@
|
|
18
18
|
.find.hide(hide-title="Find")
|
19
19
|
= partial_render('layout/top_menu/finder')
|
20
20
|
|
21
|
-
//:sass
|
22
|
-
// .dl_menu
|
23
|
-
// dt
|
24
|
-
// display: inline-block
|
25
|
-
// float: left
|
26
|
-
//
|
27
|
-
// body
|
28
|
-
// margin-top: 0 !important
|
29
|
-
// #top_bar
|
30
|
-
// .reload
|
31
|
-
// float: right
|
32
|
-
//
|
33
|
-
//#top_bar.ui.fixed.main.menu.dl_menu
|
34
|
-
// .title.item= $title
|
35
|
-
//
|
36
|
-
// %dl.favourites.left.menu.ui.blue
|
37
|
-
// %dt.item(data-tab='entities') Entities
|
38
|
-
// %dd.en
|
39
|
-
// %dt.item(data-tab='lists') Lists
|
40
|
-
// %dl
|
41
|
-
//
|
42
|
-
// .reload.item
|
43
|
-
// %i.spinner.icon
|
44
|
-
//
|
@@ -24,6 +24,8 @@ $.ajax = function(url, options){
|
|
24
24
|
url = options['url'];
|
25
25
|
}
|
26
26
|
|
27
|
+
url = add_parameter(url, '_layout', 'false')
|
28
|
+
options['url'] = url
|
27
29
|
options["crossDomain"] = true
|
28
30
|
|
29
31
|
add_ajax(url);
|
@@ -158,6 +160,7 @@ function replace_object(object, href, embedd, complete){
|
|
158
160
|
|
159
161
|
function replace_link(link){
|
160
162
|
var href = $(link).attr('href');
|
163
|
+
href = add_parameter(href, '_layout','false')
|
161
164
|
|
162
165
|
replace_object(link, href);
|
163
166
|
}
|
@@ -220,6 +223,8 @@ function capture_embedded_form(object){
|
|
220
223
|
url = url.replace(/\?.*/, '?' + params);
|
221
224
|
}
|
222
225
|
|
226
|
+
url = add_parameter(url, '_layout', 'false')
|
227
|
+
|
223
228
|
embedded.attr('target-href', url).attr('form-params', params)
|
224
229
|
|
225
230
|
update_embedded(embedded);
|
@@ -15,6 +15,9 @@ function update_rbbt(){
|
|
15
15
|
$('#top_menu .favourites').favourites('update_list_selects').favourites('update_map_selects')
|
16
16
|
$('#top_bar .favourites').favourites('update_list_selects').favourites('update_map_selects')
|
17
17
|
|
18
|
+
$('.ui.accordion').accordion();
|
19
|
+
$('.ui.checkbox').checkbox();
|
20
|
+
|
18
21
|
start_deferred()
|
19
22
|
fit_content()
|
20
23
|
}
|
@@ -84,7 +84,7 @@ function require_js(url, success){
|
|
84
84
|
if ($.inArray(url, required_js) >= 0){
|
85
85
|
if (typeof success == 'function'){ success.call() }
|
86
86
|
}else{
|
87
|
-
var _success = function(){ if (typeof success == 'function'){ success.call() };
|
87
|
+
var _success = function(){ required_js.push(url); if (typeof success == 'function'){ success.call() }; }
|
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
|
}
|
@@ -60,7 +60,7 @@ $.widget("rbbt.action_controller", {
|
|
60
60
|
},
|
61
61
|
|
62
62
|
_toogle_track: function(){
|
63
|
-
if (this.element.find('
|
63
|
+
if (this.element.find('.controls > .url.bookmarked').length > 0){
|
64
64
|
this._untrack(this._url());
|
65
65
|
}else{
|
66
66
|
this._track();
|
@@ -71,34 +71,33 @@ $.widget("rbbt.action_controller", {
|
|
71
71
|
var tool = this
|
72
72
|
var controller = tool.element;
|
73
73
|
|
74
|
-
controller.on('click', '>
|
75
|
-
controller.on('click', '>
|
76
|
-
controller.on('click', '>
|
77
|
-
controller.on('click', '>
|
78
|
-
controller.on('click', '>
|
79
|
-
controller.on('click', '>
|
80
|
-
$('#top_menu .user
|
74
|
+
controller.on('click', '> .actions .button', function(e){ tool._activate_action(this); return false});
|
75
|
+
controller.on('click', '> .controls > .reload', function(e){ tool._reload_action(this); return false});
|
76
|
+
controller.on('click', '> .controls > .parameters', function(e){ tool._display_parameters(this); return false});
|
77
|
+
controller.on('click', '> .controls > .description', function(e){ tool._display_description(this); return false});
|
78
|
+
controller.on('click', '> .controls > .pin', function(e){ tool._toggle_pin(this); return false});
|
79
|
+
controller.on('click', '> .controls > .url', function(e){ tool._toogle_track(this); return false});
|
80
|
+
$('#top_menu .user .jobs').on('click', 'a.remove_element', function(){
|
81
81
|
var link = $(this).next('a')
|
82
82
|
tool._untrack(link.attr('href'))
|
83
83
|
})
|
84
84
|
|
85
85
|
this.options.controller = controller
|
86
|
-
this.options.action_controls = controller.find('>
|
87
|
-
this.options.action_list = controller.find('>
|
86
|
+
this.options.action_controls = controller.find('> .controls')
|
87
|
+
this.options.action_list = controller.find('> .actions')
|
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('
|
91
|
+
var action_list_item = action_controller.find('.actions > .loading, .actions > .active')
|
92
92
|
var action_div = action_controller.next('.action_loader');
|
93
93
|
|
94
94
|
if (jqXHR.status == 202){
|
95
95
|
if (action_div.attr('reload-attempts') != '0'){
|
96
96
|
action_controller.removeClass('active').addClass('loading');
|
97
|
-
action_list_item.removeClass('active').addClass('loading');
|
98
97
|
|
99
98
|
var response = $(jqXHR.responseText)
|
100
99
|
var stat = response.find('span.status').html()
|
101
|
-
var message = response.find('
|
100
|
+
var message = response.find('.step_messages li:first').html()
|
102
101
|
|
103
102
|
if (undefined === message){
|
104
103
|
action_div.html("<span class='loading'>Loading [" + stat + "] ...</span>");
|
@@ -107,25 +106,25 @@ $.widget("rbbt.action_controller", {
|
|
107
106
|
};
|
108
107
|
}
|
109
108
|
}else{
|
110
|
-
action_controller.removeClass('loading').
|
111
|
-
action_list_item.removeClass('loading').
|
109
|
+
action_controller.removeClass('loading').removeClass('disabled');
|
110
|
+
action_list_item.removeClass('loading').removeClass('disabled');
|
112
111
|
|
113
|
-
action_controller.find('
|
112
|
+
action_controller.find('.controls > .reload').removeClass('disabled');
|
114
113
|
}
|
115
114
|
|
116
115
|
var action_div = action_controller.next('.action_loader').first();
|
117
|
-
action_controller.find('
|
116
|
+
action_controller.find('.controls > .url').removeClass('disabled');
|
118
117
|
if (action_div.find('> .action_card > .action_parameters').length > 0){
|
119
|
-
action_controller.find('
|
120
|
-
action_controller.find('
|
118
|
+
action_controller.find('.controls > .parameters').removeClass('disabled');
|
119
|
+
action_controller.find('.controls > .pin').removeClass('disabled');
|
121
120
|
}else{
|
122
|
-
action_controller.find('
|
123
|
-
action_controller.find('
|
121
|
+
action_controller.find('.controls > .parameters').addClass('disabled');
|
122
|
+
action_controller.find('.controls > .pin').addClass('disabled');
|
124
123
|
}
|
125
124
|
if (action_div.find('> .action_card > .action_description').length > 0){
|
126
|
-
action_controller.find('
|
125
|
+
action_controller.find('.controls > .description').addClass('disabled');
|
127
126
|
}else{
|
128
|
-
action_controller.find('
|
127
|
+
action_controller.find('.controls > .description').addClass('disabled');
|
129
128
|
}
|
130
129
|
}
|
131
130
|
|
@@ -135,24 +134,26 @@ $.widget("rbbt.action_controller", {
|
|
135
134
|
|
136
135
|
_update_flag: function(){
|
137
136
|
if ($.inArray(this._url(), this.options.bookmarked) != -1){
|
138
|
-
$(this.element).find('>
|
137
|
+
$(this.element).find('> .controls > .url').addClass('bookmarked')
|
139
138
|
}else{
|
140
|
-
$(this.element).find('>
|
139
|
+
$(this.element).find('> .controls > .url').removeClass('bookmarked')
|
141
140
|
}
|
142
141
|
},
|
143
142
|
|
144
143
|
_activate_action: function(e){
|
145
144
|
var action_list_item = $(e)
|
146
|
-
var action_list = action_list_item.parent('
|
145
|
+
var action_list = action_list_item.parent('.actions');
|
147
146
|
var link = action_list_item.find('> a')
|
147
|
+
link = action_list_item
|
148
|
+
|
148
149
|
|
149
150
|
this._load_action(link);
|
150
151
|
|
151
152
|
var action = link.html()
|
152
153
|
if (this.options.saved[action] !== undefined){
|
153
|
-
$(this.element).find('>
|
154
|
+
$(this.element).find('> .controls > .pin').addClass('saved')
|
154
155
|
}else{
|
155
|
-
$(this.element).find('>
|
156
|
+
$(this.element).find('> .controls > .pin').removeClass('saved')
|
156
157
|
}
|
157
158
|
|
158
159
|
this._update_flag()
|
@@ -164,22 +165,22 @@ $.widget("rbbt.action_controller", {
|
|
164
165
|
|
165
166
|
_unpin_parameters: function(){
|
166
167
|
var controller = $(this.element)
|
167
|
-
var action = controller.find('
|
168
|
+
var action = controller.find('.actions .active a').first().html()
|
168
169
|
this.options.saved[action] = undefined
|
169
|
-
controller.find('>
|
170
|
+
controller.find('> .controls > .pin').removeClass('saved')
|
170
171
|
},
|
171
172
|
|
172
173
|
_pin_parameters: function(){
|
173
174
|
var controller = $(this.element)
|
174
|
-
var action = $(this.element).find('
|
175
|
+
var action = $(this.element).find('.actions .active a').first().html()
|
175
176
|
var loader = $(this.element).next('.action_loader').first();
|
176
177
|
this.options.saved[action] = loader.attr('form-params')
|
177
|
-
controller.find('>
|
178
|
+
controller.find('> .controls > .pin').addClass('saved')
|
178
179
|
this._dump()
|
179
180
|
},
|
180
181
|
|
181
182
|
_toggle_pin: function(){
|
182
|
-
var action = $(this.element).find('
|
183
|
+
var action = $(this.element).find('.actions .active a').first().html()
|
183
184
|
|
184
185
|
if (this.options.saved[action] != undefined){
|
185
186
|
this._unpin_parameters();
|
@@ -213,7 +214,7 @@ $.widget("rbbt.action_controller", {
|
|
213
214
|
_reload_action: function(e){
|
214
215
|
if(! $(e).hasClass('active')){ return false}
|
215
216
|
var action_list_item = $(e);
|
216
|
-
var action_list = action_list_item.parent('
|
217
|
+
var action_list = action_list_item.parent('.controls');
|
217
218
|
var action_controller = action_list.parent('.action_controller');
|
218
219
|
var action_div = action_controller.next('.action_loader').first();
|
219
220
|
|
@@ -261,11 +262,13 @@ $.widget("rbbt.action_controller", {
|
|
261
262
|
},
|
262
263
|
|
263
264
|
_load_action: function(link){
|
264
|
-
var action_list_item = link.parent('
|
265
|
-
|
265
|
+
var action_list_item = link.parent('.button');
|
266
|
+
action_list_item = link
|
267
|
+
var action_list = action_list_item.parent('.menu');
|
266
268
|
var action_controller = action_list.parents('.action_controller').first();
|
267
269
|
var action_div = action_controller.next('.action_loader');
|
268
270
|
var href = link.attr('href')
|
271
|
+
href = add_parameter(href, '_layout', 'false')
|
269
272
|
|
270
273
|
var action = link.html()
|
271
274
|
var saved = this.options.saved[action]
|
@@ -277,11 +280,12 @@ $.widget("rbbt.action_controller", {
|
|
277
280
|
|
278
281
|
if( ! action_div.hasClass('reloading') ) {
|
279
282
|
action_div.removeClass('active');
|
280
|
-
action_controller.find('
|
281
|
-
action_controller.find('
|
282
|
-
action_list.find('
|
283
|
-
action_list_item.addClass('
|
283
|
+
action_controller.find('.controls > .reload').removeClass('active');
|
284
|
+
action_controller.find('.controls > .parameters').removeClass('active');
|
285
|
+
action_list.find('.button').removeClass('active').removeClass('loading');
|
286
|
+
action_list_item.addClass('active');
|
284
287
|
action_controller.addClass('loading');
|
288
|
+
|
285
289
|
replace_object(action_div, href, true, this.options.complete);
|
286
290
|
|
287
291
|
return false
|
@@ -26,7 +26,7 @@ function favourite_type_ul(entities){
|
|
26
26
|
}
|
27
27
|
|
28
28
|
function favourite_list_type_ul(type, lists){
|
29
|
-
var type_ul = $('<ul>').addClass('lists')
|
29
|
+
var type_ul = $('<ul>').addClass('lists').addClass('clean_list')
|
30
30
|
for (var list in lists){
|
31
31
|
var list = lists[list];
|
32
32
|
var link = list_link(type, list)
|
@@ -28,10 +28,10 @@ body.on('click', 'a.compare_list', function(){
|
|
28
28
|
var list_id = page_entity_list();
|
29
29
|
|
30
30
|
var type_ul = favourite_list_type_ul(type, lists).addClass("list_comparison")
|
31
|
-
var buttons = $('<
|
32
|
-
buttons.append('<
|
33
|
-
buttons.append('<
|
34
|
-
buttons.append('<
|
31
|
+
var buttons = $('<div class="list_comparison_buttons ui buttons">')
|
32
|
+
buttons.append('<a class="intersect_lists ui compact button" href="#">Intersect</a>')
|
33
|
+
buttons.append('<a class="remove_list ui compact button" href="#">Remove</a>')
|
34
|
+
buttons.append('<a class="add_list ui compact button" href="#">Add</a>')
|
35
35
|
type_ul.find('li').prepend(buttons)
|
36
36
|
|
37
37
|
$('#modal').modal('show', type_ul);
|
@@ -10,10 +10,10 @@ $.widget("rbbt.modal", {
|
|
10
10
|
|
11
11
|
var title = $('<div>').addClass('title')
|
12
12
|
if (modal_title !== undefined){ title.html(modal_title) }
|
13
|
-
var controls = $('<div>').addClass('controls')
|
14
|
-
controls.append($('<a>').addClass('toggle_favourite').append($('<i>').addClass('ui icon star right')))
|
15
|
-
controls.append($('<a>').addClass('link-reveal-modal').append($('<i>').addClass('ui icon arrow right')))
|
16
|
-
controls.append($('<a>').addClass('close-reveal-modal').append($('<i>').addClass('ui icon close right')))
|
13
|
+
var controls = $('<div>').addClass('controls ui buttons')
|
14
|
+
controls.append($('<a>').addClass('toggle_favourite ui button').append($('<i>').addClass('ui icon star right')))
|
15
|
+
controls.append($('<a>').addClass('link-reveal-modal ui button').append($('<i>').addClass('ui icon arrow right')))
|
16
|
+
controls.append($('<a>').addClass('close-reveal-modal ui button').append($('<i>').addClass('ui icon close right')))
|
17
17
|
|
18
18
|
var header = $('<div>').addClass('header').append(title).append(controls)
|
19
19
|
|
@@ -99,7 +99,7 @@ $.widget("rbbt.table", {
|
|
99
99
|
|
100
100
|
//{{{ Pagination
|
101
101
|
//
|
102
|
-
table.on('click', 'tfoot > tr > th >
|
102
|
+
table.on('click', 'tfoot > tr > th > .table_pagination > .num > a:not(.active)', function(link){
|
103
103
|
var link = $(this)
|
104
104
|
|
105
105
|
var stat = tool._status()
|
@@ -109,7 +109,7 @@ $.widget("rbbt.table", {
|
|
109
109
|
return false
|
110
110
|
})
|
111
111
|
|
112
|
-
table.on('click', 'tfoot > tr > th >
|
112
|
+
table.on('click', 'tfoot > tr > th > .table_pagination > .arrow > a.prev', function(link){
|
113
113
|
var stat = tool._status()
|
114
114
|
|
115
115
|
if (stat.num > 1){ stat.num = stat.num - 1 }
|
@@ -119,9 +119,9 @@ $.widget("rbbt.table", {
|
|
119
119
|
return false
|
120
120
|
})
|
121
121
|
|
122
|
-
table.on('click', 'tfoot > tr > th >
|
122
|
+
table.on('click', 'tfoot > tr > th > .table_pagination > .arrow > a.next', function(evt){
|
123
123
|
var stat = tool._status();
|
124
|
-
var last = parseInt($(this).parents('
|
124
|
+
var last = parseInt($(this).parents('.table_pagination').first().find('.num').last().find('a').html())
|
125
125
|
|
126
126
|
if (stat.num < last){ stat.num = stat.num + 1 }
|
127
127
|
|
@@ -130,7 +130,7 @@ $.widget("rbbt.table", {
|
|
130
130
|
return false
|
131
131
|
})
|
132
132
|
|
133
|
-
table.on('click', 'tfoot > tr > th >
|
133
|
+
table.on('click', 'tfoot > tr > th > .table_pagination > .all', function(link){
|
134
134
|
var stat = tool._status()
|
135
135
|
|
136
136
|
tool._update(stat.url, '', stat.size, stat.field, stat.filter)
|
data/share/views/wait.haml
CHANGED
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.5.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: 2015-01-
|
11
|
+
date: 2015-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: zurb-foundation
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: compass
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -173,10 +159,6 @@ extra_rdoc_files:
|
|
173
159
|
files:
|
174
160
|
- LICENSE
|
175
161
|
- Rakefile
|
176
|
-
- lib/rbbt/rest/client.rb
|
177
|
-
- lib/rbbt/rest/client/adaptor.rb
|
178
|
-
- lib/rbbt/rest/client/get.rb
|
179
|
-
- lib/rbbt/rest/client/step.rb
|
180
162
|
- lib/rbbt/rest/common/cache.rb
|
181
163
|
- lib/rbbt/rest/common/forms.rb
|
182
164
|
- lib/rbbt/rest/common/locate.rb
|
data/lib/rbbt/rest/client.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'rest_client'
|
2
|
-
require 'json'
|
3
|
-
require 'rbbt/workflow'
|
4
|
-
require 'rbbt/workflow/step'
|
5
|
-
require 'rbbt/util/misc'
|
6
|
-
|
7
|
-
require 'rbbt/rest/client/get'
|
8
|
-
require 'rbbt/rest/client/adaptor'
|
9
|
-
require 'rbbt/rest/client/step'
|
10
|
-
|
11
|
-
class WorkflowRESTClient
|
12
|
-
include Workflow
|
13
|
-
|
14
|
-
attr_accessor :url, :name, :exec_exports, :asynchronous_exports, :synchronous_exports
|
15
|
-
|
16
|
-
def initialize(url, name)
|
17
|
-
Log.debug{ "Loading remote workflow #{ name }: #{ url }" }
|
18
|
-
@url, @name = url, name
|
19
|
-
init_remote_tasks
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_s
|
23
|
-
name
|
24
|
-
end
|
25
|
-
|
26
|
-
def job(task, name, inputs)
|
27
|
-
task_info = task_info(task)
|
28
|
-
fixed_inputs = {}
|
29
|
-
input_types = task_info[:input_types]
|
30
|
-
|
31
|
-
inputs.each do |k,v|
|
32
|
-
k = k.to_sym
|
33
|
-
if TSV === v
|
34
|
-
fixed_inputs[k] = v.to_s
|
35
|
-
else
|
36
|
-
case input_types[k].to_sym
|
37
|
-
when :tsv, :array, :file, :text
|
38
|
-
fixed_inputs[k] = (String === v and Open.exists?(v)) ? Open.open(v) : v
|
39
|
-
else
|
40
|
-
fixed_inputs[k] = v
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
RemoteStep.new(url, task, name, fixed_inputs, task_info[:result_type], task_info[:result_description], @exec_exports.include?(task))
|
46
|
-
end
|
47
|
-
|
48
|
-
def load_id(id)
|
49
|
-
task, name = id.split("/")
|
50
|
-
step = RemoteStep.new url, task, nil
|
51
|
-
step.name = name
|
52
|
-
step.result_type = task_info(task)[:result_type]
|
53
|
-
step.result_description = task_info(task)[:result_description]
|
54
|
-
step
|
55
|
-
end
|
56
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
class WorkflowRESTClient
|
2
|
-
|
3
|
-
def workflow_description
|
4
|
-
WorkflowRESTClient.get_raw(File.join(url, 'description'))
|
5
|
-
end
|
6
|
-
|
7
|
-
def documentation
|
8
|
-
@documention ||= IndiferentHash.setup(WorkflowRESTClient.get_json(File.join(url, "documentation"),{}))
|
9
|
-
end
|
10
|
-
|
11
|
-
def task_info(task)
|
12
|
-
@task_info ||= {}
|
13
|
-
@task_info[task]
|
14
|
-
|
15
|
-
if @task_info[task].nil?
|
16
|
-
task_info = WorkflowRESTClient.get_json(File.join(url, task.to_s, 'info'))
|
17
|
-
task_info = WorkflowRESTClient.fix_hash(task_info)
|
18
|
-
|
19
|
-
task_info[:result_type] = task_info[:result_type].to_sym
|
20
|
-
task_info[:export] = task_info[:export].to_sym
|
21
|
-
task_info[:input_types] = WorkflowRESTClient.fix_hash(task_info[:input_types], true)
|
22
|
-
task_info[:inputs] = task_info[:inputs].collect{|input| input.to_sym }
|
23
|
-
|
24
|
-
@task_info[task] = task_info
|
25
|
-
end
|
26
|
-
@task_info[task]
|
27
|
-
end
|
28
|
-
|
29
|
-
def exported_tasks
|
30
|
-
(@asynchronous_exports + @synchronous_exports + @exec_exports).compact.flatten
|
31
|
-
end
|
32
|
-
|
33
|
-
def tasks
|
34
|
-
@tasks ||= Hash.new do |hash,task_name|
|
35
|
-
info = task_info(task_name)
|
36
|
-
task = Task.setup info do |*args|
|
37
|
-
raise "This is a remote task"
|
38
|
-
end
|
39
|
-
task.name = task_name.to_sym
|
40
|
-
hash[task_name] = task
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def load_tasks
|
45
|
-
exported_tasks.each{|name| tasks[name]}
|
46
|
-
nil
|
47
|
-
end
|
48
|
-
|
49
|
-
def task_dependencies
|
50
|
-
@task_dependencies ||= Hash.new do |hash,task|
|
51
|
-
hash[task] = if exported_tasks.include? task
|
52
|
-
WorkflowRESTClient.get_json(File.join(url, task.to_s, 'dependencies'))
|
53
|
-
else
|
54
|
-
[]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def init_remote_tasks
|
60
|
-
task_exports = WorkflowRESTClient.get_json(url)
|
61
|
-
@asynchronous_exports = task_exports["asynchronous"].collect{|task| task.to_sym }
|
62
|
-
@synchronous_exports = task_exports["synchronous"].collect{|task| task.to_sym }
|
63
|
-
@exec_exports = task_exports["exec"].collect{|task| task.to_sym }
|
64
|
-
nil
|
65
|
-
end
|
66
|
-
end
|
data/lib/rbbt/rest/client/get.rb
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
class WorkflowRESTClient
|
2
|
-
def self.fix_hash(hash, fix_values = false)
|
3
|
-
fixed = {}
|
4
|
-
hash.each do |key, value|
|
5
|
-
fixed[key.to_sym] = case value
|
6
|
-
when TrueClass
|
7
|
-
value
|
8
|
-
when FalseClass
|
9
|
-
value
|
10
|
-
when Hash
|
11
|
-
fix_hash(value)
|
12
|
-
when (fix_values and String )
|
13
|
-
value.to_sym
|
14
|
-
when IO
|
15
|
-
value.read
|
16
|
-
when TSV::Dumper
|
17
|
-
value.stream
|
18
|
-
when Step
|
19
|
-
stream = get_stream(value)
|
20
|
-
stream || value.load
|
21
|
-
else
|
22
|
-
value
|
23
|
-
end
|
24
|
-
end
|
25
|
-
fixed
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.capture_exception
|
29
|
-
begin
|
30
|
-
yield
|
31
|
-
rescue Exception => e
|
32
|
-
raise e unless e.respond_to? :response
|
33
|
-
begin
|
34
|
-
klass, message = e.response.to_s.split " => "
|
35
|
-
klass = Kernel.const_get klass
|
36
|
-
raise klass.new message
|
37
|
-
rescue
|
38
|
-
raise e
|
39
|
-
end
|
40
|
-
raise $!
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.get_raw(url, params = {})
|
45
|
-
Log.debug{ "RestClient get_raw: #{ url } - #{Misc.fingerprint params}" }
|
46
|
-
params = params.merge({ :_format => 'raw' })
|
47
|
-
capture_exception do
|
48
|
-
Misc.insist(2, 0.5) do
|
49
|
-
RestClient.get(URI.encode(url), :params => params)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.post_jobname(url, params = {})
|
55
|
-
Log.debug{ "RestClient post_jobname: #{ url } - #{Misc.fingerprint params}" }
|
56
|
-
params = params.merge({ :_format => 'jobname' })
|
57
|
-
|
58
|
-
capture_exception do
|
59
|
-
RestClient.post(URI.encode(url), params)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.get_json(url, params = {})
|
64
|
-
Log.debug{ "RestClient get_json: #{ url } - #{Misc.fingerprint params }" }
|
65
|
-
params = params.merge({ :_format => 'json' })
|
66
|
-
|
67
|
-
res = capture_exception do
|
68
|
-
RestClient.get(URI.encode(url), :params => params)
|
69
|
-
end
|
70
|
-
|
71
|
-
begin
|
72
|
-
JSON.parse(res)
|
73
|
-
rescue
|
74
|
-
res
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def self.post_json(url, params = {})
|
79
|
-
if url =~ /_cache_type=:exec/
|
80
|
-
JSON.parse(Open.open(url, :nocache => true))
|
81
|
-
else
|
82
|
-
params = params.merge({ :_format => 'json' })
|
83
|
-
|
84
|
-
res = capture_exception do
|
85
|
-
RestClient.post(URI.encode(url), params)
|
86
|
-
end
|
87
|
-
|
88
|
-
begin
|
89
|
-
JSON.parse(res)
|
90
|
-
rescue
|
91
|
-
res
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
@@ -1,164 +0,0 @@
|
|
1
|
-
class WorkflowRESTClient
|
2
|
-
class RemoteStep < Step
|
3
|
-
|
4
|
-
attr_accessor :url, :base_url, :task, :base_name, :inputs, :result_type, :result_description, :is_exec
|
5
|
-
|
6
|
-
def self.get_streams(inputs)
|
7
|
-
inputs.each do |k,v|
|
8
|
-
if Step === v
|
9
|
-
stream = v.get_stream
|
10
|
-
inputs[k] = stream || v.load
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
def initialize(base_url, task = nil, base_name = nil, inputs = nil, result_type = nil, result_description = nil, is_exec = false)
|
15
|
-
@base_url, @task, @base_name, @inputs, @result_type, @result_description, @is_exec = base_url, task, base_name, inputs, result_type, result_description, is_exec
|
16
|
-
@mutex = Mutex.new
|
17
|
-
RemoteStep.get_streams @inputs
|
18
|
-
end
|
19
|
-
|
20
|
-
def name
|
21
|
-
return nil if @is_exec
|
22
|
-
(Array === @url ? @url.first : @url).split("/").last
|
23
|
-
end
|
24
|
-
|
25
|
-
def task_name
|
26
|
-
(Array === @url ? @url.first : @url).split("/")[-2]
|
27
|
-
end
|
28
|
-
|
29
|
-
def info(check_lock=false)
|
30
|
-
@info ||= begin
|
31
|
-
init_job unless url
|
32
|
-
info = WorkflowRESTClient.get_json(File.join(url, 'info'))
|
33
|
-
info = WorkflowRESTClient.fix_hash(info)
|
34
|
-
info[:status] = info[:status].to_sym if String === info[:status]
|
35
|
-
info
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def status
|
40
|
-
begin
|
41
|
-
info[:status]
|
42
|
-
ensure
|
43
|
-
@info = nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def done?
|
48
|
-
@done || status.to_s == 'done'
|
49
|
-
end
|
50
|
-
|
51
|
-
def files
|
52
|
-
WorkflowRESTClient.get_json(File.join(url, 'files'))
|
53
|
-
end
|
54
|
-
|
55
|
-
def file(file)
|
56
|
-
WorkflowRESTClient.get_raw(File.join(url, 'file', file))
|
57
|
-
end
|
58
|
-
|
59
|
-
#{{{ MANAGEMENT
|
60
|
-
|
61
|
-
def init_job(cache_type = :asynchronous)
|
62
|
-
@name ||= Persist.memory("RemoteSteps", :jobname => @name, :inputs => inputs) do
|
63
|
-
WorkflowRESTClient.post_jobname(File.join(base_url, task.to_s), inputs.merge(:jobname => @name||@base_name, :_cache_type => cache_type))
|
64
|
-
end
|
65
|
-
@url = File.join(base_url, task.to_s, @name)
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
|
69
|
-
def load_res(res, result_type = nil)
|
70
|
-
result_type ||= self.result_type
|
71
|
-
case result_type
|
72
|
-
when :string
|
73
|
-
res
|
74
|
-
when :boolean
|
75
|
-
res == "true"
|
76
|
-
when :tsv
|
77
|
-
TSV.open(StringIO.new(res))
|
78
|
-
when :annotations
|
79
|
-
Annotated.load_tsv(TSV.open(StringIO.new(res)))
|
80
|
-
when :array
|
81
|
-
res.split("\n")
|
82
|
-
else
|
83
|
-
JSON.parse res
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def get
|
88
|
-
params ||= {}
|
89
|
-
params = params.merge(:_format => [:string, :boolean, :tsv, :annotations,:array].include?(result_type.to_sym) ? :raw : :json )
|
90
|
-
Misc.insist 3, rand(2) + 1 do
|
91
|
-
begin
|
92
|
-
WorkflowRESTClient.get_raw(url, params)
|
93
|
-
rescue
|
94
|
-
Log.exception $!
|
95
|
-
raise $!
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def load
|
101
|
-
params = {}
|
102
|
-
load_res get
|
103
|
-
end
|
104
|
-
|
105
|
-
def exec_job
|
106
|
-
res = WorkflowRESTClient.capture_exception do
|
107
|
-
RestClient.post(URI.encode(File.join(base_url, task.to_s)), inputs.merge(:_cache_type => :exec, :_format => [:string, :boolean, :tsv, :annotations].include?(result_type) ? :raw : :json))
|
108
|
-
end
|
109
|
-
load_res res, result_type == :array ? :json : result_type
|
110
|
-
end
|
111
|
-
|
112
|
-
def fork
|
113
|
-
init_job(:asynchronous)
|
114
|
-
end
|
115
|
-
|
116
|
-
def running?
|
117
|
-
! %w(done error aborted).include? status.to_s
|
118
|
-
end
|
119
|
-
|
120
|
-
def path
|
121
|
-
url
|
122
|
-
end
|
123
|
-
|
124
|
-
def run(noload = false)
|
125
|
-
@mutex.synchronize do
|
126
|
-
@result ||= begin
|
127
|
-
if @is_exec
|
128
|
-
exec_job
|
129
|
-
else
|
130
|
-
init_job(:synchronous)
|
131
|
-
self.load
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
noload ? path : @result
|
136
|
-
end
|
137
|
-
|
138
|
-
def exec(*args)
|
139
|
-
exec_job
|
140
|
-
end
|
141
|
-
|
142
|
-
def join
|
143
|
-
return if self.done?
|
144
|
-
self.load
|
145
|
-
self
|
146
|
-
end
|
147
|
-
|
148
|
-
def recursive_clean
|
149
|
-
begin
|
150
|
-
inputs[:_update] = :recursive_clean
|
151
|
-
rescue Exception
|
152
|
-
end
|
153
|
-
self
|
154
|
-
end
|
155
|
-
|
156
|
-
def clean
|
157
|
-
begin
|
158
|
-
inputs[:_update] = :clean
|
159
|
-
rescue Exception
|
160
|
-
end
|
161
|
-
self
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|