@myissue/vue-website-page-builder 3.0.18 → 3.0.19
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.
- package/README.md +79 -76
- package/dist/page-builder/2-images-text.png +0 -0
- package/dist/page-builder/3-images-text.png +0 -0
- package/dist/page-builder/3-vertical-images.png +0 -0
- package/dist/page-builder/4-images-text.png +0 -0
- package/dist/vue-website-page-builder.css +1 -1
- package/dist/vue-website-page-builder.js +7168 -7261
- package/dist/vue-website-page-builder.umd.cjs +146 -81
- package/package.json +4 -3
- package/src/App.vue +4 -115
- package/src/Components/Homepage/HomeSection.vue +70 -162
- package/src/Components/MediaLibrary/SidebarUnsplash.vue +9 -16
- package/src/Components/MediaLibrary/Unsplash.vue +51 -91
- package/src/Components/Modals/MediaLibraryModal.vue +56 -318
- package/src/Components/Modals/PageBuilderPreviewModal.vue +22 -40
- package/src/Components/PageBuilder/AdvancedPageBuilderSettings.vue +7 -0
- package/src/Components/PageBuilder/DropdownsPlusToggles/OptionsDropdown.vue +165 -110
- package/src/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue +9 -16
- package/src/Components/PageBuilder/EditorMenu/Editables/BorderRadius.vue +18 -18
- package/src/Components/PageBuilder/EditorMenu/Editables/Borders.vue +16 -21
- package/src/Components/PageBuilder/EditorMenu/Editables/ClassEditor.vue +12 -12
- package/src/Components/PageBuilder/EditorMenu/Editables/ComponentTopMenu.vue +10 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/DeleteElement.vue +9 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/EditGetElement.vue +144 -136
- package/src/Components/PageBuilder/EditorMenu/Editables/ElementEditor.vue +9 -10
- package/src/Components/PageBuilder/EditorMenu/Editables/ImageEditor.vue +31 -27
- package/src/Components/PageBuilder/EditorMenu/Editables/LinkEditor.vue +20 -14
- package/src/Components/PageBuilder/EditorMenu/Editables/ManageBackgroundOpacity.vue +9 -10
- package/src/Components/PageBuilder/EditorMenu/Editables/ManageOpacity.vue +9 -10
- package/src/Components/PageBuilder/EditorMenu/Editables/PaddingPlusMargin.vue +16 -16
- package/src/Components/PageBuilder/EditorMenu/Editables/TextColorEditor.vue +9 -16
- package/src/Components/PageBuilder/EditorMenu/Editables/Typography.vue +22 -20
- package/src/Components/PageBuilder/EditorMenu/RightSidebarEditor.vue +25 -27
- package/src/Components/PageBuilder/NoneCustomMediaLibraryComponent.vue +3 -0
- package/src/Components/PageBuilder/NoneCustomSearchComponent.vue +91 -0
- package/src/Components/PageBuilder/PageBuilderSettings.vue +8 -0
- package/src/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue +31 -72
- package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +32 -36
- package/src/Components/Search/SearchComponents.vue +11 -199
- package/src/Components/TipTap/TipTap.vue +8 -7
- package/src/Components/TipTap/TipTapInput.vue +136 -134
- package/src/PageBuilder/PageBuilder.vue +220 -32
- package/src/composables/{PageBuilder.ts → PageBuilderClass.ts} +223 -142
- package/src/composables/usePageBuilderModal.ts +25 -0
- package/src/index.ts +8 -2
- package/src/stores/media-library.ts +1 -5
- package/src/stores/page-builder-state.ts +52 -36
- package/src/stores/user.ts +8 -6
- package/src/types/global.d.ts +6 -44
- package/src/types/index.ts +169 -0
- package/src/utils/html-elements/component.ts +88 -0
- package/src/utils/html-elements/componentHelpers.ts +101 -0
- package/src/Components/Modals/PageBuilderModal.vue +0 -233
- package/src/utils/builder/html-elements/componentHelpers.ts +0 -101
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { ref, computed } from 'vue'
|
|
3
|
-
|
|
2
|
+
import { ref, computed, inject } from 'vue'
|
|
3
|
+
|
|
4
|
+
// Get stores from parent PageBuilder component
|
|
5
|
+
const pageBuilderStateStore = inject('pageBuilderStateStore')
|
|
4
6
|
|
|
5
|
-
const pageBuilderStateStore = usePageBuilderStateStore();
|
|
6
7
|
const getElement = computed(() => {
|
|
7
|
-
return pageBuilderStateStore.getElement
|
|
8
|
-
})
|
|
8
|
+
return pageBuilderStateStore.getElement
|
|
9
|
+
})
|
|
9
10
|
const getComponent = computed(() => {
|
|
10
|
-
return pageBuilderStateStore.getComponent
|
|
11
|
-
})
|
|
11
|
+
return pageBuilderStateStore.getComponent
|
|
12
|
+
})
|
|
12
13
|
const getComponents = computed(() => {
|
|
13
|
-
return pageBuilderStateStore.getComponents
|
|
14
|
-
})
|
|
15
|
-
const current = ref('element')
|
|
14
|
+
return pageBuilderStateStore.getComponents
|
|
15
|
+
})
|
|
16
|
+
const current = ref('element')
|
|
16
17
|
|
|
17
18
|
const updateCurrentTab = function (tab) {
|
|
18
|
-
current.value = tab
|
|
19
|
-
}
|
|
19
|
+
current.value = tab
|
|
20
|
+
}
|
|
20
21
|
</script>
|
|
21
22
|
|
|
22
23
|
<template>
|
|
23
24
|
<div class="my-8">
|
|
24
|
-
<div
|
|
25
|
-
class="flex items-left flex-col myPrimaryGap border-myPrimaryMediumGrayColor"
|
|
26
|
-
>
|
|
25
|
+
<div class="flex items-left flex-col myPrimaryGap border-myPrimaryMediumGrayColor">
|
|
27
26
|
<h4 class="myQuaternaryHeader">Selected HTML</h4>
|
|
28
27
|
<p class="myPrimaryParagraph text-xs">
|
|
29
|
-
Overview of Selected Element, Component, and Components. This section
|
|
30
|
-
|
|
28
|
+
Overview of Selected Element, Component, and Components. This section provides real-time
|
|
29
|
+
updates based on your HTML selection.
|
|
31
30
|
</p>
|
|
32
31
|
|
|
33
32
|
<!-- Types - start -->
|
|
@@ -35,55 +34,33 @@ const updateCurrentTab = function (tab) {
|
|
|
35
34
|
<h4 class="myPrimaryParagraph text-sm pb-2">Types</h4>
|
|
36
35
|
<div class="text-white overflow-hidden bg-gray-900 max-w-2xl">
|
|
37
36
|
<div class="flex bg-gray-800/40 ring-1 ring-white/5">
|
|
38
|
-
<div
|
|
39
|
-
class="-mb-px flex text-xs font-medium text-myPrimaryMediumGrayColor"
|
|
40
|
-
>
|
|
37
|
+
<div class="-mb-px flex text-xs font-medium text-myPrimaryMediumGrayColor">
|
|
41
38
|
<div class="px-4 py-4 text-white">Types</div>
|
|
42
39
|
</div>
|
|
43
40
|
</div>
|
|
44
41
|
<div class="px-4 pb-8 pt-4 text-white text-xs">
|
|
45
|
-
<p
|
|
46
|
-
|
|
47
|
-
class="text-xs pb-2"
|
|
48
|
-
></p>
|
|
49
|
-
<p
|
|
50
|
-
v-if="getElement !== null && getElement !== undefined"
|
|
51
|
-
class="text-xs pb-2"
|
|
52
|
-
>
|
|
42
|
+
<p v-if="getElement === null || getElement === undefined" class="text-xs pb-2"></p>
|
|
43
|
+
<p v-if="getElement !== null && getElement !== undefined" class="text-xs pb-2">
|
|
53
44
|
<span>Element type: </span>
|
|
54
45
|
<span>
|
|
55
46
|
{{ typeof getElement }}
|
|
56
47
|
</span>
|
|
57
48
|
</p>
|
|
58
49
|
|
|
59
|
-
<p
|
|
60
|
-
v-if="getComponent === null || getComponent === undefined"
|
|
61
|
-
class="text-xs pb-2"
|
|
62
|
-
>
|
|
50
|
+
<p v-if="getComponent === null || getComponent === undefined" class="text-xs pb-2">
|
|
63
51
|
<span>Component type: </span>
|
|
64
52
|
{{ JSON.stringify(getComponent) }}
|
|
65
53
|
</p>
|
|
66
|
-
<p
|
|
67
|
-
v-if="getComponent !== null && getComponent !== undefined"
|
|
68
|
-
class="text-xs pb-2"
|
|
69
|
-
>
|
|
54
|
+
<p v-if="getComponent !== null && getComponent !== undefined" class="text-xs pb-2">
|
|
70
55
|
<span>Component type: </span>
|
|
71
56
|
<span>
|
|
72
|
-
{{
|
|
73
|
-
Array.isArray(getComponent) === true
|
|
74
|
-
? 'array'
|
|
75
|
-
: typeof getComponent
|
|
76
|
-
}}
|
|
57
|
+
{{ Array.isArray(getComponent) === true ? 'array' : typeof getComponent }}
|
|
77
58
|
</span>
|
|
78
59
|
</p>
|
|
79
60
|
<p class="text-xs pb-2">
|
|
80
61
|
<span>Components: </span>
|
|
81
62
|
<span>
|
|
82
|
-
{{
|
|
83
|
-
Array.isArray(getComponents) === true
|
|
84
|
-
? 'array'
|
|
85
|
-
: typeof getComponents
|
|
86
|
-
}}
|
|
63
|
+
{{ Array.isArray(getComponents) === true ? 'array' : typeof getComponents }}
|
|
87
64
|
</span>
|
|
88
65
|
</p>
|
|
89
66
|
</div>
|
|
@@ -95,9 +72,7 @@ const updateCurrentTab = function (tab) {
|
|
|
95
72
|
<h4 class="myPrimaryParagraph text-sm pb-2">Content</h4>
|
|
96
73
|
<div class="overflow-hidden bg-gray-900 max-w-2xl">
|
|
97
74
|
<div class="flex bg-gray-800/40 ring-1 ring-white/5">
|
|
98
|
-
<div
|
|
99
|
-
class="-mb-px flex text-xs font-medium text-myPrimaryMediumGrayColor"
|
|
100
|
-
>
|
|
75
|
+
<div class="-mb-px flex text-xs font-medium text-myPrimaryMediumGrayColor">
|
|
101
76
|
<div
|
|
102
77
|
@click="updateCurrentTab('element')"
|
|
103
78
|
class="px-4 py-4 cursor-pointer"
|
|
@@ -125,45 +100,29 @@ const updateCurrentTab = function (tab) {
|
|
|
125
100
|
<div class="px-4 pb-8 pt-4 text-white text-xs break-all">
|
|
126
101
|
<div v-if="current === 'element'">
|
|
127
102
|
<div v-if="getElement">
|
|
128
|
-
<div
|
|
129
|
-
class="flex flex-col gap-4 border-b border-white mb-4 pb-4"
|
|
130
|
-
>
|
|
103
|
+
<div class="flex flex-col gap-4 border-b border-white mb-4 pb-4">
|
|
131
104
|
<p>Selected element outerHTML:</p>
|
|
132
105
|
<p class="whitespace-pre-line leading-5">
|
|
133
106
|
{{ getElement?.outerHTML }}
|
|
134
107
|
</p>
|
|
135
108
|
</div>
|
|
136
|
-
<div
|
|
137
|
-
class="flex flex-col gap-2 mt-4 border-b border-white mb-4 pb-4"
|
|
138
|
-
>
|
|
109
|
+
<div class="flex flex-col gap-2 mt-4 border-b border-white mb-4 pb-4">
|
|
139
110
|
<p>Selected element src:</p>
|
|
140
111
|
<p class="whitespace-pre-line leading-5">
|
|
141
|
-
{{
|
|
142
|
-
getElement?.src ? getElement?.src : typeof getElement?.src
|
|
143
|
-
}}
|
|
112
|
+
{{ getElement?.src ? getElement?.src : typeof getElement?.src }}
|
|
144
113
|
</p>
|
|
145
114
|
</div>
|
|
146
|
-
<div
|
|
147
|
-
class="flex flex-col gap-2 mt-4 border-b border-white mb-4 pb-4"
|
|
148
|
-
>
|
|
115
|
+
<div class="flex flex-col gap-2 mt-4 border-b border-white mb-4 pb-4">
|
|
149
116
|
<p>Selected element href:</p>
|
|
150
117
|
<p class="whitespace-pre-line leading-5">
|
|
151
|
-
{{
|
|
152
|
-
getElement?.href
|
|
153
|
-
? getElement?.href
|
|
154
|
-
: typeof getElement?.href
|
|
155
|
-
}}
|
|
118
|
+
{{ getElement?.href ? getElement?.href : typeof getElement?.href }}
|
|
156
119
|
</p>
|
|
157
120
|
</div>
|
|
158
|
-
<div
|
|
159
|
-
class="flex flex-col gap-2 mt-4 border-b border-white mb-4 pb-4"
|
|
160
|
-
>
|
|
121
|
+
<div class="flex flex-col gap-2 mt-4 border-b border-white mb-4 pb-4">
|
|
161
122
|
<p>Selected element class:</p>
|
|
162
123
|
<p class="whitespace-pre-line leading-5">
|
|
163
124
|
{{
|
|
164
|
-
getElement?.classList
|
|
165
|
-
? getElement?.classList
|
|
166
|
-
: typeof getElement?.classList
|
|
125
|
+
getElement?.classList ? getElement?.classList : typeof getElement?.classList
|
|
167
126
|
}}
|
|
168
127
|
</p>
|
|
169
128
|
</div>
|
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import SlideOverRightParent from '@/Components/PageBuilder/Slidebars/SlideOverRightParent.vue'
|
|
3
|
-
import AdvancedPageBuilderSettings from '@/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue'
|
|
4
|
-
import { ref, computed } from 'vue'
|
|
5
|
-
import fullHTMLContent from '@/utils/builder/html-doc-declaration-with-components'
|
|
6
|
-
import { usePageBuilderStateStore } from '@/stores/page-builder-state';
|
|
2
|
+
import SlideOverRightParent from '@/Components/PageBuilder/Slidebars/SlideOverRightParent.vue'
|
|
3
|
+
import AdvancedPageBuilderSettings from '@/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue'
|
|
4
|
+
import { ref, computed, onMounted, inject } from 'vue'
|
|
5
|
+
import fullHTMLContent from '@/utils/builder/html-doc-declaration-with-components'
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
// Get stores from parent PageBuilder component
|
|
8
|
+
const pageBuilderStateStore = inject('pageBuilderStateStore')
|
|
9
9
|
|
|
10
|
-
const showAdvancedSettingsSlideOverRight = ref(false)
|
|
11
|
-
const titleSettingsSlideOverRight = ref('')
|
|
12
|
-
const downloadedComponents = ref(null)
|
|
10
|
+
const showAdvancedSettingsSlideOverRight = ref(false)
|
|
11
|
+
const titleSettingsSlideOverRight = ref('')
|
|
12
|
+
const downloadedComponents = ref(null)
|
|
13
13
|
|
|
14
14
|
// handle slideover window
|
|
15
15
|
const handleAdvancedSettingsSlideOver = function () {
|
|
16
|
-
titleSettingsSlideOverRight.value = 'Advanced Settings'
|
|
17
|
-
showAdvancedSettingsSlideOverRight.value = true
|
|
18
|
-
}
|
|
16
|
+
titleSettingsSlideOverRight.value = 'Advanced Settings'
|
|
17
|
+
showAdvancedSettingsSlideOverRight.value = true
|
|
18
|
+
}
|
|
19
19
|
|
|
20
20
|
// handle slideover window
|
|
21
21
|
const settingsAdvancedSlideOverButton = function () {
|
|
22
|
-
showAdvancedSettingsSlideOverRight.value = false
|
|
23
|
-
}
|
|
22
|
+
showAdvancedSettingsSlideOverRight.value = false
|
|
23
|
+
}
|
|
24
24
|
|
|
25
25
|
const getComponents = computed(() => {
|
|
26
|
-
return pageBuilderStateStore.getComponents
|
|
27
|
-
})
|
|
26
|
+
return pageBuilderStateStore.getComponents
|
|
27
|
+
})
|
|
28
28
|
|
|
29
29
|
// generate HTML
|
|
30
30
|
const generateHTML = function (filename, HTML) {
|
|
31
|
-
const element = document.createElement('a')
|
|
31
|
+
const element = document.createElement('a')
|
|
32
32
|
element.setAttribute(
|
|
33
33
|
'href',
|
|
34
|
-
'data:text/html;charset=utf-8,' + encodeURIComponent(fullHTMLContent(HTML))
|
|
35
|
-
)
|
|
36
|
-
element.setAttribute('download', filename)
|
|
34
|
+
'data:text/html;charset=utf-8,' + encodeURIComponent(fullHTMLContent(HTML)),
|
|
35
|
+
)
|
|
36
|
+
element.setAttribute('download', filename)
|
|
37
37
|
|
|
38
|
-
element.style.display = 'none'
|
|
39
|
-
document.body.appendChild(element)
|
|
38
|
+
element.style.display = 'none'
|
|
39
|
+
document.body.appendChild(element)
|
|
40
40
|
|
|
41
|
-
element.click()
|
|
41
|
+
element.click()
|
|
42
42
|
|
|
43
|
-
document.body.removeChild(element)
|
|
44
|
-
}
|
|
43
|
+
document.body.removeChild(element)
|
|
44
|
+
}
|
|
45
45
|
|
|
46
46
|
// handle download HTML
|
|
47
47
|
const handleDownloadHTML = function () {
|
|
48
48
|
downloadedComponents.value = getComponents.value.map((component) => {
|
|
49
|
-
return component.html_code
|
|
50
|
-
})
|
|
49
|
+
return component.html_code
|
|
50
|
+
})
|
|
51
51
|
|
|
52
|
-
generateHTML('downloaded_html.html', downloadedComponents.value.join(''))
|
|
53
|
-
}
|
|
52
|
+
generateHTML('downloaded_html.html', downloadedComponents.value.join(''))
|
|
53
|
+
}
|
|
54
54
|
</script>
|
|
55
55
|
|
|
56
56
|
<template>
|
|
@@ -66,8 +66,8 @@ const handleDownloadHTML = function () {
|
|
|
66
66
|
<div class="flex items-left flex-col gap-1">
|
|
67
67
|
<h3 class="myQuaternaryHeader">Advanced Settings</h3>
|
|
68
68
|
<p class="myPrimaryParagraph text-xs">
|
|
69
|
-
Manage advanced settings here. Like an overview of Selected Element,
|
|
70
|
-
|
|
69
|
+
Manage advanced settings here. Like an overview of Selected Element, Component, and
|
|
70
|
+
Components in real-time.
|
|
71
71
|
</p>
|
|
72
72
|
</div>
|
|
73
73
|
<div class="mt-4">
|
|
@@ -88,11 +88,7 @@ const handleDownloadHTML = function () {
|
|
|
88
88
|
<p class="myPrimaryParagraph text-xs">Download current page layout.</p>
|
|
89
89
|
</div>
|
|
90
90
|
<div class="mt-4">
|
|
91
|
-
<button
|
|
92
|
-
@click="handleDownloadHTML"
|
|
93
|
-
type="button"
|
|
94
|
-
class="myPrimaryButton text-xs"
|
|
95
|
-
>
|
|
91
|
+
<button @click="handleDownloadHTML" type="button" class="myPrimaryButton text-xs">
|
|
96
92
|
Download HTML file
|
|
97
93
|
</button>
|
|
98
94
|
</div>
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import Modal from '@/Components/Modals/Modal.vue'
|
|
3
|
-
import
|
|
4
|
-
import componentHelpers from '@/utils/builder/html-elements/componentHelpers'
|
|
5
|
-
import PageBuilder from '@/composables/PageBuilder.ts'
|
|
6
|
-
import SmallUniversalSpinner from '@/Components/Loaders/SmallUniversalSpinner.vue'
|
|
7
|
-
import { usePageBuilderStateStore } from '@/stores/page-builder-state'
|
|
8
|
-
import { useMediaLibraryStore } from '@/stores/media-library'
|
|
3
|
+
import NoneCustomSearchComponent from '@/Components/PageBuilder/NoneCustomSearchComponent.vue'
|
|
9
4
|
|
|
10
|
-
const mediaLibraryStore = useMediaLibraryStore()
|
|
11
|
-
const pageBuilderStateStore = usePageBuilderStateStore()
|
|
12
5
|
const props = defineProps({
|
|
13
6
|
firstButtonText: {
|
|
14
7
|
required: true,
|
|
@@ -21,6 +14,10 @@ const props = defineProps({
|
|
|
21
14
|
default: false,
|
|
22
15
|
required: true,
|
|
23
16
|
},
|
|
17
|
+
CustomSearchComponent: {
|
|
18
|
+
type: Object,
|
|
19
|
+
default: null,
|
|
20
|
+
},
|
|
24
21
|
})
|
|
25
22
|
const emit = defineEmits(['firstModalButtonSearchComponentsFunction'])
|
|
26
23
|
|
|
@@ -28,81 +25,6 @@ const emit = defineEmits(['firstModalButtonSearchComponentsFunction'])
|
|
|
28
25
|
const firstButton = function () {
|
|
29
26
|
emit('firstModalButtonSearchComponentsFunction')
|
|
30
27
|
}
|
|
31
|
-
|
|
32
|
-
const search_query = ref('')
|
|
33
|
-
const categorySelected = ref({ name: 'Components', id: null })
|
|
34
|
-
|
|
35
|
-
const handlecategorySelected = function (category) {
|
|
36
|
-
categorySelected.value = category
|
|
37
|
-
}
|
|
38
|
-
const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
|
|
39
|
-
|
|
40
|
-
const getFetchedComponents = computed(() => {
|
|
41
|
-
return pageBuilderStateStore.getFetchedComponents
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
const getComponentArrayAddMethod = computed(() => {
|
|
45
|
-
return pageBuilderStateStore.getComponentArrayAddMethod
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
const handleDropComponent = async function (componentObject) {
|
|
49
|
-
await nextTick()
|
|
50
|
-
const clonedComponent = pageBuilder.cloneCompObjForDOMInsertion({
|
|
51
|
-
html_code: componentObject.html_code,
|
|
52
|
-
id: componentObject.id,
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
await nextTick()
|
|
56
|
-
|
|
57
|
-
pageBuilderStateStore.setPushComponents({
|
|
58
|
-
component: clonedComponent,
|
|
59
|
-
componentArrayAddMethod: getComponentArrayAddMethod.value,
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
await nextTick()
|
|
63
|
-
pageBuilder.setEventListenersForElements()
|
|
64
|
-
|
|
65
|
-
// Close modal
|
|
66
|
-
firstButton()
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const handleAddHelperComponent = async function (helperComponentObject) {
|
|
70
|
-
await nextTick()
|
|
71
|
-
const clonedComponent = pageBuilder.cloneCompObjForDOMInsertion({
|
|
72
|
-
html_code: helperComponentObject.html_code,
|
|
73
|
-
id: helperComponentObject.id,
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
await nextTick()
|
|
77
|
-
|
|
78
|
-
pageBuilderStateStore.setPushComponents({
|
|
79
|
-
component: clonedComponent,
|
|
80
|
-
componentArrayAddMethod: getComponentArrayAddMethod.value,
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
await nextTick()
|
|
84
|
-
pageBuilder.setEventListenersForElements()
|
|
85
|
-
|
|
86
|
-
// Close modal
|
|
87
|
-
firstButton()
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const fetchComponents = function (page) {
|
|
91
|
-
//remember old search value while paginating
|
|
92
|
-
if (getFetchedComponents.value?.fetchedData?.oldInput?.search_query) {
|
|
93
|
-
search_query.value = getFetchedComponents.value?.fetchedData?.oldInput?.search_query
|
|
94
|
-
}
|
|
95
|
-
//
|
|
96
|
-
pageBuilderStateStore.setLoadComponents({
|
|
97
|
-
page: page,
|
|
98
|
-
search_query: search_query.value,
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
//
|
|
103
|
-
onMounted(async () => {
|
|
104
|
-
fetchComponents(1)
|
|
105
|
-
})
|
|
106
28
|
</script>
|
|
107
29
|
|
|
108
30
|
<template>
|
|
@@ -125,124 +47,14 @@ onMounted(async () => {
|
|
|
125
47
|
</div>
|
|
126
48
|
|
|
127
49
|
<div class="p-4">
|
|
128
|
-
<!--
|
|
129
|
-
<
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
</template>
|
|
134
|
-
|
|
135
|
-
<!-- -->
|
|
136
|
-
|
|
137
|
-
<!-- Loading # start -->
|
|
138
|
-
<template v-if="getFetchedComponents && getFetchedComponents.isLoading">
|
|
139
|
-
<SmallUniversalSpinner
|
|
140
|
-
class="h-40"
|
|
141
|
-
width="w-6"
|
|
142
|
-
height="h-6"
|
|
143
|
-
border="border-4"
|
|
144
|
-
></SmallUniversalSpinner>
|
|
145
|
-
</template>
|
|
146
|
-
|
|
147
|
-
<!-- Actual data # start -->
|
|
148
|
-
<template v-if="!getFetchedComponents.isError && !getFetchedComponents.isLoading">
|
|
149
|
-
<div class="flex gap-2 flex-wrap">
|
|
150
|
-
<button
|
|
151
|
-
@click="handlecategorySelected({ name: 'Components', id: null })"
|
|
152
|
-
class="myPrimaryTag font-medium"
|
|
153
|
-
>
|
|
154
|
-
Components
|
|
155
|
-
</button>
|
|
156
|
-
<button
|
|
157
|
-
@click="handlecategorySelected({ name: 'HTML Elements', id: null })"
|
|
158
|
-
class="myPrimaryTag font-medium"
|
|
159
|
-
>
|
|
160
|
-
HTML Elements
|
|
161
|
-
</button>
|
|
162
|
-
</div>
|
|
163
|
-
|
|
164
|
-
<div class="h-full flex md:flex-row flex-col myPrimaryGap mt-2 p-2 overflow-y-scroll">
|
|
165
|
-
<section class="md:w-4/6">
|
|
166
|
-
<template v-if="categorySelected && categorySelected.name === 'Components'">
|
|
167
|
-
<div
|
|
168
|
-
class="overflow-scroll min-h-[25rem] max-h-[25rem] grid myPrimaryGap md:grid-cols-2 grid-cols-2 w-full myPrimaryGap px-2 p-4 border border-myPrimaryLightGrayColor rounded-lg"
|
|
169
|
-
>
|
|
170
|
-
<div
|
|
171
|
-
class="overflow-hidden whitespace-pre-line flex-1 h-auto rounded-lg border border-gray-200 lg:py-10 py-8 px-2"
|
|
172
|
-
v-for="component in getFetchedComponents &&
|
|
173
|
-
getFetchedComponents.fetchedData &&
|
|
174
|
-
getFetchedComponents.fetchedData.components &&
|
|
175
|
-
Array.isArray(getFetchedComponents.fetchedData.components.data) &&
|
|
176
|
-
getFetchedComponents.fetchedData.components.data"
|
|
177
|
-
:key="component.id"
|
|
178
|
-
>
|
|
179
|
-
<div class="relative">
|
|
180
|
-
<template v-if="component && component.cover_image">
|
|
181
|
-
<img
|
|
182
|
-
:src="component.cover_image"
|
|
183
|
-
alt="placeholder"
|
|
184
|
-
class="max-h-72 cursor-pointer object-contain bg-white mx-auto"
|
|
185
|
-
@click="handleDropComponent(component)"
|
|
186
|
-
/>
|
|
187
|
-
</template>
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
</div>
|
|
191
|
-
</template>
|
|
192
|
-
<template v-if="categorySelected && categorySelected.name === 'HTML Elements'">
|
|
193
|
-
<div
|
|
194
|
-
class="overflow-scroll min-h-[25rem] max-h-[25rem] px-2 p-4 border border-myPrimaryLightGrayColor rounded-lg"
|
|
195
|
-
>
|
|
196
|
-
<div class="flex gap-4 flex-wrap w-full">
|
|
197
|
-
<!-- Unique HTML Component # start -->
|
|
198
|
-
<div v-for="helperComponent in componentHelpers" :key="helperComponent.title">
|
|
199
|
-
<div class="flex justify-left items-center gap-4 text-xs font-medium">
|
|
200
|
-
<button
|
|
201
|
-
@click="handleAddHelperComponent(helperComponent)"
|
|
202
|
-
type="button"
|
|
203
|
-
class="mySecondaryButton"
|
|
204
|
-
>
|
|
205
|
-
<span class="material-symbols-outlined text-sm"> add </span>
|
|
206
|
-
<span>
|
|
207
|
-
{{ helperComponent.title }}
|
|
208
|
-
</span>
|
|
209
|
-
</button>
|
|
210
|
-
</div>
|
|
211
|
-
</div>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
</template>
|
|
215
|
-
</section>
|
|
216
|
-
<aside
|
|
217
|
-
class="md:w-2/6 overflow-scroll min-h-[30rem] max-h-[30rem] w-full border rounded-lg py-4 px-2"
|
|
218
|
-
>
|
|
219
|
-
<div class="flex gap-4 flex-wrap w-full">
|
|
220
|
-
<!-- Unique HTML Component # start -->
|
|
221
|
-
<div v-for="helperComponent in componentHelpers" :key="helperComponent.title">
|
|
222
|
-
<div class="flex justify-left items-center gap-4 text-xs font-medium">
|
|
223
|
-
<button
|
|
224
|
-
@click="handleAddHelperComponent(helperComponent)"
|
|
225
|
-
type="button"
|
|
226
|
-
class="mySecondaryButton"
|
|
227
|
-
>
|
|
228
|
-
<span class="material-symbols-outlined text-sm"> add </span>
|
|
229
|
-
<span>
|
|
230
|
-
{{ helperComponent.title }}
|
|
231
|
-
</span>
|
|
232
|
-
</button>
|
|
233
|
-
</div>
|
|
234
|
-
</div>
|
|
235
|
-
</div>
|
|
236
|
-
</aside>
|
|
237
|
-
</div>
|
|
238
|
-
</template>
|
|
239
|
-
<!-- Actual data # start -->
|
|
50
|
+
<!-- Only show custom search component if provided -->
|
|
51
|
+
<div v-if="CustomSearchComponent" class="border border-gray-200 rounded-lg p-4">
|
|
52
|
+
<component :is="CustomSearchComponent" />
|
|
53
|
+
</div>
|
|
54
|
+
<div v-else><NoneCustomSearchComponent /></div>
|
|
240
55
|
</div>
|
|
241
56
|
</div>
|
|
242
|
-
<div
|
|
243
|
-
v-if="!getFetchedComponents.isError"
|
|
244
|
-
class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center"
|
|
245
|
-
>
|
|
57
|
+
<div class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center">
|
|
246
58
|
<div class="sm:w-3/6 w-full px-2 my-2 flex gap-2 justify-end">
|
|
247
59
|
<button
|
|
248
60
|
v-if="firstButtonText"
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { useMediaLibraryStore } from '@/stores/media-library'
|
|
2
|
+
import { inject } from 'vue'
|
|
3
|
+
import PageBuilderClass from '@/composables/PageBuilderClass.ts'
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
const pageBuilderStateStore =
|
|
8
|
-
const
|
|
5
|
+
// Get stores from parent PageBuilder component
|
|
6
|
+
const pageBuilderStateStore = inject('pageBuilderStateStore')
|
|
7
|
+
const mediaLibraryStore = inject('mediaLibraryStore')
|
|
8
|
+
|
|
9
|
+
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
|
|
9
10
|
</script>
|
|
10
11
|
|
|
11
12
|
<template>
|
|
12
13
|
<div>
|
|
13
14
|
<div class="blockease-linear duration-200 block ease-linear">
|
|
14
|
-
<template v-if="
|
|
15
|
+
<template v-if="pageBuilderClass.selectedElementIsValidText()">
|
|
15
16
|
<div
|
|
16
17
|
class="border-t border-myPrimaryLightGrayColor flex flex-row justify-between items-center pl-3 pr-3 py-5 duration-200 hover:bg-myPrimaryLightGrayColor"
|
|
17
18
|
>
|