caboose-cms 0.4.34 → 0.4.35

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
- NzI0MzU1NTgyNDUwYWJmNDIwYzI4YWVjZTNmMTNlMmUwYjFiMmRkMQ==
4
+ Zjc3MDVlNjJiYmQzM2YwMmJlMjg2NmE3NDZmYTBlN2M2MGQ4ODAyZQ==
5
5
  data.tar.gz: !binary |-
6
- M2Y1NzIwYWY5ZTJjMjc4YjM3MGM1ZmYxNDY3MDljNzA2N2RhNzNmYg==
6
+ MzQ5ZWRmNDdlZGNjZDAyNTRjMDEzMzM1N2UyZjQ1ODVjZDVmZDdjOA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Njk4ZDkyZGY3NjJlZTQ0NzI4YjdkZDU0NmQ1YTYyODYyYTNmZTNhNjRjM2E2
10
- YmNjYjMxNjAyMDIxY2E4YzU4MmVkMjBiOTRlMTAyODQ2ZjcxMzExN2ViOGE2
11
- ZDJlMGNmODAzYjA5ZTA5ODVmNGRlNmY4ZmRjODFmNWJiMDNlNWE=
9
+ M2ZjN2ZhMmY0YzQ4ODVlMTczYWU3YjIyNmI5OGEzYjNmNmI5NTRmYzY0ZWQx
10
+ M2NjNDcwN2Q0YjZkYWI5NzcxODZlM2RmNWY3MWVlOTg2YzhkZDViYWRjMzY3
11
+ MzY5ZDBlMzQwZDIxZjM2ODlkN2U2Y2Q4MDAzZTJjMmRhZjk4ZmQ=
12
12
  data.tar.gz: !binary |-
13
- MDA5MjgxOTJkMjlmY2ViYjc3MWVkZjVlZmZiMmQwODhkZDA1YjFlN2RmMDUz
14
- MGYxYTE4NDM5NWMzYWViYzIyM2RkYWVmNTI2ZDdlNTk0M2JjZjM5MWY0NWEy
15
- MjEzMTg4ODk2N2RhNTNmOTI1YWYzYWM1YTE5ZTVjMDhiZDU0MTU=
13
+ MzAwZGVmNjkzODhkZjY3MzgxZmVlNTg3MDlkNzRmNjdiYjQ2NDA4NjFjYWYx
14
+ ZDA0ODgwODFlNjczNzU3Yjc0ZjllNzY3ZWEwOWMzN2IzNWViMDI3NGQ2NjE4
15
+ YTEzNGRiMzJmNDQxOTMyYzUxYjk1ODA0MDM0MjI4NzQ4ZDRjZjQ=
@@ -71,7 +71,7 @@ module Caboose
71
71
  return unless user_is_allowed('blocktypesources', 'delete')
72
72
  BlockTypeSource.find(params[:id]).destroy
73
73
  resp = StdClass.new({
74
- 'redirect' => "/admin/block-type-sources"
74
+ 'redirect' => "/admin/block-types/store/sources"
75
75
  })
76
76
  render :json => resp
77
77
  end
@@ -83,7 +83,7 @@ module Caboose
83
83
  resp = StdClass.new
84
84
 
85
85
  bts = BlockTypeSource.find(params[:id])
86
- if bts.refresh
86
+ if bts.refresh_summaries
87
87
  resp.success = "Block types from the source have been refreshed successfully."
88
88
  else
89
89
  resp.error = "There was an error refreshing block types from the source."
@@ -0,0 +1,42 @@
1
+
2
+ module Caboose
3
+ class BlockTypeStoreController < ApplicationController
4
+
5
+ # GET /admin/block-types/store
6
+ def admin_index
7
+ return unless user_is_allowed('blocktypestore', 'add')
8
+ @pager = PageBarGenerator.new(params, {
9
+ 'block_type_source_id' => '',
10
+ 'name_like' => '',
11
+ 'description_like' => ''
12
+ },{
13
+ 'model' => 'Caboose::BlockTypeSummary',
14
+ 'sort' => 'block_type_source_id, name',
15
+ 'desc' => false,
16
+ 'base_url' => '/admin/block-types/store',
17
+ 'use_url_params' => false
18
+ })
19
+ @block_type_summaries = @pager.items
20
+ render :layout => 'caboose/admin'
21
+ end
22
+
23
+ # GET /admin/block-types/store/:block_type_summary_id
24
+ def admin_details
25
+ return unless user_is_allowed('blocktypestore', 'add')
26
+ @block_type_summary = BlockTypeSummary::find(params[:block_type_summary_id])
27
+ render :layout => 'caboose/admin'
28
+ end
29
+
30
+ # GET /admin/block-types/store/:block_type_summary_id/download
31
+ def admin_download
32
+ return unless user_is_allowed('blocktypestore', 'add')
33
+
34
+ bts = BlockTypeSummary::find(params[:block_type_summary_id])
35
+ bts.source.refresh(bts.name)
36
+
37
+ resp = StdClass.new('success' => 'The block type has been downloaded successfully.')
38
+ render :json => resp
39
+ end
40
+
41
+ end
42
+ end
@@ -159,6 +159,46 @@ module Caboose
159
159
  end
160
160
  end
161
161
 
162
+ #===========================================================================
163
+ # Store Actions
164
+ #===========================================================================
165
+
166
+ # GET /admin/block-types/store
167
+ def admin_store_index
168
+ return unless user_is_allowed('blocktypestore', 'add')
169
+ @pager = PageBarGenerator.new(params, {
170
+ 'block_type_source_id' => '',
171
+ 'name_like' => '',
172
+ 'description_like' => ''
173
+ },{
174
+ 'model' => 'Caboose::BlockTypeSummary',
175
+ 'sort' => 'block_type_source_id, name',
176
+ 'desc' => false,
177
+ 'base_url' => '/admin/block-types/store',
178
+ 'use_url_params' => false
179
+ })
180
+ @block_type_summaries = @pager.items
181
+ render :layout => 'caboose/admin'
182
+ end
183
+
184
+ # GET /admin/block-types/store/:block_type_summary_id
185
+ def admin_store_details
186
+ return unless user_is_allowed('blocktypestore', 'add')
187
+ @block_type_summary = BlockTypeSummary::find(params[:block_type_summary_id])
188
+ render :layout => 'caboose/admin'
189
+ end
190
+
191
+ # GET /admin/block-types/store/:block_type_summary_id/download
192
+ def admin_store_download
193
+ return unless user_is_allowed('blocktypestore', 'add')
194
+
195
+ bts = BlockTypeSummary::find(params[:block_type_summary_id])
196
+ bts.source.refresh(bts.name)
197
+
198
+ resp = StdClass.new('success' => 'The block type has been downloaded successfully.')
199
+ render :json => resp
200
+ end
201
+
162
202
  #===========================================================================
163
203
  # Public Repo Actions
164
204
  #===========================================================================
@@ -29,6 +29,10 @@ class Caboose::BlockType < ActiveRecord::Base
29
29
  return eval(self.options_function)
30
30
  end
31
31
 
32
+ def child(name)
33
+ Caboose::BlockType.where("parent_id = ? and name = ?", self.id, name).first
34
+ end
35
+
32
36
  def api_hash
33
37
  return {
34
38
  :name => self.name,
@@ -71,6 +75,20 @@ class Caboose::BlockType < ActiveRecord::Base
71
75
  self.options = h['options']
72
76
  self.options_function = h['options_function']
73
77
  self.options_url = h['options_url']
78
+ self.save
79
+
80
+ # Remove any named children that don't exist in the given hash
81
+ new_child_names = h['children'].collect { |h2| h2['name'] }
82
+ Caboose::BlockType.where(:parent_id => self.id).all.each do |bt|
83
+ bt.destroy if bt.name && bt.name.strip.length > 0 && !new_child_names.include?(bt.name)
84
+ end
85
+
86
+ # Now add/update all the children
87
+ h['children'].each do |h2|
88
+ bt = self.child(h2['name'])
89
+ bt = Caboose::BlockType.create(:parent_id => self.id) if bt.nil?
90
+ bt.parse_api_hash(h)
91
+ end
92
+
74
93
  end
75
-
76
94
  end
@@ -12,7 +12,7 @@ class Caboose::BlockTypeSource < ActiveRecord::Base
12
12
  :active
13
13
 
14
14
  # Just get the names and descriptions of all block types from the source
15
- def refresh_names
15
+ def refresh_summaries
16
16
  resp = nil
17
17
  begin
18
18
  resp = HTTParty.get("#{self.url}/caboose/block-types?token=#{self.token}")
@@ -21,17 +21,19 @@ class Caboose::BlockTypeSource < ActiveRecord::Base
21
21
  return false
22
22
  end
23
23
 
24
- block_types = nil
24
+ summaries = nil
25
25
  begin
26
- block_types = JSON.parse(resp.body)
26
+ summaries = JSON.parse(resp.body)
27
27
  rescue
28
28
  Caboose.log("Response body isn't valid JSON.")
29
29
  return false
30
30
  end
31
31
 
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'])
32
+ summaries.each do |h|
33
+ s = Caboose::BlockTypeSummary.where(:block_type_source_id => self.id, :name => h['name']).first
34
+ s = Caboose::BlockTypeSummary.create(:block_type_source_id => self.id)
35
+ s.parse_api_hash(h)
36
+ s.save
35
37
  end
36
38
 
37
39
  return true
@@ -64,26 +66,10 @@ class Caboose::BlockTypeSource < ActiveRecord::Base
64
66
  return false
65
67
  end
66
68
 
67
- # Grab all the fields from the hash for the top-level block
69
+ # Update the block type
68
70
  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
71
 
76
72
  return true
77
73
  end
78
74
 
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
89
75
  end
@@ -0,0 +1,21 @@
1
+ require 'httparty'
2
+
3
+ class Caboose::BlockTypeSummary < ActiveRecord::Base
4
+ self.table_name = "block_type_summary"
5
+
6
+ belongs_to :block_type_source
7
+ attr_accessible :id,
8
+ :block_type_source_id,
9
+ :name,
10
+ :description
11
+
12
+ def source
13
+ self.block_type_source
14
+ end
15
+
16
+ def parse_api_hash(h)
17
+ self.name = h['name']
18
+ self.description = h['description']
19
+ end
20
+
21
+ end
@@ -26,8 +26,7 @@ class Caboose::CorePlugin < Caboose::CaboosePlugin
26
26
  item['children'] << { 'id' => 'permissions' , 'text' => 'Permissions' , 'href' => '/admin/permissions' , 'modal' => false } if user.is_allowed('permissions' , 'view')
27
27
  item['children'] << { 'id' => 'blocktypes' , 'text' => 'AB Test Variants' , 'href' => '/admin/ab-variants' , 'modal' => false } if user.is_allowed('abvariants' , 'view')
28
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')
29
+ item['children'] << { 'id' => 'blocktypes' , 'text' => 'Block Types' , 'href' => '/admin/block-types' , 'modal' => false } if user.is_allowed('blocktypes' , 'view')
31
30
 
32
31
  nav << item if item['children'].count > 0
33
32
 
@@ -165,6 +165,11 @@ class Caboose::Schema < Caboose::Utilities::Schema
165
165
  [ :priority , :integer, { :default => 0 }],
166
166
  [ :active , :boolean, { :default => true }],
167
167
  ],
168
+ Caboose::BlockTypeSummary => [
169
+ [ :block_type_source_id , :integer ],
170
+ [ :name , :string ],
171
+ [ :description , :string ]
172
+ ],
168
173
  Caboose::Post => [
169
174
  [ :title , :text ],
170
175
  [ :body , :text ],
@@ -11,8 +11,8 @@ bts = @block_type_source
11
11
 
12
12
  <div id='message'></div>
13
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 %>);" />
14
+ <input type='button' value='< Back' onclick="window.location='/admin/block-types/store/sources';" />
15
+ <input type='button' value='Refresh Block Type Summaries' onclick="refresh_block_types(<%= bts.id %>);" />
16
16
  <input type='button' value='Delete Source' onclick="delete_block_type_source(<%= bts.id %>);" />
17
17
  </p>
18
18
 
@@ -33,7 +33,7 @@ function delete_block_type_source(bts_id, confirm)
33
33
  }
34
34
  $('#message').empty().append($('<p/>').addClass('loading').html('Deleting source...'));
35
35
  $.ajax({
36
- url: '/admin/block-type-sources/' + bts_id,
36
+ url: '/admin/block-types/store/sources/' + bts_id,
37
37
  type: 'delete',
38
38
  success: function(resp) {
39
39
  if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
@@ -46,7 +46,7 @@ function refresh_block_types(bts_id)
46
46
  {
47
47
  $('#message').empty().append($('<p/>').addClass('loading').html('Refreshing block types from source...'));
48
48
  $.ajax({
49
- url: '/admin/block-type-sources/' + bts_id + '/refresh',
49
+ url: '/admin/block-type/store/sources/' + bts_id + '/refresh',
50
50
  type: 'get',
51
51
  success: function(resp) {
52
52
  if (resp.error) $('#message').empty().append($('<p/>').addClass('note error').html(resp.error));
@@ -59,7 +59,7 @@ $(document).ready(function() {
59
59
  m = new ModelBinder({
60
60
  name: 'BlockTypeSource',
61
61
  id: <%= bts.id %>,
62
- update_url: '/admin/block-type-sources/<%= bts.id %>',
62
+ update_url: '/admin/block-types/store/sources/<%= bts.id %>',
63
63
  authenticity_token: '<%= form_authenticity_token %>',
64
64
  attributes: [
65
65
  { name: 'name' , nice_name: 'Name' , type: 'text' , value: <%= raw Caboose.json(bts.name) %>, width: 400 },
@@ -1,6 +1,6 @@
1
1
  <h1>Block Type Sources</h1>
2
2
 
3
- <p><a href='/admin/block-type-sources/new'>New Source</a></p>
3
+ <p><a href='/admin/block-types/store/sources/new'>New Source</a></p>
4
4
 
5
5
  <% if (@block_type_sources.count > 0) %>
6
6
 
@@ -10,7 +10,7 @@
10
10
  <th>URL</th>
11
11
  </tr>
12
12
  <% @block_type_sources.each do |bts| %>
13
- <tr onclick="window.location='/admin/block-type-sources/<%= bts.id %>/edit';">
13
+ <tr onclick="window.location='/admin/block-types/store/sources/<%= bts.id %>/edit';">
14
14
  <td><%= bts.name %></td>
15
15
  <td><%= bts.url %></td>
16
16
  </tr>
@@ -1,11 +1,11 @@
1
1
 
2
2
  <h1>New Source</h1>
3
- <form action='/admin/block-type-sources' method='post' id='new_source_form'>
3
+ <form action='/admin/block-types/store/sources' method='post' id='new_source_form'>
4
4
  <input type='hidden' name='authenticity_token' value='<%= form_authenticity_token %>' />
5
5
  <p><input type='text' id='name' name='name' placeholder='Name' /></p>
6
6
  <div id='message'></div>
7
7
  <p>
8
- <input type='button' value='< Back' onclick="window.location='/admin/block-type-sources';" />
8
+ <input type='button' value='< Back' onclick="window.location='/admin/block-types/store/sources';" />
9
9
  <input type='button' value='Add Source' onclick="add_block_type_source();" />
10
10
  </p>
11
11
  </form>
@@ -17,7 +17,7 @@ function add_block_type_source()
17
17
  {
18
18
  $('#message').empty().append($('<p/>').addClass('loading').html('Adding source...'));
19
19
  $.ajax({
20
- url: '/admin/block-type-sources',
20
+ url: '/admin/block-types/store/sources',
21
21
  type: 'post',
22
22
  data: $('#new_source_form').serialize(),
23
23
  success: function(resp) {
@@ -0,0 +1,14 @@
1
+ <%
2
+ bts = @block_type_summary
3
+ %>
4
+ <div id='crumbtrail'>
5
+ <a href='/admin/block-types'>Page Block Types</a> >
6
+ <a href='/admin/block-types/store'>Store</a>
7
+ </div>
8
+
9
+ <h1>Block Type Details</h1>
10
+
11
+ <p>Name: <%= bts.name %></p>
12
+ <p>Description: <%= bts.description %></p>
13
+ <p>Status:
14
+ <p><a href='/admin/block-types/store'>< Back</a></p>
@@ -0,0 +1,39 @@
1
+ <h1>Block Type Store</h1>
2
+
3
+ <p><a href='/admin/block-types/store/sources'>Store Sources</a></p>
4
+
5
+ <form action='/admin/block-types/store' method='get'>
6
+ <table>
7
+ <tr><td>Source:</td><td>
8
+ <select name='block_type_source_id'>
9
+ <option value=''>-- Any Source --</option>
10
+ <% Caboose::BlockTypeSource.reorder(:name).all.each do |bts| %><option value='<%= bts.id %>'><%= bts.name %></option><% end %>
11
+ </select></td></tr>
12
+ <tr><td><p>Name: </td><td><input type='name_like' value="<%= @pager.params['name_like'] %>" /></td></tr>
13
+ <tr><td><p>Description: </td><td><input type='name_like' value="<%= @pager.params['name_like'] %>" /></td></tr>
14
+ </table>
15
+ <p><input type='submit' value='Search' /></p>
16
+ </form>
17
+
18
+ <% if (@block_type_summaries.count > 0) %>
19
+
20
+ <table class='data'>
21
+ <tr>
22
+ <th>Source</th>
23
+ <th>Name</th>
24
+ <th>Description</th>
25
+ </tr>
26
+ <% @block_type_summaries.each do |bts| %>
27
+ <tr onclick="window.location='/admin/block-types/store/<%= bts.id %>';">
28
+ <td><%= bts.source.name %></td>
29
+ <td><%= bts.name %></td>
30
+ <td><%= bts.description %></td>
31
+ </tr>
32
+ <% end %>
33
+ </table>
34
+
35
+ <% else %>
36
+
37
+ <p>There are no block types from any sources.</p>
38
+
39
+ <% end %>
@@ -1,6 +1,9 @@
1
- <h1>Page Block Types</h1>
1
+ <h1>Block Types</h1>
2
2
 
3
- <p><a href='/admin/block-types/new'>New Block Type</a></p>
3
+ <p>
4
+ <a href='/admin/block-types/store'>Block Type Store</a> |
5
+ <a href='/admin/block-types/new'>New Block Type</a>
6
+ </p>
4
7
 
5
8
  <% if (@block_types.count > 0) %>
6
9
 
data/config/routes.rb CHANGED
@@ -123,6 +123,19 @@ Caboose::Engine.routes.draw do
123
123
  #post "admin/blocks/:id/image" => "fields#admin_update_image"
124
124
  #post "admin/blocks/:id/file" => "fields#admin_update_file"
125
125
 
126
+ get "admin/block-types/store/sources" => "block_type_sources#admin_index"
127
+ get "admin/block-types/store/sources/new" => "block_type_sources#admin_new"
128
+ get "admin/block-types/store/sources/options" => "block_type_sources#admin_options"
129
+ get "admin/block-types/store/sources/:id/edit" => "block_type_sources#admin_edit"
130
+ get "admin/block-types/store/sources/:id/refresh" => "block_type_sources#admin_refresh"
131
+ post "admin/block-types/store/sources" => "block_type_sources#admin_create"
132
+ put "admin/block-types/store/sources/:id" => "block_type_sources#admin_update"
133
+ delete "admin/block-types/store/sources/:id" => "block_type_sources#admin_delete"
134
+
135
+ get "admin/block-types/store/:block_type_summary_id/download" => "block_type_store#admin_download"
136
+ get "admin/block-types/store/:block_type_summary_id" => "block_type_store#admin_details"
137
+ get "admin/block-types/store" => "block_type_store#admin_index"
138
+
126
139
  get "admin/block-types/field-type-options" => "block_types#admin_field_type_options"
127
140
  get "admin/block-types/tree-options" => "block_types#admin_tree_options"
128
141
  get "admin/block-types/options" => "block_types#admin_options"
@@ -137,16 +150,7 @@ Caboose::Engine.routes.draw do
137
150
  delete "admin/block-types/:id" => "block_types#admin_delete"
138
151
 
139
152
  get "admin/block-type-categories/tree-options" => "block_type_categories#admin_tree_options"
140
-
141
- get "admin/block-type-sources" => "block_type_sources#admin_index"
142
- get "admin/block-type-sources/new" => "block_type_sources#admin_new"
143
- get "admin/block-type-sources/options" => "block_type_sources#admin_options"
144
- get "admin/block-type-sources/:id/edit" => "block_type_sources#admin_edit"
145
- get "admin/block-type-sources/:id/refresh" => "block_type_sources#admin_refresh"
146
- post "admin/block-type-sources" => "block_type_sources#admin_create"
147
- put "admin/block-type-sources/:id" => "block_type_sources#admin_update"
148
- delete "admin/block-type-sources/:id" => "block_type_sources#admin_delete"
149
-
153
+
150
154
  get "posts" => "posts#index"
151
155
  get "posts/:id" => "posts#detail"
152
156
  get "admin/posts/category-options" => "posts#admin_category_options"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.4.34'
2
+ VERSION = '0.4.35'
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.34
4
+ version: 0.4.35
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-27 00:00:00.000000000 Z
11
+ date: 2014-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -249,6 +249,7 @@ files:
249
249
  - app/controllers/caboose/application_controller.rb
250
250
  - app/controllers/caboose/block_type_categories_controller.rb
251
251
  - app/controllers/caboose/block_type_sources_controller.rb
252
+ - app/controllers/caboose/block_type_store_controller.rb
252
253
  - app/controllers/caboose/block_types_controller.rb
253
254
  - app/controllers/caboose/blocks_controller.rb
254
255
  - app/controllers/caboose/login_controller.rb
@@ -279,6 +280,7 @@ files:
279
280
  - app/models/caboose/block_type.rb
280
281
  - app/models/caboose/block_type_category.rb
281
282
  - app/models/caboose/block_type_source.rb
283
+ - app/models/caboose/block_type_summary.rb
282
284
  - app/models/caboose/caboose_plugin.rb
283
285
  - app/models/caboose/core_plugin.rb
284
286
  - app/models/caboose/database_session.rb
@@ -311,6 +313,8 @@ files:
311
313
  - app/views/caboose/block_type_sources/admin_edit.html.erb
312
314
  - app/views/caboose/block_type_sources/admin_index.html.erb
313
315
  - app/views/caboose/block_type_sources/admin_new.html.erb
316
+ - app/views/caboose/block_type_store/admin_details.html.erb
317
+ - app/views/caboose/block_type_store/admin_index.html.erb
314
318
  - app/views/caboose/block_types/admin_edit.html.erb
315
319
  - app/views/caboose/block_types/admin_index.html.erb
316
320
  - app/views/caboose/block_types/admin_new.html.erb