maglevcms 1.4.0 → 1.5.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.
- checksums.yaml +4 -4
- data/app/components/maglev/content/image.rb +1 -1
- data/app/controllers/maglev/api/assets_controller.rb +3 -3
- data/app/controllers/maglev/application_controller.rb +5 -0
- data/app/controllers/maglev/assets_controller.rb +1 -1
- data/app/controllers/maglev/editor_controller.rb +12 -3
- data/app/frontend/admin/controllers/screenshot_controller.js +5 -1
- data/app/frontend/editor/App.vue +1 -1
- data/app/frontend/editor/components/dynamic-form/dynamic-input.vue +17 -18
- data/app/frontend/editor/components/dynamic-form/index.vue +1 -1
- data/app/frontend/editor/components/header-nav/device-toggler.vue +1 -1
- data/app/frontend/editor/components/header-nav/index.vue +3 -3
- data/app/frontend/editor/components/header-nav/locale-toggler/index.vue +4 -4
- data/app/frontend/editor/components/header-nav/preview-toggler.vue +3 -3
- data/app/frontend/editor/components/header-nav/publish-button.vue +3 -3
- data/app/frontend/editor/components/header-nav/save-button.vue +1 -1
- data/app/frontend/editor/components/icon-library/index.vue +1 -1
- data/app/frontend/editor/components/image-library/index.vue +2 -2
- data/app/frontend/editor/components/image-library/list-item.vue +1 -1
- data/app/frontend/editor/components/image-library/uploader.vue +1 -1
- data/app/frontend/editor/components/kit/accordion.vue +8 -3
- data/app/frontend/editor/components/kit/checkbox-input.vue +1 -1
- data/app/frontend/editor/components/kit/collection-item-input.vue +7 -4
- data/app/frontend/editor/components/kit/color-input/core-input.vue +17 -12
- data/app/frontend/editor/components/kit/color-input/preset-button.vue +14 -10
- data/app/frontend/editor/components/kit/color-input/preset-dropdown.vue +8 -7
- data/app/frontend/editor/components/kit/color-input.vue +2 -4
- data/app/frontend/editor/components/kit/confirmation-button.vue +3 -3
- data/app/frontend/editor/components/kit/divider.vue +4 -4
- data/app/frontend/editor/components/kit/dropdown.vue +1 -1
- data/app/frontend/editor/components/kit/hint.vue +3 -3
- data/app/frontend/editor/components/kit/icon-input.vue +4 -4
- data/app/frontend/editor/components/kit/icon.vue +7 -2
- data/app/frontend/editor/components/kit/image-input.vue +5 -5
- data/app/frontend/editor/components/kit/index.js +25 -25
- data/app/frontend/editor/components/kit/link-input.vue +6 -6
- data/app/frontend/editor/components/kit/list-item-button.vue +2 -2
- data/app/frontend/editor/components/kit/modal-root.vue +3 -3
- data/app/frontend/editor/components/kit/modal.vue +2 -2
- data/app/frontend/editor/components/kit/page-icon.vue +2 -2
- data/app/frontend/editor/components/kit/pagination/index.vue +3 -3
- data/app/frontend/editor/components/kit/rich-text-input/block-button.vue +10 -10
- data/app/frontend/editor/components/kit/rich-text-input/menu-button.vue +1 -1
- data/app/frontend/editor/components/kit/rich-text-input/table-button.vue +18 -12
- data/app/frontend/editor/components/kit/rich-text-input.vue +1 -1
- data/app/frontend/editor/components/kit/search-input.vue +3 -3
- data/app/frontend/editor/components/kit/select-input.vue +19 -5
- data/app/frontend/editor/components/kit/simple-select.vue +1 -1
- data/app/frontend/editor/components/kit/submit-button.vue +4 -4
- data/app/frontend/editor/components/kit/tabs.vue +2 -2
- data/app/frontend/editor/components/kit/text-input.vue +1 -1
- data/app/frontend/editor/components/kit/textarea-input.vue +1 -1
- data/app/frontend/editor/components/link-picker/email.vue +1 -1
- data/app/frontend/editor/components/link-picker/index.vue +1 -1
- data/app/frontend/editor/components/link-picker/page.vue +5 -5
- data/app/frontend/editor/components/link-picker/url.vue +2 -2
- data/app/frontend/editor/components/page/edit.vue +3 -3
- data/app/frontend/editor/components/page/form/main.vue +3 -3
- data/app/frontend/editor/components/page/form/seo.vue +5 -5
- data/app/frontend/editor/components/page/list/list-item.vue +12 -12
- data/app/frontend/editor/components/page/new.vue +3 -3
- data/app/frontend/editor/components/section-block-pane/index.vue +1 -1
- data/app/frontend/editor/components/section-block-pane/setting-list.vue +1 -1
- data/app/frontend/editor/components/section-highlighter/bottom-actions.vue +1 -1
- data/app/frontend/editor/components/section-highlighter/top-left-actions.vue +7 -3
- data/app/frontend/editor/components/section-highlighter/top-right-actions.vue +9 -6
- data/app/frontend/editor/components/section-list/list-item.vue +12 -5
- data/app/frontend/editor/components/section-pane/block-list/list-item.vue +3 -3
- data/app/frontend/editor/components/section-pane/block-list/new-block-button.vue +4 -4
- data/app/frontend/editor/components/section-pane/block-tree/new-nested-block-button.vue +4 -4
- data/app/frontend/editor/components/section-pane/block-tree/tree-node.vue +2 -2
- data/app/frontend/editor/components/section-pane/index.vue +2 -2
- data/app/frontend/editor/components/section-pane/setting-list.vue +1 -1
- data/app/frontend/editor/components/sidebar-nav.vue +5 -5
- data/app/frontend/editor/components/style-pane/index.vue +1 -1
- data/app/frontend/editor/components/theme-section-list/index.vue +2 -2
- data/app/frontend/editor/components/theme-section-list/list-item.vue +1 -1
- data/app/frontend/editor/layouts/slide-pane.vue +1 -1
- data/app/frontend/editor/locales/index.js +5 -2
- data/app/frontend/editor/misc/utils.js +10 -7
- data/app/frontend/editor/mixins/global.js +1 -1
- data/app/frontend/editor/services/api.js +2 -2
- data/app/frontend/editor/services/image.js +6 -2
- data/app/frontend/editor/services/section.js +1 -0
- data/app/frontend/editor/store/actions/page.js +1 -1
- data/app/frontend/editor/store/getters.js +1 -1
- data/app/frontend/editor/views/content-pane.vue +9 -5
- data/app/frontend/editor/views/page-preview.vue +5 -1
- data/app/frontend/editor/views/pages/index.vue +1 -1
- data/app/frontend/live-preview-client/rails.js +1 -1
- data/app/frontend/live-preview-client/run-scripts.js +22 -24
- data/app/models/maglev/asset.rb +14 -0
- data/app/models/maglev/page/search_concern.rb +2 -1
- data/app/models/maglev/page.rb +18 -0
- data/app/models/maglev/page_path.rb +17 -0
- data/app/models/maglev/site.rb +24 -0
- data/db/migrate/20200824085207_create_maglev_sites.rb +2 -1
- data/db/migrate/20200824104648_create_maglev_pages.rb +2 -1
- data/db/migrate/20201206172020_create_maglev_assets.rb +2 -1
- data/db/migrate/20210830085101_create_maglev_page_paths.rb +3 -2
- data/lib/maglev/engine.rb +1 -0
- data/lib/maglev/migration.rb +20 -0
- data/lib/maglev/version.rb +1 -1
- data/lib/maglev.rb +7 -0
- data/lib/tasks/maglev_tasks.rake +1 -1
- data/package.json +21 -17
- data/{postcss.config.js → postcss.config.cjs} +1 -1
- data/yarn.lock +1171 -1009
- metadata +23 -9
- data/.eslintrc.js +0 -49
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
<accordion
|
|
3
|
+
<uikit-accordion
|
|
4
4
|
v-for="(category, index) in categories"
|
|
5
5
|
:key="index"
|
|
6
6
|
headerClass="px-3 py-3 mb-3 bg-editor-primary text-white rounded-sm"
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{{ $t('themeSectionList.emptyCategory') }}
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
29
|
-
</accordion>
|
|
29
|
+
</uikit-accordion>
|
|
30
30
|
</div>
|
|
31
31
|
</template>
|
|
32
32
|
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
class="bg-white w-full h-16 flex items-center justify-center"
|
|
26
26
|
v-if="isImageNotFound"
|
|
27
27
|
>
|
|
28
|
-
<icon name="ri-bug-line" />
|
|
28
|
+
<uikit-icon name="ri-bug-line" />
|
|
29
29
|
</div>
|
|
30
30
|
<div
|
|
31
31
|
class="flex items-center px-2 bg-editor-primary bg-opacity-5 py-4 w-full font-bold text-sm"
|
|
@@ -7,11 +7,14 @@ import { deepMerge } from '@/misc/utils'
|
|
|
7
7
|
const overriddenEN = window.customTranslations?.en ?? {}
|
|
8
8
|
const overriddenES = window.customTranslations?.es ?? {}
|
|
9
9
|
const overriddenFR = window.customTranslations?.fr ?? {}
|
|
10
|
-
const overriddenPTBR =
|
|
10
|
+
const overriddenPTBR =
|
|
11
|
+
window.customTranslations && window.customTranslations['pt-BR']
|
|
12
|
+
? window.customTranslations['pt-BR']
|
|
13
|
+
: {}
|
|
11
14
|
|
|
12
15
|
export default {
|
|
13
16
|
en: deepMerge(EditorEN, overriddenEN),
|
|
14
17
|
es: deepMerge(EditorES, overriddenES),
|
|
15
18
|
fr: deepMerge(EditorFR, overriddenFR),
|
|
16
|
-
|
|
19
|
+
'pt-BR': deepMerge(EditorPTBR, overriddenPTBR),
|
|
17
20
|
}
|
|
@@ -16,7 +16,7 @@ export const camelize = (str) => {
|
|
|
16
16
|
|
|
17
17
|
export const camelizeKeys = (obj) => {
|
|
18
18
|
if (Array.isArray(obj)) {
|
|
19
|
-
return obj.map(v => camelizeKeys(v))
|
|
19
|
+
return obj.map((v) => camelizeKeys(v))
|
|
20
20
|
} else if (obj != null && obj.constructor === Object) {
|
|
21
21
|
return Object.keys(obj).reduce(
|
|
22
22
|
(result, key) => ({
|
|
@@ -24,12 +24,11 @@ export const camelizeKeys = (obj) => {
|
|
|
24
24
|
[camelize(key)]: camelizeKeys(obj[key]),
|
|
25
25
|
}),
|
|
26
26
|
{},
|
|
27
|
-
)
|
|
27
|
+
)
|
|
28
28
|
}
|
|
29
|
-
return obj
|
|
29
|
+
return obj
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
32
|
export const numberToHumanSize = (size, i18n) => {
|
|
34
33
|
if (isBlank(size)) return null
|
|
35
34
|
|
|
@@ -124,9 +123,13 @@ export const hexToRgb = (hex) => {
|
|
|
124
123
|
|
|
125
124
|
export const colorVariableToHex = (variable) => {
|
|
126
125
|
if (!variable) return null
|
|
127
|
-
const color = (
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
const color = (
|
|
127
|
+
variable.startsWith('--')
|
|
128
|
+
? getComputedStyle(document.body).getPropertyValue(variable)
|
|
129
|
+
: variable
|
|
130
|
+
)
|
|
131
|
+
.trim()
|
|
132
|
+
.toLowerCase()
|
|
130
133
|
return color === 'transparent' ? '' : color
|
|
131
134
|
}
|
|
132
135
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import axios from 'axios'
|
|
2
2
|
import camelcaseObjectDeep from 'camelcase-object-deep'
|
|
3
3
|
|
|
4
4
|
let siteHandle = null
|
|
@@ -18,7 +18,7 @@ const api = axios.create({
|
|
|
18
18
|
Accept: 'application/json',
|
|
19
19
|
},
|
|
20
20
|
transformResponse(data) {
|
|
21
|
-
// for "security" (even if the Rails API already camelcases the JSON),
|
|
21
|
+
// for "security" (even if the Rails API already camelcases the JSON),
|
|
22
22
|
// we also camelcase the response in the Editor.
|
|
23
23
|
// console.log('[DEBUG] API response', data)
|
|
24
24
|
return data ? camelcaseObjectDeep(JSON.parse(data)) : {}
|
|
@@ -15,8 +15,12 @@ export default (api) => ({
|
|
|
15
15
|
create: (attributes) => {
|
|
16
16
|
let formData = new FormData()
|
|
17
17
|
Object.entries(attributes).forEach(([key, value]) =>
|
|
18
|
-
formData.append(`asset[${key}]`, value)
|
|
18
|
+
formData.append(`asset[${key}]`, value)
|
|
19
19
|
)
|
|
20
|
-
return api.post('/assets', formData
|
|
20
|
+
return api.post('/assets', formData, {
|
|
21
|
+
headers: {
|
|
22
|
+
'Content-Type': 'multipart/form-data'
|
|
23
|
+
}
|
|
24
|
+
})
|
|
21
25
|
},
|
|
22
26
|
})
|
|
@@ -175,6 +175,7 @@ export const getBlockLabel = (block, definition, index) => {
|
|
|
175
175
|
case 'collection_item':
|
|
176
176
|
if (!label && !isBlank(value?.label)) label = value.label
|
|
177
177
|
if (!image && !isBlank(value?.imageUrl)) image = value.imageUrl
|
|
178
|
+
break
|
|
178
179
|
default:
|
|
179
180
|
break
|
|
180
181
|
}
|
|
@@ -3,7 +3,7 @@ import { isBlank } from '@/misc/utils'
|
|
|
3
3
|
export default (services) => ({
|
|
4
4
|
// editPage : Action triggered when the user wants to edit another page
|
|
5
5
|
// or to change the locale of the current page.
|
|
6
|
-
editPage({ state,
|
|
6
|
+
editPage({ state, dispatch }, { id, locale }) {
|
|
7
7
|
console.log('editPage', id, locale)
|
|
8
8
|
|
|
9
9
|
// display the loader
|
|
@@ -18,7 +18,7 @@ export default (services) => ({
|
|
|
18
18
|
}
|
|
19
19
|
})
|
|
20
20
|
},
|
|
21
|
-
stickySectionList: (
|
|
21
|
+
stickySectionList: (_, { sectionList }) => {
|
|
22
22
|
return sectionList.filter((section) => section.viewportFixedPosition)
|
|
23
23
|
},
|
|
24
24
|
defaultPageAttributes: ({ page }) => {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
}"
|
|
16
16
|
class="flex items-center"
|
|
17
17
|
>
|
|
18
|
-
<icon name="arrow-drop-left" />
|
|
18
|
+
<uikit-icon name="arrow-drop-left" />
|
|
19
19
|
<span class="text-xs">{{ sectionTitle }}</span>
|
|
20
20
|
</router-link>
|
|
21
21
|
</p>
|
|
@@ -53,13 +53,17 @@ export default {
|
|
|
53
53
|
else return null
|
|
54
54
|
},
|
|
55
55
|
sectionTitle() {
|
|
56
|
-
return
|
|
56
|
+
return (
|
|
57
|
+
this.$st(`${this.currentSectionI18nScope}.name`) ||
|
|
58
|
+
this.currentSectionDefinition?.name
|
|
59
|
+
)
|
|
57
60
|
},
|
|
58
61
|
sectionBlockTitle() {
|
|
59
|
-
return
|
|
62
|
+
return (
|
|
63
|
+
this.$st(`${this.currentSectionI18nScope}.blocks.label`) ||
|
|
60
64
|
this.currentSectionBlockDefinition?.name +
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
' ' +
|
|
66
|
+
`#${this.currentSectionBlockIndex}`
|
|
63
67
|
)
|
|
64
68
|
},
|
|
65
69
|
isSectionReady() {
|
|
@@ -63,7 +63,11 @@
|
|
|
63
63
|
class="flex mt-4 text-gray-600"
|
|
64
64
|
>
|
|
65
65
|
<template v-slot:icon>
|
|
66
|
-
<icon
|
|
66
|
+
<uikit-icon
|
|
67
|
+
name="add-box-line"
|
|
68
|
+
size="1.5rem"
|
|
69
|
+
class="mx-1 text-black"
|
|
70
|
+
/>
|
|
67
71
|
</template>
|
|
68
72
|
</i18n>
|
|
69
73
|
</div>
|
|
@@ -1,54 +1,53 @@
|
|
|
1
|
-
export default function(element) {
|
|
2
|
-
var scripts
|
|
1
|
+
export default function (element) {
|
|
2
|
+
var scripts
|
|
3
3
|
|
|
4
4
|
// Get the scripts
|
|
5
|
-
scripts = element.getElementsByTagName(
|
|
5
|
+
scripts = element.getElementsByTagName('script')
|
|
6
6
|
|
|
7
7
|
// Run them in sequence (remember NodeLists are live)
|
|
8
|
-
continueLoading()
|
|
8
|
+
continueLoading()
|
|
9
9
|
|
|
10
10
|
function continueLoading() {
|
|
11
|
-
var script, newscript
|
|
11
|
+
var script, newscript
|
|
12
12
|
|
|
13
13
|
// While we have a script to load...
|
|
14
14
|
while (scripts.length) {
|
|
15
15
|
// Get it and remove it from the DOM
|
|
16
|
-
script = scripts[0]
|
|
17
|
-
script.parentNode.removeChild(script)
|
|
16
|
+
script = scripts[0]
|
|
17
|
+
script.parentNode.removeChild(script)
|
|
18
18
|
|
|
19
19
|
// Create a replacement for it
|
|
20
|
-
newscript = document.createElement('script')
|
|
20
|
+
newscript = document.createElement('script')
|
|
21
21
|
|
|
22
22
|
// External?
|
|
23
23
|
if (script.src) {
|
|
24
24
|
// Yes, we'll have to wait until it's loaded before continuing
|
|
25
|
-
newscript.onerror = continueLoadingOnError
|
|
26
|
-
newscript.onload = continueLoadingOnLoad
|
|
27
|
-
newscript.onreadystatechange = continueLoadingOnReady
|
|
28
|
-
newscript.src = script.src
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
25
|
+
newscript.onerror = continueLoadingOnError
|
|
26
|
+
newscript.onload = continueLoadingOnLoad
|
|
27
|
+
newscript.onreadystatechange = continueLoadingOnReady
|
|
28
|
+
newscript.src = script.src
|
|
29
|
+
} else {
|
|
31
30
|
// No, we can do it right away
|
|
32
|
-
newscript.text = script.text
|
|
31
|
+
newscript.text = script.text
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
// Start the script
|
|
36
|
-
document.documentElement.appendChild(newscript)
|
|
35
|
+
document.documentElement.appendChild(newscript)
|
|
37
36
|
|
|
38
37
|
// If it's external, wait for callback
|
|
39
38
|
if (script.src) {
|
|
40
|
-
return
|
|
39
|
+
return
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
// All scripts loaded
|
|
45
|
-
newscript = undefined
|
|
44
|
+
newscript = undefined
|
|
46
45
|
|
|
47
46
|
// Callback on most browsers when a script is loaded
|
|
48
47
|
function continueLoadingOnLoad() {
|
|
49
48
|
// Defend against duplicate calls
|
|
50
49
|
if (this === newscript) {
|
|
51
|
-
continueLoading()
|
|
50
|
+
continueLoading()
|
|
52
51
|
}
|
|
53
52
|
}
|
|
54
53
|
|
|
@@ -56,18 +55,17 @@ export default function(element) {
|
|
|
56
55
|
function continueLoadingOnError() {
|
|
57
56
|
// Defend against duplicate calls
|
|
58
57
|
if (this === newscript) {
|
|
59
|
-
continueLoading()
|
|
58
|
+
continueLoading()
|
|
60
59
|
}
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
// Callback on IE when a script's loading status changes
|
|
64
63
|
function continueLoadingOnReady() {
|
|
65
|
-
|
|
66
64
|
// Defend against duplicate calls and check whether the
|
|
67
65
|
// script is complete (complete = loaded or error)
|
|
68
|
-
if (this === newscript && this.readyState ===
|
|
69
|
-
continueLoading()
|
|
66
|
+
if (this === newscript && this.readyState === 'complete') {
|
|
67
|
+
continueLoading()
|
|
70
68
|
}
|
|
71
69
|
}
|
|
72
70
|
}
|
|
73
|
-
}
|
|
71
|
+
}
|
data/app/models/maglev/asset.rb
CHANGED
|
@@ -26,3 +26,17 @@ module Maglev
|
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
|
+
|
|
30
|
+
# == Schema Information
|
|
31
|
+
#
|
|
32
|
+
# Table name: maglev_assets
|
|
33
|
+
#
|
|
34
|
+
# id :bigint not null, primary key
|
|
35
|
+
# byte_size :integer
|
|
36
|
+
# content_type :string
|
|
37
|
+
# filename :string
|
|
38
|
+
# height :integer
|
|
39
|
+
# width :integer
|
|
40
|
+
# created_at :datetime not null
|
|
41
|
+
# updated_at :datetime not null
|
|
42
|
+
#
|
|
@@ -27,7 +27,8 @@ module Maglev::Page::SearchConcern
|
|
|
27
27
|
|
|
28
28
|
def search_path_clause(query, locale)
|
|
29
29
|
path = Maglev::PagePath.arel_table[:value]
|
|
30
|
-
|
|
30
|
+
path_locale = Maglev::PagePath.arel_table[:locale]
|
|
31
|
+
path.matches(query).and(path_locale.eq(locale))
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
def search_title_node(locale)
|
data/app/models/maglev/page.rb
CHANGED
|
@@ -42,3 +42,21 @@ module Maglev
|
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
+
|
|
46
|
+
# == Schema Information
|
|
47
|
+
#
|
|
48
|
+
# Table name: maglev_pages
|
|
49
|
+
#
|
|
50
|
+
# id :bigint not null, primary key
|
|
51
|
+
# lock_version :integer
|
|
52
|
+
# meta_description_translations :jsonb
|
|
53
|
+
# og_description_translations :jsonb
|
|
54
|
+
# og_image_url_translations :jsonb
|
|
55
|
+
# og_title_translations :jsonb
|
|
56
|
+
# sections_translations :jsonb
|
|
57
|
+
# seo_title_translations :jsonb
|
|
58
|
+
# title_translations :jsonb
|
|
59
|
+
# visible :boolean default(TRUE)
|
|
60
|
+
# created_at :datetime not null
|
|
61
|
+
# updated_at :datetime not null
|
|
62
|
+
#
|
|
@@ -44,3 +44,20 @@ module Maglev
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
|
+
|
|
48
|
+
# == Schema Information
|
|
49
|
+
#
|
|
50
|
+
# Table name: maglev_page_paths
|
|
51
|
+
#
|
|
52
|
+
# id :bigint not null, primary key
|
|
53
|
+
# canonical :boolean default(TRUE)
|
|
54
|
+
# locale :string not null
|
|
55
|
+
# value :string not null
|
|
56
|
+
# maglev_page_id :bigint
|
|
57
|
+
#
|
|
58
|
+
# Indexes
|
|
59
|
+
#
|
|
60
|
+
# canonical_speed (canonical,locale,value)
|
|
61
|
+
# index_maglev_page_paths_on_maglev_page_id (maglev_page_id)
|
|
62
|
+
# scoped_canonical_speed (canonical,maglev_page_id,locale)
|
|
63
|
+
#
|
data/app/models/maglev/site.rb
CHANGED
|
@@ -27,3 +27,27 @@ module Maglev
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
# == Schema Information
|
|
32
|
+
#
|
|
33
|
+
# Table name: maglev_sites
|
|
34
|
+
#
|
|
35
|
+
# id :bigint not null, primary key
|
|
36
|
+
# domain :string
|
|
37
|
+
# handle :string
|
|
38
|
+
# locales :jsonb
|
|
39
|
+
# lock_version :integer
|
|
40
|
+
# name :string
|
|
41
|
+
# navigation :jsonb
|
|
42
|
+
# sections_translations :jsonb
|
|
43
|
+
# siteable_type :string
|
|
44
|
+
# style :jsonb
|
|
45
|
+
# created_at :datetime not null
|
|
46
|
+
# updated_at :datetime not null
|
|
47
|
+
# siteable_id :bigint
|
|
48
|
+
# theme_id :string
|
|
49
|
+
#
|
|
50
|
+
# Indexes
|
|
51
|
+
#
|
|
52
|
+
# index_maglev_sites_on_siteable (siteable_type,siteable_id)
|
|
53
|
+
#
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
class CreateMaglevPagePaths < ActiveRecord::Migration[6.0]
|
|
2
|
+
include Maglev::Migration
|
|
2
3
|
def change
|
|
3
|
-
create_table :maglev_page_paths do |t|
|
|
4
|
-
t.references :maglev_page
|
|
4
|
+
create_table :maglev_page_paths, id: primary_key_type do |t|
|
|
5
|
+
t.references :maglev_page, type: foreign_key_type
|
|
5
6
|
t.string :locale, null: false
|
|
6
7
|
t.string :value, null: false
|
|
7
8
|
end
|
data/lib/maglev/engine.rb
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Maglev
|
|
4
|
+
module Migration
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def primary_key_type
|
|
8
|
+
primary_key_type_setting || :primary_key
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def foreign_key_type
|
|
12
|
+
primary_key_type_setting || :bigint
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def primary_key_type_setting
|
|
16
|
+
config = Rails.configuration.generators
|
|
17
|
+
config.options[config.orm][:primary_key_type]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/maglev/version.rb
CHANGED
data/lib/maglev.rb
CHANGED
|
@@ -54,5 +54,12 @@ module Maglev
|
|
|
54
54
|
def services(overrides = {})
|
|
55
55
|
::Maglev::AppContainer.new(config.services.merge(overrides)).call
|
|
56
56
|
end
|
|
57
|
+
|
|
58
|
+
def uuid_as_primary_key?
|
|
59
|
+
return @uuid_as_primary_key unless @uuid_as_primary_key.nil?
|
|
60
|
+
|
|
61
|
+
config = Rails.configuration.generators
|
|
62
|
+
@uuid_as_primary_key = config.options[config.orm][:primary_key_type] == :uuid
|
|
63
|
+
end
|
|
57
64
|
end
|
|
58
65
|
end
|
data/lib/tasks/maglev_tasks.rake
CHANGED
|
@@ -29,7 +29,7 @@ namespace :maglev do
|
|
|
29
29
|
ARGV.each { |a| task a.to_sym => :environment do; end }
|
|
30
30
|
# rubocop:enable Style/BlockDelimiters
|
|
31
31
|
|
|
32
|
-
locales = ARGV[1..].map do |arg|
|
|
32
|
+
locales = (ARGV[1..] || []).map do |arg|
|
|
33
33
|
label, prefix = arg.split(':')
|
|
34
34
|
Maglev::Site::Locale.new(label: label, prefix: prefix)
|
|
35
35
|
end
|
data/package.json
CHANGED
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
"name": "maglev",
|
|
3
3
|
"private": true,
|
|
4
4
|
"scripts": {
|
|
5
|
+
"lint": "eslint --ext .js,.vue app/frontend/editor",
|
|
6
|
+
"prettier": "prettier --config .prettierrc 'app/frontend/**/*.{vue,js}'",
|
|
5
7
|
"prettier-format": "prettier --config .prettierrc 'app/frontend/**/*.{vue,js}' --write",
|
|
6
8
|
"test": "vitest"
|
|
7
9
|
},
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"type": "module",
|
|
8
12
|
"dependencies": {
|
|
9
|
-
"axios": "^
|
|
13
|
+
"axios": "^1.6.0",
|
|
10
14
|
"camelcase-object-deep": "^1.1.3",
|
|
11
15
|
"normalizr": "^3.6.1",
|
|
12
16
|
"stimulus": "^2.0.0",
|
|
@@ -15,31 +19,29 @@
|
|
|
15
19
|
"tiptap-extensions": "^1.34.0",
|
|
16
20
|
"turbolinks": "^5.2.0",
|
|
17
21
|
"v-tooltip": "^2.1.3",
|
|
18
|
-
"vue": "^2.7.
|
|
22
|
+
"vue": "^2.7.15",
|
|
19
23
|
"vue-i18n": "^8.21.1",
|
|
20
24
|
"vue-router": "^3.4.4",
|
|
21
25
|
"vue-window-size": "0.6.2",
|
|
22
26
|
"vuedraggable": "^2.24.3",
|
|
23
27
|
"vuex": "^3.5.1"
|
|
24
28
|
},
|
|
25
|
-
"version": "0.1.0",
|
|
26
29
|
"devDependencies": {
|
|
27
|
-
"@vitejs/plugin-vue2": "^2.
|
|
28
|
-
"@vue/compiler-dom": "^3.2.41",
|
|
30
|
+
"@vitejs/plugin-vue2": "^2.3.1",
|
|
29
31
|
"@vue/test-utils": "^1.3.1",
|
|
30
32
|
"autoprefixer": "^10.4.13",
|
|
31
|
-
"eslint": "^8.
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
33
|
+
"eslint": "^8.54.0",
|
|
34
|
+
"eslint-plugin-vue": "^9.18.1",
|
|
35
|
+
"eslint-config-prettier": "^9.0.0",
|
|
36
|
+
"jsdom": "^23.0.0",
|
|
37
|
+
"prettier": "^3.1.0",
|
|
38
|
+
"sass": "^1.69.5",
|
|
36
39
|
"tailwindcss": "^3.2.1",
|
|
37
|
-
"vite": "^
|
|
38
|
-
"vite-plugin-
|
|
39
|
-
"vite-plugin-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"vue-template-compiler": "^2.7.13"
|
|
40
|
+
"vite": "^5.0.5",
|
|
41
|
+
"vite-plugin-ruby": "^5.0.0",
|
|
42
|
+
"vite-plugin-vue2-svg": "^0.4.0",
|
|
43
|
+
"vitest": "^0.34.6",
|
|
44
|
+
"vue-template-compiler": "^2.7.15"
|
|
43
45
|
},
|
|
44
46
|
"resolutions": {
|
|
45
47
|
"prosemirror-model": "^1.11.2",
|
|
@@ -49,6 +51,8 @@
|
|
|
49
51
|
"node-forge": "^1.3.0",
|
|
50
52
|
"minimist": "^1.2.6",
|
|
51
53
|
"eventsource": "^1.1.1",
|
|
52
|
-
"async": "^2.6.4"
|
|
54
|
+
"async": "^2.6.4",
|
|
55
|
+
"postcss": "^8.4.31",
|
|
56
|
+
"vite": "^5.0.5"
|
|
53
57
|
}
|
|
54
58
|
}
|