From 1904e23d74aa6a38d4d5be5ebe216fda139fcf44 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:35:48 -0700 Subject: [PATCH 1/9] LF-4309 Remove method_id handling from saga and utility functions --- packages/webapp/src/containers/Task/saga.js | 19 +----- packages/webapp/src/util/task.ts | 70 ++++----------------- 2 files changed, 14 insertions(+), 75 deletions(-) diff --git a/packages/webapp/src/containers/Task/saga.js b/packages/webapp/src/containers/Task/saga.js index eaa7b591cb..cc3b31dae6 100644 --- a/packages/webapp/src/containers/Task/saga.js +++ b/packages/webapp/src/containers/Task/saga.js @@ -72,10 +72,7 @@ import { onLoadingHarvestUseTypeStart, } from '../harvestUseTypeSlice'; import { managementPlanWithCurrentLocationEntitiesSelector } from './TaskCrops/managementPlansWithLocationSelector'; -import { - formatSoilAmendmentTaskToDBStructure, - formatSoilAmendmentProductToDBStructure, -} from '../../util/task'; +import { formatSoilAmendmentProductToDBStructure } from '../../util/task'; import { api } from '../../store/api/apiSlice'; const taskTypeEndpoint = [ @@ -489,13 +486,10 @@ const getSoilAmendmentTaskBody = ( data, endpoint, managementPlanWithCurrentLocationEntities, - { purposes, methods }, + { purposes }, ) => { return { ...getPostTaskBody(data, endpoint, managementPlanWithCurrentLocationEntities), - soil_amendment_task: formatSoilAmendmentTaskToDBStructure(data.soil_amendment_task, { - methods, - }), soil_amendment_task_products: formatSoilAmendmentProductToDBStructure( data.soil_amendment_task_products, { purposes }, @@ -549,8 +543,6 @@ export function* createTaskSaga({ payload }) { api.endpoints.getSoilAmendmentPurposes.select()(state), ); taskTypeSpecificData.purposes = purposes.data; - const methods = yield select((state) => api.endpoints.getSoilAmendmentMethods.select()(state)); - taskTypeSpecificData.methods = methods.data; } const header = getHeader(user_id, farm_id); const isCustomTask = !!task_farm_id; @@ -721,17 +713,12 @@ const getCompleteIrrigationTaskBody = (task_translation_key) => (data) => { }; const getCompleteSoilAmendmentTaskBody = (data, taskTypeSpecificData) => { - const soilAmendmentTask = formatSoilAmendmentTaskToDBStructure( - data.soil_amendment_task, - taskTypeSpecificData, - ); const soilAmendmentTaskProducts = formatSoilAmendmentProductToDBStructure( data.soil_amendment_task_products, taskTypeSpecificData, ); return { ...data.taskData, - soil_amendment_task: soilAmendmentTask, soil_amendment_task_products: soilAmendmentTaskProducts, }; }; @@ -760,8 +747,6 @@ export function* completeTaskSaga({ payload: { task_id, data, returnPath } }) { api.endpoints.getSoilAmendmentPurposes.select()(state), ); taskTypeSpecificData.purposes = purposes.data; - const methods = yield select((state) => api.endpoints.getSoilAmendmentMethods.select()(state)); - taskTypeSpecificData.methods = methods.data; } const taskData = taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key] ? taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key](data, taskTypeSpecificData) diff --git a/packages/webapp/src/util/task.ts b/packages/webapp/src/util/task.ts index 84e0ce6a11..e3d2d0b603 100644 --- a/packages/webapp/src/util/task.ts +++ b/packages/webapp/src/util/task.ts @@ -13,8 +13,7 @@ * GNU General Public License for more details, see . */ -import { SoilAmendmentMethod, SoilAmendmentPurpose } from '../store/api/types'; -import { getUnitOptionMap } from './convert-units/getUnitOptionMap'; +import { SoilAmendmentPurpose } from '../store/api/types'; interface UnitOption { label: string; @@ -61,39 +60,29 @@ type FormSoilAmendmentTaskProduct = { }; type DBSoilAmendmentTask = { - furrow_hole_depth?: number; - furrow_hole_depth_unit?: string; - other_application_method?: string; - [key: string]: any; -}; - -type FormSoilAmendmentTask = { - furrow_hole_depth?: number; - furrow_hole_depth_unit?: UnitOption; - other_application_method?: string; - [key: string]: any; -}; - -type DBTask = { soil_amendment_task_products: DBSoilAmendmentTaskProduct[]; [key: string]: any; }; -type FormTask = { +type FormSoilAmendmentTask = { soil_amendment_task_products: FormSoilAmendmentTaskProduct[]; [key: string]: any; }; // Type guard -function isFormSoilAmendmentTask(task: DBTask | FormTask): task is FormTask { +function isFormSoilAmendmentTask( + task: DBSoilAmendmentTask | FormSoilAmendmentTask, +): task is FormSoilAmendmentTask { return ( task.soil_amendment_task_products?.[0] && 'purposes' in task.soil_amendment_task_products[0] ); } -export const formatSoilAmendmentTaskToFormStructure = (task: DBTask | FormTask): FormTask => { +export const formatSoilAmendmentTaskToFormStructure = ( + task: DBSoilAmendmentTask | FormSoilAmendmentTask, +): FormSoilAmendmentTask => { if (isFormSoilAmendmentTask(task)) { - return task as FormTask; + return task as FormSoilAmendmentTask; } const taskClone = structuredClone(task); @@ -151,12 +140,9 @@ type RemainingFormSATProductKeys = keyof Omit< >; export const formatSoilAmendmentProductToDBStructure = ( - soilAmendmentTaskProducts: FormSoilAmendmentTaskProduct[] | undefined, + soilAmendmentTaskProducts: FormSoilAmendmentTaskProduct[], { purposes }: { purposes: SoilAmendmentPurpose[] }, -): DBSoilAmendmentTaskProduct[] | undefined => { - if (!soilAmendmentTaskProducts) { - return undefined; - } +): DBSoilAmendmentTaskProduct[] => { const otherPurposeId = purposes?.find(({ key }) => key === 'OTHER')?.id; if (!otherPurposeId) { throw Error('id for OTHER purpose does not exist'); @@ -193,44 +179,12 @@ export const formatSoilAmendmentProductToDBStructure = ( }); }; -export const formatSoilAmendmentTaskToDBStructure = ( - soilAmendmentTask: FormSoilAmendmentTask | undefined, - { methods }: { methods: SoilAmendmentMethod[] }, -): DBSoilAmendmentTask | undefined => { - if (!soilAmendmentTask) { - return undefined; - } - const { - method_id, - furrow_hole_depth, - furrow_hole_depth_unit, - other_application_method, - ...rest - } = soilAmendmentTask; - const furrowHoleId = methods?.find(({ key }) => key === 'FURROW_HOLE')?.id; - const otherMethodId = methods?.find(({ key }) => key === 'OTHER')?.id; - if (!furrowHoleId) { - throw Error('id for FURROW_HOLE method does not exist'); - } - if (!otherMethodId) { - throw Error('id for OTHER method does not exist'); - } - return { - ...rest, - method_id, - furrow_hole_depth: method_id === furrowHoleId ? furrow_hole_depth : undefined, - furrow_hole_depth_unit: method_id === furrowHoleId ? furrow_hole_depth_unit?.value : undefined, - other_application_method: - soilAmendmentTask.method_id === otherMethodId ? other_application_method : undefined, - }; -}; - export const formatTaskReadOnlyDefaultValues = (task: { taskType?: { task_translation_key: string }; [key: string]: any; }) => { if (task.taskType?.task_translation_key === 'SOIL_AMENDMENT_TASK') { - return formatSoilAmendmentTaskToFormStructure(task as DBTask); + return formatSoilAmendmentTaskToFormStructure(task as DBSoilAmendmentTask); } return structuredClone(task); From 4c69bfa3c6876a0cf78d8a7c5a152e1d64b67791 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:06:46 -0700 Subject: [PATCH 2/9] LF-4309 Remove purpose fetching and other purpose handling from saga and task utilities --- packages/webapp/src/containers/Task/saga.js | 28 ++------------------- packages/webapp/src/util/task.ts | 16 ++---------- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/packages/webapp/src/containers/Task/saga.js b/packages/webapp/src/containers/Task/saga.js index cc3b31dae6..780bbdb586 100644 --- a/packages/webapp/src/containers/Task/saga.js +++ b/packages/webapp/src/containers/Task/saga.js @@ -73,7 +73,6 @@ import { } from '../harvestUseTypeSlice'; import { managementPlanWithCurrentLocationEntitiesSelector } from './TaskCrops/managementPlansWithLocationSelector'; import { formatSoilAmendmentProductToDBStructure } from '../../util/task'; -import { api } from '../../store/api/apiSlice'; const taskTypeEndpoint = [ 'cleaning_task', @@ -482,17 +481,11 @@ const getIrrigationTaskBody = (data, endpoint, managementPlanWithCurrentLocation ); }; -const getSoilAmendmentTaskBody = ( - data, - endpoint, - managementPlanWithCurrentLocationEntities, - { purposes }, -) => { +const getSoilAmendmentTaskBody = (data, endpoint, managementPlanWithCurrentLocationEntities) => { return { ...getPostTaskBody(data, endpoint, managementPlanWithCurrentLocationEntities), soil_amendment_task_products: formatSoilAmendmentProductToDBStructure( data.soil_amendment_task_products, - { purposes }, ), }; }; @@ -536,14 +529,6 @@ export function* createTaskSaga({ payload }) { taskTypeSelector(data.task_type_id), ); const taskTypeSpecificData = {}; - if (task_translation_key === 'SOIL_AMENDMENT_TASK') { - // Access cached data - // https://redux-toolkit.js.org/rtk-query/usage/usage-without-react-hooks#accessing-cached-data--request-status - const purposes = yield select((state) => - api.endpoints.getSoilAmendmentPurposes.select()(state), - ); - taskTypeSpecificData.purposes = purposes.data; - } const header = getHeader(user_id, farm_id); const isCustomTask = !!task_farm_id; const isHarvest = task_translation_key === 'HARVEST_TASK'; @@ -712,10 +697,9 @@ const getCompleteIrrigationTaskBody = (task_translation_key) => (data) => { ); }; -const getCompleteSoilAmendmentTaskBody = (data, taskTypeSpecificData) => { +const getCompleteSoilAmendmentTaskBody = (data) => { const soilAmendmentTaskProducts = formatSoilAmendmentProductToDBStructure( data.soil_amendment_task_products, - taskTypeSpecificData, ); return { ...data.taskData, @@ -740,14 +724,6 @@ export function* completeTaskSaga({ payload: { task_id, data, returnPath } }) { const header = getHeader(user_id, farm_id); const endpoint = isCustomTaskType ? 'custom_task' : task_translation_key.toLowerCase(); const taskTypeSpecificData = {}; - if (task_translation_key === 'SOIL_AMENDMENT_TASK') { - // Access cached data - // https://redux-toolkit.js.org/rtk-query/usage/usage-without-react-hooks#accessing-cached-data--request-status - const purposes = yield select((state) => - api.endpoints.getSoilAmendmentPurposes.select()(state), - ); - taskTypeSpecificData.purposes = purposes.data; - } const taskData = taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key] ? taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key](data, taskTypeSpecificData) : data.taskData; diff --git a/packages/webapp/src/util/task.ts b/packages/webapp/src/util/task.ts index e3d2d0b603..810dfa1102 100644 --- a/packages/webapp/src/util/task.ts +++ b/packages/webapp/src/util/task.ts @@ -13,8 +13,6 @@ * GNU General Public License for more details, see . */ -import { SoilAmendmentPurpose } from '../store/api/types'; - interface UnitOption { label: string; value: string; @@ -127,10 +125,9 @@ export const formatSoilAmendmentTaskToFormStructure = ( const formatPurposeIdsToRelationships = ( purposeIds: number[], otherPurpose: string | undefined, - otherPurposeId: number, ): PurposeRelationship[] => { return purposeIds.map((purpose_id) => { - return { purpose_id, other_purpose: purpose_id === otherPurposeId ? otherPurpose : undefined }; + return { purpose_id, other_purpose: otherPurpose }; }); }; @@ -141,12 +138,7 @@ type RemainingFormSATProductKeys = keyof Omit< export const formatSoilAmendmentProductToDBStructure = ( soilAmendmentTaskProducts: FormSoilAmendmentTaskProduct[], - { purposes }: { purposes: SoilAmendmentPurpose[] }, ): DBSoilAmendmentTaskProduct[] => { - const otherPurposeId = purposes?.find(({ key }) => key === 'OTHER')?.id; - if (!otherPurposeId) { - throw Error('id for OTHER purpose does not exist'); - } return soilAmendmentTaskProducts.map((formTaskProduct) => { const { purposes: purposeIds, other_purpose, is_weight, ...rest } = formTaskProduct; @@ -170,11 +162,7 @@ export const formatSoilAmendmentProductToDBStructure = ( application_rate_volume_unit: !is_weight ? (rest.application_rate_volume_unit as UnitOption)?.value : undefined, - purpose_relationships: formatPurposeIdsToRelationships( - purposeIds, - other_purpose, - otherPurposeId, - ), + purpose_relationships: formatPurposeIdsToRelationships(purposeIds, other_purpose), }; }); }; From 46eb90f686d33cd47d86a8755db118ced5b6d4c3 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:08:35 -0700 Subject: [PATCH 3/9] LF-4309 Add { shouldUnregister: true } to other application method and other purpose --- .../Task/AddSoilAmendmentProducts/ProductCard/index.tsx | 2 +- packages/webapp/src/components/Task/SoilAmendmentTask/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webapp/src/components/Task/AddSoilAmendmentProducts/ProductCard/index.tsx b/packages/webapp/src/components/Task/AddSoilAmendmentProducts/ProductCard/index.tsx index 42ecb5bfd2..d7802d25cc 100644 --- a/packages/webapp/src/components/Task/AddSoilAmendmentProducts/ProductCard/index.tsx +++ b/packages/webapp/src/components/Task/AddSoilAmendmentProducts/ProductCard/index.tsx @@ -182,7 +182,7 @@ const SoilAmendmentProductCard = ({ label={t('ADD_TASK.SOIL_AMENDMENT_VIEW.OTHER_PURPOSE')} name={OTHER_PURPOSE} disabled={isReadOnly} - hookFormRegister={register(OTHER_PURPOSE)} + hookFormRegister={register(OTHER_PURPOSE, { shouldUnregister: true })} optional /> diff --git a/packages/webapp/src/components/Task/SoilAmendmentTask/index.tsx b/packages/webapp/src/components/Task/SoilAmendmentTask/index.tsx index d5a2547ff9..25ec7b59f7 100644 --- a/packages/webapp/src/components/Task/SoilAmendmentTask/index.tsx +++ b/packages/webapp/src/components/Task/SoilAmendmentTask/index.tsx @@ -191,7 +191,7 @@ const PureSoilAmendmentTask = ({ label={t('ADD_TASK.SOIL_AMENDMENT_VIEW.OTHER_METHOD')} name={OTHER_APPLICATION_METHOD} disabled={disabled} - hookFormRegister={register(OTHER_APPLICATION_METHOD)} + hookFormRegister={register(OTHER_APPLICATION_METHOD, { shouldUnregister: true })} optional placeholder={t('ADD_TASK.SOIL_AMENDMENT_VIEW.OTHER_METHOD_PLACEHOLDER')} /> From b697d25f5ee666afcf393f60fb69a5046da89aa1 Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:13:24 -0700 Subject: [PATCH 4/9] LF-4309 Remove unused taskTypeSpecificData object --- packages/webapp/src/containers/Task/saga.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/webapp/src/containers/Task/saga.js b/packages/webapp/src/containers/Task/saga.js index 780bbdb586..a6131f7143 100644 --- a/packages/webapp/src/containers/Task/saga.js +++ b/packages/webapp/src/containers/Task/saga.js @@ -506,7 +506,6 @@ const getPostTaskReqBody = ( task_translation_key, isCustomTask, managementPlanWithCurrentLocationEntities, - taskTypeSpecificData, ) => { if (isCustomTask) return getPostTaskBody(data, endpoint, managementPlanWithCurrentLocationEntities); @@ -514,7 +513,6 @@ const getPostTaskReqBody = ( data, endpoint, managementPlanWithCurrentLocationEntities, - taskTypeSpecificData, ); }; @@ -528,7 +526,6 @@ export function* createTaskSaga({ payload }) { const { task_translation_key, farm_id: task_farm_id } = yield select( taskTypeSelector(data.task_type_id), ); - const taskTypeSpecificData = {}; const header = getHeader(user_id, farm_id); const isCustomTask = !!task_farm_id; const isHarvest = task_translation_key === 'HARVEST_TASK'; @@ -551,7 +548,6 @@ export function* createTaskSaga({ payload }) { task_translation_key, isCustomTask, managementPlanWithCurrentLocationEntities, - taskTypeSpecificData, ), header, ); @@ -723,9 +719,8 @@ export function* completeTaskSaga({ payload: { task_id, data, returnPath } }) { const { task_translation_key, isCustomTaskType } = data; const header = getHeader(user_id, farm_id); const endpoint = isCustomTaskType ? 'custom_task' : task_translation_key.toLowerCase(); - const taskTypeSpecificData = {}; const taskData = taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key] - ? taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key](data, taskTypeSpecificData) + ? taskTypeGetCompleteTaskBodyFunctionMap[task_translation_key](data) : data.taskData; try { From 2b9f3bc9ade076f59696967792835aa81ea9eafd Mon Sep 17 00:00:00 2001 From: Joyce Yuki <82857964+kathyavini@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:28:02 -0700 Subject: [PATCH 5/9] LF-4309 Add ability to pass shouldUnregister to value and unit of Unit component --- packages/webapp/src/components/Form/Unit/index.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/webapp/src/components/Form/Unit/index.jsx b/packages/webapp/src/components/Form/Unit/index.jsx index 30bd979bde..84a075e10b 100644 --- a/packages/webapp/src/components/Form/Unit/index.jsx +++ b/packages/webapp/src/components/Form/Unit/index.jsx @@ -59,6 +59,7 @@ const Unit = ({ hasLeaf, autoConversion, onInputChange, + shouldUnregister, ...props }) => { const { t } = useTranslation(['translation', 'common']); @@ -165,6 +166,7 @@ const Unit = ({ (