@myissue/vue-website-page-builder 3.2.16 → 3.2.21
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 +1 -1
- package/dist/vue-website-page-builder.css +1 -1
- package/dist/vue-website-page-builder.js +1302 -1308
- package/dist/vue-website-page-builder.umd.cjs +23 -23
- package/package.json +1 -1
- package/src/App.vue +1 -1
- package/src/Components/{Search/SearchComponents.vue → Modals/BuilderComponents.vue} +3 -3
- package/src/Components/Modals/MediaLibraryModal.vue +3 -26
- package/src/Components/PageBuilder/DefaultComponents/DefaultMediaLibraryComponent.vue +10 -0
- package/src/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue +1 -1
- package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +28 -2
- package/src/DemoComponents/DemoBuilderComponents.vue +5 -0
- package/src/DemoComponents/DemoMediaLibraryComponent.vue +8 -0
- package/src/DemoComponents/DemoUnsplash.vue +351 -0
- package/src/{Components/Homepage → DemoComponents}/HomeSection.vue +42 -20
- package/src/DemoComponents/html.json +47 -0
- package/src/PageBuilder/PageBuilder.vue +3 -3
- package/src/composables/PageBuilderClass.ts +10 -4
- package/src/Components/PageBuilder/DemoContent/NoneCustomMediaLibraryComponent.vue +0 -3
- /package/src/Components/PageBuilder/{DemoContent/NoneCustomBuilderComponents.vue → DefaultComponents/DefaultBuilderComponents.vue} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myissue/vue-website-page-builder",
|
|
3
|
-
"version": "v3.2.
|
|
3
|
+
"version": "v3.2.21",
|
|
4
4
|
"description": "🚧 DEVELOPMENT VERSION - Vue.js page builder component with drag & drop functionality. Not ready for production use.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/vue-website-page-builder.umd.cjs",
|
package/src/App.vue
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import ModalBuilder from '../Modals/ModalBuilder.vue'
|
|
3
|
-
import
|
|
3
|
+
import DefaultBuilderComponents from '../PageBuilder/DefaultComponents/DefaultBuilderComponents.vue'
|
|
4
4
|
|
|
5
5
|
defineProps({
|
|
6
6
|
firstButtonText: {
|
|
@@ -54,10 +54,10 @@ const firstButtonBuilder = function () {
|
|
|
54
54
|
|
|
55
55
|
<div class="p-4">
|
|
56
56
|
<!-- Only show custom search component if provided -->
|
|
57
|
-
<div v-if="CustomBuilderComponents"
|
|
57
|
+
<div v-if="CustomBuilderComponents">
|
|
58
58
|
<component :is="CustomBuilderComponents" />
|
|
59
59
|
</div>
|
|
60
|
-
<div v-else><
|
|
60
|
+
<div v-else><DefaultBuilderComponents /></div>
|
|
61
61
|
</div>
|
|
62
62
|
</div>
|
|
63
63
|
<div class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center">
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
TransitionRoot,
|
|
8
8
|
} from '@headlessui/vue'
|
|
9
9
|
import { provide } from 'vue'
|
|
10
|
-
import
|
|
10
|
+
import DefaultMediaLibraryComponent from '../PageBuilder/DefaultComponents/DefaultMediaLibraryComponent.vue'
|
|
11
11
|
|
|
12
12
|
const props = defineProps({
|
|
13
13
|
title: {
|
|
@@ -94,7 +94,7 @@ provide('closeMediaLibraryModal', closeMediaLibraryModal)
|
|
|
94
94
|
leave-to="opacity-0 scale-95"
|
|
95
95
|
>
|
|
96
96
|
<div
|
|
97
|
-
class="font-sans relative max-h-[
|
|
97
|
+
class="font-sans relative min-h-[55rem] max-h-[55rem] my-2 inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:align-middle sm:max-w-7xl sm:w-full"
|
|
98
98
|
>
|
|
99
99
|
<div
|
|
100
100
|
class="flex gap-2 justify-between items-center border-b border-gray-200 p-4 mb-2"
|
|
@@ -121,32 +121,9 @@ provide('closeMediaLibraryModal', closeMediaLibraryModal)
|
|
|
121
121
|
<component :is="customMediaComponent" />
|
|
122
122
|
</div>
|
|
123
123
|
<div v-else>
|
|
124
|
-
<
|
|
124
|
+
<DefaultMediaLibraryComponent />
|
|
125
125
|
</div>
|
|
126
126
|
</div>
|
|
127
|
-
|
|
128
|
-
<!-- Actions footer to ensure focusable elements -->
|
|
129
|
-
<div
|
|
130
|
-
v-if="firstButtonText || secondButtonText"
|
|
131
|
-
class="bg-slate-50 px-4 py-3 flex justify-end gap-2"
|
|
132
|
-
>
|
|
133
|
-
<button
|
|
134
|
-
v-if="firstButtonText"
|
|
135
|
-
@click="firstButton"
|
|
136
|
-
class="mySecondaryButton focus:ring-2 focus:ring-blue-500"
|
|
137
|
-
type="button"
|
|
138
|
-
>
|
|
139
|
-
{{ firstButtonText }}
|
|
140
|
-
</button>
|
|
141
|
-
<button
|
|
142
|
-
v-if="secondButtonText"
|
|
143
|
-
@click="secondButton"
|
|
144
|
-
class="myPrimaryButton focus:ring-2 focus:ring-blue-500"
|
|
145
|
-
type="button"
|
|
146
|
-
>
|
|
147
|
-
{{ secondButtonText }}
|
|
148
|
-
</button>
|
|
149
|
-
</div>
|
|
150
127
|
</div>
|
|
151
128
|
</TransitionChild>
|
|
152
129
|
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<p class="myPrimaryParagraph">
|
|
4
|
+
Provide your own Media Library Component to integrate a custom media picker into the Page
|
|
5
|
+
Builder.
|
|
6
|
+
<br />
|
|
7
|
+
This allows full control over how media is selected and inserted.
|
|
8
|
+
</p>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
@@ -174,7 +174,7 @@ const updateCurrentTab = function (tab) {
|
|
|
174
174
|
|
|
175
175
|
<p class="whitespace-pre-line leading-5 mt-4">
|
|
176
176
|
Component Title:
|
|
177
|
-
{{
|
|
177
|
+
{{ component?.title }}
|
|
178
178
|
</p>
|
|
179
179
|
<p class="whitespace-pre-line leading-5 mt-4">
|
|
180
180
|
Component HTML:<br />
|
|
@@ -90,7 +90,7 @@ const handleDownloadHTML = function () {
|
|
|
90
90
|
type="button"
|
|
91
91
|
class="myPrimaryButton text"
|
|
92
92
|
>
|
|
93
|
-
|
|
93
|
+
Advanced Settings
|
|
94
94
|
</button>
|
|
95
95
|
</div>
|
|
96
96
|
</div>
|
|
@@ -593,6 +593,32 @@ const handleDownloadHTML = function () {
|
|
|
593
593
|
</button>
|
|
594
594
|
</div>
|
|
595
595
|
</div>
|
|
596
|
+
<!-- Download Layout HTML - end -->
|
|
597
|
+
|
|
598
|
+
<!-- Congig - start -->
|
|
599
|
+
<div class="mt-4 mb-4 py-8 border-b border-myPrimbryLightGrayColor">
|
|
600
|
+
<div class="flex items-left flex-col gap-1">
|
|
601
|
+
<h3 class="myQuaternaryHeader">Complete Configuration Overview</h3>
|
|
602
|
+
<p class="myPrimaryParagraph text-xs">
|
|
603
|
+
omplete configuration object currently used by the Page Builder. It includes information
|
|
604
|
+
about the user, form behavior, branding settings, and other context-specific data needed
|
|
605
|
+
for rendering and managing the builder environment.
|
|
606
|
+
</p>
|
|
607
|
+
</div>
|
|
608
|
+
|
|
609
|
+
<div class="mt-4 whitespace-pre-wrap text-white overflow-hidden bg-gray-900 max-w-2xl">
|
|
610
|
+
<div class="flex bg-gray-800/40 ring-1 ring-white/5">
|
|
611
|
+
<div class="-mb-px flex text-xs font-medium text-myPrimaryMediumGrayColor">
|
|
612
|
+
<div class="px-4 py-4 text-white">Configuration</div>
|
|
613
|
+
</div>
|
|
614
|
+
</div>
|
|
615
|
+
<div class="px-4 pb-8 pt-4 text-white text-xs break-all">
|
|
616
|
+
<p class="myPrimaryParagraph text-xs text-white">
|
|
617
|
+
config: {{ JSON.stringify(getConfigPageBuilder, null, 4) }}
|
|
618
|
+
</p>
|
|
619
|
+
</div>
|
|
620
|
+
</div>
|
|
621
|
+
</div>
|
|
622
|
+
<!-- Config - end -->
|
|
596
623
|
</div>
|
|
597
|
-
<!-- Download Layout HTML - end -->
|
|
598
624
|
</template>
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, onMounted } from 'vue'
|
|
3
|
+
const unsplashKey = import.meta.env.VITE_UNSPLASH_KEY
|
|
4
|
+
import { usePageBuilderModal } from '../composables/usePageBuilderModal'
|
|
5
|
+
import PageBuilderClass from '../composables/PageBuilderClass.ts'
|
|
6
|
+
import { sharedPageBuilderStore } from '../stores/shared-store'
|
|
7
|
+
|
|
8
|
+
const { closeMediaLibraryModal } = usePageBuilderModal()
|
|
9
|
+
|
|
10
|
+
const pageBuilderStateStore = sharedPageBuilderStore
|
|
11
|
+
|
|
12
|
+
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
|
|
13
|
+
|
|
14
|
+
const getIsLoading = ref(false)
|
|
15
|
+
const getSearchTerm = ref('')
|
|
16
|
+
const getCurrentPageNumber = ref(1)
|
|
17
|
+
const getOrientationValue = ref('')
|
|
18
|
+
const getCurrentImage = ref('')
|
|
19
|
+
const getCurrentUser = ref('')
|
|
20
|
+
|
|
21
|
+
const getUnsplashImages = ref([])
|
|
22
|
+
|
|
23
|
+
const fetchUnsplash = async function () {
|
|
24
|
+
getIsLoading.value = true
|
|
25
|
+
|
|
26
|
+
localStorage.setItem('unsplash-query', getSearchTerm.value)
|
|
27
|
+
localStorage.setItem('unsplash-page', getCurrentPageNumber.value)
|
|
28
|
+
|
|
29
|
+
if (
|
|
30
|
+
getUnsplashImages.value &&
|
|
31
|
+
Array.isArray(getUnsplashImages.value.results) &&
|
|
32
|
+
getUnsplashImages.value.results.length === 0
|
|
33
|
+
) {
|
|
34
|
+
getCurrentPageNumber.value = 1
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const orientationParam = getOrientationValue.value
|
|
38
|
+
? `&orientation=${getOrientationValue.value}`
|
|
39
|
+
: ''
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(
|
|
43
|
+
`https://api.unsplash.com/search/photos?page=${getCurrentPageNumber.value}&per_page=24&query=${getSearchTerm.value || 'magazine'}${orientationParam}`,
|
|
44
|
+
{
|
|
45
|
+
headers: {
|
|
46
|
+
'Accept-Version': 'v1',
|
|
47
|
+
Authorization: `Client-ID ${unsplashKey}`,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const images = await response.json()
|
|
57
|
+
getUnsplashImages.value = images
|
|
58
|
+
getIsLoading.value = false
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error('Error fetching Unsplash images:', error)
|
|
61
|
+
} finally {
|
|
62
|
+
getIsLoading.value = false
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const handleImageClick = function (data) {
|
|
66
|
+
getCurrentImage.value = data.url ? data.url : ''
|
|
67
|
+
getCurrentUser.value = data.user ? data.user : ''
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const searchByOrientation = function (orientationParameter) {
|
|
71
|
+
// check if search term length is more than 0
|
|
72
|
+
if (getSearchTerm.value.length > 0 && getOrientationValue.value !== orientationParameter) {
|
|
73
|
+
getOrientationValue.value = orientationParameter
|
|
74
|
+
getCurrentPageNumber.value = 1
|
|
75
|
+
fetchUnsplash()
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//
|
|
79
|
+
// load images for previous page
|
|
80
|
+
const previousPage = function () {
|
|
81
|
+
fetchUnsplash()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// load images for next page
|
|
85
|
+
const nextPage = async function () {
|
|
86
|
+
fetchUnsplash()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const applySelectedImage = async function (imageURL) {
|
|
90
|
+
// Ensure the current image is set in the store with proper structure
|
|
91
|
+
pageBuilderClass.pageBuilderStateStore.setCurrentImage({
|
|
92
|
+
src: `${imageURL}`,
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
await pageBuilderClass.updateBasePrimaryImage()
|
|
96
|
+
|
|
97
|
+
closeMediaLibraryModal()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// on mounted
|
|
101
|
+
onMounted(async () => {
|
|
102
|
+
let term = ''
|
|
103
|
+
let page = 1
|
|
104
|
+
if (localStorage.getItem('unsplash-query') && localStorage.getItem('unsplash-query').length > 0) {
|
|
105
|
+
term = getSearchTerm.value = localStorage.getItem('unsplash-query')
|
|
106
|
+
page = getCurrentPageNumber.value = localStorage.getItem('unsplash-page')
|
|
107
|
+
fetchUnsplash()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
term ? getSearchTerm.value : 'Magazine'
|
|
111
|
+
page ? getCurrentPageNumber.value : 1
|
|
112
|
+
fetchUnsplash()
|
|
113
|
+
|
|
114
|
+
await fetchUnsplash()
|
|
115
|
+
})
|
|
116
|
+
</script>
|
|
117
|
+
|
|
118
|
+
<template>
|
|
119
|
+
<div>
|
|
120
|
+
<div v-if="!getIsLoading">
|
|
121
|
+
<form
|
|
122
|
+
@submit.prevent="
|
|
123
|
+
() => {
|
|
124
|
+
getCurrentPageNumber = 1
|
|
125
|
+
fetchUnsplash()
|
|
126
|
+
}
|
|
127
|
+
"
|
|
128
|
+
>
|
|
129
|
+
<label
|
|
130
|
+
for="default-search"
|
|
131
|
+
class="mb-2 text-sm font-normal text-gray-900 sr-only dark:text-gray-300"
|
|
132
|
+
>Search</label
|
|
133
|
+
>
|
|
134
|
+
|
|
135
|
+
<div class="mysearchBarWithOptions">
|
|
136
|
+
<div class="relative w-full">
|
|
137
|
+
<div class="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none">
|
|
138
|
+
<span class="material-symbols-outlined"> search </span>
|
|
139
|
+
</div>
|
|
140
|
+
<input
|
|
141
|
+
type="search"
|
|
142
|
+
id="search_query"
|
|
143
|
+
v-model="getSearchTerm"
|
|
144
|
+
class="myPrimarySearchInput"
|
|
145
|
+
autocomplete="off"
|
|
146
|
+
placeholder="Search..."
|
|
147
|
+
/>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<button
|
|
151
|
+
@click="
|
|
152
|
+
() => {
|
|
153
|
+
getCurrentPageNumber = 1
|
|
154
|
+
fetchUnsplash()
|
|
155
|
+
}
|
|
156
|
+
"
|
|
157
|
+
type="submit"
|
|
158
|
+
class="myPrimaryButton"
|
|
159
|
+
>
|
|
160
|
+
Search
|
|
161
|
+
</button>
|
|
162
|
+
</div>
|
|
163
|
+
</form>
|
|
164
|
+
<div v-if="getUnsplashImages && getUnsplashImages.results" class="mt-2">
|
|
165
|
+
<div class="flex lg:justify-between justify-end items-center gap-2 py-2 mb-1">
|
|
166
|
+
<div class="lg:flex hidden justify-left items-center gap-2">
|
|
167
|
+
<button
|
|
168
|
+
@click="searchByOrientation('landscape')"
|
|
169
|
+
type="button"
|
|
170
|
+
class="myPrimaryButton hover:bg-myPrimaryBrandColor focus:outline-none focus:ring-0"
|
|
171
|
+
:class="{
|
|
172
|
+
'bg-myPrimaryBrandColor text-white': getOrientationValue === 'landscape',
|
|
173
|
+
'': getOrientationValue !== 'landscape',
|
|
174
|
+
}"
|
|
175
|
+
>
|
|
176
|
+
Landscape
|
|
177
|
+
</button>
|
|
178
|
+
<button
|
|
179
|
+
@click="searchByOrientation('portrait')"
|
|
180
|
+
type="button"
|
|
181
|
+
class="myPrimaryButton hover:bg-myPrimaryBrandColor focus:outline-none focus:ring-0"
|
|
182
|
+
:class="{
|
|
183
|
+
'bg-myPrimaryBrandColor text-white': getOrientationValue === 'portrait',
|
|
184
|
+
'': getOrientationValue !== 'portrait',
|
|
185
|
+
}"
|
|
186
|
+
>
|
|
187
|
+
Portrait
|
|
188
|
+
</button>
|
|
189
|
+
<button
|
|
190
|
+
@click="searchByOrientation('squarish')"
|
|
191
|
+
type="button"
|
|
192
|
+
class="myPrimaryButton hover:bg-myPrimaryBrandColor focus:outline-none focus:ring-0"
|
|
193
|
+
:class="{
|
|
194
|
+
'bg-myPrimaryBrandColor text-white': getOrientationValue === 'squarish',
|
|
195
|
+
'': getOrientationValue !== 'squarish',
|
|
196
|
+
}"
|
|
197
|
+
>
|
|
198
|
+
Squarish
|
|
199
|
+
</button>
|
|
200
|
+
|
|
201
|
+
<svg
|
|
202
|
+
@click="searchByOrientation(null)"
|
|
203
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
204
|
+
fill="none"
|
|
205
|
+
viewBox="0 0 24 24"
|
|
206
|
+
stroke-width="2"
|
|
207
|
+
stroke="currentColor"
|
|
208
|
+
class="w-4 h-4 cursor-pointer"
|
|
209
|
+
>
|
|
210
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
|
|
211
|
+
</svg>
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
<nav class="flex items-center gap-2 justify-start" aria-label="Pagination">
|
|
215
|
+
<p class="myPrimaryParagraph text-xs italic">
|
|
216
|
+
Total pages {{ getUnsplashImages.total_pages }}
|
|
217
|
+
</p>
|
|
218
|
+
<p class="myPrimaryParagraph text-xs italic">Images {{ getUnsplashImages.total }}</p>
|
|
219
|
+
<div class="flex flex-1 justify-between sm:justify-end items-center gap-2">
|
|
220
|
+
<span
|
|
221
|
+
v-if="Number(getCurrentPageNumber) !== 1"
|
|
222
|
+
class="myPrimaryParagraph text-xs italic pr-2 pl-1 cursor-pointer underline"
|
|
223
|
+
@click="nextPage(Number((getCurrentPageNumber = 1)))"
|
|
224
|
+
>
|
|
225
|
+
First page
|
|
226
|
+
</span>
|
|
227
|
+
</div>
|
|
228
|
+
<button
|
|
229
|
+
v-if="Number(getCurrentPageNumber) > 1"
|
|
230
|
+
:disabled="Number(getCurrentPageNumber) < 1"
|
|
231
|
+
class="myPrimaryButton"
|
|
232
|
+
@click="previousPage(Number(getCurrentPageNumber--))"
|
|
233
|
+
>
|
|
234
|
+
{{
|
|
235
|
+
`Prev ${Number(getCurrentPageNumber) > 0 ? Number(getCurrentPageNumber) - 1 : Number(getCurrentPageNumber) - 1}`
|
|
236
|
+
}}
|
|
237
|
+
</button>
|
|
238
|
+
|
|
239
|
+
<span class="myPrimaryTag p-2.5">
|
|
240
|
+
{{ Number(getCurrentPageNumber) }}
|
|
241
|
+
</span>
|
|
242
|
+
<button
|
|
243
|
+
:disabled="Number(getCurrentPageNumber) >= getUnsplashImages.total_pages"
|
|
244
|
+
class="myPrimaryButton"
|
|
245
|
+
:class="{
|
|
246
|
+
'opacity-50': Number(getCurrentPageNumber) >= getUnsplashImages.total_pages,
|
|
247
|
+
}"
|
|
248
|
+
@click="nextPage(Number(getCurrentPageNumber++))"
|
|
249
|
+
>
|
|
250
|
+
{{
|
|
251
|
+
`Next ${Number(getCurrentPageNumber) > 0 ? Number(getCurrentPageNumber) + 1 : Number(getCurrentPageNumber) + 1}`
|
|
252
|
+
}}
|
|
253
|
+
</button>
|
|
254
|
+
</nav>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<div class="min-h-[34rem] max-h-[34rem] flex gap-6">
|
|
258
|
+
<div class="w-9/12 pr-1 rounded-lg overflow-y-auto">
|
|
259
|
+
<div class="grid md:grid-cols-4 sm:grid-cols-4 grid-cols-2 gap-2">
|
|
260
|
+
<div
|
|
261
|
+
v-for="image in getUnsplashImages.results"
|
|
262
|
+
:key="image.id"
|
|
263
|
+
@click="handleImageClick({ url: image.urls.regular, user: image.user.name })"
|
|
264
|
+
class="border border-gray-200 my-2 px-2 p-2 cursor-pointer"
|
|
265
|
+
>
|
|
266
|
+
<img
|
|
267
|
+
:alt="image.user.name"
|
|
268
|
+
class="group block w-full overflow-hidden cursor-pointer"
|
|
269
|
+
:src="image.urls.thumb"
|
|
270
|
+
/>
|
|
271
|
+
<p class="myPrimaryParagraph text-xs font-normal mt-2">By: {{ image.user.name }}</p>
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
|
|
275
|
+
<div v-if="getUnsplashImages.results.length < 1">
|
|
276
|
+
<p class="myPrimaryParagraph py-4 px-4">
|
|
277
|
+
<span v-if="getCurrentPageNumber === 1">
|
|
278
|
+
We did not find any images. Make a new search.
|
|
279
|
+
</span>
|
|
280
|
+
<span v-if="getCurrentPageNumber > 1" @click="nextPage(1)" class="myPrimaryLink">
|
|
281
|
+
No results on current page. Navigate to First Page.
|
|
282
|
+
</span>
|
|
283
|
+
</p>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
<!-- Sidebar # start -->
|
|
287
|
+
<div class="w-3/12 overflow-y-auto">
|
|
288
|
+
<template v-if="getCurrentImage">
|
|
289
|
+
<img
|
|
290
|
+
class="mx-auto block w-full object-cover object-center cursor-pointer"
|
|
291
|
+
:src="`${getCurrentImage}`"
|
|
292
|
+
alt="file"
|
|
293
|
+
/>
|
|
294
|
+
<div class="md:px-3 px-2">
|
|
295
|
+
<div>
|
|
296
|
+
<h3 class="font-normal text-gray-900">Information</h3>
|
|
297
|
+
<dl class="mt-2 border-t border-b border-gray-200 divide-y divide-gray-200">
|
|
298
|
+
<div class="py-3 flex justify-between text-sm font-normal items-center">
|
|
299
|
+
<dt class="text-gray-500">From:</dt>
|
|
300
|
+
<dd class="text-gray-900">Unsplash</dd>
|
|
301
|
+
</div>
|
|
302
|
+
<div class="py-3 flex justify-between text-sm font-normal items-center">
|
|
303
|
+
<dt class="text-gray-500">By:</dt>
|
|
304
|
+
<dd class="text-gray-900">{{ getCurrentUser }}</dd>
|
|
305
|
+
</div>
|
|
306
|
+
</dl>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
</template>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
<!-- Sidebar # end -->
|
|
313
|
+
|
|
314
|
+
<!-- Actions footer # start -->
|
|
315
|
+
<div class="px-4 py-3 flex gap-2 border-t border-gray-200 mt-4 justify-end">
|
|
316
|
+
<button
|
|
317
|
+
@click="closeMediaLibraryModal"
|
|
318
|
+
class="mySecondaryButton focus:ring-2 focus:ring-blue-500"
|
|
319
|
+
type="button"
|
|
320
|
+
>
|
|
321
|
+
Close
|
|
322
|
+
</button>
|
|
323
|
+
<button
|
|
324
|
+
v-if="getCurrentImage && typeof getCurrentImage === 'string'"
|
|
325
|
+
@click="applySelectedImage(getCurrentImage)"
|
|
326
|
+
class="myPrimaryButton focus:ring-2 focus:ring-blue-500"
|
|
327
|
+
type="button"
|
|
328
|
+
>
|
|
329
|
+
Select image
|
|
330
|
+
</button>
|
|
331
|
+
</div>
|
|
332
|
+
<!-- Actions footer # end -->
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
<div v-else>
|
|
336
|
+
<button class="sr-only">Focusable fallback</button>
|
|
337
|
+
</div>
|
|
338
|
+
<template v-if="getIsLoading">
|
|
339
|
+
<div class="flex items-center justify-center mt-4">
|
|
340
|
+
<div
|
|
341
|
+
class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]"
|
|
342
|
+
>
|
|
343
|
+
<span
|
|
344
|
+
class="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]"
|
|
345
|
+
>Loading...</span
|
|
346
|
+
>
|
|
347
|
+
</div>
|
|
348
|
+
</div>
|
|
349
|
+
</template>
|
|
350
|
+
</div>
|
|
351
|
+
</template>
|
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import FullWidthElement from '
|
|
3
|
-
import PageBuilder from '
|
|
4
|
-
import PageBuilderClass from '
|
|
5
|
-
|
|
2
|
+
import FullWidthElement from '../Components/Layouts/FullWidthElement.vue'
|
|
3
|
+
import PageBuilder from '../PageBuilder/PageBuilder.vue'
|
|
4
|
+
import PageBuilderClass from '../composables/PageBuilderClass.ts'
|
|
5
|
+
|
|
6
|
+
import DemoMediaLibraryComponent from './DemoMediaLibraryComponent.vue'
|
|
7
|
+
import DemoBuilderComponents from './DemoBuilderComponents.vue'
|
|
8
|
+
import { computed, onMounted } from 'vue'
|
|
9
|
+
import { sharedPageBuilderStore } from '../stores/shared-store'
|
|
10
|
+
import html from './html.json'
|
|
11
|
+
|
|
12
|
+
const pageBuilderStateStore = sharedPageBuilderStore
|
|
13
|
+
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
|
|
14
|
+
|
|
15
|
+
const getLocalStorageItemName = computed(() => {
|
|
16
|
+
return pageBuilderStateStore.getLocalStorageItemName
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const getComponents = computed(() => {
|
|
20
|
+
return pageBuilderStateStore.getComponents
|
|
21
|
+
})
|
|
6
22
|
|
|
7
23
|
// first button function
|
|
8
24
|
const handleButton = function () {
|
|
@@ -53,33 +69,38 @@ const features = [
|
|
|
53
69
|
]
|
|
54
70
|
|
|
55
71
|
const configPageBuilder = {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
userForPageBuilder: {
|
|
73
|
+
name: 'John Doe',
|
|
74
|
+
},
|
|
59
75
|
updateOrCreate: {
|
|
60
|
-
formType: '
|
|
76
|
+
formType: 'create',
|
|
61
77
|
formName: 'news',
|
|
62
78
|
},
|
|
63
79
|
pageBuilderLogo: {
|
|
64
80
|
src: '/logo/logo.svg',
|
|
65
81
|
},
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
resourceData: {
|
|
83
|
+
title: 'Demo Article',
|
|
84
|
+
id: 1,
|
|
85
|
+
},
|
|
86
|
+
userSettings: {
|
|
87
|
+
// theme: 'light',
|
|
88
|
+
// language: 'en',
|
|
89
|
+
// autoSave: true,
|
|
90
|
+
},
|
|
75
91
|
settings: {
|
|
76
92
|
brandColor: '#DB93B0',
|
|
77
93
|
},
|
|
78
94
|
}
|
|
79
95
|
|
|
80
|
-
const pageBuilderStateStore = sharedPageBuilderStore
|
|
81
|
-
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
|
|
82
96
|
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
|
|
97
|
+
|
|
98
|
+
onMounted(async () => {
|
|
99
|
+
if (localStorage.getItem(getLocalStorageItemName.value)) {
|
|
100
|
+
} else {
|
|
101
|
+
pageBuilderClass.loadExistingContent(JSON.stringify(html), true)
|
|
102
|
+
}
|
|
103
|
+
})
|
|
83
104
|
</script>
|
|
84
105
|
|
|
85
106
|
<template>
|
|
@@ -109,7 +130,8 @@ pageBuilderClass.setConfigPageBuilder(configPageBuilder)
|
|
|
109
130
|
</p>
|
|
110
131
|
</div>
|
|
111
132
|
<div>
|
|
112
|
-
|
|
133
|
+
<!-- :CustomBuilderComponents="DemoBuilderComponents" -->
|
|
134
|
+
<PageBuilder :CustomMediaLibraryComponent="DemoMediaLibraryComponent"></PageBuilder>
|
|
113
135
|
</div>
|
|
114
136
|
</div>
|
|
115
137
|
|