alchemy_cms 4.4.0 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of alchemy_cms might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +22 -14
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +27 -15
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +4 -0
- data/app/assets/stylesheets/alchemy/elements.scss +21 -31
- data/app/helpers/alchemy/admin/elements_helper.rb +3 -7
- data/app/models/alchemy/page.rb +3 -3
- data/app/views/alchemy/admin/elements/_element.html.erb +31 -32
- data/app/views/alchemy/admin/elements/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -1
- data/lib/alchemy/auth_accessors.rb +10 -5
- data/lib/alchemy/upgrader/four_point_four.rb +52 -0
- data/lib/alchemy/upgrader/tasks/element_views_updater.rb +34 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/tasks/alchemy/tidy.rake +27 -0
- data/lib/tasks/alchemy/upgrade.rake +32 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfa2cfba392b4282fab17dcd0baf419c2ad6204a4a62eb542fa589a5047cc518
|
4
|
+
data.tar.gz: bc7456380f3bb098ea641066c58afaf2d7d38afea8d7278dcbbdee7c66d10cdb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67f12a17d5b5a483d2054934f2dbc4808748dfa0a437ebb93048fcbecd6af35dc76c657198d0072728afeb7b5c87df84cdec2c1ba1dc48b2056c999251003741
|
7
|
+
data.tar.gz: 77760e2ffc8287532502ad93e55e738fcaddf67e09d4f7ffbf7405648e0d265be8f6dc1ad29a90ec40361a8cdceec17033a436e405f14b923422cf5d3a5f3066
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 5.0.0 (unreleased)
|
2
|
+
|
3
|
+
## 4.4.1 (2020-01-08)
|
4
|
+
|
5
|
+
- Fix updating page preview after element create/save [#1710](https://github.com/AlchemyCMS/alchemy_cms/pull/1710) ([tvdeyen](https://github.com/tvdeyen))
|
6
|
+
- Element editor layout changes [#1709](https://github.com/AlchemyCMS/alchemy_cms/pull/1709) ([tvdeyen](https://github.com/tvdeyen))
|
7
|
+
- Add Alchemy.user_class_primary_key setting [#1708](https://github.com/AlchemyCMS/alchemy_cms/pull/1708) ([tvdeyen](https://github.com/tvdeyen))
|
8
|
+
- Add Element views upgrade tasks [#1707](https://github.com/AlchemyCMS/alchemy_cms/pull/1707) ([tvdeyen](https://github.com/tvdeyen))
|
9
|
+
- Use postMessage to send messages between preview and element windows [#1704](https://github.com/AlchemyCMS/alchemy_cms/pull/1704) ([tvdeyen](https://github.com/tvdeyen))
|
10
|
+
|
1
11
|
## 4.4.0 (2020-01-06)
|
2
12
|
|
3
13
|
- Use contents settings for size in EssencePicture#picture_url [#1703](https://github.com/AlchemyCMS/alchemy_cms/pull/1703) ([tvdeyen](https://github.com/tvdeyen))
|
@@ -36,20 +36,21 @@ Alchemy.ElementEditors =
|
|
36
36
|
# Binds the custom SaveElement event
|
37
37
|
@element_area.on "SaveElement.Alchemy", '.element-editor', (e, data) =>
|
38
38
|
@onSaveElement(e, data)
|
39
|
+
# Listen to postMessage messages from the preview frame
|
40
|
+
window.addEventListener 'message', (e) =>
|
41
|
+
if e.origin == window.location.origin
|
42
|
+
@onMessage(e.data)
|
43
|
+
else
|
44
|
+
console.warn 'Unsafe message origin!', e.origin
|
45
|
+
true
|
39
46
|
return
|
40
47
|
|
41
48
|
# Selects and scrolls to element with given id in the preview window.
|
42
49
|
#
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
.querySelectorAll('[data-alchemy-element]')
|
48
|
-
previewElement = Array.from(previewElements).find (element) ->
|
49
|
-
element.getAttribute('data-alchemy-element') == element_id
|
50
|
-
if previewElement
|
51
|
-
event = new Event('SelectPreviewElement.Alchemy')
|
52
|
-
previewElement.dispatchEvent(event)
|
50
|
+
focusElementPreview: (element_id) ->
|
51
|
+
Alchemy.PreviewWindow.postMessage
|
52
|
+
message: 'Alchemy.focusElement'
|
53
|
+
element_id: element_id
|
53
54
|
return
|
54
55
|
|
55
56
|
# Selects element
|
@@ -60,6 +61,7 @@ Alchemy.ElementEditors =
|
|
60
61
|
# Used by the elements on click events in the preview frame.
|
61
62
|
focusElement: ($element) ->
|
62
63
|
element_id = $element.attr('id').replace(/\D/g, "")
|
64
|
+
Alchemy.ElementsWindow.show()
|
63
65
|
@selectTabForElement($element)
|
64
66
|
# If we have folded parents we need to unfold each of them
|
65
67
|
# and then finally scroll to or unfold ourself
|
@@ -173,25 +175,31 @@ Alchemy.ElementEditors =
|
|
173
175
|
|
174
176
|
# Event handlers
|
175
177
|
|
178
|
+
onMessage: (data) ->
|
179
|
+
if data.message == 'Alchemy.focusElementEditor'
|
180
|
+
$element = $("#element_#{data.element_id}")
|
181
|
+
Alchemy.ElementEditors.focusElement($element)
|
182
|
+
else
|
183
|
+
console.warn 'Unknown message received!', data
|
184
|
+
|
176
185
|
onClickBody: (e) ->
|
177
|
-
frameWindow = $('#alchemy_preview_window')[0].contentWindow
|
178
186
|
element = $(e.target).parents('.element-editor')[0]
|
179
187
|
$('#element_area .element-editor').not(element).removeClass('selected')
|
180
188
|
unless element
|
181
|
-
|
189
|
+
Alchemy.PreviewWindow.postMessage(message: 'Alchemy.blurElements')
|
182
190
|
return
|
183
191
|
|
184
192
|
# Click event handler for element body.
|
185
193
|
#
|
186
194
|
# - Focuses the element
|
187
|
-
# -
|
195
|
+
# - Sends 'Alchemy.focusElement' message to preview frame.
|
188
196
|
#
|
189
197
|
onClickElement: (e) ->
|
190
198
|
$target = $(e.target)
|
191
199
|
$element = $target.closest(".element-editor")
|
192
200
|
element_id = $element.attr("id").replace(/\D/g, "")
|
193
201
|
@selectElement($element)
|
194
|
-
@
|
202
|
+
@focusElementPreview(element_id)
|
195
203
|
return
|
196
204
|
|
197
205
|
# Double click event handler for element head.
|
@@ -21,11 +21,16 @@ Alchemy.initAlchemyPreviewMode = ->
|
|
21
21
|
"outline-offset": "4px"
|
22
22
|
|
23
23
|
init: ->
|
24
|
-
window.addEventListener "message", (
|
25
|
-
if
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
window.addEventListener "message", (event) =>
|
25
|
+
if event.origin != window.location.origin
|
26
|
+
console.warn 'Unsafe message origin!', event.origin
|
27
|
+
return
|
28
|
+
switch event.data.message
|
29
|
+
when "Alchemy.blurElements" then @blurElements()
|
30
|
+
when "Alchemy.focusElement" then @focusElement(event.data)
|
31
|
+
else console.info("Received unknown message!", event.data)
|
32
|
+
return
|
33
|
+
@elements = Array.from document.querySelectorAll("[data-alchemy-element]")
|
29
34
|
@elements.forEach (element) =>
|
30
35
|
element.addEventListener 'mouseover', =>
|
31
36
|
unless element.classList.contains('selected')
|
@@ -35,10 +40,6 @@ Alchemy.initAlchemyPreviewMode = ->
|
|
35
40
|
unless element.classList.contains('selected')
|
36
41
|
Object.assign element.style, @getStyle('reset')
|
37
42
|
return
|
38
|
-
element.addEventListener 'SelectPreviewElement.Alchemy', =>
|
39
|
-
@selectElement(element)
|
40
|
-
return
|
41
|
-
, false
|
42
43
|
element.addEventListener 'click', (e) =>
|
43
44
|
e.stopPropagation()
|
44
45
|
e.preventDefault()
|
@@ -66,14 +67,25 @@ Alchemy.initAlchemyPreviewMode = ->
|
|
66
67
|
return
|
67
68
|
return
|
68
69
|
|
70
|
+
# Focus the element in the Alchemy preview window.
|
71
|
+
focusElement: (data) ->
|
72
|
+
element = @getElement(data.element_id)
|
73
|
+
if element
|
74
|
+
@selectElement(element)
|
75
|
+
else
|
76
|
+
console.warn('Could not focus element with id', data.element_id)
|
77
|
+
|
78
|
+
getElement: (element_id) ->
|
79
|
+
@elements.find (element) ->
|
80
|
+
element.dataset.alchemyElement == element_id.toString()
|
81
|
+
|
69
82
|
# Focus the element editor in the Alchemy element window.
|
70
83
|
focusElementEditor: (element) ->
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
elements_window.show() if elements_window.hidden
|
84
|
+
element_id = element.getAttribute('data-alchemy-element')
|
85
|
+
window.parent.postMessage
|
86
|
+
message: 'Alchemy.focusElementEditor'
|
87
|
+
element_id: element_id
|
88
|
+
, window.location.origin
|
77
89
|
return
|
78
90
|
|
79
91
|
getStyle: (state) ->
|
@@ -32,6 +32,10 @@ Alchemy.PreviewWindow =
|
|
32
32
|
$iframe.attr 'src', $iframe.attr('src')
|
33
33
|
true
|
34
34
|
|
35
|
+
postMessage: (data) ->
|
36
|
+
frameWindow = @currentWindow[0].contentWindow
|
37
|
+
frameWindow.postMessage(data, window.location.origin)
|
38
|
+
|
35
39
|
_showSpinner: ->
|
36
40
|
@reload = $('#reload_preview_button')
|
37
41
|
@spinner = new Alchemy.Spinner('small')
|
@@ -155,6 +155,22 @@
|
|
155
155
|
}
|
156
156
|
}
|
157
157
|
|
158
|
+
&.expanded {
|
159
|
+
&.not-fixed {
|
160
|
+
.nestable-elements {
|
161
|
+
box-shadow: inset 0 4px 8px -2px darken($medium-gray, 15%);
|
162
|
+
background-color: $medium-gray;
|
163
|
+
padding: 8px 4px 4px;
|
164
|
+
|
165
|
+
.add-nestable-element-button {
|
166
|
+
width: calc(50% - 8px);
|
167
|
+
margin: 4px;
|
168
|
+
text-align: center;
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
158
174
|
&.dragged {
|
159
175
|
border-style: dotted;
|
160
176
|
overflow: hidden;
|
@@ -165,15 +181,6 @@
|
|
165
181
|
}
|
166
182
|
}
|
167
183
|
|
168
|
-
&.with-contents,
|
169
|
-
&.without-contents.not-nestable {
|
170
|
-
|
171
|
-
.element-content {
|
172
|
-
padding: 2*$default-padding 2*$default-padding 0;
|
173
|
-
border-top: 1px solid $medium-gray;
|
174
|
-
}
|
175
|
-
}
|
176
|
-
|
177
184
|
&.compact {
|
178
185
|
.element-toolbar {
|
179
186
|
visibility: hidden;
|
@@ -194,7 +201,6 @@
|
|
194
201
|
}
|
195
202
|
|
196
203
|
.element-footer {
|
197
|
-
margin-top: 0;
|
198
204
|
padding-top: 0;
|
199
205
|
border-top: 0;
|
200
206
|
|
@@ -223,7 +229,7 @@
|
|
223
229
|
}
|
224
230
|
|
225
231
|
.element-content {
|
226
|
-
|
232
|
+
margin: 4px 8px;
|
227
233
|
}
|
228
234
|
|
229
235
|
.button_with_label {
|
@@ -253,8 +259,8 @@
|
|
253
259
|
}
|
254
260
|
}
|
255
261
|
|
256
|
-
|
257
|
-
margin:
|
262
|
+
.element-content {
|
263
|
+
margin: 2*$default-padding;
|
258
264
|
}
|
259
265
|
|
260
266
|
.validation_notice {
|
@@ -266,8 +272,7 @@
|
|
266
272
|
}
|
267
273
|
|
268
274
|
.message {
|
269
|
-
|
270
|
-
margin: 2*$default-margin 0;
|
275
|
+
margin: 2*$default-margin;
|
271
276
|
}
|
272
277
|
|
273
278
|
.foot_note {
|
@@ -332,6 +337,7 @@
|
|
332
337
|
.element-toolbar {
|
333
338
|
padding: $default-padding 0;
|
334
339
|
height: $element-toolbar-height;
|
340
|
+
border-bottom: 1px solid $medium-gray;
|
335
341
|
|
336
342
|
.element_tools {
|
337
343
|
float: left;
|
@@ -341,7 +347,6 @@
|
|
341
347
|
|
342
348
|
.element-footer {
|
343
349
|
border-top: 1px solid $medium-gray;
|
344
|
-
margin: 8px 0 0 0;
|
345
350
|
padding: 2*$default-padding;
|
346
351
|
text-align: right;
|
347
352
|
|
@@ -762,21 +767,6 @@ textarea.has_tinymce {
|
|
762
767
|
top: -1px;
|
763
768
|
}
|
764
769
|
|
765
|
-
.not-fixed .nestable-elements {
|
766
|
-
box-shadow: inset 0 4px 8px -2px darken($medium-gray, 15%);
|
767
|
-
background-color: $medium-gray;
|
768
|
-
|
769
|
-
.expanded.element-editor>& {
|
770
|
-
padding: 8px 4px 4px;
|
771
|
-
}
|
772
|
-
|
773
|
-
.add-nestable-element-button {
|
774
|
-
width: calc(50% - 8px);
|
775
|
-
margin: 4px;
|
776
|
-
text-align: center;
|
777
|
-
}
|
778
|
-
}
|
779
|
-
|
780
770
|
.is-fixed {
|
781
771
|
&.with-contents {
|
782
772
|
>.element-footer {
|
@@ -101,14 +101,10 @@ module Alchemy
|
|
101
101
|
].join(' ')
|
102
102
|
end
|
103
103
|
|
104
|
-
# Tells us, if we should show the element footer.
|
105
|
-
def
|
104
|
+
# Tells us, if we should show the element footer and form inputs.
|
105
|
+
def element_editable?(element)
|
106
106
|
return false if element.folded?
|
107
|
-
|
108
|
-
element.content_definitions.present? || element.taggable?
|
109
|
-
else
|
110
|
-
element.nestable_elements.empty?
|
111
|
-
end
|
107
|
+
element.content_definitions.present? || element.taggable?
|
112
108
|
end
|
113
109
|
end
|
114
110
|
end
|
data/app/models/alchemy/page.rb
CHANGED
@@ -90,19 +90,19 @@ module Alchemy
|
|
90
90
|
belongs_to :language, optional: true
|
91
91
|
|
92
92
|
belongs_to :creator,
|
93
|
-
primary_key: Alchemy.
|
93
|
+
primary_key: Alchemy.user_class_primary_key,
|
94
94
|
class_name: Alchemy.user_class_name,
|
95
95
|
foreign_key: :creator_id,
|
96
96
|
optional: true
|
97
97
|
|
98
98
|
belongs_to :updater,
|
99
|
-
primary_key: Alchemy.
|
99
|
+
primary_key: Alchemy.user_class_primary_key,
|
100
100
|
class_name: Alchemy.user_class_name,
|
101
101
|
foreign_key: :updater_id,
|
102
102
|
optional: true
|
103
103
|
|
104
104
|
belongs_to :locker,
|
105
|
-
primary_key: Alchemy.
|
105
|
+
primary_key: Alchemy.user_class_primary_key,
|
106
106
|
class_name: Alchemy.user_class_name,
|
107
107
|
foreign_key: :locked_by,
|
108
108
|
optional: true
|
@@ -10,44 +10,47 @@
|
|
10
10
|
<% if element.expanded? || element.fixed? %>
|
11
11
|
<%= render 'alchemy/admin/elements/element_toolbar', element: element %>
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
<% element.definition[:message].tap do |message| %>
|
14
|
+
<%= render_message(:info, sanitize(message)) if message %>
|
15
|
+
<% end %>
|
15
16
|
|
16
|
-
|
17
|
+
<% element.definition[:warning].tap do |warning| %>
|
18
|
+
<%= render_message(:warning, sanitize(warning)) if warning %>
|
19
|
+
<% end %>
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
21
|
+
<% if element_editable?(element) %>
|
22
|
+
<%= form_for [alchemy, :admin, element], remote: true,
|
23
|
+
html: {id: "element_#{element.id}_form".html_safe, class: 'element-content'} do |f| %>
|
24
|
+
|
25
|
+
<div id="element_<%= element.id %>_errors" class="element_errors"></div>
|
26
|
+
|
27
|
+
<div id="element_<%= element.id %>_content" class="element-content-editors">
|
28
|
+
<% if lookup_context.exists?("#{element.name}_editor", ["alchemy/elements"], true) %>
|
29
|
+
<%= render_editor(element) %>
|
30
|
+
<% else %>
|
31
|
+
<%= element_editor_for(element) do %>
|
32
|
+
<% element.contents.each do |content| %>
|
33
|
+
<%= render "alchemy/essences/#{content.essence_partial_name}_editor", {
|
34
|
+
content: content
|
35
|
+
} %>
|
36
|
+
<% end %>
|
33
37
|
<% end %>
|
34
38
|
<% end %>
|
35
|
-
<% end %>
|
36
|
-
</div>
|
37
|
-
|
38
|
-
<% if element.taggable? %>
|
39
|
-
<div class="autocomplete_tag_list">
|
40
|
-
<%= f.label :tag_list %>
|
41
|
-
<%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
|
42
39
|
</div>
|
40
|
+
|
41
|
+
<% if element.taggable? %>
|
42
|
+
<div class="autocomplete_tag_list">
|
43
|
+
<%= f.label :tag_list %>
|
44
|
+
<%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
|
45
|
+
</div>
|
46
|
+
<% end %>
|
43
47
|
<% end %>
|
48
|
+
|
49
|
+
<%= render 'alchemy/admin/elements/element_footer', element: element %>
|
44
50
|
<% end %>
|
45
51
|
<% end %>
|
46
52
|
|
47
53
|
<% if element.nestable_elements.any? %>
|
48
|
-
<% if show_element_footer?(element, :with_nestable_elements) %>
|
49
|
-
<%= render 'alchemy/admin/elements/element_footer', element: element %>
|
50
|
-
<% end %>
|
51
54
|
<div class="nestable-elements">
|
52
55
|
<%= content_tag :div,
|
53
56
|
class: "nested-elements", data: {
|
@@ -82,8 +85,4 @@
|
|
82
85
|
<% end %>
|
83
86
|
</div>
|
84
87
|
<% end %>
|
85
|
-
|
86
|
-
<% if show_element_footer?(element) %>
|
87
|
-
<%= render 'alchemy/admin/elements/element_footer', element: element %>
|
88
|
-
<% end %>
|
89
88
|
<% end %>
|
@@ -36,7 +36,7 @@
|
|
36
36
|
Alchemy.closeCurrentDialog();
|
37
37
|
Alchemy.Tinymce.init(<%= @element.richtext_contents_ids.to_json %>);
|
38
38
|
Alchemy.PreviewWindow.refresh(function() {
|
39
|
-
Alchemy.ElementEditors.
|
39
|
+
Alchemy.ElementEditors.focusElementPreview(<%= @element.id %>);
|
40
40
|
});
|
41
41
|
|
42
42
|
$el = $('#element_<%= @element.id %>');
|
@@ -9,7 +9,7 @@
|
|
9
9
|
$el.trigger('SaveElement.Alchemy', {previewText: '<%= j sanitize(@element.preview_text) %>'});
|
10
10
|
Alchemy.growl('<%= Alchemy.t(:element_saved) %>');
|
11
11
|
Alchemy.PreviewWindow.refresh(function() {
|
12
|
-
Alchemy.ElementEditors.
|
12
|
+
Alchemy.ElementEditors.focusElementPreview(<%= @element.id %>);
|
13
13
|
});
|
14
14
|
|
15
15
|
<%- else -%>
|
@@ -5,6 +5,7 @@
|
|
5
5
|
# Alchemy has some defaults for user model name and login logout path names:
|
6
6
|
#
|
7
7
|
# +Alchemy.user_class_name+ defaults to +'User'+
|
8
|
+
# +Alchemy.user_class_primary_key+ defaults to +:id+
|
8
9
|
# +Alchemy.current_user_method defaults to +'current_user'+
|
9
10
|
# +Alchemy.signup_path defaults to +'/signup'+
|
10
11
|
# +Alchemy.login_path defaults to +'/login'+
|
@@ -14,17 +15,19 @@
|
|
14
15
|
# Anyway, you can tell Alchemy about your authentication model configuration:
|
15
16
|
#
|
16
17
|
# 1. Your user class name - @see: Alchemy.user_class
|
17
|
-
# 2.
|
18
|
+
# 2. Your users table primary key - @see: Alchemy.user_class_primary_key
|
19
|
+
# 3. A method on your ApplicationController to get current user -
|
18
20
|
# @see: Alchemy.current_user_method
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
21
|
+
# 4. The path to the signup form - @see: Alchemy.signup_path
|
22
|
+
# 5. The path to the login form - @see: Alchemy.login_path
|
23
|
+
# 6. The path to the logout method - @see: Alchemy.logout_path
|
24
|
+
# 7. The http verb for the logout method - @see: Alchemy.logout_method
|
23
25
|
#
|
24
26
|
# == Example
|
25
27
|
#
|
26
28
|
# # config/initializers/alchemy.rb
|
27
29
|
# Alchemy.user_class_name = 'Admin'
|
30
|
+
# Alchemy.user_class_primary_key = :user_id
|
28
31
|
# Alchemy.current_user_method = 'current_admin'
|
29
32
|
# Alchemy.signup_path = '/auth/signup'
|
30
33
|
# Alchemy.login_path = '/auth/login'
|
@@ -42,6 +45,7 @@
|
|
42
45
|
#
|
43
46
|
module Alchemy
|
44
47
|
mattr_accessor :user_class_name,
|
48
|
+
:user_class_primary_key,
|
45
49
|
:current_user_method,
|
46
50
|
:signup_path,
|
47
51
|
:login_path,
|
@@ -51,6 +55,7 @@ module Alchemy
|
|
51
55
|
# Defaults
|
52
56
|
#
|
53
57
|
@@user_class_name = 'User'
|
58
|
+
@@user_class_primary_key = :id
|
54
59
|
@@current_user_method = 'current_user'
|
55
60
|
@@signup_path = '/signup'
|
56
61
|
@@login_path = '/login'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'tasks/element_views_updater'
|
4
|
+
|
5
|
+
module Alchemy
|
6
|
+
class Upgrader::FourPointFour < Upgrader
|
7
|
+
class << self
|
8
|
+
def rename_element_views
|
9
|
+
desc "Remove '_view' suffix from element views."
|
10
|
+
Alchemy::Upgrader::Tasks::ElementViewsUpdater.new.rename_element_views
|
11
|
+
end
|
12
|
+
|
13
|
+
def update_local_variable
|
14
|
+
desc 'Update element views local variable to element name.'
|
15
|
+
Alchemy::Upgrader::Tasks::ElementViewsUpdater.new.update_local_variable
|
16
|
+
end
|
17
|
+
|
18
|
+
def alchemy_4_4_todos
|
19
|
+
notice = <<-NOTE.strip_heredoc
|
20
|
+
|
21
|
+
ℹ️ Element editor partials are deprecated
|
22
|
+
-----------------------------------------
|
23
|
+
|
24
|
+
The element editor partials are not needed anymore. They still work, but in order to
|
25
|
+
prepare the Alchemy 5 upgrade your should consider removing them now.
|
26
|
+
|
27
|
+
In order to update check if you have any messages in your editor partials and move them
|
28
|
+
to either a `warning` or `message` in your element definition.
|
29
|
+
|
30
|
+
Also check if you pass any values to EssenceSelects `select_values`. Move static values
|
31
|
+
to the `settings` of your content definition and either use EssencePage for referencing
|
32
|
+
pages or create a custom essence for other dynamic values.
|
33
|
+
|
34
|
+
|
35
|
+
ℹ️ The `_view` suffix of Element view partials is deprecated
|
36
|
+
-----------------------------------------------------------
|
37
|
+
|
38
|
+
The element view partials do not need the `_view` suffix anymore. Your files have been
|
39
|
+
renamed.
|
40
|
+
|
41
|
+
The local variable in your element views has been replaced by a variable named after the
|
42
|
+
element itself. A "article" element has a "_article.html.erb" partial and therefore
|
43
|
+
a `article` local variable now.
|
44
|
+
|
45
|
+
The former `element` variable is still present, though.
|
46
|
+
|
47
|
+
NOTE
|
48
|
+
todo notice, 'Alchemy v4.4 TODO'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'alchemy/upgrader'
|
4
|
+
|
5
|
+
module Alchemy::Upgrader::Tasks
|
6
|
+
class ElementViewsUpdater < Thor
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
no_tasks do
|
10
|
+
def rename_element_views
|
11
|
+
puts "-- Removing '_view' suffix from element views"
|
12
|
+
|
13
|
+
Dir.glob("#{elements_view_folder}/*_view.*").each do |file|
|
14
|
+
FileUtils.mv(file, file.to_s.sub(/_view/, ''))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def update_local_variable
|
19
|
+
puts "-- Updating element views local variable to element name"
|
20
|
+
|
21
|
+
Alchemy::Element.definitions.map { |e| e['name'] }.each do |name|
|
22
|
+
view = Dir.glob("#{elements_view_folder}/_#{name}.*").last
|
23
|
+
gsub_file(view, /\b#{name}_view\b/, name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def elements_view_folder
|
31
|
+
Rails.root.join('app', 'views', 'alchemy', 'elements')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/alchemy/version.rb
CHANGED
data/lib/tasks/alchemy/tidy.rake
CHANGED
@@ -34,5 +34,32 @@ namespace :alchemy do
|
|
34
34
|
task remove_orphaned_contents: [:environment] do
|
35
35
|
Alchemy::Tidy.remove_orphaned_contents
|
36
36
|
end
|
37
|
+
|
38
|
+
desc "List Alchemy elements usage"
|
39
|
+
task elements_usage: :environment do
|
40
|
+
puts "\n"
|
41
|
+
removable_elements = []
|
42
|
+
names = Alchemy::Element.definitions.map { |e| e['name'] }
|
43
|
+
longest_name = names.max_by { |name| name.to_s.length }.length + 1
|
44
|
+
names.sort.each do |name|
|
45
|
+
names = Alchemy::Element.where(name: name)
|
46
|
+
count = names.count
|
47
|
+
page_count = Alchemy::Page.where(id: names.pluck(:page_id)).published.count
|
48
|
+
if count.zero?
|
49
|
+
removable_elements.push(name)
|
50
|
+
else
|
51
|
+
spacer = ' ' * (longest_name - name.length)
|
52
|
+
puts "#{name}#{spacer}is used\t#{count}\ttime(s) on\t#{page_count}\tpublic page(s)"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
if removable_elements.many?
|
56
|
+
puts "\n"
|
57
|
+
puts "These elements can probably be removed. They are not used anywhere:"
|
58
|
+
puts "\n"
|
59
|
+
removable_elements.each do |name|
|
60
|
+
puts name
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
37
64
|
end
|
38
65
|
end
|
@@ -6,7 +6,8 @@ namespace :alchemy do
|
|
6
6
|
task upgrade: [
|
7
7
|
'alchemy:upgrade:prepare',
|
8
8
|
'alchemy:upgrade:4.1:run', 'alchemy:upgrade:4.1:todo',
|
9
|
-
'alchemy:upgrade:4.2:run', 'alchemy:upgrade:4.2:todo'
|
9
|
+
'alchemy:upgrade:4.2:run', 'alchemy:upgrade:4.2:todo',
|
10
|
+
'alchemy:upgrade:4.4:run', 'alchemy:upgrade:4.4:todo'
|
10
11
|
] do
|
11
12
|
Alchemy::Upgrader.display_todos
|
12
13
|
end
|
@@ -105,5 +106,35 @@ namespace :alchemy do
|
|
105
106
|
Alchemy::Upgrader::FourPointTwo.alchemy_4_2_todos
|
106
107
|
end
|
107
108
|
end
|
109
|
+
|
110
|
+
desc 'Upgrade Alchemy to v4.4'
|
111
|
+
task '4.4' => [
|
112
|
+
'alchemy:upgrade:prepare',
|
113
|
+
'alchemy:upgrade:4.4:run',
|
114
|
+
'alchemy:upgrade:4.4:todo'
|
115
|
+
] do
|
116
|
+
Alchemy::Upgrader.display_todos
|
117
|
+
end
|
118
|
+
|
119
|
+
namespace '4.4' do
|
120
|
+
task run: [
|
121
|
+
'alchemy:upgrade:4.4:rename_element_views',
|
122
|
+
'alchemy:upgrade:4.4:update_local_variable'
|
123
|
+
]
|
124
|
+
|
125
|
+
desc "Remove '_view' suffix from element views."
|
126
|
+
task rename_element_views: [:environment] do
|
127
|
+
Alchemy::Upgrader::FourPointFour.rename_element_views
|
128
|
+
end
|
129
|
+
|
130
|
+
desc 'Update element views local variable to element name.'
|
131
|
+
task update_local_variable: [:environment] do
|
132
|
+
Alchemy::Upgrader::FourPointFour.update_local_variable
|
133
|
+
end
|
134
|
+
|
135
|
+
task :todo do
|
136
|
+
Alchemy::Upgrader::FourPointFour.alchemy_4_4_todos
|
137
|
+
end
|
138
|
+
end
|
108
139
|
end
|
109
140
|
end
|
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: 4.4.
|
4
|
+
version: 4.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas von Deyen
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2020-01-
|
16
|
+
date: 2020-01-08 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: active_model_serializers
|
@@ -1051,11 +1051,13 @@ files:
|
|
1051
1051
|
- lib/alchemy/test_support/shared_uploader_examples.rb
|
1052
1052
|
- lib/alchemy/tinymce.rb
|
1053
1053
|
- lib/alchemy/upgrader.rb
|
1054
|
+
- lib/alchemy/upgrader/four_point_four.rb
|
1054
1055
|
- lib/alchemy/upgrader/four_point_one.rb
|
1055
1056
|
- lib/alchemy/upgrader/four_point_two.rb
|
1056
1057
|
- lib/alchemy/upgrader/tasks/cells_migration.rb
|
1057
1058
|
- lib/alchemy/upgrader/tasks/cells_upgrader.rb
|
1058
1059
|
- lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb
|
1060
|
+
- lib/alchemy/upgrader/tasks/element_views_updater.rb
|
1059
1061
|
- lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb
|
1060
1062
|
- lib/alchemy/upgrader/tasks/picture_gallery_migration.rb
|
1061
1063
|
- lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb
|
@@ -1188,7 +1190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1188
1190
|
version: '0'
|
1189
1191
|
requirements:
|
1190
1192
|
- ImageMagick (libmagick), v6.6 or greater.
|
1191
|
-
rubygems_version: 3.
|
1193
|
+
rubygems_version: 3.0.3
|
1192
1194
|
signing_key:
|
1193
1195
|
specification_version: 4
|
1194
1196
|
summary: A powerful, userfriendly and flexible CMS for Rails 5
|