Update app.py
Browse files
app.py
CHANGED
@@ -1020,7 +1020,7 @@ HTML_TEMPLATE = r"""
|
|
1020 |
</div>
|
1021 |
<div id="warmup-logs" style="max-height:220px; overflow:auto; font-size:12px; color:#6b7280; white-space:pre-wrap"></div>
|
1022 |
<div style="margin-top:10px; display:flex; gap:8px; justify-content:flex-end">
|
1023 |
-
|
1024 |
<button id="warmupCloseBtn" class="btn">Fermer</button>
|
1025 |
</div>
|
1026 |
</div>
|
@@ -1028,7 +1028,7 @@ HTML_TEMPLATE = r"""
|
|
1028 |
<h3>Sélection des modèles à préparer</h3>
|
1029 |
<div id="repoList" class="repo-list"></div>
|
1030 |
<div style="margin-top:12px; display:flex; gap:8px; justify-content:flex-end; flex-wrap:wrap">
|
1031 |
-
|
1032 |
<button id="selectAllBtn" class="btn">Tout cocher</button>
|
1033 |
<button id="selectNoneBtn" class="btn">Tout décocher</button>
|
1034 |
<button id="selectCancelBtn" class="btn">Annuler</button>
|
@@ -1157,55 +1157,55 @@ function closeWarmupPopup(){ if(warmupPopup) warmupPopup.style.display = 'none';
|
|
1157 |
let userClosedWarmupPopup = false;
|
1158 |
|
1159 |
if (warmupCloseBtn) warmupCloseBtn.addEventListener('click', closeWarmupPopup);
|
1160 |
-
|
1161 |
-
|
1162 |
-
|
1163 |
-
|
1164 |
-
|
1165 |
-
|
1166 |
-
|
1167 |
-
|
1168 |
-
|
1169 |
-
|
1170 |
-
|
1171 |
-
|
1172 |
-
|
1173 |
-
|
1174 |
-
|
1175 |
-
|
1176 |
-
|
1177 |
-
|
1178 |
-
|
1179 |
-
|
1180 |
-
|
1181 |
-
|
1182 |
-
}
|
1183 |
-
|
1184 |
-
|
1185 |
-
function makeDraggable(el, handle){
|
1186 |
-
if(!el || !handle) return;
|
1187 |
-
let drag=false, sx=0, sy=0, bx=0, by=0;
|
1188 |
-
handle.addEventListener('mousedown', (e)=>{
|
1189 |
-
const r = el.getBoundingClientRect();
|
1190 |
-
el.style.left = r.left + 'px';
|
1191 |
-
el.style.top = r.top + 'px';
|
1192 |
-
el.style.transform = 'none';
|
1193 |
-
drag=true; sx=e.clientX; sy=e.clientY; bx=r.left; by=r.top; e.preventDefault();
|
1194 |
-
});
|
1195 |
-
window.addEventListener('mousemove', (e)=>{
|
1196 |
-
if(!drag) return;
|
1197 |
-
const nx = bx + (e.clientX - sx);
|
1198 |
-
const ny = by + (e.clientY - sy);
|
1199 |
-
const maxX = window.innerWidth - el.offsetWidth - 8;
|
1200 |
-
const maxY = window.innerHeight - el.offsetHeight - 8;
|
1201 |
-
el.style.left = Math.max(8, Math.min(maxX, nx)) + 'px';
|
1202 |
-
el.style.top = Math.max(8, Math.min(maxY, ny)) + 'px';
|
1203 |
-
});
|
1204 |
-
window.addEventListener('mouseup', ()=>{ drag=false; });
|
1205 |
-
}
|
1206 |
-
makeDraggable(warmupPopup, warmupPopup?.querySelector('h3'));
|
1207 |
-
makeDraggable(warmupSelectPopup, warmupSelectPopup?.querySelector('h3'));
|
1208 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1209 |
|
1210 |
// Rafraîchissement d’état
|
1211 |
let warmupTimer = null;
|
|
|
1020 |
</div>
|
1021 |
<div id="warmup-logs" style="max-height:220px; overflow:auto; font-size:12px; color:#6b7280; white-space:pre-wrap"></div>
|
1022 |
<div style="margin-top:10px; display:flex; gap:8px; justify-content:flex-end">
|
1023 |
+
<button id="warmupCopyBtn" class="btn" title="Copier le contenu">Copier</button>
|
1024 |
<button id="warmupCloseBtn" class="btn">Fermer</button>
|
1025 |
</div>
|
1026 |
</div>
|
|
|
1028 |
<h3>Sélection des modèles à préparer</h3>
|
1029 |
<div id="repoList" class="repo-list"></div>
|
1030 |
<div style="margin-top:12px; display:flex; gap:8px; justify-content:flex-end; flex-wrap:wrap">
|
1031 |
+
<button id="selectCopyBtn" class="btn" title="Copier la liste visible">Copier</button>
|
1032 |
<button id="selectAllBtn" class="btn">Tout cocher</button>
|
1033 |
<button id="selectNoneBtn" class="btn">Tout décocher</button>
|
1034 |
<button id="selectCancelBtn" class="btn">Annuler</button>
|
|
|
1157 |
let userClosedWarmupPopup = false;
|
1158 |
|
1159 |
if (warmupCloseBtn) warmupCloseBtn.addEventListener('click', closeWarmupPopup);
|
1160 |
+
// -- DRAG & COPY (popups warmup) --
|
1161 |
+
(function(){
|
1162 |
+
const $popup = document.getElementById('warmupPopup');
|
1163 |
+
const $sel = document.getElementById('warmupSelectPopup');
|
1164 |
+
const $copy = document.getElementById('warmupCopyBtn');
|
1165 |
+
const $copy2 = document.getElementById('selectCopyBtn');
|
1166 |
+
|
1167 |
+
function makeDraggable(box){
|
1168 |
+
if (!box) return;
|
1169 |
+
let sx=0, sy=0, ox=0, oy=0, drag=false;
|
1170 |
+
box.addEventListener('mousedown', e=>{
|
1171 |
+
if (e.target.tagName === 'BUTTON' || e.target.closest('button')) return;
|
1172 |
+
drag=true; box.style.transform='none';
|
1173 |
+
ox = box.offsetLeft; oy = box.offsetTop; sx = e.clientX; sy = e.clientY;
|
1174 |
+
document.body.style.userSelect='none';
|
1175 |
+
});
|
1176 |
+
window.addEventListener('mousemove', e=>{
|
1177 |
+
if(!drag) return;
|
1178 |
+
box.style.left = (ox + (e.clientX - sx)) + 'px';
|
1179 |
+
box.style.top = (oy + (e.clientY - sy)) + 'px';
|
1180 |
+
});
|
1181 |
+
window.addEventListener('mouseup', ()=>{ drag=false; document.body.style.userSelect=''; });
|
1182 |
+
}
|
1183 |
+
makeDraggable($popup);
|
1184 |
+
makeDraggable($sel);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1185 |
|
1186 |
+
function copyText(txt){
|
1187 |
+
if (navigator.clipboard && navigator.clipboard.writeText){
|
1188 |
+
navigator.clipboard.writeText(txt||'').then(()=> (window.showToast?showToast('Copié ✅'):alert('Copié ✅')) );
|
1189 |
+
} else {
|
1190 |
+
const ta=document.createElement('textarea'); ta.value=txt||''; document.body.appendChild(ta); ta.select();
|
1191 |
+
try{ document.execCommand('copy'); (window.showToast?showToast('Copié ✅'):alert('Copié ✅')); }catch{}
|
1192 |
+
ta.remove();
|
1193 |
+
}
|
1194 |
+
}
|
1195 |
+
if ($copy){
|
1196 |
+
$copy.addEventListener('click', ()=>{
|
1197 |
+
const s = document.getElementById('warmupPopupStatus');
|
1198 |
+
const l = document.getElementById('warmup-logs');
|
1199 |
+
copyText((s?('[Status] '+s.textContent+'\n\n'):'') + (l?l.textContent:''));
|
1200 |
+
});
|
1201 |
+
}
|
1202 |
+
if ($copy2){
|
1203 |
+
$copy2.addEventListener('click', ()=>{
|
1204 |
+
const list = document.getElementById('repoList');
|
1205 |
+
copyText(list ? list.innerText : '');
|
1206 |
+
});
|
1207 |
+
}
|
1208 |
+
})();
|
1209 |
|
1210 |
// Rafraîchissement d’état
|
1211 |
let warmupTimer = null;
|