caboose-cms 0.4.5 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDEyMWIwNTQ4MDhiNWEwZjQwMmVhMmYwNmRjOGQyOGJhZDQ2Y2VmZA==
4
+ NmUxYjBmZTQ2NTYxZDQ4YWQzMWJlMGY0NzE1MDUzM2JlYmM1ZTBiYg==
5
5
  data.tar.gz: !binary |-
6
- YWVlNzE1MDI5NTkzMGU3ZWZjYWU0ZTYyMDA5MWQ3ZjRjOGRjZDVkMA==
6
+ M2M2MWIwYTkyZmEyYWFkZDM2NWQ3ZjEwOGI5YjBlNWE0NjNjNDNjNg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NTU1MDYwN2MxZTU5ODM4MjlhYWE0MDZkYWZmZjE2YWU3ZjRhMWNjYTk0NGFl
10
- NDU3NTg0NmVmZTkyYzVjZDM5ZDZiNGI0NTRmNzk3YjFiYmNhYTk3Mzg2ZTQ2
11
- OGQxZTI3MjhlNjEwNjIyNjg0N2RlNmNkY2Y1MTg2NzlkMDk3ZGE=
9
+ MzVlNmYzZjU1MWM2Yjc0NjRkMDA2MTc2NjAzOWI1MDVhZmMyZTkxYjY4Mjk2
10
+ Y2JmMGJkZmRkNDI0YTY2OTE4OTJjMGNkNWZkMWQwNDgxYWRhMGU3MjJlMzg3
11
+ YjhlMjRiNzBhOTE0NDdiZmE1M2ZiZGZlMjg2OTc3NzFmNTVkZTI=
12
12
  data.tar.gz: !binary |-
13
- YWI0NjQxMDViYzY5MDljN2Y0MDI0NTEyZmFhZmJkYjg4MjM0YWJiNGQ0MTQ1
14
- MzMxZDYxMTk3NGUxOTE5OTJmZTk2NTM1MTRhMmU2NmRjYjFiOGZkNTEwNGNi
15
- YjEzZTIzZTQ4ZGM5NDNlM2NiMjBiOTMzOGJiYWMyOGFmZjhhMWU=
13
+ NmEyOWFhYTg2MTdkZDdlNmY2ODc4MTliMTIwZTJiMDE4NzUwYmY2YTUxMjYw
14
+ YTQxOTQwZjhkZGI3MjFlOTFkMzU3YTllZTNkY2JhYWM3MDdkZWZhNDVmZDYy
15
+ ZjQ4ZDA4YzRlY2Y2ZWI1NmU5ZTQ3YTZjMTc5MjdhNWE3NzM3YWE=
@@ -0,0 +1,104 @@
1
+ module Caboose
2
+ class BlockTypeSourcesController < ApplicationController
3
+
4
+ #===========================================================================
5
+ # Admin actions
6
+ #===========================================================================
7
+
8
+ # GET /admin/block-type-sources
9
+ def admin_index
10
+ return if !user_is_allowed('blocktypesources', 'view')
11
+ @block_type_sources = BlockTypeSource.reorder("priority, name").all
12
+ render :layout => 'caboose/admin'
13
+ end
14
+
15
+ # GET /admin/block-type-sources/new
16
+ def admin_new
17
+ return unless user_is_allowed('blocktypesources', 'add')
18
+ render :layout => 'caboose/admin'
19
+ end
20
+
21
+ # GET /admin/block-type-sources/:id/edit
22
+ def admin_edit
23
+ return unless user_is_allowed('blocktypesources', 'edit')
24
+ @block_type_source = BlockTypeSource.find(params[:id])
25
+ render :layout => 'caboose/admin'
26
+ end
27
+
28
+ # POST /admin/block-type-sources
29
+ def admin_create
30
+ return unless user_is_allowed('blocktypesources', 'add')
31
+
32
+ resp = Caboose::StdClass.new
33
+ max_priority = BlockTypeSource.maximum(:priority)
34
+ max_priority = 0 if max_priority.nil?
35
+ bts = BlockTypeSource.new(
36
+ :name => params[:name],
37
+ :priority => max_priority + 1,
38
+ :active => true
39
+ )
40
+ bts.save
41
+
42
+ # Send back the response
43
+ resp.redirect = "/admin/block-type-sources/#{bts.id}/edit"
44
+ render :json => resp
45
+ end
46
+
47
+ # PUT /admin/block-type-sources/:id
48
+ def admin_update
49
+ return unless user_is_allowed('blocktypesources', 'edit')
50
+
51
+ resp = StdClass.new({'attributes' => {}})
52
+ bts = BlockTypeSource.find(params[:id])
53
+ save = true
54
+
55
+ params.each do |k,v|
56
+ case k
57
+ when 'name' then bts.name = v
58
+ when 'url' then bts.url = v
59
+ when 'token' then bts.token = v
60
+ when 'priority' then bts.priority = v
61
+ when 'active' then bts.active = v
62
+ end
63
+ end
64
+
65
+ resp.success = save && bts.save
66
+ render :json => resp
67
+ end
68
+
69
+ # DELETE /admin/block-type-sources/:id
70
+ def admin_delete
71
+ return unless user_is_allowed('blocktypesources', 'delete')
72
+ BlockTypeSource.find(params[:id]).destroy
73
+ resp = StdClass.new({
74
+ 'redirect' => "/admin/block-type-sources"
75
+ })
76
+ render :json => resp
77
+ end
78
+
79
+ # GET /admin/block-type-sources/:id/refresh
80
+ def admin_refresh
81
+ return unless user_is_allowed('blocktypesources', 'edit')
82
+
83
+ resp = StdClass.new
84
+
85
+ bts = BlockTypeSource.find(params[:id])
86
+ if bts.refresh
87
+ resp.success = "Block types from the source have been refreshed successfully."
88
+ else
89
+ resp.error = "There was an error refreshing block types from the source."
90
+ end
91
+ render :json => resp
92
+ end
93
+
94
+ # GET /admin/block-type-sources/options
95
+ def admin_options
96
+ return unless user_is_allowed('blocktypesources', 'edit')
97
+ options = BlockType.reorder(:name).all.collect do |bts|
98
+ { 'value' => bts.id, 'text' => bts.name }
99
+ end
100
+ render :json => options
101
+ end
102
+
103
+ end
104
+ end
@@ -158,6 +158,25 @@ module Caboose
158
158
  admin_tree_options_helper(options, bt2, " - #{prefix}")
159
159
  end
160
160
  end
161
+
162
+ #===========================================================================
163
+ # Public Repo Actions
164
+ #===========================================================================
165
+
166
+ # GET /caboose/block-types
167
+ def api_block_type_list
168
+ arr = BlockType.where("parent_id is null and share = ?", true).reorder(:name).all.collect do |bt|
169
+ { 'name' => bt.name, 'description' => bt.description }
170
+ end
171
+ render :json => arr
172
+ end
173
+
174
+ # GET /caboose/block-types/:name
175
+ def api_block_type
176
+ bt = BlockType.where(:name => params[:name]).first
177
+ render :json => { 'error' => 'Invalid block type.' } if bt.nil?
178
+ render :json => bt.api_hash
179
+ end
161
180
 
162
181
  end
163
182
  end
@@ -26,5 +26,31 @@ class Caboose::BlockType < ActiveRecord::Base
26
26
  def render_options(empty_text = nil)
27
27
  return eval(self.options_function)
28
28
  end
29
+
30
+ def api_hash
31
+ return {
32
+ :name => self.name,
33
+ :description => self.description,
34
+ :block_type_category_id => self.block_type_category_id,
35
+ :render_function => self.render_function,
36
+ :use_render_function => self.use_render_function,
37
+ :use_render_function_for_layout => self.use_render_function_for_layout,
38
+ :allow_child_blocks => self.allow_child_blocks,
39
+ :field_type => self.field_type,
40
+ :default => self.default,
41
+ :width => self.width,
42
+ :height => self.height,
43
+ :fixed_placeholder => self.fixed_placeholder,
44
+ :options => self.options,
45
+ :options_function => self.options_function,
46
+ :options_url => self.options_url,
47
+ :children => self.api_hash_children
48
+ }
49
+ end
50
+
51
+ def api_hash_children
52
+ return nil if self.children.nil? || self.children.count == 0
53
+ return self.children.collect { |bt| bt.api_hash }
54
+ end
29
55
 
30
56
  end
@@ -0,0 +1,64 @@
1
+ require 'httparty'
2
+
3
+ class Caboose::BlockTypeSource < ActiveRecord::Base
4
+ self.table_name = "block_type_sources"
5
+
6
+ has_many :block_types, :class_name => 'Caboose::BlockType', :order => 'name'
7
+ attr_accessible :id,
8
+ :name,
9
+ :url,
10
+ :token,
11
+ :priority,
12
+ :active
13
+
14
+ def refresh
15
+ resp = nil
16
+ begin
17
+ resp = HTTParty.get("#{self.url}/block-types?token=#{self.token}")
18
+ rescue HTTParty::Error => e
19
+ Caboose.log(e.message)
20
+ return false
21
+ end
22
+
23
+ block_types = nil
24
+ begin
25
+ block_types = JSON.parse(resp.body)
26
+ rescue
27
+ Caboose.log("Response body isn't valid JSON.")
28
+ return false
29
+ end
30
+
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
36
+
37
+ return true
38
+ end
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)
61
+ end
62
+ end
63
+
64
+ end
@@ -21,12 +21,13 @@ class Caboose::CorePlugin < Caboose::CaboosePlugin
21
21
  'children' => []
22
22
  }
23
23
 
24
- item['children'] << { 'id' => 'users' , 'text' => 'Users' , 'href' => '/admin/users' , 'modal' => false } if user.is_allowed('users' , 'view')
25
- item['children'] << { 'id' => 'roles' , 'text' => 'Roles' , 'href' => '/admin/roles' , 'modal' => false } if user.is_allowed('roles' , 'view')
26
- item['children'] << { 'id' => 'permissions' , 'text' => 'Permissions' , 'href' => '/admin/permissions' , 'modal' => false } if user.is_allowed('permissions' , 'view')
27
- item['children'] << { 'id' => 'blocktypes' , 'text' => 'AB Test Variants' , 'href' => '/admin/ab-variants' , 'modal' => false } if user.is_allowed('abvariants' , 'view')
28
- item['children'] << { 'id' => 'variables' , 'text' => 'Variables' , 'href' => '/admin/settings' , 'modal' => false } if user.is_allowed('settings' , 'view')
29
- item['children'] << { 'id' => 'blocktypes' , 'text' => 'Page Block Types' , 'href' => '/admin/block-types' , 'modal' => false } if user.is_allowed('blocktypes' , 'view')
24
+ item['children'] << { 'id' => 'users' , 'text' => 'Users' , 'href' => '/admin/users' , 'modal' => false } if user.is_allowed('users' , 'view')
25
+ item['children'] << { 'id' => 'roles' , 'text' => 'Roles' , 'href' => '/admin/roles' , 'modal' => false } if user.is_allowed('roles' , 'view')
26
+ item['children'] << { 'id' => 'permissions' , 'text' => 'Permissions' , 'href' => '/admin/permissions' , 'modal' => false } if user.is_allowed('permissions' , 'view')
27
+ item['children'] << { 'id' => 'blocktypes' , 'text' => 'AB Test Variants' , 'href' => '/admin/ab-variants' , 'modal' => false } if user.is_allowed('abvariants' , 'view')
28
+ item['children'] << { 'id' => 'variables' , 'text' => 'Variables' , 'href' => '/admin/settings' , 'modal' => false } if user.is_allowed('settings' , 'view')
29
+ item['children'] << { 'id' => 'blocktypes' , 'text' => 'Block Types' , 'href' => '/admin/block-types' , 'modal' => false } if user.is_allowed('blocktypes' , 'view')
30
+ item['children'] << { 'id' => 'blocktypesources' , 'text' => 'Block Type Sources' , 'href' => '/admin/block-type-sources' , 'modal' => false } if user.is_allowed('blocktypesources' , 'view')
30
31
 
31
32
  nav << item if item['children'].count > 0
32
33
 
@@ -63,7 +63,7 @@ class Caboose::Schema < Caboose::Utilities::Schema
63
63
  [ :utc_offset , :float , { :default => -5 }],
64
64
  #[ :timezone , :string , { :default => 'America/Chicago' }],
65
65
  [ :timezone_id , :integer , { :defualt => 381 }], # Defaults to 'America/Chicago'
66
- [ :password , :string ],
66
+ [ :password , :string ],
67
67
  [ :password_reset_id , :string ],
68
68
  [ :password_reset_sent , :datetime ],
69
69
  [ :token , :string ],
@@ -154,26 +154,13 @@ class Caboose::Schema < Caboose::Utilities::Schema
154
154
  [ :parent_id , :integer ],
155
155
  [ :name , :string ]
156
156
  ],
157
- #Caboose::Field => [
158
- # [ :block_id , :integer ],
159
- # [ :field_type_id , :integer ],
160
- # [ :value , :text ],
161
- # [ :file , :attachment ],
162
- # [ :image , :attachment ]
163
- #],
164
- #Caboose::FieldType => [
165
- # [ :block_type_id , :integer ],
166
- # [ :name , :string ],
167
- # [ :field_type , :string ],
168
- # [ :nice_name , :string ],
169
- # [ :default , :text ],
170
- # [ :width , :integer ],
171
- # [ :height , :integer ],
172
- # [ :fixed_placeholder , :boolean ],
173
- # [ :options , :text ],
174
- # [ :options_function , :text ],
175
- # [ :options_url , :string ]
176
- #],
157
+ Caboose::BlockTypeSource => [
158
+ [ :name , :string ],
159
+ [ :url , :string ],
160
+ [ :token , :string ],
161
+ [ :priority , :integer, { :default => 0 }],
162
+ [ :active , :boolean, { :default => true }],
163
+ ],
177
164
  Caboose::Post => [
178
165
  [ :title , :text ],
179
166
  [ :body , :text ],
@@ -0,0 +1,75 @@
1
+ <%
2
+ bts = @block_type_source
3
+ %>
4
+
5
+ <h1>Edit Source</h1>
6
+ <p><div id='blocktypesource_<%= bts.id %>_name' ></div></p>
7
+ <p><div id='blocktypesource_<%= bts.id %>_url' ></div></p>
8
+ <p><div id='blocktypesource_<%= bts.id %>_token' ></div></p>
9
+ <p><div id='blocktypesource_<%= bts.id %>_priority' ></div></p>
10
+ <p><div id='blocktypesource_<%= bts.id %>_active' ></div></p>
11
+
12
+ <div id='message'></div>
13
+ <p>
14
+ <input type='button' value='< Back' onclick="window.location='/admin/block-type-sources';" />
15
+ <input type='button' value='Refresh Block Types' onclick="refresh_block_types(<%= bts.id %>);" />
16
+ <input type='button' value='Delete Source' onclick="delete_block_type_source(<%= bts.id %>);" />
17
+ </p>
18
+
19
+ <% content_for :caboose_js do %>
20
+ <%= javascript_include_tag "caboose/model/all" %>
21
+ <script type="text/javascript">
22
+
23
+ function delete_block_type_source(bts_id, confirm)
24
+ {
25
+ if (!confirm)
26
+ {
27
+ var p = $('<p/>').addClass('note warning')
28
+ .append('Are you sure you want to delete the source?')
29
+ .append($('<input/>').attr('type', 'button').val('Yes').click(function() { delete_block_type_source(bts_id, true); })).append(" ")
30
+ .append($('<input/>').attr('type', 'button').val('No' ).click(function() { $('#message').empty(); }));
31
+ $('#message').empty().append(p);
32
+ return;
33
+ }
34
+ $('#message').empty().append($('<p/>').addClass('loading').html('Deleting source...'));
35
+ $.ajax({
36
+ url: '/admin/block-type-sources/' + bts_id,
37
+ type: 'delete',
38
+ success: function(resp) {
39
+ if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
40
+ if (resp.redirect) window.location = resp.redirect;
41
+ }
42
+ });
43
+ }
44
+
45
+ function refresh_block_types(bts_id)
46
+ {
47
+ $('#message').empty().append($('<p/>').addClass('loading').html('Refreshing block types from source...'));
48
+ $.ajax({
49
+ url: '/admin/block-type-sources/' + bts_id + '/refresh',
50
+ type: 'get',
51
+ success: function(resp) {
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));
54
+ }
55
+ });
56
+ }
57
+
58
+ $(document).ready(function() {
59
+ m = new ModelBinder({
60
+ name: 'BlockTypeSource',
61
+ id: <%= bts.id %>,
62
+ update_url: '/admin/block-type-sources/<%= bts.id %>',
63
+ authenticity_token: '<%= form_authenticity_token %>',
64
+ attributes: [
65
+ { name: 'name' , nice_name: 'Name' , type: 'text' , value: <%= raw Caboose.json(bts.name) %>, width: 400 },
66
+ { name: 'url' , nice_name: 'URL' , type: 'text' , value: <%= raw Caboose.json(bts.url) %>, width: 400 },
67
+ { name: 'token' , nice_name: 'Token' , type: 'text' , value: <%= raw Caboose.json(bts.token) %>, width: 400 },
68
+ { name: 'priority' , nice_name: 'Priority' , type: 'text' , value: <%= raw Caboose.json(bts.priority) %>, width: 400 },
69
+ { name: 'active' , nice_name: 'Active' , type: 'checkbox' , value: <%= bts.active ? 'true' : 'false' %>, width: 400 }
70
+ ]
71
+ });
72
+ });
73
+
74
+ </script>
75
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <h1>Block Type Sources</h1>
2
+
3
+ <p><a href='/admin/block-type-sources/new'>New Source</a></p>
4
+
5
+ <% if (@block_type_sources.count > 0) %>
6
+
7
+ <table class='data'>
8
+ <tr>
9
+ <th>Name</th>
10
+ <th>URL</th>
11
+ </tr>
12
+ <% @block_type_sources.each do |bts| %>
13
+ <tr onclick="window.location='/admin/block-type-sources/<%= bts.id %>/edit';">
14
+ <td><%= bts.name %></td>
15
+ <td><%= bts.url %></td>
16
+ </tr>
17
+ <% end %>
18
+ </table>
19
+
20
+ <% else %>
21
+
22
+ <p>There are no sources.</p>
23
+
24
+ <% end %>
@@ -0,0 +1,31 @@
1
+
2
+ <h1>New Source</h1>
3
+ <form action='/admin/block-type-sources' method='post' id='new_source_form'>
4
+ <input type='hidden' name='authenticity_token' value='<%= form_authenticity_token %>' />
5
+ <p><input type='text' id='name' name='name' placeholder='Name' /></p>
6
+ <div id='message'></div>
7
+ <p>
8
+ <input type='button' value='< Back' onclick="window.location='/admin/block-type-sources';" />
9
+ <input type='button' value='Add Source' onclick="add_block_type_source();" />
10
+ </p>
11
+ </form>
12
+
13
+ <% content_for :caboose_js do %>
14
+ <script type='text/javascript'>
15
+
16
+ function add_block_type_source()
17
+ {
18
+ $('#message').empty().append($('<p/>').addClass('loading').html('Adding source...'));
19
+ $.ajax({
20
+ url: '/admin/block-type-sources',
21
+ type: 'post',
22
+ data: $('#new_source_form').serialize(),
23
+ success: function(resp) {
24
+ if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
25
+ if (resp.redirect) window.location = resp.redirect;
26
+ }
27
+ });
28
+ }
29
+
30
+ </script>
31
+ <% end %>
@@ -1,6 +1,8 @@
1
1
  <div class="content_wrapper" id='block_<%= block.id %>'>
2
- <div class="content_body">
3
- <% if block.children.count > 0 %>
2
+ <div class="content_body">
3
+ <% if controller_view_content %>
4
+ <%= raw controller_view_content %>
5
+ <% elsif block.children.count > 0 %>
4
6
  <% block.children.each do |b| %><%= raw block.render(b, local_assigns) %><% end %>
5
7
  <% end %>
6
8
  <% if editing %><%= raw block.child_block_link %><% end %>
@@ -16,11 +16,25 @@
16
16
 
17
17
  <%
18
18
 
19
- if yield && yield.strip.length > 0
20
- %><%= yield %><%
21
- elsif !@page.nil? && @page.title != 'Access Denied'
19
+ #if yield && yield.strip.length > 0
20
+ # %><%= yield %><%
21
+ #elsif !@page.nil? && @page.title != 'Access Denied'
22
+ # @page.top_level_blocks.each do |b|
23
+ # %><%= raw b.render(b, {
24
+ # :modal => false,
25
+ # :empty_text => '',
26
+ # :editing => defined?(@editing) ? @editing : false,
27
+ # :css => yield(:css),
28
+ # :js => yield(:js),
29
+ # :csrf_meta_tags => csrf_meta_tags
30
+ # }) %><%
31
+ # end
32
+ #end
33
+
34
+ if !@page.nil? && @page.title != 'Access Denied'
22
35
  @page.top_level_blocks.each do |b|
23
36
  %><%= raw b.render(b, {
37
+ :controller_view_content => yield,
24
38
  :modal => false,
25
39
  :empty_text => '',
26
40
  :editing => defined?(@editing) ? @editing : false,
@@ -29,6 +43,6 @@ elsif !@page.nil? && @page.title != 'Access Denied'
29
43
  :csrf_meta_tags => csrf_meta_tags
30
44
  }) %><%
31
45
  end
32
- end
46
+ end
33
47
 
34
48
  %>
@@ -136,6 +136,15 @@ Caboose::Engine.routes.draw do
136
136
 
137
137
  get "admin/block-type-categories/tree-options" => "block_type_categories#admin_tree_options"
138
138
 
139
+ get "admin/block-type-sources" => "block_type_sources#admin_index"
140
+ get "admin/block-type-sources/new" => "block_type_sources#admin_new"
141
+ get "admin/block-type-sources/options" => "block_type_sources#admin_options"
142
+ get "admin/block-type-sources/:id/edit" => "block_type_sources#admin_edit"
143
+ get "admin/block-type-sources/:id/refresh" => "block_type_sources#admin_refresh"
144
+ post "admin/block-type-sources" => "block_type_sources#admin_create"
145
+ put "admin/block-type-sources/:id" => "block_type_sources#admin_update"
146
+ delete "admin/block-type-sources/:id" => "block_type_sources#admin_delete"
147
+
139
148
  get "posts" => "posts#index"
140
149
  get "posts/:id" => "posts#detail"
141
150
  get "admin/posts/category-options" => "posts#admin_category_options"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.4.5'
2
+ VERSION = '0.4.6'
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.5
4
+ version: 0.4.6
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-14 00:00:00.000000000 Z
11
+ date: 2014-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -246,6 +246,7 @@ files:
246
246
  - app/controllers/caboose/admin_controller.rb
247
247
  - app/controllers/caboose/application_controller.rb
248
248
  - app/controllers/caboose/block_type_categories_controller.rb
249
+ - app/controllers/caboose/block_type_sources_controller.rb
249
250
  - app/controllers/caboose/block_types_controller.rb
250
251
  - app/controllers/caboose/blocks_controller.rb
251
252
  - app/controllers/caboose/login_controller.rb
@@ -275,6 +276,7 @@ files:
275
276
  - app/models/caboose/block.rb
276
277
  - app/models/caboose/block_type.rb
277
278
  - app/models/caboose/block_type_category.rb
279
+ - app/models/caboose/block_type_source.rb
278
280
  - app/models/caboose/caboose_plugin.rb
279
281
  - app/models/caboose/core_plugin.rb
280
282
  - app/models/caboose/database_session.rb
@@ -304,6 +306,9 @@ files:
304
306
  - app/views/caboose/ab_variants/admin_new.html.erb
305
307
  - app/views/caboose/admin/index.html.erb
306
308
  - app/views/caboose/application/show.html.erb
309
+ - app/views/caboose/block_type_sources/admin_edit.html.erb
310
+ - app/views/caboose/block_type_sources/admin_index.html.erb
311
+ - app/views/caboose/block_type_sources/admin_new.html.erb
307
312
  - app/views/caboose/block_types/admin_edit.html.erb
308
313
  - app/views/caboose/block_types/admin_index.html.erb
309
314
  - app/views/caboose/block_types/admin_new.html.erb