maglevcms 1.3.0 → 1.4.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/frontend/admin/controllers/screenshot_controller.js +1 -1
- data/app/frontend/editor/locales/editor.pt-BR.json +257 -0
- data/app/frontend/editor/locales/index.js +3 -0
- data/app/models/concerns/maglev/sections_concern.rb +17 -13
- data/app/models/maglev/section/setting.rb +22 -25
- data/app/models/maglev/setting_types/base.rb +10 -0
- data/app/models/maglev/setting_types/checkbox.rb +9 -0
- data/app/models/maglev/setting_types/collection_item.rb +13 -0
- data/app/models/maglev/setting_types/color.rb +6 -0
- data/app/models/maglev/setting_types/divider.rb +9 -0
- data/app/models/maglev/setting_types/hint.rb +9 -0
- data/app/models/maglev/setting_types/icon.rb +9 -0
- data/app/models/maglev/setting_types/image.rb +13 -0
- data/app/models/maglev/setting_types/link.rb +13 -0
- data/app/models/maglev/setting_types/select.rb +6 -0
- data/app/models/maglev/setting_types/text.rb +6 -0
- data/app/models/maglev/site/locales_concern.rb +5 -1
- data/app/models/maglev/theme.rb +35 -0
- data/app/services/maglev/persist_page.rb +15 -11
- data/lib/maglev/active_storage.rb +2 -2
- data/lib/maglev/errors.rb +7 -0
- data/lib/maglev/version.rb +1 -1
- metadata +18 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 03a2b641a732256c52996191d8b8b5acd6fade31e3da46c7400b4ddd19d572b8
|
|
4
|
+
data.tar.gz: 7707349dac583ee782baf2b5eb6e2b6c4007d0935529c301376a8876a6a985f4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 48519ed7bfc8b5281297b2996d92a11fa0f9114266e577d05953f507006be5a64d0619ee2cce6c56471c0c4776f3d0706822860f1161163a6ab52ec1e17add3a
|
|
7
|
+
data.tar.gz: ef616f5afbf2f8a25ffdf59cbb75cc72b0276f723ed68eca78bcc8c6bc9781fa54833dd7617a322a1f704807a4b06cf6d4c2e90bcc2058dcf1bd6c3f2a522fec
|
|
@@ -21,7 +21,7 @@ export default class extends Controller {
|
|
|
21
21
|
'[data-maglev-dropzone]',
|
|
22
22
|
)
|
|
23
23
|
this.sourceTarget.contentWindow
|
|
24
|
-
.html2canvas(realSource, { allowTaint: true, logging: true })
|
|
24
|
+
.html2canvas(realSource, { allowTaint: true, logging: true, useCORS: true })
|
|
25
25
|
.then((canvas) => {
|
|
26
26
|
this.outputTarget.src = canvas.toDataURL() // for debugging purpose
|
|
27
27
|
axios
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
{
|
|
2
|
+
"headerNav": {
|
|
3
|
+
"pages": "Páginas:",
|
|
4
|
+
"pageSettings": "Configurações da página",
|
|
5
|
+
"previewSite": "Visualizar site",
|
|
6
|
+
"previewToggler": {
|
|
7
|
+
"button": "Visualizar site",
|
|
8
|
+
"draftLink": "Versão de rascunho",
|
|
9
|
+
"liveLink": "Versão publicada"
|
|
10
|
+
},
|
|
11
|
+
"publishButton": {
|
|
12
|
+
"default": "Publicar site",
|
|
13
|
+
"inProgress": "Publicando...",
|
|
14
|
+
"success": "Publicado!",
|
|
15
|
+
"fail": "Falhou!"
|
|
16
|
+
},
|
|
17
|
+
"saveButton": {
|
|
18
|
+
"default": "Salvar",
|
|
19
|
+
"inProgress": "Salvando...",
|
|
20
|
+
"success": "Salvo!",
|
|
21
|
+
"fail": "Falhou!"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"sidebarNav": {
|
|
25
|
+
"addNewSectionTooltip": "Adicionar uma nova seção na parte inferior da página",
|
|
26
|
+
"managePageSectionsTooltip": "Reordenar / excluir as seções da página",
|
|
27
|
+
"editStyleTooltip": "Alterar o estilo do seu site",
|
|
28
|
+
"openImageLibraryTooltip": "Abrir a galeria de imagens",
|
|
29
|
+
"leaveEditorTooltip": "Voltar para o aplicativo principal"
|
|
30
|
+
},
|
|
31
|
+
"pagePreview": {
|
|
32
|
+
"loading": "Carregando...",
|
|
33
|
+
"empty": {
|
|
34
|
+
"title": {
|
|
35
|
+
"withoutLocale": "Sua página está em branco",
|
|
36
|
+
"withLocale": "Sua página em %{localeName} está em branco"
|
|
37
|
+
},
|
|
38
|
+
"message": "Por favor, adicione a primeira seção clicando no botão {icon} na barra lateral esquerda."
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"page": {
|
|
42
|
+
"list": {
|
|
43
|
+
"title": "Lista de páginas",
|
|
44
|
+
"subTitle": "Gerenciar as páginas do seu site",
|
|
45
|
+
"newButton": "Nova página",
|
|
46
|
+
"searchPlaceholder": "Digite sua pesquisa aqui...",
|
|
47
|
+
"item": {
|
|
48
|
+
"edit": "Editar configurações da página",
|
|
49
|
+
"clone": "Clonar página",
|
|
50
|
+
"hide": "Ocultar página",
|
|
51
|
+
"show": "Mostrar página",
|
|
52
|
+
"delete": "Excluir página"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"new": {
|
|
56
|
+
"title": "Criar uma nova página",
|
|
57
|
+
"submitButton": {
|
|
58
|
+
"default": "Criar página",
|
|
59
|
+
"inProgress": "Criando...",
|
|
60
|
+
"success": "Criado!",
|
|
61
|
+
"fail": "Falhou!"
|
|
62
|
+
},
|
|
63
|
+
"cancelButton": "Cancelar"
|
|
64
|
+
},
|
|
65
|
+
"edit": {
|
|
66
|
+
"title": "Editando uma página",
|
|
67
|
+
"currentPage": {
|
|
68
|
+
"title": "Editando a página atual"
|
|
69
|
+
},
|
|
70
|
+
"submitButton": {
|
|
71
|
+
"default": "Atualizar página",
|
|
72
|
+
"inProgress": "Atualizando...",
|
|
73
|
+
"success": "Atualizado!",
|
|
74
|
+
"fail": "Falhou!"
|
|
75
|
+
},
|
|
76
|
+
"cancelButton": "Cancelar"
|
|
77
|
+
},
|
|
78
|
+
"form": {
|
|
79
|
+
"tabs": {
|
|
80
|
+
"main": "Principal",
|
|
81
|
+
"seo": "SEO"
|
|
82
|
+
},
|
|
83
|
+
"title": "Título",
|
|
84
|
+
"path": "Caminho",
|
|
85
|
+
"visible": "Visível",
|
|
86
|
+
"visiblePlaceholder": "Mostrar/Ocultar a página",
|
|
87
|
+
"seoTitle": "Título meta",
|
|
88
|
+
"metaDescription": "Descrição meta",
|
|
89
|
+
"ogTitle": "og:title",
|
|
90
|
+
"ogDescription": "og:description",
|
|
91
|
+
"ogImageUrl": "og:image"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"sections": {
|
|
95
|
+
"addPane": {
|
|
96
|
+
"title": "Adicionar uma seção"
|
|
97
|
+
},
|
|
98
|
+
"listPane": {
|
|
99
|
+
"title": "Organizar seções",
|
|
100
|
+
"empty": "Não há seções."
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"sectionPane": {
|
|
104
|
+
"tabs": {
|
|
105
|
+
"settings": "Conteúdo",
|
|
106
|
+
"blocks": "Blocos",
|
|
107
|
+
"advanced": "Avançado"
|
|
108
|
+
},
|
|
109
|
+
"blockList": {
|
|
110
|
+
"add": "Adicionar novo item"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"sectionBlockPane": {
|
|
114
|
+
"tabs": {
|
|
115
|
+
"settings": "Conteúdo",
|
|
116
|
+
"blocks": "Blocos",
|
|
117
|
+
"advanced": "Avançado"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"themeSectionList": {
|
|
121
|
+
"emptyCategory": "Nenhuma seção"
|
|
122
|
+
},
|
|
123
|
+
"style": {
|
|
124
|
+
"edit": {
|
|
125
|
+
"title": "Estilizar seu site",
|
|
126
|
+
"submitButton": {
|
|
127
|
+
"default": "Atualizar estilo",
|
|
128
|
+
"inProgress": "Atualizando...",
|
|
129
|
+
"success": "Atualizado!",
|
|
130
|
+
"fail": "Falhou!"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"imageInput": {
|
|
135
|
+
"addButton": "Adicionar imagem",
|
|
136
|
+
"replaceButton": "Substituir imagem",
|
|
137
|
+
"clearButton": "Limpar",
|
|
138
|
+
"altTextPlaceholder": "Texto alternativo para ajudar os mecanismos de busca"
|
|
139
|
+
},
|
|
140
|
+
"imageLibrary": {
|
|
141
|
+
"title": "Lista de imagens",
|
|
142
|
+
"pickerTitle": "Selecionar uma imagem",
|
|
143
|
+
"none": "Nenhuma imagem enviada ainda",
|
|
144
|
+
"searchPlaceholder": "Buscar por um nome de arquivo",
|
|
145
|
+
"pagination": {
|
|
146
|
+
"label": "%{start} - %{end} de %{totalItems} imagens",
|
|
147
|
+
"noItems": "Nenhuma imagem"
|
|
148
|
+
},
|
|
149
|
+
"destroy": {
|
|
150
|
+
"text": "Tem certeza?",
|
|
151
|
+
"ok": "Sim, exclua",
|
|
152
|
+
"cancel": "Cancelar"
|
|
153
|
+
},
|
|
154
|
+
"uploader": {
|
|
155
|
+
"wrongFiles": "Certifique-se de que o tamanho de cada imagem não seja maior que %{limit}.",
|
|
156
|
+
"uploadButton": {
|
|
157
|
+
"default": "Enviar imagens",
|
|
158
|
+
"inProgress": "Enviando...",
|
|
159
|
+
"success": "Enviado!",
|
|
160
|
+
"fail": "Falha!"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"iconInput": {
|
|
165
|
+
"addButton": "Adicionar ícone",
|
|
166
|
+
"replaceButton": "Substituir ícone",
|
|
167
|
+
"clearButton": "Limpar"
|
|
168
|
+
},
|
|
169
|
+
"iconLibrary": {
|
|
170
|
+
"title": "Ícones",
|
|
171
|
+
"pickerTitle": "Escolher um ícone"
|
|
172
|
+
},
|
|
173
|
+
"linkInput": {
|
|
174
|
+
"placeholder": "Clique aqui para selecionar um link",
|
|
175
|
+
"withNestedTextLabel": "Ativar texto",
|
|
176
|
+
"nestedTextPlaceholder": "Texto"
|
|
177
|
+
},
|
|
178
|
+
"linkPicker": {
|
|
179
|
+
"title": "Selecionar um link",
|
|
180
|
+
"insertTitle": "Inserir um link",
|
|
181
|
+
"page": {
|
|
182
|
+
"name": "Página",
|
|
183
|
+
"input": {
|
|
184
|
+
"label": "Página",
|
|
185
|
+
"placeholder": "Selecione uma página",
|
|
186
|
+
"searchPlaceholder": "Pesquisar...",
|
|
187
|
+
"emptyLabel": "Nenhuma página encontrada"
|
|
188
|
+
},
|
|
189
|
+
"sectionInput": {
|
|
190
|
+
"label": "Seção",
|
|
191
|
+
"placeholder": "Selecione uma seção",
|
|
192
|
+
"emptyLabel": "Nenhuma seção selecionada"
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"url": {
|
|
196
|
+
"name": "URL",
|
|
197
|
+
"input": {
|
|
198
|
+
"label": "URL"
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
"email": {
|
|
202
|
+
"name": "Email",
|
|
203
|
+
"input": {
|
|
204
|
+
"label": "Email"
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
"shared": {
|
|
208
|
+
"mainButton": {
|
|
209
|
+
"select": "Selecionar",
|
|
210
|
+
"insert": "Adicionar"
|
|
211
|
+
},
|
|
212
|
+
"cancelButton": "Cancelar",
|
|
213
|
+
"newWindowInput": {
|
|
214
|
+
"label": "Abrir em nova janela"
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"collectionItemInput": {
|
|
219
|
+
"select": {
|
|
220
|
+
"placeholder": "Selecione um item",
|
|
221
|
+
"searchPlaceholder": "Pesquisar...",
|
|
222
|
+
"emptyLabel": "Nenhum item encontrado"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
"pagination": {
|
|
226
|
+
"defaultLabel": "%{start} - %{end} de %{totalItems} itens",
|
|
227
|
+
"defaultNoItems": "Nenhum"
|
|
228
|
+
},
|
|
229
|
+
"confirmationButton": {
|
|
230
|
+
"text": "Você tem certeza de que deseja realizar esta ação?",
|
|
231
|
+
"confirmButtonLabel": "Sim",
|
|
232
|
+
"cancelButtonLabel": "Não"
|
|
233
|
+
},
|
|
234
|
+
"errorModals": {
|
|
235
|
+
"staleRecord": {
|
|
236
|
+
"title": "Pedimos desculpas 🙇",
|
|
237
|
+
"message": "Não conseguimos salvar suas alterações porque outra pessoa atualizou o conteúdo no intervalo de tempo.",
|
|
238
|
+
"button": "Por favor, recarregue a página"
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
"support": {
|
|
242
|
+
"human": {
|
|
243
|
+
"storageUnits": {
|
|
244
|
+
"format": "%{number} %{unit}",
|
|
245
|
+
"units": {
|
|
246
|
+
"byte": {
|
|
247
|
+
"one": "Byte",
|
|
248
|
+
"other": "Bytes"
|
|
249
|
+
},
|
|
250
|
+
"kb": "KB",
|
|
251
|
+
"mb": "MB",
|
|
252
|
+
"gb": "GB"
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import EditorEN from './editor.en.json'
|
|
2
2
|
import EditorES from './editor.es.json'
|
|
3
3
|
import EditorFR from './editor.fr.json'
|
|
4
|
+
import EditorPTBR from './editor.pt-BR.json'
|
|
4
5
|
import { deepMerge } from '@/misc/utils'
|
|
5
6
|
|
|
6
7
|
const overriddenEN = window.customTranslations?.en ?? {}
|
|
7
8
|
const overriddenES = window.customTranslations?.es ?? {}
|
|
8
9
|
const overriddenFR = window.customTranslations?.fr ?? {}
|
|
10
|
+
const overriddenPTBR = (window.customTranslations && window.customTranslations['pt-BR']) ? window.customTranslations['pt-BR'] : {}
|
|
9
11
|
|
|
10
12
|
export default {
|
|
11
13
|
en: deepMerge(EditorEN, overriddenEN),
|
|
12
14
|
es: deepMerge(EditorES, overriddenES),
|
|
13
15
|
fr: deepMerge(EditorFR, overriddenFR),
|
|
16
|
+
"pt-BR": deepMerge(EditorPTBR, overriddenPTBR),
|
|
14
17
|
}
|
|
@@ -2,54 +2,58 @@
|
|
|
2
2
|
|
|
3
3
|
# rubocop:disable Style/ClassAndModuleChildren
|
|
4
4
|
module Maglev::SectionsConcern
|
|
5
|
-
def prepare_sections
|
|
5
|
+
def prepare_sections(theme)
|
|
6
6
|
# NOTE: pages defined in the theme definition
|
|
7
7
|
# don't include the ids for sections/blocks
|
|
8
8
|
self.sections ||= [] # NOTE: the self is mandatory here
|
|
9
9
|
sections.each do |section|
|
|
10
|
-
prepare_section(section)
|
|
10
|
+
prepare_section(theme, section)
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
def prepare_sections_translations
|
|
14
|
+
def prepare_sections_translations(theme)
|
|
15
15
|
return if sections_translations.blank?
|
|
16
16
|
|
|
17
17
|
sections_translations.each_key do |locale|
|
|
18
18
|
Maglev::I18n.with_locale(locale) do
|
|
19
|
-
prepare_sections
|
|
19
|
+
prepare_sections(theme)
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
private
|
|
25
25
|
|
|
26
|
-
def prepare_section(section)
|
|
26
|
+
def prepare_section(theme, section)
|
|
27
27
|
section['id'] ||= SecureRandom.urlsafe_base64(8)
|
|
28
|
-
section['settings'] = prepare_settings(section['settings'])
|
|
28
|
+
section['settings'] = prepare_settings(theme, section['type'], nil, section['settings'])
|
|
29
29
|
section['blocks'] = (section['blocks'] || []).map do |block|
|
|
30
|
-
prepare_block(block)
|
|
30
|
+
prepare_block(theme, section['type'], block)
|
|
31
31
|
end.flatten
|
|
32
32
|
section
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def prepare_block(block)
|
|
35
|
+
def prepare_block(theme, section_type, block)
|
|
36
36
|
block['id'] ||= SecureRandom.urlsafe_base64(8)
|
|
37
|
-
block['settings'] = prepare_settings(block['settings'])
|
|
37
|
+
block['settings'] = prepare_settings(theme, section_type, block['type'], block['settings'])
|
|
38
38
|
|
|
39
39
|
# the children key is accepted when the sections come from a theme preset
|
|
40
40
|
children = (block.delete('children') || []).map do |nested_block|
|
|
41
41
|
nested_block['parent_id'] = block['id']
|
|
42
|
-
prepare_block(nested_block)
|
|
42
|
+
prepare_block(theme, section_type, nested_block)
|
|
43
43
|
end
|
|
44
44
|
[block, children].flatten
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
def prepare_settings(settings)
|
|
47
|
+
def prepare_settings(theme, section_type, block_type, settings)
|
|
48
48
|
# NOTE: in the theme definition file, we allow developers to declare
|
|
49
49
|
# default content like this: { <setting_id_1>: <setting_value_1>, ..., <setting_id_n>: <setting_value_n> }
|
|
50
|
-
|
|
50
|
+
settings = settings.map { |key, value| { id: key, value: value } } unless settings.is_a?(Array)
|
|
51
51
|
|
|
52
|
-
settings.map
|
|
52
|
+
settings.map do |setting|
|
|
53
|
+
setting = setting.with_indifferent_access
|
|
54
|
+
type = theme.find_setting!(section_type, block_type, setting['id'])
|
|
55
|
+
setting.merge({ value: type.cast_value(setting['value']) })
|
|
56
|
+
end
|
|
53
57
|
end
|
|
54
58
|
end
|
|
55
59
|
# rubocop:enable Style/ClassAndModuleChildren
|
|
@@ -5,46 +5,37 @@ class Maglev::Section::Setting
|
|
|
5
5
|
## concerns ##
|
|
6
6
|
include ActiveModel::Model
|
|
7
7
|
|
|
8
|
+
## constants ##
|
|
9
|
+
REGISTERED_TYPES = %w[text image checkbox link color select collection_item icon divider hint].freeze
|
|
10
|
+
|
|
8
11
|
## attributes ##
|
|
9
12
|
attr_accessor :id, :label, :type, :default, :options
|
|
10
13
|
|
|
11
14
|
## validations ##
|
|
12
15
|
validates :id, :label, :type, :default, 'maglev/presence': true
|
|
13
|
-
validates :type, inclusion: { in:
|
|
16
|
+
validates :type, inclusion: { in: REGISTERED_TYPES }
|
|
14
17
|
|
|
15
18
|
## methods ##
|
|
16
19
|
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
when :image then build_default_image_content(default)
|
|
22
|
-
when :link then build_default_link_content(default)
|
|
23
|
-
when :checkbox then build_default_checkbox_content(default)
|
|
24
|
-
when :collection_item then build_default_collection_item_content(default)
|
|
25
|
-
else
|
|
26
|
-
default || label
|
|
20
|
+
# shortcuts
|
|
21
|
+
REGISTERED_TYPES.each do |type|
|
|
22
|
+
define_method(:"#{type}_type?") do
|
|
23
|
+
self.type.to_s == type
|
|
27
24
|
end
|
|
28
25
|
end
|
|
29
26
|
|
|
30
|
-
def
|
|
31
|
-
|
|
27
|
+
def cast_value(value)
|
|
28
|
+
self.class.registered_types[type.to_s].cast_value(value)
|
|
32
29
|
end
|
|
33
30
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
else
|
|
38
|
-
{ text: 'Link', link_type: 'url', href: '#' }.merge(default)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
31
|
+
# NOTE: any modification to that method must be reflected in the JS editor
|
|
32
|
+
def build_default_content(custom_default = nil)
|
|
33
|
+
default = custom_default.nil? ? self.default : custom_default
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
default
|
|
44
|
-
end
|
|
35
|
+
# special case: text type
|
|
36
|
+
default ||= label if text_type?
|
|
45
37
|
|
|
46
|
-
|
|
47
|
-
{ id: default }
|
|
38
|
+
cast_value(default)
|
|
48
39
|
end
|
|
49
40
|
|
|
50
41
|
## class methods ##
|
|
@@ -58,5 +49,11 @@ class Maglev::Section::Setting
|
|
|
58
49
|
def self.build_many(list)
|
|
59
50
|
list.map { |hash| build(hash) }
|
|
60
51
|
end
|
|
52
|
+
|
|
53
|
+
def self.registered_types
|
|
54
|
+
@registered_types ||= REGISTERED_TYPES.index_with do |type|
|
|
55
|
+
"Maglev::SettingTypes::#{type.camelize}".constantize.new
|
|
56
|
+
end
|
|
57
|
+
end
|
|
61
58
|
end
|
|
62
59
|
# rubocop:enable Style/ClassAndModuleChildren
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
|
4
|
+
class Maglev::SettingTypes::Checkbox < Maglev::SettingTypes::Base
|
|
5
|
+
def cast_value(value)
|
|
6
|
+
ActiveModel::Type::Boolean.new.cast(value) || false
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
# rubocop:enable Style/ClassAndModuleChildren
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
|
4
|
+
class Maglev::SettingTypes::CollectionItem < Maglev::SettingTypes::Base
|
|
5
|
+
def cast_value(value)
|
|
6
|
+
if value.is_a?(String)
|
|
7
|
+
{ id: default }
|
|
8
|
+
else
|
|
9
|
+
value
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
# rubocop:enable Style/ClassAndModuleChildren
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
|
4
|
+
class Maglev::SettingTypes::Image < Maglev::SettingTypes::Base
|
|
5
|
+
def cast_value(value)
|
|
6
|
+
if value.is_a?(String)
|
|
7
|
+
{ url: value }
|
|
8
|
+
else
|
|
9
|
+
value || {}
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
# rubocop:enable Style/ClassAndModuleChildren
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
|
4
|
+
class Maglev::SettingTypes::Link < Maglev::SettingTypes::Base
|
|
5
|
+
def cast_value(value)
|
|
6
|
+
if value.is_a?(String)
|
|
7
|
+
{ text: 'Link', link_type: 'url', href: value }
|
|
8
|
+
else
|
|
9
|
+
{ text: 'Link', link_type: 'url', href: '#' }.merge(value)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
# rubocop:enable Style/ClassAndModuleChildren
|
|
@@ -6,7 +6,11 @@ module Maglev::Site::LocalesConcern
|
|
|
6
6
|
|
|
7
7
|
included do
|
|
8
8
|
## serializers ##
|
|
9
|
-
|
|
9
|
+
if Rails::VERSION::MAJOR > 6
|
|
10
|
+
serialize :locales, coder: LocalesSerializer
|
|
11
|
+
else
|
|
12
|
+
serialize :locales, LocalesSerializer
|
|
13
|
+
end
|
|
10
14
|
|
|
11
15
|
## validation ##
|
|
12
16
|
validates :locales, 'maglev/collection': true, length: { minimum: 1 }
|
data/app/models/maglev/theme.rb
CHANGED
|
@@ -12,5 +12,40 @@ module Maglev
|
|
|
12
12
|
validates :id, :name, presence: true
|
|
13
13
|
|
|
14
14
|
## methods ##
|
|
15
|
+
|
|
16
|
+
def find_setting!(section_id, block_id, setting_id)
|
|
17
|
+
setting = find_setting(section_id, block_id, setting_id)
|
|
18
|
+
raise Maglev::Errors::UnknownSetting.new(section_id, block_id, setting_id) if setting.nil?
|
|
19
|
+
|
|
20
|
+
setting
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def find_setting(section_id, block_id, setting_id)
|
|
24
|
+
key = [section_id, block_id, setting_id].compact.join('.')
|
|
25
|
+
section_setting_types[key]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def section_setting_types
|
|
31
|
+
@section_setting_types ||= build_section_setting_types
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def build_section_setting_types
|
|
35
|
+
hash = {}
|
|
36
|
+
sections.each do |section|
|
|
37
|
+
build_section_setting_types_from_settings(hash, section.id, section.settings)
|
|
38
|
+
section.blocks.each do |block|
|
|
39
|
+
build_section_setting_types_from_settings(hash, "#{section.id}.#{block.type}", block.settings)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
hash
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def build_section_setting_types_from_settings(hash, parent_key, settings)
|
|
46
|
+
settings.each do |setting|
|
|
47
|
+
hash["#{parent_key}.#{setting.id}"] = setting
|
|
48
|
+
end
|
|
49
|
+
end
|
|
15
50
|
end
|
|
16
51
|
end
|
|
@@ -29,9 +29,9 @@ module Maglev
|
|
|
29
29
|
# the sections_translations attribute is put by the SetupPages service
|
|
30
30
|
# when we generate a brand new site
|
|
31
31
|
if page_attributes.key?(:sections_translations)
|
|
32
|
-
page.prepare_sections_translations
|
|
32
|
+
page.prepare_sections_translations(theme)
|
|
33
33
|
else
|
|
34
|
-
page.prepare_sections
|
|
34
|
+
page.prepare_sections(theme)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
page.save!
|
|
@@ -40,15 +40,7 @@ module Maglev
|
|
|
40
40
|
def persist_site!
|
|
41
41
|
return unless can_persist_site?
|
|
42
42
|
|
|
43
|
-
|
|
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
|
|
43
|
+
assign_sections_to_site
|
|
52
44
|
|
|
53
45
|
site.save!
|
|
54
46
|
end
|
|
@@ -89,5 +81,17 @@ module Maglev
|
|
|
89
81
|
site_attributes[:sections_translations].present?
|
|
90
82
|
)
|
|
91
83
|
end
|
|
84
|
+
|
|
85
|
+
def assign_sections_to_site
|
|
86
|
+
# the sections_translations attribute is put by the SetupPages service
|
|
87
|
+
# when we generate a brand new site
|
|
88
|
+
if site_attributes.key?(:sections_translations)
|
|
89
|
+
site.attributes = site_attributes
|
|
90
|
+
site.prepare_sections_translations(theme)
|
|
91
|
+
else
|
|
92
|
+
site.attributes = site_attributes_with_consistent_sections
|
|
93
|
+
site.prepare_sections(theme)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
92
96
|
end
|
|
93
97
|
end
|
data/lib/maglev/errors.rb
CHANGED
|
@@ -4,5 +4,12 @@ module Maglev
|
|
|
4
4
|
module Errors
|
|
5
5
|
class NotAuthorized < StandardError; end
|
|
6
6
|
class UnknownSection < StandardError; end
|
|
7
|
+
|
|
8
|
+
class UnknownSetting < StandardError
|
|
9
|
+
def initialize(section_id, block_id, setting_id)
|
|
10
|
+
key = [section_id, block_id].compact.join('.')
|
|
11
|
+
super("[#{key}] The #{setting_id} setting is undeclared OR its type is unknown.")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
7
14
|
end
|
|
8
15
|
end
|
data/lib/maglev/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: maglevcms
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Didier Lafforgue
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-10
|
|
11
|
+
date: 2023-11-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jbuilder
|
|
@@ -56,9 +56,9 @@ dependencies:
|
|
|
56
56
|
name: rails
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- - "
|
|
59
|
+
- - "<"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '7.
|
|
61
|
+
version: '7.2'
|
|
62
62
|
- - ">="
|
|
63
63
|
- !ruby/object:Gem::Version
|
|
64
64
|
version: '6'
|
|
@@ -66,9 +66,9 @@ dependencies:
|
|
|
66
66
|
prerelease: false
|
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
|
68
68
|
requirements:
|
|
69
|
-
- - "
|
|
69
|
+
- - "<"
|
|
70
70
|
- !ruby/object:Gem::Version
|
|
71
|
-
version: '7.
|
|
71
|
+
version: '7.2'
|
|
72
72
|
- - ">="
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
74
|
version: '6'
|
|
@@ -628,6 +628,7 @@ files:
|
|
|
628
628
|
- app/frontend/editor/locales/editor.en.json
|
|
629
629
|
- app/frontend/editor/locales/editor.es.json
|
|
630
630
|
- app/frontend/editor/locales/editor.fr.json
|
|
631
|
+
- app/frontend/editor/locales/editor.pt-BR.json
|
|
631
632
|
- app/frontend/editor/locales/index.js
|
|
632
633
|
- app/frontend/editor/main.js
|
|
633
634
|
- app/frontend/editor/misc/__tests__/utils.spec.js
|
|
@@ -722,6 +723,17 @@ files:
|
|
|
722
723
|
- app/models/maglev/section/block.rb
|
|
723
724
|
- app/models/maglev/section/content_concern.rb
|
|
724
725
|
- app/models/maglev/section/setting.rb
|
|
726
|
+
- app/models/maglev/setting_types/base.rb
|
|
727
|
+
- app/models/maglev/setting_types/checkbox.rb
|
|
728
|
+
- app/models/maglev/setting_types/collection_item.rb
|
|
729
|
+
- app/models/maglev/setting_types/color.rb
|
|
730
|
+
- app/models/maglev/setting_types/divider.rb
|
|
731
|
+
- app/models/maglev/setting_types/hint.rb
|
|
732
|
+
- app/models/maglev/setting_types/icon.rb
|
|
733
|
+
- app/models/maglev/setting_types/image.rb
|
|
734
|
+
- app/models/maglev/setting_types/link.rb
|
|
735
|
+
- app/models/maglev/setting_types/select.rb
|
|
736
|
+
- app/models/maglev/setting_types/text.rb
|
|
725
737
|
- app/models/maglev/site.rb
|
|
726
738
|
- app/models/maglev/site/locale.rb
|
|
727
739
|
- app/models/maglev/site/locales_concern.rb
|