mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.6 KiB
55 lines
1.6 KiB
# frozen_string_literal: true
|
|
|
|
class EmbedScriptsController < ActionController::Metal
|
|
EMBED_SCRIPT = <<~JAVASCRIPT.freeze
|
|
const buildIframe = (element) => {
|
|
const iframe = document.createElement('iframe');
|
|
const src = element.dataset.src || element.getAttribute('src');
|
|
|
|
if (!src) return;
|
|
|
|
const url = new URL(src, window.location.href);
|
|
|
|
['email', 'name', 'phone', 'role', 'token', 'preview', 'externalId', 'completedRedirectUrl'].forEach((key) => {
|
|
const value = element.dataset[key];
|
|
|
|
if (value) url.searchParams.set(key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`), value);
|
|
});
|
|
|
|
iframe.src = url.toString();
|
|
iframe.style.width = element.dataset.width || '100%';
|
|
iframe.style.height = element.dataset.height || '700px';
|
|
iframe.style.border = element.dataset.border || '0';
|
|
iframe.allow = element.dataset.allow || 'clipboard-write; fullscreen';
|
|
iframe.title = element.dataset.title || 'DocuSeal';
|
|
|
|
element.innerHTML = '';
|
|
element.appendChild(iframe);
|
|
};
|
|
|
|
const EmbeddedBuilder = class extends HTMLElement {
|
|
connectedCallback() {
|
|
buildIframe(this);
|
|
}
|
|
};
|
|
|
|
const EmbeddedForm = class extends EmbeddedBuilder {};
|
|
|
|
if (!window.customElements.get('docuseal-builder')) {
|
|
window.customElements.define('docuseal-builder', EmbeddedBuilder);
|
|
}
|
|
|
|
if (!window.customElements.get('docuseal-form')) {
|
|
window.customElements.define('docuseal-form', EmbeddedForm);
|
|
}
|
|
JAVASCRIPT
|
|
|
|
def show
|
|
headers['Content-Type'] = 'application/javascript'
|
|
|
|
self.response_body = EMBED_SCRIPT
|
|
|
|
self.status = 200
|
|
end
|
|
end
|