caboose-cms 0.4.7 → 0.4.8

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTVlNmIwMzQ5ZDlhYTMyNTAxNzQ3NDhhY2Y0NzBhNjA2Mzg4YWUxMA==
4
+ YWRkMDE4MzQwODc3N2YyMTQ5ZmY4Mzc3MjkyNjFjNzJlYjBmNDBhNA==
5
5
  data.tar.gz: !binary |-
6
- NThkNWI1NTI5ODhmMGEzNTM5Yzg5ZjU5MmNkOTEyZThhMGM0MjE0NA==
6
+ MWRmMzJmNjEyNjdkZGNjNDM0MTAwNzFjZWVhZGUwNmU2MzRlMmNiMA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MTQwN2MyZmIyMmJkZjFhZGRhMzIyZDg5ZDRiMGU1MzA4Mjc0OTQ5NGRlYjdh
10
- MzFlNjg0YzQyYTBkNzIxMjZiMmNhYzUzNzRkNmNjMTNkMzY5MGNhNWZmNzZi
11
- NWRlY2VkZTljOTA5MTg1MTk4ZmZlNWRhM2MzOGY3NTUwNjM5Yzk=
9
+ NzhhNGFlMmU1NDE1NzFmZjNhMDMwNGIwZjk0ZjA5MDQzM2ZmMDEyY2QzOTdj
10
+ MTg2ZmIyOWFjZTkxNjgxNGFiN2UwMTBjMjQ4OWQ4OTNiNjE0YmQ2ZDI0ZDM2
11
+ MDIxY2Q1Yjg3YmI4YTQxYmYxYzM0MGQ4N2JlYmViN2M1YmYyODI=
12
12
  data.tar.gz: !binary |-
13
- MDk1NjhiNjU5Zjg3ZGE4YmM4ZTZkMWQwN2MwOTZlM2M2YzY5MWUyMDRmNDE5
14
- NzczMzdhYmNjMDQzYmQ3YWIyZjk2ZTk5MTBmMzIxZjY4N2MxMTI0YzIyZTM4
15
- YzliMzhhMDFlYzNkMWVkNzFhN2E2NGNhOWJlM2IzODc4ZTY4NGY=
13
+ NGMyODJlYWI0YjZlODkzYThkNjFkZGJiYjZlMTQ5NmM0NzFjN2EyN2JjNDI1
14
+ ZjQzM2JhODQ4ZjU1MGI1ODU0MzE2NGI3NmE0ZjMwOWUzYTFjODJjYWVhZTI2
15
+ NmY4ZDBlNWJiZjg3NDNhNGZhZDI2MWViMDkyOTJiODUyNmI0NDM=
@@ -131,11 +131,31 @@ module Caboose
131
131
  def admin_edit_content
132
132
  return unless user_is_allowed('pages', 'edit')
133
133
  @page = Page.find(params[:id])
134
- #@block_types = Caboose::BlockType.reorder(:name).all
135
- #render :layout => 'caboose/admin'
134
+ #if @page.top_level_blocks.nil? || @page.top_level_blocks.count == 0
135
+ # redirect_to '/admin/page/:id/layout'
136
+ # return
137
+ #end
136
138
  @editing = true
137
139
  end
138
140
 
141
+ # GET /admin/pages/:id/layout
142
+ def admin_edit_layout
143
+ return unless user_is_allowed('pages', 'edit')
144
+ @page = Page.find(params[:id])
145
+ render :layout => 'caboose/admin'
146
+ end
147
+
148
+ # PUT /admin/pages/:id/layout
149
+ def admin_update_layout
150
+ return unless user_is_allowed('pages', 'edit')
151
+ bt = BlockType.find(params[:block_type_id])
152
+ Block.create(:page_id => params[:id], :block_type_id => params[:block_type_id], :name => bt.name)
153
+ resp = Caboose::StdClass.new({
154
+ 'redirect' => "/admin/pages/#{params[:id]}/content"
155
+ })
156
+ render :json => resp
157
+ end
158
+
139
159
  # GET /admin/pages/:id/block-order
140
160
  def admin_edit_block_order
141
161
  return unless user_is_allowed('pages', 'edit')
@@ -142,6 +142,25 @@ class Caboose::Block < ActiveRecord::Base
142
142
  return erb.result(locals.instance_eval { binding })
143
143
  end
144
144
 
145
+ def partial(name, options)
146
+ defaults = { :modal => false, :empty_text => '', :editing => false, :css => nil, :js => nil }
147
+ options2 = nil
148
+ if options.is_a?(Hash)
149
+ options2 = defaults.merge(options)
150
+ else
151
+ options2 = { :modal => options.modal, :empty_text => options.empty_text, :editing => options.editing, :css => options.css, :js => options.js }
152
+ end
153
+ options2[:block] = self
154
+
155
+ view = ActionView::Base.new(ActionController::Base.view_paths)
156
+ begin
157
+ str = view.render(:partial => "caboose/blocks/#{name}", :locals => options2)
158
+ rescue
159
+ Caboose.log("Partial caboose/blocks/#{name} doesn't exist.")
160
+ end
161
+ return str
162
+ end
163
+
145
164
  def child_block_link
146
165
  return "<div class='new_block' id='new_block_#{self.id}'>New Block</div>"
147
166
  end
@@ -21,7 +21,9 @@ class Caboose::BlockType < ActiveRecord::Base
21
21
  :fixed_placeholder,
22
22
  :options,
23
23
  :options_function,
24
- :options_url
24
+ :options_url,
25
+ :share, # Whether or not to share the block type in the existing block store.
26
+ :downloaded # Whether the full block type has been download or just the name and description.
25
27
 
26
28
  def render_options(empty_text = nil)
27
29
  return eval(self.options_function)
@@ -52,5 +54,23 @@ class Caboose::BlockType < ActiveRecord::Base
52
54
  return nil if self.children.nil? || self.children.count == 0
53
55
  return self.children.collect { |bt| bt.api_hash }
54
56
  end
57
+
58
+ def parse_api_hash(h)
59
+ self.name = h['name']
60
+ self.description = h['description']
61
+ self.block_type_category_id = h['block_type_category_id']
62
+ self.render_function = h['render_function']
63
+ self.use_render_function = h['use_render_function']
64
+ self.use_render_function_for_layout = h['use_render_function_for_layout']
65
+ self.allow_child_blocks = h['allow_child_blocks']
66
+ self.field_type = h['field_type']
67
+ self.default = h['default']
68
+ self.width = h['width']
69
+ self.height = h['height']
70
+ self.fixed_placeholder = h['fixed_placeholder']
71
+ self.options = h['options']
72
+ self.options_function = h['options_function']
73
+ self.options_url = h['options_url']
74
+ end
55
75
 
56
76
  end
@@ -11,10 +11,11 @@ class Caboose::BlockTypeSource < ActiveRecord::Base
11
11
  :priority,
12
12
  :active
13
13
 
14
- def refresh
14
+ # Just get the names and descriptions of all block types from the source
15
+ def refresh_names
15
16
  resp = nil
16
- begin
17
- resp = HTTParty.get("#{self.url}/block-types?token=#{self.token}")
17
+ begin
18
+ resp = HTTParty.get("#{self.url}/caboose/block-types?token=#{self.token}")
18
19
  rescue HTTParty::Error => e
19
20
  Caboose.log(e.message)
20
21
  return false
@@ -28,37 +29,61 @@ class Caboose::BlockTypeSource < ActiveRecord::Base
28
29
  return false
29
30
  end
30
31
 
31
- #block_types.each do |bt|
32
- # Caboose.log(
33
- # next if Caboose::BlockType.where(:name => bt.name).exists?
34
- # #self.recursive_add(bt)
35
- #end
32
+ block_types.each do |h|
33
+ next if Caboose::BlockType.where(:name => bt.name).exists?
34
+ Caboose::BlockType.create(:name => h['name'], :description => h['description'])
35
+ end
36
36
 
37
37
  return true
38
38
  end
39
39
 
40
- def recursive_add(bt, parent_id = nil)
41
- bt2 = Caboose::BlockType.create(
42
- :parent_id => parent_id,
43
- :name => bt.name,
44
- :description => bt.description,
45
- :block_type_category_id => bt.block_type_category_id,
46
- :render_function => bt.render_function,
47
- :use_render_function => bt.use_render_function,
48
- :use_render_function_for_layout => bt.use_render_function_for_layout,
49
- :allow_child_blocks => bt.allow_child_blocks,
50
- :field_type => bt.field_type,
51
- :default => bt.default,
52
- :width => bt.width,
53
- :height => bt.height,
54
- :fixed_placeholder => bt.fixed_placeholder,
55
- :options => bt.options,
56
- :options_function => bt.options_function,
57
- :options_url => bt.options_url
58
- )
59
- bt.children.each do |bt3|
60
- self.recursive_add(bt3, bt2.id)
40
+ # Get the full block type (including children)
41
+ def refresh(name, force = false)
42
+ bt = Caboose::BlockType.where(:name => name).first
43
+ bt = Caboose::BlockType.create(:name => name) if bt.nil?
44
+ return if bt.downloaded && !force
45
+ if force
46
+ bt.children.each { |bt2| bt2.destroy }
61
47
  end
62
- end
63
48
 
49
+ # Try to contact the source URL
50
+ resp = nil
51
+ begin
52
+ resp = HTTParty.get("#{self.url}/caboose/block-types/#{bt.name}?token=#{self.token}")
53
+ rescue HTTParty::Error => e
54
+ Caboose.log(e.message)
55
+ return false
56
+ end
57
+
58
+ # Try to parse the response
59
+ h = nil
60
+ begin
61
+ h = JSON.parse(resp.body)
62
+ rescue
63
+ Caboose.log("Response body isn't valid JSON.")
64
+ return false
65
+ end
66
+
67
+ # Grab all the fields from the hash for the top-level block
68
+ bt.parse_api_hash(h)
69
+ bt.save
70
+
71
+ # Now add all the children
72
+ h['children'].each do |h2|
73
+ recursive_add(h2, bt.id)
74
+ end
75
+
76
+ return true
77
+ end
78
+
79
+ def self.recursive_add(h, parent_id = nil)
80
+ bt = Caboose::BlockType.new(:parent_id => parent_id)
81
+ bt.parse_api_hash(h)
82
+ bt.save
83
+
84
+ h['children'].each do |h2|
85
+ self.recursive_add(h2, bt.id)
86
+ end
87
+ return bt
88
+ end
64
89
  end
@@ -138,7 +138,7 @@ class Caboose::Schema < Caboose::Utilities::Schema
138
138
  [ :render_function , :text ],
139
139
  [ :use_render_function , :boolean , { :default => false }],
140
140
  [ :use_render_function_for_layout , :boolean , { :default => false }],
141
- [ :allow_child_blocks , :boolean , { :default => false }],
141
+ [ :allow_child_blocks , :boolean , { :default => false }],
142
142
 
143
143
  # Used for field values
144
144
  [ :field_type , :string ],
@@ -148,7 +148,11 @@ class Caboose::Schema < Caboose::Utilities::Schema
148
148
  [ :fixed_placeholder , :boolean ],
149
149
  [ :options , :text ],
150
150
  [ :options_function , :text ],
151
- [ :options_url , :string ]
151
+ [ :options_url , :string ],
152
+
153
+ # Used for sharing block types
154
+ [ :share , :boolean , { :default => true }],
155
+ [ :downloaded , :boolean , { :default => false }]
152
156
  ],
153
157
  Caboose::BlockTypeCategory => [
154
158
  [ :parent_id , :integer ],
@@ -50,7 +50,7 @@ function refresh_block_types(bts_id)
50
50
  type: 'get',
51
51
  success: function(resp) {
52
52
  if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
53
- if (resp.success) $('#message').empty().append($('<p/>').addClass('note success').html(resp.error));
53
+ if (resp.success) $('#message').empty().append($('<p/>').addClass('note success').html(resp.success));
54
54
  }
55
55
  });
56
56
  }
@@ -21,7 +21,7 @@ page = block.page
21
21
  <div class="container" id='block_<%= block.id %>'>
22
22
  <!--[if lt IE 7]>
23
23
  <p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
24
- <![endif]-->
24
+ <![endif]-->
25
25
  <%= raw block.render('header' , local_assigns) %>
26
26
  <%= raw block.render('content', local_assigns) %>
27
27
  <%= raw block.render('footer' , local_assigns) %>
@@ -1,18 +1,23 @@
1
1
 
2
2
  <% content_for :caboose_css do %>
3
3
  <style type='text/css'>
4
- #back_to_admin {
4
+ #tiny_header {
5
5
  display: block;
6
6
  color: #fff;
7
7
  background-image: url(/assets/caboose/caboose_logo_small.png);
8
8
  background-color: #000;
9
9
  background-repeat: no-repeat;
10
- background-position: 116px 0;
11
- padding: 16px 50px 14px 10px;
10
+ background-position: right 0;
11
+ padding: 0 50px 0 10px;
12
12
  position: absolute;
13
13
  top: 0px;
14
14
  right: 0px;
15
- z-index: 100;
15
+ z-index: 100;
16
+ }
17
+ #tiny_header a {
18
+ display: inline-block;
19
+ color: #fff;
20
+ padding: 16px 10px;
16
21
  }
17
22
  .block_over { background: #fff799; }
18
23
  </style>
@@ -28,11 +33,11 @@ var controller = false;
28
33
  $(document).ready(function() {
29
34
  controller = new PageContentController(<%= @page.id %>);
30
35
 
31
- $('body').append($('<a/>')
32
- .attr('id', 'back_to_admin')
33
- .attr('href', '/admin/pages/<%= @page.id %>/edit')
34
- .html("Back to Admin")
35
- );
36
+ $('body').append($('<div/>')
37
+ .attr('id', 'tiny_header')
38
+ .append($('<a/>').attr('href', '/admin/pages/<%= @page.id %>/edit').html("< Back"))
39
+ .append($('<a/>').attr('href', '/admin/pages/<%= @page.id %>/layout').html("Layout"))
40
+ );
36
41
  });
37
42
 
38
43
  </script>
@@ -9,7 +9,6 @@
9
9
  <div class='field_with_explanation'><div id='page_<%= @page.id %>_alias' ></div><span class='explanation'>Starts the URL over at the domain root.</span></div>
10
10
  <div class='field_with_explanation'><div id='page_<%= @page.id %>_redirect_url' ></div><span class='explanation'>If the redirect URL field is set, then this page will simply redirect to that URL instead of showing the page itself.</span></div>
11
11
  <div class='field_with_explanation'><div id='page_<%= @page.id %>_hide' ></div><span class='explanation'>Whether or not this page is displayed in the menu.</span></div>
12
- <div class='field_with_explanation'><div id='page_<%= @page.id %>_layout' ></div><span class='explanation'>Specify a specific layout file for this page.</span></div>
13
12
  <div class='field_with_explanation'><div id='page_<%= @page.id %>_custom_sort_children' ></div><span class='explanation'>Sort child pages alphabetically or <a href='/admin/pages/<%= @page.id %>/child-order'>custom</a>.</span></div>
14
13
  <div class='field_with_explanation'><div id='page_<%= @page.id %>_content_format' ></div><span class='explanation'>Specify whether or not you want to embed ruby code in your page.</span></div>
15
14
 
@@ -62,8 +61,7 @@ $(document).ready(function() {
62
61
  { name: 'slug' , nice_name: 'Slug' , type: 'text' , value: <%= raw Caboose.json(@page.slug ) %> , width: 400, after_update: function() { update_uri(<%= @page.id %>); } },
63
62
  { name: 'alias' , nice_name: 'Alias' , type: 'text' , value: <%= raw Caboose.json(@page.alias ) %> , width: 400, after_update: function() { update_uri(<%= @page.id %>); } },
64
63
  { name: 'redirect_url' , nice_name: 'Redirect URL' , type: 'text' , value: <%= raw Caboose.json(@page.redirect_url ) %> , width: 400 },
65
- { name: 'hide' , nice_name: 'Hide' , type: 'checkbox' , value: <%= raw @page.hide %> , width: 400 },
66
- { name: 'layout' , nice_name: 'Layout' , type: 'text' , value: <%= raw Caboose.json(@page.layout ) %> , width: 400 },
64
+ { name: 'hide' , nice_name: 'Hide' , type: 'checkbox' , value: <%= raw @page.hide %> , width: 400 },
67
65
  { name: 'custom_sort_children' , nice_name: 'Custom sort children' , type: 'checkbox' , value: <%= raw @page.custom_sort_children %> , width: 400 },
68
66
  { name: 'content_format' , nice_name: 'Content format' , type: 'select' , value: <%= raw Caboose.json(@page.content_format) %>, width: 400, text: <%= raw Caboose.json(@page.content_format) %>, options_url: '/pages/format-options' },
69
67
  ]
@@ -0,0 +1,46 @@
1
+
2
+ <%= render :partial => 'caboose/pages/admin_header' %>
3
+
4
+ <form action='/admin/pages/<%= @page.id %>' method='put' id='layout_form'>
5
+ <input type='hidden' name='authenticity_token' value='<%= form_authenticity_token %>' />
6
+ <p><select name='block_type_id'>
7
+ <option value=''>-- Select a layout --</option>
8
+ <% cat_ids = Caboose::BlockTypeCategory.layouts.collect{ |cat| cat.id } %>
9
+ <% Caboose::BlockType.where("block_type_category_id in (?)", cat_ids).reorder(:description).all.each do |bt| %>
10
+ <option value="<%= bt.id %>"><%= bt.description %></option>
11
+ <% end %>
12
+ </select></p>
13
+ <div id='message'></div>
14
+ <p>
15
+ <input type='button' value='< Back' onclick="window.location='/admin/pages/<%= @page.id %>/edit';" />
16
+ <input type='submit' value='Update Page Layout' />
17
+ </p>
18
+ </form>
19
+
20
+ <%= render :partial => 'caboose/pages/admin_footer' %>
21
+ <% content_for :caboose_js do %>
22
+ <script type='text/javascript'>
23
+
24
+ $(document).ready(function() {
25
+ $('#layout_form').submit(function() {
26
+ update_page_layout(<%= @page.id %>);
27
+ return false;
28
+ });
29
+ });
30
+
31
+ function update_page_layout(page_id)
32
+ {
33
+ $('#message').html("<p class='loading'>Updating layout...</p>");
34
+ $.ajax({
35
+ url: '/admin/pages/' + page_id + '/layout',
36
+ type: 'put',
37
+ data: $('#layout_form').serialize(),
38
+ success: function(resp) {
39
+ if (resp.error) $('#message').html("<p class='note error'>" + resp.error + "</p>");
40
+ if (resp.redirect) window.location = resp.redirect
41
+ }
42
+ });
43
+ }
44
+
45
+ </script>
46
+ <% end %>
@@ -83,7 +83,9 @@ Caboose::Engine.routes.draw do
83
83
  get "admin/pages/:id/child-order" => "pages#admin_edit_child_sort_order"
84
84
  put "admin/pages/:id/child-order" => "pages#admin_update_child_sort_order"
85
85
  get "admin/pages/:id/new-blocks" => "pages#admin_new_blocks"
86
- get "admin/pages/:id/content" => "pages#admin_edit_content"
86
+ get "admin/pages/:id/content" => "pages#admin_edit_content"
87
+ get "admin/pages/:id/layout" => "pages#admin_edit_layout"
88
+ put "admin/pages/:id/layout" => "pages#admin_update_layout"
87
89
  put "admin/pages/:id/viewers" => "pages#admin_update_viewers"
88
90
  put "admin/pages/:id/editors" => "pages#admin_update_editors"
89
91
  put "admin/pages/:id" => "pages#admin_update"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.4.7'
2
+ VERSION = '0.4.8'
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.4.7
4
+ version: 0.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-16 00:00:00.000000000 Z
11
+ date: 2014-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -359,6 +359,7 @@ files:
359
359
  - app/views/caboose/pages/admin_edit_css.html.erb
360
360
  - app/views/caboose/pages/admin_edit_general.html.erb
361
361
  - app/views/caboose/pages/admin_edit_js.html.erb
362
+ - app/views/caboose/pages/admin_edit_layout.html.erb
362
363
  - app/views/caboose/pages/admin_edit_permissions.html.erb
363
364
  - app/views/caboose/pages/admin_edit_seo.html.erb
364
365
  - app/views/caboose/pages/admin_index.html.erb