maglevcms 1.1.6 → 1.2.0
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.
- checksums.yaml +4 -4
- data/app/components/maglev/content/image.rb +2 -0
- data/app/controllers/concerns/maglev/fetchers_concern.rb +1 -0
- data/app/controllers/concerns/maglev/standalone_sections_concern.rb +6 -0
- data/app/controllers/maglev/sitemap_controller.rb +31 -0
- data/app/frontend/editor/assets/remixicons/ri-palette-line.svg +1 -0
- data/app/frontend/editor/components/dynamic-form/dynamic-input.vue +2 -1
- data/app/frontend/editor/components/header-nav/publish-button.vue +1 -1
- data/app/frontend/editor/components/kit/collection-item-input.vue +5 -2
- data/app/frontend/editor/components/kit/color-input/core-input.vue +85 -0
- data/app/frontend/editor/components/kit/color-input/preset-button.vue +57 -0
- data/app/frontend/editor/components/kit/color-input/preset-dropdown.vue +46 -0
- data/app/frontend/editor/components/kit/color-input.vue +43 -0
- data/app/frontend/editor/components/kit/dropdown.vue +1 -0
- data/app/frontend/editor/components/kit/index.js +2 -2
- data/app/frontend/editor/components/kit/submit-button.vue +3 -3
- data/app/frontend/editor/components/kit/tabs.vue +2 -1
- data/app/frontend/editor/components/kit/text-input.vue +2 -2
- data/app/frontend/editor/misc/utils.js +32 -2
- data/app/frontend/editor/services/api.js +2 -2
- data/app/frontend/editor/spec/__mocks__/page.js +36 -36
- data/app/frontend/editor/spec/__mocks__/section.js +29 -29
- data/app/helpers/maglev/editor_helper.rb +1 -1
- data/app/helpers/maglev/page_preview_helper.rb +5 -1
- data/app/helpers/maglev/sitemap_helper.rb +13 -0
- data/app/models/concerns/maglev/sections_concern.rb +10 -0
- data/app/models/maglev/page/path_concern.rb +8 -1
- data/app/models/maglev/section/setting.rb +5 -0
- data/app/models/maglev/site/locales_concern.rb +8 -0
- data/app/services/concerns/maglev/get_page_sections/transform_collection_item_concern.rb +8 -1
- data/app/services/maglev/app_container.rb +2 -0
- data/app/services/maglev/fetch_collection_items.rb +6 -2
- data/app/services/maglev/persist_page.rb +23 -4
- data/app/services/maglev/setup_pages.rb +41 -5
- data/app/views/maglev/api/pages/_show.json.jbuilder +1 -2
- data/app/views/maglev/sitemap/index.xml.builder +21 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20210830085101_create_maglev_page_paths.rb +1 -1
- data/db/migrate/20210906102712_add_canonical_to_pages.rb +1 -1
- data/db/migrate/20211008064437_add_locales_to_sites.rb +1 -1
- data/db/migrate/20211013210954_translate_section_content.rb +1 -1
- data/db/migrate/20211101205001_add_lock_version_to_maglev_pages.rb +1 -1
- data/db/migrate/20211116161121_better_page_path_canonical_indices.rb +1 -1
- data/db/migrate/20211124101005_fix_page_path_indices.rb +1 -1
- data/db/migrate/20211203224112_add_open_graph_tags_to_pages.rb +1 -1
- data/db/migrate/20220612092235_add_style_to_sites.rb +1 -1
- data/lib/generators/maglev/install_generator.rb +3 -2
- data/lib/generators/maglev/section_generator.rb +2 -1
- data/lib/generators/maglev/templates/section/app/theme/sections/%category%/%file_name%.yml.tt +13 -9
- data/lib/maglev/engine.rb +8 -2
- data/lib/maglev/version.rb +1 -1
- data/package.json +3 -3
- data/yarn.lock +799 -565
- metadata +14 -7
- data/app/frontend/editor/components/kit/color-picker.vue +0 -81
- /data/app/frontend/editor/assets/remixicons/{check-line.svg → ri-check-line.svg} +0 -0
@@ -9,7 +9,7 @@ export const pageSections = [
|
|
9
9
|
settings: [
|
10
10
|
{
|
11
11
|
id: 'link',
|
12
|
-
value: { href: '#', text: 'Home',
|
12
|
+
value: { href: '#', text: 'Home', linkType: 'url' },
|
13
13
|
},
|
14
14
|
],
|
15
15
|
},
|
@@ -19,7 +19,7 @@ export const pageSections = [
|
|
19
19
|
settings: [
|
20
20
|
{
|
21
21
|
id: 'link',
|
22
|
-
value: { href: '#', text: 'About us',
|
22
|
+
value: { href: '#', text: 'About us', linkType: 'url' },
|
23
23
|
},
|
24
24
|
],
|
25
25
|
},
|
@@ -33,11 +33,11 @@ export const pageSections = [
|
|
33
33
|
href: '//contact',
|
34
34
|
text: 'Contact',
|
35
35
|
email: null,
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
linkId: 9,
|
37
|
+
linkType: 'page',
|
38
|
+
linkLabel: 'Contact us',
|
39
|
+
sectionId: null,
|
40
|
+
openNewWindow: false,
|
41
41
|
},
|
42
42
|
},
|
43
43
|
],
|
@@ -52,11 +52,11 @@ export const pageSections = [
|
|
52
52
|
href: '/products',
|
53
53
|
text: 'Products #1',
|
54
54
|
email: null,
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
linkId: 'd870133f9a075477a96a58e7639d40c5',
|
56
|
+
linkType: 'page',
|
57
|
+
linkLabel: 'Products',
|
58
|
+
sectionId: null,
|
59
|
+
openNewWindow: true,
|
60
60
|
},
|
61
61
|
},
|
62
62
|
],
|
@@ -71,7 +71,7 @@ export const pageSections = [
|
|
71
71
|
width: 572,
|
72
72
|
height: 290,
|
73
73
|
filename: 'Screen Shot 2021-06-30 at 3.44.04 PM.png',
|
74
|
-
|
74
|
+
byteSize: 35070,
|
75
75
|
},
|
76
76
|
},
|
77
77
|
],
|
@@ -96,7 +96,7 @@ export const pageSections = [
|
|
96
96
|
width: 516,
|
97
97
|
height: 320,
|
98
98
|
filename: 'img-91-3.jpg',
|
99
|
-
|
99
|
+
byteSize: 41683,
|
100
100
|
},
|
101
101
|
},
|
102
102
|
{ id: 'button', value: { url: '#', text: 'Click here' } },
|
@@ -119,7 +119,7 @@ export const pageSections = [
|
|
119
119
|
width: 1920,
|
120
120
|
height: 1200,
|
121
121
|
filename: 'img-97.jpg',
|
122
|
-
|
122
|
+
byteSize: 458107,
|
123
123
|
},
|
124
124
|
},
|
125
125
|
],
|
@@ -137,7 +137,7 @@ export const pageSections = [
|
|
137
137
|
width: 516,
|
138
138
|
height: 400,
|
139
139
|
filename: 'inner-74-2.jpg',
|
140
|
-
|
140
|
+
byteSize: 63881,
|
141
141
|
},
|
142
142
|
},
|
143
143
|
],
|
@@ -155,7 +155,7 @@ export const pageSections = [
|
|
155
155
|
width: 516,
|
156
156
|
height: 320,
|
157
157
|
filename: 'img-91-4.jpg',
|
158
|
-
|
158
|
+
byteSize: 21808,
|
159
159
|
},
|
160
160
|
},
|
161
161
|
],
|
@@ -173,7 +173,7 @@ export const pageSections = [
|
|
173
173
|
width: 1920,
|
174
174
|
height: 1200,
|
175
175
|
filename: 'img-91.jpg',
|
176
|
-
|
176
|
+
byteSize: 180178,
|
177
177
|
},
|
178
178
|
},
|
179
179
|
],
|
@@ -220,7 +220,7 @@ export const normalizedPage = {
|
|
220
220
|
id: 'RiEo8C3f',
|
221
221
|
type: 'navbar_item',
|
222
222
|
settings: [
|
223
|
-
{ id: 'link', value: { href: '#', text: 'Home',
|
223
|
+
{ id: 'link', value: { href: '#', text: 'Home', linkType: 'url' } },
|
224
224
|
],
|
225
225
|
},
|
226
226
|
P1fGieWs: {
|
@@ -229,7 +229,7 @@ export const normalizedPage = {
|
|
229
229
|
settings: [
|
230
230
|
{
|
231
231
|
id: 'link',
|
232
|
-
value: { href: '#', text: 'About us',
|
232
|
+
value: { href: '#', text: 'About us', linkType: 'url' },
|
233
233
|
},
|
234
234
|
],
|
235
235
|
},
|
@@ -243,11 +243,11 @@ export const normalizedPage = {
|
|
243
243
|
href: '//contact',
|
244
244
|
text: 'Contact',
|
245
245
|
email: null,
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
246
|
+
linkId: 9,
|
247
|
+
linkType: 'page',
|
248
|
+
linkLabel: 'Contact us',
|
249
|
+
sectionId: null,
|
250
|
+
openNewWindow: false,
|
251
251
|
},
|
252
252
|
},
|
253
253
|
],
|
@@ -262,11 +262,11 @@ export const normalizedPage = {
|
|
262
262
|
href: '/products',
|
263
263
|
text: 'Products #1',
|
264
264
|
email: null,
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
265
|
+
linkId: 'd870133f9a075477a96a58e7639d40c5',
|
266
|
+
linkType: 'page',
|
267
|
+
linkLabel: 'Products',
|
268
|
+
sectionId: null,
|
269
|
+
openNewWindow: true,
|
270
270
|
},
|
271
271
|
},
|
272
272
|
],
|
@@ -284,7 +284,7 @@ export const normalizedPage = {
|
|
284
284
|
width: 1920,
|
285
285
|
height: 1200,
|
286
286
|
filename: 'img-97.jpg',
|
287
|
-
|
287
|
+
byteSize: 458107,
|
288
288
|
},
|
289
289
|
},
|
290
290
|
],
|
@@ -302,7 +302,7 @@ export const normalizedPage = {
|
|
302
302
|
width: 516,
|
303
303
|
height: 400,
|
304
304
|
filename: 'inner-74-2.jpg',
|
305
|
-
|
305
|
+
byteSize: 63881,
|
306
306
|
},
|
307
307
|
},
|
308
308
|
],
|
@@ -320,7 +320,7 @@ export const normalizedPage = {
|
|
320
320
|
width: 516,
|
321
321
|
height: 320,
|
322
322
|
filename: 'img-91-4.jpg',
|
323
|
-
|
323
|
+
byteSize: 21808,
|
324
324
|
},
|
325
325
|
},
|
326
326
|
],
|
@@ -338,7 +338,7 @@ export const normalizedPage = {
|
|
338
338
|
width: 1920,
|
339
339
|
height: 1200,
|
340
340
|
filename: 'img-91.jpg',
|
341
|
-
|
341
|
+
byteSize: 180178,
|
342
342
|
},
|
343
343
|
},
|
344
344
|
],
|
@@ -358,7 +358,7 @@ export const normalizedPage = {
|
|
358
358
|
width: 572,
|
359
359
|
height: 290,
|
360
360
|
filename: 'Screen Shot 2021-06-30 at 3.44.04 PM.png',
|
361
|
-
|
361
|
+
byteSize: 35070,
|
362
362
|
},
|
363
363
|
},
|
364
364
|
],
|
@@ -383,7 +383,7 @@ export const normalizedPage = {
|
|
383
383
|
width: 516,
|
384
384
|
height: 320,
|
385
385
|
filename: 'img-91-3.jpg',
|
386
|
-
|
386
|
+
byteSize: 41683,
|
387
387
|
},
|
388
388
|
},
|
389
389
|
{ id: 'button', value: { url: '#', text: 'Click here' } },
|
@@ -18,7 +18,7 @@ export const simpleContentSection = {
|
|
18
18
|
width: 516,
|
19
19
|
height: 320,
|
20
20
|
filename: 'img-91-3.jpg',
|
21
|
-
|
21
|
+
byteSize: 41683,
|
22
22
|
},
|
23
23
|
},
|
24
24
|
{ id: 'button', value: { url: '#', text: 'Click here' } },
|
@@ -48,7 +48,7 @@ export const normalizedSimpleContentSection = {
|
|
48
48
|
width: 516,
|
49
49
|
height: 320,
|
50
50
|
filename: 'img-91-3.jpg',
|
51
|
-
|
51
|
+
byteSize: 41683,
|
52
52
|
},
|
53
53
|
},
|
54
54
|
{ id: 'button', value: { url: '#', text: 'Click here' } },
|
@@ -69,7 +69,7 @@ export const navContentSection = {
|
|
69
69
|
settings: [
|
70
70
|
{
|
71
71
|
id: 'link',
|
72
|
-
value: { href: '#', text: 'Home',
|
72
|
+
value: { href: '#', text: 'Home', linkType: 'url' },
|
73
73
|
},
|
74
74
|
],
|
75
75
|
},
|
@@ -79,7 +79,7 @@ export const navContentSection = {
|
|
79
79
|
settings: [
|
80
80
|
{
|
81
81
|
id: 'link',
|
82
|
-
value: { href: '#', text: 'About us',
|
82
|
+
value: { href: '#', text: 'About us', linkType: 'url' },
|
83
83
|
},
|
84
84
|
],
|
85
85
|
},
|
@@ -93,11 +93,11 @@ export const navContentSection = {
|
|
93
93
|
href: '//contact',
|
94
94
|
text: 'Contact',
|
95
95
|
email: null,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
96
|
+
linkId: 9,
|
97
|
+
linkType: 'page',
|
98
|
+
linkLabel: 'Contact us',
|
99
|
+
sectionId: null,
|
100
|
+
openNewWindow: false,
|
101
101
|
},
|
102
102
|
},
|
103
103
|
],
|
@@ -112,11 +112,11 @@ export const navContentSection = {
|
|
112
112
|
href: '/products',
|
113
113
|
text: 'Products #1',
|
114
114
|
email: null,
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
115
|
+
linkId: 'd870133f9a075477a96a58e7639d40c5',
|
116
|
+
linkType: 'page',
|
117
|
+
linkLabel: 'Products',
|
118
|
+
sectionId: null,
|
119
|
+
openNewWindow: true,
|
120
120
|
},
|
121
121
|
},
|
122
122
|
],
|
@@ -131,7 +131,7 @@ export const navContentSection = {
|
|
131
131
|
width: 572,
|
132
132
|
height: 290,
|
133
133
|
filename: 'Screen Shot 2021-06-30 at 3.44.04 PM.png',
|
134
|
-
|
134
|
+
byteSize: 35070,
|
135
135
|
},
|
136
136
|
},
|
137
137
|
],
|
@@ -144,7 +144,7 @@ export const normalizedNavContentSection = {
|
|
144
144
|
id: 'RiEo8C3f',
|
145
145
|
type: 'navbar_item',
|
146
146
|
settings: [
|
147
|
-
{ id: 'link', value: { href: '#', text: 'Home',
|
147
|
+
{ id: 'link', value: { href: '#', text: 'Home', linkType: 'url' } },
|
148
148
|
],
|
149
149
|
},
|
150
150
|
P1fGieWs: {
|
@@ -153,7 +153,7 @@ export const normalizedNavContentSection = {
|
|
153
153
|
settings: [
|
154
154
|
{
|
155
155
|
id: 'link',
|
156
|
-
value: { href: '#', text: 'About us',
|
156
|
+
value: { href: '#', text: 'About us', linkType: 'url' },
|
157
157
|
},
|
158
158
|
],
|
159
159
|
},
|
@@ -167,11 +167,11 @@ export const normalizedNavContentSection = {
|
|
167
167
|
href: '//contact',
|
168
168
|
text: 'Contact',
|
169
169
|
email: null,
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
170
|
+
linkId: 9,
|
171
|
+
linkType: 'page',
|
172
|
+
linkLabel: 'Contact us',
|
173
|
+
sectionId: null,
|
174
|
+
openNewWindow: false,
|
175
175
|
},
|
176
176
|
},
|
177
177
|
],
|
@@ -186,11 +186,11 @@ export const normalizedNavContentSection = {
|
|
186
186
|
href: '/products',
|
187
187
|
text: 'Products #1',
|
188
188
|
email: null,
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
189
|
+
linkId: 'd870133f9a075477a96a58e7639d40c5',
|
190
|
+
linkType: 'page',
|
191
|
+
linkLabel: 'Products',
|
192
|
+
sectionId: null,
|
193
|
+
openNewWindow: true,
|
194
194
|
},
|
195
195
|
},
|
196
196
|
],
|
@@ -210,7 +210,7 @@ export const normalizedNavContentSection = {
|
|
210
210
|
width: 572,
|
211
211
|
height: 290,
|
212
212
|
filename: 'Screen Shot 2021-06-30 at 3.44.04 PM.png',
|
213
|
-
|
213
|
+
byteSize: 35070,
|
214
214
|
},
|
215
215
|
},
|
216
216
|
],
|
@@ -226,7 +226,7 @@ export const navContentSectionBlock = {
|
|
226
226
|
settings: [
|
227
227
|
{
|
228
228
|
id: 'link',
|
229
|
-
value: { href: '#', text: 'Foo',
|
229
|
+
value: { href: '#', text: 'Foo', linkType: 'url' },
|
230
230
|
},
|
231
231
|
],
|
232
232
|
}
|
@@ -16,11 +16,15 @@ module Maglev
|
|
16
16
|
# rubocop:enable Rails/OutputSafety
|
17
17
|
|
18
18
|
def render_maglev_section(type, site: nil, theme: nil, page: nil, page_sections: nil)
|
19
|
+
sections = (page_sections || maglev_page_sections).find_all do |section|
|
20
|
+
(section['type'] || section[:type]).start_with?(type.to_s)
|
21
|
+
end
|
22
|
+
|
19
23
|
render_maglev_sections(
|
20
24
|
site: site,
|
21
25
|
theme: theme,
|
22
26
|
page: page,
|
23
|
-
page_sections:
|
27
|
+
page_sections: sections
|
24
28
|
)
|
25
29
|
end
|
26
30
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Maglev
|
4
|
+
module SitemapHelper
|
5
|
+
def sitemap_url(host, page, locale = nil)
|
6
|
+
path = maglev_services.get_page_fullpath.call(page: page, locale: locale)
|
7
|
+
|
8
|
+
return path if path =~ %r{^https?://}
|
9
|
+
|
10
|
+
[host, path].join
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -11,6 +11,16 @@ module Maglev::SectionsConcern
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def prepare_sections_translations
|
15
|
+
return if sections_translations.blank?
|
16
|
+
|
17
|
+
sections_translations.each_key do |locale|
|
18
|
+
Maglev::I18n.with_locale(locale) do
|
19
|
+
prepare_sections
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
14
24
|
private
|
15
25
|
|
16
26
|
def prepare_section(section)
|
@@ -27,7 +27,14 @@ module Maglev::Page::PathConcern
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def path=(value)
|
30
|
-
|
30
|
+
unless value.respond_to?(:each_pair)
|
31
|
+
current_path.value = value
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
value.each_pair do |locale, new_path|
|
36
|
+
Maglev::I18n.with_locale(locale) { self.path = new_path }
|
37
|
+
end
|
31
38
|
end
|
32
39
|
|
33
40
|
def current_path
|
@@ -21,6 +21,7 @@ class Maglev::Section::Setting
|
|
21
21
|
when :image then build_default_image_content(default)
|
22
22
|
when :link then build_default_link_content(default)
|
23
23
|
when :checkbox then build_default_checkbox_content(default)
|
24
|
+
when :collection_item then build_default_collection_item_content(default)
|
24
25
|
else
|
25
26
|
default || label
|
26
27
|
end
|
@@ -42,6 +43,10 @@ class Maglev::Section::Setting
|
|
42
43
|
default.presence || false
|
43
44
|
end
|
44
45
|
|
46
|
+
def build_default_collection_item_content(default)
|
47
|
+
{ id: default }
|
48
|
+
end
|
49
|
+
|
45
50
|
## class methods ##
|
46
51
|
def self.build(hash)
|
47
52
|
attributes = hash.slice('id', 'label', 'type', 'default')
|
@@ -24,6 +24,14 @@ module Maglev::Site::LocalesConcern
|
|
24
24
|
locales.map { |locale| locale.prefix.to_sym }
|
25
25
|
end
|
26
26
|
|
27
|
+
def each_locale
|
28
|
+
locale_prefixes.each do |locale|
|
29
|
+
Maglev::I18n.with_locale(locale) do
|
30
|
+
yield(locale)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
27
35
|
class LocalesSerializer
|
28
36
|
def self.dump(array)
|
29
37
|
(array || []).map(&:as_json)
|
@@ -3,7 +3,12 @@
|
|
3
3
|
# rubocop:disable Style/ClassAndModuleChildren
|
4
4
|
module Maglev::GetPageSections::TransformCollectionItemConcern
|
5
5
|
def transform_collection_item_content_setting(content, setting)
|
6
|
-
|
6
|
+
# the content might come from the default value of the collection_item setting
|
7
|
+
# rubocop:disable Style/StringHashKeys
|
8
|
+
content['value'] = { 'id' => 'any' } if content&.dig('value') == 'any'
|
9
|
+
# rubocop:enable Style/StringHashKeys
|
10
|
+
|
11
|
+
item_id = content&.dig('value', 'id')
|
7
12
|
return if item_id.blank?
|
8
13
|
|
9
14
|
item = fetch_collection_items.call(
|
@@ -11,6 +16,8 @@ module Maglev::GetPageSections::TransformCollectionItemConcern
|
|
11
16
|
id: item_id
|
12
17
|
)
|
13
18
|
|
19
|
+
return unless item
|
20
|
+
|
14
21
|
content['value']['label'] = item.label
|
15
22
|
content['value']['item'] = item.source
|
16
23
|
end
|
@@ -31,6 +31,8 @@ module Maglev
|
|
31
31
|
dependency :persist_section_screenshot, class: Maglev::PersistSectionScreenshot,
|
32
32
|
depends_on: %i[fetch_theme fetch_section_screenshot_path]
|
33
33
|
|
34
|
+
dependency :change_site_locales, class: Maglev::ChangeSiteLocales
|
35
|
+
|
34
36
|
dependency :fetch_page, class: Maglev::FetchPage, depends_on: :fetch_site
|
35
37
|
dependency :get_page_fullpath, class: Maglev::GetPageFullpath, depends_on: %i[fetch_site get_base_url]
|
36
38
|
dependency :get_page_sections, class: Maglev::GetPageSections,
|
@@ -33,7 +33,7 @@ module Maglev
|
|
33
33
|
|
34
34
|
def fetch_item
|
35
35
|
build_item(
|
36
|
-
fetch_original_items.find_by(id: id)
|
36
|
+
id == 'any' ? fetch_original_items.first : fetch_original_items.find_by(id: id)
|
37
37
|
)
|
38
38
|
end
|
39
39
|
|
@@ -78,7 +78,11 @@ module Maglev
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def collection
|
81
|
-
config.collections[collection_id.to_sym]
|
81
|
+
config.collections[collection_id.to_sym].tap do |collection|
|
82
|
+
next if collection
|
83
|
+
|
84
|
+
raise "[Maglev] unregistered '#{collection_id}' collection in the Maglev configuration."
|
85
|
+
end
|
82
86
|
end
|
83
87
|
|
84
88
|
def build_item(original_item)
|
@@ -25,15 +25,31 @@ module Maglev
|
|
25
25
|
|
26
26
|
def persist_page!
|
27
27
|
page.attributes = page_attributes
|
28
|
-
|
28
|
+
|
29
|
+
# the sections_translations attribute is put by the SetupPages service
|
30
|
+
# when we generate a brand new site
|
31
|
+
if page_attributes.key?(:sections_translations)
|
32
|
+
page.prepare_sections_translations
|
33
|
+
else
|
34
|
+
page.prepare_sections
|
35
|
+
end
|
36
|
+
|
29
37
|
page.save!
|
30
38
|
end
|
31
39
|
|
32
40
|
def persist_site!
|
33
41
|
return unless can_persist_site?
|
34
42
|
|
35
|
-
|
36
|
-
site
|
43
|
+
# the sections_translations attribute is put by the SetupPages service
|
44
|
+
# when we generate a brand new site
|
45
|
+
if site_attributes.key?(:sections_translations)
|
46
|
+
site.attributes = site_attributes
|
47
|
+
site.prepare_sections_translations
|
48
|
+
else
|
49
|
+
site.attributes = site_attributes_with_consistent_sections
|
50
|
+
site.prepare_sections
|
51
|
+
end
|
52
|
+
|
37
53
|
site.save!
|
38
54
|
end
|
39
55
|
|
@@ -68,7 +84,10 @@ module Maglev
|
|
68
84
|
end
|
69
85
|
|
70
86
|
def can_persist_site?
|
71
|
-
site_attributes.present? &&
|
87
|
+
site_attributes.present? && (
|
88
|
+
site_attributes[:sections].present? ||
|
89
|
+
site_attributes[:sections_translations].present?
|
90
|
+
)
|
72
91
|
end
|
73
92
|
end
|
74
93
|
end
|
@@ -13,7 +13,9 @@ module Maglev
|
|
13
13
|
|
14
14
|
def call
|
15
15
|
pages&.map do |page_attributes|
|
16
|
-
create_page(
|
16
|
+
create_page(
|
17
|
+
attributes_in_all_locales(page_attributes.with_indifferent_access)
|
18
|
+
)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -34,12 +36,46 @@ module Maglev
|
|
34
36
|
end
|
35
37
|
|
36
38
|
def site_attributes_from(page_attributes)
|
39
|
+
if page_attributes.include?(:sections_translations)
|
40
|
+
{ sections_translations: site_sections_translations(page_attributes) }
|
41
|
+
else
|
42
|
+
{ sections: select_site_scoped_sections(page_attributes[:sections]) }
|
43
|
+
end.compact || {}
|
44
|
+
end
|
45
|
+
|
46
|
+
def site_sections_translations(page_attributes)
|
47
|
+
sections_translations = page_attributes[:sections_translations].transform_values do |sections|
|
48
|
+
select_site_scoped_sections(sections)
|
49
|
+
end
|
50
|
+
sections_translations.any? { |_, sections| sections.blank? } ? nil : sections_translations
|
51
|
+
end
|
52
|
+
|
53
|
+
def attributes_in_all_locales(attributes)
|
37
54
|
{
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
55
|
+
title_translations: value_in_all_locales(attributes[:title]),
|
56
|
+
sections_translations: value_in_all_locales(attributes[:sections]),
|
57
|
+
path: value_in_all_locales(attributes[:path])
|
42
58
|
}
|
43
59
|
end
|
60
|
+
|
61
|
+
def value_in_all_locales(value)
|
62
|
+
if value.respond_to?(:each_pair)
|
63
|
+
default_value = value[site.default_locale_prefix]
|
64
|
+
fill_translations(default_value).merge(value)
|
65
|
+
else
|
66
|
+
fill_translations(value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def fill_translations(value)
|
71
|
+
site.locale_prefixes.index_with { |_locale| value }
|
72
|
+
end
|
73
|
+
|
74
|
+
def select_site_scoped_sections(sections)
|
75
|
+
(sections || []).find_all do |section|
|
76
|
+
definition = theme.sections.find(section['type'])
|
77
|
+
definition.site_scoped?
|
78
|
+
end
|
79
|
+
end
|
44
80
|
end
|
45
81
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
json.sections services.get_page_sections.call(page: page)
|
4
|
-
|
5
3
|
json.key_format! camelize: :lower
|
6
4
|
json.deep_format_keys!
|
7
5
|
|
@@ -20,5 +18,6 @@ json.og_image_url page.og_image_url
|
|
20
18
|
json.preview_url services.get_page_fullpath.call(page: page, preview_mode: true, locale: content_locale)
|
21
19
|
json.live_url services.get_page_fullpath.call(page: page, preview_mode: false, locale: content_locale)
|
22
20
|
json.section_names services.get_page_section_names.call(page: page)
|
21
|
+
json.sections services.get_page_sections.call(page: page)
|
23
22
|
json.lock_version page.lock_version
|
24
23
|
json.translated page.path.present?
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml.instruct!
|
4
|
+
|
5
|
+
xml.urlset xmlns: 'http://www.google.com/schemas/sitemap/0.9', "xmlns:xhtml": 'http://www.w3.org/1999/xhtml' do
|
6
|
+
@pages.each do |page|
|
7
|
+
xml.url do
|
8
|
+
xml.loc sitemap_url(@host, page, maglev_site.default_locale_prefix)
|
9
|
+
xml.lastmod page.updated_at.strftime('%Y-%m-%d')
|
10
|
+
|
11
|
+
if maglev_site.locales.size > 1
|
12
|
+
maglev_site.locales.each do |locale|
|
13
|
+
xml.xhtml :link,
|
14
|
+
rel: 'alternate',
|
15
|
+
hreflang: locale.prefix,
|
16
|
+
href: sitemap_url(@host, page, locale.prefix)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/config/routes.rb
CHANGED