dev #518
@ -3,7 +3,7 @@ import { createCalculator } from '@/util/calc-utils'
|
||||
import '@/styles/calc.scss'
|
||||
|
||||
export const CalculatorInput = forwardRef(
|
||||
({ value, onChange, label, options = {}, id, className = 'calculator-input', readOnly = false, placeholder, name='', disabled = false }, ref) => {
|
||||
({ value, onChange, label, options = {}, id, className = 'calculator-input', readOnly = false, placeholder, name='', disabled = false, maxLength = 6 }, ref) => {
|
||||
const [showKeypad, setShowKeypad] = useState(false)
|
||||
const [displayValue, setDisplayValue] = useState(value || '0')
|
||||
const [hasOperation, setHasOperation] = useState(false)
|
||||
@ -48,6 +48,14 @@ export const CalculatorInput = forwardRef(
|
||||
const calculator = calculatorRef.current
|
||||
let newDisplayValue = ''
|
||||
|
||||
// maxLength 체크
|
||||
if (maxLength > 0) {
|
||||
const currentLength = (calculator.currentOperand || '').length + (calculator.previousOperand || '').length + (calculator.operation || '').length
|
||||
if (currentLength >= maxLength) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 소수점 이하 2자리 제한 로직 추가
|
||||
const shouldPreventInput = (value) => {
|
||||
if (!value) return false
|
||||
@ -57,6 +65,10 @@ export const CalculatorInput = forwardRef(
|
||||
|
||||
// 숫자 추가 함수
|
||||
const appendNumber = (current, num) => {
|
||||
// maxLength 체크
|
||||
if (maxLength > 0 && (current + num).length > maxLength) {
|
||||
return current
|
||||
}
|
||||
// 현재 값이 0이고 소수점이 없을 때 0이 아닌 숫자를 입력하면 대체
|
||||
if (current === '0' && num !== '.' && !current.includes('.')) {
|
||||
return num.toString()
|
||||
@ -407,6 +419,7 @@ export const CalculatorInput = forwardRef(
|
||||
placeholder={placeholder}
|
||||
autoComplete={'off'}
|
||||
disabled={disabled}
|
||||
maxLength={maxLength}
|
||||
/>
|
||||
|
||||
{showKeypad && !readOnly && (
|
||||
|
||||
@ -24,6 +24,7 @@ import { useSwal } from '@/hooks/useSwal'
|
||||
import { QcastContext } from '@/app/QcastProvider'
|
||||
import { useCanvasMenu } from '@/hooks/common/useCanvasMenu'
|
||||
import {normalizeDigits, normalizeDecimal} from '@/util/input-utils'
|
||||
import { CalculatorInput } from '@/components/common/input/CalcInput'
|
||||
export default function Estimate({}) {
|
||||
const [uniqueData, setUniqueData] = useState([])
|
||||
const [handlePricingFlag, setHandlePricingFlag] = useState(false)
|
||||
@ -2106,25 +2107,60 @@ export default function Estimate({}) {
|
||||
</td>
|
||||
<td>
|
||||
<div className="input-wrap" style={{ width: '100%' }}>
|
||||
<input
|
||||
type="text"
|
||||
className="input-light al-r"
|
||||
{/*<input*/}
|
||||
{/* type="text"*/}
|
||||
{/* className="input-light al-r"*/}
|
||||
{/* value={convertNumberToPriceDecimal(item?.amount?.replaceAll(',', ''))}*/}
|
||||
{/* disabled={item.itemId === '' || !!item?.paDispOrder}*/}
|
||||
{/* onChange={(e) => {*/}
|
||||
{/* onChangeAmount(e.target.value, item.dispOrder, index)*/}
|
||||
{/* }}*/}
|
||||
{/* maxLength={6}*/}
|
||||
{/*/>*/}
|
||||
<CalculatorInput
|
||||
className={"input-light al-r"}
|
||||
value={convertNumberToPriceDecimal(item?.amount?.replaceAll(',', ''))}
|
||||
disabled={item.itemId === '' || !!item?.paDispOrder}
|
||||
onChange={(e) => {
|
||||
onChangeAmount(e.target.value, item.dispOrder, index)
|
||||
onChange={(value) =>{
|
||||
onChangeAmount(value, item.dispOrder, index)
|
||||
}}
|
||||
maxLength={6}
|
||||
/>
|
||||
options={{
|
||||
allowNegative: false,
|
||||
allowDecimal: false
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</td>
|
||||
<td>{item.unit}</td>
|
||||
<td>
|
||||
<div className="form-flex-wrap">
|
||||
<div className="input-wrap mr5">
|
||||
<input
|
||||
type="text"
|
||||
className="input-light al-r"
|
||||
{/*<input*/}
|
||||
{/* type="text"*/}
|
||||
{/* className="input-light al-r"*/}
|
||||
{/* value={*/}
|
||||
{/* item.openFlg === '1'*/}
|
||||
{/* ? 'OPEN'*/}
|
||||
{/* : convertNumberToPriceDecimal(item?.showSalePrice === '0' ? null : item?.salePrice?.replaceAll(',', ''))*/}
|
||||
{/* }*/}
|
||||
{/* disabled={*/}
|
||||
{/* item.openFlg === '1'*/}
|
||||
{/* ? true*/}
|
||||
{/* : estimateContextState?.estimateType === 'YJSS'*/}
|
||||
{/* ? item?.paDispOrder*/}
|
||||
{/* ? true*/}
|
||||
{/* : item.pkgMaterialFlg !== '1'*/}
|
||||
{/* : item.itemId === '' || !!item?.paDispOrder*/}
|
||||
{/* ? true*/}
|
||||
{/* : item.openFlg === '1'*/}
|
||||
{/* }*/}
|
||||
{/* onChange={(e) => {*/}
|
||||
{/* onChangeSalePrice(e.target.value, item.dispOrder, index)*/}
|
||||
{/* }}*/}
|
||||
{/* maxLength={12}*/}
|
||||
{/*/>*/}
|
||||
<CalculatorInput
|
||||
className={"input-light al-r"}
|
||||
value={
|
||||
item.openFlg === '1'
|
||||
? 'OPEN'
|
||||
@ -2140,13 +2176,15 @@ export default function Estimate({}) {
|
||||
: item.itemId === '' || !!item?.paDispOrder
|
||||
? true
|
||||
: item.openFlg === '1'
|
||||
? true
|
||||
: false
|
||||
}
|
||||
onChange={(e) => {
|
||||
onChangeSalePrice(e.target.value, item.dispOrder, index)
|
||||
onChange={(value) =>{
|
||||
onChangeSalePrice(value, item.dispOrder, index)
|
||||
}}
|
||||
maxLength={12}
|
||||
options={{
|
||||
allowNegative: false,
|
||||
allowDecimal: false
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{item.openFlg === '1' && (
|
||||
|
||||
@ -871,7 +871,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
//newPStart.y = wallLine.y1;
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.x2).minus(roofLine.x2).abs().toNumber()
|
||||
newPStart.y = Big(wallBaseLine.y1).minus(rLineM).abs().toNumber()
|
||||
newPStart.y = Big(wallBaseLine.y1).minus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPStart.y, x: newPStart.x })
|
||||
if (inLine) {
|
||||
if (inLine.x2 > inLine.x1) {
|
||||
@ -927,7 +927,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.x2).minus(roofLine.x2).abs().toNumber()
|
||||
newPEnd.y = Big(wallBaseLine.y2).plus(rLineM).abs().toNumber()
|
||||
newPEnd.y = Big(wallBaseLine.y2).plus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPEnd.y, x: newPEnd.x })
|
||||
if (inLine) {
|
||||
if (inLine.x2 > inLine.x1) {
|
||||
@ -1041,7 +1041,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
//newPStart.y = wallLine.y1;
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.x1).minus(roofLine.x1).abs().toNumber()
|
||||
newPStart.y = Big(wallBaseLine.y1).plus(rLineM).abs().toNumber()
|
||||
newPStart.y = Big(wallBaseLine.y1).plus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPStart.y, x: newPStart.x })
|
||||
if (inLine) {
|
||||
if (inLine.x2 > inLine.x1) {
|
||||
@ -1096,7 +1096,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.x2).minus(roofLine.x2).abs().toNumber()
|
||||
newPEnd.y = Big(wallBaseLine.y2).minus(rLineM).abs().toNumber()
|
||||
newPEnd.y = Big(wallBaseLine.y2).minus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPEnd.y, x: newPEnd.x })
|
||||
if (inLine) {
|
||||
if (inLine.x2 > inLine.x1) {
|
||||
@ -1229,7 +1229,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
} else {
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.y1).minus(roofLine.y1).abs().toNumber()
|
||||
newPStart.x = Big(wallBaseLine.x1).plus(rLineM).abs().toNumber()
|
||||
newPStart.x = Big(wallBaseLine.x1).plus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPStart.y, x: newPStart.x })
|
||||
if (inLine) {
|
||||
if (inLine.y2 > inLine.y1) {
|
||||
@ -1282,7 +1282,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
//newPEnd.x = wallLine.x2;
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.y2).minus(roofLine.y2).abs().toNumber()
|
||||
newPEnd.x = Big(wallBaseLine.x2).minus(rLineM).abs().toNumber()
|
||||
newPEnd.x = Big(wallBaseLine.x2).minus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPEnd.y, x: newPEnd.x })
|
||||
if (inLine) {
|
||||
if (inLine.y1 > inLine.y2) {
|
||||
@ -1392,7 +1392,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
//newPStart.x = wallLine.x1;
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.y1).minus(roofLine.y1).abs().toNumber()
|
||||
newPStart.x = Big(wallBaseLine.x1).minus(rLineM).abs().toNumber()
|
||||
newPStart.x = Big(wallBaseLine.x1).minus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPStart.y, x: newPStart.x })
|
||||
if (inLine) {
|
||||
if (inLine.y2 > inLine.y1) {
|
||||
@ -1446,7 +1446,7 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
||||
//newPEnd.x = wallLine.x2;
|
||||
//외곽 라인 그리기
|
||||
const rLineM = Big(wallBaseLine.y2).minus(roofLine.y2).abs().toNumber()
|
||||
newPEnd.x = Big(wallBaseLine.x2).plus(rLineM).abs().toNumber()
|
||||
newPEnd.x = Big(wallBaseLine.x2).plus(rLineM).toNumber()
|
||||
const inLine = findLineContainingPoint(innerLines, { y: newPEnd.y, x: newPEnd.x })
|
||||
if (inLine) {
|
||||
if (inLine.y1 > inLine.y2) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user