caboose-cms 0.3.6 → 0.3.7

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 (27) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/admin.js +1 -0
  3. data/app/assets/javascripts/caboose/admin_page_edit_content.js +107 -95
  4. data/app/assets/javascripts/caboose/admin_page_new_blocks.js +31 -0
  5. data/app/assets/javascripts/caboose/model/bound_richtext.js +37 -76
  6. data/app/assets/javascripts/caboose/model/bound_text.js +4 -1
  7. data/app/assets/javascripts/caboose/model/model_binder.js +7 -0
  8. data/app/assets/javascripts/tinymce/plugins/caboose/plugin.js +2 -7
  9. data/app/assets/stylesheets/caboose/admin.css +1 -0
  10. data/app/assets/stylesheets/caboose/admin_page_edit_content.css +44 -0
  11. data/app/controllers/caboose/page_blocks_controller.rb +34 -17
  12. data/app/controllers/caboose/pages_controller.rb +36 -8
  13. data/app/models/caboose/page_block.rb +10 -37
  14. data/app/views/caboose/login/index.html.erb +5 -0
  15. data/app/views/caboose/page_blocks/admin_edit.html.erb +0 -2
  16. data/app/views/caboose/page_blocks/admin_edit_h1.html.erb +4 -6
  17. data/app/views/caboose/page_blocks/admin_edit_h2.html.erb +4 -6
  18. data/app/views/caboose/page_blocks/admin_edit_h3.html.erb +33 -0
  19. data/app/views/caboose/page_blocks/admin_edit_h4.html.erb +33 -0
  20. data/app/views/caboose/page_blocks/admin_edit_h5.html.erb +33 -0
  21. data/app/views/caboose/page_blocks/admin_edit_h6.html.erb +33 -0
  22. data/app/views/caboose/page_blocks/admin_edit_richtext.html.erb +4 -6
  23. data/app/views/caboose/pages/_admin_header.html.erb +23 -9
  24. data/app/views/caboose/pages/admin_edit_content.html.erb +19 -12
  25. data/config/routes.rb +4 -0
  26. data/lib/caboose/version.rb +1 -1
  27. metadata +7 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- N2MwN2MxYTdkNzc2OWQwZGQ1YzAyOTU5NDc5NTllZmQ0YWNjY2YzNQ==
4
+ ZGVhMmM0MTg3ZGJkNjZmMzU0MjY5ZmFjMDJhOTYwZmMwMjk0Yzg1Nw==
5
5
  data.tar.gz: !binary |-
6
- YjFjZWYwNzU4NDdjYmQwOWNlZTY0NWMwMDVlZWU3ODhkMWY0ZjNjNA==
6
+ OTg4NDkxNjBiMzY5ZDgwMmEzN2VlMGU0ZjdlZjFhNDJkNTk5ODE2ZA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Mzk2Y2E0ZTI0NzIxODQ5MzVmNWI5Njc3YmIxMjhjZWE2NWE5YjRiMGViMzcy
10
- ZDY1YTI1MThkMDIwMGE0ZTFiMzM1YWIxNGE4NjkxYjk4ZWFjMTYxYzYxZDMx
11
- ODAxOTc5ZmY2OTMwNmJkNzYzZTczMDkwM2EyYTc2ZWZkZmM4NDE=
9
+ ZDRmZTdkZjY2MTU2OWY1ZDMwZjFjYjgxMWI2ODNiMWQ1MjIwNWYxODM2YzBi
10
+ Y2VhZGFjOGNhYTI3ZDY3YzE4Mjc0ODc1ZGQ0YjNmYjljYzkwMGJjODRjOTQx
11
+ ODg1MTc3OGU2MDI4YWEwZjdiYjQ1ZDU0YTQ3OWZiMmNiMjVlMjM=
12
12
  data.tar.gz: !binary |-
13
- ODExOGJjMWFhNjk5ZGMzOGU3YmU5ODUyYjRlMTA3YTQwZGRjODEwOTBhNjFm
14
- MzQzZjNhMjA1Y2Y4ZWI3N2VjY2U1NmRiMjI1NzkwNWMxZmJhNDRiMzZiZGRh
15
- NjRjOTliMDA5MGFhOTAxMzUxNjYwODBkZjU5MTAyNzRkM2I1ZmI=
13
+ NWVkMmQyNmE4MTU3ZDhkMWFiYzFlMWVlYzJlNjg1MDUyZjcyMDg4YTAxZjRl
14
+ NDZhNWI0OWMyYjhmZDVkZGI2MDA0YmVlZTg0NTQ5YWZjZWFhY2UzODU3OTFk
15
+ NDljZjU2ZTJkNDUzYTAwZGE5ZjU5NzNkYmJmNGExMmVmMTQ2NGE=
@@ -12,6 +12,7 @@
12
12
  //
13
13
  //= require jquery
14
14
  //= require jquery_ujs
15
+ //= require jquery.ui.all
15
16
  //= require colorbox-rails
16
17
  //= require caboose/modal_integration
17
18
  //= require caboose/placeholder
@@ -1,123 +1,135 @@
1
1
 
2
- var PageContentEditor = function(page_id, auth_token) {
3
- this.page_id = page_id;
4
- this.auth_token = auth_token;
5
- this.render_blocks();
6
- };
2
+ var PageContentController = function(page_id) { this.init(page_id); };
7
3
 
8
- PageContentEditor.prototype = {
4
+ PageContentController.prototype = {
9
5
 
10
- page_id: false,
11
- current_block_id: false,
6
+ page_id: false,
7
+ new_block_type: false,
12
8
 
13
- render_blocks: function()
9
+ init: function(page_id)
14
10
  {
11
+ this.page_id = page_id;
15
12
  var that = this;
16
- $.ajax({
17
- url: '/admin/pages/' + this.page_id + '/blocks',
18
- success: function(blocks) {
19
- $(blocks).each(function(i,b) { that.render_block(b.id); });
20
- }
21
- });
13
+ this.render_blocks(function() {
14
+ that.sortable_blocks();
15
+ that.draggable_blocks();
16
+ });
22
17
  },
23
18
 
24
- render_block: function(block_id, after)
25
- {
19
+ sortable_blocks: function()
20
+ {
26
21
  var that = this;
27
- $.ajax({
28
- url: '/admin/pages/' + this.page_id + '/blocks/' + block_id + '/render?empty_text=[Empty, click to edit]',
29
- success: function(html) {
30
- $('#pageblock_' + block_id).empty().html(html);
31
- $('#pageblock_' + block_id).attr('onclick','').unbind('click');
32
- $('#pageblock_' + block_id).click(function(e) { that.edit_block(block_id); });
33
- if (that.current_block_id == block_id) that.current_block_id = false;
34
- if (after) after();
22
+ $('#pageblocks').sortable({
23
+ placeholder: 'sortable-placeholder',
24
+ handle: '.sort_handle',
25
+ receive: function(e, ui) {
26
+ that.new_block_type = ui.item.attr('id').replace('new_block_', '');
27
+ },
28
+ update: function(e, ui) {
29
+ if (that.new_block_type)
30
+ {
31
+ $.ajax({
32
+ url: '/admin/pages/' + that.page_id + '/blocks',
33
+ type: 'post',
34
+ data: { block_type: that.new_block_type, index: ui.item.index() },
35
+ success: function(resp) { that.render_blocks(function() { that.edit_block(resp.block.id); }); }
36
+ });
37
+ that.new_block_type = false;
38
+ }
39
+ else
40
+ {
41
+ $.ajax({
42
+ url: '/admin/pages/' + that.page_id + '/block-order',
43
+ type: 'put',
44
+ data: $('#pageblocks').sortable('serialize', { key: "block_ids[]" }),
45
+ success: function(resp) {}
46
+ });
47
+ }
35
48
  }
36
49
  });
37
50
  },
38
51
 
52
+ draggable_blocks: function()
53
+ {
54
+ $('#new_blocks li').draggable({
55
+ dropOnEmpty: true,
56
+ connectToSortable: "#pageblocks",
57
+ helper: "clone",
58
+ revert: "invalid"
59
+ });
60
+ },
61
+
39
62
  edit_block: function(block_id)
40
63
  {
41
- var that = this;
42
- if (this.current_block_id && this.current_block_id != block_id)
64
+ caboose_modal_url('/admin/pages/' + this.page_id + '/blocks/' + block_id + '/edit');
65
+ },
66
+
67
+ delete_block: function(block_id, confirm)
68
+ {
69
+ var that = this;
70
+ if (!confirm)
43
71
  {
44
- this.render_block(this.current_block_id, function() { that.edit_block(block_id); });
72
+ var p = $('<p/>')
73
+ .addClass('note warning')
74
+ .append("Are you sure you want to delete the block? ")
75
+ .append($('<input/>').attr('type', 'button').val('Yes').click(function() { that.delete_block(block_id, true); })).append(" ")
76
+ .append($('<input/>').attr('type', 'button').val('No').click(function() { that.render_block(block_id); }));
77
+ $('#pageblock_' + block_id).attr('onclick','').unbind('click');
78
+ $('#pageblock_' + block_id).empty().append(p);
45
79
  return;
46
80
  }
47
-
48
- this.current_block_id = block_id;
49
- $('#pageblock_' + block_id).attr('onclick','').unbind('click');
50
81
  $.ajax({
51
82
  url: '/admin/pages/' + this.page_id + '/blocks/' + block_id,
52
- success: function(block) {
53
- $('#pageblock_' + block.id).empty().append($('<div/>').attr('id', 'pageblock_' + block.id + '_value'));
54
- that["edit_" + block.block_type + "_block"](block);
55
- }
56
- });
83
+ type: 'delete',
84
+ success: function(resp) {
85
+ that.render_blocks();
86
+ }
87
+ });
57
88
  },
89
+
90
+ /*****************************************************************************
91
+ Block Rendering
92
+ *****************************************************************************/
58
93
 
59
- edit_h1_block: function(block) { return this.edit_text_block(block); },
60
- edit_h2_block: function(block) { return this.edit_text_block(block); },
61
- edit_h3_block: function(block) { return this.edit_text_block(block); },
62
- edit_h4_block: function(block) { return this.edit_text_block(block); },
63
- edit_h5_block: function(block) { return this.edit_text_block(block); },
64
- edit_h6_block: function(block) { return this.edit_text_block(block); },
65
-
66
- edit_text_block: function(block) {
94
+ render_blocks: function(after)
95
+ {
96
+ $('#pageblocks').empty();
67
97
  var that = this;
68
- m = new ModelBinder({
69
- name: 'PageBlock',
70
- id: block.id,
71
- update_url: '/admin/pages/' + this.page_id + '/blocks/' + block.id,
72
- authenticity_token: this.auth_token,
73
- attributes: [{
74
- name: 'value',
75
- nice_name: 'Content',
76
- type: 'text',
77
- value: block.value,
78
- width: 800,
79
- fixed_placeholder: false,
80
- after_update: this.after_block_update,
81
- after_cancel: this.after_block_cancel
82
- }],
83
- });
98
+ $.ajax({
99
+ url: '/admin/pages/' + this.page_id + '/blocks/render?empty_text=[Empty, click to edit]',
100
+ success: function(blocks) {
101
+ $(blocks).each(function(i,b) {
102
+ $('#pageblocks')
103
+ .append($('<li/>')
104
+ .attr('id', 'pageblock_container_' + b.id)
105
+ .append($('<a/>').attr('id', 'pageblock_' + b.id + '_sort_handle' ).addClass('sort_handle' ).append($('<span/>').addClass('ui-icon ui-icon-arrow-2-n-s')))
106
+ .append($('<a/>').attr('id', 'pageblock_' + b.id + '_delete_handle').addClass('delete_handle').append($('<span/>').addClass('ui-icon ui-icon-close')).click(function(e) { e.preventDefault(); that.delete_block(b.id); }))
107
+ .append($('<div/>').attr('id', 'pageblock_' + b.id).addClass('page_block'))
108
+ );
109
+ });
110
+ $(blocks).each(function(i,b) { that.render_block_html(b.id, b.html); });
111
+ if (after) after();
112
+ }
113
+ });
84
114
  },
85
115
 
86
- edit_richtext_block: function(block) {
116
+ render_block: function(block_id, after)
117
+ {
87
118
  var that = this;
88
- m = new ModelBinder({
89
- name: 'PageBlock',
90
- id: block.id,
91
- update_url: '/admin/pages/' + this.page_id + '/blocks/' + block.id,
92
- authenticity_token: this.auth_token,
93
- attributes: [{
94
- name: 'value',
95
- nice_name: 'Content',
96
- type: 'richtext',
97
- value: block.value,
98
- width: 800,
99
- height: 300,
100
- fixed_placeholder: false,
101
- after_update: function() {
102
- //that.after_block_update(that);
103
- that.render_block(that.current_block_id);
104
- ModelBinder.remove_from_all_model_binders('PageBlock', that.current_block_id);
105
- that.current_block_id = false;
106
- },
107
- after_cancel: function() { that.after_block_cancel(that); }
108
- }],
109
- });
119
+ $.ajax({
120
+ url: '/admin/pages/' + this.page_id + '/blocks/' + block_id + '/render?empty_text=[Empty, click to edit]',
121
+ success: function(html) {
122
+ that.render_block_html(block_id, html);
123
+ if (after) after();
124
+ }
125
+ });
110
126
  },
111
127
 
112
- after_block_update: function(pce) {
113
- pce.render_block(pce.current_block_id);
114
- ModelBinder.remove_from_all_model_binders('PageBlock', pce.current_block_id);
115
- pce.current_block_id = false;
116
- },
117
-
118
- after_block_cancel: function(pce) {
119
- pce.render_block(pce.current_block_id);
120
- ModelBinder.remove_from_all_model_binders('PageBlock', pce.current_block_id);
121
- pce.current_block_id = false;
122
- }
123
- }
128
+ render_block_html: function(block_id, html)
129
+ {
130
+ var that = this;
131
+ $('#pageblock_' + block_id).empty().html(html);
132
+ $('#pageblock_' + block_id).attr('onclick','').unbind('click');
133
+ $('#pageblock_' + block_id).click(function(e) { that.edit_block(block_id); });
134
+ }
135
+ };
@@ -0,0 +1,31 @@
1
+
2
+ var PageContentEditor = function(page_id, auth_token) {
3
+ this.page_id = page_id;
4
+ this.auth_token = auth_token;
5
+ this.add_controls();
6
+ this.render_blocks();
7
+ };
8
+
9
+ PageContentEditor.prototype = {
10
+
11
+ page_id: false,
12
+ current_block_id: false,
13
+ block_types: { h1: 'Heading 1', h2: 'Heading 2', h3: 'Heading 3', h4: 'Heading 4', h5: 'Heading 5', h6: 'Heading 6', richtext: 'Rich Text'},
14
+
15
+ add_controls: function(id)
16
+ {
17
+ var that = this;
18
+ //$('#pageblock_controls').empty();
19
+ //$('#pageblock_controls')
20
+ // .append($('<h2/>').attr('id', 'edit_blocks_header').html('Edit Blocks'))
21
+ // .append($('<div/>').addClass('content').append($('<p/>').html('Select a block to edit.')));
22
+ $('#pageblocks').selectable({
23
+ filter: "li",
24
+ cancel: ".handle",
25
+ selected: function(e, ui) {
26
+ var block_id = ui.selected.id.replace("pageblock_container_", "");
27
+ that.edit_block(block_id);
28
+ }
29
+ });
30
+ },
31
+ };
@@ -24,22 +24,19 @@ BoundRichText = BoundControl.extend({
24
24
  $('#'+this.el).attr('placeholder', 'empty').css('padding-top', '+=' + h).css('height', '-=' + h);
25
25
 
26
26
  var this2 = this;
27
- $('#'+this.el).on('keyup', function(e) {
28
- if (e.keyCode == 27) this2.cancel(); // Escape
29
- //if (e.keyCode == 13) this2.save(); // Enter
30
-
31
- if ($('#'+this2.el).val() != this2.attribute.value_clean)
32
- {
33
- this2.show_controls();
34
- $('#'+this2.el).addClass('dirty');
35
- }
36
- else
37
- $('#'+this2.el).removeClass('dirty');
38
- });
27
+ //$('#'+this.el).on('keyup', function(e) {
28
+ // if (e.keyCode == 27) this2.cancel(); // Escape
29
+ // //if (e.keyCode == 13) this2.save(); // Enter
30
+ //
31
+ // if ($('#'+this2.el).val() != this2.attribute.value_clean)
32
+ // $('#'+this2.el).addClass('dirty');
33
+ // else
34
+ // $('#'+this2.el).removeClass('dirty');
35
+ //});
39
36
 
40
- setTimeout(function() {
37
+ setTimeout(function() {
41
38
  tinymce.execCommand("mceAddEditor", false, this2.el);
42
- var ed = tinymce.EditorManager.createEditor(this2.el);
39
+ var ed = tinymce.EditorManager.createEditor(this2.el);
43
40
 
44
41
  //var ed = tinymce.EditorManager.get(this2.el);
45
42
  //if (!ed)
@@ -47,60 +44,31 @@ BoundRichText = BoundControl.extend({
47
44
  // tinymce.execCommand("mceAddEditor", false, this2.el);
48
45
  // ed = tinymce.EditorManager.createEditor(this2.el);
49
46
  //}
50
- ed.on('blur', function(e) { this2.save(); });
51
- ed.on('keyup', function(e) {
52
- tinymce.triggerSave();
53
- if (e.keyCode == 27) this2.cancel(); // Escape
54
- if ($('#'+this2.el).val() != this2.attribute.value_clean)
55
- ed.getBody().style.backgroundColor = "#fff799";
56
- else
57
- ed.getBody().style.backgroundColor = "#fff";
58
- });
47
+
48
+ //ed.on('blur', function(e) { this2.save(); });
49
+ //ed.on('keyup', function(e) {
50
+ // tinymce.triggerSave();
51
+ // if (e.keyCode == 27) this2.cancel(); // Escape
52
+ // if ($('#'+this2.el).val() != this2.attribute.value_clean)
53
+ // ed.getBody().style.backgroundColor = "#fff799";
54
+ // else
55
+ // ed.getBody().style.backgroundColor = "#fff";
56
+ //});
59
57
  }, 100);
60
58
  },
61
59
 
62
- show_controls: function() {
63
- if ($('#'+this.el+'_controls').length)
64
- return;
65
- var w = $('#'+this.el).outerWidth();
66
- var this2 = this;
67
- $('#'+this.el+'_container').prepend($('<div/>')
68
- .attr('id', this.el + '_controls')
69
- .addClass('bound_textarea_controls')
70
- .css('position', 'absolute')
71
- .css('top', 0)
72
- .css('left', w - 148)
73
- .css('width', 148)
74
- .css('overflow', 'hidden')
75
- .append($('<div/>')
76
- .css('width', 148)
77
- .css('margin-left', 148)
78
- .append($('<a/>').html('Save' ).addClass('save' ).css('width', 60).attr('href', '#').click(function(event) { event.preventDefault(); this2.save(); }))
79
- .append($('<a/>').html('Discard').addClass('discard').css('width', 80).attr('href', '#').click(function(event) { event.preventDefault(); this2.cancel(); }))
80
- )
81
- );
82
- $('#'+this.el+'_controls div').animate({ 'margin-left': 0 }, 300);
83
- },
84
-
85
- hide_controls: function() {
86
- if (!$('#'+this.el+'_controls').length)
87
- return;
88
- var this2 = this;
89
- $('#'+this.el+'_controls div').animate({ 'margin-left': 100 }, 300, function() {
90
- $('#'+this2.el+'_controls').remove();
91
- });
92
- },
93
-
94
60
  save: function() {
95
-
96
- tinymce.triggerSave();
97
-
61
+ var ed = tinymce.activeEditor;
62
+ el = ed.getElement();
63
+ $(el).val(ed.getContent());
64
+
65
+ //ed.remove();
66
+ //tinymce.triggerSave();
67
+
98
68
  this.attribute.value = $('#'+this.el).val();
99
69
  if (this.attribute.value == this.attribute.value_clean)
100
70
  return;
101
-
102
- this.hide_controls();
103
- this.show_loader();
71
+
104
72
  var this2 = this;
105
73
  this.model.save(this.attribute, function(resp) {
106
74
  if (resp.error)
@@ -110,11 +78,12 @@ BoundRichText = BoundControl.extend({
110
78
  }
111
79
  else
112
80
  {
81
+ tinymce.activeEditor.remove();
113
82
  this2.show_check(500);
114
83
  $('#'+this2.el).val(this2.attribute.value);
115
84
  $('#'+this2.el).removeClass('dirty');
116
- var ed = tinymce.EditorManager.get(this2.el);
117
- ed.getBody().style.backgroundColor = "#fff";
85
+ //var ed = tinymce.EditorManager.get(this2.el);
86
+ //ed.getBody().style.backgroundColor = "#fff";
118
87
 
119
88
  if (this2.binder.success)
120
89
  this2.binder.success(this2);
@@ -122,24 +91,16 @@ BoundRichText = BoundControl.extend({
122
91
  });
123
92
  },
124
93
 
125
- cancel: function() {
126
- if (this.attribute.before_cancel) this.attribute.before_cancel();
127
- if ($('#'+this.el).val() != this.attribute.value_clean)
128
- {
129
- if (confirm('This box has unsaved changes. Hit OK to save changes, Cancel to discard.'))
130
- {
131
- this.attribute.value = $('#'+this.el).val();
132
- this.attribute.value_clean = $('#'+this.el).val();
133
- this.save();
134
- }
135
- }
94
+ cancel: function() {
95
+ if (this.attribute.before_cancel) this.attribute.before_cancel();
136
96
  this.attribute.value = this.attribute.value_clean;
137
97
  $('#'+this.el).val(this.attribute.value);
138
98
  $('#'+this.el).removeClass('dirty');
139
99
 
140
100
  if ($('#'+this.el+'_check').length)
141
- this.hide_check();
142
- tinymce.execCommand("mceRemoveEditor", false, this.el);
101
+ this.hide_check();
102
+
103
+ tinymce.activeEditor.remove();
143
104
  if (this.attribute.after_cancel) this.attribute.after_cancel();
144
105
  },
145
106
 
@@ -79,13 +79,16 @@ BoundText = BoundControl.extend({
79
79
  });
80
80
  },
81
81
 
82
- cancel: function() {
82
+ cancel: function() {
83
+ if (this.attribute.before_cancel) this.attribute.before_cancel();
83
84
  this.attribute.value = this.attribute.value_clean;
84
85
  $('#'+this.el).val(this.attribute.value);
85
86
  $('#'+this.el).removeClass('dirty');
86
87
 
87
88
  if ($('#'+this.el+'_check').length)
88
89
  this.hide_check();
90
+
91
+ if (this.attribute.after_cancel) this.attribute.after_cancel();
89
92
  },
90
93
 
91
94
  error: function(str) {
@@ -84,5 +84,12 @@ ModelBinder.prototype = {
84
84
  }
85
85
  });
86
86
  return attrib;
87
+ },
88
+
89
+ cancel: function()
90
+ {
91
+ $(this.controls).each(function(i, control) {
92
+ control.cancel();
93
+ });
87
94
  }
88
95
  };
@@ -5,21 +5,16 @@ tinymce.PluginManager.add('caboose', function(editor, url) {
5
5
  text: 'Save',
6
6
  icon: false,
7
7
  onclick: function() {
8
- tinymce.activeEditor.plugins.autosave.storeDraft();
9
-
10
8
  var control = ModelBinder.tinymce_current_control();
11
9
  if (!control) return;
12
- control.save();
13
- control.cancel();
10
+ control.save();
14
11
  }
15
12
  });
16
13
 
17
14
  editor.addButton('caboose_cancel', {
18
15
  text: 'Cancel',
19
16
  icon: false,
20
- onclick: function() {
21
- tinymce.activeEditor.plugins.autosave.storeDraft();
22
-
17
+ onclick: function() {
23
18
  var control = ModelBinder.tinymce_current_control();
24
19
  if (!control) return;
25
20
  control.cancel();
@@ -9,6 +9,7 @@
9
9
  * compiled file, but it's generally better to create a new file per style scope.
10
10
  *
11
11
  *= require colorbox-rails
12
+ *= require jquery.ui.all
12
13
  *= require caboose/fonts
13
14
  *= require caboose/caboose
14
15
  */
@@ -1 +1,45 @@
1
1
 
2
+ #content .page_block h1 {
3
+ background: transparent;
4
+ border-bottom: none;
5
+ }
6
+
7
+ #pageblocks { list-style: none; margin: 0 20px 0 -20px; padding: 0; min-height: 100px; }
8
+ #pageblocks > li { list-style: none; margin: 0; padding: 0; position: relative; }
9
+ #pageblocks > li:hover { background: #fff799; }
10
+ #pageblocks .ui-selecting { background: #ddd; }
11
+ #pageblocks .ui-selected { background: #fff799; }
12
+
13
+ #pageblocks li .sort_handle { display: none; }
14
+ #pageblocks li .delete_handle { display: none; }
15
+ #pageblocks li:hover .sort_handle { position: absolute; top: 0; right: 22px; display: block; width: 20px; height: 20px; background-color: #ccc; }
16
+ #pageblocks li:hover .delete_handle { position: absolute; top: 0; right: 0px; display: block; width: 20px; height: 20px; background-color: #ccc; }
17
+ #pageblocks li:hover .sort_handle span { margin: 2px 1px; }
18
+ #pageblocks li:hover .delete_handle span { margin: 2px 1px; }
19
+
20
+ .sortable_placeholder {
21
+ background: #ccc;
22
+ height: 100px;
23
+ width: 100%;
24
+ }
25
+
26
+ .page_block.over {
27
+ background: #fef49c;
28
+ }
29
+
30
+ .page_block {
31
+ z-index: 19;
32
+ border: transparent 1px solid;
33
+ margin: 0 0 2px 20px;
34
+ }
35
+
36
+ #page_block_new {
37
+ border: #ccc 1px solid;
38
+ padding: 10px;
39
+ background: #fef49c;
40
+ }
41
+
42
+ #new_blocks_container1 { position: absolute; top: 30px; left: 300px; width: 700px; }
43
+ #new_blocks_container2 { position: relative; }
44
+ #new_blocks { position: absolute; top: 16px; left: 380px; list-style: none; margin: 0; padding: 0; }
45
+ #new_blocks li { list-style: none; margin: 2px; padding: 4px; float: left; background: #eee; border: #ccc 1px solid; }
@@ -35,12 +35,27 @@ module Caboose
35
35
  render :text => block.render(params[:empty_text])
36
36
  end
37
37
 
38
+ # GET /admin/pages/:page_id/blocks/render
39
+ def admin_render_all
40
+ return unless user_is_allowed('pages', 'edit')
41
+ p = Page.find(params[:page_id])
42
+ blocks = p.blocks.collect { |b| {
43
+ :id => b.id,
44
+ :block_type => b.block_type,
45
+ :sort_order => b.sort_order,
46
+ :name => b.name,
47
+ :value => b.value,
48
+ :html => b.render(params[:empty_text])
49
+ }}
50
+ render :json => blocks
51
+ end
52
+
38
53
  # GET /admin/pages/:page_id/blocks/:id/edit
39
54
  def admin_edit
40
55
  return unless user_is_allowed('pages', 'edit')
41
56
  @page = Page.find(params[:page_id])
42
57
  @block = PageBlock.find(params[:id])
43
- render "caboose/page_blocks/admin_edit_#{@block.block_type}", :layout => 'caboose/admin'
58
+ render "caboose/page_blocks/admin_edit_#{@block.block_type}", :layout => 'caboose/modal'
44
59
  end
45
60
 
46
61
  # POST /admin/pages/:page_id/blocks
@@ -53,29 +68,31 @@ module Caboose
53
68
  })
54
69
 
55
70
  b = PageBlock.new
56
- b.page_id = params[:page_id]
71
+ b.page_id = params[:page_id].to_i
57
72
  b.block_type = params[:block_type]
58
- b.sort_order = params[:sort_order].to_i
59
- b.name = params[:name]
60
- b.value = params[:value]
61
-
62
- # Set the new page block order
63
- p = Page.find(b.page_id)
64
- if p.blocks && p.blocks.count > b.sort_order
65
- i = b.sort_order + 1
66
- PageBlock.where("sort_order >= ?", b.sort_order).reorder(:sort_order).each do |b2|
67
- b2.sort_order = i
68
- b2.save
69
- i = i + 1
70
- end
73
+ b.name = params[:name] if params[:name]
74
+ b.value = params[:value] if params[:value]
75
+
76
+ if !params[:index].nil?
77
+ b.sort_order = params[:index].to_i
78
+ elsif params[:after_id]
79
+ b2 = PageBlock.find(params[:after_id].to_i)
80
+ b.sort_order = b2.sort_order + 1
71
81
  end
72
82
 
83
+ i = b.sort_order + 1
84
+ PageBlock.where("page_id = ? and sort_order >= ?", b.page_id, b.sort_order).reorder(:sort_order).each do |b2|
85
+ b2.sort_order = i
86
+ b2.save
87
+ i = i + 1
88
+ end
89
+
73
90
  # Save the block
74
91
  b.save
75
92
 
76
93
  # Send back the response
77
- resp.redirect = "/admin/pages/#{page.id}/edit"
78
- render json: resp
94
+ resp.block = b
95
+ render :json => resp
79
96
  end
80
97
 
81
98
  # PUT /admin/pages/:page_id/blocks/:id
@@ -113,35 +113,63 @@ module Caboose
113
113
  render :layout => 'caboose/admin'
114
114
  end
115
115
 
116
- # GET /admin/pages/1/edit
116
+ # GET /admin/pages/:id/edit
117
117
  def admin_edit_general
118
118
  return unless user_is_allowed('pages', 'edit')
119
119
  @page = Page.find(params[:id])
120
120
  render :layout => 'caboose/admin'
121
121
  end
122
122
 
123
- # GET /admin/pages/1/content
123
+ # GET /admin/pages/:id/content
124
124
  def admin_edit_content
125
125
  return unless user_is_allowed('pages', 'edit')
126
126
  @page = Page.find(params[:id])
127
127
  render :layout => 'caboose/admin'
128
128
  end
129
129
 
130
- # GET /admin/pages/1/css
130
+ # GET /admin/pages/:id/block-order
131
+ def admin_edit_block_order
132
+ return unless user_is_allowed('pages', 'edit')
133
+ @page = Page.find(params[:id])
134
+ render :layout => 'caboose/admin'
135
+ end
136
+
137
+ # PUT /admin/pages/:id/block-order
138
+ def admin_update_block_order
139
+ return unless user_is_allowed('pages', 'edit')
140
+ block_ids = params[:block_ids]
141
+ i = 0
142
+ block_ids.each do |block_id|
143
+ b = PageBlock.find(block_id)
144
+ b.sort_order = i
145
+ b.save
146
+ i = i + 1
147
+ end
148
+ render :json => true
149
+ end
150
+
151
+ # GET /admin/pages/:id/new-blocks
152
+ def admin_new_blocks
153
+ return unless user_is_allowed('pages', 'edit')
154
+ @page = Page.find(params[:id])
155
+ render :layout => 'caboose/admin'
156
+ end
157
+
158
+ # GET /admin/pages/:id/css
131
159
  def admin_edit_css
132
160
  return unless user_is_allowed('pages', 'edit')
133
161
  @page = Page.find(params[:id])
134
162
  render :layout => 'caboose/admin'
135
163
  end
136
164
 
137
- # GET /admin/pages/1/js
165
+ # GET /admin/pages/:id/js
138
166
  def admin_edit_js
139
167
  return unless user_is_allowed('pages', 'edit')
140
168
  @page = Page.find(params[:id])
141
169
  render :layout => 'caboose/admin'
142
170
  end
143
171
 
144
- # GET /admin/pages/1/seo
172
+ # GET /admin/pages/:id/seo
145
173
  def admin_edit_seo
146
174
  return unless user_is_allowed('pages', 'edit')
147
175
  @page = Page.find(params[:id])
@@ -200,7 +228,7 @@ module Caboose
200
228
  render json: resp
201
229
  end
202
230
 
203
- # PUT /admin/pages/1
231
+ # PUT /admin/pages/:id
204
232
  def admin_update
205
233
  return unless user_is_allowed('pages', 'edit')
206
234
 
@@ -311,7 +339,7 @@ module Caboose
311
339
  render json: resp
312
340
  end
313
341
 
314
- # GET /admin/pages/1/delete
342
+ # GET /admin/pages/:page_id/delete
315
343
  def admin_delete_form
316
344
  return unless user_is_allowed('pages', 'delete')
317
345
  @page = Page.find(params[:id])
@@ -330,7 +358,7 @@ module Caboose
330
358
  render json: resp
331
359
  end
332
360
 
333
- # GET /admin/pages/1/sitemap
361
+ # GET /admin/pages/:page_id/sitemap
334
362
  def admin_sitemap
335
363
  return unless user_is_allowed('pages', 'delete')
336
364
  @page = Page.find(params[:id])
@@ -6,45 +6,18 @@ class Caboose::PageBlock < ActiveRecord::Base
6
6
  attr_accessible :id, :page_id, :block_type, :sort_order, :name, :value
7
7
 
8
8
  def render(empty_text = nil)
9
- str = self.send("render_#{self.block_type.downcase}")
10
- return empty_text if empty_text && (str.nil? || str.length == 0)
9
+ str = self.send("render_#{self.block_type.downcase}", empty_text)
10
+ #return empty_text if empty_text && (str.nil? || str.length == 0)
11
11
  return str
12
12
  end
13
13
 
14
- def render_richtext() return self.value end
15
- def render_p() return "<p>#{self.value}</p>" end
16
- def render_h1() return "<h1>#{self.value}</h1>" end
17
- def render_h2() return "<h2>#{self.value}</h2>" end
18
- def render_h3() return "<h3>#{self.value}</h3>" end
19
- def render_h4() return "<h4>#{self.value}</h4>" end
20
- def render_h5() return "<h5>#{self.value}</h5>" end
21
- def render_h6() return "<h6>#{self.value}</h6>" end
14
+ def render_richtext(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<p>#{empty_text}</p>" : self.value end
15
+ def render_p(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<p>#{empty_text}</p>" : "<p>#{self.value}</p>" end
16
+ def render_h1(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h1>#{empty_text}</h1>" : "<h1>#{self.value}</h1>" end
17
+ def render_h2(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h2>#{empty_text}</h2>" : "<h2>#{self.value}</h2>" end
18
+ def render_h3(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h3>#{empty_text}</h3>" : "<h3>#{self.value}</h3>" end
19
+ def render_h4(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h4>#{empty_text}</h4>" : "<h4>#{self.value}</h4>" end
20
+ def render_h5(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h5>#{empty_text}</h5>" : "<h5>#{self.value}</h5>" end
21
+ def render_h6(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h6>#{empty_text}</h6>" : "<h6>#{self.value}</h6>" end
22
22
 
23
- def render_posts
24
- return ""
25
- #obj = Caboose::StdClass(JSON.parse(self.value))
26
- #defaults = {
27
- # 'limit' => 10,
28
- # 'no_posts_message' => "<p>There are no posts right now.</p>",
29
- # 'invalid_category_message' => "<p>Invalid post category.</p>",
30
- # 'body_character_limit' => 0
31
- #}
32
- #defaults.each { |k,v| obj[k] = v if obj[k].nil? }
33
- #
34
- #return obj.invalid_category_message if !Caboose::PostCategory.exists?(obj.category_id)
35
- #cat = Caboose::PostCategory.find(obj.category_id)
36
- #posts = obj.limit == 0 ? cat.posts.reorder('created_at DESC') : cat.posts.reorder('created_at DESC').limit(obj.limit)
37
- #return obj.no_posts_message posts.nil? || posts.count == 0
38
- #
39
- #str = ""
40
- #posts.each do |p|
41
- # str = "<div class='post'>"
42
- # str << "<h2>#{raw p.title}</h2>"
43
- # str << "<div class='created_at'>#{p.created_at.strftime('%F %T')}</div>"
44
- # str << "<div class='post_content'>"
45
- # str << obj.body_character_limit > 0 ? Caboose.teaser_text(p.body, obj.body_character_limit) : p.body
46
- # str << "</div>"
47
- # str << "</div>"
48
- #end
49
- end
50
23
  end
@@ -15,6 +15,11 @@
15
15
  </p>
16
16
  </form>
17
17
 
18
+ <% content_for :caboose_css do %>
19
+ <style type="text/css">
20
+ #modal_content input[type="checkbox"] { position: relative; }
21
+ </style>
22
+ <% end %>
18
23
  <% content_for :caboose_js do %>
19
24
  <script type='text/javascript'>
20
25
  var modal = new CabooseModal(400);
@@ -1,6 +1,4 @@
1
1
 
2
- <%= render :partial => 'caboose/pages/admin_header' %>
3
-
4
2
  <p>Page block type: <%= @block.block_type %></p>
5
3
  <div id='pageblock_<%= @block.id %>_value'></div>
6
4
 
@@ -1,12 +1,8 @@
1
1
 
2
- <%= render :partial => 'caboose/pages/admin_header' %>
3
-
4
- <p>Page block type: <%= @block.block_type %></p>
5
2
  <div id='pageblock_<%= @block.id %>_value'></div>
6
- <p><input type='button' value='Back to page' onclick="window.location='/admin/pages/<%= @page.id %>/content';" /></p>
7
3
 
8
- <%= render :partial => 'caboose/pages/admin_footer' %>
9
4
  <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
10
6
  <script type='text/javascript'>
11
7
 
12
8
  var modal = false;
@@ -26,7 +22,9 @@ $(document).ready(function() {
26
22
  type: 'text',
27
23
  value: <%= raw Caboose.json(@block.value) %>,
28
24
  width: 800,
29
- fixed_placeholder: false
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
30
28
  }]
31
29
  });
32
30
  });
@@ -1,12 +1,8 @@
1
1
 
2
- <%= render :partial => 'caboose/pages/admin_header' %>
3
-
4
- <p>Page block type: <%= @block.block_type %></p>
5
2
  <div id='pageblock_<%= @block.id %>_value'></div>
6
- <p><input type='button' value='Back to page' onclick="window.location='/admin/pages/<%= @page.id %>/content';" /></p>
7
3
 
8
- <%= render :partial => 'caboose/pages/admin_footer' %>
9
4
  <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
10
6
  <script type='text/javascript'>
11
7
 
12
8
  var modal = false;
@@ -26,7 +22,9 @@ $(document).ready(function() {
26
22
  type: 'text',
27
23
  value: <%= raw Caboose.json(@block.value) %>,
28
24
  width: 800,
29
- fixed_placeholder: false
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
30
28
  }]
31
29
  });
32
30
  });
@@ -0,0 +1,33 @@
1
+
2
+ <div id='pageblock_<%= @block.id %>_value'></div>
3
+
4
+ <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
6
+ <script type='text/javascript'>
7
+
8
+ var modal = false;
9
+ $(window).load(function() {
10
+ modal = new CabooseModal(800);
11
+ });
12
+
13
+ $(document).ready(function() {
14
+ m = new ModelBinder({
15
+ name: 'PageBlock',
16
+ id: <%= @block.id %>,
17
+ update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
18
+ authenticity_token: '<%= form_authenticity_token %>',
19
+ attributes: [{
20
+ name: 'value',
21
+ nice_name: 'Content',
22
+ type: 'text',
23
+ value: <%= raw Caboose.json(@block.value) %>,
24
+ width: 800,
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
28
+ }]
29
+ });
30
+ });
31
+
32
+ </script>
33
+ <% end %>
@@ -0,0 +1,33 @@
1
+
2
+ <div id='pageblock_<%= @block.id %>_value'></div>
3
+
4
+ <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
6
+ <script type='text/javascript'>
7
+
8
+ var modal = false;
9
+ $(window).load(function() {
10
+ modal = new CabooseModal(800);
11
+ });
12
+
13
+ $(document).ready(function() {
14
+ m = new ModelBinder({
15
+ name: 'PageBlock',
16
+ id: <%= @block.id %>,
17
+ update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
18
+ authenticity_token: '<%= form_authenticity_token %>',
19
+ attributes: [{
20
+ name: 'value',
21
+ nice_name: 'Content',
22
+ type: 'text',
23
+ value: <%= raw Caboose.json(@block.value) %>,
24
+ width: 800,
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
28
+ }]
29
+ });
30
+ });
31
+
32
+ </script>
33
+ <% end %>
@@ -0,0 +1,33 @@
1
+
2
+ <div id='pageblock_<%= @block.id %>_value'></div>
3
+
4
+ <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
6
+ <script type='text/javascript'>
7
+
8
+ var modal = false;
9
+ $(window).load(function() {
10
+ modal = new CabooseModal(800);
11
+ });
12
+
13
+ $(document).ready(function() {
14
+ m = new ModelBinder({
15
+ name: 'PageBlock',
16
+ id: <%= @block.id %>,
17
+ update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
18
+ authenticity_token: '<%= form_authenticity_token %>',
19
+ attributes: [{
20
+ name: 'value',
21
+ nice_name: 'Content',
22
+ type: 'text',
23
+ value: <%= raw Caboose.json(@block.value) %>,
24
+ width: 800,
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
28
+ }]
29
+ });
30
+ });
31
+
32
+ </script>
33
+ <% end %>
@@ -0,0 +1,33 @@
1
+
2
+ <div id='pageblock_<%= @block.id %>_value'></div>
3
+
4
+ <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
6
+ <script type='text/javascript'>
7
+
8
+ var modal = false;
9
+ $(window).load(function() {
10
+ modal = new CabooseModal(800);
11
+ });
12
+
13
+ $(document).ready(function() {
14
+ m = new ModelBinder({
15
+ name: 'PageBlock',
16
+ id: <%= @block.id %>,
17
+ update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
18
+ authenticity_token: '<%= form_authenticity_token %>',
19
+ attributes: [{
20
+ name: 'value',
21
+ nice_name: 'Content',
22
+ type: 'text',
23
+ value: <%= raw Caboose.json(@block.value) %>,
24
+ width: 800,
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
28
+ }]
29
+ });
30
+ });
31
+
32
+ </script>
33
+ <% end %>
@@ -1,12 +1,8 @@
1
1
 
2
- <%= render :partial => 'caboose/pages/admin_header' %>
3
-
4
- <p>Page block type: <%= @block.block_type %></p>
5
2
  <div id='pageblock_<%= @block.id %>_value'></div>
6
- <p><input type='button' value='Back to page' onclick="window.location='/admin/pages/<%= @page.id %>/content';" /></p>
7
3
 
8
- <%= render :partial => 'caboose/pages/admin_footer' %>
9
4
  <% content_for :caboose_js do %>
5
+ <%= javascript_include_tag "caboose/model/all" %>
10
6
  <script type='text/javascript'>
11
7
 
12
8
  var modal = false;
@@ -26,7 +22,9 @@ $(document).ready(function() {
26
22
  type: 'richtext',
27
23
  value: <%= raw Caboose.json(@block.value) %>,
28
24
  width: 800,
29
- fixed_placeholder: false
25
+ fixed_placeholder: false,
26
+ after_update: function() { parent.controller.render_blocks(); modal.close(); },
27
+ after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
30
28
  }]
31
29
  });
32
30
  });
@@ -1,24 +1,38 @@
1
1
  <% content_for :caboose_css do %>
2
2
  <% end %>
3
3
  <% content_for :caboose_js do %>
4
- <%= javascript_include_tag "caboose/model/all" %>
4
+ <%
5
+ #javascript_include_tag "caboose/model/all"
6
+ %>
7
+ <%= javascript_include_tag "caboose/model/class" %>
8
+ <%= javascript_include_tag "caboose/model/model" %>
9
+ <%= javascript_include_tag "caboose/model/attribute" %>
10
+ <%= javascript_include_tag "caboose/model/model_binder" %>
11
+ <%= javascript_include_tag "caboose/model/bound_control" %>
12
+ <%= javascript_include_tag "caboose/model/bound_checkbox" %>
13
+ <%= javascript_include_tag "caboose/model/bound_checkbox_multiple" %>
14
+ <%= javascript_include_tag "caboose/model/bound_image" %>
15
+ <%= javascript_include_tag "caboose/model/bound_select" %>
16
+ <%= javascript_include_tag "caboose/model/bound_text" %>
17
+ <%= javascript_include_tag "caboose/model/bound_textarea" %>
18
+ <%= javascript_include_tag "caboose/model/bound_richtext" %>
5
19
  <% end %>
6
20
 
7
21
  <h1>Edit Page</h1>
8
22
  <ul id='tabs'>
9
23
  <%
10
24
  tabs = {
11
- "/admin/pages/#{@page.id}/edit" => 'General',
12
- "/admin/pages/#{@page.id}/content" => 'Content',
13
- "/admin/pages/#{@page.id}/css" => 'Custom CSS',
14
- "/admin/pages/#{@page.id}/js" => 'Custom JS',
15
- "/admin/pages/#{@page.id}/seo" => 'SEO',
16
- "/admin/pages/#{@page.id}/sitemap" => 'Sitemap',
17
- "/admin/pages/#{@page.id}/delete" => 'Delete Page'
25
+ 'General' => "/admin/pages/#{@page.id}/edit",
26
+ 'Content' => "/admin/pages/#{@page.id}/content",
27
+ 'Custom CSS' => "/admin/pages/#{@page.id}/css",
28
+ 'Custom JS' => "/admin/pages/#{@page.id}/js",
29
+ 'SEO' => "/admin/pages/#{@page.id}/seo",
30
+ 'Sitemap' => "/admin/pages/#{@page.id}/sitemap",
31
+ 'Delete Page' => "/admin/pages/#{@page.id}/delete"
18
32
  }
19
33
 
20
34
  %>
21
- <% tabs.each do |href,text| %>
35
+ <% tabs.each do |text, href| %>
22
36
  <li<%= raw request.fullpath == href ? " class='selected'" : '' %>><a href='<%= href %>'><%= raw text %></a></li>
23
37
  <% end %>
24
38
  <li class='back'><input type='button' value='< Back' onclick="window.location='/admin/pages';" /></li>
@@ -1,9 +1,22 @@
1
1
 
2
2
  <%= render :partial => 'caboose/pages/admin_header' %>
3
-
4
- <% @page.blocks.each do |b| %>
5
- <div id='pageblock_<%= b.id %>'></div>
6
- <% end %>
3
+
4
+ <div id='new_blocks_container1'>
5
+ <div id='new_blocks_container2'>
6
+ <p class='note'>Drag a new block onto the page:</p>
7
+ <ul id='new_blocks'>
8
+ <li id='new_block_h1'>H1</li>
9
+ <li id='new_block_h2'>H2</li>
10
+ <li id='new_block_h3'>H3</li>
11
+ <li id='new_block_h4'>H4</li>
12
+ <li id='new_block_h5'>H5</li>
13
+ <li id='new_block_h6'>H6</li>
14
+ <li id='new_block_richtext'>Rich Text</li>
15
+ </ul>
16
+ </div>
17
+ </div>
18
+
19
+ <ul id='pageblocks'></ul>
7
20
 
8
21
  <%= render :partial => 'caboose/pages/admin_footer' %>
9
22
 
@@ -15,16 +28,10 @@
15
28
  <%= javascript_include_tag 'caboose/admin_page_edit_content' %>
16
29
  <script type='text/javascript'>
17
30
 
18
- var modal = false;
19
- $(window).load(function() {
20
- modal = new CabooseModal(800);
21
- });
22
-
31
+ var controller = false;
23
32
  $(document).ready(function() {
24
- var ed = new PageContentEditor(<%= @page.id %>);
33
+ controller = new PageContentController(<%= @page.id %>);
25
34
  });
26
35
 
27
36
  </script>
28
- <%= tinymce_assets %>
29
- <%= tinymce :caboose, width: '800px', height:'300px' %>
30
37
  <% end %>
@@ -61,6 +61,9 @@ Caboose::Engine.routes.draw do
61
61
  get "admin/pages/:id/css" => "pages#admin_edit_css"
62
62
  get "admin/pages/:id/js" => "pages#admin_edit_js"
63
63
  get "admin/pages/:id/seo" => "pages#admin_edit_seo"
64
+ get "admin/pages/:id/block-order" => "pages#admin_edit_block_order"
65
+ put "admin/pages/:id/block-order" => "pages#admin_update_block_order"
66
+ get "admin/pages/:id/new-blocks" => "pages#admin_new_blocks"
64
67
  get "admin/pages/:id/content" => "pages#admin_edit_content"
65
68
  put "admin/pages/:id" => "pages#admin_update"
66
69
  get "admin/pages" => "pages#admin_index"
@@ -68,6 +71,7 @@ Caboose::Engine.routes.draw do
68
71
  delete "admin/pages/:id" => "pages#admin_delete"
69
72
 
70
73
  get "admin/pages/:page_id/blocks/new" => "page_blocks#admin_new"
74
+ get "admin/pages/:page_id/blocks/render" => "page_blocks#admin_render_all"
71
75
  get "admin/pages/:page_id/blocks/:id/render" => "page_blocks#admin_render"
72
76
  get "admin/pages/:page_id/blocks/:id/edit" => "page_blocks#admin_edit"
73
77
  get "admin/pages/:page_id/blocks/:id" => "page_blocks#admin_show"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.3.6'
2
+ VERSION = '0.3.7'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-30 00:00:00.000000000 Z
11
+ date: 2014-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -128,6 +128,7 @@ files:
128
128
  - app/assets/images/caboose/search.png
129
129
  - app/assets/javascripts/caboose/admin.js
130
130
  - app/assets/javascripts/caboose/admin_page_edit_content.js
131
+ - app/assets/javascripts/caboose/admin_page_new_blocks.js
131
132
  - app/assets/javascripts/caboose/application.js
132
133
  - app/assets/javascripts/caboose/modal.js
133
134
  - app/assets/javascripts/caboose/modal_integration.js
@@ -214,6 +215,10 @@ files:
214
215
  - app/views/caboose/page_blocks/admin_edit.html.erb
215
216
  - app/views/caboose/page_blocks/admin_edit_h1.html.erb
216
217
  - app/views/caboose/page_blocks/admin_edit_h2.html.erb
218
+ - app/views/caboose/page_blocks/admin_edit_h3.html.erb
219
+ - app/views/caboose/page_blocks/admin_edit_h4.html.erb
220
+ - app/views/caboose/page_blocks/admin_edit_h5.html.erb
221
+ - app/views/caboose/page_blocks/admin_edit_h6.html.erb
217
222
  - app/views/caboose/page_blocks/admin_edit_richtext.html.erb
218
223
  - app/views/caboose/pages/_admin_footer.html.erb
219
224
  - app/views/caboose/pages/_admin_header.html.erb