DEV CommiDEV Committ
This commit is contained in:
1 parent
4541c58fe7
commit
c6759186cb
145 files changed
+2742
-579
No files matched your search
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* 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);
|
||||
Reference in new issue
Block a user