refinerycms-llama_widgets 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/app/assets/images/refinery/icons/lock.png +0 -0
  2. data/app/assets/images/refinery/itoggle.png +0 -0
  3. data/app/assets/javascripts/refinery/engage.itoggle-min.js +17 -0
  4. data/app/assets/javascripts/refinery/widgets.js.coffee.erb +91 -0
  5. data/app/assets/stylesheets/refinery/engage.itoggle.css +94 -0
  6. data/app/assets/stylesheets/refinery/widgets.scss +89 -0
  7. data/app/controllers/refinery/widgets/admin/templates_controller.rb +28 -0
  8. data/app/controllers/refinery/widgets/admin/widget_types_controller.rb +59 -0
  9. data/app/controllers/refinery/widgets/admin/widgets_controller.rb +30 -0
  10. data/app/decorators/controllers/refinery/admin/pages_controller.rb +23 -0
  11. data/app/decorators/controllers/refinery/pages_controller.rb +13 -0
  12. data/app/decorators/models/refinery/page.rb +28 -0
  13. data/app/decorators/models/refinery/page_part.rb +16 -0
  14. data/app/helpers/refinery/widgets/widgets_helper.rb +38 -0
  15. data/app/models/refinery/widgets/content_block_widget.rb +13 -0
  16. data/app/models/refinery/widgets/template.rb +64 -0
  17. data/app/models/refinery/widgets/template_part.rb +37 -0
  18. data/app/models/refinery/widgets/widget.rb +108 -0
  19. data/app/overrides/refinery/admin/pages/_actions.rb +5 -0
  20. data/app/overrides/refinery/admin/pages/_form.rb +4 -0
  21. data/app/overrides/refinery/admin/pages/_form_page_parts.rb +5 -0
  22. data/app/overrides/refinery/admin/pages/_page.rb +5 -0
  23. data/app/views/refinery/admin/_image_picker.html.erb +66 -0
  24. data/app/views/refinery/admin/_nested_image_picker.html.erb +58 -0
  25. data/app/views/refinery/admin/pages/_form_page_parts.html.erb +37 -0
  26. data/app/views/refinery/admin/pages/_page_part.slim +25 -0
  27. data/app/views/refinery/admin/pages/_widget_fields.slim +46 -0
  28. data/app/views/refinery/widgets/_content_block_widget.slim +2 -0
  29. data/app/views/refinery/widgets/_widget.slim +1 -0
  30. data/app/views/refinery/widgets/admin/templates/_actions.html.erb +25 -0
  31. data/app/views/refinery/widgets/admin/templates/_form.html.erb +17 -0
  32. data/app/views/refinery/widgets/admin/templates/_page_part.slim +22 -0
  33. data/app/views/refinery/widgets/admin/templates/_page_parts.html.erb +37 -0
  34. data/app/views/refinery/widgets/admin/templates/_records.html.erb +16 -0
  35. data/app/views/refinery/widgets/admin/templates/_sortable_list.html.erb +5 -0
  36. data/app/views/refinery/widgets/admin/templates/_template.html.erb +18 -0
  37. data/app/views/refinery/widgets/admin/templates/_templates.html.erb +2 -0
  38. data/app/views/refinery/widgets/admin/templates/_widget_fields.slim +26 -0
  39. data/app/views/refinery/widgets/admin/templates/edit.html.erb +1 -0
  40. data/app/views/refinery/widgets/admin/templates/index.html.erb +7 -0
  41. data/app/views/refinery/widgets/admin/templates/list.slim +15 -0
  42. data/app/views/refinery/widgets/admin/templates/new.html.erb +1 -0
  43. data/app/views/refinery/widgets/admin/widget_types/new_for_page.slim +4 -0
  44. data/app/views/refinery/widgets/admin/widget_types/new_for_template.slim +4 -0
  45. data/app/views/refinery/widgets/admin/widget_types/show_for_page.slim +4 -0
  46. data/app/views/refinery/widgets/admin/widget_types/show_for_template.slim +4 -0
  47. data/app/views/refinery/widgets/admin/widgets/_content_block_widget.slim +3 -0
  48. data/app/views/refinery/widgets/admin/widgets/_content_block_widget_preview.slim +3 -0
  49. data/app/views/refinery/widgets/admin/widgets/_widget.slim +2 -0
  50. data/app/views/refinery/widgets/admin/widgets/_widget_preview.slim +2 -0
  51. data/app/views/refinery/widgets/admin/widgets/new.slim +31 -0
  52. data/config/locales/cs.yml +27 -0
  53. data/config/locales/en.yml +34 -0
  54. data/config/locales/es.yml +28 -0
  55. data/config/locales/fr.yml +27 -0
  56. data/config/locales/it.yml +27 -0
  57. data/config/locales/nb.yml +27 -0
  58. data/config/locales/nl.yml +27 -0
  59. data/config/locales/sk.yml +27 -0
  60. data/config/locales/tr.yml +27 -0
  61. data/config/locales/zh-CN.yml +29 -0
  62. data/config/routes.rb +29 -0
  63. data/db/migrate/1_create_widgets_templates.rb +22 -0
  64. data/db/migrate/2_create_widgets_template_parts.rb +20 -0
  65. data/db/migrate/3_create_widgets_widgets.rb +24 -0
  66. data/db/migrate/4_create_widgets_content_block_widgets.rb +16 -0
  67. data/db/migrate/5_add_template_id_to_refinery_pages.rb +13 -0
  68. data/db/migrate/6_add_locked_to_refinery_page_parts.rb +13 -0
  69. data/db/seeds.rb +24 -0
  70. data/lib/generators/refinery/templates/config/initializers/refinery/widgets.rb.erb +7 -0
  71. data/lib/generators/refinery/widgets_generator.rb +27 -0
  72. data/lib/refinery/widgets.rb +24 -0
  73. data/lib/refinery/widgets/acts_as_widget.rb +31 -0
  74. data/lib/refinery/widgets/configuration.rb +15 -0
  75. data/lib/refinery/widgets/engine.rb +39 -0
  76. data/lib/refinery/widgets/widget_type.rb +31 -0
  77. data/lib/refinerycms-widgets.rb +4 -0
  78. data/lib/tasks/refinery/widgets.rake +26 -0
  79. metadata +202 -0
@@ -0,0 +1,17 @@
1
+ /*---------------
2
+ * jQuery iToggle Plugin by Engage Interactive
3
+ * Examples and documentation at: http://labs.engageinteractive.co.uk/itoggle/
4
+ * Copyright (c) 2009 Engage Interactive
5
+ * Version: 1.0 (10-JUN-2009)
6
+ * Dual licensed under the MIT and GPL licenses:
7
+ * http://www.opensource.org/licenses/mit-license.php
8
+ * http://www.gnu.org/licenses/gpl.html
9
+ * Requires: jQuery v1.3 or later
10
+ ---------------*/
11
+
12
+ (function($){$.fn.iToggle=function(options){clickEnabled=true;var defaults={type:'checkbox',keepLabel:true,easing:false,speed:200,onClick:function(){},onClickOn:function(){},onClickOff:function(){},onSlide:function(){},onSlideOn:function(){},onSlideOff:function(){}},settings=$.extend({},defaults,options);this.each(function(){var $this=$(this);if($this.attr('tagName')=='INPUT'){var id=$this.attr('id');label(settings.keepLabel,id);$this.addClass('iT_checkbox').before('<label class="itoggle" for="'+id+'"><span></span></label>');if($this.attr('checked')){$this.prev('label').addClass('iTon');}else{$this.prev('label').addClass('iToff');}}else{$this.children('input:'+settings.type).each(function(){var id=$(this).attr('id');label(settings.keepLabel,id);$(this).addClass('iT_checkbox').before('<label class="itoggle" for="'+id+'"><span></span></label>');if($(this).attr('checked')){$(this).prev('label').addClass('iTon');}else{$(this).prev('label').addClass('iToff');}
13
+ if(settings.type=='radio'){$(this).prev('label').addClass('iT_radio');}});}});function label(e,id){if(e==true){if(settings.type=='radio'){$('label[for='+id+']').addClass('ilabel_radio');}else{$('label[for='+id+']').addClass('ilabel');}}else{$('label[for='+id+']').remove();}}
14
+ $('label.itoggle').click(function(){if(clickEnabled==true){clickEnabled=false;if($(this).hasClass('iT_radio')){if($(this).hasClass('iTon')){clickEnabled=true;}else{slide($(this),true);}}else{slide($(this));}}
15
+ return false;});$('label.ilabel').click(function(){if(clickEnabled==true){clickEnabled=false;slide($(this).next('label.itoggle'));}
16
+ return false;});function slide($object,radio){settings.onClick.call($object);h=$object.innerHeight();t=$object.attr('for');if($object.hasClass('iTon')){settings.onClickOff.call($object);$object.animate({backgroundPosition:'100% -'+h+'px'},settings.speed,settings.easing,function(){$object.removeClass('iTon').addClass('iToff');clickEnabled=true;settings.onSlide.call(this);settings.onSlideOff.call(this);});$('input#'+t).removeAttr('checked');}else{settings.onClickOn.call($object);$object.animate({backgroundPosition:'0% -'+h+'px'},settings.speed,settings.easing,function(){$object.removeClass('iToff').addClass('iTon');clickEnabled=true;settings.onSlide.call(this);settings.onSlideOn.call(this);});$('input#'+t).attr('checked','checked');}
17
+ if(radio==true){name=$('#'+t).attr('name');slide($object.siblings('label[for]'));}}};})(jQuery);
@@ -0,0 +1,91 @@
1
+ jQuery ->
2
+ if $('#new_widget #widget_type').length > 0
3
+ $('#new_widget #widget_type.template').change (event) ->
4
+ selected = $(this).val()
5
+ if selected != ''
6
+ activePart = window.parent.$('li.ui-tabs-active').attr('aria-controls')
7
+ index = window.parent.$('#template_part_index_' + activePart).attr('data-index')
8
+ data = {sub_type: selected, index: index}
9
+ url = '/<%= Refinery::Core.backend_route %>/widgets/widget_types/new_for_template'
10
+ $.ajax({url: url, data: data}).done (data) ->
11
+ target = window.parent.$("a#add_widget_" + activePart)
12
+ $(data).insertBefore(target)
13
+ window.parent.initWidgets()
14
+ window.parent.refinery_dialog_success()
15
+ $('#new_widget #widget_type.page').change (event) ->
16
+ selected = $(this).val()
17
+ if selected != ''
18
+ activePart = window.parent.$('li.ui-tabs-active').attr('aria-controls')
19
+ index = window.parent.$('#template_part_index_' + activePart).attr('data-index')
20
+ data = {sub_type: selected, index: index}
21
+ url = '/<%= Refinery::Core.backend_route %>/widgets/widget_types/new_for_page'
22
+ $.ajax({url: url, data: data}).done (data) ->
23
+ target = window.parent.$("a#add_widget_" + activePart)
24
+ $(data).insertBefore(target)
25
+ window.parent.initWidgets()
26
+ window.parent.refinery_dialog_success()
27
+
28
+ $('[data-sortable="widgets"]').each (index, value) ->
29
+ $(value).sortable({handle: '.handle', \
30
+ items: '[data-sort-item="widget"]', \
31
+ axis: 'y', \
32
+ forcePlaceholderSize: true, \
33
+ stop: =>
34
+ assessOrder()
35
+ })
36
+
37
+ window.selectExistingWidgetForTemplate = (id) ->
38
+ activePart = window.parent.$('li.ui-tabs-active').attr('aria-controls')
39
+ index = window.parent.$('#template_part_index_' + activePart).attr('data-index')
40
+ data = {sub_type: 'Refinery::Widgets::Widget', index: index, id: id}
41
+ url = '/<%= Refinery::Core.backend_route %>/widgets/widget_types/show_for_template'
42
+ $.ajax({url: url, data: data}).done (data) ->
43
+ target = window.parent.$("a#add_widget_" + activePart)
44
+ $(data).insertBefore(target)
45
+ window.parent.initWidgets()
46
+ window.parent.refinery_dialog_success()
47
+
48
+ window.selectExistingWidgetForPage = (id) ->
49
+ activePart = window.parent.$('li.ui-tabs-active').attr('aria-controls')
50
+ activePart = activePart.replace('page_part_', '')
51
+ index = window.parent.$('#template_part_index_' + activePart).attr('data-index')
52
+ data = {sub_type: 'Refinery::Widgets::Widget', index: index, id: id}
53
+ url = '/<%= Refinery::Core.backend_route %>/widgets/widget_types/show_for_page'
54
+ $.ajax({url: url, data: data}).done (data) ->
55
+ target = window.parent.$("a#add_widget_" + activePart)
56
+ $(data).insertBefore(target)
57
+ window.parent.initWidgets()
58
+ window.parent.refinery_dialog_success()
59
+
60
+ window.initWidgets = ->
61
+ WYMeditor.init()
62
+ assessOrder()
63
+
64
+ window.linkFromDialog = (linkUrl) ->
65
+ window.parent.location = linkUrl
66
+ window.parent.refinery_dialog_success()
67
+
68
+ window.removeWidget = (link) ->
69
+ widget = $(link).parents('.widget')
70
+ widget.find('input[data-meta="destroy"]').val('1')
71
+ widget.hide()
72
+
73
+ window.toggleWidget = (link) ->
74
+ widgetInner = $(link).parents('.widget').find('.inner')
75
+ widgetInner.slideToggle()
76
+
77
+ window.showWidgetEdit = (link) ->
78
+ widget = $(link).parents('.widget')
79
+ $(widget).find('.previewing').slideToggle()
80
+ $(widget).find('.editing').slideToggle()
81
+ $(link).remove()
82
+
83
+ window.assessOrder = ->
84
+ $('[data-sortable="widgets"]').each (index, value) ->
85
+ $(value).find('[data-sort-item="widget"]').each (index, value) ->
86
+ $(value).find('input[data-meta="position"]').val(index)
87
+
88
+ window.removeField = (element) ->
89
+ fieldset = $(element).closest('fieldset')
90
+ fieldset.find('.destroy').val('1')
91
+ fieldset.hide()
@@ -0,0 +1,94 @@
1
+ /* ---------------------------------------------
2
+ TOGGLE.CSS
3
+ -----------------------------------------------*/
4
+
5
+ div#itoggle{
6
+ background:#FFF;
7
+ padding:20px 20px 0;
8
+ -moz-border-radius:10px;
9
+ -webkit-border-radius:10px;
10
+ color:#333;
11
+ }
12
+ div#itoggle h3{
13
+ margin-bottom:4px;
14
+ font-size: 14px;
15
+ font-weight:bold;
16
+ }
17
+ div#itoggle p{
18
+ color:#666;
19
+ margin-bottom:10px;
20
+ }
21
+
22
+ div#console{
23
+ display:none;
24
+ position:absolute;
25
+ top:8px;
26
+ right:8px;
27
+ width:160px;
28
+ padding:6px 8px 8px 8px;
29
+ text-align:right;
30
+ background:#000;
31
+ -moz-border-radius:6px;
32
+ -webkit-border-radius:6px;
33
+ background:url(/global/images/console.gif);
34
+ }
35
+ div#console p{
36
+ margin:0;
37
+ font-size:11px;
38
+ font-family:"Courier New", Courier, monospace;
39
+ }
40
+
41
+ div#itoggle input.iT_checkbox_on{
42
+ display:block !important;
43
+ float:left;
44
+ position:relative !important;
45
+ top:-43px !important;
46
+ left:100px !important;
47
+ margin-bottom:-43px;
48
+ }
49
+
50
+ /* -----------------------------
51
+ This is the important bit
52
+ -------------------------------*/
53
+
54
+ div#itoggle label.ilabel{
55
+ display:block;
56
+ font-size:12px;
57
+ padding-bottom:10px;
58
+ cursor:pointer;
59
+ }
60
+
61
+ div#itoggle label.itoggle,
62
+ div#itoggle label.itoggle span{
63
+ display: block;
64
+ width: 93px;
65
+ height: 27px;
66
+ margin-bottom: 20px;
67
+ background: url(../images/itoggle.png) left bottom no-repeat;
68
+ cursor:pointer;
69
+ text-indent:-5000px;
70
+ }
71
+ div#itoggle label.itoggle.iToff{
72
+ background-position:right bottom;
73
+ }
74
+ div#itoggle label.itoggle span{
75
+ background-position: left top;
76
+ margin: 0;
77
+ }
78
+ div#itoggle input.iT_checkbox{
79
+ position:absolute;
80
+ top:-9999px;
81
+ left:-9999px;
82
+ }
83
+
84
+ /*
85
+ If you want the corners to be
86
+ transparent, add these two lines
87
+ to the main block above. Only
88
+ works on webkit and mozilla browsers
89
+ For more reliable results, make your
90
+ own png using the supplied .psd
91
+
92
+ -moz-border-radius:6px;
93
+ -webkit-border-radius:6px;
94
+ */
@@ -0,0 +1,89 @@
1
+ .inline{ float:left; margin-top: 5px; margin-right: 20px; }
2
+ .tab-area{ border: 1px solid #CCC; padding: 10px; }
3
+ .reuseable-block{ border: 1px solid #CCC }
4
+ .widgets.ui-sortable {
5
+ .ui-sortable-placeholder {
6
+ background-color: #FFFF99;
7
+ border: 1px dashed #CCC;
8
+ border-radius: 5px;
9
+ -moz-border-radius: 5px;
10
+ -webkit-border-radius: 5px;
11
+ visibility: visible !important;
12
+ }
13
+ }
14
+ .widget{
15
+ border-radius: 5px;
16
+ -moz-border-radius: 5px;
17
+ -webkit-border-radius: 5px;
18
+ background-color: #F5F5F5;
19
+ border: 1px solid #CCC;
20
+ margin: 20px 0px 10px 0px;
21
+ padding: 5px;
22
+ .left {
23
+ float: left;
24
+ }
25
+ .right {
26
+ float: right;
27
+ .icons {
28
+ img {
29
+ margin-left: 10px;
30
+ }
31
+ }
32
+ }
33
+ .type {
34
+ margin-left: 20px;
35
+ }
36
+ }
37
+ .clear {
38
+ clear: both;
39
+ }
40
+ table.existing_widgets, table.select_template {
41
+ border-collapse: collapse;
42
+ border-spacing: 0;
43
+ width: 100%;
44
+ tr {
45
+ &.dark { background-color: #EEE; }
46
+ &.light { background-color: #FFF; }
47
+ td, th {
48
+ padding-left: 10px;
49
+ border: 1px solid #CCC;
50
+ }
51
+ }
52
+ }
53
+ .sub-title { font-size: 0.9em; opacity: 0.8; }
54
+
55
+ form fieldset {
56
+ margin: 5px;
57
+ border: 1px solid #DDD;
58
+ padding-top: 0px;
59
+ }
60
+
61
+ .s-margin { margin-top: 5px; margin-bottom: 5px; }
62
+ .m-margin { margin-top: 10px; margin-bottom: 10px; }
63
+ .l-margin { margin-top: 20px; margin-bottom: 20px; }
64
+ .xl-margin { margin-top: 40px; margin-bottom: 40px; }
65
+
66
+ .row { padding-left: 15px; }
67
+ .row:before,.row:after{content:" ";display:table;}
68
+ .row:after{clear:both;}
69
+ .row:before,.row:after{content:" ";display:table;}
70
+ .row:after{clear:both;}
71
+ @media (min-width:768px){.row{margin-left:-15px;margin-right:-15px;}}.row .row{margin-left:-15px;margin-right:-15px;}
72
+ .col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-left:0px;padding-right:0px; margin-left: 0px; margin-right: 0px;}
73
+ .col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12{float:left;}
74
+ .col-1{width:8.333333333333332% !important;}
75
+ .col-2{width:16.666666666666664% !important;}
76
+ .col-3{width:25% !important;}
77
+ .col-4{width:33.33333333333333% !important;}
78
+ .col-5{width:41.66666666666667% !important;}
79
+ .col-6{width:50% !important;}
80
+ .col-7{width:58.333333333333336% !important;}
81
+ .col-8{width:66.66666666666666% !important;}
82
+ .col-9{width:75% !important;}
83
+ .col-10{width:83.33333333333334% !important;}
84
+ .col-11{width:91.66666666666666% !important;}
85
+ .col-12{width:100% !important;}
86
+
87
+ .widget .handle {
88
+ float: left;
89
+ }
@@ -0,0 +1,28 @@
1
+ module Refinery
2
+ module Widgets
3
+ module Admin
4
+ class TemplatesController < ::Refinery::AdminController
5
+
6
+ def list
7
+ @templates = Template.order(:position)
8
+ @parent_id = params[:parent_id]
9
+ end
10
+
11
+ crudify :'refinery/widgets/template',
12
+ :title_attribute => 'name',
13
+ :xhr_paging => true
14
+
15
+ before_filter :check_for_pages!, :only => :destroy
16
+
17
+ def check_for_pages!
18
+ if Refinery::Widgets::Template.find(params[:id]).pages.any?
19
+ redirect_to refinery.widgets_admin_templates_path,
20
+ :notice => 'Please delete any pages using this template before destroying it.'
21
+ return
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,59 @@
1
+ module Refinery
2
+ module Widgets
3
+ module Admin
4
+ class WidgetTypesController < ::Refinery::AdminController
5
+
6
+ layout false
7
+
8
+ def new_for_template
9
+ set_template_and_template_part_and_widget
10
+ @widget.send("#{@widget.widget_type.association_name}=", @widget.widget_type.klass.new)
11
+ end
12
+
13
+ def new_for_page
14
+ set_page_and_page_part_and_widget
15
+ @widget.send("#{@widget.widget_type.association_name}=", @widget.widget_type.klass.new)
16
+ end
17
+
18
+ def show_for_template
19
+ set_template_and_template_part_and_widget
20
+ widget = Widget.find(params[:id])
21
+ @widget.send("#{@widget.widget_type.association_name}=", widget)
22
+ @widget.locked = widget.locked
23
+ @widget.name = widget.name
24
+ end
25
+
26
+ def show_for_page
27
+ set_page_and_page_part_and_widget
28
+ widget = Widget.find(params[:id])
29
+ @widget.send("#{@widget.widget_type.association_name}=", widget)
30
+ @widget.locked = widget.locked
31
+ @widget.name = widget.name
32
+ end
33
+
34
+ private
35
+
36
+ def set_template_and_template_part_and_widget
37
+ @template_part_index = params[:index] if params[:index].present?
38
+ @template = Template.new
39
+ @template_part = @template.template_parts.build
40
+ sub_type = params[:sub_type]
41
+ @widget = @template_part.widgets.build(sub_type: sub_type)
42
+ end
43
+
44
+ def set_page_and_page_part_and_widget
45
+ @page_part_index = params[:index] if params[:index].present?
46
+ @page = Page.new
47
+ @page_part = @page.parts.build
48
+ sub_type = params[:sub_type]
49
+ @widget = @page_part.widgets.build(sub_type: sub_type)
50
+ end
51
+
52
+ def restrict_controller
53
+ # no restrictions
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,30 @@
1
+ module Refinery
2
+ module Widgets
3
+ module Admin
4
+ class WidgetsController < ::Refinery::AdminController
5
+
6
+ crudify :'refinery/widgets/widget',
7
+ :title_attribute => 'name',
8
+ :xhr_paging => true
9
+
10
+ def template
11
+ @widgets = Refinery::Widgets::Widget.on_template.reusable
12
+ render :action => :new
13
+ end
14
+
15
+ def page
16
+ @widgets = Refinery::Widgets::Widget.on_page.reusable
17
+ render :action => :new
18
+ end
19
+
20
+ protected
21
+
22
+ def restrict_controller
23
+ super unless %w{ template page }.include? action_name
24
+ end
25
+
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ Refinery::Admin::PagesController.class_eval do
2
+ before_filter :load_valid_templates, :only => [:edit, :new, :update, :create]
3
+
4
+ def render(*args)
5
+ if params[:action] == 'new'
6
+ if params[:template_id]
7
+ @template = Refinery::Widgets::Template.find(params[:template_id])
8
+ @page.parts = []
9
+ @template.template_parts.each_with_index do |template_part, index|
10
+ page_part = Refinery::PagePart.new(:title => template_part.name, :position => index, :locked => template_part.locked)
11
+ template_part.widgets.each do |widget|
12
+ w = widget.dup_by_ref
13
+ w.locked = true
14
+ w.layout = true
15
+ page_part.widgets << w
16
+ end
17
+ @page.parts << page_part
18
+ end
19
+ end
20
+ end
21
+ super
22
+ end
23
+ end