feat: améliorer la synchronisation des métadonnées asynchrones avec indicateurs de chargement visuels, polling pour synchroniser textarea vers Toast UI Editor, correction du chemin du script metadata.min.js avec base_path, et ajout de conteneurs d'icônes loader pour titre, description et tags avec activation conditionnelle selon retrieve_description

This commit is contained in:
2026-02-18 14:27:50 -05:00
parent 5bf384a8d6
commit 9150877d57
4 changed files with 90 additions and 3 deletions
+62
View File
@@ -0,0 +1,62 @@
(function () {
var loaded = false;
var tried = {};
function toAbsolute(url) {
try {
return new URL(url, window.location.href).toString();
} catch (e) {
return url;
}
}
function loadNext(candidates, index) {
if (loaded || index >= candidates.length) {
return;
}
var src = toAbsolute(candidates[index]);
if (tried[src]) {
loadNext(candidates, index + 1);
return;
}
tried[src] = true;
var script = document.createElement('script');
script.src = src;
script.async = false;
script.onload = function () {
loaded = true;
};
script.onerror = function () {
script.remove();
loadNext(candidates, index + 1);
};
document.head.appendChild(script);
}
var rootPath = (window.shaarli && window.shaarli.rootPath) || '';
var basePath = (window.shaarli && window.shaarli.basePath) || '';
var assetPath = (window.shaarli && window.shaarli.assetPath) || '';
var candidates = [];
if (assetPath) {
candidates.push(assetPath.replace(/\/tpl\/shaarli-pro\/?$/, '/tpl/default') + '/js/metadata.min.js');
}
if (basePath) {
candidates.push(basePath + '/tpl/default/js/metadata.min.js');
candidates.push(basePath + '/js/metadata.min.js');
}
if (rootPath) {
candidates.push(rootPath + '/tpl/default/js/metadata.min.js');
candidates.push(rootPath + '/js/metadata.min.js');
}
candidates.push('/js/metadata.min.js');
candidates.push('/tpl/default/js/metadata.min.js');
loadNext(candidates, 0);
})();
+20
View File
@@ -1177,6 +1177,7 @@ document.addEventListener('DOMContentLoaded', () => {
// Markdown editor
if (descriptionSource && editorMount && window.toastui && window.toastui.Editor) {
const previewStyle = window.innerWidth < 992 ? 'tab' : 'vertical';
let sourceSyncTimer = null;
const markdownEditor = new window.toastui.Editor({
el: editorMount,
@@ -1189,7 +1190,26 @@ document.addEventListener('DOMContentLoaded', () => {
usageStatistics: false,
});
// Shaarli metadata script updates the textarea value asynchronously.
// Mirror that value into Toast UI only if the editor is still empty.
sourceSyncTimer = window.setInterval(() => {
const sourceValue = (descriptionSource.value || '').trim();
if (!sourceValue) return;
const editorValue = (markdownEditor.getMarkdown() || '').trim();
if (!editorValue) {
markdownEditor.setMarkdown(descriptionSource.value || '', false);
}
window.clearInterval(sourceSyncTimer);
sourceSyncTimer = null;
}, 250);
form.addEventListener('submit', () => {
if (sourceSyncTimer) {
window.clearInterval(sourceSyncTimer);
sourceSyncTimer = null;
}
descriptionSource.value = markdownEditor.getMarkdown();
});
} else if (editorMount) {