caboose-cms 0.5.201 → 0.5.202

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/admin_block_edit.js +20 -10
  3. data/app/assets/javascripts/caboose/admin_post_edit_content.js +313 -0
  4. data/app/assets/stylesheets/caboose/admin_post_edit_content.css +46 -0
  5. data/app/controllers/caboose/admin_controller.rb +4 -4
  6. data/app/controllers/caboose/application_controller.rb +35 -0
  7. data/app/controllers/caboose/blocks_controller.rb +120 -78
  8. data/app/controllers/caboose/checkout_controller.rb +6 -0
  9. data/app/controllers/caboose/posts_controller.rb +87 -21
  10. data/app/controllers/caboose/sites_controller.rb +13 -1
  11. data/app/models/caboose/block.rb +14 -4
  12. data/app/models/caboose/caboose_plugin.rb +4 -0
  13. data/app/models/caboose/core_plugin.rb +1 -1
  14. data/app/models/caboose/post.rb +51 -7
  15. data/app/models/caboose/schema.rb +10 -3
  16. data/app/models/caboose/site.rb +5 -0
  17. data/app/views/caboose/admin/index.html.erb +43 -30
  18. data/app/views/caboose/application/show.html.erb +1 -1
  19. data/app/views/caboose/blocks/_layout_basic.html.erb +1 -1
  20. data/app/views/caboose/blocks/_layout_basic_content.html.erb +1 -1
  21. data/app/views/caboose/blocks/_layout_post.html.erb +28 -0
  22. data/app/views/caboose/blocks/_layout_post_content.html.erb +10 -0
  23. data/app/views/caboose/blocks/_layout_post_footer.html.erb +3 -0
  24. data/app/views/caboose/blocks/_layout_post_header.html.erb +3 -0
  25. data/app/views/caboose/blocks/_post.html.erb +30 -0
  26. data/app/views/caboose/blocks/admin_edit.html.erb +6 -7
  27. data/app/views/caboose/blocks/admin_new.html.erb +4 -3
  28. data/app/views/caboose/posts/_admin_header.html.erb +1 -0
  29. data/app/views/caboose/posts/admin_edit_content.html.erb +14 -21
  30. data/app/views/caboose/posts/admin_edit_content_old.html.erb +32 -0
  31. data/app/views/caboose/posts/admin_edit_general.html.erb +25 -12
  32. data/app/views/caboose/posts/admin_edit_layout.html.erb +48 -0
  33. data/app/views/caboose/posts/admin_edit_preview.html.erb +27 -0
  34. data/app/views/caboose/posts/show.html.erb +16 -0
  35. data/app/views/caboose/sites/admin_edit.html.erb +7 -5
  36. data/app/views/caboose/social/admin_edit.html.erb +1 -1
  37. data/app/views/layouts/caboose/application.html.erb +12 -6
  38. data/config/routes.rb +299 -278
  39. data/lib/caboose/version.rb +1 -1
  40. data/lib/tasks/caboose.rake +15 -1
  41. metadata +13 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NWFhNjhhZjc5NGZjNDE4MWI2OGQzZTEyNWUwZTRkYTAyODllMzY5Mw==
4
+ YzIwZTAxZjI1NzYyZDNkMTBhOGNlZGZhY2JkMzEwYzg5ZmY2NzNlMQ==
5
5
  data.tar.gz: !binary |-
6
- ZTMwNzVmY2RhZWFlMTI2YTMwNmU4YjU4OWNkYWQyOTU5Yzk5Yjc2Mg==
6
+ MTkwNThiMTFjNTEzZTZhOGJmMTgzMzM2N2U2N2U3MjE1MTU3OGJhNg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OTI0Yjg1YWRjOGFmOGY2NjMzYzc3ODc0MGE0NjVmYjNkN2I2OGQxODNlZGI3
10
- MGQ1ZTFmYWRkOGY5YTg5YjQyMDdkNjBhMmMxNmU5YTZkMzZlNjQyOWQ4MWNm
11
- NmE4NjNhMDc3NTBmYjFlNTQ3YmI0NzUxOGU4MDA0ZTRjMDNiMjI=
9
+ MTNkN2IzOTYwNWViODAzOWZlZjEyOTQ3NjQwYjlhNzE5YWJjMTk2YjIxZTQx
10
+ N2YwODk4NzRkZDFkMTNiOWVlMTVhNGFkMGE1ODBhZTFlNDM4NzdiODFkZjdm
11
+ MzAwZmU3YzNiZWIyMzU3MWRjZTJkZTQyNTAwNWM0NzBlMDgzM2Y=
12
12
  data.tar.gz: !binary |-
13
- ODdjM2MzNzM1MWQ2ZTQzYTUwZmRmZDE2NWQ4MzI5ZGZkOTJjODMyNTQ1ZDgy
14
- MWRjYTkwNTE4ZjVjNWJiYjUyODI0ZWZhZmMzYzQ1NzMzZjI0MGE1ODAyMDJh
15
- NGQ5ZDZmMWRjMGZmNjQ0MjVkYjBiMjY5MTQ4ZTgyNWM3ZGU3ZGY=
13
+ MmM1YTE0MTFmNzFmNzhiZGQwNzAwOThiM2RmODQ1OWNmNTA3Zjc5Y2I3ZDNj
14
+ NWE0ZTZhMzI3YWQ4OGNkODI0ZjExMDU5N2VlMzUzN2ExZTEzMzNmZWMwMzg4
15
+ YTExNDcyY2ZjNzZkNmQ3OTliZDc1NmVkMjcxZWEyMWNiOWQxNDg=
@@ -19,10 +19,20 @@ BlockController.prototype = {
19
19
  this.set_child_blocks_editable();
20
20
  this.set_clickable();
21
21
  },
22
+
23
+ base_url: function(b)
24
+ {
25
+ return '/admin/' + (b.page_id ? 'pages/' + b.page_id : 'posts/' + b.post_id) + '/blocks';
26
+ },
27
+
28
+ block_url: function(b)
29
+ {
30
+ return this.base_url(b) + '/' + b.id;
31
+ },
22
32
 
23
33
  edit_block: function(block_id)
24
- {
25
- window.location = '/admin/pages/' + this.block.page_id + '/blocks/' + block_id + '/edit';
34
+ {
35
+ window.location = this.block_url(that.block) + '/edit';
26
36
  },
27
37
 
28
38
  /*****************************************************************************
@@ -33,7 +43,7 @@ BlockController.prototype = {
33
43
  {
34
44
  var that = this;
35
45
  $.ajax({
36
- url: '/admin/pages/' + this.block.page_id + '/blocks/tree',
46
+ url: that.base_url(that.block) + '/tree',
37
47
  success: function(blocks) {
38
48
  $(blocks).each(function(i,b) {
39
49
  that.set_clickable_helper(b);
@@ -139,17 +149,17 @@ BlockController.prototype = {
139
149
  if (bt.fixed_placeholder) h['fixed_placeholder'] = bt.fixed_placeholder;
140
150
  if (bt.options || bt.options_function) h['options_url'] = '/admin/block-types/' + bt.id + '/options';
141
151
  else if (bt.options_url) h['options_url'] = bt.options_url;
142
- if (bt.field_type == 'file') h['update_url'] = '/admin/pages/' + b.page_id + '/blocks/' + b.id + '/file';
152
+ if (bt.field_type == 'file') h['update_url'] = that.block_url(b) + '/file';
143
153
  if (bt.field_type == 'image')
144
154
  {
145
- h['update_url'] = '/admin/pages/' + b.page_id + '/blocks/' + b.id + '/image'
155
+ h['update_url'] = that.block_url(b) + '/image'
146
156
  h['image_refresh_delay'] = 100;
147
157
  }
148
158
 
149
159
  m = new ModelBinder({
150
160
  name: 'Block',
151
161
  id: b.id,
152
- update_url: '/admin/pages/' + b.page_id + '/blocks/' + b.id,
162
+ update_url: that.block_url(b),
153
163
  authenticity_token: that.authenticity_token,
154
164
  attributes: [h]
155
165
  });
@@ -206,7 +216,7 @@ BlockController.prototype = {
206
216
  }
207
217
  modal.autosize("<p class='loading'>Adding block...</p>");
208
218
  $.ajax({
209
- url: '/admin/pages/' + that.block.page_id + '/blocks/' + that.block.id,
219
+ url: that.block_url(block),
210
220
  type: 'post',
211
221
  data: { block_type_id: block_type_id },
212
222
  success: function(resp) {
@@ -230,7 +240,7 @@ BlockController.prototype = {
230
240
  }
231
241
  modal.autosize("<p class='loading'>Deleting block...</p>");
232
242
  $.ajax({
233
- url: '/admin/pages/' + that.block.page_id + '/blocks/' + that.block.id,
243
+ url: that.block_url(that.block),
234
244
  type: 'delete',
235
245
  success: function(resp) {
236
246
  if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
@@ -248,7 +258,7 @@ BlockController.prototype = {
248
258
  var that = this;
249
259
  modal.autosize("<p class='loading'>Moving up...</p>");
250
260
  $.ajax({
251
- url: '/admin/pages/' + that.block.page_id + '/blocks/' + that.block.id + '/move-up',
261
+ url: that.block_url(that.block) + '/move-up',
252
262
  type: 'put',
253
263
  success: function(resp) {
254
264
  if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
@@ -266,7 +276,7 @@ BlockController.prototype = {
266
276
  var that = this;
267
277
  modal.autosize("<p class='loading'>Moving down...</p>");
268
278
  $.ajax({
269
- url: '/admin/pages/' + that.block.page_id + '/blocks/' + that.block.id + '/move-down',
279
+ url: that.block_url(that.block) + '/move-down',
270
280
  type: 'put',
271
281
  success: function(resp) {
272
282
  if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
@@ -0,0 +1,313 @@
1
+
2
+ var PostContentController = function(post_id) { this.init(post_id); };
3
+
4
+ PostContentController.prototype = {
5
+
6
+ post_id: false,
7
+ new_block_type_id: false,
8
+ selected_block_ids: [],
9
+
10
+ init: function(post_id)
11
+ {
12
+ this.post_id = post_id;
13
+ var that = this;
14
+ that.set_clickable();
15
+ that.sortable_blocks();
16
+ // that.draggable_blocks();
17
+ //});
18
+ },
19
+
20
+ sortable_blocks: function()
21
+ {
22
+ //var that = this;
23
+ //$('.sortable').sortable({
24
+ // //hoverClass: "ui-state-active",
25
+ // placeholder: 'sortable-placeholder',
26
+ // forcePlaceholderSize: true,
27
+ // handle: '.sort_handle',
28
+ // receive: function(e, ui) {
29
+ // that.new_block_type_id = ui.item.attr('id').replace('new_block_', '');
30
+ // },
31
+ // update: function(e, ui) {
32
+ // if (that.new_block_type_id)
33
+ // {
34
+ // $.ajax({
35
+ // url: '/admin/posts/' + that.post_id + '/blocks',
36
+ // type: 'post',
37
+ // data: { block_type_id: that.new_block_type_id, index: ui.item.index() },
38
+ // success: function(resp) { that.render_blocks(function() { that.edit_block(resp.block.id); }); }
39
+ // });
40
+ // that.new_block_type_id = false;
41
+ // }
42
+ // else
43
+ // {
44
+ // var ids = [];
45
+ // $.each($(e.target).children(), function(i, el) {
46
+ // var id = $(el).attr('id');
47
+ // if (id && id.substr(0, 6) == 'block_') ids.push(id.substr(6));
48
+ // });
49
+ //
50
+ // $.ajax({
51
+ // url: '/admin/posts/' + that.post_id + '/block-order',
52
+ // type: 'put',
53
+ // data: {
54
+ // block_ids: ids,
55
+ // },
56
+ // success: function(resp) {}
57
+ // });
58
+ // }
59
+ // }
60
+ //});
61
+ },
62
+
63
+ draggable_blocks: function()
64
+ {
65
+ $('#new_blocks li').draggable({
66
+ dropOnEmpty: true,
67
+ connectToSortable: "#blocks",
68
+ helper: "clone",
69
+ revert: "invalid"
70
+ });
71
+ },
72
+
73
+ edit_block: function(block_id)
74
+ {
75
+ caboose_modal_url('/admin/posts/' + this.post_id + '/blocks/' + block_id + '/edit');
76
+ },
77
+
78
+ new_block: function(block_id)
79
+ {
80
+ console.log('this.post_id = ' + this.post_id);
81
+ console.log('block_id = ' + block_id);
82
+ caboose_modal_url('/admin/posts/' + this.post_id + '/blocks/' + block_id + '/new');
83
+ },
84
+
85
+ select_block: function(block_id)
86
+ {
87
+ i = this.selected_block_ids.indexOf(block_id);
88
+ if (i == -1) // Not there
89
+ {
90
+ this.selected_block_ids.push(block_id);
91
+ $('#block_' + block_id).addClass('selected');
92
+ }
93
+ else
94
+ {
95
+ this.selected_block_ids.splice(i, 1);
96
+ $('#block_' + block_id).removeClass('selected');
97
+ }
98
+ },
99
+
100
+ delete_block: function(block_id, confirm)
101
+ {
102
+ var that = this;
103
+ if (!confirm)
104
+ {
105
+ if (this.selected_block_ids.indexOf(block_id) == -1)
106
+ this.selected_block_ids.push(block_id);
107
+ var other_count = this.selected_block_ids.length - 1;
108
+
109
+ var message = "Are you sure you want to delete this block";
110
+ if (other_count > 0)
111
+ message += " and the " + other_count + " other selected block" + (other_count == 1 ? '' : 's');
112
+ message += "?<br />";
113
+
114
+ var p = $('<p/>')
115
+ .addClass('caboose_note')
116
+ .append(message)
117
+ .append($('<input/>').attr('type', 'button').val('Yes').click(function(e) { e.preventDefault(); e.stopPropagation(); that.delete_block(block_id, true); })).append(" ")
118
+ .append($('<input/>').attr('type', 'button').val('No').click(function(e) { e.preventDefault(); e.stopPropagation(); that.render_blocks(); }));
119
+ $('#block_' + block_id).attr('onclick','').unbind('click');
120
+ $('#block_' + block_id).empty().append(p);
121
+ return;
122
+ }
123
+ for (var i in this.selected_block_ids)
124
+ {
125
+ $.ajax({
126
+ url: '/admin/posts/' + this.post_id + '/blocks/' + this.selected_block_ids[i],
127
+ type: 'delete',
128
+ async: false,
129
+ success: function(resp) {}
130
+ });
131
+ }
132
+ that.render_blocks();
133
+ },
134
+
135
+ move_block_up: function(block_id)
136
+ {
137
+ var that = this;
138
+ this.loadify($('#block_' + block_id + '_move_up_handle span'));
139
+ $.ajax({
140
+ url: '/admin/posts/' + this.post_id + '/blocks/' + block_id + '/move-up',
141
+ type: 'put',
142
+ success: function(resp) {
143
+ if (resp.success) that.render_blocks(function() { that.stop_loadify(); });
144
+ }
145
+ });
146
+ },
147
+
148
+ move_block_down: function(block_id)
149
+ {
150
+ var that = this;
151
+ this.loadify($('#block_' + block_id + '_move_down_handle span'));
152
+ $.ajax({
153
+ url: '/admin/posts/' + this.post_id + '/blocks/' + block_id + '/move-down',
154
+ type: 'put',
155
+ success: function(resp) {
156
+ if (resp.success) that.render_blocks(function() { that.stop_loadify(); });
157
+ }
158
+ });
159
+ },
160
+
161
+ loadify: function(el)
162
+ {
163
+ var that = this;
164
+ if (el.hasClass('ui-icon-arrowrefresh-1-e')) el.removeClass('ui-icon-arrowrefresh-1-e').addClass('ui-icon-arrowrefresh-1-s');
165
+ else if (el.hasClass('ui-icon-arrowrefresh-1-s')) el.removeClass('ui-icon-arrowrefresh-1-s').addClass('ui-icon-arrowrefresh-1-w');
166
+ else if (el.hasClass('ui-icon-arrowrefresh-1-w')) el.removeClass('ui-icon-arrowrefresh-1-w').addClass('ui-icon-arrowrefresh-1-n');
167
+ else if (el.hasClass('ui-icon-arrowrefresh-1-n')) el.removeClass('ui-icon-arrowrefresh-1-n').addClass('ui-icon-arrowrefresh-1-e');
168
+ else el.addClass('ui-icon-arrowrefresh-1-e');
169
+ this.loadify_el = el;
170
+ this.loadify_timer = setTimeout(function() { that.loadify(el); }, 200);
171
+ },
172
+
173
+ stop_loadify: function()
174
+ {
175
+ if (this.loadify_el)
176
+ {
177
+ this.loadify_el.removeClass('ui-icon-arrowrefresh-1-e')
178
+ .removeClass('ui-icon-arrowrefresh-1-s')
179
+ .removeClass('ui-icon-arrowrefresh-1-w')
180
+ .removeClass('ui-icon-arrowrefresh-1-n');
181
+ }
182
+ if (this.loadify_timer)
183
+ clearTimeout(this.loadify_timer);
184
+ },
185
+
186
+ /*****************************************************************************
187
+ Block Rendering
188
+ *****************************************************************************/
189
+
190
+ render_blocks: function(before_render) {
191
+ $('.sortable').sortable('destroy');
192
+ var that = this;
193
+ $.ajax({
194
+ url: '/admin/posts/' + this.post_id + '/blocks/render-second-level',
195
+ success: function(blocks) {
196
+ if (before_render) before_render();
197
+ $(blocks).each(function(i, b) {
198
+ $('#block_' + b.id).replaceWith(b.html);
199
+ });
200
+ that.set_clickable();
201
+ that.sortable_blocks();
202
+ that.selected_block_ids = [];
203
+ }
204
+ });
205
+ },
206
+
207
+ set_clickable: function()
208
+ {
209
+ var that = this;
210
+ $.ajax({
211
+ url: '/admin/posts/' + this.post_id + '/blocks/tree',
212
+ success: function(blocks) {
213
+ var count = blocks.length;
214
+ $(blocks).each(function(i,b) {
215
+ that.set_clickable_helper(b, false, false, (i == count-1));
216
+ });
217
+ }
218
+ });
219
+ },
220
+
221
+ set_clickable_helper: function(b, parent_id, parent_allows_child_blocks, is_last_child)
222
+ {
223
+ var that = this;
224
+
225
+ $('#block_' + b.id)
226
+ .prepend($('<a/>').attr('id', 'block_' + b.id + '_select_handle' ).addClass('select_handle' ).append($('<span/>').addClass('ui-icon ui-icon-check' )).click(function(e) { e.preventDefault(); e.stopPropagation(); that.select_block(b.id); }))
227
+ .prepend($('<a/>').attr('id', 'block_' + b.id + '_move_up_handle' ).addClass('move_up_handle' ).append($('<span/>').addClass('ui-icon ui-icon-arrow-1-n' )).click(function(e) { e.preventDefault(); e.stopPropagation(); that.move_block_up(b.id); }))
228
+ .prepend($('<a/>').attr('id', 'block_' + b.id + '_move_down_handle' ).addClass('move_down_handle' ).append($('<span/>').addClass('ui-icon ui-icon-arrow-1-s' )).click(function(e) { e.preventDefault(); e.stopPropagation(); that.move_block_down(b.id); }))
229
+ .prepend($('<a/>').attr('id', 'block_' + b.id + '_delete_handle' ).addClass('delete_handle' ).append($('<span/>').addClass('ui-icon ui-icon-close' )).click(function(e) { e.preventDefault(); e.stopPropagation(); that.delete_block(b.id); }));
230
+
231
+ if (parent_allows_child_blocks && (!b.name || b.name.length == 0))
232
+ {
233
+ $('#block_' + b.id).prepend($('<div/>')
234
+ .addClass('new_block_link')
235
+ .append($('<div/>').addClass('line'))
236
+ .append($('<a/>')
237
+ .attr('href', '#')
238
+ .html("New Block")
239
+ .click(function(e) {
240
+ e.preventDefault(); e.stopPropagation();
241
+ caboose_modal_url('/admin/posts/' + that.post_id + '/blocks/' + parent_id + '/new?before_id=' + b.id);
242
+ })
243
+ )
244
+ .mouseover(function(e) { $(this).removeClass('new_block_link').addClass('new_block_link_over'); e.stopPropagation(); })
245
+ .mouseout(function(e) { $(this).removeClass('new_block_link_over').addClass('new_block_link'); e.stopPropagation(); })
246
+ );
247
+ if (is_last_child && is_last_child == true)
248
+ {
249
+ $('#block_' + b.id).append($('<div/>')
250
+ .addClass('new_block_link')
251
+ .append($('<div/>').addClass('line'))
252
+ .append($('<a/>')
253
+ .attr('href', '#')
254
+ .html("New Block")
255
+ .click(function(e) {
256
+ e.preventDefault(); e.stopPropagation();
257
+ caboose_modal_url('/admin/posts/' + that.post_id + '/blocks/' + parent_id + '/new?after_id=' + b.id);
258
+ })
259
+ )
260
+ .mouseover(function(e) { $(this).removeClass('new_block_link').addClass('new_block_link_over'); e.stopPropagation(); })
261
+ .mouseout(function(e) { $(this).removeClass('new_block_link_over').addClass('new_block_link'); e.stopPropagation(); })
262
+ );
263
+ }
264
+ }
265
+
266
+ $('#block_' + b.id).attr('onclick','').unbind('click');
267
+ $('#block_' + b.id).click(function(e) {
268
+ e.stopPropagation();
269
+ that.edit_block(b.id);
270
+ });
271
+
272
+ var show_mouseover = true;
273
+ if (b.children && b.children.length > 0)
274
+ {
275
+ var count = b.children.length;
276
+ $.each(b.children, function(i, b2) {
277
+ if (b2.field_type == 'block')
278
+ show_mouseover = false;
279
+ that.set_clickable_helper(b2, b.id, b.allow_child_blocks, i == (count-1));
280
+ });
281
+ }
282
+ //if (b.allow_child_blocks)
283
+ //{
284
+ // $('#block_' + b.id).after($('<div/>')
285
+ // .addClass('new_block_link')
286
+ // .append($('<div/>').addClass('line'))
287
+ // .append($('<a/>')
288
+ // .attr('href', '#')
289
+ // .html("New Block")
290
+ // .click(function(e) {
291
+ // e.preventDefault(); e.stopPropagation();
292
+ // caboose_modal_url('/admin/posts/' + that.post_id + '/blocks/' + b.id + '/new?after_id=' + b.id);
293
+ // })
294
+ // )
295
+ // .mouseover(function(e) { $(this).removeClass('new_block_link').addClass('new_block_link_over'); e.stopPropagation(); })
296
+ // .mouseout(function(e) { $(this).removeClass('new_block_link_over').addClass('new_block_link'); e.stopPropagation(); })
297
+ // );
298
+ //}
299
+ if (show_mouseover)
300
+ {
301
+ $('#block_' + b.id).mouseover(function(el) { $('#block_' + b.id).addClass( 'block_over'); });
302
+ $('#block_' + b.id).mouseout(function(el) { $('#block_' + b.id).removeClass('block_over'); });
303
+ }
304
+ }
305
+
306
+ };
307
+
308
+ function toggle_blocks()
309
+ {
310
+ $('#new_blocks_container2').slideToggle();
311
+ }
312
+
313
+
@@ -0,0 +1,46 @@
1
+
2
+ #tiny_header {
3
+ display: block;
4
+ color: #fff;
5
+ background-image: url(/assets/caboose/caboose_logo_small.png);
6
+ background-color: #000;
7
+ background-repeat: no-repeat;
8
+ background-position: right 0;
9
+ padding: 0 50px 0 10px;
10
+ position: absolute;
11
+ top: 0px;
12
+ right: 0px;
13
+ z-index: 100000;
14
+ border-left: #fff 1px solid;
15
+ border-bottom: #fff 1px solid;
16
+ }
17
+ #tiny_header a {
18
+ display: inline-block;
19
+ color: #fff;
20
+ padding: 16px 10px;
21
+ }
22
+ .block_over { background: #e3e3e3; }
23
+ .select_handle { display: none; }
24
+ .move_up_handle { display: none; }
25
+ .move_down_handle { display: none; }
26
+ .delete_handle { display: none; }
27
+ .block_over > .select_handle { display: block; position: relative; }
28
+ .block_over > .move_up_handle { display: block; position: relative; }
29
+ .block_over > .move_down_handle { display: block; position: relative; }
30
+ .block_over > .delete_handle { display: block; position: relative; }
31
+ .block_over > .select_handle span { position: absolute; top: 0; right: 54px; width: 18px; height: 18px; background-color: #fff; border: #ccc 1px solid; }
32
+ .block_over > .move_up_handle span { position: absolute; top: 0; right: 36px; width: 18px; height: 18px; background-color: #fff; border: #ccc 1px solid; }
33
+ .block_over > .move_down_handle span { position: absolute; top: 0; right: 18px; width: 18px; height: 18px; background-color: #fff; border: #ccc 1px solid; }
34
+ .block_over > .delete_handle span { position: absolute; top: 0; right: 0px; width: 18px; height: 18px; background-color: #fff; border: #ccc 1px solid; }
35
+
36
+ .selected { background: #fff799; }
37
+
38
+ .new_block_link { position: relative; width: 100%; }
39
+ .new_block_link .line { position: absolute; top: -11px; width: 100%; height: 2px; background: transparent; }
40
+ .new_block_link a { position: absolute; top: -20px; left: 45%; background: transparent; color: transparent !important; display: block; padding: 4px 8px; }
41
+
42
+ .new_block_link_over { position: relative; width: 100%; }
43
+ .new_block_link_over .line { position: absolute; top: -11px; width: 100%; height: 2px; background: #ccc; }
44
+ .new_block_link_over a { position: absolute; top: -22px; left: 45%; color: #fff; background: #666; display: block; padding: 2px 4px; text-decoration: none; font-size: 12px; }
45
+
46
+ .caboose_note { padding: 10px 20px; background: #990000; color: #fff; font-size: 16px; }