From e5c1439f1905e48a9cc48aa699cdeebb6854fb03 Mon Sep 17 00:00:00 2001 From: Marcos Reifonas Date: Mon, 21 Sep 2026 22:49:06 +0000 Subject: [PATCH] feat: adicionar teclado touch e input direto para quantidade parcial no Modo Smart --- .../smart/components/SmartProducaoFlow.tsx | 233 +++++++++++++----- 1 file changed, 175 insertions(+), 58 deletions(-) diff --git a/src/pages/smart/components/SmartProducaoFlow.tsx b/src/pages/smart/components/SmartProducaoFlow.tsx index 1f7c46f..ca4090d 100644 --- a/src/pages/smart/components/SmartProducaoFlow.tsx +++ b/src/pages/smart/components/SmartProducaoFlow.tsx @@ -9,10 +9,12 @@ import { Check, Layers, Plus, + Minus, RotateCcw, AlertTriangle, ChevronRight, - Filter + Filter, + Delete } from 'lucide-react'; import { OFAtiva } from '@/hooks/useOFsAtivas'; import { useProcessosFabricacao, ProcessoFabricacao } from '@/hooks/useProcessosFabricacao'; @@ -523,20 +525,36 @@ export const SmartProducaoFlow: React.FC = ({ /> - {/* Botão Gigante de Ação de Apontar */} -
+ {/* Botões de Ação no Card */} +
+ + {!concluida && ( + + )}
); @@ -560,45 +578,88 @@ export const SmartProducaoFlow: React.FC = ({ } // ───────────────────────────────────────────────────────────── - // RENDER: ETAPA 1.4 — APONTAMENTO DA QUANTIDADE (TECLADO RÁPIDO) + // RENDER: ETAPA 1.4 — APONTAMENTO DA QUANTIDADE (TECLADO TOUCH + INPUT DIRETO) // ───────────────────────────────────────────────────────────── if (etapaAtual === 'quantidade' && pecaSelecionada && processoSelecionado) { const key = `${pecaSelecionada.id}_${processoSelecionado.id}`; const jaProduzido = mapaProducao.get(key) || 0; const saldoPendente = Math.max(0, pecaSelecionada.quantidade - jaProduzido); + // Ajuste por incremento const somarQtd = (valor: number) => { smartAudio.playClick(); setQtdApontar((prev) => { - const nova = prev + valor; + const nova = Math.max(1, prev + valor); return saldoPendente > 0 ? Math.min(saldoPendente, nova) : nova; }); }; + // Pressionar tecla do teclado numérico touch (0-9) + const handleDigitoTeclado = (digito: number) => { + smartAudio.playClick(); + setQtdApontar((prev) => { + // Se estiver em 0 ou for primeira digitação + const strAtual = prev <= 0 ? '' : prev.toString(); + const novaStr = strAtual + digito.toString(); + const novoValor = parseInt(novaStr, 10) || 0; + if (saldoPendente > 0 && novoValor > saldoPendente) { + smartAudio.playAlert(); + toast.warning(`Limite de saldo: máximo de ${saldoPendente} unidades`); + return saldoPendente; + } + return novoValor; + }); + }; + + // Apagar último dígito (Backspace) + const handleBackspace = () => { + smartAudio.playClick(); + setQtdApontar((prev) => { + const str = prev.toString(); + if (str.length <= 1) return 0; + return parseInt(str.slice(0, -1), 10) || 0; + }); + }; + + // Limpar / Zerar + const handleLimpar = () => { + smartAudio.playClick(); + setQtdApontar(0); + }; + + // Definir Todas const definirTodas = () => { smartAudio.playClick(); setQtdApontar(saldoPendente > 0 ? saldoPendente : 1); }; - const zerar = () => { - smartAudio.playClick(); - setQtdApontar(1); + // Digitação direta no input pelo teclado físico ou celular + const handleInputChange = (e: React.ChangeEvent) => { + const val = e.target.value.replace(/\D/g, ''); + const num = parseInt(val, 10) || 0; + if (saldoPendente > 0 && num > saldoPendente) { + setQtdApontar(saldoPendente); + smartAudio.playAlert(); + toast.warning(`Máximo permitido: ${saldoPendente} unidades`); + } else { + setQtdApontar(num); + } }; return ( -
+
{/* Resumo da Peça no Topo */} -
+
- + {pecaSelecionada.marca} - + {processoSelecionado.nome}
-
- {pecaSelecionada.descricao} +
+ {pecaSelecionada.descricao || 'Peça Estrutural'}
Total da Peça: {pecaSelecionada.quantidade} un @@ -608,78 +669,134 @@ export const SmartProducaoFlow: React.FC = ({
- {/* Display da Quantidade Selecionada */} -
- - Quantidade a Apontar Agora + {/* Visor / Input Central da Quantidade com botões finos -1 e +1 */} +
+ + Digite ou Escolha a Quantidade a Apontar -
-
- - {qtdApontar} - -
+ +
+ + {/* Input Numérico Editável Direto (Toque para digitar ou use o teclado da tela) */} +
+ +
+ +
- {/* Teclado de Ações Rápidas (Botões Gigantes) */} -
- - + {/* Pílulas de Atalhos Rápidos (+5, +10, +25, TODAS) */} +
+ + +
+ + {/* Teclado Numérico Touch de Chão de Fábrica (0 a 9, C, ⌫) */} +
+ {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => ( + + ))} + + +
{/* Botão Gigante de Confirmação com Feedback Imediato */} -
+
@@ -692,7 +809,7 @@ export const SmartProducaoFlow: React.FC = ({ smartAudio.playClick(); setEtapaAtual('pecas'); }} - className="w-full h-13 bg-slate-800 border-slate-700 text-slate-300 text-sm font-bold rounded-2xl active:scale-98" + className="w-full h-11 bg-slate-800 border-slate-700 text-slate-300 text-xs font-bold rounded-xl active:scale-98" > Cancelar e Voltar à Lista