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) => {
@@ -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)
+ }
+ }}
/>