Originally created by: gtshadow33
Originally owned by: gtshadow33
Mejorar panel lateral de proyectos, actividades y sesiones
Descripción
Mejorar el panel lateral de la aplicación para que permita gestionar y consultar los proyectos de forma más completa.
Actualmente el panel muestra los proyectos, pero se necesita una estructura más organizada que permita desplegar cada proyecto y consultar las actividades y sesiones asociadas.
Objetivos
- Añadir y gestionar proyectos desde el panel lateral.
- Mostrar los proyectos reales almacenados en la aplicación.
- Permitir desplegar y contraer cada proyecto.
- Mostrar las actividades asociadas a cada proyecto.
- Mostrar las sesiones registradas dentro de cada proyecto.
- Mantener una navegación clara cuando existan muchos proyectos, actividades o sesiones.
Estructura propuesta
Proyectos
+ Nuevo proyecto
▼ Proyecto 1
├── Actividades
│ ├── Actividad 1
│ └── Actividad 2
│
└── Sesiones
├── Hoy · 01:32
└── Ayer · 00:48
▶ Proyecto 2
▶ Proyecto 3
Sesiones
Cada sesión debería mostrar, como mínimo:
- Actividad realizada.
- Fecha.
- Duración.
- Hora de inicio y finalización, si está disponible.
Interfaz
- Utilizar elementos desplegables para proyectos.
- Diferenciar visualmente proyectos, actividades y sesiones.
- Mantener el panel lateral con scroll cuando el contenido supere el espacio disponible.
- Mantener el botón Nuevo proyecto en una posición accesible.
- Evitar que la incorporación de muchos proyectos haga que la interfaz resulte difícil de utilizar.
Criterios de aceptación
- [ ] Los proyectos mostrados proceden de los datos reales de la aplicación.
- [ ] Se puede crear un nuevo proyecto desde el panel.
- [ ] Cada proyecto puede desplegarse y contraerse.
- [ ] Al desplegar un proyecto aparecen sus actividades.
- [ ] Al desplegar un proyecto aparecen sus sesiones.
- [ ] Las sesiones muestran información relevante de tiempo y fecha.
- [ ] El panel funciona correctamente con varios proyectos.
- [ ] El panel mantiene el scroll cuando existe mucho contenido.
- [ ] La interfaz es usable tanto en escritorio como en pantallas pequeñas.
- [ ] La información mostrada se actualiza cuando se crean nuevas actividades o sesiones.
Prioridad
Media/Alta
Esta mejora afecta directamente a la gestión y consulta del historial de trabajo de la aplicación.
Originally posted by: gtshadow33
Documentación del desarrollo de
sidebar.js1. Introducción
El archivo
sidebar.jsgestiona el menú lateral de la aplicación Hazlo App. Su principal responsabilidad es:A lo largo del desarrollo, el código ha pasado por varias iteraciones, desde un prototipo con datos ficticios hasta una integración completa con la base de datos a través de la API IPC de Electron.
2. Evolución del código
projects = [{ id: "p1", name: "Proyecto A" }, ...]). Funcionalidades: abrir/cerrar, renderizar lista, seleccionar proyecto, crear proyecto (conprompt) y editar (placeholder). No había conexión con backend.fetch('/api/proyectos'), asumiendo un servidor HTTP. Esto no funcionó porque la aplicación es una app de escritorio Electron y utiliza comunicación IPC, no HTTP.fetchpor el uso dewindow.api.proyectos.listar()ewindow.api.proyectos.crear(), expuestos desde el preload. Se eliminaron los datos mock y se comenzó a trabajar con datos reales.project:createyproject:created) para recargar la lista de proyectos cuando se crea uno nuevo. Además, al abrir el sidebar se recargan los proyectos para reflejar cambios externos.3. Estructura actual del código
3.1. Referencias DOM
3.2. Estado global
projects– Array de objetos proyecto obtenidos de la base de datos.activeProjectId– ID del proyecto seleccionado (resaltado en la interfaz).expandedProjects–Setcon los IDs de proyectos que se encuentran expandidos (para mantener el estado al recargar la lista).3.3. Funciones principales
openSidebar()/closeSidebar()Controlan la apertura y cierre del menú lateral.
openSidebar()recarga los proyectos tras un breve retardo (150ms) para asegurar datos frescos.cargarProyectos()window.api.proyectos.listar()para obtener los proyectos.renderProjects()para actualizar la interfaz.fetchActivities(projectId)window.api.actividades.listar(projectId)para obtener las actividades de un proyecto.renderProjects()li.divcon el nombre y un icono SVG (▶ o ▼) que indica si está expandido.ulpara las actividades, con transición de altura y opacidad.clicka la cabecera que:selectProject).renderSingleProject.renderActivities(projectId, actividades)licon su nombre y un eventoclickque emiteactivity:select.renderSingleProject(projectId)selectProject(id)project:selectcon el proyecto seleccionado.3.4. Escucha de eventos externos
Esto permite que otros módulos (por ejemplo, el formulario de creación de proyectos) notifiquen al sidebar para que se refresque.
3.5. Inicialización
Se ejecuta
cargarProyectos()cuando el DOM está listo.3.6. Exportaciones
Se exportan las funciones y variables necesarias para que otros módulos puedan interactuar con el sidebar:
openSidebar,closeSidebarselectProjectprojects,cargarProyectos,renderProjects4. Interacción con otros módulos
project:select– cuando se selecciona un proyecto.activity:select– cuando se hace clic en una actividad.Eventos escuchados:
project:create– para recargar proyectos.project:created– para recargar proyectos.5. Tecnologías utilizadas
window.api.exporteimport.6. Posibles mejoras futuras
localStoragelos proyectos expandidos para recordarlo entre reinicios.7. Conclusión
El código de
sidebar.jsha evolucionado desde un simple prototipo con datos estáticos hasta un componente totalmente funcional que obtiene datos reales de la base de datos a través de Electron IPC. Ofrece una experiencia fluida con actualizaciones en tiempo real, acordeón para actividades y una clara separación de responsabilidades. Su diseño orientado a eventos facilita la comunicación con el resto de la aplicación, permitiendo una arquitectura desacoplada y mantenible.Originally posted by: gtshadow33
Integración de actividades y proyectos con el contador
Descripción
Se ha implementado la comunicación entre el sidebar de proyectos/actividades y el contador de sesiones de la aplicación.
El objetivo es que, al seleccionar una actividad desde el sidebar, el contador reciba tanto:
De esta forma, el campo del contador se rellena automáticamente con el formato:
Por ejemplo:
Flujo de funcionamiento
El flujo implementado es:
1. Sidebar
Paso 1: pasar el proyecto a
renderActivitiesLa función de renderizado de actividades ahora recibe también el proyecto:
Anteriormente solo recibía:
Esto permite que cada actividad conozca el proyecto al que pertenece.
Paso 2: pasar
projectdesderenderProjectsCuando se cargan las actividades de un proyecto, se pasa también el objeto del proyecto:
Esto se realiza tanto cuando el usuario expande un proyecto como cuando se cargan inicialmente los proyectos que ya estaban expandidos.
2. Selección de una actividad
Cuando el usuario hace clic sobre una actividad:
Se genera un evento personalizado llamado:
3. Datos enviados mediante el evento
El evento contiene un objeto
detailcon dos propiedades:actividadContiene la información de la actividad seleccionada.
Ejemplo:
projectContiene la información del proyecto.
Ejemplo:
Se decidió utilizar el nombre:
para representar el proyecto.
4. Recepción en
counter.jsEl contador escucha el evento:
Se extraen los dos objetos:
Después se comprueba que ambos existan:
5. Rellenado automático del contador
Una vez recibidos los datos, el input del contador se rellena automáticamente:
Por ejemplo:
Resultado:
Esto permite utilizar directamente la lógica existente del contador.
6. Compatibilidad con
splitActivityDetails()El contador ya dispone de una función para separar actividad y proyecto:
Por tanto, el formato:
se transforma en:
El
.trim()elimina los espacios alrededor del separador@.7. Orden de declaración en
counter.jsTambién se corrigió el orden de inicialización de los elementos DOM.
Los elementos utilizados por el listener deben declararse antes de utilizarse:
Después se registra el listener:
Esto mantiene el código correctamente organizado y evita problemas con las variables declaradas mediante
const.8. Resultado final
Ahora el usuario puede:
El sidebar obtiene:
La actividad.
CustomEvent.counter.jsrecibe ambos objetos.Ejemplo:
Al seleccionar
come:El contador puede utilizar posteriormente ese valor para obtener los IDs correspondientes y comenzar la sesión.
9. Arquitectura utilizada
La comunicación se realiza mediante un evento personalizado del DOM:
Esta solución permite mantener separados los módulos:
sidebar.jsse encarga de proyectos y actividades.counter.jsse encarga del contador.CustomEventsirve como mecanismo de comunicación entre ambos.Archivos modificados
js/sidebar.jsResponsabilidades añadidas/modificadas:
projectarenderActivities().activity:select.actividadyprojectmediantedetail.js/counter.jsResponsabilidades añadidas/modificadas:
activity:select.actividadyproject.splitActivityDetails().Resultado
La selección desde el sidebar queda integrada con el contador sin necesidad de que el usuario escriba manualmente la actividad y el proyecto.
Formato utilizado:
Evento utilizado:
Datos enviados: