Inicio como lista con ✓: lo hecho se queda en su sitio, con cuándo y qué
Al terminar algo (elegir el tipo de trabajo, apartar stock, juntar repetidos, la bandeja, convertir) la ficha desaparecía sin decir nada y no se sabía por dónde se iba. Ahora cada paso hecho se queda con su ✓ y «Hecho hoy a las 07:41: …», arriba se cuentan los hechos, y lo que acaba de pasar a hecho se ilumina. Aplicar el plan apunta qué pasos entraron; elegir el tipo y nombrar una carpeta quedan en la bitácora. «Basura y proxies» deja de pedirse cuando lo que queda es lo de «No tocar» o lo que va sin marcar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Este commit está contenido en:
@@ -260,6 +260,11 @@
|
||||
.acc{display:flex;flex-direction:column;gap:8px;margin-bottom:18px}
|
||||
.ac{display:grid;grid-template-columns:26px minmax(0,1fr) auto;gap:14px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:12px 14px}
|
||||
.ac.hecho{background:transparent;border-style:dashed;opacity:.62}
|
||||
.ac .hc{margin-top:4px;font-size:12.5px;font-weight:600;color:var(--ok)}
|
||||
.ac.hecho .hc{opacity:1}
|
||||
.ac.recien{opacity:1;animation:recien 3s ease-out}
|
||||
@keyframes recien{0%{background:var(--ok2);border-color:var(--ok);border-style:solid}70%{background:var(--ok2)}100%{background:transparent}}
|
||||
.cabsec .nhechas{margin-left:10px;color:var(--ok);text-transform:none;letter-spacing:0;font-weight:600}
|
||||
.ac.espera{opacity:.72}
|
||||
.ac .ico{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex:none;background:var(--acc2);color:var(--acc)}
|
||||
.ac.hecho .ico{background:var(--ok2);color:var(--ok)}
|
||||
@@ -1225,7 +1230,7 @@ const IR_ACCION = {
|
||||
await api('/api/raiz/tipo', {raiz: raizActual(), tipo: t});
|
||||
PLAN = null; MAPAE = null;
|
||||
aviso(`Listo: la carpeta y el cliente se ordenan como «${(ESTADO.tipos[t] || t).split(' · ')[0]}».`, 'ok');
|
||||
await cargarEstado(); cargarVista();
|
||||
await cargarEstado(); await pintarAcciones(); cargarVista();
|
||||
}));
|
||||
$('#modalSi').textContent = 'Usar este';
|
||||
},
|
||||
@@ -1251,16 +1256,18 @@ async function pintarAcciones(){
|
||||
const raiz = raizActual(); if (!raiz) return;
|
||||
const d = await api('/api/carpeta/acciones?raiz=' + encodeURIComponent(raiz));
|
||||
if (raizActual() !== raiz) return; // cambió de carpeta mientras llegaba
|
||||
// lo que acaba de pasar a hecho se ilumina un momento: así se ve que el cambio se hizo
|
||||
const previas = $('#acciones').dataset.raiz === raiz ? Object.fromEntries(ACCIONES.map(a => [a.clave, a.estado])) : {};
|
||||
ACCIONES = d.acciones || [];
|
||||
$('#acciones').dataset.raiz = raiz; // de qué carpeta es lo que se ve: así se sabe cuándo decir «leyendo»
|
||||
const quedan = ACCIONES.filter(a => a.estado === 'toca').length;
|
||||
const quedan = ACCIONES.filter(a => a.estado === 'toca').length, hechas = ACCIONES.filter(a => a.estado === 'hecho').length;
|
||||
const auto = d.automatico || [], asis = d.asistente;
|
||||
const corriendo = asis && asis.activo;
|
||||
const cab = corriendo
|
||||
? `<div class="cabsec">Trabajando en esta carpeta<span class="sep"></span><span class="mut" style="text-transform:none;letter-spacing:0">${esc(NOMBRE_PASO[asis.paso] || asis.paso || '')} · ${asis.hechas || 0} de ${asis.total || 0}</span></div>`
|
||||
: `<div class="cabsec">${quedan ? `Lo que se puede hacer ahora · ${quedan}` : 'Esta carpeta está al día' + (d.ultimo ? ` · último cambio ${esc(fechaCorta(d.ultimo.ts))}` : '')}${auto.length > 1 ? '<span class="sep"></span><button class="p" id="btnHacerTodo" style="text-transform:none;letter-spacing:0">Hacer las ' + auto.length + ' de una vez</button>' : ''}</div>`;
|
||||
: `<div class="cabsec">${quedan ? `Lo que se puede hacer ahora · ${quedan}` : 'Esta carpeta está al día' + (d.ultimo ? ` · último cambio ${esc(fechaCorta(d.ultimo.ts))}` : '')}${hechas ? `<span class="nhechas">✓ ${hechas} hecho${hechas !== 1 ? 's' : ''}</span>` : ''}${auto.length > 1 ? '<span class="sep"></span><button class="p" id="btnHacerTodo" style="text-transform:none;letter-spacing:0">Hacer las ' + auto.length + ' de una vez</button>' : ''}</div>`;
|
||||
$('#acciones').innerHTML = cab +
|
||||
ACCIONES.map((a, i) => `<div class="ac ${a.estado}"><span class="ico">${a.calculando ? '<span class="spin"></span>' : a.estado === 'hecho' ? '✓' : a.estado === 'espera' ? '·' : i + 1}</span><div class="tx"><b>${esc(a.titulo)}</b><div class="q">${esc(a.que)}</div>${a.detalle ? `<div class="d">${esc(a.detalle)}</div>` : ''}</div><div class="der">${a.cifra ? `<span class="cifra">${esc(a.cifra)}</span>` : ''}${a.boton ? `<button class="${a.estado === 'espera' ? 'lnk' : 'p'}" data-a="${i}">${esc(a.boton)}</button>` : ''}</div></div>`).join('');
|
||||
ACCIONES.map((a, i) => `<div class="ac ${a.estado} ${previas[a.clave] && previas[a.clave] !== 'hecho' && a.estado === 'hecho' ? 'recien' : ''}" data-clave="${esc(a.clave)}"><span class="ico">${a.calculando ? '<span class="spin"></span>' : a.estado === 'hecho' ? '✓' : a.estado === 'espera' ? '·' : i + 1}</span><div class="tx"><b>${esc(a.titulo)}</b><div class="q">${esc(a.que)}</div>${a.detalle ? `<div class="d">${esc(a.detalle)}</div>` : ''}${a.hecho ? `<div class="hc">✓ ${esc(a.hecho)}</div>` : ''}</div><div class="der">${a.cifra ? `<span class="cifra">${esc(a.cifra)}</span>` : ''}${a.boton ? `<button class="${a.estado === 'espera' ? 'lnk' : 'p'}" data-a="${i}">${esc(a.boton)}</button>` : ''}</div></div>`).join('');
|
||||
$$('#acciones [data-a]').forEach(b => b.onclick = () => { const a = ACCIONES[+b.dataset.a]; (IR_ACCION[a.ir] || (() => {}))(a.paso, a); });
|
||||
// se acaba de mover algo y el programa está comprobando qué queda: se vuelve a preguntar en un momento
|
||||
if (d.calculando) setTimeout(() => { if (raizActual() === raiz && vistaActual() === 'carpeta') cargarCarpeta().catch(() => {}); }, 1500);
|
||||
@@ -1484,13 +1491,13 @@ function pintarNombrar(){
|
||||
}
|
||||
$('#btnAceptarSug').onclick = () => accion($('#btnAceptarSug'), async () => {
|
||||
const seguras = VOC.filter(t => !t.cubeta && !t.dentro_pieza && t.sugerencia && t.sug_conf === 'alta');
|
||||
for (const t of seguras) { await api('/api/diccionario', {token: t.token, cubeta: t.sugerencia}); t.cubeta = t.sugerencia; t.aprendido = true; }
|
||||
for (const t of seguras) { await api('/api/diccionario', {token: t.token, cubeta: t.sugerencia, raiz: raizActual(), ejemplo: t.ejemplo}); t.cubeta = t.sugerencia; t.aprendido = true; }
|
||||
PLAN = null; estadoPlan(); if (CARPETA) { CARPETA.sin_nombre_n = VOC.filter(x => !x.cubeta && !x.dentro_pieza).length; pintarIndice(); }
|
||||
pintarNombrar(); aviso(`${seguras.length} carpetas nombradas. Calcula el plan para verlas ordenadas.`, 'ok');
|
||||
});
|
||||
const nombrarToken = seguro(async (tok, cub) => {
|
||||
await api('/api/diccionario', {token: tok, cubeta: cub});
|
||||
const t = VOC.find(x => x.token === tok); if (t) { t.cubeta = cub; t.aprendido = !!cub; t.motivo = 'lo dijiste tú'; }
|
||||
const t = VOC.find(x => x.token === tok);
|
||||
await api('/api/diccionario', {token: tok, cubeta: cub, raiz: raizActual(), ejemplo: t ? t.ejemplo : tok}); if (t) { t.cubeta = cub; t.aprendido = !!cub; t.motivo = 'lo dijiste tú'; }
|
||||
PLAN = null; estadoPlan(); if (CARPETA) { CARPETA.sin_nombre_n = VOC.filter(x => !x.cubeta && !x.dentro_pieza).length; pintarIndice(); }
|
||||
pintarNombrar();
|
||||
if (cub) aviso(`«${t ? t.ejemplo : tok}» ahora es ${NOMBRE_CUBETA[cub] || cub}. Calcula el plan de nuevo para verlo.`, 'ok');
|
||||
|
||||
Referencia en una nueva incidencia
Block a user