Skip to content

Commit

Permalink
issue #234: LabelData model changes
Browse files Browse the repository at this point in the history
  • Loading branch information
k-allagbe committed Feb 10, 2025
1 parent 42c8bf6 commit 8aff473
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 47 deletions.
14 changes: 10 additions & 4 deletions public/locales/en/labelDataValidator.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@
"label": "Name",
"placeholder": "Enter name"
},
"registrationNumber": {
"label": "Registration Number",
"placeholder": "Enter registration number"
"reg": {
"label": "Registration Numbers",
"placeholder": "Enter registration number",
"type": {
"fertilizer": "Fertilizer",
"ingredient": "Ingredient"
}
},
"lotNumber": {
"label": "Lot Number",
Expand Down Expand Up @@ -146,5 +150,7 @@
"minValue": "Minimum value is 0",
"duplicateUnit": "Duplicate unit"
},
"stepper": { "next": "Next", "back": "Back", "submit": "Submit" }
"stepper": { "next": "Next", "back": "Back", "submit": "Submit" },
"fertilizer_product": "Fertilizer",
"ingredient_component": "Ingredient"
}
10 changes: 7 additions & 3 deletions public/locales/fr/labelDataValidator.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@
"label": "Nom",
"placeholder": "Entrez le nom"
},
"registrationNumber": {
"label": "Numéro d'enregistrement",
"placeholder": "Entrez le numéro d'enregistrement"
"reg": {
"label": "Numéros d'enregistrement",
"placeholder": "Entrez le numéro d'enregistrement",
"type": {
"fertilizer": "Engrais",
"ingredient": "Ingrédient"
}
},
"lotNumber": {
"label": "Numéro de lot",
Expand Down
2 changes: 1 addition & 1 deletion src/app/label-data-confirmation/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ const LabelDataConfirmationPage = () => {
<TableCell data-testid="base-information-registration-number">
<Typography>
{
labelData?.baseInformation.registrationNumber
labelData?.baseInformation.registrationNumbers
.value
}
</Typography>
Expand Down
5 changes: 2 additions & 3 deletions src/components/BaseInformationForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,9 @@ const BaseInformationForm: React.FC<FormComponentProps> = ({
loading={loading}
/>
<VerifiedRegistrationList
label={t("baseInformation.fields.registrationNumber.label")}
path="baseInformation.registrationNumber"
label={t("baseInformation.fields.reg.label")}
path="baseInformation.registrationNumbers"
loading={loading}
registrationTypes={["Fertilizer", "Ingredient"]}
/>
<VerifiedInput
label={t("baseInformation.fields.lotNumber.label")}
Expand Down
2 changes: 1 addition & 1 deletion src/components/QuantityInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ const QuantityInput = ({
renderInput={(params) => (
<StyledTextField
{...params}
className={`!w-[10ch] !px-2 bg-gray-100 ${verified ? "bg-gray-300" : ""}`}
className={`!w-[10ch] !px-2 ${verified ? "bg-inherit" : "bg-gray-100"}`}
aria-label={t("quantityInput.accessibility.unit")}
data-testid={`${name}-unit-input`}
placeholder={t("quantityInput.placeholder.unit")}
Expand Down
16 changes: 7 additions & 9 deletions src/components/VerifiedRegistrationList.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { DEFAULT_REGISTRATION_NUMBER } from "@/types/types";
import { Typography } from "@mui/material";
import { useFieldArray, useFormContext } from "react-hook-form";
import RegistrationInput from "./RegistrationInput";
Expand All @@ -8,31 +9,29 @@ import VerifiedListRow from "./VerifiedListRow";
interface VerifiedRegistrationListProps {
label: string;
path: string;
registrationTypes: string[];
className?: string;
loading?: boolean;
}

const VerifiedRegistrationList: React.FC<VerifiedRegistrationListProps> = ({
label,
path,
registrationTypes,
className = "",
loading = false,
}) => {
const valuesPath = `${path}.values`;
const { control, trigger } = useFormContext();
const { fields, append, remove } = useFieldArray({
control,
name: `${path}.registrations`,
name: valuesPath,
});
const registrationsPath = `${path}.registrations`;

const validateFields = async (callback: (valid: boolean) => void) => {
const validationResults = await Promise.all(
fields.map((_, index) =>
Promise.all([
trigger(`${registrationsPath}.${index}.number`),
trigger(`${registrationsPath}.${index}.type`),
trigger(`${valuesPath}.${index}.identifier`),
trigger(`${valuesPath}.${index}.type`),
]),
),
);
Expand Down Expand Up @@ -60,7 +59,7 @@ const VerifiedRegistrationList: React.FC<VerifiedRegistrationListProps> = ({
<StyledListContainer
path={path}
verified={verified}
onAppend={() => append({ number: "", type: "" })}
onAppend={() => append(DEFAULT_REGISTRATION_NUMBER)}
>
{fields.map((fieldItem, index) => (
<VerifiedListRow
Expand All @@ -71,9 +70,8 @@ const VerifiedRegistrationList: React.FC<VerifiedRegistrationListProps> = ({
isLastItem={index === fields.length - 1}
>
<RegistrationInput
name={`${registrationsPath}.${index}`}
name={`${valuesPath}.${index}`}
control={control}
registrationTypes={registrationTypes}
disabled={verified}
onFocus={() => setIsFocused(true)}
onBlur={() => setIsFocused(false)}
Expand Down
9 changes: 4 additions & 5 deletions src/components/__tests__/VerifiedQuantityMultiInput.test.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { VerifiedQuantityField } from "@/types/types";
import { VerifiedQuantityList } from "@/types/types";
import { fireEvent, render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { FormProvider, useForm } from "react-hook-form";
import VerifiedQuantityList from "../VerifiedQuantityList";

const Wrapper = ({
label = "Test Label",
Expand All @@ -19,11 +18,11 @@ const Wrapper = ({
placeholder?: string;
path?: string;
unitOptions?: string[];
defaultValues?: VerifiedQuantityField;
defaultValues?: VerifiedQuantityList;
loading?: boolean;
onSubmit?: (data: VerifiedQuantityField) => void;
onSubmit?: (data: VerifiedQuantityList) => void;
}) => {
const methods = useForm<VerifiedQuantityField>({
const methods = useForm<VerifiedQuantityList>({
defaultValues,
mode: "onSubmit",
});
Expand Down
35 changes: 28 additions & 7 deletions src/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ export type Quantity = {

export const DEFAULT_QUANTITY = { value: "", unit: "" };

export type VerifiedQuantityField = VerifiedField & {
export type VerifiedQuantityList = VerifiedField & {
quantities: Quantity[];
};

Expand All @@ -116,25 +116,46 @@ export const UNITS = {
ingredients: ["%", "ppm"],
};

export const DEFAULT_QUANTITY_FIELD = {
export const DEFAULT_QUANTITY_FIELD: VerifiedQuantityList = {
verified: false,
quantities: [DEFAULT_QUANTITY],
};

// reg numbers
export enum RegistrationType {
FERTILIZER = "fertilizer_product",
INGREDIENT = "ingredient_component",
}
export type RegistrationNumber = {
identifier: string;
type: RegistrationType;
};
export const DEFAULT_REGISTRATION_NUMBER: RegistrationNumber = {
identifier: "",
type: RegistrationType.FERTILIZER,
};
export type RegistrationNumbers = VerifiedField & {
values: RegistrationNumber[];
};
export const DEFAULT_REGISTRATION_NUMBERS: RegistrationNumbers = {
verified: false,
values: [DEFAULT_REGISTRATION_NUMBER],
};

// Base Information
export type BaseInformation = {
name: VerifiedTextField;
registrationNumber: VerifiedTextField;
registrationNumbers: RegistrationNumbers;
lotNumber: VerifiedTextField;
npk: VerifiedTextField;
weight: VerifiedQuantityField;
density: VerifiedQuantityField;
volume: VerifiedQuantityField;
weight: VerifiedQuantityList;
density: VerifiedQuantityList;
volume: VerifiedQuantityList;
};

export const DEFAULT_BASE_INFORMATION: BaseInformation = {
name: DEFAULT_TEXT_FIELD,
registrationNumber: DEFAULT_TEXT_FIELD,
registrationNumbers: DEFAULT_REGISTRATION_NUMBERS,
lotNumber: DEFAULT_TEXT_FIELD,
npk: DEFAULT_TEXT_FIELD,
weight: DEFAULT_QUANTITY_FIELD,
Expand Down
12 changes: 10 additions & 2 deletions src/utils/client/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { LabelData } from "@/types/types";
import { LabelData, RegistrationType } from "@/types/types";

export const VERIFIED_LABEL_DATA: LabelData = {
organizations: [
Expand All @@ -17,7 +17,15 @@ export const VERIFIED_LABEL_DATA: LabelData = {
],
baseInformation: {
name: { value: "SuperGrow 20-20-20", verified: true },
registrationNumber: { value: "1234567A", verified: true },
registrationNumbers: {
values: [
{
identifier: "",
type: RegistrationType.FERTILIZER,
},
],
verified: true,
},
lotNumber: { value: "LOT-4567", verified: true },
npk: { value: "20-20-20", verified: true },
weight: {
Expand Down
1 change: 0 additions & 1 deletion src/utils/client/fieldValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ export const checkFieldArray = (
fields: VerifiedField[],
verified: boolean = true,
): boolean => {
console.debug("type of fields", typeof fields);
return fields.every((field) => field.verified === verified);
};

Expand Down
14 changes: 7 additions & 7 deletions src/utils/server/__tests__/modelTransformation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ describe("mapLabelDataOutputToLabelData", () => {

// Base Information
expect(result.baseInformation.name.value).toBe(input.fertiliser_name);
expect(result.baseInformation.registrationNumber.value).toBe(
expect(result.baseInformation.registrationNumbers.value).toBe(
input.registration_number![0].identifier,
);
expect(result.baseInformation.lotNumber.value).toBe(input.lot_number);
Expand Down Expand Up @@ -341,7 +341,7 @@ describe("mapLabelDataOutputToLabelData", () => {

// Base Information
expect(result.baseInformation.name.value).toBe("");
expect(result.baseInformation.registrationNumber.value).toBe("");
expect(result.baseInformation.registrationNumbers.value).toBe("");
expect(result.baseInformation.lotNumber.value).toBe("");
expect(result.baseInformation.npk.value).toBe("");
expect(result.baseInformation.weight.quantities).toEqual([]);
Expand Down Expand Up @@ -493,7 +493,7 @@ describe("mapInspectionToLabelData", () => {
expect(result.organizations[1].phoneNumber.value).toBe("987-654-3210");

expect(result.baseInformation.name.value).toBe("SuperGrow");
expect(result.baseInformation.registrationNumber.value).toBe("1234567A");
expect(result.baseInformation.registrationNumbers.value).toBe("1234567A");
expect(result.baseInformation.lotNumber.value).toBe("LOT42");
expect(result.baseInformation.npk.value).toBe("10-5-5");

Expand Down Expand Up @@ -562,7 +562,7 @@ describe("mapInspectionToLabelData", () => {
const result = mapInspectionToLabelData(emptyInspection);
expect(result.organizations).toEqual([]);
expect(result.baseInformation.name.value).toBe("");
expect(result.baseInformation.registrationNumber.value).toBe("");
expect(result.baseInformation.registrationNumbers.value).toBe("");
expect(result.baseInformation.lotNumber.value).toBe("");
expect(result.baseInformation.npk.value).toBe("");
expect(result.baseInformation.weight.quantities).toEqual([]);
Expand All @@ -588,7 +588,7 @@ describe("mapInspectionToLabelData", () => {
const result = mapInspectionToLabelData(emptyInspection);
expect(result.organizations).toEqual([]);
expect(result.baseInformation.name.verified).toBe(true);
expect(result.baseInformation.registrationNumber.verified).toBe(true);
expect(result.baseInformation.registrationNumbers.verified).toBe(true);
expect(result.baseInformation.lotNumber.verified).toBe(true);
expect(result.baseInformation.npk.verified).toBe(true);
expect(result.baseInformation.weight.verified).toBe(true);
Expand Down Expand Up @@ -630,7 +630,7 @@ const labelData: LabelData = {
],
baseInformation: {
name: { value: "SuperGrow", verified: false },
registrationNumber: { value: "1234567A", verified: false },
registrationNumbers: { value: "1234567A", verified: false },
lotNumber: { value: "LOT42", verified: false },
npk: { value: "10-5-5", verified: false },
weight: { quantities: [{ value: "20", unit: "kg" }], verified: false },
Expand Down Expand Up @@ -703,7 +703,7 @@ const emptyLabelData: LabelData = {
organizations: [],
baseInformation: {
name: { value: "", verified: false },
registrationNumber: { value: "", verified: false },
registrationNumbers: { value: "", verified: false },
lotNumber: { value: "", verified: false },
npk: { value: "", verified: false },
weight: { quantities: [], verified: false },
Expand Down
8 changes: 4 additions & 4 deletions src/utils/server/modelTransformation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ export function mapLabelDataOutputToLabelData(
],
baseInformation: {
name: { value: data.fertiliser_name ?? "", verified: false },
registrationNumber: {
registrationNumbers: {
value: data.registration_number?.[0]?.identifier ?? "",
verified: false,
},
Expand Down Expand Up @@ -151,7 +151,7 @@ export function mapInspectionToLabelData(
})),
baseInformation: {
name: { value: inspection.product.name ?? "", verified: v },
registrationNumber: {
registrationNumbers: {
value:
inspection.product.registration_numbers?.[0]?.registration_number ??
"",
Expand Down Expand Up @@ -231,7 +231,7 @@ export function mapLabelDataToLabelDataInput(
fertiliser_name: labelData.baseInformation.name.value,
registration_number: [
{
identifier: labelData.baseInformation.registrationNumber.value,
identifier: labelData.baseInformation.registrationNumbers.value,
},
],
lot_number: labelData.baseInformation.lotNumber.value,
Expand Down Expand Up @@ -305,7 +305,7 @@ export function mapLabelDataToInspectionUpdate(
registration_numbers: [
{
registration_number:
labelData.baseInformation.registrationNumber.value,
labelData.baseInformation.registrationNumbers.value,
},
],
lot_number: labelData.baseInformation.lotNumber.value,
Expand Down

0 comments on commit 8aff473

Please sign in to comment.