diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 4a3337db..f6517960 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -23,6 +23,7 @@ import { usePopup } from '@/hooks/usePopup' import { useSwal } from '@/hooks/useSwal' import { QcastContext } from '@/app/QcastProvider' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' +import {normalizeDigits, normalizeDecimal} from '@/util/input-utils' export default function Estimate({}) { const [uniqueData, setUniqueData] = useState([]) const [handlePricingFlag, setHandlePricingFlag] = useState(false) @@ -645,11 +646,14 @@ export default function Estimate({}) { newValue = parts[0] + '.' + parts[1].substring(0, 2) } - let pkgAsp = newValue || '0' + let pkgAsp = normalizeDecimal(newValue || '0') //현재 PKG용량값 가져오기 let totVolKw = estimateContextState.totVolKw * 1000 - let pkgTotPrice = parseFloat(pkgAsp?.replaceAll(',', '')) * totVolKw * 1000 + // let pkgTotPrice = parseFloat(pkgAsp?.replaceAll(',', '')) * totVolKw * 1000 + + const pkgAspNumber = Number(normalizeDecimal(pkgAsp)) + const pkgTotPrice = pkgAspNumber * totVolKw * 1000 setEstimateContextState({ pkgAsp: pkgAsp, @@ -663,7 +667,7 @@ export default function Estimate({}) { // 수량 변경 const onChangeAmount = (value, dispOrder, index) => { //itemChangeFlg = 1, partAdd = 0 셋팅 - let amount = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) + let amount = Number(normalizeDigits(value)) if (isNaN(amount)) { amount = '0' @@ -701,7 +705,8 @@ export default function Estimate({}) { // 단가 변경 const onChangeSalePrice = (value, dispOrder, index) => { //itemChangeFlg, partAdd 받아온 그대로 - let salePrice = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) + let salePrice = Number(normalizeDecimal(value)) + if (isNaN(salePrice)) { salePrice = 0 } else { @@ -940,7 +945,7 @@ export default function Estimate({}) { delete item.showSalePrice delete item.showSaleTotPrice if (item.delFlg === '0') { - let amount = Number(item.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) || 0 + let amount = Number(normalizeDigits(item.amount)) || 0 let price if (amount === 0) { price = 0 @@ -975,7 +980,7 @@ export default function Estimate({}) { makeUniqueSpecialNoteCd(itemList) itemList.forEach((item) => { if (item.delFlg === '0') { - let amount = Number(item.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) || 0 + let amount = Number(normalizeDigits(item.amount)) || 0 let salePrice if (item.moduleFlg === '1') { const volKw = (item.pnowW * amount) / 1000 @@ -1009,8 +1014,8 @@ export default function Estimate({}) { } } }) - let pkgAsp = estimateContextState.pkgAsp ? Number(estimateContextState.pkgAsp.replaceAll(',', '')) : 0 - + //let pkgAsp = estimateContextState.pkgAsp ? Number(estimateContextState.pkgAsp.replaceAll(',', '')) : 0 + const pkgAsp = Number(normalizeDecimal(estimateContextState.pkgAsp)) totals.pkgTotPrice = pkgAsp * totals.totVolKw * 1000 totals.supplyPrice = totals.addSupplyPrice + totals.pkgTotPrice totals.vatPrice = totals.supplyPrice * 0.1 @@ -1069,7 +1074,7 @@ export default function Estimate({}) { let dispCableFlgCnt = 0 estimateContextState.itemList.forEach((item) => { if (item.delFlg === '0') { - let amount = Number(item.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) || 0 + let amount = Number(normalizeDigits(item.amount)) || 0 let salePrice if (item.moduleFlg === '1') { const volKw = (item.pnowW * amount) / 1000 @@ -1102,7 +1107,7 @@ export default function Estimate({}) { item.showSaleTotPrice = '0' } - if (item.dispCableFlg === '1' ) { + if (item.dispCableFlg === '1') { dispCableFlgCnt++ if(item.itemTpCd === 'M12' || item.itemTpCd === 'S13') { setCableDbItem(item.itemId) @@ -1118,9 +1123,10 @@ export default function Estimate({}) { setCableDbItem('100037') } - let pkgAsp = estimateContextState.pkgAsp ? Number(estimateContextState.pkgAsp.replaceAll(',', '')) : 0 - + // let pkgAsp = estimateContextState.pkgAsp ? Number(estimateContextState.pkgAsp.replaceAll(',', '')) : 0 + const pkgAsp = Number(normalizeDecimal(estimateContextState.pkgAsp)) totals.pkgTotPrice = pkgAsp * totals.totVolKw * 1000 + totals.supplyPrice = totals.addSupplyPrice + totals.pkgTotPrice totals.vatPrice = totals.supplyPrice * 0.1 totals.totPrice = totals.supplyPrice + totals.vatPrice @@ -1150,7 +1156,7 @@ export default function Estimate({}) { delete item.showSalePrice delete item.showSaleTotPrice if (item.delFlg === '0') { - let amount = Number(item.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) || 0 + let amount = Number(normalizeDigits(item.amount)) || 0 let price if (amount === 0) { price = 0 @@ -1176,10 +1182,6 @@ export default function Estimate({}) { if (item.dispCableFlg === '1') { dispCableFlgCnt++ - } - - if (item.dispCableFlg === '1'){ - if(item.itemTpCd === 'M12' || item.itemTpCd === 'S13') { setCableDbItem(item.itemId) }else{ diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx index f10322ca..938b5244 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx @@ -7,6 +7,7 @@ import { useState } from 'react' import { currentObjectState } from '@/store/canvasAtom' import { useAuxiliaryDrawing } from '@/hooks/roofcover/useAuxiliaryDrawing' import { useSwal } from '@/hooks/useSwal' +import { normalizeDigits } from '@/util/input-utils' export default function AuxiliaryEdit(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -40,15 +41,15 @@ export default function AuxiliaryEdit(props) { if (currentObject) { copy( currentObject, - arrow2 ? (arrow2 === '←' ? Number(+horizonSize / 10) * -1 : Number(+horizonSize / 10)) : 0, - arrow1 ? (arrow1 === '↑' ? Number(+verticalSize / 10) * -1 : Number(+verticalSize / 10)) : 0, + arrow2 ? (arrow2 === '←' ? (Number(normalizeDigits(horizonSize)) / 10) * -1 : Number(normalizeDigits(horizonSize)) / 10) : 0, + arrow1 ? (arrow1 === '↑' ? (Number(normalizeDigits(verticalSize)) / 10) * -1 : Number(normalizeDigits(verticalSize)) / 10) : 0, ) } } else { move( currentObject, - arrow2 ? (arrow2 === '←' ? Number(+horizonSize / 10) * -1 : Number(+horizonSize / 10)) : 0, - arrow1 ? (arrow1 === '↑' ? Number(+verticalSize / 10) * -1 : Number(+verticalSize / 10)) : 0, + arrow2 ? (arrow2 === '←' ? (Number(normalizeDigits(horizonSize)) / 10) * -1 : Number(normalizeDigits(horizonSize)) / 10) : 0, + arrow1 ? (arrow1 === '↑' ? (Number(normalizeDigits(verticalSize)) / 10) * -1 : Number(normalizeDigits(verticalSize)) / 10) : 0, ) } @@ -65,7 +66,7 @@ export default function AuxiliaryEdit(props) {

{getMessage('length')}

- setVerticalSize(e.target.value)} /> + setVerticalSize(normalizeDigits(e.target.value))} />
mm
@@ -87,7 +88,7 @@ export default function AuxiliaryEdit(props) {
- setHorizonSize(e.target.value)} /> + setHorizonSize(normalizeDigits(e.target.value))} />
mm
diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx index 3bb94a4f..5a9cde6f 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx @@ -7,6 +7,7 @@ import { canvasState, currentObjectState } from '@/store/canvasAtom' import { useEffect, useState } from 'react' import Big from 'big.js' import { calcLineActualSize, calcLinePlaneSize } from '@/util/qpolygon-utils' +import { normalizeDigits } from '@/util/input-utils' export default function AuxiliarySize(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -42,7 +43,8 @@ export default function AuxiliarySize(props) { if (checkedRadio === 2) setValue2(value) setSize(0) } else { - value = Big(value.replace(/[^0-9]/g, '')) + //value = Big(value.replace(/[^0-9]/g, '')) + value = Big(normalizeDigits(value)) if (checkedRadio === 1) setValue1(value.toNumber()) if (checkedRadio === 2) setValue2(value.toNumber()) setSize(value.div(10).toNumber()) diff --git a/src/components/floor-plan/modal/basic/step/Module.jsx b/src/components/floor-plan/modal/basic/step/Module.jsx index 8ab6f394..2402b3e0 100644 --- a/src/components/floor-plan/modal/basic/step/Module.jsx +++ b/src/components/floor-plan/modal/basic/step/Module.jsx @@ -10,6 +10,7 @@ import { useDebounceValue } from 'usehooks-ts' import { moduleSelectionDataState } from '@/store/selectedModuleOptions' import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController' import { isObjectNotEmpty } from '@/util/common-utils' +import { normalizeDecimal} from '@/util/input-utils' export default function Module({ setTabNum }) { const { getMessage } = useMessage() @@ -188,7 +189,7 @@ export default function Module({ setTabNum }) { type="text" className="input-origin block" value={inputInstallHeight} - onChange={(e) => setInputInstallHeight(e.target.value)} + onChange={(e) => setInputInstallHeight(normalizeDecimal(e.target.value))} />
m @@ -225,7 +226,7 @@ export default function Module({ setTabNum }) { type="text" className="input-origin block" value={inputVerticalSnowCover} - onChange={(e) => setInputVerticalSnowCover(e.target.value)} + onChange={(e) => setInputVerticalSnowCover(normalizeDecimal(e.target.value))} />
cm diff --git a/src/components/floor-plan/modal/basic/step/Orientation.jsx b/src/components/floor-plan/modal/basic/step/Orientation.jsx index 0b603aed..14618a20 100644 --- a/src/components/floor-plan/modal/basic/step/Orientation.jsx +++ b/src/components/floor-plan/modal/basic/step/Orientation.jsx @@ -8,6 +8,7 @@ import QSelectBox from '@/components/common/select/QSelectBox' import { roofsState } from '@/store/roofAtom' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import Swal from 'sweetalert2' +import { normalizeDecimal} from '@/util/input-utils' export const Orientation = forwardRef((props, ref) => { const { getMessage } = useMessage() @@ -177,9 +178,10 @@ export const Orientation = forwardRef((props, ref) => { setInputCompasDeg('-0') return } - if (Number(e) >= -180 && Number(e) <= 180) { - if (numberCheck(Number(e))) { - setInputCompasDeg(Number(e)) + const n = Number(normalizeDecimal(e)) + if (n >= -180 && n <= 180) { + if (numberCheck(n)) { + setInputCompasDeg(n) } } else { setInputCompasDeg(compasDeg) @@ -398,7 +400,7 @@ export const Orientation = forwardRef((props, ref) => {
{getMessage('modal.module.basic.setting.module.placement.area')}
- setInputMargin(e.target.value)} /> + setInputMargin(normalizeDecimal(e.target.value))} />
m
@@ -427,10 +429,10 @@ export const Orientation = forwardRef((props, ref) => { {getMessage('modal.module.basic.setting.module.fitting.height')}
handleChangeInstallHeight(e.target.value)} + onChange={(e) => handleChangeInstallHeight(normalizeDecimal(e.target.value))} />
m @@ -455,10 +457,10 @@ export const Orientation = forwardRef((props, ref) => { {getMessage('modal.module.basic.setting.module.standard.snowfall.amount')}
handleChangeVerticalSnowCover(e.target.value)} + onChange={(e) => handleChangeVerticalSnowCover(normalizeDecimal(e.target.value))} />
cm diff --git a/src/components/floor-plan/modal/basic/step/Placement.jsx b/src/components/floor-plan/modal/basic/step/Placement.jsx index 497d1307..e96cf5c0 100644 --- a/src/components/floor-plan/modal/basic/step/Placement.jsx +++ b/src/components/floor-plan/modal/basic/step/Placement.jsx @@ -12,6 +12,7 @@ import { import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { moduleSelectionDataState, selectedModuleState } from '@/store/selectedModuleOptions' import { isObjectNotEmpty } from '@/util/common-utils' +import { normalizeDigits } from '@/util/input-utils' import Image from 'next/image' const Placement = forwardRef((props, refs) => { @@ -155,7 +156,7 @@ const Placement = forwardRef((props, refs) => { newLayoutSetup[index] = { ...newLayoutSetup[index], moduleId: itemId, - [e.target.name]: Number(e.target.value), + [e.target.name]: Number(normalizeDigits(e.target.value)), } props.setLayoutSetup(newLayoutSetup) } diff --git a/src/components/floor-plan/modal/basic/step/Trestle.jsx b/src/components/floor-plan/modal/basic/step/Trestle.jsx index e2e7bb78..d017803a 100644 --- a/src/components/floor-plan/modal/basic/step/Trestle.jsx +++ b/src/components/floor-plan/modal/basic/step/Trestle.jsx @@ -9,6 +9,7 @@ import { moduleSelectionDataState, selectedModuleState } from '@/store/selectedM import { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import Swal from 'sweetalert2' +import { normalizeDigits } from '@/util/input-utils' const Trestle = forwardRef((props, ref) => { const { tabNum, setTabNum, trestleTrigger, roofs, setRoofs, moduleSelectionData, setModuleSelectionData, setRoofsStore } = props @@ -558,7 +559,19 @@ const Trestle = forwardRef((props, ref) => { type="text" className="input-origin block" value={lengthBase} - onChange={(e) => onChangeLength(e.target.value)} + onChange={(e) => { + const v = e.target.value + if (v === '') { + onChangeLength('') + return + } + const n = Number(normalizeDigits(v)) + if (Number.isNaN(n)) { + onChangeLength('') + } else { + onChangeLength(n) + } + }} disabled={selectedRoof.lenAuth === 'R'} />
@@ -598,7 +611,19 @@ const Trestle = forwardRef((props, ref) => { type="text" className="input-origin block" disabled={selectedRoof.roofPchAuth === 'R'} - onChange={(e) => onChangeHajebichi(e.target.value)} + onChange={(e) => { + const v = e.target.value + if (v === '') { + onChangeHajebichi('') + return + } + const n = Number(normalizeDigits(v)) + if (Number.isNaN(n)) { + onChangeHajebichi('') + } else { + onChangeHajebichi(n) + } + }} value={hajebichi} /> diff --git a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx index 281ae5a8..8b880336 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx @@ -12,6 +12,7 @@ import { selectedModuleState } from '@/store/selectedModuleOptions' import { circuitNumDisplaySelector } from '@/store/settingAtom' import { useContext, useEffect, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' +import { normalizeDigits } from '@/util/input-utils' export default function PassivityCircuitAllocation(props) { const { @@ -580,7 +581,20 @@ export default function PassivityCircuitAllocation(props) { value={circuitNumber} min={1} max={99} - onChange={(e) => setCircuitNumber(e.target.value)} + onChange={(e) => { + const v = e.target.value + if (v === '') { + setCircuitNumber('') + return + } + const n = Number(normalizeDigits(v)) + if (Number.isNaN(n)) { + setCircuitNumber('') + } else { + const clamped = Math.max(1, Math.min(99, n)) + setCircuitNumber(clamped) + } + }} />