refinerycms-llama_widgets 0.1.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.
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