Skip to content

Commit 6f39457

Browse files
authored
fix: state tax fixes for tax_rate fields not submitting (#397)
1 parent 3c9ae29 commit 6f39457

File tree

4 files changed

+34
-11
lines changed

4 files changed

+34
-11
lines changed

src/components/Common/TaxInputs/TaxInputs.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ interface CompR {
2525

2626
type NumberFieldProps = { isCurrency?: boolean; isPercent?: boolean }
2727

28+
type TextInputProps = { type?: string; isPercent?: boolean }
29+
2830
export function QuestionInput({
2931
questionType,
3032
...props
@@ -85,7 +87,13 @@ export function SelectInput({ question, requirement, isDisabled = false }: EmpQ
8587
)
8688
}
8789

88-
export function TextInput({ question, requirement, isDisabled = false }: EmpQ | CompR) {
90+
export function TextInput({
91+
question,
92+
requirement,
93+
isDisabled = false,
94+
type = 'text',
95+
isPercent = false,
96+
}: (EmpQ | CompR) & TextInputProps) {
8997
const { key, label, description } = question ? question : requirement
9098
const value = question ? question.answers[0]?.value : requirement.value
9199
const mask = requirement?.metadata?.mask ?? null
@@ -103,6 +111,8 @@ export function TextInput({ question, requirement, isDisabled = false }: EmpQ |
103111
isDisabled={isDisabled}
104112
transform={mask ? transform : undefined}
105113
placeholder={mask ? mask : undefined}
114+
type={type}
115+
adornmentEnd={isPercent ? '%' : undefined}
106116
/>
107117
)
108118
}
@@ -225,9 +235,9 @@ export function TaxRateInput({ requirement, question, ...props }: EmpQ | CompR)
225235
}
226236
/>
227237
) : (
228-
<NumberInput requirement={requirement} {...props} isPercent />
238+
<TextInput requirement={requirement} {...props} type="number" isPercent />
229239
)
230240
}
231241

232-
return <NumberInput question={question} {...props} isPercent />
242+
return <TextInput question={question} {...props} type="number" isPercent />
233243
}

src/components/Company/StateTaxes/StateTaxesForm/StateTaxesForm.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,34 @@ function Root({ companyId, state, className, children }: StateTaxesFormProps) {
4343
// Schema and default value generation
4444
const { dynamicSchema, defaultValues } = useMemo(() => {
4545
const schemaShape: Record<string, z.ZodObject<Record<string, z.ZodTypeAny>>> = {}
46-
const values: Partial<Record<string, Record<string, string | boolean>>> = {}
46+
const values: Partial<Record<string, Record<string, string | boolean | undefined>>> = {}
4747

4848
//Looping through each requirement set
4949
stateTaxRequirements.requirementSets?.forEach(requirementSet => {
5050
if (!requirementSet.key) return
5151

5252
const requirementSetKey = requirementSet.key
5353
const requirementShape: Record<string, z.ZodTypeAny> = {}
54-
const requirementValues: Record<string, string | boolean> = {}
54+
const requirementValues: Record<string, string | boolean | undefined> = {}
5555

5656
requirementSet.requirements?.forEach(requirement => {
5757
if (!requirement.key) return
5858

5959
const requirementKey = requirement.key
6060

6161
// --- Default Value Logic ---
62-
requirementValues[requirementKey] = requirement.value ?? ''
62+
requirementValues[requirementKey] =
63+
requirement.metadata?.type === 'radio'
64+
? (requirement.value ?? undefined)
65+
: (requirement.value ?? '')
6366

6467
// --- Schema Logic ---
6568
// Start with a basic string schema
66-
let fieldSchema: z.ZodTypeAny = z.string().min(1)
69+
let fieldSchema: z.ZodTypeAny = z
70+
.string({
71+
required_error: t('validations.required'),
72+
})
73+
.min(1, t('validations.required'))
6774

6875
const validation = requirement.metadata?.validation
6976
// Not all requirements have validation
@@ -87,16 +94,20 @@ function Root({ companyId, state, className, children }: StateTaxesFormProps) {
8794
//Type is one_of
8895
const oneOfValues = validation.rates as string[]
8996
fieldSchema = z
90-
.string()
91-
.min(1)
97+
.string({
98+
required_error: t('validations.required'),
99+
})
100+
.min(1, t('validations.required'))
92101
.refine(val => oneOfValues.includes(val), {
93102
message: t('validations.oneOf', { values: oneOfValues.join(', ') }),
94103
})
95104
}
96105
}
97106
}
98107
if (requirement.metadata?.type === 'radio') {
99-
fieldSchema = z.boolean()
108+
fieldSchema = z.boolean({
109+
required_error: t('validations.required'),
110+
})
100111
}
101112
requirementShape[requirementKey] = fieldSchema
102113
// --- End Schema Logic ---

src/i18n/en/Company.StateTaxes.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
"validations": {
2222
"minValue": "Minimum value is {{min}}",
2323
"maxValue": "Maximum value is {{max}}",
24-
"oneOf": "Value must be one of: {{values}}"
24+
"oneOf": "Value must be one of: {{values}}",
25+
"required": "This field is required"
2526
}
2627
}
2728
}

src/types/i18next.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ export interface CompanyStateTaxes{
354354
"minValue":string;
355355
"maxValue":string;
356356
"oneOf":string;
357+
"required":string;
357358
};
358359
};
359360
};

0 commit comments

Comments
 (0)