diff --git a/apps/builder/src/features/blocks/inputs/number/components/NumberInputSettings.tsx b/apps/builder/src/features/blocks/inputs/number/components/NumberInputSettings.tsx
index 80b90e1b1..6aee9ccf7 100644
--- a/apps/builder/src/features/blocks/inputs/number/components/NumberInputSettings.tsx
+++ b/apps/builder/src/features/blocks/inputs/number/components/NumberInputSettings.tsx
@@ -14,9 +14,11 @@ export const NumberInputSettings = ({ options, onOptionsChange }: Props) => {
onOptionsChange({ ...options, labels: { ...options.labels, placeholder } })
const handleButtonLabelChange = (button: string) =>
onOptionsChange({ ...options, labels: { ...options.labels, button } })
- const handleMinChange = (min?: number) => onOptionsChange({ ...options, min })
- const handleMaxChange = (max?: number) => onOptionsChange({ ...options, max })
- const handleStepChange = (step?: number) =>
+ const handleMinChange = (min?: NumberInputOptions['min']) =>
+ onOptionsChange({ ...options, min })
+ const handleMaxChange = (max?: NumberInputOptions['max']) =>
+ onOptionsChange({ ...options, max })
+ const handleStepChange = (step?: NumberInputOptions['step']) =>
onOptionsChange({ ...options, step })
const handleVariableChange = (variable?: Variable) => {
onOptionsChange({ ...options, variableId: variable?.id })
@@ -38,19 +40,16 @@ export const NumberInputSettings = ({ options, onOptionsChange }: Props) => {
label="Min:"
defaultValue={options.min}
onValueChange={handleMinChange}
- withVariableButton={false}
/>
diff --git a/apps/viewer/src/features/chat/helpers/executeGroup.ts b/apps/viewer/src/features/chat/helpers/executeGroup.ts
index 80efd5b43..76887787a 100644
--- a/apps/viewer/src/features/chat/helpers/executeGroup.ts
+++ b/apps/viewer/src/features/chat/helpers/executeGroup.ts
@@ -14,6 +14,7 @@ import {
isInputBlock,
isIntegrationBlock,
isLogicBlock,
+ isNotEmpty,
} from '@typebot.io/lib'
import { executeLogic } from './executeLogic'
import { getNextGroup } from './getNextGroup'
@@ -195,6 +196,29 @@ const parseInput =
state.typebot.variables
)(block)
}
+ case InputBlockType.NUMBER: {
+ const parsedBlock = deepParseVariables(state.typebot.variables)({
+ ...block,
+ prefilledValue: getPrefilledInputValue(state.typebot.variables)(
+ block
+ ),
+ })
+ return {
+ ...parsedBlock,
+ options: {
+ ...parsedBlock.options,
+ min: isNotEmpty(parsedBlock.options.min as string)
+ ? Number(parsedBlock.options.min)
+ : undefined,
+ max: isNotEmpty(parsedBlock.options.max as string)
+ ? Number(parsedBlock.options.max)
+ : undefined,
+ step: isNotEmpty(parsedBlock.options.step as string)
+ ? Number(parsedBlock.options.step)
+ : undefined,
+ },
+ }
+ }
default: {
return deepParseVariables(state.typebot.variables)({
...block,
diff --git a/packages/schemas/features/blocks/inputs/number.ts b/packages/schemas/features/blocks/inputs/number.ts
index d4abb1690..98a968a05 100644
--- a/packages/schemas/features/blocks/inputs/number.ts
+++ b/packages/schemas/features/blocks/inputs/number.ts
@@ -3,14 +3,15 @@ import { optionBaseSchema, blockBaseSchema } from '../baseSchemas'
import { defaultButtonLabel } from './constants'
import { InputBlockType } from './enums'
import { textInputOptionsBaseSchema } from './text'
+import { variableStringSchema } from '../../utils'
export const numberInputOptionsSchema = optionBaseSchema
.merge(textInputOptionsBaseSchema)
.merge(
z.object({
- min: z.number().optional(),
- max: z.number().optional(),
- step: z.number().optional(),
+ min: z.number().or(variableStringSchema).optional(),
+ max: z.number().or(variableStringSchema).optional(),
+ step: z.number().or(variableStringSchema).optional(),
})
)