caboose-cms 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
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