diff --git a/src/components/ui/NumberField.tsx b/src/components/ui/NumberField.tsx new file mode 100644 index 0000000..553a175 --- /dev/null +++ b/src/components/ui/NumberField.tsx @@ -0,0 +1,46 @@ +import React from "react"; + +interface NumberFieldProps + extends Omit, 'value' | 'onchange'>{ + value : number + onCommit : (n:number) => void + fallback ?: number + allowNegative ? :boolean + } + +export const NumberField : React.FC = ({ + value, onCommit, fallback, allowNegative +}) => { + const [draft,setDraft] = React.useState (null) + + const pattern = allowNegative ? /^-?\d*\.?\d*$/ : /^\d*\.?\d*$/; + + const handleChange = (e: React.ChangeEvent) => { + const text = e.target.value + if(!pattern.test(text)) return + setDraft(text) + const n = Number(text) + if(text != '' && !isNaN(n)) onCommit(n); + } + const handleBlur = () =>{ + const n = Number(draft ?? '') + if( draft == '' || draft == null || isNaN(n)){ + if(fallback !== undefined){ + onCommit(fallback) + } + } + + setDraft(null); + } + + return( + + + ) +} diff --git a/src/modules/deliveryChallan/CreateDeliveryChallanModule.tsx b/src/modules/deliveryChallan/CreateDeliveryChallanModule.tsx index 92cbc37..ab0d693 100644 --- a/src/modules/deliveryChallan/CreateDeliveryChallanModule.tsx +++ b/src/modules/deliveryChallan/CreateDeliveryChallanModule.tsx @@ -17,6 +17,7 @@ import { CreateProductModal } from "../../components/modals/CreateProductModal"; import { CreateCustomerModal } from "../../components/modals/CreateCustomerModal"; import { useUiStore } from "../../store/uiStore"; import { Input } from "../../components/ui/Input"; +import { NumberField } from "../../components/ui/NumberField"; type ChallanItem = { product_id: number; @@ -442,10 +443,10 @@ export function CreateDeliveryChallanModule() {
- handleSetItemQty(item.product_id, Number(e.target.value))} - onBlur={() => { if (item.quantity < 1) handleSetItemQty(item.product_id, 1); }} + handleSetItemQty(item.product_id, n)} + fallback={1} className="w-10 h-6 text-center text-[10px] font-black border-0 bg-transparent focus:ring-0" /> diff --git a/src/modules/inventory/InventoryModule.tsx b/src/modules/inventory/InventoryModule.tsx index d2bb1f3..06b2329 100644 --- a/src/modules/inventory/InventoryModule.tsx +++ b/src/modules/inventory/InventoryModule.tsx @@ -12,6 +12,7 @@ import { Input } from "../../components/ui/Input"; import { ModulePage } from "../../components/ModulePage"; import { DataTable } from "../../components/DataTable"; import { useUiStore } from "../../store/uiStore"; +import { NumberField } from "../../components/ui/NumberField"; export function InventoryModule() { const { t } = useTranslation("inventory"); @@ -232,11 +233,12 @@ export function InventoryModule() {
- setStockAdjustment({ ...stockAdjustment, quantity_change: parseInt(e.target.value) || 0 })} + value={stockAdjustment.quantity_change} + onCommit={(n) => setStockAdjustment({ ...stockAdjustment, quantity_change: Math.trunc(n)})} + allowNegative placeholder={t("adjust_placeholder")} className="w-full" /> diff --git a/src/modules/invoices/CreateInvoiceModule.tsx b/src/modules/invoices/CreateInvoiceModule.tsx index ff240e4..2a8cf7e 100644 --- a/src/modules/invoices/CreateInvoiceModule.tsx +++ b/src/modules/invoices/CreateInvoiceModule.tsx @@ -19,6 +19,7 @@ import { Input } from "../../components/ui/Input"; import { SearchableSelect } from "../../components/ui/SearchableSelect"; import { Select } from "../../components/ui/Select"; import { formatCurrency } from "../../lib/utils"; +import { NumberField } from "../../components/ui/NumberField"; const PROVINCES = ["Sindh", "Punjab", "Khyber Pakhtunkhwa", "Balochistan", "Islamabad Capital Territory", "Gilgit-Baltistan", "Azad Kashmir"]; const REGISTRATION_TYPES = ["Registered", "Unregistered"]; @@ -517,10 +518,10 @@ export function CreateInvoiceModule() {
{item.uom}
- updateItem(idx, 'unit_price', Number(e.target.value))} + value={item.unit_price} + onCommit={(n) => updateItem(idx, 'unit_price',n)} className="w-full h-8 bg-surface border border-border rounded px-2 text-sm font-bold" />