2.6.2: arranque en blanco
- Una instalación nueva no trae carpetas de fábrica: CONFIG_DEFECTO arrancaba con David Reyes, Danney y Camilo apuntando a Z:, W: y N:. raices viene vacía; el diccionario de clientes y discos sigue de serie porque es conocimiento, no estado. - Al abrir no se entra sola en ninguna carpeta: la primera opción del desplegable está vacía y la portada enseña «Tus carpetas» con su último escaneo, para entrar con un clic. - Un config.json ilegible se aparta en config.json.roto-<fecha> en vez de sustituirse por los valores de fábrica en silencio. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
@@ -99,6 +99,10 @@
|
||||
.vacio-caja .o{margin-top:16px;font-size:13px;color:var(--mut)}
|
||||
.vacio-caja .o u{color:var(--acc);text-decoration:none;border-bottom:1px solid var(--acc)}
|
||||
.vacio-pasos{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;margin-top:24px;font-size:12.5px}
|
||||
.portada{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px}
|
||||
.portada .pc{display:flex;flex-direction:column;gap:3px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;cursor:pointer;background:var(--panel);font-size:12.5px}
|
||||
.portada .pc:hover{border-color:var(--acc);background:var(--acc2)}
|
||||
.portada .pc b{font-size:14px}
|
||||
.vacio-pasos b{display:block;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mut);margin-bottom:4px}
|
||||
@media(max-width:900px){.vacio-pasos{grid-template-columns:1fr 1fr}}
|
||||
.peso{display:flex;height:14px;margin:4px 0 8px;border-radius:4px;overflow:hidden;gap:1px;background:var(--panel2)}
|
||||
@@ -352,6 +356,7 @@
|
||||
<p>OrganiLAB la escanea, te enseña qué pesa y te lleva paso a paso. No mueve nada sin que lo confirmes, y nunca borra.</p>
|
||||
<div class="o"><button class="p" id="btnElegir2" type="button">Elegir carpeta…</button> o <u>pega la ruta</u></div>
|
||||
</div>
|
||||
<div id="portadaCarpetas"></div>
|
||||
<div class="vacio-pasos">
|
||||
<div><b>1 · Escanear</b>Lee nombres, tamaños y fechas. Solo lectura.</div>
|
||||
<div><b>2 · Revisar</b>Qué pesa: BRAW, cámara, stock, proxies, basura, repetidos.</div>
|
||||
@@ -635,8 +640,10 @@ let ULTIMO = null;
|
||||
async function cargarEstado(){
|
||||
ESTADO = await api('/api/estado');
|
||||
const sel = $('#raiz'); const antes = sel.value;
|
||||
sel.innerHTML = ESTADO.raices.map(r => `<option value="${esc(r.clave)}">${esc(r.cliente)}</option>`).join('');
|
||||
if (antes && ESTADO.raices.some(r => r.clave === antes)) sel.value = antes;
|
||||
// la primera opción está vacía a propósito: al abrir el programa no se entra en ninguna carpeta, la
|
||||
// portada las enseña y se elige una. Antes el desplegable caía solo en la primera registrada.
|
||||
sel.innerHTML = '<option value=""></option>' + ESTADO.raices.map(r => `<option value="${esc(r.clave)}">${esc(r.cliente)}</option>`).join('');
|
||||
sel.value = (antes && ESTADO.raices.some(r => r.clave === antes)) ? antes : '';
|
||||
pintarIndice();
|
||||
const fmt = $('#optFormato'); if (!fmt.options.length && ESTADO.formatos) { fmt.innerHTML = Object.entries(ESTADO.formatos).map(([k, v]) => `<option value="${k}">${esc(v.nombre)}</option>`).join(''); fmt.value = ESTADO.config.optimizar.formato || 'h265_10bit'; pintarFormato(); cargarMotores(); }
|
||||
const perf = $('#optPerfil'); if (!perf.options.length) { perf.innerHTML = Object.entries(ESTADO.perfiles).map(([k,v]) => `<option value="${k}">${esc(v.nombre)}</option>`).join(''); perf.value = ESTADO.config.optimizar.perfil; $('#optMeses').value = ESTADO.config.optimizar.meses_minimos; $('#optMin').value = ESTADO.config.optimizar.min_mb; $('#optChroma').value = ESTADO.config.optimizar.chroma; $('#optColor').value = ESTADO.config.optimizar.color; pintarCriterio(); }
|
||||
@@ -770,11 +777,22 @@ $('#btnDesconectar').onclick = () => desconectar(raizActual());
|
||||
// ---------------- carpeta ----------------
|
||||
const COLOR = {camara_raw:'#6b2f2a', stock_viejo:'#b8923a', stock_reciente:'#d9c58c', camara_video:'#3d5a73', exportados:'#7f8a94', proyectos:'#a9b0b8', basura:'#d3d6da', proxies:'#c4c9ce', audio:'#4f6b5a', celular:'#7a5c8a', fotos:'#8a6f4f', video_otro:'#94a3ad', imagenes:'#b5bec6', documentos:'#cfd5da', otros:'#e1e5e8'};
|
||||
const NOMBRE_CORTO = {camara_raw:'BRAW', stock_viejo:'stock viejo', stock_reciente:'stock reciente', camara_video:'cámara MP4', exportados:'exportados', proyectos:'proyectos', basura:'basura', proxies:'proxies', audio:'audio', celular:'celular', fotos:'fotos', video_otro:'otros videos', imagenes:'imágenes', documentos:'documentos', otros:'otros'};
|
||||
function pintarPortada(){
|
||||
// las carpetas que el programa ya conoce, para entrar en una con un clic; con la última vez que se
|
||||
// escaneó cada una. Es el «historial» de la portada: nada se abre solo.
|
||||
const caja = $('#portadaCarpetas'); const rs = ESTADO.raices || [];
|
||||
if (!rs.length) { caja.innerHTML = ''; return; }
|
||||
caja.innerHTML = '<h3 style="margin:22px 0 8px">Tus carpetas</h3><div class="portada">' + rs.map(r => {
|
||||
const e = r.escaneo;
|
||||
return `<div class="pc" data-r="${esc(r.clave)}" role="button" tabindex="0"><b>${esc(r.cliente)}</b><span class="path">${esc(r.ruta)}</span><span class="mut">${esc(ESTADO.tipos[r.tipo] || r.tipo)}</span><span class="mut">${e ? `${num(e.n)} archivos · ${gb(e.bytes)} · escaneada ${fecha(e.ts)}` : 'sin escanear todavía'}</span></div>`;
|
||||
}).join('') + '</div>';
|
||||
$$('#portadaCarpetas .pc').forEach(el => { const ir = () => { $('#raiz').value = el.dataset.r; $('#raiz').onchange(); }; el.onclick = ir; el.onkeydown = ev => { if (ev.key === 'Enter' || ev.key === ' ') { ev.preventDefault(); ir(); } }; });
|
||||
}
|
||||
async function cargarCarpeta(){
|
||||
const raiz = raizActual();
|
||||
$('#inicioVacio').style.display = raiz ? 'none' : 'block';
|
||||
$('#inicioLleno').style.display = raiz ? '' : 'none';
|
||||
if (!raiz) return;
|
||||
if (!raiz) { pintarPortada(); return; }
|
||||
const r = cfgRaiz();
|
||||
CARPETA = await api('/api/carpeta/estado?raiz=' + encodeURIComponent(raiz));
|
||||
$('#cabTitulo').textContent = r.cliente;
|
||||
|
||||
Referencia en una nueva incidencia
Block a user