- Nuevo layout responsivo mobile-first con tabs inferiores - Sidebar colapsable en desktop con cola de impresión - Sistema de templates reutilizables con localStorage - Soporte Dark/Light mode con UColorModeButton - Composables usePrintQueue y useTemplates para estado global - Componentes modulares: CommandBuilder, QuickActions, PrintQueue, QueueItem - Navegación por tabs: Constructor | Cola | Templates
87 lines
2.0 KiB
TypeScript
87 lines
2.0 KiB
TypeScript
// Endpoint de conveniencia para imprimir texto con opciones
|
|
import { buildFromOperations, type Operation } from '~/server/utils/eposBuilder'
|
|
import { buildSoapEnvelope, sendToPrinter, parsePrinterResponse } from '~/server/utils/printer'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const config = useRuntimeConfig()
|
|
const body = await readBody(event)
|
|
|
|
const {
|
|
text = '',
|
|
options = {}
|
|
} = body as {
|
|
text?: string
|
|
options?: {
|
|
align?: string
|
|
font?: string
|
|
size?: { width?: number, height?: number }
|
|
style?: {
|
|
reverse?: boolean
|
|
ul?: boolean
|
|
em?: boolean
|
|
color?: string
|
|
}
|
|
feedLines?: number
|
|
cut?: string
|
|
}
|
|
}
|
|
|
|
// Construir operaciones
|
|
const ops: Operation[] = []
|
|
|
|
if (options.align) {
|
|
ops.push({ op: 'textAlign', align: options.align })
|
|
}
|
|
if (options.font) {
|
|
ops.push({ op: 'textFont', font: options.font })
|
|
}
|
|
if (options.size) {
|
|
ops.push({
|
|
op: 'textSize',
|
|
width: options.size.width,
|
|
height: options.size.height
|
|
})
|
|
}
|
|
if (options.style) {
|
|
ops.push({ op: 'textStyle', ...options.style })
|
|
}
|
|
|
|
// Agregar el texto
|
|
ops.push({ op: 'text', value: text })
|
|
|
|
// Opciones post-texto
|
|
if (options.feedLines) {
|
|
ops.push({ op: 'feedLine', line: options.feedLines })
|
|
}
|
|
if (options.cut) {
|
|
ops.push({ op: 'cut', type: options.cut })
|
|
}
|
|
|
|
// Construir SOAP y enviar
|
|
const inner = buildFromOperations(ops)
|
|
const soap = buildSoapEnvelope(inner)
|
|
|
|
const result = await sendToPrinter(
|
|
soap,
|
|
config.printerHost,
|
|
config.printerDeviceId,
|
|
parseInt(config.printerTimeoutMs)
|
|
)
|
|
|
|
const { success, code } = parsePrinterResponse(result.data)
|
|
|
|
return {
|
|
ok: success,
|
|
httpStatus: result.status,
|
|
code,
|
|
raw: result.data
|
|
}
|
|
} catch (err: any) {
|
|
return {
|
|
ok: false,
|
|
error: err.message
|
|
}
|
|
}
|
|
})
|