diff --git a/public/widgets/embed-min.js b/public/widgets/embed-min.js new file mode 100644 index 0000000..9315106 --- /dev/null +++ b/public/widgets/embed-min.js @@ -0,0 +1,20 @@ +!(function (n, e) { + if (typeof document !== 'undefined') { + const e = document.head || document.getElementsByTagName('head')[0]; const t = document.createElement('style') + t.type = 'text/css', e.appendChild(t), t.styleSheet ? t.styleSheet.cssText = n : t.appendChild(document.createTextNode(n)) + } + }('.nf-main {\n position: fixed;\n width: 100%;\n height: 100vh;\n top: 0px;\n bottom: 0px;\n left: 0px;\n right: 0px;\n z-index: 500;\n pointer-events: none;\n }\n .nf-main .nf-emoji {\n pointer-events: auto;\n width:60px;\n height: 60px;\n display: flex;\n align-items:center;\n justify-content:center;\n text-align: center;\n background-color: #3B82F6;\n padding: 8px 10px;\n border: none;\n cursor: pointer;\n position: fixed;\n bottom: 23px;\n right: 28px;\n border-radius: 100%;\n z-index: 999\n }\n .nf-main.nf-left .nf-emoji{\n left: 28px !important;\n right: inherit !important\n }\n .nf-main .nf-emoji .nf-emoji-icon, .nf-main .nf-emoji .nf-emoji-icon-close{\n font-size: 30px;\n color:white;\n }\n .nf-main .nf-emoji .nf-emoji-icon-close {\n display: none;\n }\n .nf-main.open .nf-emoji .nf-emoji-icon{\n display: none !important\n }\n .nf-main.open .nf-emoji .nf-emoji-icon-close{\n display: block !important\n }\n .nf-main .nf-popup {\n\n display: flex;\n align-items: end;\n flex-direction: column-reverse;\n align-content: flex-end;\n padding: 20px;\n padding-bottom: 100px;\n width: 100%;\n height: 100vh;\n visibility: hidden;\n opacity:0; transition:\n opacity 0.2s, 0.2s ease-in-out;\n transform: translateY(30px);\n }\n .nf-main.open .nf-popup {\n visibility: visible !important;\n opacity: 1;\n transform: translateY(0px);\n }\n .nf-main .nf-popup iframe {\n width: 100%;\n pointer-events: auto;\n z-index: 999!important;\n bottom: 100px;\n right: 20px;\n height: 450px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 6px 6px 0 rgba(0,0,0,.02),0 8px 24px 0 rgba(0,0,0,.12)!important\n }\n .nf-main.nf-left .nf-popup {\n align-items: start !important;\n }')), (function () { + const n = JSON.parse(document.currentScript.getAttribute('data-nf')) + let e = n?.formurl || null + if (window.location !== window.parent.location || window.frameElement || !e) return !1 + e = e + (e.indexOf('?') === -1 ? '?' : '&') + 'popup=true' + const t = n?.emoji || '💬'; const i = n?.position === 'left' ? 'nf-left' : ''; const o = n?.bgcolor || '#3B82F6' + const a = n?.width || 500; const r = document.body.querySelector('.nf-main') + r && r.remove() + const p = document.createElement('div') + p.className = `nf-main ${i}`, p.innerHTML = `
` + p.querySelector('iframe').style.maxWidth = `${a}px` + const s = document.createElement('div') + s.className = 'nf-emoji', s.role = 'button', s.style.backgroundColor = `${o}`, s.innerHTML = `${t}\n \n\n`, s.onclick = () => { p.classList.toggle('open') }, p.appendChild(s), document.body.appendChild(p) + }()) + \ No newline at end of file diff --git a/public/widgets/embed.js b/public/widgets/embed.js new file mode 100644 index 0000000..825da8a --- /dev/null +++ b/public/widgets/embed.js @@ -0,0 +1,139 @@ +/** + * OpenForms Embed, allowing you to add a popup form to your website. + * All changes to this file should be followed by an update of the minified version (embed-min.js) + */ +!(function () { + !(function (e, t) { + if (e && typeof document !== 'undefined') { + const head = document.head || document.getElementsByTagName('head')[0] + const styleEl = document.createElement('style') + styleEl.type = 'text/css', head.appendChild(styleEl), styleEl.styleSheet ? styleEl.styleSheet.cssText = e : styleEl.appendChild(document.createTextNode(e)) + } + } + (`.nf-main { + position: fixed; + width: 100%; + height: 100vh; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + z-index: 500; + pointer-events: none; + } + .nf-main .nf-emoji { + pointer-events: auto; + width:60px; + height: 60px; + display: flex; + align-items:center; + justify-content:center; + text-align: center; + background-color: #3B82F6; + padding: 8px 10px; + border: none; + cursor: pointer; + position: fixed; + bottom: 23px; + right: 28px; + border-radius: 100%; + z-index: 999 + } + .nf-main.nf-left .nf-emoji{ + left: 28px !important; + right: inherit !important + } + .nf-main .nf-emoji .nf-emoji-icon, .nf-main .nf-emoji .nf-emoji-icon-close{ + font-size: 30px; + color:white; + } + .nf-main .nf-emoji .nf-emoji-icon-close { + display: none; + } + .nf-main.open .nf-emoji .nf-emoji-icon{ + display: none !important + } + .nf-main.open .nf-emoji .nf-emoji-icon-close{ + display: block !important + } + .nf-main .nf-popup { + + display: flex; + align-items: end; + flex-direction: column-reverse; + align-content: flex-end; + padding: 20px; + padding-bottom: 100px; + width: 100%; + height: 100vh; + visibility: hidden; + opacity:0; transition: + opacity 0.2s, 0.2s ease-in-out; + transform: translateY(30px); + } + .nf-main.open .nf-popup { + visibility: visible !important; + opacity: 1; + transform: translateY(0px); + } + .nf-main .nf-popup iframe { + width: 100%; + pointer-events: auto; + z-index: 999!important; + bottom: 100px; + right: 20px; + height: 450px; + background: #fff; + border-radius: 12px; + box-shadow: 0 6px 6px 0 rgba(0,0,0,.02),0 8px 24px 0 rgba(0,0,0,.12)!important + } + .nf-main.nf-left .nf-popup { + align-items: start !important; + }`)) +}()); + +(function () { + const nfData = JSON.parse(document.currentScript.getAttribute('data-nf')) + let formUrl = nfData?.formurl || null + if (window.location !== window.parent.location || window.frameElement || !formUrl) { + // Do nothing + return false + } + + // Add popup param to formUrl + formUrl = formUrl + (formUrl.indexOf('?') === -1 ? '?' : '&') + 'popup=true' + + // Settings + const emoji = nfData?.emoji || '💬' + const position = (nfData?.position === 'left') ? 'nf-left' : '' + const emojiBgColor = nfData?.bgcolor || '#3B82F6' + const width = nfData?.width || 500 + + // Remove old popup, if there + const oldEl = document.body.querySelector('.nf-main') + if (oldEl) { + oldEl.remove() + } + + // Iframe popup + const mainDiv = document.createElement('div') + mainDiv.className = `nf-main ${position}` + mainDiv.innerHTML = `
` + const iframe = mainDiv.querySelector('iframe') + iframe.style.maxWidth = `${width}px` + + // Emoji button + const emojiButton = document.createElement('div') + emojiButton.className = 'nf-emoji' + emojiButton.role = 'button' + emojiButton.style.backgroundColor = `${emojiBgColor}` + emojiButton.innerHTML = `${emoji} + + +` + emojiButton.onclick = () => { mainDiv.classList.toggle('open') } + mainDiv.appendChild(emojiButton) + + // Append to the body + document.body.appendChild(mainDiv) +})() diff --git a/resources/js/components/open/forms/OpenCompleteForm.vue b/resources/js/components/open/forms/OpenCompleteForm.vue index 4e96762..fff4dc9 100644 --- a/resources/js/components/open/forms/OpenCompleteForm.vue +++ b/resources/js/components/open/forms/OpenCompleteForm.vue @@ -1,6 +1,6 @@ @@ -24,6 +26,7 @@ import UrlFormPrefill from '../../../components/pages/forms/show/UrlFormPrefill. import RegenerateFormLink from '../../../components/pages/forms/show/RegenerateFormLink.vue' import SeoMeta from '../../../mixins/seo-meta.js' import AdvancedFormUrlSettings from '../../../components/open/forms/components/AdvancedFormUrlSettings.vue' +import EmbedFormAsPopupModal from '../../../components/pages/forms/show/EmbedFormAsPopupModal.vue' export default { components: { @@ -32,7 +35,8 @@ export default { FormQrCode, UrlFormPrefill, RegenerateFormLink, - AdvancedFormUrlSettings + AdvancedFormUrlSettings, + EmbedFormAsPopupModal }, props: { form: { type: Object, required: true } diff --git a/vite.config.js b/vite.config.js index 83630dd..daf4732 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,8 +4,8 @@ import vue from '@vitejs/plugin-vue2' export default defineConfig({ esbuild: { - minify: false, - minifySyntax: false + minify: true, + minifySyntax: true }, plugins: [ laravel({