caboose-cms 0.4.34 → 0.4.35

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
- 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