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.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/Gemfile.lock +13 -9
- data/app/assets/images/admin/move_higher.png +0 -0
- data/app/assets/images/admin/move_lower.png +0 -0
- data/app/assets/images/admin/move_to_bottom.png +0 -0
- data/app/assets/images/admin/move_to_top.png +0 -0
- data/app/assets/images/admin/remove.png +0 -0
- data/app/assets/stylesheets/admin/_multi_site_main.scss +85 -0
- data/app/assets/stylesheets/admin/_site_chooser.scss +76 -0
- data/app/assets/stylesheets/admin/main.scss +3 -0
- data/app/controllers/admin/sites_controller.rb +14 -0
- data/app/helpers/scoped_helper.rb +19 -0
- data/app/helpers/sites_helper.rb +10 -0
- data/app/models/site.rb +86 -0
- data/app/models/snippet.rb +23 -0
- data/app/models/snippet_finder.rb +24 -0
- data/app/models/snippet_tags.rb +80 -0
- data/app/users/_choose_site.html.haml +8 -0
- data/app/views/admin/layouts/_choose_site.html.haml +8 -0
- data/app/views/admin/layouts/_site_chooser.html.haml +11 -0
- data/app/views/admin/sites/_form.haml +50 -0
- data/app/views/admin/sites/edit.haml +7 -0
- data/app/views/admin/sites/index.haml +43 -0
- data/app/views/admin/sites/new.haml +7 -0
- data/app/views/admin/snippets/_choose_site.html.haml +6 -0
- data/app/views/{snippets → admin/snippets}/_form.html.haml +0 -0
- data/app/views/{snippets → admin/snippets}/_popups.html.haml +0 -0
- data/app/views/{snippets → admin/snippets}/edit.html.haml +0 -0
- data/app/views/{snippets → admin/snippets}/index.html.haml +0 -0
- data/app/views/{snippets → admin/snippets}/new.html.haml +0 -0
- data/app/views/{snippets → admin/snippets}/remove.html.haml +0 -0
- data/app/views/admin/users/_choose_site.html.haml +8 -0
- data/config/application.rb +0 -2
- data/config/initializers/trusty_cms_config.rb +6 -0
- data/config/routes.rb +8 -0
- data/coverage/index.html +3837 -2759
- data/db/migrate/006_remove_user_login_index.rb +8 -0
- data/db/migrate/010_create_sites.rb +13 -0
- data/db/migrate/011_add_order_to_sites.rb +9 -0
- data/db/migrate/022_add_admin_fields_to_sites.rb +17 -0
- data/db/migrate/023_add_sites.rb +13 -0
- data/db/migrate/024_site_abbreviation.rb +9 -0
- data/db/migrate/025_recreate_non_unique_index_on_snippets_name.rb +11 -0
- data/db/migrate/026_add_site_id_to_pages.rb +24 -0
- data/db/migrate/027_add_base_domain_to_sites.rb +9 -0
- data/lib/trusty_cms.rb +1 -1
- data/spec/dummy/db/schema.rb +20 -2
- data/spec/dummy/log/test.log +44621 -0
- data/spec/dummy/node_modules/jquery/AUTHORS.txt +301 -0
- data/spec/dummy/node_modules/jquery/LICENSE.txt +36 -0
- data/spec/dummy/node_modules/jquery/README.md +67 -0
- data/spec/dummy/node_modules/jquery/bower.json +14 -0
- data/spec/dummy/node_modules/jquery/dist/core.js +476 -0
- data/spec/dummy/node_modules/jquery/dist/jquery.js +10253 -0
- data/spec/dummy/node_modules/jquery/dist/jquery.min.js +4 -0
- data/spec/dummy/node_modules/jquery/dist/jquery.min.map +1 -0
- data/spec/dummy/node_modules/jquery/dist/jquery.slim.js +8160 -0
- data/spec/dummy/node_modules/jquery/dist/jquery.slim.min.js +4 -0
- data/spec/dummy/node_modules/jquery/dist/jquery.slim.min.map +1 -0
- data/spec/dummy/node_modules/jquery/external/sizzle/LICENSE.txt +36 -0
- data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.js +2272 -0
- data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.min.js +3 -0
- data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.min.map +1 -0
- data/spec/dummy/node_modules/jquery/package.json +97 -0
- data/spec/dummy/node_modules/jquery/src/ajax/jsonp.js +102 -0
- data/spec/dummy/node_modules/jquery/src/ajax/load.js +76 -0
- data/spec/dummy/node_modules/jquery/src/ajax/parseXML.js +30 -0
- data/spec/dummy/node_modules/jquery/src/ajax/script.js +77 -0
- data/spec/dummy/node_modules/jquery/src/ajax/var/location.js +5 -0
- data/spec/dummy/node_modules/jquery/src/ajax/var/nonce.js +7 -0
- data/spec/dummy/node_modules/jquery/src/ajax/var/rquery.js +5 -0
- data/spec/dummy/node_modules/jquery/src/ajax/xhr.js +169 -0
- data/spec/dummy/node_modules/jquery/src/ajax.js +855 -0
- data/spec/dummy/node_modules/jquery/src/attributes/attr.js +141 -0
- data/spec/dummy/node_modules/jquery/src/attributes/classes.js +174 -0
- data/spec/dummy/node_modules/jquery/src/attributes/prop.js +143 -0
- data/spec/dummy/node_modules/jquery/src/attributes/support.js +33 -0
- data/spec/dummy/node_modules/jquery/src/attributes/val.js +190 -0
- data/spec/dummy/node_modules/jquery/src/attributes.js +13 -0
- data/spec/dummy/node_modules/jquery/src/callbacks.js +234 -0
- data/spec/dummy/node_modules/jquery/src/core/DOMEval.js +16 -0
- data/spec/dummy/node_modules/jquery/src/core/access.js +70 -0
- data/spec/dummy/node_modules/jquery/src/core/init.js +128 -0
- data/spec/dummy/node_modules/jquery/src/core/nodeName.js +13 -0
- data/spec/dummy/node_modules/jquery/src/core/parseHTML.js +65 -0
- data/spec/dummy/node_modules/jquery/src/core/ready-no-deferred.js +96 -0
- data/spec/dummy/node_modules/jquery/src/core/ready.js +86 -0
- data/spec/dummy/node_modules/jquery/src/core/readyException.js +13 -0
- data/spec/dummy/node_modules/jquery/src/core/stripAndCollapse.js +14 -0
- data/spec/dummy/node_modules/jquery/src/core/support.js +20 -0
- data/spec/dummy/node_modules/jquery/src/core/var/rsingleTag.js +6 -0
- data/spec/dummy/node_modules/jquery/src/core.js +476 -0
- data/spec/dummy/node_modules/jquery/src/css/addGetHookIf.js +26 -0
- data/spec/dummy/node_modules/jquery/src/css/adjustCSS.js +71 -0
- data/spec/dummy/node_modules/jquery/src/css/curCSS.js +65 -0
- data/spec/dummy/node_modules/jquery/src/css/hiddenVisibleSelectors.js +15 -0
- data/spec/dummy/node_modules/jquery/src/css/showHide.js +105 -0
- data/spec/dummy/node_modules/jquery/src/css/support.js +89 -0
- data/spec/dummy/node_modules/jquery/src/css/var/cssExpand.js +5 -0
- data/spec/dummy/node_modules/jquery/src/css/var/getStyles.js +17 -0
- data/spec/dummy/node_modules/jquery/src/css/var/isHiddenWithinTree.js +34 -0
- data/spec/dummy/node_modules/jquery/src/css/var/rmargin.js +5 -0
- data/spec/dummy/node_modules/jquery/src/css/var/rnumnonpx.js +7 -0
- data/spec/dummy/node_modules/jquery/src/css/var/swap.js +26 -0
- data/spec/dummy/node_modules/jquery/src/css.js +438 -0
- data/spec/dummy/node_modules/jquery/src/data/Data.js +161 -0
- data/spec/dummy/node_modules/jquery/src/data/var/acceptData.js +19 -0
- data/spec/dummy/node_modules/jquery/src/data/var/dataPriv.js +7 -0
- data/spec/dummy/node_modules/jquery/src/data/var/dataUser.js +7 -0
- data/spec/dummy/node_modules/jquery/src/data.js +179 -0
- data/spec/dummy/node_modules/jquery/src/deferred/exceptionHook.js +21 -0
- data/spec/dummy/node_modules/jquery/src/deferred.js +391 -0
- data/spec/dummy/node_modules/jquery/src/deprecated.js +40 -0
- data/spec/dummy/node_modules/jquery/src/dimensions.js +56 -0
- data/spec/dummy/node_modules/jquery/src/effects/Tween.js +123 -0
- data/spec/dummy/node_modules/jquery/src/effects/animatedSelector.js +15 -0
- data/spec/dummy/node_modules/jquery/src/effects.js +699 -0
- data/spec/dummy/node_modules/jquery/src/event/ajax.js +22 -0
- data/spec/dummy/node_modules/jquery/src/event/alias.js +29 -0
- data/spec/dummy/node_modules/jquery/src/event/focusin.js +55 -0
- data/spec/dummy/node_modules/jquery/src/event/support.js +11 -0
- data/spec/dummy/node_modules/jquery/src/event/trigger.js +185 -0
- data/spec/dummy/node_modules/jquery/src/event.js +746 -0
- data/spec/dummy/node_modules/jquery/src/exports/amd.js +26 -0
- data/spec/dummy/node_modules/jquery/src/exports/global.js +34 -0
- data/spec/dummy/node_modules/jquery/src/jquery.js +41 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/_evalUrl.js +23 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/buildFragment.js +104 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/getAll.js +32 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/setGlobalEval.js +22 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/support.js +35 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/var/rcheckableType.js +5 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/var/rscriptType.js +5 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/var/rtagName.js +5 -0
- data/spec/dummy/node_modules/jquery/src/manipulation/wrapMap.js +29 -0
- data/spec/dummy/node_modules/jquery/src/manipulation.js +488 -0
- data/spec/dummy/node_modules/jquery/src/offset.js +229 -0
- data/spec/dummy/node_modules/jquery/src/queue/delay.js +24 -0
- data/spec/dummy/node_modules/jquery/src/queue.js +145 -0
- data/spec/dummy/node_modules/jquery/src/selector-native.js +237 -0
- data/spec/dummy/node_modules/jquery/src/selector-sizzle.js +19 -0
- data/spec/dummy/node_modules/jquery/src/selector.js +3 -0
- data/spec/dummy/node_modules/jquery/src/serialize.js +130 -0
- data/spec/dummy/node_modules/jquery/src/traversing/findFilter.js +106 -0
- data/spec/dummy/node_modules/jquery/src/traversing/var/dir.js +22 -0
- data/spec/dummy/node_modules/jquery/src/traversing/var/rneedsContext.js +8 -0
- data/spec/dummy/node_modules/jquery/src/traversing/var/siblings.js +17 -0
- data/spec/dummy/node_modules/jquery/src/traversing.js +191 -0
- data/spec/dummy/node_modules/jquery/src/var/ObjectFunctionString.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/arr.js +5 -0
- data/spec/dummy/node_modules/jquery/src/var/class2type.js +6 -0
- data/spec/dummy/node_modules/jquery/src/var/concat.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/document.js +5 -0
- data/spec/dummy/node_modules/jquery/src/var/documentElement.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/fnToString.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/getProto.js +5 -0
- data/spec/dummy/node_modules/jquery/src/var/hasOwn.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/indexOf.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/pnum.js +5 -0
- data/spec/dummy/node_modules/jquery/src/var/push.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/rcssNum.js +9 -0
- data/spec/dummy/node_modules/jquery/src/var/rnothtmlwhite.js +8 -0
- data/spec/dummy/node_modules/jquery/src/var/slice.js +7 -0
- data/spec/dummy/node_modules/jquery/src/var/support.js +6 -0
- data/spec/dummy/node_modules/jquery/src/var/toString.js +7 -0
- data/spec/dummy/node_modules/jquery/src/wrap.js +77 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/AUTHORS.txt +333 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/LICENSE.txt +43 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/external/jquery/jquery.js +11008 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_444444_256x240.png +0 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_555555_256x240.png +0 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_777620_256x240.png +0 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_777777_256x240.png +0 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_cc0000_256x240.png +0 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_ffffff_256x240.png +0 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/index.html +559 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.css +1312 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.js +18706 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.min.css +7 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.min.js +13 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.structure.css +886 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.structure.min.css +5 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.theme.css +443 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.theme.min.css +5 -0
- data/spec/dummy/node_modules/jquery-ui-bundle/package.json +33 -0
- data/spec/dummy/node_modules/jquery-ujs/CONTRIBUTING.md +109 -0
- data/spec/dummy/node_modules/jquery-ujs/MIT-LICENSE +20 -0
- data/spec/dummy/node_modules/jquery-ujs/README.md +86 -0
- data/spec/dummy/node_modules/jquery-ujs/RELEASE.md +23 -0
- data/spec/dummy/node_modules/jquery-ujs/bower.json +19 -0
- data/spec/dummy/node_modules/jquery-ujs/package.json +26 -0
- data/spec/dummy/node_modules/jquery-ujs/src/rails.js +555 -0
- data/spec/dummy/tmp/cache/747/A70/TrustyCms%3A%3AConfig +0 -0
- data/spec/dummy/tmp/cache/85C/FA0/TrustyCms.cache_mtime +0 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/admin_ui.rb +45 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/application_controller_extensions.rb +40 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/application_controller_filter_extensions.rb +22 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/engine.rb +10 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/page_extensions.rb +81 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/pages_controller_extensions.rb +55 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/resource_controller_extensions.rb +42 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/route_extensions.rb +22 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/route_set_extensions.rb +17 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_model.rb +133 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_validation.rb +33 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/site_chooser_helper.rb +14 -0
- data/vendor/extensions/multi-site-extension/lib/multi_site/site_controller_extensions.rb +30 -0
- data/vendor/extensions/multi-site-extension/lib/tasks/multi_site_extension_tasks.rake +28 -0
- data/vendor/extensions/multi-site-extension/lib/tasks/scoped_admin_extension_tasks.rake +28 -0
- data/vendor/extensions/multi-site-extension/lib/trusty-multi-site-extension.rb +1 -0
- data/vendor/extensions/multi-site-extension/multi_site_extension.rb +61 -0
- data/vendor/extensions/snippets-extension/lib/trusty-snippets-extension.rb +0 -0
- data/vendor/extensions/snippets-extension/snippets_extension.rb +46 -0
- metadata +347 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18b54542b314cc9d51fb925e10da972c5c68fbbd
|
4
|
+
data.tar.gz: ba928a6b156faf29ffa585f9105230b579e0d7c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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'
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
193
|
-
rack (2.0.
|
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.
|
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
|
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
|
Binary file
|
Binary file
|
Binary file
|
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
|
+
}
|
@@ -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
|
data/app/models/site.rb
ADDED
@@ -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}
|