caboose-cms 0.3.129 → 0.4.1

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 (72) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/admin_block_edit.js +267 -0
  3. data/app/assets/javascripts/caboose/admin_page_edit_content.js +71 -45
  4. data/app/assets/javascripts/caboose/admin_page_edit_content_bak.js +164 -0
  5. data/app/assets/javascripts/caboose/admin_page_new_blocks.js +4 -4
  6. data/app/assets/stylesheets/caboose/admin_page_edit_content.css +37 -16
  7. data/app/controllers/caboose/block_types_controller.rb +162 -0
  8. data/app/controllers/caboose/blocks_controller.rb +293 -0
  9. data/app/controllers/caboose/edit_controller.rb +33 -0
  10. data/app/controllers/caboose/pages_controller.rb +4 -3
  11. data/app/controllers/caboose/posts_controller.rb +1 -1
  12. data/app/models/caboose/block.rb +222 -0
  13. data/app/models/caboose/block_type.rb +28 -0
  14. data/app/models/caboose/core_plugin.rb +6 -6
  15. data/app/models/caboose/page.rb +8 -4
  16. data/app/models/caboose/schema.rb +90 -59
  17. data/app/models/caboose/utilities/schema.rb +3 -3
  18. data/app/views/caboose/block_types/admin_edit.html.erb +111 -0
  19. data/app/views/caboose/{page_block_types → block_types}/admin_index.html.erb +2 -2
  20. data/app/views/caboose/{page_block_types → block_types}/admin_new.html.erb +9 -6
  21. data/app/views/caboose/blocks/_block.html.erb +8 -0
  22. data/app/views/caboose/blocks/_heading.html.erb +7 -0
  23. data/app/views/caboose/blocks/_html.html.erb +7 -0
  24. data/app/views/caboose/blocks/_image.html.erb +0 -0
  25. data/app/views/caboose/blocks/_layout_default.html.erb +33 -0
  26. data/app/views/caboose/blocks/_layout_default_content.html.erb +16 -0
  27. data/app/views/caboose/blocks/_layout_default_footer.html.erb +20 -0
  28. data/app/views/caboose/blocks/_layout_default_header.html.erb +32 -0
  29. data/app/views/caboose/blocks/_richtext.html.erb +7 -0
  30. data/app/views/caboose/{page_blocks/_richtext.html.erb → blocks/_text.html.erb} +1 -2
  31. data/app/views/caboose/blocks/admin_edit.html.erb +106 -0
  32. data/app/views/caboose/{page_blocks → blocks}/admin_edit_custom.html.erb +0 -0
  33. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h1.html.erb +0 -0
  34. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h2.html.erb +0 -0
  35. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h3.html.erb +0 -0
  36. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h4.html.erb +0 -0
  37. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h5.html.erb +0 -0
  38. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h6.html.erb +0 -0
  39. data/app/views/caboose/{page_blocks → blocks}/admin_edit_richtext.html.erb +0 -0
  40. data/app/views/caboose/blocks/admin_new.html.erb +55 -0
  41. data/app/views/caboose/pages/_admin_header.html.erb +1 -1
  42. data/app/views/caboose/pages/_content.html.erb +1 -1
  43. data/app/views/caboose/pages/_new_block_header.html.erb +13 -0
  44. data/app/views/caboose/pages/admin_edit_content.html.erb +24 -20
  45. data/app/views/caboose/pages/show.html.erb +13 -30
  46. data/app/views/layouts/caboose/application.html.erb +26 -14
  47. data/config/routes.rb +38 -30
  48. data/lib/caboose/engine.rb +2 -2
  49. data/lib/caboose/version.rb +1 -1
  50. metadata +33 -35
  51. data/app/controllers/caboose/page_block_field_values_controller.rb +0 -55
  52. data/app/controllers/caboose/page_block_fields_controller.rb +0 -123
  53. data/app/controllers/caboose/page_block_types_controller.rb +0 -100
  54. data/app/controllers/caboose/page_blocks_controller.rb +0 -165
  55. data/app/models/caboose/page_block.rb +0 -49
  56. data/app/models/caboose/page_block_field.rb +0 -21
  57. data/app/models/caboose/page_block_field_value.rb +0 -39
  58. data/app/models/caboose/page_block_renderers/h1.rb +0 -5
  59. data/app/models/caboose/page_block_renderers/h2.rb +0 -5
  60. data/app/models/caboose/page_block_renderers/h3.rb +0 -5
  61. data/app/models/caboose/page_block_renderers/h4.rb +0 -5
  62. data/app/models/caboose/page_block_renderers/h5.rb +0 -5
  63. data/app/models/caboose/page_block_renderers/h6.rb +0 -5
  64. data/app/models/caboose/page_block_renderers/p.rb +0 -5
  65. data/app/models/caboose/page_block_renderers/richtext.rb +0 -5
  66. data/app/models/caboose/page_block_type.rb +0 -12
  67. data/app/views/caboose/page_block_fields/admin_edit.html.erb +0 -77
  68. data/app/views/caboose/page_block_fields/admin_new.html.erb +0 -30
  69. data/app/views/caboose/page_block_types/admin_edit.html.erb +0 -82
  70. data/app/views/caboose/page_blocks/_heading.html.erb +0 -7
  71. data/app/views/caboose/page_blocks/_partial.html.erb +0 -11
  72. data/app/views/caboose/page_blocks/admin_edit.html.erb +0 -69
@@ -1,21 +0,0 @@
1
-
2
- class Caboose::PageBlockField < ActiveRecord::Base
3
- self.table_name = "page_block_fields"
4
-
5
- belongs_to :page_block_type
6
- has_many :page_block_field_values, :dependent => :destroy
7
- attr_accessible :id,
8
- :page_block_type_id,
9
- :name, :field_type,
10
- :nice_name, :default,
11
- :width, :height,
12
- :fixed_placeholder,
13
- :options,
14
- :options_function,
15
- :options_url
16
-
17
- def render_options(empty_text = nil)
18
- return eval(self.options_function)
19
- end
20
-
21
- end
@@ -1,39 +0,0 @@
1
-
2
- class Caboose::PageBlockFieldValue < ActiveRecord::Base
3
- self.table_name = "page_block_field_values"
4
-
5
- belongs_to :page_block
6
- belongs_to :page_block_field
7
-
8
- has_attached_file :file, :path => '/uploads/:id.:extension'
9
- do_not_validate_attachment_file_type :file
10
- has_attached_file :image,
11
- :path => 'uploads/:id_:style.:extension',
12
- :styles => {
13
- :tiny => '160x120>',
14
- :thumb => '400x300>',
15
- :large => '640x480>'
16
- }
17
- do_not_validate_attachment_file_type :image
18
-
19
- attr_accessible :id, :page_block_id, :page_block_field_id, :value
20
-
21
- after_initialize do |fv|
22
- # Do whatever we need to do to set the value to be correct for the field type we have.
23
- # Most field types are fine with the raw value in the database
24
- case fv.page_block_field.field_type
25
- when 'checkbox' then fv.value = (fv.value == 1 || fv.value == '1' || fv.value == true ? true : false)
26
- end
27
- end
28
-
29
- before_save :caste_value
30
- def caste_value
31
- case self.page_block_field.field_type
32
- when 'checkbox'
33
- if self.value.nil? then self.value = false
34
- else self.value = (self.value == 1 || self.value == '1' || self.value == true ? 1 : 0)
35
- end
36
- end
37
- end
38
-
39
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::H1
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<h1>#{empty_text}</h1>" : "<h1>#{block.value}</h1>"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::H2
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<h2>#{empty_text}</h2>" : "<h2>#{block.value}</h2>"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::H3
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<h3>#{empty_text}</h3>" : "<h3>#{block.value}</h3>"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::H4
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<h4>#{empty_text}</h4>" : "<h4>#{block.value}</h4>"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::H5
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<h5>#{empty_text}</h5>" : "<h5>#{block.value}</h5>"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::H6
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<h6>#{empty_text}</h6>" : "<h6>#{block.value}</h6>"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::P
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<p>#{empty_text}</p>" : block.value
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class Caboose::PageBlockRenderers::Richtext
2
- def self.render(block, empty_text = nil)
3
- return (block.value.nil? || block.value == "") && empty_text ? "<p>#{empty_text}</p>" : "<p>#{block.value}</p>"
4
- end
5
- end
@@ -1,12 +0,0 @@
1
-
2
- class Caboose::PageBlockType < ActiveRecord::Base
3
- self.table_name = "page_block_types"
4
-
5
- has_many :page_block_fields, :dependent => :destroy
6
- attr_accessible :id, :name, :description, :use_render_function, :render_function
7
-
8
- def fields
9
- return page_block_fields
10
- end
11
-
12
- end
@@ -1,77 +0,0 @@
1
- <%
2
- block_type_id = @field.page_block_type.id
3
- %>
4
-
5
- <h1>Edit Page Block Field</h1>
6
- <div id='pageblockfield_<%= @field.id %>_name'></div>
7
- <div id='pageblockfield_<%= @field.id %>_nice_name'></div>
8
- <div id='pageblockfield_<%= @field.id %>_field_type'></div>
9
- <div id='pageblockfield_<%= @field.id %>_default'></div>
10
- <div id='pageblockfield_<%= @field.id %>_width'></div>
11
- <div id='pageblockfield_<%= @field.id %>_height'></div>
12
- <div id='pageblockfield_<%= @field.id %>_fixed_placeholder'></div>
13
- <div id='pageblockfield_<%= @field.id %>_options_url'></div>
14
- <div id='pageblockfield_<%= @field.id %>_options_function'></div>
15
- <div id='pageblockfield_<%= @field.id %>_options'></div>
16
- <br />
17
-
18
- <div id='message'></div>
19
- <p>
20
- <input type='button' value='< Back' onclick="window.location='/admin/page-block-types/<%= block_type_id %>/edit';" />
21
- <input type='button' value='Delete Field' onclick="delete_field(<%= @field.id %>);" />
22
- </p>
23
-
24
- <% content_for :caboose_css do %>
25
- <style type='text/css'>
26
- #pageblockfield_<%= @field.id %>_options_function { font-family: Courier; font-size: 80%; }
27
- </style>
28
- <% end %>
29
- <% content_for :caboose_js do %>
30
- <%= javascript_include_tag "caboose/model/all" %>
31
- <script type="text/javascript">
32
-
33
- function delete_field(field_id, confirm)
34
- {
35
- if (!confirm)
36
- {
37
- var p = $('<p/>').addClass('note warning')
38
- .append('Are you sure you want to delete the field? ')
39
- .append($('<input/>').attr('type', 'button').val('Yes').click(function() { delete_field(field_id, true); })).append(" ")
40
- .append($('<input/>').attr('type', 'button').val('No' ).click(function() { $('#message').empty(); }));
41
- $('#message').empty().append(p);
42
- return;
43
- }
44
- $('#message').empty().append($('<p/>').addClass('loading').html('Deleting field...'));
45
- $.ajax({
46
- url: '/admin/page-block-types/<%= block_type_id %>/fields/' + field_id,
47
- type: 'delete',
48
- success: function(resp) {
49
- if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
50
- if (resp.redirect) window.location = resp.redirect;
51
- }
52
- });
53
- }
54
-
55
- $(document).ready(function() {
56
- m = new ModelBinder({
57
- name: 'PageBlockField',
58
- id: <%= @field.id %>,
59
- update_url: '/admin/page-block-types/<%= @field.page_block_type.id %>/fields/<%= @field.id %>',
60
- authenticity_token: '<%= form_authenticity_token %>',
61
- attributes: [
62
- { name: 'name' , nice_name: 'Short name' , type: 'text' , value: <%= raw Caboose.json(@field.name) %>, width: 400 },
63
- { name: 'nice_name' , nice_name: 'Long name' , type: 'text' , value: <%= raw Caboose.json(@field.nice_name) %>, width: 400 },
64
- { name: 'field_type' , nice_name: 'Field type' , type: 'select' , value: <%= raw Caboose.json(@field.field_type) %>, text: <%= raw Caboose.json(@field.field_type) %>, width: 400, options_url: '/admin/page-block-fields/field-type-options' },
65
- { name: 'default' , nice_name: 'Default value' , type: 'text' , value: <%= raw Caboose.json(@field.default) %>, width: 400 },
66
- { name: 'width' , nice_name: 'Width' , type: 'text' , value: <%= raw Caboose.json(@field.width) %>, width: 400 },
67
- { name: 'height' , nice_name: 'Height' , type: 'text' , value: <%= raw Caboose.json(@field.height) %>, width: 400 },
68
- { name: 'fixed_placeholder' , nice_name: 'Fixed placeholder' , type: 'checkbox' , value: <%= raw Caboose.json(@field.fixed_placeholder) %>, width: 400 },
69
- { name: 'options_url' , nice_name: 'Options URL' , type: 'text' , value: <%= raw Caboose.json(@field.options_url) %>, width: 400 },
70
- { name: 'options_function' , nice_name: 'Options Function' , type: 'textarea' , value: <%= raw Caboose.json(@field.options_function) %>, width: 400, height: 100 },
71
- { name: 'options' , nice_name: 'Options' , type: 'textarea' , value: <%= raw Caboose.json(@field.options) %>, width: 400, height: 100 }
72
- ]
73
- });
74
- });
75
-
76
- </script>
77
- <% end %>
@@ -1,30 +0,0 @@
1
-
2
- <h1>New Field</h1>
3
- <p><input type='text' id='name' name='name' placeholder='Field name' /></p>
4
- <div id='message'></div>
5
- <p>
6
- <input type='button' value='< Back' onclick="window.location='/admin/page-block-types/<%= @block_type.id %>/edit';" />
7
- <input type='button' value='Add Field' onclick="add_field();" />
8
- </p>
9
-
10
- <% content_for :caboose_js do %>
11
- <script type='text/javascript'>
12
-
13
- function add_field()
14
- {
15
- $('#message').empty().append($('<p/>').addClass('loading').html('Adding field...'));
16
- $.ajax({
17
- url: '/admin/page-block-types/<%= @block_type.id %>/fields',
18
- type: 'post',
19
- data: {
20
- name: $('#name').val()
21
- },
22
- success: function(resp) {
23
- if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
24
- if (resp.redirect) window.location = resp.redirect;
25
- }
26
- });
27
- }
28
-
29
- </script>
30
- <% end %>
@@ -1,82 +0,0 @@
1
-
2
- <h1>Edit Page Block Type</h1>
3
- <div id='pageblocktype_<%= @block_type.id %>_name'></div>
4
- <div id='pageblocktype_<%= @block_type.id %>_description'></div>
5
- <div id='pageblocktype_<%= @block_type.id %>_use_render_function'></div>
6
- <div id='pageblocktype_<%= @block_type.id %>_render_function'></div>
7
-
8
- <h2>Fields</h2>
9
- <p><a href='/admin/page-block-types/<%= @block_type.id %>/fields/new'>New Field</a></p>
10
- <% if @block_type.fields.count > 0 %>
11
- <table class='data'>
12
- <tr>
13
- <th>Short Name</th>
14
- <th>Long Name</th>
15
- <th>Field Type</th>
16
- </tr>
17
- <% @block_type.fields.each do |f| %>
18
- <tr onclick="window.location='/admin/page-block-types/<%= @block_type.id %>/fields/<%= f.id %>/edit';">
19
- <td><%= f.name %></td>
20
- <td><%= f.nice_name %></td>
21
- <td><%= f.field_type %></td>
22
- </tr>
23
- <% end %>
24
- </table><br />
25
- <% else %>
26
- <p>This type of page block doesn't have any fields.</p>
27
- <% end %>
28
-
29
- <div id='message'></div>
30
- <p>
31
- <input type='button' value='< Back' onclick="window.location='/admin/page-block-types';" />
32
- <input type='button' value='Delete Block Type' onclick="delete_block_type(<%= @block_type.id %>);" />
33
- </p>
34
-
35
- <% content_for :caboose_css do %>
36
- <style type='text/css'>
37
- #pageblocktype_<%= @block_type.id %>_render_function { font-family: Courier; font-size: 80%; }
38
- </style>
39
- <% end %>
40
- <% content_for :caboose_js do %>
41
- <%= javascript_include_tag "caboose/model/all" %>
42
- <script type="text/javascript">
43
-
44
- function delete_block_type(block_type_id, confirm)
45
- {
46
- if (!confirm)
47
- {
48
- var p = $('<p/>').addClass('note warning')
49
- .append('Are you sure you want to delete the block type? ')
50
- .append($('<input/>').attr('type', 'button').val('Yes').click(function() { delete_block_type(block_type_id, true); })).append(" ")
51
- .append($('<input/>').attr('type', 'button').val('No' ).click(function() { $('#message').empty(); }));
52
- $('#message').empty().append(p);
53
- return;
54
- }
55
- $('#message').empty().append($('<p/>').addClass('loading').html('Deleting block type...'));
56
- $.ajax({
57
- url: '/admin/page-block-types/' + block_type_id,
58
- type: 'delete',
59
- success: function(resp) {
60
- if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
61
- if (resp.redirect) window.location = resp.redirect;
62
- }
63
- });
64
- }
65
-
66
- $(document).ready(function() {
67
- m = new ModelBinder({
68
- name: 'PageBlockType',
69
- id: <%= @block_type.id %>,
70
- update_url: '/admin/page-block-types/<%= @block_type.id %>',
71
- authenticity_token: '<%= form_authenticity_token %>',
72
- attributes: [
73
- { name: 'name' , nice_name: 'Name' , type: 'text' , value: <%= raw Caboose.json(@block_type.name) %> , width: 400 },
74
- { name: 'description' , nice_name: 'Description' , type: 'text' , value: <%= raw Caboose.json(@block_type.description) %> , width: 400 },
75
- { name: 'use_render_function' , nice_name: 'Use Render Function' , type: 'checkbox' , value: <%= @block_type.use_render_function ? 'true' : 'false' %> , width: 400 },
76
- { name: 'render_function' , nice_name: 'Render Function' , type: 'textarea' , value: <%= raw Caboose.json(@block_type.render_function) %> , width: 800, height: 200 }
77
- ]
78
- });
79
- });
80
-
81
- </script>
82
- <% end %>
@@ -1,7 +0,0 @@
1
- <%
2
- size = block.field_value('size')
3
- text = block.field_value('text')
4
- size = 1 if size.nil?
5
- text = (empty_text ? empty_text : "") if text.nil? || text == ""
6
-
7
- %><h<%= size %>><%= raw text %></h<%= size %>>
@@ -1,11 +0,0 @@
1
- <%
2
- partial = block.field_value('partial')
3
- %><% if editing %>
4
- <% if partial.nil? || partial.strip.length == 0 %>
5
- <p>Empty partial, click to edit.</p>
6
- <% else %>
7
- <p>Partial <%= partial %>, click to edit.</p>
8
- <% end %>
9
- <% elsif !partial.nil? && partial.strip.length > 0 %>
10
- <%= render partial %>
11
- <% end %>
@@ -1,69 +0,0 @@
1
- <%
2
- update_on_close = false
3
- @block.page_block_type.fields.each do |f|
4
- update_on_close = true if f.field_type == 'image' || f.field_type == 'file'
5
- end
6
- %>
7
- <h2 style='margin-top: 0; padding-top: 0;'>Edit <%= @block.page_block_type.description %></h2>
8
- <% @block.page_block_type.fields.each do |f| %>
9
- <% fv = @block.field_value_object(f.name) %>
10
- <div id='pageblockfieldvalue_<%= fv.id %>_value'></div>
11
- <% end %>
12
- <p><input type='button' value='Close' onclick="<% if update_on_close %>parent.controller.render_blocks();<% end %>modal.close();" /></p>
13
-
14
- <% content_for :caboose_js do %>
15
- <%= javascript_include_tag "caboose/model/all" %>
16
- <script type='text/javascript'>
17
-
18
- var modal = false;
19
- $(window).load(function() {
20
- modal = new CabooseModal(800);
21
- });
22
-
23
- $(document).ready(function() {
24
- <% use_tinymce = false %>
25
- <% @block.page_block_type.fields.each do |f| %>
26
- <% fv = @block.field_value_object(f.name) %>
27
- <% use_tinymce = true if f.field_type == 'richtext' %>
28
- m = new ModelBinder({
29
- name: 'PageBlockFieldValue',
30
- id: <%= fv.id %>,
31
- update_url: '/admin/page-block-field-values/<%= fv.id %>',
32
- authenticity_token: '<%= form_authenticity_token %>',
33
- attributes: [{
34
- name: 'value',
35
- type: <%= raw Caboose.json(f.field_type) %>,
36
- value: <%
37
- if f.field_type == 'checkbox' %><%= fv.value ? 'true' : 'false' %><%
38
- elsif f.field_type == 'image' %><%= raw Caboose.json(fv.image.url(:tiny)) %><%
39
- elsif f.field_type == 'file' %><%= raw Caboose.json(fv.image.url) %><%
40
- else %><%= raw Caboose.json(fv.value) %><%
41
- end %>,
42
- <% if f.field_type == 'select' %>text: <%= raw Caboose.json(fv.value) %>,<% end %>
43
- nice_name: <%= raw Caboose.json(f.nice_name ? f.nice_name : f.name) %>,
44
- width: <% if f.width %><%= raw Caboose.json(f.width) %><% else %>780<% end %>,
45
- <% if f.height %>height: <%= raw Caboose.json(f.height) %>,<% end %>
46
- <% if f.fixed_placeholder %>fixed_placeholder: <%= raw Caboose.json(f.fixed_placeholder) %>,<% end %>
47
- <% if f.options || f.options_function %>options_url: '/admin/page-block-fields/<%= f.id %>/options',<%
48
- elsif f.options_url %>options_url: <%= raw Caboose.json(f.options_url) %>,<% end %>
49
- <% if f.field_type == 'image' %>update_url: '/admin/page-block-field-values/<%= fv.id %>/image',
50
- image_refresh_delay: 100,
51
- <% end %>
52
- <% if f.field_type == 'file' %>update_url: '/admin/page-block-field-values/<%= fv.id %>/file',<% end %>
53
- after_update: function() { parent.controller.render_blocks(); },
54
- after_cancel: function() { parent.controller.render_blocks(); }
55
- }]
56
- });
57
- <% end %>
58
- });
59
-
60
- </script>
61
- <% if use_tinymce %>
62
- <%= tinymce_assets %>
63
- <script type='textjavascript'>
64
- document.domain = "<%= Rails.application.config.action_controller.asset_host %>";
65
- </script>
66
- <%= tinymce :caboose, width: '800px', height:'300px' %>
67
- <% end %>
68
- <% end %>
69
-