Files
xamxam/app/public/assets/js/app/clipboard.js
Pontoporeia 99125cc8e3 Add autosave draft system for partage form with HTMX-based session persistence
- New fragment endpoint POST/GET /partage/fragments/draft.php:
  saves all form fields to PHP session, excludes file/csrf/slug fields
  GET returns JSON for JS hydration on page load
  rotates both global CSRF and share CSRF tokens in sync

- form.php accepts optional $formExtraAttrs and $showAutosaveStatus:
  allows injecting HTMX attributes and 'Brouillon enregistré' indicator

- renderShareLinkForm adds hx-post with change/input debounce trigger,
  loads autosave-handler.js, hydrate fields from draft on page load

- Draft cleared on successful form submission in handleShareLinkSubmission

- autosave-handler.js now also updates share_link_token hidden input
  when rotating CSRF token (partage form uses both csrf_token and share_link_token)

- Added .autosave-status CSS to form.css (was admin.css-only)

- Updated fragment routing to accept GET requests (needed for draft hydration)
2026-06-11 11:04:49 +02:00

40 lines
1.0 KiB
JavaScript

/**
* clipboard.js — lightweight URL copy helper.
*
* Usage:
* <input type="hidden" id="url-123" value="https://...">
* <button onclick="copyUrl(123)">Copier</button>
*
* Or with a custom selector pattern:
* <button onclick="copyUrlFrom(document.getElementById('my-url'))">Copier</button>
*/
(() => {
window.copyUrl = (id) => {
var input = document.getElementById(`url-${id}`);
if (input) {
window.copyUrlFrom(input);
}
};
window.copyUrlFrom = (sourceEl) => {
var text = sourceEl.value || sourceEl.textContent || "";
var btn;
var origTitle;
var origText;
if (!text) return;
navigator.clipboard.writeText(text).then(() => {
btn = window.event?.target ? window.event.target.closest("button") : null;
if (btn) {
origTitle = btn.getAttribute("title") || "";
origText = btn.textContent;
btn.setAttribute("title", "\u2713 Copi\u00e9");
btn.textContent = "\u2713 Copi\u00e9";
setTimeout(() => {
btn.setAttribute("title", origTitle);
btn.textContent = origText;
}, 1200);
}
});
};
})();