Files
Reem-Notas/app/javascript/controllers/apontamento_termo_controller.js

98 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// app/javascript/controllers/apontamento_termo_controller.js
// Stimulus — Entrega de termo. Lança lotes de termos (normal e/ou especial) para
// o motorista da tela. Entrega sem NF nem código de rastreio: só as quantidades
// (um stepper N + por tipo), cada tipo a um preço fixo configurável.
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["modal", "quantidade", "quantidadeEspecial", "erro", "veiculo"]
static values = { apontarTermoUrl: String, motorista: String }
abrir() {
this.erroTarget.classList.add("hidden")
this.quantidadeTarget.value = "1"
this.quantidadeEspecialTarget.value = "0"
this.modalTarget.classList.remove("hidden")
}
fechar() {
this.modalTarget.classList.add("hidden")
}
// Fecha ao clicar no fundo (fora do card)
fundo(event) {
if (event.target === this.modalTarget) this.fechar()
}
// Steppers (mínimo 0 em ambos; o envio exige ao menos 1 no total)
mais() {
this.quantidadeTarget.value = String(this.qtdAtual(this.quantidadeTarget) + 1)
}
menos() {
this.quantidadeTarget.value = String(Math.max(0, this.qtdAtual(this.quantidadeTarget) - 1))
}
maisEspecial() {
this.quantidadeEspecialTarget.value = String(this.qtdAtual(this.quantidadeEspecialTarget) + 1)
}
menosEspecial() {
this.quantidadeEspecialTarget.value = String(Math.max(0, this.qtdAtual(this.quantidadeEspecialTarget) - 1))
}
qtdAtual(alvo) {
const n = parseInt(alvo.value, 10)
return Number.isFinite(n) && n > 0 ? n : 0
}
async adicionar(event) {
event?.preventDefault()
const quantidade = this.qtdAtual(this.quantidadeTarget)
const quantidadeEspecial = this.qtdAtual(this.quantidadeEspecialTarget)
const motorista = this.motoristaValue.trim()
if (!motorista) { this.mostrarErro("Motorista não identificado."); return }
if (quantidade + quantidadeEspecial < 1) {
this.mostrarErro("Informe ao menos um termo (normal ou especial).")
return
}
const btn = event.currentTarget
btn.disabled = true
try {
const resp = await fetch(this.apontarTermoUrlValue, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
"X-CSRF-Token": document.querySelector('meta[name="csrf-token"]').content
},
body: JSON.stringify({
motorista: motorista,
quantidade: quantidade,
quantidade_especial: quantidadeEspecial,
vehicle: this.hasVeiculoTarget ? this.veiculoTarget.value : ""
})
})
const data = await resp.json()
if (!resp.ok || data.ok === false) {
this.mostrarErro(data.erro || "Não foi possível adicionar as entregas de termo.")
return
}
// Recarrega para refletir o valor atualizado do motorista.
window.location.reload()
} catch (e) {
this.mostrarErro("Erro ao adicionar as entregas de termo. Tente novamente.")
} finally {
btn.disabled = false
}
}
mostrarErro(msg) {
this.erroTarget.textContent = msg
this.erroTarget.classList.remove("hidden")
}
}