Add Rulesets page with HTML structure and CSS styles

- Created a new HTML file for the Rulesets page, including a header, toolbar, rules grid, and rule detail popup.
- Implemented JavaScript functionality for loading, filtering, sorting, and managing rules.
- Added CSS styles for the layout, components, and responsive design of the Rulesets page.
This commit is contained in:
Giuseppe Raffa
2026-04-15 08:06:29 +02:00
parent c9402de2e4
commit 3094c06467
13 changed files with 2010 additions and 27 deletions

View File

@@ -1,9 +1,9 @@
const router = require('express').Router();
const { queryAll, query } = require('../store/redis');
const { queryAll, query, hset } = require('../store/redis');
const { connectedSensors } = require('../ws/handler');
/**
* GET /sessions — Lista tutte le sessioni attive dei sensori.
* Legge da Redis le chiavi sensors:* (scritte da handler.js alla connessione)
* GET /sessions — Lista tutte le sessioni dei sensori con metadata e rules versions
*/
router.get('/', async (req, res) => {
try {
@@ -16,7 +16,13 @@ router.get('/', async (req, res) => {
name,
connectedAt: info.timestamp || null,
session: info.session || null,
sessionLabel: info.sessionLabel || info.session || null,
status: info.status || 'unknown',
rules: {
weather: info.rules_weather || null,
data: info.rules_data || null,
logs: info.rules_logs || null,
}
};
}
res.json(sessions);
@@ -27,8 +33,7 @@ router.get('/', async (req, res) => {
});
/**
* GET /sessions/pending — Lista token di connessione pendenti.
* Legge da Redis le chiavi sensors_pending:* (create da createConnectionToken)
* GET /sessions/pending — Lista token di connessione pendenti
*/
router.get('/pending', async (req, res) => {
try {
@@ -41,8 +46,7 @@ router.get('/pending', async (req, res) => {
});
/**
* GET /sessions/connected — Lista sensori attualmente connessi.
* Legge da Redis le chiavi sensor:* (scritte da appendAsConnection in handler.js)
* GET /sessions/connected — Lista sensori attualmente connessi
*/
router.get('/connected', async (req, res) => {
try {
@@ -63,7 +67,7 @@ router.get('/connected', async (req, res) => {
});
/**
* GET /sessions/connected/:id — Verifica se un sensore specifico è connesso.
* GET /sessions/connected/:id — Verifica se un sensore specifico è connesso
*/
router.get('/connected/:id', async (req, res) => {
const { id } = req.params;
@@ -79,4 +83,38 @@ router.get('/connected/:id', async (req, res) => {
}
});
/**
* POST /sessions/:id/label — Cambia il label della sessione per un sensore connesso.
* Non interrompe il flusso dati. I nuovi punti InfluxDB avranno il nuovo tag.
*/
router.post('/:id/label', async (req, res) => {
const { id } = req.params;
const { label } = req.body;
if (!label || typeof label !== 'string' || label.trim().length === 0) {
return res.status(400).json({ error: 'label is required' });
}
const trimmedLabel = label.trim();
// Trova il WS client connesso
const ws = connectedSensors.get(id);
if (!ws) {
return res.status(404).json({ error: 'sensor not connected' });
}
// Aggiorna in memoria (effetto immediato sui prossimi punti InfluxDB)
ws.sessionLabel = trimmedLabel;
// Aggiorna in Redis per persistenza
try {
await hset(`sensors:${id}`, 'sessionLabel', trimmedLabel);
} catch (err) {
console.error('Error updating session label in Redis', err);
}
console.log(`[${id}] Session label changed to: ${trimmedLabel}`);
res.json({ status: 'ok', label: trimmedLabel });
});
module.exports = router;