Files
VITEC-website/packages/vitec/Resources/Public/Javascript/structured-data-generator.js
2026-07-01 10:34:48 +02:00

92 lines
2.9 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* VITEC Structured Data generator button (FormEngine fieldWizard).
* EXT:vitec/Resources/Public/Javascript/structured-data-generator.js
*
* Self-initializing: on load it installs a single delegated click handler for
* any button matching [data-vitec-sd-generate]. This avoids relying on the
* JavaScriptModuleInstruction ->instance() payload (which is unreliable for
* fieldWizards) and also works for fields added to the DOM later.
*
* On click it calls the backend AJAX endpoint for the product uid and writes
* the returned JSON-LD string into the associated `structureddata` textarea.
* The textarea is resolved by its form name (data-field-name) with a fallback
* to the surrounding FormEngine field-item container.
*/
import DocumentService from "@typo3/core/document-service.js";
import AjaxRequest from "@typo3/core/ajax/ajax-request.js";
import Notification from "@typo3/backend/notification.js";
const SELECTOR = "[data-vitec-sd-generate]";
function findField(button) {
const name = button.dataset.fieldName;
if (name) {
const byName = document.querySelector('[name="' + name + '"]');
if (byName !== null) {
return byName;
}
}
const item = button.closest(".t3js-formengine-field-item");
if (item !== null) {
return item.querySelector("textarea, input[type=text], input:not([type])");
}
return null;
}
async function generate(button) {
const field = findField(button);
if (!field) {
Notification.error("Fehler", "Das Structured-Data-Feld wurde nicht gefunden.");
return;
}
const ajaxUrl = TYPO3.settings.ajaxUrls["vitec_structureddata_generate"];
if (!ajaxUrl) {
Notification.error("Fehler", "AJAX-Route nicht registriert.");
return;
}
button.disabled = true;
try {
const response = await new AjaxRequest(ajaxUrl)
.withQueryArguments({ uid: button.dataset.uid })
.get();
const data = await response.resolve();
if (data.success) {
field.value = data.jsonLd;
field.dispatchEvent(new Event("change", { bubbles: true }));
Notification.success(
"Structured Data",
"JSON-LD wurde generiert und in das Feld geschrieben."
);
} else {
Notification.warning("Hinweis", data.message || "Generierung nicht möglich.");
}
} catch (error) {
Notification.error("Fehler", "Die Generierung ist fehlgeschlagen.");
} finally {
button.disabled = false;
}
}
function init() {
// Guard against binding more than once (the module instruction may be
// emitted per field instance, but the module itself is a singleton).
if (document.body.dataset.vitecSdBound === "1") {
return;
}
document.body.dataset.vitecSdBound = "1";
document.addEventListener("click", (event) => {
const button = event.target.closest(SELECTOR);
if (button === null) {
return;
}
event.preventDefault();
generate(button);
});
}
DocumentService.ready().then(init);