Por qué el filtro de dos fechas parecía muerto en los tableros — dos bugs, los dos en _periodo.py
17-sep-2026. Marti reportó que "elegir fechas" no hacía nada en el monitor de ML.
No era ML: era el selector compartido worker/_periodo.py, y estaba roto en todos
los tableros que lo usan. Dos bugs distintos, los dos vivos desde que se escribió el
calendario. Verificado con clicks reales contra producción, no leyendo código.
Bug 1 — el calendario lo recortaba el riel de pestañas. #ppcal era
position:absolute dentro de .ppw, y .ppw vive adentro de nav.tabs, que tiene
overflow-x:auto para que las pestañas scrolleen. Un absolute lo recorta cualquier
ancestro con overflow distinto de visible: el calendario de 262px quedaba en una tira
de 8px. Se abría, no se veía, y el click caía en la página de atrás. Pasaba en
escritorio igual que en teléfono. **Arreglo: position:fixed + colocar() que lo
ubica contra el rect del select y lo mantiene dentro de la pantalla. No volver a
absolute.**
Bug 2 — el primer día elegido cerraba el calendario. Al tocar un día (o las flechas
de mes) el handler llama pinta(), que reescribe cal.innerHTML: el botón clickeado
queda desprendido del DOM antes de que el click termine de burbujear. El listener
de cierre en document evaluaba cal.contains(e.target) contra un nodo huérfano, daba
false, y cerraba. Nunca se podía elegir la segunda fecha ni cambiar de mes. **Arreglo:
bandera dentro que los handlers de adentro levantan antes de repintar.**
El error de método, que es lo que importa. El 16-sep "arreglé" un tercer síntoma
(el desplegable no re-disparaba change con un rango ya elegido → opción fechaotra)
y di el tema por cerrado sin abrir el tablero. Ese fix era correcto y no alcanzaba.
Un filtro no se verifica leyendo el bundle: se abre la página y se hace click.
elementFromPoint sobre cada día del calendario es la prueba que hubiera encontrado
el bug 1 en un minuto.
Dónde aplica. Usan el selector: ml, finanzas, ejecutivos, vivet.
stock importa _periodo sólo por plantRango (no dibuja selector). sellers tiene
la función inyectada pero nunca la llama. marcas tiene su propio "Rango…" con dos
input[type=date] nativos — otro mecanismo, no le afecta esto. ordenes no tiene filtro
de período. pulse y marcas no pasan por build_worker.py → _periodo.py.
Ver claude-md-del-repo.
Datos/selector-fechas-calendario