rbbt-rest 1.1.4 → 1.1.5

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 (73) hide show
  1. checksums.yaml +8 -8
  2. data/config.ru +3 -0
  3. data/lib/rbbt/rest/client.rb +9 -10
  4. data/lib/rbbt/rest/common/cache.rb +32 -7
  5. data/lib/rbbt/rest/common/forms.rb +33 -0
  6. data/lib/rbbt/rest/common/locate.rb +4 -0
  7. data/lib/rbbt/rest/common/misc.rb +24 -0
  8. data/lib/rbbt/rest/common/render.rb +26 -9
  9. data/lib/rbbt/rest/common/resources.rb +1 -1
  10. data/lib/rbbt/rest/common/table.rb +87 -26
  11. data/lib/rbbt/rest/common/users.rb +5 -1
  12. data/lib/rbbt/rest/entity.rb +300 -95
  13. data/lib/rbbt/rest/entity/action_controller.rb +6 -1
  14. data/lib/rbbt/rest/entity/entity_list_card.rb +1 -1
  15. data/lib/rbbt/rest/entity/entity_map_card.rb +15 -0
  16. data/lib/rbbt/rest/entity/favourites.rb +57 -1
  17. data/lib/rbbt/rest/entity/finder.rb +1 -1
  18. data/lib/rbbt/rest/entity/helpers.rb +40 -7
  19. data/lib/rbbt/rest/entity/list.rb +8 -0
  20. data/lib/rbbt/rest/entity/locate.rb +114 -0
  21. data/lib/rbbt/rest/entity/map.rb +99 -0
  22. data/lib/rbbt/rest/entity/render.rb +25 -0
  23. data/lib/rbbt/rest/entity/rest.rb +33 -4
  24. data/lib/rbbt/rest/main.rb +27 -4
  25. data/lib/rbbt/rest/workflow.rb +7 -1
  26. data/lib/rbbt/rest/workflow/jobs.rb +21 -1
  27. data/share/views/compass/app.sass +17 -9
  28. data/share/views/compass/entity_card.sass +16 -3
  29. data/share/views/compass/favourites.sass +44 -2
  30. data/share/views/compass/form.sass +11 -0
  31. data/share/views/compass/list_container.sass +1 -1
  32. data/share/views/compass/reveal.sass +31 -0
  33. data/share/views/compass/style.sass +29 -1
  34. data/share/views/compass/style_mixins.sass +18 -6
  35. data/share/views/compass/table.sass +19 -3
  36. data/share/views/compass/topbar.sass +8 -2
  37. data/share/views/entity_map/Default.haml +5 -0
  38. data/share/views/entity_partials/action_card.haml +2 -0
  39. data/share/views/entity_partials/action_controller.haml +8 -1
  40. data/share/views/entity_partials/entity_list_card.haml +8 -6
  41. data/share/views/entity_partials/entity_map_card.haml +63 -0
  42. data/share/views/entity_partials/list_container.haml +3 -2
  43. data/share/views/error.haml +14 -10
  44. data/share/views/help.haml +34 -0
  45. data/share/views/help/entity.haml +193 -0
  46. data/share/views/help/workflow.haml +77 -0
  47. data/share/views/job_result/tsv.haml +3 -2
  48. data/share/views/layout.haml +33 -3
  49. data/share/views/layout/favourites.haml +14 -4
  50. data/share/views/layout/header.haml +4 -0
  51. data/share/views/partials/form.haml +3 -1
  52. data/share/views/partials/table.haml +16 -52
  53. data/share/views/partials/table/column.haml +10 -0
  54. data/share/views/partials/table/files.haml +4 -0
  55. data/share/views/partials/table/filters.haml +11 -0
  56. data/share/views/partials/table/page.haml +37 -0
  57. data/share/views/public/favicon.gif +0 -0
  58. data/share/views/public/js/_ajax_replace.js +76 -4
  59. data/share/views/public/js/_fix_tablesorter_science.js +13 -0
  60. data/share/views/public/js/actions.js +8 -2
  61. data/share/views/public/js/base.js +12 -1
  62. data/share/views/public/js/entities.js +39 -7
  63. data/share/views/public/js/favourites.js +308 -77
  64. data/share/views/public/js/helpers.js +9 -5
  65. data/share/views/public/js/lists.js +12 -12
  66. data/share/views/public/js/maps.js +17 -0
  67. data/share/views/public/js/reveal.js +48 -0
  68. data/share/views/public/js/tables.js +110 -51
  69. data/share/views/public/js/workflow.js +4 -16
  70. data/share/views/public/plugins/underscore/js/underscore.js +1227 -0
  71. data/share/views/tasks.haml +12 -1
  72. data/share/views/wait.haml +7 -0
  73. metadata +17 -2
@@ -0,0 +1,77 @@
1
+ .row.help
2
+ .column.small-12
3
+ :markdown
4
+
5
+ The Workflow subsystem
6
+ ===================
7
+
8
+ The workflow subsystem is used to package related functionalities and
9
+ offer a common, flexible, interface. Each workflow is composed of a
10
+ number of tasks. Each task represents a step taken towards the completion
11
+ of a workflow, and thus, tasks may depend on other tasks, yet this is
12
+ often not the case and tasks are often stand-alone.
13
+
14
+ Tasks are design to be isolated or self-contained, meaning that executing
15
+ a particular task with the same values for the input parameters should
16
+ render the same identical result. This is not an imposition, but it is
17
+ encouraged, and almost all, if not all, tasks behave this way. The
18
+ consequence of this predictability is that results can be cached.
19
+
20
+ ## Accessing workflow functionalities
21
+
22
+ You may access a workflow functionalities on three ways: using a
23
+ web-browser, remotely using web services, or locally. Local execution
24
+ requires the installation of the Rbbt framework and the workflow source
25
+ and it is out of the scope of this document.
26
+
27
+ ### Using the Browser
28
+
29
+ To use the web browser you just point your browser to the workflow page.
30
+ Check at the bottom of this page for a list of workflows available in
31
+ this server. The workflow page presents a description of the software
32
+ along with the tasks it includes and their descriptions (descriptions are
33
+ optional for workflow development and may be missing). Each task has its
34
+ own page, which contains the input form. Submitting the form takes you to
35
+ the results page. Form and result pages follow a general template, which
36
+ we shall review bellow.
37
+
38
+ Workflow and task pages, like any other page in this system, are subject
39
+ to being redefined; in this case by the workflow author. This makes it
40
+ possible to make both the input and the results page fit more closely the
41
+ user needs. This option, however, is rarely necessary, and most workflows
42
+ use the default templates.
43
+
44
+ ### Using the Web Server
45
+
46
+ The browser interface follows the REST protocol (mostly) so that it can
47
+ be used as a web server. Any user familiar with 'curl' or 'wget' should
48
+ have little problems using it. The Rbbt all-purpose command 'rbbt' can
49
+ also be used to execute remote workflow. See the documentation on the
50
+ rbbt site (once it is available.)
51
+
52
+ .row.help
53
+ .column.small-12
54
+
55
+ %table
56
+ %caption Available workflows on this site
57
+ %thead
58
+ %tr
59
+ %th Workflow
60
+ %th Description
61
+ %tbody
62
+ - Sinatra::RbbtRESTWorkflow::WORKFLOWS.each do |workflow|
63
+ - next if workflow.asynchronous_exports.empty? and workflow.synchronous_exports.empty? and workflow.exec_exports.empty?
64
+ %tr
65
+ %th
66
+ %a(href="#{'/' << workflow.to_s}")= Misc.humanize(workflow.to_s)
67
+ %td
68
+ - description = workflow.workflow_description || ""
69
+
70
+ - case
71
+ - when description.empty?
72
+ No description
73
+ - else
74
+ = description.split("\n\n").first
75
+
76
+
77
+
@@ -1,7 +1,8 @@
1
1
  - table_id = [workflow.to_s, task, jobname] * "_"
2
2
  - table_class = 'workflow_tsv_result'
3
- - rows = tsv_rows(result)
3
+ - rows, total_size = tsv_rows(result)
4
4
  - header = result.all_fields
5
+ - page = total_size > 50 ? "1" : nil
5
6
 
6
7
  = workflow_partial('partials/table', workflow, task,
7
- locals.merge(:table_id => table_id, :table_calss => table_class, :rows => rows, :header => result.all_fields, :row_ids => :use))
8
+ locals.merge(:table_id => table_id, :page => page, :table_class => table_class, :rows => rows, :total_size => total_size, :header => result.all_fields, :row_ids => :use, :table_url => File.join('/', workflow.to_s, task, jobname)))
@@ -15,12 +15,27 @@
15
15
 
16
16
  %link{:rel => "icon", :type => "image/gif", :href => "/favicon.gif"}/
17
17
 
18
- %title= $title || "Genome Scout"
18
+ - title = $title.dup || "Genome Scout"
19
+ - case page_type.to_s
20
+ - when "entity"
21
+ - title << ": " << (entity.respond_to?(:name) ? entity.name || entity : entity)
22
+ - when "entity_list"
23
+ - title << ": " << list_id
24
+ - when "entity_map"
25
+ - title << ": " << map_id
26
+ - when "entity_action"
27
+ - title << ": " << "[#{page_action}]" # << (entity.respond_to?(:name) ? entity.name || entity : entity)
28
+ - when "entity_list_action"
29
+ - title << ": " << "[#{page_action}]" << list_id
30
+ - when "entity_map_action"
31
+ - title << ": " << "[#{page_action}]" << map_id
32
+
33
+
34
+ %title= title
19
35
  - record_css '/stylesheets/app'
20
36
 
21
37
  - record_css '/plugins/zurb-icons/foundation_icons_general/stylesheets/general_foundicons.css'
22
38
 
23
-
24
39
  - if $zepto
25
40
  - record_js "/js/zepto"
26
41
  - record_js '/js/deffer'
@@ -32,6 +47,7 @@
32
47
  - record_js File.join('/plugins/jquery/js/', jquery_file)
33
48
 
34
49
 
50
+ - record_js "/plugins/underscore/js/underscore.js"
35
51
  -# %w(foundation foundation.alerts foundation.cookie foundation.forms foundation.reveal foundation.tooltips foundation.clearing foundation.dropdown foundation.joyride foundation.magellan foundation.placeholder foundation.section foundation.topbar custom.modernizr).each do |file|
36
52
  - %w(foundation foundation.cookie foundation.reveal foundation.dropdown foundation.section foundation.topbar custom.modernizr).each do |file|
37
53
  - record_js "/js/#{ file }"
@@ -39,7 +55,7 @@
39
55
  - record_js '/plugins/jquery.tablesorter/jquery.tablesorter'
40
56
  - record_js '/plugins/jquery.scrollTo/jquery.scrollTo'
41
57
 
42
- - %w(_foundation _md5 _fix_tablesorter_science helpers _ajax_replace _dom_update _ellipsis entities favourites offcanvas actions lists tables tabs base workflow app).each do |file|
58
+ - %w(_ajax_replace _foundation _md5 _fix_tablesorter_science helpers _dom_update _ellipsis entities favourites offcanvas actions lists maps tables tabs reveal base workflow app).each do |file|
43
59
  - record_js "/js/#{ file }"
44
60
 
45
61
 
@@ -88,5 +104,19 @@
88
104
 
89
105
 
90
106
  #modal1.reveal-modal
107
+ .header
108
+ .title
109
+ .controls
110
+ %a(class='link-reveal-modal')
111
+ %i.foundicon-right-arrow
112
+ %a(class='close-reveal-modal') x
113
+ .content
91
114
  #modal2.reveal-modal
115
+ .header
116
+ .title
117
+ .controls
118
+ %a(class='link-reveal-modal')
119
+ %i.foundicon-right-arrow
120
+ %a(class='close-reveal-modal') x
121
+ .content
92
122
 
@@ -1,6 +1,4 @@
1
1
 
2
- %li.divider
3
-
4
2
  %li#top-favourites.has-dropdown
5
3
  %a(href="#") Fav. Entities
6
4
 
@@ -13,8 +11,6 @@
13
11
  %li
14
12
  = entity.link
15
13
 
16
- %li.divider
17
-
18
14
  %li#top-favourite_lists.has-dropdown
19
15
  %a(href="#") Fav. Entity Lists
20
16
 
@@ -26,6 +22,20 @@
26
22
  - lists.each do |list_id|
27
23
  %li
28
24
  %a(href="#{Entity::REST.entity_list_url(list_id, type)}")= list_id
25
+
26
+ %li#top-favourite_maps.has-dropdown
27
+ %a(href="#") Fav. Entity Maps
28
+
29
+ %ul.favourite_entity_maps.dropdown
30
+ - favourite_entity_maps.each do |type, columns|
31
+ - columns.each do |column, maps|
32
+ %li.type.has-dropdown(entity_type=type entity_column=column)
33
+ %a(href="#")= [type, column] * " - "
34
+ %ul.dropdown
35
+ - maps.each do |map_id|
36
+ %li
37
+ %a(href="#{Entity::REST.entity_map_url(map_id, type, column)}")= map_id
38
+
29
39
 
30
40
  %li#top-favourite_lists.has-dropdown
31
41
  %a(href="#") New Entity List
@@ -38,3 +38,7 @@
38
38
  %input(type="text" name="term")
39
39
  %button.secondary.radius.button(type="submit") Search
40
40
 
41
+ %li
42
+ %a(href="/help") Help
43
+ %li.ajax_counter
44
+ %a#ajax_processes 0
@@ -20,7 +20,9 @@
20
20
  - input_id = id.nil? ? nil : id + "__" << input.to_s
21
21
  - hide = (options[input] != nil and options[input][:hide])
22
22
  %div(class="input #{types[input]} #{input} #{hide ? 'hide' : ''}")
23
- != form_input(input, types[input], defaults[input], values[input], descriptions[input], input_id, options[input])
23
+ - input_options = options[input]
24
+ - input_options = input_options.dup unless input_options.nil?
25
+ != form_input(input, types[input], defaults[input], values[input], descriptions[input], input_id, input_options)
24
26
 
25
27
  .input.submit
26
28
  %input(type="submit")
@@ -1,6 +1,6 @@
1
1
  - table_options = {} unless defined? table_options and table_options
2
+ - entity_options = table_options[:tsv_entity_options] unless defined? entity_options and entity_options
2
3
  - headers = table_options[:headers]
3
-
4
4
  - table_id = table_options[:table_id] unless defined? table_id and table_id
5
5
  - table_class = table_options[:table_class] unless defined? table_class and table_class
6
6
  - header = table_options[:header] unless defined? header and header
@@ -9,7 +9,7 @@
9
9
  - total_size = table_options[:total_size] unless defined? total_size and total_size
10
10
  - filters = table_options[:filters] unless defined? filters and filters
11
11
 
12
- - list_links = table_options[:list_links] unless defined? list_links and not list_links.nil?
12
+ - list_links = table_options[:list_links] unless defined? list_links and list_links
13
13
 
14
14
  - page = @page unless defined? page and not page.nil?
15
15
 
@@ -40,64 +40,28 @@
40
40
  - row.each_with_index do |value, i|
41
41
  - list_id = "#{ Misc.humanize(table_id) }: #{header[i]} for #{row.first}" if list_links and table_id and header and AnnotatedArray === value
42
42
  - field = header ? header[i] : nil
43
- -# if headers and headers.include? field
44
- - value = Misc.prepare_entity(value.to_s, headers[field].first, headers[field].last)
45
- %td= table_value(value, field, :list_id => list_id)
43
+ - val = table_value(value, field, :list_id => list_id, :unnamed => table_options[:unnamed], :entity_options => entity_options)
44
+ %td= Float === val ? "%.5g" % val : val.to_s
46
45
 
47
46
 
48
47
  -#{{{ TFOOT
49
48
  %tfoot
50
49
  %tr
51
50
  %th(colspan="#{header ? header.length : 100}")
52
- - if page
53
- - num, size, field = parse_page(page)
54
- - num = num.to_i
55
- - total_nums = total_size.to_i / size.to_i
56
- - total_nums += 1 if total_size.to_i % size.to_i > 0
57
- - start = [1, num - 2].max
58
- - eend = [total_nums, num + 2].min
59
- %ul.table_pagination.pagination
60
- %li(class="arrow")
61
- %a.prev(href="#") &laquo;
62
-
63
- - if num - 2 > 1
64
- %li(class="num")
65
- %a(href="#") 1
66
-
67
- - if num - 2 > 2
68
- %li(class="inactive")
69
- %a(href="#") ...
70
-
71
- - (start..eend).each do |p|
72
- %li(class="num#{p.to_s == num.to_s ? " active" : "" }")
73
- %a(href="#")= p
74
-
75
- - if num + 3 < total_nums
76
- %li(class="inactive")
77
- %a(href="#") ...
78
-
79
- - if num + 2 < total_nums
80
- %li(class="num")
81
- %a(href="#")= total_nums
82
-
83
- %li(class="arrow")
84
- %a.next(href="#") &raquo;
85
-
86
- %li(class="all")
87
- %a.all(href="#") all
88
51
 
52
+ - if page
53
+ = partial_render('partials/table/page', :page => page, :total_size => total_size)
89
54
 
90
55
  - if table_url
91
56
  %ul.table_actions
92
- - if filters and filters.any?
93
- %li.filter()
94
- %a(href="#" data-reveal-id="modal1") filter
95
- .filters(id="filter-#{(rand * 1000).to_i}")
96
- = action_parameters nil, :class => 'filter_controls' do
97
- - filters.each do |field, attrs|
98
- - input field, :string, "Field value"
99
- %li.tsv
100
- %a(href="#{add_GET_param(table_url, "_format", "tsv")}") tsv
101
- %li.excel
102
- %a(href="#{add_GET_param(table_url, "_format", "excel")}") excel
57
+
58
+ = partial_render('partials/table/filters', :table_url => table_url, :header => header, :id => "rbbt_reveal_" << Misc.digest(table_url))
59
+
60
+ = partial_render('partials/table/column', :table_url => table_url, :header => header)
61
+
62
+ = partial_render('partials/table/files', :table_url => table_url)
63
+
64
+
65
+
66
+
103
67
 
@@ -0,0 +1,10 @@
1
+ - table_columns_id = "rbbt_table_columns_" << (rand * 1000).to_i.to_s
2
+ %li.table_column
3
+ = reveal :column do
4
+ %ul.table_column_selector.clean_list
5
+ - header.each do |field|
6
+ %li
7
+ %span.field= field
8
+ %a.save_column_map(href="#") save map
9
+ - if Entity.formats.include? field and Entity.formats[field].include? Entity::REST
10
+ %a.save_column_list(href="#") save list
@@ -0,0 +1,4 @@
1
+ %li.tsv
2
+ %a(href="#{add_GET_param(table_url, "_format", "tsv")}") tsv
3
+ %li.excel
4
+ %a(href="#{add_GET_param(table_url, "_format", "excel")}") excel
@@ -0,0 +1,11 @@
1
+ %li.filter
2
+ = reveal :filter, id do
3
+ - if @filter
4
+ - filter_values = Hash[*@filter.split(";;").collect{|f| f.split("~")}.flatten]
5
+ - else
6
+ - filter_values = {}
7
+
8
+ .filters()
9
+ = action_parameters nil, :class => 'filter_controls' do
10
+ - header.each do |field|
11
+ - input field, :string, "Filter for #{ field }", filter_values[field]
@@ -0,0 +1,37 @@
1
+ - num, size, field = parse_page(page)
2
+ - num = num.to_i
3
+ - total_nums = total_size.to_i / size.to_i
4
+ - total_nums += 1 if total_size.to_i % size.to_i > 0
5
+ - start = [1, num - 2].max
6
+ - eend = [total_nums, num + 2].min
7
+ %ul.table_pagination.pagination
8
+ %li(class="arrow")
9
+ %a.prev(href="#") &laquo;
10
+
11
+ - if num - 2 > 1
12
+ %li(class="num")
13
+ %a(href="#") 1
14
+
15
+ - if num - 2 > 2
16
+ %li(class="inactive")
17
+ %a(href="#") ...
18
+
19
+ - (start..eend).each do |p|
20
+ %li(class="num#{p.to_s == num.to_s ? " active" : "" }")
21
+ %a(href="#")= p
22
+
23
+ - if num + 3 < total_nums
24
+ %li(class="inactive")
25
+ %a(href="#") ...
26
+
27
+ - if num + 2 < total_nums
28
+ %li(class="num")
29
+ %a(href="#")= total_nums
30
+
31
+ %li(class="arrow")
32
+ %a.next(href="#") &raquo;
33
+
34
+ %li(class="all")
35
+ %a.all(href="#") all
36
+
37
+
Binary file
@@ -1,5 +1,38 @@
1
1
  var reload_seconds_for_try = {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 7, 6: 7, 7: 7, 8: 7, 9: 7, 10: 30, 11: 30, 12: 60, 13: 120, 14: 120, 15: 120, 16: "STOP"}
2
2
 
3
+ var ajax_processes = []
4
+ function update_ajax_counter(){
5
+ $('#ajax_processes').html(ajax_processes.length)
6
+ }
7
+ function add_ajax(url){
8
+ ajax_processes.push(url)
9
+ update_ajax_counter();
10
+ }
11
+
12
+ function remove_ajax(url){
13
+ ajax_processes.splice( $.inArray(url, ajax_processes), 1 );
14
+ update_ajax_counter();
15
+ }
16
+
17
+ $.old_ajax = $.ajax;
18
+ $.ajax = function(url, options){
19
+ if (typeof url == 'string'){
20
+ options['url'] = url;
21
+ }else{
22
+ options = url;
23
+ url = options['url'];
24
+ }
25
+
26
+ add_ajax(url);
27
+
28
+ complete = options['complete'];
29
+ if (undefined === complete){ options['complete'] = function(){ remove_ajax(url)} }
30
+ if (typeof complete == 'function'){ options['complete'] = [complete, function(){ remove_ajax(url)}] }
31
+ if (typeof complete == 'array'){ options['complete'].push(function(){ remove_ajax(url)}) }
32
+
33
+ return $.old_ajax(options);
34
+ }
35
+
3
36
  function reload_time(object){
4
37
  var tries = object.attr('reload-attempts');
5
38
  if (undefined === tries){ tries = 0 };
@@ -11,9 +44,42 @@ function reload_time(object){
11
44
  return reload_seconds_for_try[tries];
12
45
  }
13
46
 
47
+ function get_ajax(options, complete){
48
+ options.success = function( data, stat, req ) {
49
+ if (req.status == 202){
50
+ href = options.url
51
+ href = remove_parameter(href, '_update');
52
+ href = remove_parameter(href, '_');
53
+ options.url = href
54
+ window.setTimeout(function(){ get_ajax(options, complete)}, 3 * 1000);
55
+ }else{
56
+ if (undefined !== complete){
57
+ return complete(data)
58
+ }else{
59
+ return(data)
60
+ }
61
+ }
62
+ }
63
+
64
+ console.log(options.data)
65
+ response = $.ajax(options)
66
+ if (undefined !== response.responseText){
67
+ if (response.status == 202){
68
+ href = options.url
69
+ href = remove_parameter(href, '_update');
70
+ href = remove_parameter(href, '_');
71
+ options.url = href
72
+ return get_ajax(options, complete);
73
+ }else{
74
+ return response.responseText;
75
+ }
76
+ }else{
77
+ return response;
78
+ }
79
+ }
80
+
14
81
  function replace_object(object, href, embedd, complete){
15
82
  if (embedd === undefined){ embedd = false; }
16
- //if (complete === undefined){ complete = []; }
17
83
 
18
84
  $.ajax({
19
85
  url : href,
@@ -24,7 +90,9 @@ function replace_object(object, href, embedd, complete){
24
90
  href = remove_parameter(href, '_update');
25
91
  href = remove_parameter(href, '_');
26
92
  error_span = $('<span>').html(error).addClass('error')
27
- object.removeClass("reloading").addClass("error").css('height', 0).html(error_span).css('height', 'auto').attr('target-href', href);
93
+ error_message = $(req.responseText).find('span.error_message')
94
+ error = $('<div>').append(error_span).append(error_message)
95
+ object.removeClass("reloading").addClass("error").css('height', 0).html(error).css('height', 'auto').attr('target-href', href);
28
96
  },
29
97
  success: function( data, stat, req ) {
30
98
  object.removeClass('error');
@@ -42,8 +110,12 @@ function replace_object(object, href, embedd, complete){
42
110
  }else{
43
111
  object.removeClass("reloading").attr('reload-attempts', 0);
44
112
  if (embedd){
45
- href = remove_parameter(href, '_update');
46
- href = remove_parameter(href, '_');
113
+ if (undefined !== req.getResponseHeader("URI")){
114
+ href = req.getResponseHeader("URI")
115
+ }else{
116
+ href = remove_parameter(href, '_update');
117
+ href = remove_parameter(href, '_');
118
+ }
47
119
  object.html(data).addClass("embedded").attr('target-href', href);
48
120
  capture_embedded_form(object);
49
121
  update_rbbt();