Skip to content

Commit e04f52a

Browse files
committed
1.0.0 - Version funcional
1 parent adda04e commit e04f52a

27 files changed

Lines changed: 1706 additions & 418 deletions

README.md

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,50 @@
11
# 🧠 Noties Workspace
2-
> **v0.0.7-beta** | Mi "Segundo Cerebro" para la Universidad.
2+
> **v1.0.0** | Mi "Segundo Cerebro" para la Universidad.
33
44
**Noties** es una aplicación de escritorio diseñada para estudiantes que buscan una organización superior. Inspirada en la flexibilidad de **Anytype** y el minimalismo de **Notion**, Noties centraliza tus clases, apuntes en Markdown y el seguimiento de proyectos en una base de datos local, privada y portátil.
55

66
🔗 **Repositorio:** [https://github.com/Carlos-Gan/Noties](https://github.com/Carlos-Gan/Noties)
77

88
---
99

10-
## ✨ Características v0.0.7 (Novedades)
10+
## ✨ Características v1.0.0 (Lanzamiento Funcional)
1111

12-
- **🕹️ Kanban Interactivo:** Sistema de *Drag & Drop* fluido para mover proyectos entre estados (Pendiente, En curso, Entregado) con persistencia instantánea en SQLite.
13-
- **🔍 Ficha Técnica de Proyectos:** Nuevo modal de visualización profunda con jerarquía visual mejorada para descripciones largas, fechas límite y niveles de prioridad.
14-
- **🖱️ Interacción Contextual:** - **Clic Izquierdo:** Abrir detalles de lectura con diseño inmersivo.
15-
- **Clic Derecho:** Acceso directo al editor de parámetros y configuración de secciones (ContextMenu).
16-
- **📊 Telemetría en Dashboard:** Cálculo en tiempo real de "Pendientes Críticos", porcentaje de avance por materia y detección automática del **Objetivo Prioritario** (entrega más cercana).
17-
- **🎨 UI Semántica Avanzada:** Sincronización de colores entre la Sidebar y las tarjetas de materia, incluyendo estados visuales (opacidad en entregados y pulsación en urgentes).
12+
Esta versión marca el primer hito estable del proyecto, integrando herramientas avanzadas de edición y gestión académica.
13+
14+
### 📝 Notas y Editor Pro
15+
- **Editor Enriquecido:** Soporte nativo para bloques de código, **imágenes** y renderizado de fórmulas **LaTeX** mediante cadenas de texto.
16+
- **Dashboard de Notas:** Nueva vista centralizada para explorar y gestionar todos los apuntes del semestre.
17+
- **Exportación a PDF:** Generación de documentos profesionales a partir de tus notas con un solo clic.
18+
19+
### 📂 Gestión de Clases y Semestres
20+
- **Archivado Automático:** Sistema inteligente que detecta el fin de cursos y archiva materias según tu configuración.
21+
- **Centro de Archivo:** Interfaz para consultar, recuperar o eliminar clases de periodos anteriores.
22+
23+
### 🕹️ Experiencia de Usuario (UX)
24+
- **Navegación por Mouse:** Soporte para botones adicionales del mouse (Back/Forward) para un flujo de trabajo más rápido.
25+
- **Kanban Interactivo:** Sistema de *Drag & Drop* para mover proyectos entre estados (Pendiente, En curso, Entregado).
26+
- **Visualización Crítica:** Telemetría en el Dashboard para identificar tareas urgentes y avance global por materia.
27+
28+
### 🛠️ Mejoras Técnicas
29+
- **Corrección de Renderizado:** Arreglos masivos en la visualización CSS para entornos oscuros.
30+
- **Persistencia Robusta:** Manejo de base de datos SQLite con verificaciones de integridad al arranque.
1831

1932
---
2033

2134
## 🛠️ Stack Tecnológico
2235

23-
* **Frontend:** React.js + Tailwind CSS
36+
* **Frontend:** React.js + Tailwind CSS + Framer Motion
2437
* **Runtime:** Electron.js
2538
* **Base de Datos:** SQLite (vía `better-sqlite3`)
26-
* **Animaciones:** Framer Motion (Reorder & Layout Animations)
27-
* **Iconografía:** React Icons (Feather & Fi)
39+
* **Procesamiento:** Markdown Engine + KaTeX (LaTeX)
2840

2941
---
3042

3143
## 🚀 Instalación y Desarrollo
3244

3345
### Requisitos previos
3446
* [Node.js](https://nodejs.org/) (v18+)
35-
* npm o yarn
47+
* npm
3648

3749
### Configuración
3850
1. **Clonar el repositorio:**
@@ -44,31 +56,22 @@
4456
```bash
4557
npm install
4658
```
47-
3. **Ejecutar en modo desarrollo:**
59+
3. **Ejecutar en modo desarrollo (Incluye parches para Linux):**
4860
```bash
49-
npm run dev
61+
npm run start
5062
```
5163

5264
---
5365

54-
## 📅 Roadmap 0.1.0
55-
56-
- [ ] **Markdown Engine:** Implementar editor de notas con soporte para fórmulas LaTeX y bloques de código.
57-
- [ ] **Persistencia de Colores:** Guardar la configuración de la Sidebar en la tabla `config_app`.
58-
- [ ] **Filtros por Semestre:** Vista filtrada para enfocarse solo en las materias del periodo actual.
59-
- [ ] **Notificaciones:** Alertas de escritorio para proyectos que vencen en menos de 24 horas.
60-
61-
---
62-
63-
## 📄 Estructura de Datos (Actualizada)
66+
## 📄 Estructura de Datos
6467

6568
La aplicación utiliza un enfoque de **Esquema Híbrido**:
66-
- **Tablas Relacionales:** `materias`, `proyectos` (campos optimizados: `prioridad`, `unidad`, `estado`, `fecha_limite`).
67-
- **Metadata JSON:** Para permitir que el usuario añada campos personalizados en las materias sin alterar el esquema SQL.
68-
- **Comunicación IPC:** Manejo asíncrono de promesas entre el proceso de renderizado y el proceso principal para garantizar una UI libre de bloqueos.
69+
- **Tablas Relacionales:** `materias`, `proyectos` y `apuntes` para consultas de alto rendimiento.
70+
- **Metadata JSON:** Permite añadir campos personalizados (Profesor, Horario, Links) sin alterar el esquema SQL.
71+
- **Comunicación IPC:** Protocolo asíncrono entre el proceso de renderizado y el sistema de archivos para garantizar fluidez.
6972

7073
---
7174

7275
## 👤 Autor
73-
**Carlos-Gandara** - *Desarrollador y Estudiante*
76+
**Carlos-Gandara** - *Desarrollador y Estudiante de Ingeniería en Sistemas*
7477
> "Construyendo las herramientas que desearía haber tenido el primer día de clases."

main.js

Lines changed: 76 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,116 @@
1-
const { app, BrowserWindow, ipcMain, dialog } = require('electron');
2-
const path = require('path');
3-
const fs = require('fs');
4-
const isDev = require('electron-is-dev');
5-
const Database = require('better-sqlite3');
6-
const { initDB } = require('./src/database/db');
7-
8-
const { registerVaultHandlers } = require('./src/ipc/vault');
9-
const { registerMateriaHandlers } = require('./src/ipc/materias');
10-
const { registerApunteHandlers } = require('./src/ipc/apuntes');
11-
const { registerProyectoHandlers } = require('./src/ipc/proyectos');
12-
const { registerTareaHandlers } = require('./src/ipc/tareas');
13-
const { registerTagHandlers } = require('./src/ipc/tags');
14-
const { registerConfigHandlers } = require('./src/ipc/config');
15-
16-
const configPath = path.join(app.getPath('userData'), 'config.json');
1+
const { app, BrowserWindow, ipcMain, dialog } = require("electron");
2+
const path = require("path");
3+
const fs = require("fs");
4+
const isDev = require("electron-is-dev");
5+
const Database = require("better-sqlite3");
6+
const { initDB } = require("./src/database/db");
177

8+
// Handlers de tus módulos
9+
const { registerVaultHandlers } = require("./src/ipc/vault");
10+
const { registerMateriaHandlers } = require("./src/ipc/materias");
11+
const { registerApunteHandlers } = require("./src/ipc/apuntes");
12+
const { registerProyectoHandlers } = require("./src/ipc/proyectos");
13+
const { registerTareaHandlers } = require("./src/ipc/tareas");
14+
const { registerTagHandlers } = require("./src/ipc/tags");
15+
const { registerConfigHandlers } = require("./src/ipc/config");
16+
17+
const configPath = path.join(app.getPath("userData"), "config.json");
18+
19+
// --- FUNCIONES DE CONFIGURACIÓN ---
1820
function getConfig() {
1921
if (!fs.existsSync(configPath)) return {};
20-
return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
22+
try {
23+
return JSON.parse(fs.readFileSync(configPath, "utf-8"));
24+
} catch (e) {
25+
return {};
26+
}
2127
}
2228

2329
function saveConfig(data) {
2430
fs.writeFileSync(configPath, JSON.stringify(data, null, 2));
2531
}
2632

33+
// --- GESTIÓN DE BASE DE DATOS ---
2734
let db = null;
2835
const getDb = () => {
29-
if (!db) throw new Error('Base de datos no conectada.');
36+
if (!db) throw new Error("Base de datos no conectada.");
3037
return db;
3138
};
3239

3340
function conectarDB(vaultPath) {
3441
try {
42+
if (!vaultPath || !fs.existsSync(vaultPath)) return false;
3543
if (db) db.close();
3644
db = new Database(vaultPath);
3745
initDB(db);
38-
console.log('✅ Conectado a DB en:', vaultPath);
46+
console.log("✅ Conectado a DB en:", vaultPath);
3947
return true;
4048
} catch (error) {
41-
console.error('Error conectando a DB:', error);
49+
console.error("Error conectando a DB:", error);
4250
return false;
4351
}
4452
}
4553

54+
// --- IPC HANDLERS GLOBALES ---
55+
ipcMain.handle("check-db-status", () => db !== null);
56+
57+
ipcMain.handle("export-to-pdf", async (event, title) => {
58+
const win = BrowserWindow.fromWebContents(event.sender);
59+
try {
60+
const data = await win.webContents.printToPDF({ printBackground: true });
61+
const { filePath } = await dialog.showSaveDialog(win, {
62+
title: "Exportar Apunte como PDF",
63+
defaultPath: path.join(app.getPath("documents"), `${title}.pdf`),
64+
filters: [{ name: "Adobe PDF", extensions: ["pdf"] }],
65+
});
66+
67+
if (filePath) {
68+
fs.writeFileSync(filePath, data);
69+
return { success: true, path: filePath };
70+
}
71+
return { success: false };
72+
} catch (error) {
73+
console.error(error);
74+
return { success: false, error: error.message };
75+
}
76+
});
77+
78+
// --- VENTANA ---
4679
function createWindow() {
4780
const win = new BrowserWindow({
4881
width: 1440,
4982
height: 1024,
50-
backgroundColor: '#1e1e1e',
83+
backgroundColor: "#0c0c0c",
5184
webPreferences: {
52-
preload: path.resolve(__dirname, 'preload.js'),
53-
nodeIntegration: false,
85+
preload: path.resolve(__dirname, "preload.js"),
5486
contextIsolation: true,
87+
nodeIntegration: false,
5588
sandbox: false,
56-
webSecurity: false,
5789
},
5890
autoHideMenuBar: true,
5991
});
6092

61-
win.loadURL(
62-
isDev
63-
? 'http://localhost:5173'
64-
: `file://${path.join(__dirname, './dist/index.html')}`
65-
);
93+
// CORRECCIÓN AQUÍ: Línea de carga limpia
94+
const url = isDev
95+
? "http://localhost:5173"
96+
: `file://${path.join(__dirname, "./dist/index.html")}`;
97+
98+
win.loadURL(url);
6699

67100
if (isDev) win.webContents.openDevTools();
68101
}
69102

103+
// Flags para evitar errores en Linux (Durango Fix)
104+
app.commandLine.appendSwitch("no-sandbox");
105+
app.commandLine.appendSwitch("disable-dev-shm-usage");
106+
app.commandLine.appendSwitch("disable-gpu");
107+
app.commandLine.appendSwitch("disable-software-rasterizer");
108+
70109
app.whenReady().then(() => {
71110
const config = getConfig();
72-
if (config.vault_path && fs.existsSync(config.vault_path)) {
73-
conectarDB(config.vault_path);
74-
}
111+
if (config.vault_path) conectarDB(config.vault_path);
75112

113+
// Registro de Handlers
76114
registerVaultHandlers(ipcMain, dialog, getConfig, saveConfig, conectarDB);
77115
registerMateriaHandlers(ipcMain, getDb);
78116
registerApunteHandlers(ipcMain, getDb);
@@ -82,8 +120,12 @@ app.whenReady().then(() => {
82120
registerConfigHandlers(ipcMain, getConfig, saveConfig, getDb);
83121

84122
createWindow();
123+
124+
app.on("activate", () => {
125+
if (BrowserWindow.getAllWindows().length === 0) createWindow();
126+
});
85127
});
86128

87-
app.on('window-all-closed', () => {
88-
if (process.platform !== 'darwin') app.quit();
129+
app.on("window-all-closed", () => {
130+
if (process.platform !== "darwin") app.quit();
89131
});

0 commit comments

Comments
 (0)