1
1
import { Controller } from "@hotwired/stimulus"
2
2
3
3
export default class extends Controller {
4
- static targets = [ "status" , "weight" , "port " , "logs" , "printerStatus" , "readButton" ]
4
+ static targets = [ "status" , "weight" , "scalePort" , "printerPort ", "logs" , "printerStatus" , "readButton" ]
5
5
static values = {
6
6
baseUrl : String ,
7
7
autoConnect : Boolean ,
@@ -34,10 +34,17 @@ export default class extends Controller {
34
34
this . startHealthCheck ( )
35
35
}
36
36
37
- // Add event listener for port selection changes
38
- if ( this . hasPortTarget ) {
39
- this . portTarget . addEventListener ( 'change' , ( event ) => {
40
- this . onPortChange ( event )
37
+ // Add event listener for scale port selection changes
38
+ if ( this . hasScalePortTarget ) {
39
+ this . scalePortTarget . addEventListener ( 'change' , ( event ) => {
40
+ this . onScalePortChange ( event )
41
+ } )
42
+ }
43
+
44
+ // Add event listener for printer port selection changes
45
+ if ( this . hasPrinterPortTarget ) {
46
+ this . printerPortTarget . addEventListener ( 'change' , ( event ) => {
47
+ this . onPrinterPortChange ( event )
41
48
} )
42
49
}
43
50
@@ -53,9 +60,14 @@ export default class extends Controller {
53
60
fetch ( '/admin/configurations/saved_config' )
54
61
. then ( response => response . json ( ) )
55
62
. then ( data => {
56
- if ( data . serial_port && this . hasPortTarget ) {
57
- // Establecer el puerto guardado en el select
58
- this . portTarget . value = data . serial_port ;
63
+ if ( data . serial_port && this . hasScalePortTarget ) {
64
+ // Establecer el puerto guardado en el select de la báscula
65
+ this . scalePortTarget . value = data . serial_port ;
66
+ }
67
+
68
+ if ( data . printer_port && this . hasPrinterPortTarget ) {
69
+ // Establecer el puerto guardado en el select de la impresora
70
+ this . printerPortTarget . value = data . printer_port ;
59
71
}
60
72
} )
61
73
. catch ( error => {
@@ -107,48 +119,92 @@ export default class extends Controller {
107
119
const response = await fetch ( `${ this . baseUrlValue } /ports` )
108
120
const data = await response . json ( )
109
121
110
- if ( data . status === 'success' && this . hasPortTarget ) {
111
- // Guardar el puerto actualmente seleccionado
112
- const currentSelection = this . portTarget . value ;
113
-
114
- // Limpiar opciones actuales
115
- this . portTarget . innerHTML = '<option value="">Detectando puertos...</option>'
122
+ if ( data . status === 'success' ) {
123
+ // Cargar puertos en el dropdown de la báscula si existe
124
+ if ( this . hasScalePortTarget ) {
125
+ // Guardar el puerto actualmente seleccionado
126
+ const currentScaleSelection = this . scalePortTarget . value ;
127
+
128
+ // Limpiar opciones actuales
129
+ this . scalePortTarget . innerHTML = '<option value="">Detectando puertos...</option>'
130
+
131
+ // Agregar puertos disponibles
132
+ if ( data . ports && data . ports . length > 0 ) {
133
+ this . scalePortTarget . innerHTML = '<option value="">Seleccionar puerto...</option>'
134
+ data . ports . forEach ( port => {
135
+ const option = document . createElement ( 'option' )
136
+ option . value = port . device
137
+ option . textContent = `${ port . device } - ${ port . description || 'Dispositivo serial' } `
138
+ this . scalePortTarget . appendChild ( option )
139
+ } )
140
+
141
+ // Restaurar selección anterior si existe
142
+ if ( currentScaleSelection ) {
143
+ this . scalePortTarget . value = currentScaleSelection
144
+ }
145
+ } else {
146
+ this . scalePortTarget . innerHTML = '<option value="">No se encontraron puertos</option>'
147
+ }
148
+ }
116
149
117
- // Agregar puertos disponibles
118
- if ( data . ports && data . ports . length > 0 ) {
119
- this . portTarget . innerHTML = '<option value="">Seleccionar puerto...</option>'
120
- data . ports . forEach ( port => {
121
- const option = document . createElement ( 'option' )
122
- option . value = port . device
123
- option . textContent = `${ port . device } - ${ port . description || 'Dispositivo serial' } `
124
- this . portTarget . appendChild ( option )
125
- } )
150
+ // Cargar puertos en el dropdown de la impresora si existe
151
+ if ( this . hasPrinterPortTarget ) {
152
+ // Guardar el puerto actualmente seleccionado
153
+ const currentPrinterSelection = this . printerPortTarget . value ;
154
+
155
+ // Limpiar opciones actuales
156
+ this . printerPortTarget . innerHTML = '<option value="">Detectando puertos...</option>'
126
157
127
- // Restaurar selección anterior si existe
128
- if ( currentSelection ) {
129
- this . portTarget . value = currentSelection
158
+ // Agregar puertos disponibles
159
+ if ( data . ports && data . ports . length > 0 ) {
160
+ this . printerPortTarget . innerHTML = '<option value="">Seleccionar puerto...</option>'
161
+ data . ports . forEach ( port => {
162
+ const option = document . createElement ( 'option' )
163
+ option . value = port . device
164
+ option . textContent = `${ port . device } - ${ port . description || 'Dispositivo serial' } `
165
+ this . printerPortTarget . appendChild ( option )
166
+ } )
167
+
168
+ // Restaurar selección anterior si existe
169
+ if ( currentPrinterSelection ) {
170
+ this . printerPortTarget . value = currentPrinterSelection
171
+ }
130
172
} else {
131
- // Cargar configuración guardada si no hay selección previa
132
- this . loadSavedConfiguration ( )
173
+ this . printerPortTarget . innerHTML = '<option value="">No se encontraron puertos</option>'
133
174
}
134
- } else {
135
- this . portTarget . innerHTML = '<option value="">No se encontraron puertos</option>'
175
+ }
176
+
177
+
178
+ } else {
179
+ // Handle case where API returns non-success status
180
+ if ( this . hasScalePortTarget ) {
181
+ this . scalePortTarget . innerHTML = '<option value="">No se encontraron puertos</option>'
182
+ }
183
+ if ( this . hasPrinterPortTarget ) {
184
+ this . printerPortTarget . innerHTML = '<option value="">No se encontraron puertos</option>'
136
185
}
137
186
}
138
187
} catch ( error ) {
139
188
this . log ( `Error loading ports: ${ error . message } ` )
140
- if ( this . hasPortTarget ) {
141
- this . portTarget . innerHTML = '<option value="">Error al detectar puertos</option>'
189
+ if ( this . hasScalePortTarget ) {
190
+ this . scalePortTarget . innerHTML = '<option value="">Error al detectar puertos</option>'
191
+ }
192
+ if ( this . hasPrinterPortTarget ) {
193
+ this . printerPortTarget . innerHTML = '<option value="">Error al detectar puertos</option>'
142
194
}
143
195
}
144
196
}
145
197
146
198
async refreshPorts ( event ) {
147
199
if ( event ) event . preventDefault ( ) ;
148
200
149
- // Mostrar mensaje de carga
150
- if ( this . hasPortTarget ) {
151
- this . portTarget . innerHTML = '<option value="">Detectando puertos...</option>' ;
201
+ // Mostrar mensaje de carga en ambos dropdowns
202
+ if ( this . hasScalePortTarget ) {
203
+ this . scalePortTarget . innerHTML = '<option value="">Detectando puertos...</option>' ;
204
+ }
205
+
206
+ if ( this . hasPrinterPortTarget ) {
207
+ this . printerPortTarget . innerHTML = '<option value="">Detectando puertos...</option>' ;
152
208
}
153
209
154
210
// Cargar puertos
@@ -160,7 +216,7 @@ export default class extends Controller {
160
216
async connectScale ( event ) {
161
217
event . preventDefault ( )
162
218
163
- const port = this . hasPortTarget ? this . portTarget . value : '/dev/ttyS0'
219
+ const port = this . hasScalePortTarget ? this . scalePortTarget . value : '/dev/ttyS0'
164
220
const baudrate = 115200
165
221
166
222
if ( ! port ) {
@@ -330,19 +386,31 @@ export default class extends Controller {
330
386
async connectPrinter ( event ) {
331
387
event . preventDefault ( )
332
388
389
+ // Get the selected printer port if available
390
+ const printerPort = this . hasPrinterPortTarget ? this . printerPortTarget . value : null
391
+
333
392
try {
393
+ const requestBody = { }
394
+ if ( printerPort ) {
395
+ requestBody . port = printerPort
396
+ }
397
+
334
398
const response = await fetch ( `${ this . baseUrlValue } /connect_printer` , {
335
- method : 'POST'
399
+ method : 'POST' ,
400
+ headers : { 'Content-Type' : 'application/json' } ,
401
+ body : JSON . stringify ( requestBody )
336
402
} )
337
403
338
404
const data = await response . json ( )
339
405
340
406
if ( data . status === 'success' ) {
341
407
this . updatePrinterStatus ( "✓ Printer connected" , "success" )
342
- this . log ( " Printer connected" )
408
+ this . log ( ` Printer connected on ${ printerPort || 'auto-detected port' } ` )
343
409
344
- // Trigger Rails form submission for automatic saving
345
- this . saveConfiguration ( { printer_port : 'auto_detected' } )
410
+ // Trigger Rails form submission for automatic saving if we have a specific port
411
+ if ( printerPort ) {
412
+ this . saveConfiguration ( { printer_port : printerPort } )
413
+ }
346
414
} else {
347
415
this . updatePrinterStatus ( "✗ Failed to connect printer" , "error" )
348
416
this . log ( `Printer connection failed: ${ data . message } ` )
@@ -557,23 +625,33 @@ export default class extends Controller {
557
625
}
558
626
}
559
627
560
- // Método para manejar cambios en la selección de puerto
561
- onPortChange ( event ) {
628
+ // Método para manejar cambios en la selección de puerto de la báscula
629
+ onScalePortChange ( event ) {
562
630
const selectedPort = event . target . value
563
631
if ( selectedPort ) {
564
- // Guardar el puerto seleccionado antes de guardar la configuración
565
- const selectedPortText = event . target . options [ event . target . selectedIndex ] . text ;
566
-
567
632
// Trigger Rails form submission for automatic saving
568
633
this . saveConfiguration ( { serial_port : selectedPort } )
569
- this . log ( `Puerto seleccionado: ${ selectedPort } ` )
634
+ this . log ( `Puerto de báscula seleccionado: ${ selectedPort } ` )
570
635
571
- // Restaurar el puerto seleccionado después de guardar
572
- setTimeout ( ( ) => {
573
- if ( this . hasPortTarget ) {
574
- this . portTarget . value = selectedPort ;
575
- }
576
- } , 100 ) ;
636
+ // If both scale and printer ports are the same, update the printer port selection too
637
+ if ( this . hasPrinterPortTarget && this . printerPortTarget . value === selectedPort ) {
638
+ this . saveConfiguration ( { printer_port : selectedPort } )
639
+ }
640
+ }
641
+ }
642
+
643
+ // Método para manejar cambios en la selección de puerto de la impresora
644
+ onPrinterPortChange ( event ) {
645
+ const selectedPort = event . target . value
646
+ if ( selectedPort ) {
647
+ // Trigger Rails form submission for automatic saving
648
+ this . saveConfiguration ( { printer_port : selectedPort } )
649
+ this . log ( `Puerto de impresora seleccionado: ${ selectedPort } ` )
650
+
651
+ // If both scale and printer ports are the same, update the scale port selection too
652
+ if ( this . hasScalePortTarget && this . scalePortTarget . value === selectedPort ) {
653
+ this . saveConfiguration ( { serial_port : selectedPort } )
654
+ }
577
655
}
578
656
}
579
657
0 commit comments