alchemy_cms 2.5.0.b2 → 2.5.0.b5
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/stylesheets/alchemy/archive.scss +34 -6
- data/app/assets/stylesheets/alchemy/elements.scss +46 -20
- data/app/assets/stylesheets/alchemy/sitemap.scss +4 -0
- data/app/assets/stylesheets/alchemy/variables.scss +1 -0
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
- data/app/controllers/alchemy/admin/pictures_controller.rb +2 -1
- data/app/controllers/alchemy/base_controller.rb +42 -29
- data/app/controllers/alchemy/pages_controller.rb +28 -16
- data/app/helpers/alchemy/admin/base_helper.rb +6 -6
- data/app/helpers/alchemy/admin/contents_helper.rb +1 -1
- data/app/helpers/alchemy/essences_helper.rb +4 -5
- data/app/models/alchemy/content.rb +47 -0
- data/app/models/alchemy/page.rb +6 -1
- data/app/models/alchemy/site.rb +24 -3
- data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -1
- data/app/views/alchemy/admin/resources/_form.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +4 -4
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +6 -1
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +25 -28
- data/config/locales/alchemy.de.yml +4 -2
- data/config/locales/alchemy.en.yml +1 -1
- data/db/migrate/20121220102223_add_aliases_to_site.rb +6 -0
- data/lib/alchemy/version.rb +1 -1
- data/spec/controllers/base_controller_spec.rb +44 -24
- data/spec/dummy/db/migrate/20121220102223_add_aliases_to_site.rb +6 -0
- data/spec/dummy/db/schema.rb +6 -4
- data/spec/models/site_spec.rb +41 -1
- metadata +5 -2
@@ -266,35 +266,63 @@ div#filter_bar {
|
|
266
266
|
}
|
267
267
|
|
268
268
|
div#tag_list {
|
269
|
+
height: 90%;
|
270
|
+
|
271
|
+
.js_filter_field_box {
|
272
|
+
|
273
|
+
input { width: 200px }
|
274
|
+
label { display: none }
|
275
|
+
}
|
269
276
|
|
270
277
|
ul {
|
271
278
|
list-style-type: none;
|
272
279
|
padding: 0;
|
273
280
|
margin: $default-margin 0 3*$default-margin 0;
|
281
|
+
height: inherit;
|
282
|
+
width: 204px;
|
283
|
+
overflow-x: hidden;
|
284
|
+
overflow-y: auto;
|
274
285
|
|
275
286
|
li {
|
276
|
-
|
277
|
-
padding: $default-padding
|
278
|
-
margin:
|
287
|
+
display: block;
|
288
|
+
padding: $default-padding 4*$default-padding $default-padding 6*$default-padding ;
|
289
|
+
margin: 2*$default-margin 0;
|
279
290
|
background-color: $medium-gray;
|
280
291
|
@include border-radius(16px);
|
281
292
|
white-space: nowrap;
|
293
|
+
overflow: hidden;
|
294
|
+
position: relative;
|
295
|
+
|
296
|
+
&:before {
|
297
|
+
content: '';
|
298
|
+
position: absolute;
|
299
|
+
left: 8px;
|
300
|
+
top: 7px;
|
301
|
+
background: url("ui-icons_666666_256x240.png") -242px -100px;
|
302
|
+
width: 12px;
|
303
|
+
height: 12px;
|
304
|
+
}
|
282
305
|
|
283
306
|
a {
|
284
307
|
text-decoration: none;
|
308
|
+
display: block;
|
285
309
|
}
|
286
310
|
|
311
|
+
&:hover { background-color: $very-light-blue }
|
312
|
+
|
287
313
|
&.active {
|
288
314
|
background-color: $dark-gray;
|
289
315
|
|
290
|
-
a {
|
291
|
-
color: $light-gray;
|
292
|
-
}
|
316
|
+
a { color: $light-gray }
|
293
317
|
}
|
294
318
|
}
|
295
319
|
}
|
296
320
|
}
|
297
321
|
|
322
|
+
div#alchemy_window_body div#tag_list ul {
|
323
|
+
height: 364px;
|
324
|
+
}
|
325
|
+
|
298
326
|
div#pictures_page_list {
|
299
327
|
|
300
328
|
h2 { margin: 0 8px }
|
@@ -19,9 +19,25 @@ img.add_element_spinner {
|
|
19
19
|
bottom: 6px;
|
20
20
|
}
|
21
21
|
|
22
|
-
#element_area
|
23
|
-
padding:
|
24
|
-
|
22
|
+
div#element_area {
|
23
|
+
padding: 0;
|
24
|
+
margin: 0;
|
25
|
+
min-height: 90%;
|
26
|
+
|
27
|
+
.sortable_cell {
|
28
|
+
min-height: 100px;
|
29
|
+
padding: 8px 8px 2px;
|
30
|
+
}
|
31
|
+
|
32
|
+
textarea {
|
33
|
+
width: 100%;
|
34
|
+
height: 140px;
|
35
|
+
}
|
36
|
+
|
37
|
+
h2#no_elements_on_page_notice {
|
38
|
+
padding: 2*$default-padding;
|
39
|
+
text-align: center;
|
40
|
+
}
|
25
41
|
}
|
26
42
|
|
27
43
|
.element_handle {
|
@@ -294,21 +310,10 @@ div.picture_thumbnail div.picture_image {
|
|
294
310
|
}
|
295
311
|
}
|
296
312
|
|
297
|
-
div#element_area {
|
298
|
-
padding: 0;
|
299
|
-
margin: 0;
|
300
|
-
min-height: 90%;
|
301
|
-
}
|
302
|
-
|
303
313
|
div#cells {
|
304
314
|
min-height: 100px;
|
305
315
|
}
|
306
316
|
|
307
|
-
div#element_area .sortable_cell {
|
308
|
-
min-height: 100px;
|
309
|
-
padding: 8px 8px 2px;
|
310
|
-
}
|
311
|
-
|
312
317
|
.place_element_spinner {
|
313
318
|
position: absolute;
|
314
319
|
right: 8px;
|
@@ -776,15 +781,14 @@ div.pictures_for_element {
|
|
776
781
|
margin-top: 4px;
|
777
782
|
}
|
778
783
|
|
779
|
-
#element_area textarea {
|
780
|
-
width: 97%;
|
781
|
-
height: 140px;
|
782
|
-
}
|
783
|
-
|
784
784
|
textarea.default_tinymce, textarea.custom_tinymce {
|
785
785
|
visibility: hidden;
|
786
786
|
}
|
787
787
|
|
788
|
+
.essence_html_editor textarea {
|
789
|
+
font-family: $mono-font-face;
|
790
|
+
}
|
791
|
+
|
788
792
|
.text_short_float_left {
|
789
793
|
width: 170px;
|
790
794
|
float: left;
|
@@ -808,7 +812,7 @@ textarea.default_tinymce, textarea.custom_tinymce {
|
|
808
812
|
}
|
809
813
|
}
|
810
814
|
|
811
|
-
a.
|
815
|
+
a.hint {
|
812
816
|
position: absolute;
|
813
817
|
right: 32px;
|
814
818
|
top: 8px;
|
@@ -829,6 +833,7 @@ a.element_hint {
|
|
829
833
|
padding: 8px;
|
830
834
|
line-height: 1.5em;
|
831
835
|
min-width: 180px;
|
836
|
+
font-size: 12px;
|
832
837
|
|
833
838
|
&:before {
|
834
839
|
content: '';
|
@@ -843,3 +848,24 @@ a.element_hint {
|
|
843
848
|
}
|
844
849
|
}
|
845
850
|
}
|
851
|
+
|
852
|
+
.content_editor .hint {
|
853
|
+
position: relative;
|
854
|
+
top: auto;
|
855
|
+
right: auto;
|
856
|
+
display: inline-block;
|
857
|
+
margin-right: 4px;
|
858
|
+
margin-top: -2px;
|
859
|
+
margin-left: -1px;
|
860
|
+
|
861
|
+
.bubble {
|
862
|
+
right: auto;
|
863
|
+
left: -4px;
|
864
|
+
top: 24px;
|
865
|
+
|
866
|
+
&:before {
|
867
|
+
right: auto;
|
868
|
+
left: 5px;
|
869
|
+
}
|
870
|
+
}
|
871
|
+
}
|
@@ -11,6 +11,7 @@ $default-padding: 4px;
|
|
11
11
|
$default-margin: $default-padding;
|
12
12
|
|
13
13
|
$default-font-face: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Verdana, Tahoma, sans-serif;
|
14
|
+
$mono-font-face: Menlo, Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
|
14
15
|
$default-font-size: 12px;
|
15
16
|
$default-font-style: $default-font-size $default-font-face;
|
16
17
|
|
@@ -219,7 +219,7 @@ module Alchemy
|
|
219
219
|
end
|
220
220
|
|
221
221
|
def switch_language
|
222
|
-
|
222
|
+
set_language(params[:language_id])
|
223
223
|
redirect_path = request.referer.include?('admin/layoutpages') ? admin_layoutpages_path : admin_pages_path
|
224
224
|
if request.xhr?
|
225
225
|
@redirect_url = redirect_path
|
@@ -133,7 +133,8 @@ module Alchemy
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def flush
|
136
|
-
FileUtils.rm_rf
|
136
|
+
# FileUtils.rm_rf only takes arrays of folders...
|
137
|
+
FileUtils.rm_rf Dir.glob(Rails.root.join('public', Alchemy.mount_point, 'pictures', '*'))
|
137
138
|
@notice = t('Picture cache flushed')
|
138
139
|
end
|
139
140
|
|
@@ -10,7 +10,7 @@ module Alchemy
|
|
10
10
|
before_filter :set_language
|
11
11
|
before_filter :mailer_set_url_options
|
12
12
|
|
13
|
-
helper_method :current_server, :t
|
13
|
+
helper_method :current_server, :current_site, :t
|
14
14
|
|
15
15
|
# Returns a host string with the domain the app is running on.
|
16
16
|
def current_server
|
@@ -46,9 +46,17 @@ module Alchemy
|
|
46
46
|
|
47
47
|
private
|
48
48
|
|
49
|
-
#
|
49
|
+
# Returns the current site.
|
50
|
+
#
|
51
|
+
def current_site
|
52
|
+
@current_site ||= Site.find_for_host(request.host)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Sets the current site in a cvar so the Language model
|
56
|
+
# can be scoped against it.
|
57
|
+
#
|
50
58
|
def set_current_site
|
51
|
-
Site.current =
|
59
|
+
Site.current = current_site
|
52
60
|
end
|
53
61
|
|
54
62
|
# Sets Alchemy's GUI translation to users preffered language and stores it in the session.
|
@@ -73,44 +81,49 @@ module Alchemy
|
|
73
81
|
end
|
74
82
|
end
|
75
83
|
|
76
|
-
# Sets the language for rendering pages in pages controller
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
84
|
+
# Sets the language for rendering pages in pages controller.
|
85
|
+
#
|
86
|
+
def set_language(lang = nil)
|
87
|
+
if lang
|
88
|
+
@language = lang.is_a?(Language) ? lang : load_language_from(lang)
|
89
|
+
else
|
90
|
+
# find the best language and remember it for later
|
91
|
+
@language = load_language_from_params ||
|
92
|
+
load_language_from_session ||
|
93
|
+
load_language_default
|
82
94
|
end
|
95
|
+
|
96
|
+
# store language in session
|
97
|
+
store_language_in_session(@language)
|
98
|
+
|
99
|
+
# switch locale to selected language
|
100
|
+
::I18n.locale = @language.code
|
83
101
|
end
|
84
102
|
|
85
|
-
def
|
86
|
-
if
|
87
|
-
|
103
|
+
def load_language_from_params
|
104
|
+
if params[:lang].present?
|
105
|
+
Language.find_by_code(params[:lang])
|
88
106
|
end
|
89
|
-
case language_code_or_id.class.name
|
90
|
-
when "String"
|
91
|
-
@language = Language.find_by_code(language_code_or_id)
|
92
|
-
when "Fixnum"
|
93
|
-
@language = Language.find(language_code_or_id)
|
94
|
-
end
|
95
|
-
store_language_in_session(@language)
|
96
107
|
end
|
97
108
|
|
98
|
-
def
|
99
|
-
|
100
|
-
|
101
|
-
store_language_in_session(@language)
|
102
|
-
else
|
103
|
-
raise "No Default Language found! Did you run `rake alchemy:db:seed` task?"
|
109
|
+
def load_language_from_session
|
110
|
+
if session[:language_id].present?
|
111
|
+
Language.find_by_id(session[:language_id])
|
104
112
|
end
|
105
113
|
end
|
106
114
|
|
115
|
+
def load_language_from(language_code_or_id)
|
116
|
+
Language.find_by_id(language_code_or_id) || Language.find_by_code(language_code_or_id)
|
117
|
+
end
|
118
|
+
|
119
|
+
def load_language_default
|
120
|
+
Language.get_default
|
121
|
+
end
|
122
|
+
|
107
123
|
def store_language_in_session(language)
|
108
124
|
if language && language.id
|
109
|
-
session[:language_id]
|
125
|
+
session[:language_id] = language.id
|
110
126
|
session[:language_code] = language.code
|
111
|
-
else
|
112
|
-
logger.warn "!!!! Language not found for #{language.inspect}. Setting to default!"
|
113
|
-
set_language_to_default
|
114
127
|
end
|
115
128
|
end
|
116
129
|
|
@@ -10,6 +10,7 @@ module Alchemy
|
|
10
10
|
|
11
11
|
rescue_from ActionController::RoutingError, :with => :render_404
|
12
12
|
|
13
|
+
before_filter :enforce_primary_host_for_site
|
13
14
|
before_filter :render_page_or_redirect, :only => [:show, :sitemap]
|
14
15
|
before_filter :perform_search, :only => :show, :if => proc { configuration(:ferret) }
|
15
16
|
|
@@ -58,26 +59,37 @@ module Alchemy
|
|
58
59
|
|
59
60
|
private
|
60
61
|
|
62
|
+
# Load the current page and store it in @page.
|
63
|
+
#
|
61
64
|
def load_page
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
65
|
+
@page ||= if params[:urlname].present?
|
66
|
+
# Load by urlname. If a language is specified in the request parameters,
|
67
|
+
# scope pages to it to make sure we can raise a 404 if the urlname
|
68
|
+
# is not available in that language.
|
69
|
+
Page.contentpages.where(
|
70
|
+
urlname: params[:urlname],
|
71
|
+
language_id: @language.id,
|
72
|
+
language_code: params[:lang] || @language.code
|
73
|
+
).first
|
66
74
|
else
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
return @page
|
71
|
-
else
|
72
|
-
@page = Page.contentpages.where(
|
73
|
-
:urlname => params[:urlname],
|
74
|
-
:language_id => session[:language_id], # Make sure that the current language
|
75
|
-
:language_code => params[:lang] # matches the requested language code.
|
76
|
-
).first
|
77
|
-
end
|
75
|
+
# No urlname was given, so just load the language root for the
|
76
|
+
# currently active language.
|
77
|
+
Page.language_root_for(@language.id)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
+
def enforce_primary_host_for_site
|
82
|
+
if needs_redirect_to_primary_host?
|
83
|
+
redirect_to url_for(host: current_site.host)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def needs_redirect_to_primary_host?
|
88
|
+
current_site.redirect_to_primary_host? &&
|
89
|
+
current_site.host != '*' &&
|
90
|
+
current_site.host != request.host
|
91
|
+
end
|
92
|
+
|
81
93
|
def render_page_or_redirect
|
82
94
|
@page ||= load_page
|
83
95
|
if User.admins.count == 0 && @page.nil?
|
@@ -104,7 +116,7 @@ module Alchemy
|
|
104
116
|
redirect_to main_app.url_for(@page.controller_and_action)
|
105
117
|
else
|
106
118
|
# setting the language to page.language to be sure it's correct
|
107
|
-
|
119
|
+
set_language(@page.language)
|
108
120
|
if params[:urlname].blank?
|
109
121
|
@root_page = @page
|
110
122
|
else
|
@@ -90,17 +90,17 @@ module Alchemy
|
|
90
90
|
:id => "search_field"
|
91
91
|
}
|
92
92
|
options = default_options.merge(options)
|
93
|
-
options[:onkeyup] << ";jQuery('
|
93
|
+
options[:onkeyup] << "; jQuery('##{options[:id]}').val().length >= 1 ? jQuery('.js_filter_field_clear').show() : jQuery('.js_filter_field_clear').hide();"
|
94
94
|
filter_field = '<div class="js_filter_field_box">'
|
95
95
|
filter_field << text_field_tag("filter", '', options)
|
96
96
|
filter_field << content_tag('span', '', :class => 'icon search')
|
97
97
|
filter_field << link_to('', '#', {
|
98
|
-
:onclick => "jQuery('##{options[:id]}').val('')
|
98
|
+
:onclick => "jQuery('##{options[:id]}').val(''); #{options[:onkeyup]}",
|
99
99
|
:class => "js_filter_field_clear",
|
100
|
-
:style => "display:none",
|
100
|
+
:style => "display: none",
|
101
101
|
:title => t("click_to_show_all")
|
102
102
|
})
|
103
|
-
filter_field << %(<label for="
|
103
|
+
filter_field << %(<label for="#{options[:id]}">#{t(:search)}</label>)
|
104
104
|
filter_field << '</div>'
|
105
105
|
filter_field.html_safe
|
106
106
|
end
|
@@ -541,8 +541,8 @@ module Alchemy
|
|
541
541
|
|
542
542
|
def render_hint_for(element)
|
543
543
|
return unless element.has_hint?
|
544
|
-
link_to '#', :class => '
|
545
|
-
render_icon(:hint) + content_tag(:span, element.hint, :class => 'bubble')
|
544
|
+
link_to '#', :class => 'hint' do
|
545
|
+
render_icon(:hint) + content_tag(:span, element.hint.html_safe, :class => 'bubble')
|
546
546
|
end
|
547
547
|
end
|
548
548
|
|
@@ -108,7 +108,7 @@ module Alchemy
|
|
108
108
|
# Renders the label and a remove link for a content.
|
109
109
|
def label_and_remove_link(content)
|
110
110
|
content_tag :label do
|
111
|
-
[render_content_name(content)
|
111
|
+
[render_hint_for(content), render_content_name(content), delete_content_link(content)].compact.join(' ').html_safe
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
@@ -44,7 +44,7 @@ module Alchemy
|
|
44
44
|
return ""
|
45
45
|
end
|
46
46
|
content = element.content_by_name(name)
|
47
|
-
|
47
|
+
render_essence_view(content, options, html_options)
|
48
48
|
end
|
49
49
|
|
50
50
|
# Renders the +Essence+ view partial from given +Element+ and +Essence+ type.
|
@@ -130,12 +130,11 @@ module Alchemy
|
|
130
130
|
#
|
131
131
|
# :image_size => "111x93" # Used by EssencePicture to render the image via RMagick to that size. [Default nil]
|
132
132
|
# :date_format => "Am %d. %m. %Y, um %H:%Mh" # Especially for EssenceDate. See Rubys Date.strftime for date formatting options. [Default nil]
|
133
|
-
# :show_caption =>
|
133
|
+
# :show_caption => false # Pass Boolean to show/hide the caption of an EssencePicture. [Default true]
|
134
|
+
# :disable_link => true # You can surpress the link of an EssencePicture. Default false
|
134
135
|
#
|
135
136
|
def render_essence_view(content, options = {}, html_options = {})
|
136
|
-
defaults = {
|
137
|
-
:show_caption => true
|
138
|
-
}
|
137
|
+
defaults = {:show_caption => true, :disable_link => false}
|
139
138
|
render_essence(content, :view, {:for_view => defaults.update(options)}, html_options)
|
140
139
|
end
|
141
140
|
|
@@ -151,6 +151,7 @@ module Alchemy
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
end
|
154
|
+
alias_method :definition, :description
|
154
155
|
|
155
156
|
# Gets the ingredient from essence
|
156
157
|
def ingredient
|
@@ -265,5 +266,51 @@ module Alchemy
|
|
265
266
|
end
|
266
267
|
end
|
267
268
|
|
269
|
+
# Returns the hint for this content
|
270
|
+
#
|
271
|
+
# To add a hint to a content pass +hint: true+ to the element definition in its element.yml
|
272
|
+
#
|
273
|
+
# Then the hint itself is placed in the locale yml files.
|
274
|
+
#
|
275
|
+
# Alternativly you can pass the hint itself to the hint key.
|
276
|
+
#
|
277
|
+
# == Locale Example:
|
278
|
+
#
|
279
|
+
# # elements.yml
|
280
|
+
# - name: headline
|
281
|
+
# contents:
|
282
|
+
# - name: headline
|
283
|
+
# type: EssenceText
|
284
|
+
# hint: true
|
285
|
+
#
|
286
|
+
# # config/locales/de.yml
|
287
|
+
# de:
|
288
|
+
# content_hints:
|
289
|
+
# headline: Lorem ipsum
|
290
|
+
#
|
291
|
+
# == Hint Key Example:
|
292
|
+
#
|
293
|
+
# - name: headline
|
294
|
+
# contents:
|
295
|
+
# - name: headline
|
296
|
+
# type: EssenceText
|
297
|
+
# hint: Lorem ipsum
|
298
|
+
#
|
299
|
+
# @return String
|
300
|
+
#
|
301
|
+
def hint
|
302
|
+
hint = definition['hint']
|
303
|
+
if hint == true
|
304
|
+
I18n.t(name, scope: :content_hints)
|
305
|
+
else
|
306
|
+
hint
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
# Returns true if the element has a hint
|
311
|
+
def has_hint?
|
312
|
+
hint.present?
|
313
|
+
end
|
314
|
+
|
268
315
|
end
|
269
316
|
end
|
data/app/models/alchemy/page.rb
CHANGED
@@ -561,7 +561,12 @@ module Alchemy
|
|
561
561
|
end
|
562
562
|
|
563
563
|
def cache_key(request = nil)
|
564
|
-
|
564
|
+
if timestamp = updated_at
|
565
|
+
timestamp = timestamp.utc.to_s(:number)
|
566
|
+
"alchemy/pages/#{id}-#{timestamp}"
|
567
|
+
else
|
568
|
+
"alchemy/pages/#{id}"
|
569
|
+
end
|
565
570
|
end
|
566
571
|
|
567
572
|
def taggable?
|
data/app/models/alchemy/site.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Alchemy
|
2
2
|
class Site < ActiveRecord::Base
|
3
|
-
|
4
|
-
|
5
|
-
attr_accessible :host, :name, :public
|
3
|
+
attr_accessible :host, :aliases, :name, :public, :redirect_to_primary_host
|
6
4
|
|
7
5
|
# validations
|
8
6
|
validates_presence_of :host
|
@@ -19,9 +17,32 @@ module Alchemy
|
|
19
17
|
end
|
20
18
|
|
21
19
|
class << self
|
20
|
+
def current=(v)
|
21
|
+
Thread.current[:alchemy_current_site] = v
|
22
|
+
end
|
23
|
+
|
24
|
+
def current
|
25
|
+
Thread.current[:alchemy_current_site]
|
26
|
+
end
|
27
|
+
|
22
28
|
def default
|
23
29
|
Site.first
|
24
30
|
end
|
31
|
+
|
32
|
+
def find_for_host(host)
|
33
|
+
# These are split up into two separate queries in order to run the
|
34
|
+
# fastest query first (selecting the domain by its primary host name).
|
35
|
+
#
|
36
|
+
where(host: host).first || find_in_aliases(host) || default
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_in_aliases(host)
|
40
|
+
return nil if host.blank?
|
41
|
+
|
42
|
+
all.find do |site|
|
43
|
+
site.aliases.split.include?(host) if site.aliases.present?
|
44
|
+
end
|
45
|
+
end
|
25
46
|
end
|
26
47
|
|
27
48
|
before_create do
|
@@ -1,9 +1,10 @@
|
|
1
1
|
<% p = params.dup %>
|
2
2
|
<h2><%= t("Filter by tag") %></h2>
|
3
|
+
<%#= js_filter_field :onkeyup => "Alchemy.ListFilter('#tag_list li')", :id => 'tag_list_filter' %>
|
3
4
|
<ul>
|
4
5
|
<% Alchemy::Picture.tag_counts.each do |t| %>
|
5
6
|
<% picture_tags = pictures_filtered_by_tag?(t) ? picture_tag_filter(:remove => t) : picture_tag_filter(:add => t) %>
|
6
|
-
<%= content_tag 'li', :class => p[:tagged_with].try(:split, ',').try(:include?, t.name) ? 'active' : nil do %>
|
7
|
+
<%= content_tag 'li', :name => t.name, :class => p[:tagged_with].try(:split, ',').try(:include?, t.name) ? 'active' : nil do %>
|
7
8
|
<%= link_to(
|
8
9
|
"#{t.name} (#{t.count})",
|
9
10
|
url_for(
|
@@ -17,7 +17,7 @@
|
|
17
17
|
</td>
|
18
18
|
<%- elsif attribute[:type] == :text -%>
|
19
19
|
<td class="label"><%= f.send :label, attribute[:name] %></td>
|
20
|
-
<td class="input"><%= f.send :text_area, attribute[:name] -%></td>
|
20
|
+
<td class="input"><%= f.send :text_area, attribute[:name], :rows => 4 -%></td>
|
21
21
|
<%- elsif attribute[:type] == :datetime -%>
|
22
22
|
<td class="label"><%= f.send :label, attribute[:name] %></td>
|
23
23
|
<td class="input"><%= f.send :text_field, attribute[:name], :type => :date -%></td>
|
@@ -1,8 +1,8 @@
|
|
1
|
-
<div class="content_editor
|
1
|
+
<div class="content_editor essence_html_editor"<%= " style=\"float: left;\"" if options[:css_class] == "text_short" %>>
|
2
2
|
<%= label_and_remove_link(content) %>
|
3
|
-
<%=
|
3
|
+
<%= text_area_tag(
|
4
4
|
content.form_field_name,
|
5
5
|
content.ingredient,
|
6
|
-
:class => 'thin_border
|
6
|
+
:class => 'thin_border'
|
7
7
|
) %>
|
8
|
-
</div>
|
8
|
+
</div>
|
@@ -1,6 +1,11 @@
|
|
1
1
|
<div id="<%= content_dom_id(content) %>" class="essence_picture_editor<%= ' dragable_picture' if options[:dragable] %><%= ' content_editor' unless options[:grouped] %>">
|
2
2
|
<% unless options[:grouped] %>
|
3
|
-
<label
|
3
|
+
<label>
|
4
|
+
<% if content.has_hint? %>
|
5
|
+
<%= render_hint_for(content) %>
|
6
|
+
<% end %>
|
7
|
+
<%= render_content_name(content) %>
|
8
|
+
</label>
|
4
9
|
<% end %>
|
5
10
|
<div class="picture_thumbnail">
|
6
11
|
<span class="picture_tool delete">
|
@@ -1,42 +1,39 @@
|
|
1
1
|
<% if content.essence.picture.present? %>
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
3
|
+
<% img_tag = image_tag(
|
4
|
+
show_alchemy_picture_url(content.essence.picture,
|
5
|
+
options.merge(
|
6
|
+
:size => options.delete(:image_size),
|
7
|
+
:crop_from => options[:crop] && !content.essence.crop_from.blank? ? content.essence.crop_from : nil,
|
8
|
+
:crop_size => options[:crop] && !content.essence.crop_size.blank? ? content.essence.crop_size : nil
|
9
|
+
).delete_if { |k,v| v.blank? || k.to_sym == :show_caption || k.to_sym == :disable_link }
|
10
|
+
),
|
11
|
+
{
|
12
|
+
:alt => (content.essence.alt_tag.blank? ? nil : content.essence.alt_tag),
|
13
|
+
:title => (content.essence.title.blank? ? nil : content.essence.title),
|
14
|
+
:class => (content.essence.css_class.blank? ? nil : content.essence.css_class)
|
15
|
+
}.merge(html_options)
|
16
|
+
) %>
|
17
|
+
|
18
|
+
<% if content.essence.caption.present? && options[:show_caption] %>
|
19
|
+
<% caption = content_tag(:figcaption, content.essence.caption, :id => "#{dom_id(content.essence.picture)}_caption", :class => "image_caption") %>
|
20
|
+
<figure>
|
21
|
+
<% end %>
|
19
22
|
|
20
23
|
<% if content.essence.link.blank? || options[:disable_link] %>
|
21
24
|
|
22
|
-
<%= img_tag %>
|
23
|
-
|
24
|
-
<% if options[:show_caption] && content.essence.caption.present? %>
|
25
|
-
|
26
|
-
<%= caption %>
|
27
|
-
|
28
|
-
<% end %>
|
25
|
+
<%= caption ? img_tag + caption : img_tag %>
|
29
26
|
|
30
27
|
<% else %>
|
31
28
|
|
32
|
-
<%= link_to(
|
33
|
-
content.essence.caption.blank? || options[:show_caption] == false ? img_tag : img_tag + caption,
|
34
|
-
url_for(content.essence.link),
|
29
|
+
<%= link_to(url_for(content.essence.link), {
|
35
30
|
:title => content.essence.link_title,
|
36
31
|
:target => (content.essence.link_target == "blank" ? "_blank" : nil),
|
37
32
|
'data-link-target' => content.essence.link_target
|
38
|
-
) %>
|
33
|
+
}) do %>
|
34
|
+
<%= caption ? img_tag + caption : img_tag %>
|
35
|
+
<% end %>
|
39
36
|
|
40
37
|
<% end %>
|
41
|
-
|
38
|
+
<% if caption %></figure><% end %>
|
42
39
|
<% end %>
|
@@ -562,7 +562,7 @@ de:
|
|
562
562
|
cancel_uploads: "Hochladen abbrechen"
|
563
563
|
tag_list: Tags
|
564
564
|
tags_get_created_if_used_the_first_time: 'Ein Tag wird automatisch erstellt, sobald Sie es das erste mal verwenden.'
|
565
|
-
this_picture_is_not_used_on_any_page: "Dieses Bild wird auf keiner
|
565
|
+
this_picture_is_not_used_on_any_page: "Dieses Bild wird auf keiner Seite benutzt."
|
566
566
|
this_picture_is_used_on_these_pages: "Dieses Bild wird auf folgenden Seiten benutzt"
|
567
567
|
title: "Titel"
|
568
568
|
"trash element": "Element in den Papierkorb legen"
|
@@ -930,8 +930,10 @@ de:
|
|
930
930
|
|
931
931
|
alchemy/site:
|
932
932
|
name: "Bezeichnung"
|
933
|
-
host: "
|
933
|
+
host: "primäre Domain"
|
934
934
|
public: "veröffentlicht"
|
935
|
+
aliases: "Domain-Aliases"
|
936
|
+
redirect_to_primary_host: "Auf primäre Domain weiterleiten"
|
935
937
|
|
936
938
|
errors:
|
937
939
|
<<: *errors
|
data/lib/alchemy/version.rb
CHANGED
@@ -1,64 +1,84 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
# Here's a tiny custom matcher making it a bit easier to check the
|
4
|
+
# current session for a language configuration.
|
5
|
+
#
|
6
|
+
RSpec::Matchers.define :include_language_information_for do |expected|
|
7
|
+
match do |actual|
|
8
|
+
actual[:language_id] == expected.id && actual[:language_code] == expected.code
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
3
12
|
module Alchemy
|
4
13
|
describe BaseController do
|
5
14
|
|
6
15
|
let(:default_language) { Language.get_default }
|
7
16
|
let(:klingonian) { FactoryGirl.create(:klingonian) }
|
8
17
|
|
9
|
-
describe "#
|
18
|
+
describe "#set_language" do
|
10
19
|
|
11
|
-
|
12
|
-
|
13
|
-
|
20
|
+
context "with a Language argument" do
|
21
|
+
it "should set the language to the passed Language instance" do
|
22
|
+
controller.send :set_language, klingonian
|
23
|
+
assigns(:language).should == klingonian
|
24
|
+
end
|
14
25
|
end
|
15
26
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
27
|
+
context "with a language id argument" do
|
28
|
+
it "should set the language to the language specified by the passed id" do
|
29
|
+
controller.send :set_language, klingonian.id
|
30
|
+
assigns(:language).should == klingonian
|
31
|
+
end
|
20
32
|
end
|
21
33
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
34
|
+
context "with a language code argument" do
|
35
|
+
it "should set the language to the language specified by the passed code" do
|
36
|
+
controller.send :set_language, klingonian.code
|
37
|
+
assigns(:language).should == klingonian
|
38
|
+
end
|
26
39
|
end
|
27
40
|
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "#set_language" do
|
31
|
-
|
32
41
|
context "with no lang param" do
|
33
42
|
|
34
43
|
it "should set the default language" do
|
35
44
|
controller.stub!(:params).and_return({})
|
36
45
|
controller.send :set_language
|
37
|
-
|
38
|
-
controller.session
|
46
|
+
assigns(:language).should == default_language
|
47
|
+
controller.session.should include_language_information_for(default_language)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with language set in the session" do
|
53
|
+
before do
|
54
|
+
controller.stub!(:session).and_return(language_id: klingonian.id, language_code: klingonian.code)
|
39
55
|
end
|
40
56
|
|
57
|
+
it "should use the language set in the session cookie" do
|
58
|
+
controller.send :set_language
|
59
|
+
assigns(:language).should == klingonian
|
60
|
+
end
|
41
61
|
end
|
42
62
|
|
43
63
|
context "with lang param" do
|
44
64
|
|
45
65
|
it "should set the language" do
|
46
|
-
controller.stub!(:params).and_return(
|
66
|
+
controller.stub!(:params).and_return(:lang => klingonian.code)
|
47
67
|
controller.send :set_language
|
48
|
-
|
49
|
-
controller.session
|
68
|
+
assigns(:language).should == klingonian
|
69
|
+
controller.session.should include_language_information_for(klingonian)
|
50
70
|
end
|
51
71
|
|
52
72
|
context "for language that does not exist" do
|
53
73
|
|
54
74
|
before do
|
55
|
-
controller.stub!(:params).and_return(
|
75
|
+
controller.stub!(:params).and_return(:lang => 'fo')
|
56
76
|
controller.send :set_language
|
57
77
|
end
|
58
78
|
|
59
79
|
it "should set the language to default" do
|
60
|
-
|
61
|
-
controller.session
|
80
|
+
assigns(:language).should == default_language
|
81
|
+
controller.session.should include_language_information_for(default_language)
|
62
82
|
end
|
63
83
|
|
64
84
|
it "should set the rails locale to default language code" do
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended to check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:version =>
|
14
|
+
ActiveRecord::Schema.define(:version => 20121220102223) do
|
15
15
|
|
16
16
|
create_table "alchemy_attachments", :force => true do |t|
|
17
17
|
t.string "name"
|
@@ -246,9 +246,11 @@ ActiveRecord::Schema.define(:version => 20121211163003) do
|
|
246
246
|
create_table "alchemy_sites", :force => true do |t|
|
247
247
|
t.string "host"
|
248
248
|
t.string "name"
|
249
|
-
t.datetime "created_at",
|
250
|
-
t.datetime "updated_at",
|
251
|
-
t.boolean "public",
|
249
|
+
t.datetime "created_at", :null => false
|
250
|
+
t.datetime "updated_at", :null => false
|
251
|
+
t.boolean "public", :default => false
|
252
|
+
t.text "aliases"
|
253
|
+
t.boolean "redirect_to_primary_host"
|
252
254
|
end
|
253
255
|
|
254
256
|
add_index "alchemy_sites", ["host", "public"], :name => "alchemy_sites_public_hosts_idx"
|
data/spec/models/site_spec.rb
CHANGED
@@ -8,7 +8,7 @@ module Alchemy
|
|
8
8
|
describe 'new instances' do
|
9
9
|
subject { FactoryGirl.build(:site) }
|
10
10
|
|
11
|
-
it 'should start out with
|
11
|
+
it 'should start out with no languages' do
|
12
12
|
subject.languages.should be_empty
|
13
13
|
end
|
14
14
|
|
@@ -35,6 +35,46 @@ module Alchemy
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
describe '.find_for_host' do
|
39
|
+
# No need to create a default site, as it has already been added through the seeds.
|
40
|
+
# But let's add some more:
|
41
|
+
#
|
42
|
+
let(:default_site) { Site.default }
|
43
|
+
let!(:magiclabs_site) { FactoryGirl.create(:site, host: 'www.magiclabs.de', aliases: 'magiclabs.de magiclabs.com www.magiclabs.com') }
|
44
|
+
|
45
|
+
subject { Site.find_for_host(host) }
|
46
|
+
|
47
|
+
context "when the request doesn't match anything" do
|
48
|
+
let(:host) { 'oogabooga.com' }
|
49
|
+
it { should == default_site }
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when the request matches a site's host field" do
|
53
|
+
let(:host) { 'www.magiclabs.de' }
|
54
|
+
it { should == magiclabs_site }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "when the request matches one of the site's aliases" do
|
58
|
+
let(:host) { 'magiclabs.com' }
|
59
|
+
it { should == magiclabs_site }
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when the request matches the site's first alias" do
|
63
|
+
let(:host) { 'magiclabs.de' }
|
64
|
+
it { should == magiclabs_site }
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when the request matches the site's last alias" do
|
68
|
+
let(:host) { 'www.magiclabs.com' }
|
69
|
+
it { should == magiclabs_site }
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when the request host matches only part of a site's aliases" do
|
73
|
+
let(:host) { 'labs.com' }
|
74
|
+
it { should == default_site }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
38
78
|
describe '.current' do
|
39
79
|
context 'when set to a site' do
|
40
80
|
before { Site.current = site }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.0.
|
4
|
+
version: 2.5.0.b5
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2012-12-
|
16
|
+
date: 2012-12-20 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: rails
|
@@ -769,6 +769,7 @@ files:
|
|
769
769
|
- db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb
|
770
770
|
- db/migrate/20121205155004_create_alchemy_sites.rb
|
771
771
|
- db/migrate/20121211163003_add_public_to_alchemy_sites.rb
|
772
|
+
- db/migrate/20121220102223_add_aliases_to_site.rb
|
772
773
|
- lib/alchemy/auth_engine.rb
|
773
774
|
- lib/alchemy/authentication_helpers.rb
|
774
775
|
- lib/alchemy/capistrano.rb
|
@@ -878,6 +879,7 @@ files:
|
|
878
879
|
- spec/dummy/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb
|
879
880
|
- spec/dummy/db/migrate/20121205155004_create_alchemy_sites.rb
|
880
881
|
- spec/dummy/db/migrate/20121211163003_add_public_to_alchemy_sites.rb
|
882
|
+
- spec/dummy/db/migrate/20121220102223_add_aliases_to_site.rb
|
881
883
|
- spec/dummy/db/schema.rb
|
882
884
|
- spec/dummy/lib/assets/.gitkeep
|
883
885
|
- spec/dummy/public/404.html
|
@@ -1132,6 +1134,7 @@ test_files:
|
|
1132
1134
|
- spec/dummy/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb
|
1133
1135
|
- spec/dummy/db/migrate/20121205155004_create_alchemy_sites.rb
|
1134
1136
|
- spec/dummy/db/migrate/20121211163003_add_public_to_alchemy_sites.rb
|
1137
|
+
- spec/dummy/db/migrate/20121220102223_add_aliases_to_site.rb
|
1135
1138
|
- spec/dummy/db/schema.rb
|
1136
1139
|
- spec/dummy/lib/assets/.gitkeep
|
1137
1140
|
- spec/dummy/public/404.html
|