From 8f7dbbf2fe1f79a40b07f4a65e00d6f7f26a4943 Mon Sep 17 00:00:00 2001 From: Michal Muzyk Date: Mon, 25 Mar 2024 11:22:52 +0100 Subject: [PATCH 1/4] fix: checks if something can be disabled or deleted now do not take into account items that are waiting for deletion --- .../distanceRates/PolicyDistanceRatesPage.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index 6533d79e03b9..d65f4d6b2d9d 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -60,10 +60,10 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) [policy?.customUnits], ); const customUnitRates: Record = useMemo(() => customUnit?.rates ?? {}, [customUnit]); - const canDeleteSelectedRates = selectedDistanceRates.length !== Object.values(customUnitRates).length; - const canDisableSelectedRates = Object.values(customUnitRates) - .filter((rate: Rate) => !selectedDistanceRates.includes(rate)) - .some((rate) => rate.enabled); + // Filter out rates that are pending deletion + const allSelectableRates = Object.values(customUnitRates).filter((rate) => rate.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE); + const canDeleteSelectedRates = selectedDistanceRates.length !== allSelectableRates.length; + const canDisableSelectedRates = allSelectableRates.filter((rate: Rate) => !selectedDistanceRates.includes(rate)).some((rate) => rate.enabled); function fetchDistanceRates() { Policy.openPolicyDistanceRatesPage(policyID); @@ -179,8 +179,6 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) }; const toggleAllRates = () => { - const allSelectableRates = Object.values(customUnitRates).filter((rate) => rate.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE); - if (selectedDistanceRates.length === allSelectableRates.length) { setSelectedDistanceRates([]); } else { From c34a731bccca03c82738e01697c628ceff951cd1 Mon Sep 17 00:00:00 2001 From: Michal Muzyk Date: Mon, 25 Mar 2024 12:59:30 +0100 Subject: [PATCH 2/4] fix: delete case fix --- .../distanceRates/PolicyDistanceRatesPage.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index d65f4d6b2d9d..c706d1e928a8 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -60,10 +60,11 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) [policy?.customUnits], ); const customUnitRates: Record = useMemo(() => customUnit?.rates ?? {}, [customUnit]); - // Filter out rates that are pending deletion + // Filter out rates that will be deleted const allSelectableRates = Object.values(customUnitRates).filter((rate) => rate.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE); - const canDeleteSelectedRates = selectedDistanceRates.length !== allSelectableRates.length; - const canDisableSelectedRates = allSelectableRates.filter((rate: Rate) => !selectedDistanceRates.includes(rate)).some((rate) => rate.enabled); + const canDisableOrDeleteSelectedRates = allSelectableRates + .filter((rate: Rate) => !selectedDistanceRates.some((selectedRate) => selectedRate.customUnitRateID === rate.customUnitRateID)) + .some((rate) => rate.enabled === true); function fetchDistanceRates() { Policy.openPolicyDistanceRatesPage(policyID); @@ -199,7 +200,7 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) text: translate('workspace.distanceRates.deleteRates', {count: selectedDistanceRates.length}), value: CONST.POLICY.DISTANCE_RATES_BULK_ACTION_TYPES.DELETE, icon: Expensicons.Trashcan, - onSelected: () => (canDeleteSelectedRates ? setIsDeleteModalVisible(true) : setIsWarningModalVisible(true)), + onSelected: () => (canDisableOrDeleteSelectedRates ? setIsDeleteModalVisible(true) : setIsWarningModalVisible(true)), }, ]; @@ -209,7 +210,7 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) text: translate('workspace.distanceRates.disableRates', {count: enabledRates.length}), value: CONST.POLICY.DISTANCE_RATES_BULK_ACTION_TYPES.DISABLE, icon: Expensicons.DocumentSlash, - onSelected: () => (canDisableSelectedRates ? disableRates() : setIsWarningModalVisible(true)), + onSelected: () => (canDisableOrDeleteSelectedRates ? disableRates() : setIsWarningModalVisible(true)), }); } From 2d5b673e96ac538e221b9618d212dcc5b3f35707 Mon Sep 17 00:00:00 2001 From: Michal Muzyk Date: Mon, 25 Mar 2024 13:42:58 +0100 Subject: [PATCH 3/4] fix: revert check change --- src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index c706d1e928a8..e226fb12a880 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -64,7 +64,7 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) const allSelectableRates = Object.values(customUnitRates).filter((rate) => rate.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE); const canDisableOrDeleteSelectedRates = allSelectableRates .filter((rate: Rate) => !selectedDistanceRates.some((selectedRate) => selectedRate.customUnitRateID === rate.customUnitRateID)) - .some((rate) => rate.enabled === true); + .some((rate) => rate.enabled); function fetchDistanceRates() { Policy.openPolicyDistanceRatesPage(policyID); From 36250b0e99b2d50eedbe3ed103a2a720620de85d Mon Sep 17 00:00:00 2001 From: Michal Muzyk Date: Mon, 25 Mar 2024 15:29:20 +0100 Subject: [PATCH 4/4] fix: wrap with usememo --- .../workspace/distanceRates/PolicyDistanceRatesPage.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index e226fb12a880..a70f3959ceb2 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -61,10 +61,11 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) ); const customUnitRates: Record = useMemo(() => customUnit?.rates ?? {}, [customUnit]); // Filter out rates that will be deleted - const allSelectableRates = Object.values(customUnitRates).filter((rate) => rate.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE); - const canDisableOrDeleteSelectedRates = allSelectableRates - .filter((rate: Rate) => !selectedDistanceRates.some((selectedRate) => selectedRate.customUnitRateID === rate.customUnitRateID)) - .some((rate) => rate.enabled); + const allSelectableRates = useMemo(() => Object.values(customUnitRates).filter((rate) => rate.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE), [customUnitRates]); + const canDisableOrDeleteSelectedRates = useMemo( + () => allSelectableRates.filter((rate: Rate) => !selectedDistanceRates.some((selectedRate) => selectedRate.customUnitRateID === rate.customUnitRateID)).some((rate) => rate.enabled), + [allSelectableRates, selectedDistanceRates], + ); function fetchDistanceRates() { Policy.openPolicyDistanceRatesPage(policyID);