Skip to content

Commit ac95046

Browse files
make all income fields required (#275)
1 parent 9be0b64 commit ac95046

File tree

6 files changed

+56
-32
lines changed

6 files changed

+56
-32
lines changed

frontend/app/.server/locales/estimator-en.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
"fields": {
66
"claimed-income": {
77
"error": {
8-
"invalid": "Your <abbr>UCCB</abbr> and <abbr>RDSP</abbr> income is invalid"
8+
"invalid": "Your <abbr>UCCB</abbr> and <abbr>RDSP</abbr> income is invalid",
9+
"required": "Your <abbr>UCCB</abbr> and <abbr>RDSP</abbr> income is required"
910
},
1011
"info-label": "Information",
1112
"label": "Enter your Universal Child Care Benefit (<abbr>UCCB</abbr>) and Registered Disability Savings Plan (<abbr>RDSP</abbr>) income."
1213
},
1314
"claimed-repayment": {
1415
"error": {
15-
"invalid": "Your <abbr>UCCB</abbr> and <abbr>RDSP</abbr> repayment is invalid"
16+
"invalid": "Your <abbr>UCCB</abbr> and <abbr>RDSP</abbr> repayment is invalid",
17+
"required": "Your <abbr>UCCB</abbr> and <abbr>RDSP</abbr> repayment is required"
1618
},
1719
"info-label": "Information",
1820
"label": "Enter your Universal Child Care Benefit (<abbr>UCCB</abbr>) and Registered Disability Savings Plan (<abbr>RDSP</abbr>) repayment."
@@ -28,14 +30,16 @@
2830
"partner": {
2931
"claimed-income": {
3032
"error": {
31-
"invalid": "Your partner's <abbr>UCCB</abbr> and <abbr>RDSP</abbr> income is invalid"
33+
"invalid": "Your partner's <abbr>UCCB</abbr> and <abbr>RDSP</abbr> income is invalid",
34+
"required": "Your partner's <abbr>UCCB</abbr> and <abbr>RDSP</abbr> income is required"
3235
},
3336
"info-label": "Information",
3437
"label": "Enter your partner's Universal Child Care Benefit (<abbr>UCCB</abbr>) and Registered Disability Savings Plan (<abbr>RDSP</abbr>) income."
3538
},
3639
"claimed-repayment": {
3740
"error": {
38-
"invalid": "Your partner's <abbr>UCCB</abbr> and <abbr>RDSP</abbr> repayment is invalid"
41+
"invalid": "Your partner's <abbr>UCCB</abbr> and <abbr>RDSP</abbr> repayment is invalid",
42+
"required": "Your partner's <abbr>UCCB</abbr> and <abbr>RDSP</abbr> repayment is required"
3943
},
4044
"info-label": "Information",
4145
"label": "Your partner's Universal Child Care Benefit (<abbr>UCCB</abbr>) and Registered Disability Savings Plan (<abbr>RDSP</abbr>) repayment"

frontend/app/.server/locales/estimator-fr.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
"fields": {
66
"claimed-income": {
77
"error": {
8-
"invalid": "Votre revenu de <abbr>PUGE</abbr> et <abbr>REEI</abbr> est invalide"
8+
"invalid": "Votre revenu de <abbr>PUGE</abbr> et <abbr>REEI</abbr> est invalide",
9+
"required": "Votre revenu de <abbr>PUGE</abbr> et <abbr>REEI</abbr> est requis"
910
},
1011
"info-label": "Information",
1112
"label": "Entrez votre revenu de la Prestation universelle pour la garde d'enfants (<abbr>PUGE</abbr>) et du Régime enregistré d'épargne-invalidité (<abbr>REEI</abbr>)."
1213
},
1314
"claimed-repayment": {
1415
"error": {
15-
"invalid": "Votre remboursement de <abbr>PUGE</abbr> et <abbr>REEI</abbr> est invalide"
16+
"invalid": "Votre remboursement de <abbr>PUGE</abbr> et <abbr>REEI</abbr> est invalide",
17+
"required": "Votre remboursement de <abbr>PUGE</abbr> et <abbr>REEI</abbr> est requis"
1618
},
1719
"info-label": "Information",
1820
"label": "Entrez votre remboursement de la Prestation universelle pour la garde d'enfants (<abbr>PUGE</abbr>) et du Régime enregistré d'épargne-invalidité (<abbr>REEI</abbr>)."
@@ -28,14 +30,16 @@
2830
"partner": {
2931
"claimed-income": {
3032
"error": {
31-
"invalid": "Le revenu de <abbr>PUGE</abbr> et <abbr>REEI</abbr> de votre partenaire est invalide"
33+
"invalid": "Le revenu de <abbr>PUGE</abbr> et <abbr>REEI</abbr> de votre partenaire est invalide",
34+
"required": "Le revenu de <abbr>PUGE</abbr> et <abbr>REEI</abbr> de votre partenaire est requis"
3235
},
3336
"info-label": "Information",
3437
"label": "Entrez le revenu de votre partenaire provenant de la Prestation universelle pour la garde d'enfants (<abbr>PUGE</abbr>) et du Régime enregistré d'épargne-invalidité (<abbr>REEI</abbr>)."
3538
},
3639
"claimed-repayment": {
3740
"error": {
38-
"invalid": "Le remboursement de <abbr>PUGE</abbr> et <abbr>REEI</abbr> de votre partenaire est invalid"
41+
"invalid": "Le remboursement de <abbr>PUGE</abbr> et <abbr>REEI</abbr> de votre partenaire est invalid",
42+
"required": "Le remboursement de <abbr>PUGE</abbr> et <abbr>REEI</abbr> de votre partenaire est requis"
3943
},
4044
"info-label": "Information",
4145
"label": "Entrez le remboursement par votre partenaire de la Prestation universelle pour la garde d'enfants (<abbr>PUGE</abbr>) et du Régime enregistré d'épargne-invalidité (<abbr>REEI</abbr>)."

frontend/app/routes/estimator/step-income.tsx

+22-10
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ function processIncome(formData: FormData, isMarried: boolean) {
7979
netIncome: v.pipe(
8080
v.string('net-income.error.required'),
8181
v.nonEmpty('net-income.error.required'),
82-
v.transform((input) => removeNumericFormatting(input)),
82+
v.transform((input) => removeNumericFormatting(input) ?? ''),
8383
v.regex(positiveDecimal, 'net-income.error.invalid'),
8484
v.transform(Number),
8585
v.number('net-income.error.invalid'),
@@ -88,23 +88,25 @@ function processIncome(formData: FormData, isMarried: boolean) {
8888
workingIncome: v.pipe(
8989
v.string('working-income.error.required'),
9090
v.nonEmpty('working-income.error.required'),
91-
v.transform((input) => removeNumericFormatting(input)),
91+
v.transform((input) => removeNumericFormatting(input) ?? ''),
9292
v.regex(positiveDecimal, 'working-income.error.invalid'),
9393
v.transform(Number),
9494
v.number('working-income.error.invalid'),
9595
v.minValue(0, 'working-income.error.invalid'),
9696
),
9797
claimedIncome: v.pipe(
98-
v.optional(v.string(), '0'),
99-
v.transform((input) => removeNumericFormatting(input)),
98+
v.string('claimed-income.error.required'),
99+
v.nonEmpty('claimed-income.error.required'),
100+
v.transform((input) => removeNumericFormatting(input) ?? ''),
100101
v.regex(positiveDecimal, 'claimed-income.error.invalid'),
101102
v.transform(Number),
102103
v.number('claimed-income.error.invalid'),
103104
v.minValue(0, 'claimed-income.error.invalid'),
104105
),
105106
claimedRepayment: v.pipe(
106-
v.optional(v.string(), '0'),
107-
v.transform((input) => removeNumericFormatting(input)),
107+
v.string('claimed-repayment.error.required'),
108+
v.nonEmpty('claimed-repayment.error.required'),
109+
v.transform((input) => removeNumericFormatting(input) ?? ''),
108110
v.regex(positiveDecimal, 'claimed-repayment.error.invalid'),
109111
v.transform(Number),
110112
v.number('claimed-repayment.error.invalid'),
@@ -254,6 +256,7 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
254256
<CurrencyField
255257
name="individual-claimed-income"
256258
label={<Trans i18nKey={'estimator:income.fields.claimed-income.label'} />}
259+
required
257260
helpMessagePrimaryClassName="-max-w-prose text-black"
258261
helpMessagePrimary={
259262
<p>
@@ -262,7 +265,8 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
262265
}
263266
defaultValue={
264267
loaderData.formValues?.individualIncome.claimedIncome ??
265-
removeNumericFormatting(previousFormValues.get('income:individual-claimed-income'))
268+
removeNumericFormatting(previousFormValues.get('income:individual-claimed-income')) ??
269+
'0'
266270
}
267271
errorMessage={
268272
errors?.nested?.['individualIncome.claimedIncome']?.at(0) ? (
@@ -274,6 +278,7 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
274278
<CurrencyField
275279
name="individual-claimed-repayment"
276280
label={<Trans i18nKey={'estimator:income.fields.claimed-repayment.label'} />}
281+
required
277282
helpMessagePrimaryClassName="-max-w-prose text-black"
278283
helpMessagePrimary={
279284
<p>
@@ -282,7 +287,8 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
282287
}
283288
defaultValue={
284289
loaderData.formValues?.individualIncome.claimedRepayment ??
285-
removeNumericFormatting(previousFormValues.get('income:individual-claimed-repayment'))
290+
removeNumericFormatting(previousFormValues.get('income:individual-claimed-repayment')) ??
291+
'0'
286292
}
287293
errorMessage={
288294
errors?.nested?.['individualIncome.claimedRepayment']?.at(0) ? (
@@ -367,6 +373,7 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
367373
<CurrencyField
368374
name="partner-claimed-income"
369375
label={<Trans i18nKey={'estimator:income.fields.partner.claimed-income.label'} />}
376+
required
370377
helpMessagePrimaryClassName="-max-w-prose text-black"
371378
helpMessagePrimary={
372379
<p>
@@ -379,7 +386,9 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
379386
defaultValue={
380387
(loaderData.formValues?.kind === 'married'
381388
? loaderData.formValues.partnerIncome.claimedIncome
382-
: undefined) ?? removeNumericFormatting(previousFormValues.get('income:partner-claimed-income'))
389+
: undefined) ??
390+
removeNumericFormatting(previousFormValues.get('income:partner-claimed-income')) ??
391+
'0'
383392
}
384393
errorMessage={
385394
errors?.nested?.['partnerIncome.claimedIncome']?.at(0) ? (
@@ -392,6 +401,7 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
392401
<CurrencyField
393402
name="partner-claimed-repayment"
394403
label={<Trans i18nKey={'estimator:income.fields.partner.claimed-repayment.label'} />}
404+
required
395405
helpMessagePrimaryClassName="-max-w-prose text-black"
396406
helpMessagePrimary={
397407
<p>
@@ -404,7 +414,9 @@ export default function StepIncome({ actionData, loaderData, matches, params }:
404414
defaultValue={
405415
(loaderData.formValues?.kind === 'married'
406416
? loaderData.formValues.partnerIncome.claimedRepayment
407-
: undefined) ?? removeNumericFormatting(previousFormValues.get('income:partner-claimed-repayment'))
417+
: undefined) ??
418+
removeNumericFormatting(previousFormValues.get('income:partner-claimed-repayment')) ??
419+
'0'
408420
}
409421
errorMessage={
410422
errors?.nested?.['partnerIncome.claimedRepayment']?.at(0) ? (

frontend/app/utils/string-utils.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
* @param input string represenation of a formatted decimal (examples: en:"1,234.56", fr:"1 234,56")
44
* @returns string representation of the decimal without formatting (examples: "1234.56")
55
*/
6-
export function removeNumericFormatting(input: string | undefined): string {
7-
if (input === undefined) return '';
6+
export function removeNumericFormatting(input: string | undefined): string | undefined {
7+
if (input === undefined) return undefined;
88

99
const isFrench = input.includes(' ') || input.lastIndexOf(',') >= input.length - 3;
1010
const isEnglish = input.indexOf(',') < input.length - 2 || input.lastIndexOf('.') >= input.length - 3;

frontend/e2e/__snapshots__/estimator/step-income.spec.ts/Navigating-to-en-income-renders-the-english-income-page-1.txt

+8-6
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,7 @@
130130
>Enter your Universal Child Care Benefit (<abbr>UCCB</abbr>) and
131131
Registered Disability Savings Plan (<abbr>RDSP</abbr>)
132132
income.</span
133-
>
134-
<span aria-hidden="true">(<!-- -->optional<!-- -->)</span></label
133+
></label
135134
>
136135
<div
137136
class="-max-w-prose text-black"
@@ -147,14 +146,16 @@
147146
><input
148147
aria-describedby="input-text-field-«Rpmlj5»-help-primary"
149148
aria-labelledby="input-text-field-«Rpmlj5»-label"
149+
aria-required="true"
150150
class="rounded-lg border-gray-500 focus:border-blue-500 focus:ring-3 focus:ring-blue-500 focus:outline-hidden read-only:pointer-events-none read-only:bg-gray-100 read-only:opacity-70 disabled:pointer-events-none disabled:bg-gray-100 disabled:opacity-70 aria-invalid:border-red-500 aria-invalid:focus:border-red-500 aria-invalid:focus:ring-red-500 inline"
151151
id="input-text-field-«Rpmlj5»-input"
152+
required=""
152153
type="text"
153154
inputmode="numeric"
154155
maxlength="15"
155156
autocomplete="off"
156157
name="individual-claimed-income"
157-
value=""
158+
value="0"
158159
/>
159160
</div>
160161
<div id="input-text-field-«Rtmlj5»" class="space-y-2">
@@ -163,8 +164,7 @@
163164
>Enter your Universal Child Care Benefit (<abbr>UCCB</abbr>) and
164165
Registered Disability Savings Plan (<abbr>RDSP</abbr>)
165166
repayment.</span
166-
>
167-
<span aria-hidden="true">(<!-- -->optional<!-- -->)</span></label
167+
></label
168168
>
169169
<div
170170
class="-max-w-prose text-black"
@@ -180,14 +180,16 @@
180180
><input
181181
aria-describedby="input-text-field-«Rtmlj5»-help-primary"
182182
aria-labelledby="input-text-field-«Rtmlj5»-label"
183+
aria-required="true"
183184
class="rounded-lg border-gray-500 focus:border-blue-500 focus:ring-3 focus:ring-blue-500 focus:outline-hidden read-only:pointer-events-none read-only:bg-gray-100 read-only:opacity-70 disabled:pointer-events-none disabled:bg-gray-100 disabled:opacity-70 aria-invalid:border-red-500 aria-invalid:focus:border-red-500 aria-invalid:focus:ring-red-500 inline"
184185
id="input-text-field-«Rtmlj5»-input"
186+
required=""
185187
type="text"
186188
inputmode="numeric"
187189
maxlength="15"
188190
autocomplete="off"
189191
name="individual-claimed-repayment"
190-
value=""
192+
value="0"
191193
/>
192194
</div>
193195
</div>

frontend/e2e/__snapshots__/estimator/step-income.spec.ts/Navigating-to-fr-revenus-renders-the-french-income-page-1.txt

+8-6
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@
138138
>Entrez votre revenu de la Prestation universelle pour la garde
139139
d'enfants (<abbr>PUGE</abbr>) et du Régime enregistré
140140
d'épargne-invalidité (<abbr>REEI</abbr>).</span
141-
>
142-
<span aria-hidden="true">(<!-- -->facultatif<!-- -->)</span></label
141+
></label
143142
>
144143
<div
145144
class="-max-w-prose text-black"
@@ -155,14 +154,16 @@
155154
<input
156155
aria-describedby="input-text-field-«Rpmlj5»-help-primary"
157156
aria-labelledby="input-text-field-«Rpmlj5»-label"
157+
aria-required="true"
158158
class="rounded-lg border-gray-500 focus:border-blue-500 focus:ring-3 focus:ring-blue-500 focus:outline-hidden read-only:pointer-events-none read-only:bg-gray-100 read-only:opacity-70 disabled:pointer-events-none disabled:bg-gray-100 disabled:opacity-70 aria-invalid:border-red-500 aria-invalid:focus:border-red-500 aria-invalid:focus:ring-red-500 inline"
159159
id="input-text-field-«Rpmlj5»-input"
160+
required=""
160161
type="text"
161162
inputmode="numeric"
162163
maxlength="16"
163164
autocomplete="off"
164165
name="individual-claimed-income"
165-
value=""
166+
value="0"
166167
/><span class="ml-1">$</span>
167168
</div>
168169
<div id="input-text-field-«Rtmlj5»" class="space-y-2">
@@ -171,8 +172,7 @@
171172
>Entrez votre remboursement de la Prestation universelle pour la
172173
garde d'enfants (<abbr>PUGE</abbr>) et du Régime enregistré
173174
d'épargne-invalidité (<abbr>REEI</abbr>).</span
174-
>
175-
<span aria-hidden="true">(<!-- -->facultatif<!-- -->)</span></label
175+
></label
176176
>
177177
<div
178178
class="-max-w-prose text-black"
@@ -188,14 +188,16 @@
188188
<input
189189
aria-describedby="input-text-field-«Rtmlj5»-help-primary"
190190
aria-labelledby="input-text-field-«Rtmlj5»-label"
191+
aria-required="true"
191192
class="rounded-lg border-gray-500 focus:border-blue-500 focus:ring-3 focus:ring-blue-500 focus:outline-hidden read-only:pointer-events-none read-only:bg-gray-100 read-only:opacity-70 disabled:pointer-events-none disabled:bg-gray-100 disabled:opacity-70 aria-invalid:border-red-500 aria-invalid:focus:border-red-500 aria-invalid:focus:ring-red-500 inline"
192193
id="input-text-field-«Rtmlj5»-input"
194+
required=""
193195
type="text"
194196
inputmode="numeric"
195197
maxlength="16"
196198
autocomplete="off"
197199
name="individual-claimed-repayment"
198-
value=""
200+
value="0"
199201
/><span class="ml-1">$</span>
200202
</div>
201203
</div>

0 commit comments

Comments
 (0)