caboose-cms 0.8.43 → 0.8.44

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/caboose/admin_page_edit_content.js +83 -70
  3. data/app/assets/javascripts/caboose/card.js +2432 -0
  4. data/app/assets/javascripts/caboose/clipboard.js +7 -0
  5. data/app/assets/javascripts/caboose/modal_controllers/modal_block_controller.js +174 -252
  6. data/app/assets/javascripts/caboose/modal_controllers/modal_controller.js +160 -12
  7. data/app/assets/javascripts/caboose/modal_controllers/modal_media_controller.js +419 -0
  8. data/app/assets/javascripts/caboose/modal_integration.js +21 -1
  9. data/app/assets/javascripts/caboose/model/bound_checkbox.js +13 -6
  10. data/app/assets/javascripts/caboose/model/bound_select.js +16 -7
  11. data/app/assets/javascripts/caboose/model/bound_text.js +15 -2
  12. data/app/assets/stylesheets/caboose/admin_block_edit_image.css.scss +16 -1
  13. data/app/assets/stylesheets/caboose/admin_new_block.css +9 -0
  14. data/app/assets/stylesheets/caboose/application.css +2 -1
  15. data/app/assets/stylesheets/caboose/modal_inline.css +8 -15
  16. data/app/assets/stylesheets/caboose/my_account.scss +178 -0
  17. data/app/controllers/caboose/block_types_controller.rb +20 -0
  18. data/app/controllers/caboose/blocks_controller.rb +70 -8
  19. data/app/controllers/caboose/media_controller.rb +39 -3
  20. data/app/models/caboose/block.rb +17 -1
  21. data/app/models/caboose/media.rb +9 -8
  22. data/app/models/caboose/schema.rb +1 -0
  23. data/app/views/caboose/block_types/admin_edit.html.erb +5 -2
  24. data/app/views/caboose/block_types/admin_index.html.erb +2 -1
  25. data/app/views/caboose/my_account/index.html.erb +124 -63
  26. data/app/views/caboose/my_account/index_old.html.erb +191 -0
  27. data/app/views/caboose/pages/admin_edit_content.html.erb +16 -1
  28. data/lib/caboose/version.rb +1 -1
  29. metadata +8 -3
  30. data/app/assets/stylesheets/caboose/my_account.css +0 -2
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * clipboard.js v1.5.12
3
+ * https://zenorocha.github.io/clipboard.js
4
+ *
5
+ * Licensed MIT © Zeno Rocha
6
+ */
7
+ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!c&&s)return s(a,!0);if(r)return r(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n?n:t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a<o.length;a++)i(o[a]);return i}({1:[function(t,e,n){var o=t("matches-selector");e.exports=function(t,e,n){for(var i=n?t:t.parentNode;i&&i!==document;){if(o(i,e))return i;i=i.parentNode}}},{"matches-selector":5}],2:[function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function i(t,e,n,o){return function(n){n.delegateTarget=r(n.target,e,!0),n.delegateTarget&&o.call(t,n)}}var r=t("closest");e.exports=o},{closest:1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return i(t,e,n);if(c.nodeList(t))return r(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function r(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return s(document.body,t,e,n)}var c=t("./is"),s=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t,e){if(r)return r.call(t,e);for(var n=t.parentNode.querySelectorAll(e),o=0;o<n.length;++o)if(n[o]==t)return!0;return!1}var i=Element.prototype,r=i.matchesSelector||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector;e.exports=o},{}],6:[function(t,e,n){function o(t){var e;if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute("contenteditable")&&t.focus();var n=window.getSelection(),o=document.createRange();o.selectNodeContents(t),n.removeAllRanges(),n.addRange(o),e=n.toString()}return e}e.exports=o},{}],7:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){i.off(t,o),e.apply(n,arguments)}var i=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,i=n.length;for(o;i>o;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,a=o.length;a>r;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if("undefined"!=typeof o)r(n,e("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},a=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),c=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""},t.prototype.initSelection=function t(){this.text?this.selectFake():this.target&&this.selectTarget()},t.prototype.selectFake=function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=document.body.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px",this.fakeElem.style.top=(window.pageYOffset||document.documentElement.scrollTop)+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()},t.prototype.removeFake=function t(){this.fakeHandler&&(document.body.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function t(){this.selectedText=(0,i.default)(this.target),this.copyText()},t.prototype.copyText=function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(n){e=!1}this.handleResult(e)},t.prototype.handleResult=function t(e){e?this.emitter.emit("success",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)}):this.emitter.emit("error",{action:this.action,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function t(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function t(){this.removeFake()},a(t,[{key:"action",set:function t(){var e=arguments.length<=0||void 0===arguments[0]?"copy":arguments[0];if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==("undefined"==typeof e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=c})},{select:6}],9:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if("undefined"!=typeof o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(t,e,n,o){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var l=i(e),u=i(n),f=i(o),d=function(t){function e(n,o){r(this,e);var i=a(this,t.call(this));return i.resolveOptions(o),i.listenClick(n),i}return c(e,t),e.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})},e.prototype.onClick=function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function t(e){return s("action",e)},e.prototype.defaultTarget=function t(e){var n=s("target",e);return n?document.querySelector(n):void 0},e.prototype.defaultText=function t(e){return s("text",e)},e.prototype.destroy=function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(u.default);t.exports=d})},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9)});
@@ -3,100 +3,50 @@ var ModalBlockController = ModalController.extend({
3
3
 
4
4
  block_types: false,
5
5
 
6
- init: function(options)
6
+ after_refresh: function()
7
7
  {
8
- for (var thing in options)
9
- this[thing] = options[thing];
10
-
11
- //this.set_block_type_editable();
12
- this.set_block_value_editable(this.block);
13
- this.set_child_blocks_editable();
14
- this.set_clickable();
15
-
8
+ var that = this;
16
9
  that.update_on_close = false;
17
10
  $.each(that.block.children, function(i, b) {
18
11
  if (b.block_type.field_type == 'image' || b.block_type.field_type == 'file')
19
- that.update_on_close = true
20
- });
21
-
22
- },
23
-
24
- base_url: function(b)
25
- {
26
- return '/admin/' + (b.page_id ? 'pages/' + b.page_id : 'posts/' + b.post_id) + '/blocks';
27
- },
28
-
29
- block_url: function(b)
30
- {
31
- return this.base_url(b) + '/' + b.id;
32
- },
33
-
34
- edit_block: function(block_id)
35
- {
36
- window.location = this.base_url(this.block) + '/' + block_id + '/edit';
12
+ that.update_on_close = true;
13
+ });
14
+ that.print();
37
15
  },
38
16
 
39
17
  /*****************************************************************************
40
18
  Printing
41
19
  *****************************************************************************/
42
20
 
43
- crumbtrail: function()
44
- {
45
- var crumbs = $('<h2/>').css('margin-top', '0').css('padding-top', '0');
46
- var b = that.block;
47
- while (b)
48
- {
49
- var href = b.id == that.block_id ? "#" : that.base_url + '/' + b.id;
50
- var text = b.block_type.description + (b.name ? ' (' + b.name + ')' : '');
51
- crumbs.prepend($('<a/>').attr('href', href).html(text));
52
- b = b.parent
53
- if (b) crumbs.prepend(' > ');
54
- }
55
- return crumbs;
56
- },
57
-
58
21
  print: function()
59
22
  {
60
- var that = this;
61
-
23
+ var that = this;
62
24
  if (!that.block)
63
- {
25
+ {
64
26
  var div = $('<div/>')
65
- .append($('<div/>').attr('id', 'crumbtrail'))
66
- .append($('<div/>').attr('id', 'modal_content'));
67
- .append($('<div/>').attr('id', 'modal_message'));
68
- .append($('<p/>')
69
- .append($('<input/>').attr('type', 'button').val('Close').click(function() {
70
- if (that.update_on_close)
71
- parent_controller.render_blocks();
72
- that.close();
73
- }))
74
- <% if @block.name.nil? %>
75
- <input type='button' value='Delete Block' onclick="controller.delete_block();" />
76
- <% end %>
77
- <input type='button' value='Move Up' onclick="controller.move_up();" />
78
- <input type='button' value='Move Down' onclick="controller.move_down();" />
79
- <input type='button' value='Advanced' onclick="window.location='<%= raw base_url %>/<%= @block.id %>/advanced';" />
80
- </p>
81
-
27
+ .append($('<div/>').attr('id', 'modal_crumbtrail' ))
28
+ .append($('<div/>').attr('id', 'modal_content' ))
29
+ .append($('<div/>').attr('id', 'modal_message' ))
30
+ .append($('<div/>').attr('id', 'modal_controls' ));
82
31
  that.modal(div, 800);
83
- that.refresh(function() { that.print(); });
32
+ that.refresh(function() { that.after_refresh() });
84
33
  return;
85
34
  }
86
35
 
87
- var div = $('<div/>');
88
-
36
+ var div = $('<div/>').attr('id', 'modal_content');
89
37
  if (that.block.block_type.field_type != 'block')
90
38
  div.append($('<p/>').append($('<div/>').attr('id', 'block_' + that.block.id + '_value')));
91
39
  else
92
40
  {
93
41
  if (that.block.children.length > 0)
94
- {
95
- $.each(that.block.children, function(i, b) {
42
+ {
43
+ $.each(that.block.children, function(i, b) {
96
44
  if (b.block_type.field_type != 'block' && b.block_type.field_type != 'richtext' && b.block_type.field_type != 'image' && b.block_type.field_type != 'file')
97
45
  div.append($('<div/>').css('margin-bottom', '10px').append($('<div/>').attr('id', 'block_' + b.id + '_value')));
98
- else
99
- div.append(b.rendered_value);
46
+ else
47
+ {
48
+ div.append($('<div/>').css('margin-bottom', '10px').append($('<div/>').attr('id', 'block_' + b.id)));
49
+ }
100
50
  });
101
51
  }
102
52
  else
@@ -105,157 +55,187 @@ var ModalBlockController = ModalController.extend({
105
55
  }
106
56
  if (that.block.block_type.allow_child_blocks)
107
57
  {
108
- div.append($('<p/>').append($('<a/>').attr('href', '#').html("Add a child block!").click(function(e) {
58
+ div.append($('<p/>').css('clear', 'both').append($('<a/>').attr('href', '#').html("Add a child block!").click(function(e) {
109
59
  e.preventDefault();
110
- that.add_child_block();
60
+ that.add_block();
111
61
  })));
112
62
  }
113
63
  }
114
- div.append($('<div/>').
115
-
116
-
117
-
118
-
119
- <% content_for :caboose_css do %>
120
- <style type='text/css'>
121
- .block { border: #ccc 1px dotted; }
122
- #block_<%= @block.id %>_block_type_id_container { }
123
- #modal_content .checkbox_multiple input[type=checkbox] { position: relative !important; }
124
- </style>
125
- <% end %>
126
- <% content_for :caboose_js do %>
127
- <%= javascript_include_tag "caboose/model/all" %>
128
- <%= javascript_include_tag "caboose/admin_block_edit" %>
129
- <script type='text/javascript'>
130
-
131
- var modal = false;
132
- $(window).load(function() {
133
- keep_modal_autosized();
134
- });
135
-
136
- var autosize_count = 0;
137
- function keep_modal_autosized()
138
- {
139
- if (autosize_count > 3) return;
140
- if (modal) modal.autosize();
141
- else modal = new CabooseModal(800);
142
- autosize_count = autosize_count + 1;
143
- setTimeout(function() { keep_modal_autosized(); }, 1000);
144
- }
145
-
64
+ $('#modal_content').replaceWith(div);
65
+ $('#modal_crumbtrail').empty().append(that.crumbtrail());
66
+ $('#modal_controls').empty().append(that.controls());
146
67
 
68
+ that.render_blocks();
69
+ that.set_editable();
70
+ that.autosize();
71
+ },
72
+
73
+ controls: function()
74
+ {
75
+ var that = this;
76
+ var p = $('<p/>').css('clear', 'both')
77
+ .append($('<input/>').attr('type', 'button').addClass('btn').val('Close').click(function() { that.close(); if (that.update_on_close) { that.parent_controller.render_blocks(); } })).append(' ');
78
+ if (!that.block.name)
79
+ p.append($('<input/>').attr('type', 'button').addClass('btn').val('Delete Block').click(function() { that.delete_block(); })).append(' ');
80
+ p.append($('<input/>').attr('type', 'button').addClass('btn').val('Move Up' ).click(function() { that.move_up(); })).append(' ');
81
+ p.append($('<input/>').attr('type', 'button').addClass('btn').val('Move Down' ).click(function() { that.move_down(); })).append(' ');
82
+ p.append($('<input/>').attr('type', 'button').addClass('btn').val('Advanced' ).attr('id', 'btn_advanced').click(function() { that.print_advanced(); }));
83
+ return p;
84
+ },
85
+
86
+ print_advanced: function()
87
+ {
88
+ var that = this;
89
+ var b = that.block;
147
90
 
91
+ $('#modal_content').empty()
92
+ .append($('<p/>').append($('<div/>').attr('id', 'block_' + b.id + '_block_type_id' )))
93
+ .append($('<p/>').append($('<div/>').attr('id', 'block_' + b.id + '_parent_id' )))
94
+ .append($('<p/>').append($('<div/>').attr('id', 'block_' + b.id + '_constrain' )))
95
+ .append($('<p/>').append($('<div/>').attr('id', 'block_' + b.id + '_full_width' )))
96
+ $('#modal_controls').empty()
97
+ .append($('<p/>')
98
+ .append($('<input/>').attr('type', 'button').addClass('btn').val('Close').click(function() { that.close(); if (that.update_on_close) { that.parent_controller.render_blocks(); } })).append(' ')
99
+ .append($('<input/>').attr('type', 'button').addClass('btn').val('Back' ).click(function() { that.print(); }))
100
+ );
101
+
102
+ var m = new ModelBinder({
103
+ name: 'Block',
104
+ id: b.id,
105
+ update_url: that.block_url(b),
106
+ authenticity_token: that.authenticity_token,
107
+ attributes: [
108
+ { name: 'block_type_id' , nice_name: 'Block type' , type: 'select' , value: b.block_type_id , text: b.block_type.name , width: 400, fixed_placeholder: true, options_url: '/admin/block-types/options' , after_update: function() { that.parent_controller.render_blocks(); that.block.block_type_id = this.value; }, after_cancel: function() { that.parent_controller.render_blocks(); }, on_load: function() { that.modal.autosize(); }},
109
+ { name: 'parent_id' , nice_name: 'Parent ID' , type: 'select' , value: b.parent_id , text: b.parent ? b.parent.title : '' , width: 400, fixed_placeholder: true, options_url: '/admin/pages/' + that.page_id + '/block-options' , after_update: function() { that.parent_controller.render_blocks(); that.block.parent_id = this.value; }, after_cancel: function() { that.parent_controller.render_blocks(); }, on_load: function() { that.modal.autosize(); }},
110
+ { name: 'constrain' , nice_name: 'Constrain' , type: 'checkbox' , value: b.constrain ? 1 : 0 , width: 400, fixed_placeholder: true, after_update: function() { that.parent_controller.render_blocks(); that.block.constrain = this.value; }, after_cancel: function() { that.parent_controller.render_blocks(); }, on_load: function() { that.modal.autosize(); }},
111
+ { name: 'full_width' , nice_name: 'Full Width' , type: 'checkbox' , value: b.full_width ? 1 : 0 , width: 400, fixed_placeholder: true, after_update: function() { that.parent_controller.render_blocks(); that.block.full_width = this.value; }, after_cancel: function() { that.parent_controller.render_blocks(); }, on_load: function() { that.modal.autosize(); }}
112
+ ]
113
+ });
114
+ that.autosize();
115
+ },
116
+
117
+ crumbtrail: function()
118
+ {
119
+ var that = this;
120
+ var crumbs = $('<h2/>').css('margin-top', '0').css('padding-top', '0');
121
+ $.each(that.block.crumbtrail, function(i, h) {
122
+ if (i > 0) crumbs.append(' > ');
123
+ crumbs.append($('<a/>').attr('href', '#').html(h['text']).data('block_id', h['block_id']).click(function(e) {
124
+ e.preventDefault();
125
+ that.parent_controller.edit_block(parseInt($(this).data('block_id')));
126
+ }));
127
+ });
128
+ return crumbs;
148
129
  },
149
130
 
150
131
  /*****************************************************************************
151
132
  Block Rendering
152
133
  *****************************************************************************/
153
134
 
154
- set_clickable: function()
155
- {
156
- var that = this;
157
- $.ajax({
158
- url: that.base_url(that.block) + '/tree',
159
- success: function(blocks) {
160
- $(blocks).each(function(i,b) {
161
- that.set_clickable_helper(b);
162
- });
135
+ render_blocks: function()
136
+ {
137
+ var that = this;
138
+ if (that.block.block_type.field_type != 'block' && that.block.children.length == 0)
139
+ return;
140
+
141
+ $.each(that.block.children, function(i, b) {
142
+ var ft = b.block_type.field_type;
143
+ if (ft == 'block' || ft == 'richtext' || ft == 'image' || ft == 'file')
144
+ {
145
+ if (!b.rendered_value)
146
+ {
147
+ $.ajax({
148
+ block_id: b.id, // Used in the success function
149
+ url: that.block_url(b) + '/render',
150
+ type: 'get',
151
+ success: function(html) {
152
+ $('#the_modal #block_' + this.block_id).replaceWith(html);
153
+
154
+ var b2 = that.block_with_id(this.block_id);
155
+ b2.rendered_value = html;
156
+ that.set_clickable(b2);
157
+ that.autosize();
158
+ },
159
+ });
160
+ }
161
+ else
162
+ $('#the_modal #block_' + b.id).replaceWith(b.rendered_value);
163
163
  }
164
- });
164
+ });
165
165
  },
166
+
167
+ /****************************************************************************/
168
+
169
+ set_clickable: function(b)
170
+ {
171
+ var that = this;
166
172
 
167
- set_clickable_helper: function(b)
168
- {
169
- var that = this;
170
- $('#block_' + b.id).attr('onclick','').unbind('click');
171
- $('#block_' + b.id).click(function(e) {
173
+ if (!b)
174
+ {
175
+ $.each(that.block.children, function(i,b) {
176
+ that.set_clickable(b);
177
+ });
178
+ }
179
+
180
+ $('#the_modal #block_' + b.id).attr('onclick','').unbind('click');
181
+ $('#the_modal #block_' + b.id).click(function(e) {
172
182
  e.stopPropagation();
173
- that.edit_block(b.id);
183
+ that.parent_controller.edit_block(b.id);
174
184
  });
175
- if (b.allow_child_blocks == true)
176
- {
177
- $('#new_block_' + b.id).replaceWith($('<input/>')
178
- .attr('type', 'button')
179
- .val('New Block')
180
- .click(function(e) { e.stopPropagation(); that.new_block(b.id);
181
- })
182
- );
183
- }
185
+ //if (b.allow_child_blocks == true)
186
+ //{
187
+ // $('#new_block_' + b.id).replaceWith($('<input/>')
188
+ // .attr('type', 'button')
189
+ // .val('New Block')
190
+ // .click(function(e) { e.stopPropagation(); that.new_block(b.id);
191
+ // })
192
+ // );
193
+ //}
184
194
  var show_mouseover = true;
185
195
  if (b.children && b.children.length > 0)
186
196
  {
187
197
  $.each(b.children, function(i, b2) {
188
198
  if (b2.block_type_id = 34)
189
199
  show_mouseover = false;
190
- that.set_clickable_helper(b2);
200
+ that.set_clickable(b2);
191
201
  });
192
202
  }
193
203
  if (show_mouseover)
194
204
  {
195
- $('#block_' + b.id).mouseover(function(el) { $('#block_' + b.id).addClass( 'block_over'); });
196
- $('#block_' + b.id).mouseout(function(el) { $('#block_' + b.id).removeClass('block_over'); });
205
+ $('#the_modal #block_' + b.id).mouseover(function(el) { $('#the_modal #block_' + b.id).addClass( 'block_over'); });
206
+ $('#the_modal #block_' + b.id).mouseout(function(el) { $('#the_modal #block_' + b.id).removeClass('block_over'); });
197
207
  }
198
208
  },
199
209
 
200
210
  /****************************************************************************/
201
211
 
202
- //set_block_type_editable: function()
203
- //{
204
- // var that = this;
205
- // var b = this.block;
206
- // m = new ModelBinder({
207
- // name: 'Block',
208
- // id: b.id,
209
- // update_url: '/admin/pages/' + b.page_id + '/blocks/' + b.id,
210
- // authenticity_token: that.authenticity_token,
211
- // attributes: [{
212
- // name: 'block_type_id',
213
- // nice_name: 'Block type',
214
- // type: 'select',
215
- // value: b.block_type_id,
216
- // text: b.block_type.name,
217
- // width: 400,
218
- // fixed_placeholder: true,
219
- // options_url: '/admin/block-types/options',
220
- // after_update: function() { parent.controller.render_blocks(); window.location.reload(true); },
221
- // after_cancel: function() { parent.controller.render_blocks(); window.location.reload(true); },
222
- // on_load: function() { that.modal.autosize(); }
223
- // },{
224
- // name: 'parent_id',
225
- // nice_name: 'Parent ID',
226
- // type: 'select',
227
- // value: b.parent_id,
228
- // text: b.parent_title,
229
- // width: 400,
230
- // fixed_placeholder: true,
231
- // options_url: '/admin/pages/' + b.page_id + '/block-options',
232
- // after_update: function() { parent.controller.render_blocks(); },
233
- // after_cancel: function() { parent.controller.render_blocks(); },
234
- // on_load: function() { that.modal.autosize(); }
235
- // }]
236
- // });
237
- // $('#advanced').hide();
238
- //},
212
+ set_editable: function()
213
+ {
214
+ var that = this;
215
+ that.set_block_value_editable(that.block);
216
+ $.each(that.block.children, function(i, b) {
217
+ that.set_block_value_editable(b);
218
+ });
219
+ },
239
220
 
240
221
  set_block_value_editable: function(b)
241
- {
222
+ {
242
223
  var that = this;
243
- var bt = b.block_type;
244
- if (b.block_type.field_type == 'block')
245
- return;
246
-
224
+ var bt = b.block_type;
225
+ if (bt.field_type == 'block' || bt.field_type == 'richtext')
226
+ return;
247
227
  var h = {
248
228
  name: 'value',
249
229
  type: bt.field_type,
250
230
  nice_name: bt.description ? bt.description : bt.name,
251
231
  width: bt.width ? bt.width : 780,
252
- after_update: function() { parent.controller.render_blocks(); },
253
- after_cancel: function() { parent.controller.render_blocks(); }
232
+ after_update: function() { that.parent_controller.render_blocks(); },
233
+ after_cancel: function() { that.parent_controller.render_blocks(); }
254
234
  };
255
235
  h['value'] = b.value
256
236
  if (bt.field_type == 'checkbox') h['value'] = b.value ? 'true' : 'false';
257
- if (bt.field_type == 'image') h['value'] = b.image.tiny_url;
258
- if (bt.field_type == 'file') h['value'] = b.image.url;
237
+ //if (bt.field_type == 'image') h['value'] = b.image.tiny_url;
238
+ //if (bt.field_type == 'file') h['value'] = b.file.url;
259
239
  if (bt.field_type == 'select') h['text'] = b.value;
260
240
  if (bt.height) h['height'] = bt.height;
261
241
  if (bt.fixed_placeholder) h['fixed_placeholder'] = bt.fixed_placeholder;
@@ -276,67 +256,8 @@ function keep_modal_autosized()
276
256
  attributes: [h]
277
257
  });
278
258
  },
279
-
280
- set_child_blocks_editable: function()
281
- {
282
- var that = this;
283
- $.each(this.block.children, function(i, b) {
284
- var bt = b.block_type;
285
- if (bt.field_type == 'block' || bt.field_type == 'richtext')
286
- {
287
- //$('#block_' + b.id).attr('onclick','').unbind('click');
288
- //$('#block_' + b.id).click(function(e) {
289
- // window.location = '/admin/pages/' + b.page_id + '/blocks/' + b.id + '/edit';
290
- //});
291
- }
292
- else
293
- that.set_block_value_editable(b);
294
- });
295
- },
296
259
 
297
- add_child_block: function(block_type_id)
298
- {
299
- var that = this;
300
- if (!this.block_types)
301
- {
302
- modal.autosize("<p class='loading'>Getting block types...</p>");
303
- $.ajax({
304
- url: '/admin/block-types/options',
305
- type: 'get',
306
- success: function(resp) {
307
- that.block_types = resp;
308
- that.add_child_block();
309
- }
310
- });
311
- return;
312
- }
313
- if (!block_type_id)
314
- {
315
- var select = $('<select/>').attr('id', 'new_block_type_id');
316
- $.each(this.block_types, function(i, bt) {
317
- var opt = $('<option/>').val(bt.value).html(bt.text);
318
- select.append(opt);
319
- });
320
- var p = $('<p/>').addClass('note warning')
321
- .append("Select a type of page block: ")
322
- .append(select)
323
- .append("<br/>")
324
- .append($('<input/>').attr('type','button').val('Confirm Add Block').click(function() { that.add_child_block($('#new_block_type_id').val()) })).append(' ')
325
- .append($('<input/>').attr('type','button').val('Cancel').click(function() { $('#message').empty(); modal.autosize(); }));
326
- modal.autosize(p);
327
- return;
328
- }
329
- modal.autosize("<p class='loading'>Adding block...</p>");
330
- $.ajax({
331
- url: that.block_url(block),
332
- type: 'post',
333
- data: { block_type_id: block_type_id },
334
- success: function(resp) {
335
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
336
- if (resp.block) window.location.reload(true);
337
- }
338
- });
339
- },
260
+ /****************************************************************************/
340
261
 
341
262
  delete_block: function(confirm)
342
263
  {
@@ -346,20 +267,20 @@ function keep_modal_autosized()
346
267
  var p = $('<p/>').addClass('note warning')
347
268
  .append("Are you sure you want to delete the block? This can't be undone.<br />")
348
269
  .append($('<input/>').attr('type','button').val('Yes').click(function() { that.delete_block(true); })).append(' ')
349
- .append($('<input/>').attr('type','button').val('No').click(function() { $('#message').empty(); modal.autosize(); }));
350
- modal.autosize(p);
270
+ .append($('<input/>').attr('type','button').val('No').click(function() { $('#modal_message').empty(); that.autosize(); }));
271
+ that.autosize(p);
351
272
  return;
352
273
  }
353
- modal.autosize("<p class='loading'>Deleting block...</p>");
274
+ that.autosize("<p class='loading'>Deleting block...</p>");
354
275
  $.ajax({
355
276
  url: that.block_url(that.block),
356
277
  type: 'delete',
357
278
  success: function(resp) {
358
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
279
+ if (resp.error) that.autosize("<p class='note error'>" + resp.error + "</p>");
359
280
  if (resp.redirect)
360
281
  {
361
- parent.controller.render_blocks();
362
- modal.close();
282
+ that.close();
283
+ that.parent_controller.render_blocks();
363
284
  }
364
285
  }
365
286
  });
@@ -368,16 +289,16 @@ function keep_modal_autosized()
368
289
  move_up: function()
369
290
  {
370
291
  var that = this;
371
- modal.autosize("<p class='loading'>Moving up...</p>");
292
+ that.autosize("<p class='loading'>Moving up...</p>");
372
293
  $.ajax({
373
294
  url: that.block_url(that.block) + '/move-up',
374
295
  type: 'put',
375
296
  success: function(resp) {
376
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
297
+ if (resp.error) that.autosize("<p class='note error'>" + resp.error + "</p>");
377
298
  if (resp.success)
378
299
  {
379
- modal.autosize("<p class='note success'>" + resp.success + "</p>");
380
- parent.controller.render_blocks();
300
+ that.autosize("<p class='note success'>" + resp.success + "</p>");
301
+ that.parent_controller.render_blocks();
381
302
  }
382
303
  }
383
304
  });
@@ -386,18 +307,19 @@ function keep_modal_autosized()
386
307
  move_down: function()
387
308
  {
388
309
  var that = this;
389
- modal.autosize("<p class='loading'>Moving down...</p>");
310
+ that.autosize("<p class='loading'>Moving down...</p>");
390
311
  $.ajax({
391
312
  url: that.block_url(that.block) + '/move-down',
392
313
  type: 'put',
393
314
  success: function(resp) {
394
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
315
+ if (resp.error) that.autosize("<p class='note error'>" + resp.error + "</p>");
395
316
  if (resp.success)
396
317
  {
397
- modal.autosize("<p class='note success'>" + resp.success + "</p>");
398
- parent.controller.render_blocks();
318
+ that.autosize("<p class='note success'>" + resp.success + "</p>");
319
+ that.parent_controller.render_blocks();
399
320
  }
400
321
  }
401
322
  });
402
323
  }
403
- };
324
+
325
+ });