66 lines
2.5 KiB
JavaScript
66 lines
2.5 KiB
JavaScript
/* Références croisées des pages — Fusion ACC-1.3 (Flowdeck).
|
|
* Câble la section « Liens » rendue côté serveur dans l'éditeur de page :
|
|
* ajout par collage d'URL profonde (POST /api/pages/<id>/refs) et retrait
|
|
* (DELETE /api/refs/<id>), jeton CSRF lu dans le cookie comme le reste de
|
|
* l'app. Après chaque mutation, la page est rechargée — l'état affiché
|
|
* reste celui du serveur, seule source de vérité.
|
|
*/
|
|
(function () {
|
|
"use strict";
|
|
|
|
function csrf() {
|
|
var m = document.cookie.match(/(?:^|;\s*)csrf_token=([^;]+)/);
|
|
return m ? decodeURIComponent(m[1]) : "";
|
|
}
|
|
|
|
function wire(section) {
|
|
var ownerType = section.getAttribute("data-owner-type");
|
|
var ownerId = section.getAttribute("data-owner-id");
|
|
var base = ownerType === "flowdeck.project"
|
|
? "/api/collections/" + ownerId + "/refs"
|
|
: "/api/pages/" + ownerId + "/refs";
|
|
var erreur = section.querySelector("[data-refs-erreur]");
|
|
|
|
function showError(msg) {
|
|
if (erreur) {
|
|
erreur.textContent = msg;
|
|
erreur.hidden = false;
|
|
}
|
|
}
|
|
|
|
section.querySelectorAll("[data-ref-del]").forEach(function (btn) {
|
|
btn.addEventListener("click", function () {
|
|
fetch("/api/refs/" + btn.getAttribute("data-ref-del"), {
|
|
method: "DELETE",
|
|
credentials: "same-origin",
|
|
headers: { "X-CSRF-Token": csrf() }
|
|
}).then(function (r) {
|
|
if (r.ok) { window.location.reload(); }
|
|
else { r.json().then(function (d) { showError(d.detail || "HTTP " + r.status); }); }
|
|
}).catch(function () { showError("Réseau indisponible"); });
|
|
});
|
|
});
|
|
|
|
var form = section.querySelector("[data-refs-form]");
|
|
if (form) {
|
|
form.addEventListener("submit", function (ev) {
|
|
ev.preventDefault();
|
|
var inputs = form.querySelectorAll("input");
|
|
fetch(base, {
|
|
method: "POST",
|
|
credentials: "same-origin",
|
|
headers: { "Content-Type": "application/json", "X-CSRF-Token": csrf() },
|
|
body: JSON.stringify({ url: inputs[0].value.trim(), label: inputs[1].value.trim() || null })
|
|
}).then(function (r) {
|
|
if (r.ok) { window.location.reload(); }
|
|
else { r.json().then(function (d) { showError(d.detail || "HTTP " + r.status); }); }
|
|
}).catch(function () { showError("Réseau indisponible"); });
|
|
});
|
|
}
|
|
}
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
document.querySelectorAll("[data-refs]").forEach(wire);
|
|
});
|
|
})();
|