rbbt-rest 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
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();