trusty-cms 3.1.8 → 3.1.9

Sign up to get free protection for your applications and to get access to all the features.
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}