Compare commits

..

10 Commits

Author SHA1 Message Date
yamaray fba7c85124 **Version 1.46** 20/05/2026
Se ha agregado un nodo de notificacion al inicio del proceso para permitir eliminar cualquier notificacion presente en caso de recibir un comando de poner el
semaforo en verde cuando el estado esta en rojo. Esto se hace en el nodo check JSON content
- 1/06/2026 Se cambio el tratamiento del QR / RFID en el nodo "tipo de lector" para evitar caracteres aleatorios no ASCII que en ocasiones envia el lector de QR

**Version 1.45** 17/05/2026
Se ha agregado codigo en el nodo "Envia Matricula" y en el nodo "Convert to B64" para en caso en que el flag "envia_mat_img" este en true enviar la matricula,
la imagen de la matricula y la imagen de contexto al supervisor en el momento que se obtengan, con la finalidad de que el supervisor a su vez la envie en
broadcasting para que los interesados puedan obtener en tiempo real estas informaciones y plasmarlas sobre una pantalla. Tal vez esta funcionalidad es mas para desarrollo
ya que esta informacion se envia al servidor via API una vez que el usuario es autenticado.
La trama que se envia al supervisor en el caso de la matricula es:
{payload: { device: "supervisor", accion: "lastplate", data: {numero_vial: 2, totem_id: "totem_2", matricula: "1234ABC", imagen: imgBase64}}}
en el caso de la imagen de contexto es:
{payload: { device: "supervisor", accion: "lastcontext", data: {numero_vial: 2, totem_id: "totem_2", imagen_contexto: imgBase64}}}
Ambas tramas se envian al momento de recibir las imagenes en el Totem.
Por su lado el Supervisor envia las siguientes tramas para matricula y para contexto:
{payload:{sender:"supervisor", device:"servidor", accion:"lastplate", data:{totem_id:"totem_2", numero_vial:2, matricula:"1234ABC", imagen:imgBase64}}}
{payload:{sender:"supervisor", device:"servidor", accion:"lastcontext", data:{totem_id:"totem_2", numero_vial:2, imagen_contexto:imgBase64}}}
El flag "envia_mat_img" es configurable a traves del menu de configuracion en el apartado Comunicacion.

Se agrego un nodo "estado semaforo" antes de accionar el semaforo fisicamente, la idea de este nodo es que envie el estado del semaforo via websocket cada
vez que este cambia de estado, de esta forma podemos mantener un estado tiempo real en cualquier sitio remoto con solo observar esta trama. El envio se hace
al supervisor que es quien sirve el websockety se hace solamente si se detecta un cambio de estado del semaforo. La trama es la siguiente:
{device:"supervisor", accion: "semaforo_status", status:{totem_id:flow.get("totem_id"), numero_vial:flow.get("numero_vial"), semaforo:semaforo}}
Cuando llegue al supervisor, este enviara una trama al servidor asi: (esta trama va en broadcasting osea que fisicamente llega a todos los clientes de websocket):
{payload:{sender:"supervisor", device:"servidor", accion:"update_semaforo", semaforo:{totem_id:totem, numero_vial:vial, semaforo:semaforo}}}

En el nodo "Analisis del Modo de Operacion" se agrego un chequeo al final del nodo para evitar que se haga un movimiento inicial cuando la bascula es del tipo salida
adicionalmente tambien se chequea para evitar que muestre ubicacion en caso que se presente un QR o tarjeta
2026-06-04 19:54:58 +02:00
yamaray a9a662cc48 **Version 1.45** 17/05/2026
Se ha agregado codigo en el nodo "Envia Matricula" y en el nodo "Convert to B64" para en caso en que el flag "envia_mat_img" este en true enviar la matricula,
la imagen de la matricula y la imagen de contexto al supervisor en el momento que se obtengan con la finalidad de que el supervisor a su vez la envie en
broadcasting para que los interesados puedan obtener en tiempo real esta informaciones y plasmarlas sobre una pantalla. La idea es que se envia al servidor
para que disponga de esa informacion en alguna pagina web
La trama que se envia al supervisor en el caso de la matricula es:
{payload: { device: "supervisor", accion: "lastplate", data: {numero_vial: 2, totem_id: "totem_2", matricula: "1234ABC", imagen: imgBase64}}}
en el caso de la imagen de contexto es:
{payload: { device: "supervisor", accion: "lastcontext", data: {numero_vial: 2, totem_id: "totem_2", imagen_contexto: imgBase64}}}
Ambas tramas se envian al momento de recibir las imagenes en el Totem.
Por su lado el Supervisor envia las siguientes tramas para matricula y para contexto:
{payload:{sender:"supervisor", device:"servidor", accion:"lastplate", data:{totem_id:"totem_2", numero_vial:2, matricula:"1234ABC", imagen:imgBase64}}}
{payload:{sender:"supervisor", device:"servidor", accion:"lastcontext", data:{totem_id:"totem_2", numero_vial:2, imagen_contexto:imgBase64}}}
El flag "envia_mat_img" es configurable a traves del menu de configuracion en el apartado Comunicacion.
2026-05-17 22:50:10 +02:00
yamaray 9c5754604a **Version 1.43** 11/05/2026
Hemos introducido un cambio significativo en la gestion del ID. Hasta ahora ele flag definitivo de ID_ok = !ID_obligatorio || ID_verificado Lo que quiere decir
que el ID esta ok cuando el ID_obligatorio esta en false es decir no es obligatorio o cuando si es obligatorio y el ID_verificado esta en true, es decir
esta autorizado para entrar. Pero si el ID_obligatorio esta en false y se presenta un ID cualquiera vamos a obtener ID_ok = true es decir esta autorizado.
Hemos introducido un nuevo estado que es ID_presentado y ahora la condicion es ID_ok = (!ID_obligatorio && !ID_presentado) || ID_verificado es decir que
ID_ok depende de ID_verificado si ID_obligatorio esta en true o si ID_presentado esta en true. En caso de que ID_obligatorio este en false y ID_presentado este
tambien en false entonce ID_ok no interfiere en la autorizacion es decir esta en true, todo depende del menu de seleccion si existe.
Para esto hemos cambiado en el nodo de "Analisis del modo de Operacion" linea 59 "let ID_ok = !ID_obligatorio || ID_verificado" por la nueva
let ID_ok = (!ID_obligatorio && !ID_presentado) || ID_verificado;
Adicionalmernte en el nodo QR / RFID hemos activado el ID_presentado cada vez que leemos un ID. Este parametro se resetea en el nodo de peso cada vez que hay una nueva pesada

En el nodo de matricula (linea 27) hacemos el cambio del flag ID_obligatorio al flag salida_ID_obligatorio cuando el movimiento es final. De esta forma ID_obligatorio aplica a la entrada
exclusivamente y salida_ID_obligatorio aplica a la salida solamente.
En el nodo QR/RFID hemos agregado  la puesta a cero del flag de QR(linea 67) y del RFID(linea 126) cuando se trata de un ID incorrecto para que el usuario pueda volver a colocar otro ID.
2026-05-11 19:49:26 +02:00
yamaray 6f7b6a6357 En el nodo "Analisis" en la linea 116 hemos puesto un timer que espera unos segundos antes de sacar la notificacion de ubicacion. Esto se hace para esperar a que la notificacion anterior en caso de existir
permanezca un tiempo y en todo caso para que esta sea la ultima notificacion u quede en pantalla hasta que el vehiculo abandone la bascula.
Eliminamos de la pantalla el mensaje Acerque QR o Tarjeta en caso de recibir una lista de menu. Esto lo hacemos en el nodo "check json".
En el nodo "Envio de Mensajes" (linea 65) eliminamos las notificaciones que haya al final del movimiento (final de pesada) salvo si la notificacion es de Ubicacion.
Se hicieron cambios en index.html y en index.js del uibuilder /totem/ para incluir en el menu de Tipo de Configuracion un boton (LISTA DE PARAMETROS) que nos permita visualizar todos los parametros que podemos incluir en cualquiera de los tipos de configuracion
Se introdujo un chequeo en el nodo "QR/RFID" en la linea 37 para eliminar el boton de salida (simular que fue pulsado) cuando se recibe un QR valido durante el movimiento final. Lo mismo hacemos mas abajo en la recepcion de RFID.
En la parte RFID dado que luego de recibir la tarjeta validada en BD todavia necesitamos validar si la matricula asociada a la tarjeta tiene vehiculo en transito, esto hace que el estado movimiento = inicial puede permanecer por mas tiempo (mientras se chequea si hay transito) por lo tanto en el chequeo
tenemos que meter la variable "matricula_revisada" como requisito para avanzar ya que es quien nos indica si el estado del movimiento ya es definitivo. Recordemos que este chequeo solo lo queremos hacer durante el movimiento final, es decir cuando el vehiculo esta cerrando toda la pesada.
2026-05-04 08:59:11 +02:00
yamaray e3766d4b77 **Version 1.41** 1/04/2026
- Dado que puede darse el caso que la camara de contexto no responda en un determinado momento a la solicitud de imagen, se han introducido unas condiciones para tratar de obtener
la imagen de contexto en caso de fallo temporal. El metodo resumido es el siguiente: Cuando estamos seguros que el vehiculo esta correctamente posicionado
en la bascula (peso estable) hacemos una solicitud y marcamos un estado ("waiting1"), esperamos por la imagen un tiempo definido en la variable ("camara_contexto_delay1")
encaso de no llegar hacemos una segunda solicitud y marcamos el estado ("waiting2") y esperamos por la imagen un tiempo definido en la variable ("camara_contexto_delay2").
Mientras tanto el semaforo esta en rojo esperando la imagen de contexto, suponiendo que todo lo demas esta ok. Al cabo del ultimo tiempo, marcamos el nuevo estado
en funcion de lo sucedido, "ok" si recibimos la imagen "fail" si no la hemos recibido. En cualquiera de los dos casos el semaforo pasa a verde y se continua con la pesada
En caso de no tener imagen de contexto, el nombre de la imagen ira vacio ("") al igual que la imagen.
2026-04-05 19:19:42 +02:00
yamaray 370ae5c414 Debido a nuevo requerimiento se introduce la opcion (configurable) de tener una camara de contexto en la bascula. Esta camara en caso de estar
habilitada en la configuracion tomara una imagen en el momento en que el camion este completamente en la bascula, para ello hemos introducido un codigo en el nodo
"estable" que es donde se hace la deteccion del camion completamente en la bascula. Posteriormente en el nodo "Analisis del modo de Operacion" es
donde verificamos que la imagen fue tomada y la colocamos en el registro que se esta haciendo para generar el movimiento correspondiente. El Grupo
"CAMARA CONTEXTO" posee los nodos de solicitud de imagen y de recepcion de la misma. La configuracion de IP de la camara se hace en la pantalla
de configuracion al igual que su habilitacion en el sistema.
- Como herramienta de ayuda para saber si el Totem esta en capacidad de solicitar y de recibir la imagen de contexto enviada por la camara
se ha incluido una funcion en el menu de configuracion -> Pruebas del sistema -> Pedir Snapshot de contexto de forma que el usuario pueda visualizar
la imagen actual que la camara esta enviando y pueda de esa forma confirmar el correcto funcionamiento de la conexión y de los equipos.
2026-03-25 17:18:29 +01:00
yamaray bfcf67fe83 **Version 1.3.2**
- Hemos colocado un codigo de dos lineas para eliminar el boton del menu activo "COMPLETAR INFO" en caso que se presente una tarjeta o un codigo QR.
Esto lo hicimos en el nodo "Analisis del modo de Operacion" en la linea 70 donde chequeamos si estamos en movimiento inicial.

- Corregido un "error" que no permitia cerrar el movimiento inicial cuando se pasaba una tarjeta si teniamos el menu activo y la firma obligatoria.
Se agrego una condicion ("ID_verificado") en la condicion global para llamar a la firma. Esto es en el nodo "Analisis de Operacion" en las primeras lineas
if (flow.get("firma_obligatoria") && !flow.get("firma_flag") && !flow.get("firma_ok_flag") && !flow.get("supervisor") && (!flow.get("menu_activo") || (flow.get("menu_activo") && (flow.get("menu_seleccionado_flag") || ID_verificado))))
Con esto permite continuar con la firma en caso que tengamos menu_activo y firma obligatoria y entremos con tarjeta o con codigo QR.

**Version 1.3.1**
- Hemos colocado una opcion mas en el menu de configuración en "Pruebas del Sistema" -> "Probar Sensor". Esto permite visualizar la salida del valor
de la distancia que esta midiendo el sensor cada segundo. Para que el medidor no este continuamente inundando el configurador con el dato de distancia
hemos colocado un switch el cual solo deja pasar ese dato cuando se activa el menu, lo inhabilita cuando se sale del menu.

- Hemos puesto el flag flow.set("RFID_ok_flag", false) cuando leemos un QR y flow.set("QR_ok_flag", false) cuando leemos una tarjeta, esto permite
que se utilice un QR aunque primero hayamos metido una tarjeta invalida y viceversa. Se hizo en el nodo "envio QR/RFID".
2026-03-16 09:04:42 +01:00
yamaray 24b3cdf70f V 1.3.1 Hemos puesto el flag flow.set("RFID_ok_flag", false) cuando leemos un QR y flow.set("QR_ok_flag", false) cuando leemos una tarjeta, esto permite
que se utilice un QR aunque primero hayamos metido una tarjeta invalida y viceversa. Se hizo en el nodo "envio QR/RFID".
2026-03-01 22:07:57 +01:00
yamaray a06bb3e05a **Version 1.3** En esta version hemos cambiado los timers a modo contexto local (del nodo) Importante este punto ya que el timer es un objeto no serializable
y por lo tanto no deberiamos guardar en contexto flow o global ya que esos contextos estan previstos para objetos serializables (estados, valores, arrays, json...)
2026-02-09 12:04:56 +01:00
yamaray 9deb9cc151 Hemos agregado una nueva funcionalidad para indicarle al conductor acerca de la ubicacion interna donde debe dirigirse con el residuo que
transporta. Esta notificacion se muestra una vez que hayan cumplido todos los requisitos de entrada y antes de poner el semaforo en verde.
Para esta funcionalidad hemos introducido un codigo en el nodo "Analisis del modo de Operacion" (lineas 76 a 112) y en el nodo "check json content"
en las lineas 44 a 50 bajo el titulo "RESPUESTA DE LA REVISION DE LA UBICACION INTERNA EN BD". Si recibimos respuesta positiva de la BD es decir que si
tiene ubicacion interna el residuo presentado entonces sacamos notificacion con lo que dice el campo de descripcion encontrado en la tabla, en caso contrario
el mensaje que aparece en pantalla es diciendo que no hay ubicacion para ese residuo.
2026-02-02 09:39:32 +01:00
5 changed files with 1967 additions and 748 deletions
+1735 -732
View File
File diff suppressed because one or more lines are too long
+14 -1
View File
@@ -1 +1,14 @@
{}
{
"e49672ad6c84b341": {
"user": "admin",
"password": "Trypton#2019"
},
"72071eee550615d7": {
"user": "admin",
"password": "Trypton#2019"
},
"ee22e8c1327a7b65": {
"user": "admin",
"password": "Trypton#2019"
}
}
+75 -1
View File
@@ -60,7 +60,16 @@ h3 {
}
/* =============================== BOTONES =============================== */
.boton{
padding: 10px;
font-size: 24px;
font-weight: bold;
border: none;
border-radius: 10px;
color: white;
cursor: pointer;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
.btn {
padding: 16px;
font-size: 16px;
@@ -72,6 +81,14 @@ h3 {
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
.boton.med {
width: 100%;
margin-top: 8px;
}
.boton.blue,
.boton.azul {
background: #3498db;
}
.btn.big {
width: 100%;
margin-top: 10px;
@@ -133,6 +150,10 @@ h3 {
background: #DAB957;
color: #444;
}
.btn.skyblue {
background: skyblue;
color: #444;
}
/* =============================== BOTONERAS / GRID =============================== */
@@ -524,6 +545,59 @@ td[contenteditable="true"] {
font-size: 12px;
}
}
/* =============================== PANTALLA SENSOR AÑADIDO POR DAVID=============================== */
.sensor-info-block {
display: flex;
justify-content: space-between;
align-items: center;
margin: 10px 0;
padding: 10px 14px;
background: #f4f6f8;
border-radius: 8px;
}
.sensor-label {
font-size: 14px;
font-weight: bold;
color: #555;
}
.sensor-valor {
font-size: 28px;
font-weight: bold;
color: #2c3e50;
}
.sensor-valor-min {
font-size: 22px;
font-weight: bold;
color: #e67e22;
}
.sensor-barra-wrap {
padding: 0 4px;
}
.sensor-barra-bg {
position: relative;
height: 46px;
background: #dce3ea;
border-radius: 10px;
overflow: visible;
max-height: 20px;
}
.sensor-barra-fill {
height: 100%;
width: 0%;
border-radius: 10px;
background: #3498db;
transition: width 0.5s ease, background-color 0.3s;
}
/*-------------------------------------------------- IMAGEN INICIAL DEL SNAPSHOT ---------------------------------------------------------------------*/
/*
#foto {
+59 -3
View File
@@ -110,8 +110,10 @@
<div class="grid-vertical">
<button class="btn yellow" data-action="semaforo">ENCENDER SEMAFORO</button>
<button class="btn aqua" data-action="barrera">ACTIVAR BARRERA</button>
<button class="btn orange" data-action="snapshot">PEDIR SNAPSHOT</button>
<button class="btn green" data-action="escuchar">ESCUCHAR CAMARA</button>
<button class="btn orange" data-action="snapshot">PEDIR SNAPSHOT DE MATRICULA</button>
<button class="btn green" data-action="escuchar">ESCUCHAR CAMARA MATRICULA</button>
<button class="btn skyblue" data-action="contexto">PEDIR SNAPSHOT DE CONTEXTO</button>
<button class="btn purple" data-action="sensor">PROBAR SENSOR</button>
<button class="btn teal" data-action="regresar">SALIR</button>
</div>
</div>
@@ -156,6 +158,23 @@
</div>
</div>
<!-- -------------------------------------- PANTALLA DE LA CAMARA DE CONTEXTO -------------------------------------------------- -->
<div id="pantalla-contexto" class="pantalla">
<div class="container">
<div class="header">
<img src="/logo-trypton2.png" class="logo" alt="Logo">
<h2>CAMARA CONTEXTO</h2>
</div>
<div class="camara-row">
<!--<span>Camara: <strong id="camara_contexto">---</strong></span>-->
<button class="boton blue med" data-action="repetir" >↻ Recargar</button>
</div>
<div class="imagen"><img id="foto_contexto" src="" alt="Foto"></div>
<div class="fecha" id="fecha_contexto">----</div>
<button class="btn teal big" data-action="salir-snapshot">SALIR</button>
</div>
</div>
<!-- -------------------------------------- PANTALLA DE SNAPSHOT DE LA CAMARA -------------------------------------------------- -->
<div id="pantalla-snapshot" class="pantalla">
<div class="container">
@@ -220,6 +239,35 @@
<button class="btn teal big" data-action="salir-escuchar">SALIR</button>
</div>
</div>
<!-- -------------------------------------- PANTALLA PRUEBA DEL SENSOR AÑADIDO POR DAVID--------------------------------------------------- -->
<div id="pantalla-sensor" class="pantalla">
<div class="container">
<div class="header">
<img src="/logo-trypton2.png" class="logo" alt="Logo">
<h2>Trypton Software</h2>
</div>
<h3 class="titulo">PRUEBA DEL SENSOR</h3>
<hr>
<div class="sensor-info-block">
<span class="sensor-label">Distancia mínima configurada</span>
<span class="sensor-valor-min" id="sensor-dmin">--- mm</span>
</div>
<div class="sensor-info-block">
<span class="sensor-label">Distancia detectada</span>
<span class="sensor-valor" id="sensor-dist">--- mm</span>
</div>
<div class="sensor-barra-wrap">
<div class="sensor-barra-bg">
<div class="sensor-barra-fill" id="sensor-fill"></div>
</div>
</div>
<button class="btn teal big" data-action="salir-sensor">SALIR</button>
</div>
</div>
<!-- ------------------------------- PANTALLA DE TABLA DINAMICA PARA MOSTRAR PARAMETROS DE CONFIGURACION------------------------------------------------->
<div id="pantalla-tabla-general" class="pantalla">
@@ -266,7 +314,10 @@
</div>
<div class="botonera-vertical">
<button class="btn green" id="btn-volver-tipos">REGRESAR</button>
<button class="btn blue" id="btn-lista-parametros" onclick="seleccionarTipo(10)">LISTA DE PARAMETROS</button>
</div>
<div class="botonera-vertical">
<button class="btn green" style="margin-top:20px" id="btn-volver-tipos">REGRESAR</button>
</div>
<div id="tipo-configuracion" style="margin-top:20px; display:none;">
<h3 id="titulo-tipo"></h3>
@@ -278,6 +329,11 @@
<button class="btn rojo" id="btn-cancelar-tipo">Cancelar</button>
</div>
</div>
<div id="tipo-lista" style="margin-top:20px; display:none;">
<h3 id="titulo-tipo-lista"></h3>
<div id="lista"></div>
</div>
</div>
</div>
+83 -10
View File
@@ -30,6 +30,15 @@ uibuilder.onChange('msg', msg => {
}
if (msg.payload && msg.payload.pantalla === 'contexto') {
// Limpiar datos visibles
document.getElementById('camara_contexto').textContent = '---';
document.getElementById('fecha_contexto').textContent = '----';
// Mostrar imagen vacía
document.getElementById('foto_contexto').src = "";
}
if (msg.payload && msg.payload.pantalla === 'escuchar' && msg.buttons != true) {
// Limpiar datos visibles
document.getElementById('camara_escuchar').textContent = '---';
@@ -39,7 +48,14 @@ uibuilder.onChange('msg', msg => {
// Mostrar imagen vacía
document.getElementById('foto_escuchar').src = "";
}
// nuevo paara camara de contexto
if (msg.hasOwnProperty("picture_contexto")) {
if (msg.context_cam) {
document.getElementById('foto_contexto').src = msg.picture_contexto;
document.getElementById('fecha_contexto').textContent = msg.fecha_contexto || '';
document.getElementById('camara_contexto').textContent = "Contexto" || '---';
}
}
if (msg.hasOwnProperty("picture")) {
//uibuilder.send({ payload: msg.payload.Picture.Plate.PlateNumber, topic: msg.payload.Picture.SnapInfo.DeviceID });
if (msg.snapshot_cam) {
@@ -58,6 +74,7 @@ uibuilder.onChange('msg', msg => {
const actual = (msg.snapshot_readindex || 0) + 1;
document.getElementById('contador').textContent = `${actual} / ${total}`;
}
}
else if (msg.payload?.pantalla === 'tipos') {
@@ -138,6 +155,25 @@ uibuilder.onChange('msg', msg => {
if (msg.hasOwnProperty("iplan")) document.getElementById('iplan').textContent = msg.iplan;
if (msg.hasOwnProperty("ipsupervisor")) document.getElementById('ipsupervisor').textContent = msg.ipsupervisor;
// ======== Sensor de distancia añadido por david========
if (msg.hasOwnProperty("distance")) {
const dist = msg.distance;
const dmin = msg.distance_min;
const maxRange = 4000;
document.getElementById('sensor-dist').textContent =
(dist !== null && dist !== undefined) ? dist + ' mm' : '--- mm';
if (dmin !== null && dmin !== undefined) {
document.getElementById('sensor-dmin').textContent = dmin + ' mm';
}
if (dist !== null && dist !== undefined) {
const fillPct = Math.min((dist / maxRange) * 100, 100);
const fill = document.getElementById('sensor-fill');
fill.style.width = fillPct + '%';
}
}
});
//****************************************************************************************************************************************************** */
@@ -174,6 +210,7 @@ document.getElementById('btn-volver-tipos').addEventListener('click', () => {
uibuilder.send({ payload: { seccion: "volver_tipos" } });
});
let tipoActual = null;
let tiposDatos = {}; // aquí se guarda la configuración temporal
@@ -270,19 +307,37 @@ function mostrarBarreraCerrada() {
//************************* FUNCIONES DE TIPOS DE CONFIGURACION *****************************/
function seleccionarTipo(n) {
volverATipos();
tipoActual = n;
document.getElementById('titulo-tipo').textContent = `TIPO ${n}`;
document.getElementById('tipo-configuracion').style.display = 'block';
const contenedor = document.getElementById('parametros');
contenedor.innerHTML = '';
if (tipoActual == 10) {
document.getElementById('titulo-tipo-lista').textContent = 'LISTA DE PARAMETROS';
document.getElementById('tipo-lista').style.display = 'block';
const contenedor = document.getElementById('lista');
contenedor.innerHTML = '';
const datos = tiposDatos[n] || []; // ya es un array
datos.forEach(d => {
const row = crearFilalista(d.parametro, d.valor);
contenedor.appendChild(row);
});
}
else{
document.getElementById('titulo-tipo').textContent = `TIPO ${n}`;
document.getElementById('tipo-configuracion').style.display = 'block';
const contenedor = document.getElementById('parametros');
contenedor.innerHTML = '';
const datos = tiposDatos[n] || []; // ya es un array
datos.forEach(d => {
const row = crearFilaParametro(d.parametro, d.valor);
contenedor.appendChild(row);
});
}
const datos = tiposDatos[n] || []; // ya es un array
datos.forEach(d => {
const row = crearFilaParametro(d.parametro, d.valor);
contenedor.appendChild(row);
});
}
function agregarParametro() {
@@ -292,6 +347,23 @@ function agregarParametro() {
const row = crearFilaParametro('', '');
contenedor.appendChild(row);
}
function crearFilalista(parametro, valor) {
const divlist = document.createElement('divlist');
divlist.className = 'parametro-row';
// Input para el nombre del parámetro
const inputParam = document.createElement('input');
inputParam.placeholder = 'Parámetro';
inputParam.value = parametro;
const inputValue = document.createElement('input');
inputValue.placeholder = 'Valor';
inputValue.value = valor;
divlist.appendChild(inputParam);
divlist.appendChild(inputValue);
return divlist;
}
function crearFilaParametro(parametro, valor) {
const div = document.createElement('div');
div.className = 'parametro-row';
@@ -407,6 +479,7 @@ function guardarTipo() {
function volverATipos() {
document.getElementById('tipo-configuracion').style.display = 'none';
document.getElementById('tipo-lista').style.display = 'none';
tipoActual = null;
}