trusty-cms 3.1.8 → 3.1.9

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.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/Gemfile.lock +13 -9
  4. data/app/assets/images/admin/move_higher.png +0 -0
  5. data/app/assets/images/admin/move_lower.png +0 -0
  6. data/app/assets/images/admin/move_to_bottom.png +0 -0
  7. data/app/assets/images/admin/move_to_top.png +0 -0
  8. data/app/assets/images/admin/remove.png +0 -0
  9. data/app/assets/stylesheets/admin/_multi_site_main.scss +85 -0
  10. data/app/assets/stylesheets/admin/_site_chooser.scss +76 -0
  11. data/app/assets/stylesheets/admin/main.scss +3 -0
  12. data/app/controllers/admin/sites_controller.rb +14 -0
  13. data/app/helpers/scoped_helper.rb +19 -0
  14. data/app/helpers/sites_helper.rb +10 -0
  15. data/app/models/site.rb +86 -0
  16. data/app/models/snippet.rb +23 -0
  17. data/app/models/snippet_finder.rb +24 -0
  18. data/app/models/snippet_tags.rb +80 -0
  19. data/app/users/_choose_site.html.haml +8 -0
  20. data/app/views/admin/layouts/_choose_site.html.haml +8 -0
  21. data/app/views/admin/layouts/_site_chooser.html.haml +11 -0
  22. data/app/views/admin/sites/_form.haml +50 -0
  23. data/app/views/admin/sites/edit.haml +7 -0
  24. data/app/views/admin/sites/index.haml +43 -0
  25. data/app/views/admin/sites/new.haml +7 -0
  26. data/app/views/admin/snippets/_choose_site.html.haml +6 -0
  27. data/app/views/{snippets → admin/snippets}/_form.html.haml +0 -0
  28. data/app/views/{snippets → admin/snippets}/_popups.html.haml +0 -0
  29. data/app/views/{snippets → admin/snippets}/edit.html.haml +0 -0
  30. data/app/views/{snippets → admin/snippets}/index.html.haml +0 -0
  31. data/app/views/{snippets → admin/snippets}/new.html.haml +0 -0
  32. data/app/views/{snippets → admin/snippets}/remove.html.haml +0 -0
  33. data/app/views/admin/users/_choose_site.html.haml +8 -0
  34. data/config/application.rb +0 -2
  35. data/config/initializers/trusty_cms_config.rb +6 -0
  36. data/config/routes.rb +8 -0
  37. data/coverage/index.html +3837 -2759
  38. data/db/migrate/006_remove_user_login_index.rb +8 -0
  39. data/db/migrate/010_create_sites.rb +13 -0
  40. data/db/migrate/011_add_order_to_sites.rb +9 -0
  41. data/db/migrate/022_add_admin_fields_to_sites.rb +17 -0
  42. data/db/migrate/023_add_sites.rb +13 -0
  43. data/db/migrate/024_site_abbreviation.rb +9 -0
  44. data/db/migrate/025_recreate_non_unique_index_on_snippets_name.rb +11 -0
  45. data/db/migrate/026_add_site_id_to_pages.rb +24 -0
  46. data/db/migrate/027_add_base_domain_to_sites.rb +9 -0
  47. data/lib/trusty_cms.rb +1 -1
  48. data/spec/dummy/db/schema.rb +20 -2
  49. data/spec/dummy/log/test.log +44621 -0
  50. data/spec/dummy/node_modules/jquery/AUTHORS.txt +301 -0
  51. data/spec/dummy/node_modules/jquery/LICENSE.txt +36 -0
  52. data/spec/dummy/node_modules/jquery/README.md +67 -0
  53. data/spec/dummy/node_modules/jquery/bower.json +14 -0
  54. data/spec/dummy/node_modules/jquery/dist/core.js +476 -0
  55. data/spec/dummy/node_modules/jquery/dist/jquery.js +10253 -0
  56. data/spec/dummy/node_modules/jquery/dist/jquery.min.js +4 -0
  57. data/spec/dummy/node_modules/jquery/dist/jquery.min.map +1 -0
  58. data/spec/dummy/node_modules/jquery/dist/jquery.slim.js +8160 -0
  59. data/spec/dummy/node_modules/jquery/dist/jquery.slim.min.js +4 -0
  60. data/spec/dummy/node_modules/jquery/dist/jquery.slim.min.map +1 -0
  61. data/spec/dummy/node_modules/jquery/external/sizzle/LICENSE.txt +36 -0
  62. data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.js +2272 -0
  63. data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.min.js +3 -0
  64. data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.min.map +1 -0
  65. data/spec/dummy/node_modules/jquery/package.json +97 -0
  66. data/spec/dummy/node_modules/jquery/src/ajax/jsonp.js +102 -0
  67. data/spec/dummy/node_modules/jquery/src/ajax/load.js +76 -0
  68. data/spec/dummy/node_modules/jquery/src/ajax/parseXML.js +30 -0
  69. data/spec/dummy/node_modules/jquery/src/ajax/script.js +77 -0
  70. data/spec/dummy/node_modules/jquery/src/ajax/var/location.js +5 -0
  71. data/spec/dummy/node_modules/jquery/src/ajax/var/nonce.js +7 -0
  72. data/spec/dummy/node_modules/jquery/src/ajax/var/rquery.js +5 -0
  73. data/spec/dummy/node_modules/jquery/src/ajax/xhr.js +169 -0
  74. data/spec/dummy/node_modules/jquery/src/ajax.js +855 -0
  75. data/spec/dummy/node_modules/jquery/src/attributes/attr.js +141 -0
  76. data/spec/dummy/node_modules/jquery/src/attributes/classes.js +174 -0
  77. data/spec/dummy/node_modules/jquery/src/attributes/prop.js +143 -0
  78. data/spec/dummy/node_modules/jquery/src/attributes/support.js +33 -0
  79. data/spec/dummy/node_modules/jquery/src/attributes/val.js +190 -0
  80. data/spec/dummy/node_modules/jquery/src/attributes.js +13 -0
  81. data/spec/dummy/node_modules/jquery/src/callbacks.js +234 -0
  82. data/spec/dummy/node_modules/jquery/src/core/DOMEval.js +16 -0
  83. data/spec/dummy/node_modules/jquery/src/core/access.js +70 -0
  84. data/spec/dummy/node_modules/jquery/src/core/init.js +128 -0
  85. data/spec/dummy/node_modules/jquery/src/core/nodeName.js +13 -0
  86. data/spec/dummy/node_modules/jquery/src/core/parseHTML.js +65 -0
  87. data/spec/dummy/node_modules/jquery/src/core/ready-no-deferred.js +96 -0
  88. data/spec/dummy/node_modules/jquery/src/core/ready.js +86 -0
  89. data/spec/dummy/node_modules/jquery/src/core/readyException.js +13 -0
  90. data/spec/dummy/node_modules/jquery/src/core/stripAndCollapse.js +14 -0
  91. data/spec/dummy/node_modules/jquery/src/core/support.js +20 -0
  92. data/spec/dummy/node_modules/jquery/src/core/var/rsingleTag.js +6 -0
  93. data/spec/dummy/node_modules/jquery/src/core.js +476 -0
  94. data/spec/dummy/node_modules/jquery/src/css/addGetHookIf.js +26 -0
  95. data/spec/dummy/node_modules/jquery/src/css/adjustCSS.js +71 -0
  96. data/spec/dummy/node_modules/jquery/src/css/curCSS.js +65 -0
  97. data/spec/dummy/node_modules/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  98. data/spec/dummy/node_modules/jquery/src/css/showHide.js +105 -0
  99. data/spec/dummy/node_modules/jquery/src/css/support.js +89 -0
  100. data/spec/dummy/node_modules/jquery/src/css/var/cssExpand.js +5 -0
  101. data/spec/dummy/node_modules/jquery/src/css/var/getStyles.js +17 -0
  102. data/spec/dummy/node_modules/jquery/src/css/var/isHiddenWithinTree.js +34 -0
  103. data/spec/dummy/node_modules/jquery/src/css/var/rmargin.js +5 -0
  104. data/spec/dummy/node_modules/jquery/src/css/var/rnumnonpx.js +7 -0
  105. data/spec/dummy/node_modules/jquery/src/css/var/swap.js +26 -0
  106. data/spec/dummy/node_modules/jquery/src/css.js +438 -0
  107. data/spec/dummy/node_modules/jquery/src/data/Data.js +161 -0
  108. data/spec/dummy/node_modules/jquery/src/data/var/acceptData.js +19 -0
  109. data/spec/dummy/node_modules/jquery/src/data/var/dataPriv.js +7 -0
  110. data/spec/dummy/node_modules/jquery/src/data/var/dataUser.js +7 -0
  111. data/spec/dummy/node_modules/jquery/src/data.js +179 -0
  112. data/spec/dummy/node_modules/jquery/src/deferred/exceptionHook.js +21 -0
  113. data/spec/dummy/node_modules/jquery/src/deferred.js +391 -0
  114. data/spec/dummy/node_modules/jquery/src/deprecated.js +40 -0
  115. data/spec/dummy/node_modules/jquery/src/dimensions.js +56 -0
  116. data/spec/dummy/node_modules/jquery/src/effects/Tween.js +123 -0
  117. data/spec/dummy/node_modules/jquery/src/effects/animatedSelector.js +15 -0
  118. data/spec/dummy/node_modules/jquery/src/effects.js +699 -0
  119. data/spec/dummy/node_modules/jquery/src/event/ajax.js +22 -0
  120. data/spec/dummy/node_modules/jquery/src/event/alias.js +29 -0
  121. data/spec/dummy/node_modules/jquery/src/event/focusin.js +55 -0
  122. data/spec/dummy/node_modules/jquery/src/event/support.js +11 -0
  123. data/spec/dummy/node_modules/jquery/src/event/trigger.js +185 -0
  124. data/spec/dummy/node_modules/jquery/src/event.js +746 -0
  125. data/spec/dummy/node_modules/jquery/src/exports/amd.js +26 -0
  126. data/spec/dummy/node_modules/jquery/src/exports/global.js +34 -0
  127. data/spec/dummy/node_modules/jquery/src/jquery.js +41 -0
  128. data/spec/dummy/node_modules/jquery/src/manipulation/_evalUrl.js +23 -0
  129. data/spec/dummy/node_modules/jquery/src/manipulation/buildFragment.js +104 -0
  130. data/spec/dummy/node_modules/jquery/src/manipulation/getAll.js +32 -0
  131. data/spec/dummy/node_modules/jquery/src/manipulation/setGlobalEval.js +22 -0
  132. data/spec/dummy/node_modules/jquery/src/manipulation/support.js +35 -0
  133. data/spec/dummy/node_modules/jquery/src/manipulation/var/rcheckableType.js +5 -0
  134. data/spec/dummy/node_modules/jquery/src/manipulation/var/rscriptType.js +5 -0
  135. data/spec/dummy/node_modules/jquery/src/manipulation/var/rtagName.js +5 -0
  136. data/spec/dummy/node_modules/jquery/src/manipulation/wrapMap.js +29 -0
  137. data/spec/dummy/node_modules/jquery/src/manipulation.js +488 -0
  138. data/spec/dummy/node_modules/jquery/src/offset.js +229 -0
  139. data/spec/dummy/node_modules/jquery/src/queue/delay.js +24 -0
  140. data/spec/dummy/node_modules/jquery/src/queue.js +145 -0
  141. data/spec/dummy/node_modules/jquery/src/selector-native.js +237 -0
  142. data/spec/dummy/node_modules/jquery/src/selector-sizzle.js +19 -0
  143. data/spec/dummy/node_modules/jquery/src/selector.js +3 -0
  144. data/spec/dummy/node_modules/jquery/src/serialize.js +130 -0
  145. data/spec/dummy/node_modules/jquery/src/traversing/findFilter.js +106 -0
  146. data/spec/dummy/node_modules/jquery/src/traversing/var/dir.js +22 -0
  147. data/spec/dummy/node_modules/jquery/src/traversing/var/rneedsContext.js +8 -0
  148. data/spec/dummy/node_modules/jquery/src/traversing/var/siblings.js +17 -0
  149. data/spec/dummy/node_modules/jquery/src/traversing.js +191 -0
  150. data/spec/dummy/node_modules/jquery/src/var/ObjectFunctionString.js +7 -0
  151. data/spec/dummy/node_modules/jquery/src/var/arr.js +5 -0
  152. data/spec/dummy/node_modules/jquery/src/var/class2type.js +6 -0
  153. data/spec/dummy/node_modules/jquery/src/var/concat.js +7 -0
  154. data/spec/dummy/node_modules/jquery/src/var/document.js +5 -0
  155. data/spec/dummy/node_modules/jquery/src/var/documentElement.js +7 -0
  156. data/spec/dummy/node_modules/jquery/src/var/fnToString.js +7 -0
  157. data/spec/dummy/node_modules/jquery/src/var/getProto.js +5 -0
  158. data/spec/dummy/node_modules/jquery/src/var/hasOwn.js +7 -0
  159. data/spec/dummy/node_modules/jquery/src/var/indexOf.js +7 -0
  160. data/spec/dummy/node_modules/jquery/src/var/pnum.js +5 -0
  161. data/spec/dummy/node_modules/jquery/src/var/push.js +7 -0
  162. data/spec/dummy/node_modules/jquery/src/var/rcssNum.js +9 -0
  163. data/spec/dummy/node_modules/jquery/src/var/rnothtmlwhite.js +8 -0
  164. data/spec/dummy/node_modules/jquery/src/var/slice.js +7 -0
  165. data/spec/dummy/node_modules/jquery/src/var/support.js +6 -0
  166. data/spec/dummy/node_modules/jquery/src/var/toString.js +7 -0
  167. data/spec/dummy/node_modules/jquery/src/wrap.js +77 -0
  168. data/spec/dummy/node_modules/jquery-ui-bundle/AUTHORS.txt +333 -0
  169. data/spec/dummy/node_modules/jquery-ui-bundle/LICENSE.txt +43 -0
  170. data/spec/dummy/node_modules/jquery-ui-bundle/external/jquery/jquery.js +11008 -0
  171. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_444444_256x240.png +0 -0
  172. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_555555_256x240.png +0 -0
  173. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_777620_256x240.png +0 -0
  174. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_777777_256x240.png +0 -0
  175. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_cc0000_256x240.png +0 -0
  176. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_ffffff_256x240.png +0 -0
  177. data/spec/dummy/node_modules/jquery-ui-bundle/index.html +559 -0
  178. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.css +1312 -0
  179. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.js +18706 -0
  180. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.min.css +7 -0
  181. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.min.js +13 -0
  182. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.structure.css +886 -0
  183. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.structure.min.css +5 -0
  184. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.theme.css +443 -0
  185. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.theme.min.css +5 -0
  186. data/spec/dummy/node_modules/jquery-ui-bundle/package.json +33 -0
  187. data/spec/dummy/node_modules/jquery-ujs/CONTRIBUTING.md +109 -0
  188. data/spec/dummy/node_modules/jquery-ujs/MIT-LICENSE +20 -0
  189. data/spec/dummy/node_modules/jquery-ujs/README.md +86 -0
  190. data/spec/dummy/node_modules/jquery-ujs/RELEASE.md +23 -0
  191. data/spec/dummy/node_modules/jquery-ujs/bower.json +19 -0
  192. data/spec/dummy/node_modules/jquery-ujs/package.json +26 -0
  193. data/spec/dummy/node_modules/jquery-ujs/src/rails.js +555 -0
  194. data/spec/dummy/tmp/cache/747/A70/TrustyCms%3A%3AConfig +0 -0
  195. data/spec/dummy/tmp/cache/85C/FA0/TrustyCms.cache_mtime +0 -0
  196. data/vendor/extensions/multi-site-extension/lib/multi_site/admin_ui.rb +45 -0
  197. data/vendor/extensions/multi-site-extension/lib/multi_site/application_controller_extensions.rb +40 -0
  198. data/vendor/extensions/multi-site-extension/lib/multi_site/application_controller_filter_extensions.rb +22 -0
  199. data/vendor/extensions/multi-site-extension/lib/multi_site/engine.rb +10 -0
  200. data/vendor/extensions/multi-site-extension/lib/multi_site/page_extensions.rb +81 -0
  201. data/vendor/extensions/multi-site-extension/lib/multi_site/pages_controller_extensions.rb +55 -0
  202. data/vendor/extensions/multi-site-extension/lib/multi_site/resource_controller_extensions.rb +42 -0
  203. data/vendor/extensions/multi-site-extension/lib/multi_site/route_extensions.rb +22 -0
  204. data/vendor/extensions/multi-site-extension/lib/multi_site/route_set_extensions.rb +17 -0
  205. data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_model.rb +133 -0
  206. data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_validation.rb +33 -0
  207. data/vendor/extensions/multi-site-extension/lib/multi_site/site_chooser_helper.rb +14 -0
  208. data/vendor/extensions/multi-site-extension/lib/multi_site/site_controller_extensions.rb +30 -0
  209. data/vendor/extensions/multi-site-extension/lib/tasks/multi_site_extension_tasks.rake +28 -0
  210. data/vendor/extensions/multi-site-extension/lib/tasks/scoped_admin_extension_tasks.rake +28 -0
  211. data/vendor/extensions/multi-site-extension/lib/trusty-multi-site-extension.rb +1 -0
  212. data/vendor/extensions/multi-site-extension/multi_site_extension.rb +61 -0
  213. data/vendor/extensions/snippets-extension/lib/trusty-snippets-extension.rb +0 -0
  214. data/vendor/extensions/snippets-extension/snippets_extension.rb +46 -0
  215. metadata +347 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c8f794788bb92cd413c051dff1f51a89d5ac607
4
- data.tar.gz: b2d512c2d27fe693032f0a9ab3c1316addde0718
3
+ metadata.gz: 18b54542b314cc9d51fb925e10da972c5c68fbbd
4
+ data.tar.gz: ba928a6b156faf29ffa585f9105230b579e0d7c4
5
5
  SHA512:
6
- metadata.gz: c59fc9e709a7abdc0146fe7c2357a171509388ea51222be38d37b78acf1f6ea32ac1fe4f81436b5fce419f58019c11c8b4b767f12d9a0ec523d227e8e3e4a5b8
7
- data.tar.gz: 38ac76f3671665956504bd5fe8b7e6fc314e1d401eb9051b63c88075b8a942dc16441287694e7a1c8495086d0d4324491ced754753f907d598ea9b97af81b5a0
6
+ metadata.gz: 051a933ff4cdd4f2c16f8d9775bdc391cc418c2ec90ad4530ff9854b904b4522b042632de7dd422716ba4141221fbe4a6ea112308f2d916882bb23c04080893c
7
+ data.tar.gz: c97576470adce60e37d1a2afd406ebbe56e38d54f8e88a76e4f3810637ce30ace0782af6f24a9771a06aa674bbb0f398897246bc8b6f75b62f01502da4ecee78
data/Gemfile CHANGED
@@ -16,7 +16,7 @@ group :development, :test do
16
16
  gem 'capybara', '~> 2.13.0'
17
17
  gem 'rspec-rails'
18
18
  gem 'launchy', '~> 2.4.2'
19
- gem 'database_cleaner', '~> 1.5.3'
19
+ gem 'database_cleaner'
20
20
  gem 'poltergeist', '~> 1.14.0'
21
21
  gem 'factory_girl_rails', '~> 4.6.0'
22
22
  gem 'rails-observers', :git => 'https://github.com/rails/rails-observers'
@@ -25,6 +25,7 @@ group :development, :test do
25
25
  gem 'pry-byebug'
26
26
  gem 'simplecov'
27
27
  gem 'codeclimate-test-reporter'
28
+ gem 'acts_as_list'
28
29
  end
29
30
 
30
31
  gem 'nokogiri', '>= 1.7.1'
data/Gemfile.lock CHANGED
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- trusty-cms (3.1.8)
11
+ trusty-cms (3.1.9)
12
12
  RedCloth (~> 4.3.2)
13
13
  acts_as_tree (~> 2.6.1)
14
14
  bundler (~> 1.7)
@@ -75,6 +75,8 @@ GEM
75
75
  i18n (~> 0.7)
76
76
  minitest (~> 5.1)
77
77
  tzinfo (~> 1.1)
78
+ acts_as_list (0.9.10)
79
+ activerecord (>= 3.0)
78
80
  acts_as_tree (2.6.1)
79
81
  activerecord (>= 3.0.0)
80
82
  addressable (2.5.2)
@@ -120,7 +122,7 @@ GEM
120
122
  crass (1.0.3)
121
123
  css_parser (1.6.0)
122
124
  addressable
123
- database_cleaner (1.5.3)
125
+ database_cleaner (1.6.2)
124
126
  delocalize (0.4.0)
125
127
  rails (>= 3.0)
126
128
  diff-lcs (1.3)
@@ -151,7 +153,7 @@ GEM
151
153
  haml (>= 4.0, < 6)
152
154
  nokogiri (>= 1.6.0)
153
155
  ruby_parser (~> 3.5)
154
- i18n (0.9.1)
156
+ i18n (0.9.3)
155
157
  concurrent-ruby (~> 1.0)
156
158
  json (2.1.0)
157
159
  launchy (2.4.3)
@@ -168,11 +170,11 @@ GEM
168
170
  mime-types-data (3.2016.0521)
169
171
  mini_mime (1.0.0)
170
172
  mini_portile2 (2.3.0)
171
- minitest (5.11.1)
173
+ minitest (5.11.3)
172
174
  multi_json (1.13.1)
173
175
  mysql2 (0.4.10)
174
176
  nio4r (2.2.0)
175
- nokogiri (1.8.1)
177
+ nokogiri (1.8.2)
176
178
  mini_portile2 (~> 2.3.0)
177
179
  orm_adapter (0.5.0)
178
180
  poltergeist (1.14.0)
@@ -189,8 +191,8 @@ GEM
189
191
  pry-rails (0.3.6)
190
192
  pry (>= 0.10.4)
191
193
  public_suffix (3.0.1)
192
- puma (3.11.0)
193
- rack (2.0.3)
194
+ puma (3.11.2)
195
+ rack (2.0.4)
194
196
  rack-cache (1.7.1)
195
197
  rack (>= 0.4)
196
198
  rack-test (0.8.2)
@@ -247,7 +249,7 @@ GEM
247
249
  rspec-expectations (~> 3.7.0)
248
250
  rspec-mocks (~> 3.7.0)
249
251
  rspec-support (~> 3.7.0)
250
- rspec-support (3.7.0)
252
+ rspec-support (3.7.1)
251
253
  ruby_parser (3.10.1)
252
254
  sexp_processor (~> 4.9)
253
255
  sass (3.4.25)
@@ -296,9 +298,10 @@ PLATFORMS
296
298
  ruby
297
299
 
298
300
  DEPENDENCIES
301
+ acts_as_list
299
302
  capybara (~> 2.13.0)
300
303
  codeclimate-test-reporter
301
- database_cleaner (~> 1.5.3)
304
+ database_cleaner
302
305
  factory_girl_rails (~> 4.6.0)
303
306
  launchy (~> 2.4.2)
304
307
  mysql2 (~> 0.4.2)
@@ -314,5 +317,6 @@ DEPENDENCIES
314
317
  trusty-cms!
315
318
  trustygems (~> 0.2.0)
316
319
 
320
+
317
321
  BUNDLED WITH
318
322
  1.16.0
Binary file
@@ -0,0 +1,85 @@
1
+ //fonts
2
+ $font_0: Georgia;
3
+ $font_1: Palatino;
4
+ $font_2: Times New Roman;
5
+ $font_3: Times;
6
+ $font_4: serif;
7
+
8
+ #content {
9
+ table.index {
10
+ tr.node {
11
+ td {
12
+ padding: .5em;
13
+ }
14
+ }
15
+ &.node {
16
+ &.site {
17
+ small {
18
+ color: #666;
19
+ font-size: 90%;
20
+ font-style: italic;
21
+ font-weight: normal;
22
+ margin-left: .5em;
23
+ }
24
+ a {
25
+ &:visited {
26
+ font-size: 115%;
27
+ font-weight: bold;
28
+ color: black;
29
+ text-decoration: none;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ .form-area {
36
+ p {
37
+ &.domain {
38
+ float: left;
39
+ width: 40%;
40
+ margin: 1em 1em 0 0;
41
+ overflow: hidden;
42
+ label {
43
+
44
+ }
45
+ }
46
+ &.subtitle {
47
+ margin: 1em 0 0 0;
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+
54
+ #content {
55
+ div.form-area p.homepage {
56
+ float: right;
57
+ width: 16%;
58
+ margin: 1em 0 0;
59
+ overflow: hidden;
60
+ }
61
+ .form-area p {
62
+ &.domain label {
63
+ display: block;
64
+ position: relative;
65
+ }
66
+ &.homepage label {
67
+ display: block;
68
+ position: relative;
69
+ }
70
+ }
71
+ }
72
+ p.formnote {
73
+ clear: both;
74
+ padding: 2em 0;
75
+ }
76
+
77
+
78
+ //@extend-elements
79
+ //original selectors
80
+ //#content div.form-area p.domain .textbox, #content div.form-area p.homepage .textbox, #content div.form-area p.subtitle .textbox, #content div.form-area p.subtitle select
81
+ %extend_1 {
82
+ font-family: $font_0, $font_1, $font_2, $font_3, $font_4;
83
+ font-size: 140%;
84
+ width: 100%;
85
+ }
@@ -0,0 +1,76 @@
1
+ //colors
2
+ $color_turquoise_blue_approx: #66d9e0;
3
+ $white: #fff;
4
+ $black: #000;
5
+
6
+ #site_chooser {
7
+ width: 20%;
8
+ border-collapse: collapse;
9
+ float: right;
10
+ }
11
+ #nav {
12
+ list-style: none;
13
+ font-weight: bold;
14
+ margin-bottom: 10px;
15
+ width: 100%;
16
+ padding-top: 10px;
17
+ padding-bottom: 10px;
18
+ padding-left: 5px;
19
+ margin: 0;
20
+ cursor: pointer;
21
+ li {
22
+ margin-right: 10px;
23
+ position: relative;
24
+ color: $color_turquoise_blue_approx;
25
+ &:hover {
26
+ a {
27
+ background: $black;
28
+ text-decoration: underline;
29
+ }
30
+ ul a {
31
+ text-decoration: none;
32
+ }
33
+ }
34
+ }
35
+ a {
36
+ display: block;
37
+ padding: 5px;
38
+ color: $white;
39
+ background: $black;
40
+ text-decoration: none;
41
+ &:hover {
42
+ color: $white;
43
+ background: $black;
44
+ text-decoration: underline;
45
+ }
46
+ &.site-link:hover {
47
+ color: $color_turquoise_blue_approx;
48
+ //Instead of the line below you could use @include transition($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10)
49
+ transition: all 0.2s;
50
+ }
51
+ }
52
+ ul {
53
+ background: $white;
54
+ background: rgba(255,255,255,0);
55
+ list-style: none;
56
+ position: absolute;
57
+ margin-top: 10px;
58
+ visibility: hidden;
59
+ opacity: 0;
60
+ //Instead of the line below you could use @include transition($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10)
61
+ transition: opacity 0.2s;
62
+ li {
63
+ float: none;
64
+ }
65
+ a {
66
+ white-space: nowrap;
67
+ }
68
+ }
69
+ &:hover ul {
70
+ visibility: visible;
71
+ opacity: 1;
72
+ //Instead of the line below you could use @include transition($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10)
73
+ transition: opacity 0.2s;
74
+ z-index: 99999;
75
+ }
76
+ }
@@ -25,6 +25,9 @@
25
25
  @import "partials/validations";
26
26
  @import "partials/treetable";
27
27
 
28
+ @import "multi_site_main";
29
+ @import "site_chooser";
30
+
28
31
  // JQueryUI Partials
29
32
  @import "partials/jquery-ui";
30
33
  @import "partials/jquery-ui-structure";
@@ -0,0 +1,14 @@
1
+ class Admin::SitesController < Admin::ResourceController
2
+ helper :sites
3
+ only_allow_access_to :index, :show, :new, :create, :edit, :update, :remove, :destroy,
4
+ :when => :admin,
5
+ :denied_url => { :controller => 'pages', :action => 'index' },
6
+ :denied_message => 'You must have administrative privileges to perform this action.'
7
+
8
+ %w(move_higher move_lower move_to_top move_to_bottom).each do |action|
9
+ define_method action do
10
+ model.send(action)
11
+ response_for :update
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module ScopedHelper
2
+ def self.included(base)
3
+
4
+ base.module_eval do
5
+ def title
6
+ t = current_site.name
7
+ t = TrustyCms::Config['admin.title'] || 'Radiant CMS' if t.blank?
8
+ t
9
+ end
10
+
11
+ def subtitle
12
+ st = current_site.subtitle
13
+ st = TrustyCms::Config['admin.subtitle'] || 'publishing for small teams' if st.blank?
14
+ st
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module SitesHelper
2
+ def order_links(site)
3
+ String.new.tap do |output|
4
+ output << link_to(image("move_to_top.png", :alt => "Move to top"), move_to_top_admin_site_path(site), :method => :put)
5
+ output << link_to(image("move_higher.png", :alt => "Move up"), move_higher_admin_site_path(site), :method => :post)
6
+ output << link_to(image("move_lower.png", :alt => "Move down"), move_lower_admin_site_path(site), :method => :post)
7
+ output << link_to(image("move_to_bottom.png", :alt => "Move to bottom"), move_to_bottom_admin_site_path(site), :method => :put)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,86 @@
1
+ # The site class includes - in find_for_host - some key retrieval and creation logic that is called from ApplicationController to set the current site context.
2
+ # Otherwise it's just another Trusty data model.
3
+
4
+ class Site < ActiveRecord::Base
5
+ acts_as_list
6
+ belongs_to :created_by, :class_name => 'User'
7
+ belongs_to :updated_by, :class_name => 'User'
8
+ belongs_to :production_homepage , :class_name => 'ProductionPage'
9
+
10
+ default_scope {order('position ASC')}
11
+
12
+ class << self
13
+ attr_accessor :several
14
+
15
+ # I've added one or two sql queries here for the sake of a separate default method
16
+
17
+ def find_for_host(hostname = '')
18
+ return default if hostname.blank?
19
+ sites = where("domain IS NOT NULL")
20
+ site = sites.find { |site| hostname == site.base_domain || hostname =~ Regexp.compile(site.domain) }
21
+ site || default
22
+ end
23
+
24
+ # Site.default returns the the first site it can find with an empty domain pattern.
25
+
26
+ def default
27
+ find_by_domain('') || find_by_domain(nil) || catchall
28
+ end
29
+
30
+ # If none is found, we are probably brand new, so a workable default site is created.
31
+
32
+ def catchall
33
+ create({
34
+ :domain => '',
35
+ :name => 'default_site',
36
+ :base_domain => 'localhost',
37
+ :homepage => Page.find_by_parent_id(nil)
38
+ })
39
+ end
40
+
41
+ # Returns true if more than one site is present. This is normally only used to make interface decisions, eg whether to show the site-chooser dropdown.
42
+
43
+ def several?
44
+ several = (count > 1) if several.nil?
45
+ end
46
+ end
47
+
48
+ belongs_to :homepage, :class_name => "Page", :foreign_key => "homepage_id"
49
+ validates_presence_of :name, :base_domain
50
+ validates_uniqueness_of :domain
51
+
52
+ after_create :create_homepage
53
+ after_save :reload_routes
54
+
55
+ # Returns the fully specified web address for the supplied path, or the root of this site if no path is given.
56
+
57
+ def url(path = "/")
58
+ uri = URI.join("http://#{self.base_domain}", path)
59
+ uri.to_s
60
+ end
61
+
62
+ # Returns the fully specified web address for the development version of this site and the supplied path, or the root of this site if no path is given.
63
+
64
+ def dev_url(path = "/")
65
+ uri = URI.join("http://#{TrustyCms::Config['dev.host'] || 'dev'}.#{self.base_domain}", path)
66
+ uri.to_s
67
+ end
68
+
69
+ def create_homepage
70
+ if self.homepage_id.blank?
71
+ self.homepage = self.build_homepage(:title => "#{self.name} Homepage",
72
+ :slug => "#{self.name.to_slug}", :breadcrumb => "Home")
73
+ default_status = TrustyCms::Config['defaults.page.status']
74
+ self.homepage.status = Status[default_status] if default_status
75
+ default_parts = TrustyCms::Config['defaults.page.parts'].to_s.strip.split(/\s*,\s*/)
76
+ default_parts.each do |name|
77
+ self.homepage.parts << PagePart.new(:name => name, :filter_id => TrustyCms::Config['defaults.page.filter'])
78
+ end
79
+ save
80
+ end
81
+ end
82
+
83
+ def reload_routes
84
+ TrustyCms::Application.reload_routes!
85
+ end
86
+ end
@@ -0,0 +1,23 @@
1
+ class Snippet < ActiveRecord::Base
2
+
3
+ # Default Order
4
+ default_scope {order('name')}
5
+
6
+ # Associations
7
+ belongs_to :created_by, :class_name => 'User'
8
+ belongs_to :updated_by, :class_name => 'User'
9
+
10
+ # Validations
11
+ validates_presence_of :name
12
+ validates_length_of :name, :maximum => 100
13
+ validates_length_of :filter_id, :maximum => 25, :allow_nil => true
14
+ validates_format_of :name, :with => %r{\A\S*\z}
15
+ validates_uniqueness_of :name
16
+
17
+ object_id_attr :filter, TextFilter
18
+
19
+ def after_initialize
20
+ self.filter_id ||= TrustyCms::Config['defaults.snippet.filter'] if new_record?
21
+ end
22
+
23
+ end
@@ -0,0 +1,24 @@
1
+ class SnippetFinder
2
+ class << self
3
+ def find(id)
4
+ find_map('find',id)
5
+ end
6
+
7
+ def find_by_name(name)
8
+ find_map('find_by_name', name)
9
+ end
10
+
11
+ def finder_types
12
+ [Snippet]
13
+ end
14
+
15
+ private
16
+
17
+ def find_map(meth, *args)
18
+ finder_types.find{|type|
19
+ found = type.send(meth, *args)
20
+ return found if found
21
+ }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,80 @@
1
+ module SnippetTags
2
+ include TrustyCms::Taggable
3
+
4
+ class TagError < StandardError; end
5
+
6
+ desc %{
7
+ Renders the snippet specified in the @name@ attribute within the context of a page.
8
+
9
+ *Usage:*
10
+
11
+ <pre><code><r:snippet name="snippet_name" /></code></pre>
12
+
13
+ When used as a double tag, the part in between both tags may be used within the
14
+ snippet itself, being substituted in place of @<r:yield/>@.
15
+
16
+ *Usage:*
17
+
18
+ <pre><code><r:snippet name="snippet_name">Lorem ipsum dolor...</r:snippet></code></pre>
19
+ }
20
+ tag 'snippet' do |tag|
21
+ required_attr(tag, 'name')
22
+ name = tag['name']
23
+
24
+ snippet = snippet_cache(name.strip)
25
+
26
+ if snippet
27
+ tag.locals.yield = tag.expand if tag.double?
28
+ tag.globals.page.render_snippet(snippet)
29
+ else
30
+ raise TagError.new("snippet '#{name}' not found")
31
+ end
32
+ end
33
+
34
+ def snippet_cache(name)
35
+ @snippet_cache ||= {}
36
+
37
+ snippet = @snippet_cache[name]
38
+ unless snippet
39
+ snippet = SnippetFinder.find_by_name(name)
40
+ @snippet_cache[name] = snippet
41
+ end
42
+ snippet
43
+ end
44
+ private :snippet_cache
45
+
46
+ desc %{
47
+ Used within a snippet as a placeholder for substitution of child content, when
48
+ the snippet is called as a double tag.
49
+
50
+ *Usage (within a snippet):*
51
+
52
+ <pre><code>
53
+ <div id="outer">
54
+ <p>before</p>
55
+ <r:yield/>
56
+ <p>after</p>
57
+ </div>
58
+ </code></pre>
59
+
60
+ If the above snippet was named "yielding", you could call it from any Page,
61
+ Layout or Snippet as follows:
62
+
63
+ <pre><code><r:snippet name="yielding">Content within</r:snippet></code></pre>
64
+
65
+ Which would output the following:
66
+
67
+ <pre><code>
68
+ <div id="outer">
69
+ <p>before</p>
70
+ Content within
71
+ <p>after</p>
72
+ </div>
73
+ </code></pre>
74
+
75
+ When called in the context of a Page or a Layout, @<r:yield/>@ outputs nothing.
76
+ }
77
+ tag 'yield' do |tag|
78
+ tag.locals.yield
79
+ end
80
+ end
@@ -0,0 +1,8 @@
1
+ - unless current_user.site
2
+ %tr
3
+ %th.label
4
+ %label{:for=>"user_admin"} Can edit site
5
+ %td.field{:style => 'text-align: left;'}
6
+ = select :user, :site_id, [['<any>', '']] + Site.all.map { |s| [s.name, s.id] }
7
+ %td.help
8
+ A user with no site is able to act (to whatever extent their status allows) on any site.
@@ -0,0 +1,8 @@
1
+ - unless current_user.site
2
+ %p{:style => 'float: left; margin-right: 32px'}
3
+ %label{:for=>"layout_site_id", :Class => "admin_only"}
4
+ Site
5
+ - sites = Site.all.map { |s| [s.name, s.id] }
6
+ - selection = {:include_blank => Layout.is_shareable?}
7
+ - selection[:selected] = current_site.id if @layout.new_record? && ! Layout.is_shareable?
8
+ = select :layout, :site_id, sites, selection
@@ -0,0 +1,11 @@
1
+ = stylesheet_link_tag 'admin/multi_site'
2
+
3
+ - if admin? && defined?(Site) && defined?(controller) && controller.sited_model? && controller.template_name == 'index' && Site.several?
4
+ %nav#site_chooser
5
+ %ul#nav
6
+ %li
7
+ = "Current Site: #{current_site.name}"
8
+ %ul.expansion
9
+ - Site.all.each do |site|
10
+ %li
11
+ = link_to( site.name, "#{request.path}?site_id=#{site.id}", :class => site == current_site ? 'fg site-link' : 'site-link')
@@ -0,0 +1,50 @@
1
+ = render_region :form_top
2
+ .form-area
3
+ - render_region :form do |form|
4
+
5
+ - form.edit_name do
6
+ %fieldset.title
7
+ %h1
8
+ %i.fa.fa-sitemap
9
+ Site Information
10
+ %label{:for => "site_name"} Site title
11
+ = f.text_field :name, :class => "textbox", :size => 50
12
+ %br
13
+ %label{:for => "site_subtitle"} and subtitle
14
+ = f.text_field :subtitle, :class => "textbox"
15
+
16
+ - form.edit_domain do
17
+ %fieldset.domain
18
+ %h1
19
+ %i.fa.fa-lightbulb-o
20
+ Domain Information
21
+ %label{:for => "site_domain"}
22
+ Domain pattern
23
+ = f.text_field :domain, :class => "textbox", :size => 50
24
+ %br
25
+ %label{:for => "site_base_domain"}
26
+ Base domain name
27
+ = f.text_field :base_domain, :class => "textbox", :size => 50
28
+
29
+ - form.edit_homepage do
30
+ %fieldset.homepage
31
+ %h1
32
+ %i.fa.fa-home
33
+ Homepage ID
34
+ %label{:for => "site_homepage_id"} Homepage ID
35
+ = f.text_field :homepage_id, :class => "textbox"
36
+
37
+ %p.formnote
38
+ - if f.object.new_record?
39
+ A new homepage will be created automatically if none is specified.
40
+ - else
41
+ If you change the site homepage ID, be sure it is to a page with no parents.
42
+
43
+ - render_region :form_bottom do |form_bottom|
44
+ - form_bottom.edit_timestamp do
45
+ = updated_stamp @site
46
+ - form_bottom.edit_buttons do
47
+ %p.buttons
48
+ = save_model_button(@site)
49
+ or
50
+ = link_to "cancel", admin_sites_path
@@ -0,0 +1,7 @@
1
+ = stylesheet_link_tag 'admin/multi_site'
2
+ - render_region :main do |main|
3
+ - main.edit_header do
4
+ %h1 Edit Site
5
+ - main.edit_form do
6
+ = form_for @site, :url => admin_site_path(@site), :html => {:method => :put} do |f|
7
+ = render :partial => "form", :locals => {:f => f}