SPB Git forge

spb/admin-ka

Public
41commits 1branches 0releases
172.9 MBsize
maindefault branch
19 days agolast push
JavaScript 65.5% Python 17.8% CSS 13% HTML 3.7%

Social: masquer l onglet + couper auto (pause temporaire, code conserve)

- onglet Social retire de la nav (bouton commente)
- publication auto coupee (state.auto=false)
- collage legende: ciblage du textbox visible + collage unique (fix double collage) conserve pour reprise

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 23, 2026) parent a09fae8

2 changed files +17 −12

modified public/index.html +1 −4
@@ -244,10 +244,7 @@
244 244 <svg viewBox="0 0 24 24"><path d="M4 17l4-6 4 3 4-8 4 5" stroke="currentColor" stroke-width="1.9" fill="none" stroke-linecap="round" stroke-linejoin="round"/><path d="M3 21h18" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"/></svg>
245 245 <span>Écosystème</span><i class="badge hidden"></i>
246 246 </button>
247 <button data-view="social" class="nav-btn">
248 <svg viewBox="0 0 24 24"><path d="M18 8a3 3 0 10-2.8-4H15a3 3 0 00.2 4l-6.4 3.7M18 16a3 3 0 10.2 4M8.6 12.3L15 16" stroke="currentColor" stroke-width="1.8" fill="none" stroke-linecap="round" stroke-linejoin="round"/><circle cx="6" cy="12" r="3" stroke="currentColor" stroke-width="1.8" fill="none"/></svg>
249 <span>Social</span><i class="badge hidden"></i>
250 </button>
247 + <!-- social-hidden (désactivé temporairement) -->
251 248 <button data-view="settings" class="nav-btn">
252 249 <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3.2" stroke="currentColor" stroke-width="1.8" fill="none"/><path d="M12 2.8v3M12 18.2v3M2.8 12h3M18.2 12h3M5.5 5.5l2.1 2.1M16.4 16.4l2.1 2.1M18.5 5.5l-2.1 2.1M7.6 16.4l-2.1 2.1" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
253 250 <span>Réglages</span><i class="badge hidden"></i>
modified server/social.js +16 −8
@@ -241,25 +241,33 @@ async function _publishMedia(caption, mediaPath, isVideo) {
241 241 if (r1 !== 'opened') throw new Error('composeur introuvable (' + r1 + ')');
242 242 await sleep(3000);
243 243
244 // 2) coller la légende via ClipboardEvent synthétique (base64, sans clavier)
244 + // 2) coller la légende dans le TEXTBOX VISIBLE (évite les dialogues empilés
245 + // et le double collage) — atomique : ne colle que si le box est encore vide.
245 246 const b64cap = Buffer.from(caption, 'utf8').toString('base64');
247 + // trouve le contenteditable visible le plus « profond » (composeur actif)
248 + const findBoxFn = `function(){
249 + var all=[].slice.call(document.querySelectorAll('div[role=dialog] div[contenteditable=true][role=textbox]'));
250 + if(!all.length) all=[].slice.call(document.querySelectorAll('div[role=dialog] div[contenteditable=true]'));
251 + var vis=all.filter(function(b){var r=b.getBoundingClientRect();return r.width>10&&r.height>10&&r.top>=0&&r.left>=0;});
252 + return vis.length?vis[vis.length-1]:(all.length?all[all.length-1]:null);
253 + }`;
246 254 const pasteJS = `(function(){
247 var dlg=document.querySelector('div[role=dialog]'); if(!dlg) return 'NO_DIALOG';
248 var box=dlg.querySelector('div[contenteditable=true][role=textbox]'); if(!box) return 'NO_BOX';
255 + var box=(${findBoxFn})(); if(!box) return 'NO_BOX';
256 + if((box.innerText||'').replace(/\\s/g,'').length>20) return 'already:'+box.innerText.length; // déjà rempli -> ne pas recoller
249 257 box.focus();
250 258 var txt=decodeURIComponent(escape(atob('${b64cap}')));
251 259 var dt=new DataTransfer(); dt.setData('text/plain', txt);
252 260 box.dispatchEvent(new ClipboardEvent('paste',{clipboardData:dt,bubbles:true,cancelable:true}));
253 261 return 'pasted';
254 262 })();`;
255 const checkLen = `(function(){var dlg=document.querySelector('div[role=dialog]');` +
256 `var box=dlg&&dlg.querySelector('div[contenteditable=true][role=textbox]');` +
257 `return 'len:'+(box?box.innerText.length:-1);})();`;
263 + const checkLen = `(function(){var box=(${findBoxFn})();return 'len:'+(box?box.innerText.length:-1);})();`;
258 264 let len = 0;
259 265 for (let i = 0; i < 3; i++) {
260 await osaJS(pasteJS); await sleep(2500);
266 + const r = await osaJS(pasteJS);
267 + await sleep(2500);
261 268 const l = await osaJS(checkLen); len = parseInt((l.split(':')[1] || '0'), 10);
262 if (len > 40) break; await sleep(1500);
269 + if (len > 40) break;
270 + await sleep(1200);
263 271 }
264 272 if (!(len > 40)) throw new Error('collage légende échoué');
265 273
266 274