diff --git a/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx b/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx index f37b862..6c0c295 100644 --- a/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx +++ b/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx @@ -320,14 +320,17 @@ const EditCompanyProfile = () => { // Handle checkbox toggle for selected products const handleCheckboxToggle = (productValue) => { + setCheckedProducts(prev => { const newChecked = new Set(prev); const product = selectedProducts.find(p => - (p.value && (p.value === productValue || p.value === productValue || p.value === productValue)) || - (p.id && (p.id === productValue || p.id === productValue || p.id === productValue)) || - (p.product_id && (p.product_id === productValue || p.product_id === productValue || p.product_id === productValue)) + (p.value && p.value === productValue) || + (p.id && p.id === productValue) || + (p.product_id && p.product_id === productValue) ); + + if (newChecked.has(productValue)) { // Unchecking: move product from selected to available newChecked.delete(productValue); @@ -336,12 +339,13 @@ const EditCompanyProfile = () => { // Add product back to available products setAvailableProducts(prev => { const alreadyExists = prev.some(p => - (p.value && (p.value === product.value || p.value === product.id || p.value === product.product_id)) || - (p.id && (p.id === product.id || p.id === product.value || p.id === product.product_id)) || - (p.product_id && (p.product_id === product.product_id || p.product_id === product.id || p.product_id === product.value)) + (p.value && p.value === product.value) || + (p.id && p.id === product.id) || + (p.product_id && p.product_id === product.product_id) ); if (!alreadyExists) { + ('ADDING TO AVAILABLE - new length will be:', prev.length + 1); return [...prev, product]; } return prev; @@ -349,25 +353,25 @@ const EditCompanyProfile = () => { } } else { // Re-checking: remove newly added products and restore original - newChecked.add(productValue); + if (newChecked.size < selectedProducts.length) { + newChecked.add(productValue); + } // Remove from available products setAvailableProducts(prev => prev.filter(p => - !(p.value && (p.value === productValue || p.value === productValue || p.value === productValue)) && - !(p.id && (p.id === productValue || p.id === productValue || p.id === productValue)) && - !(p.product_id && (p.product_id === productValue || p.product_id === productValue || p.product_id === productValue)) + !(p.value && p.value === productValue) && + !(p.id && p.id === productValue) && + !(p.product_id && p.product_id === productValue) ) ); - // Check if all original products are now checked const originalProducts = selectedProducts.filter(p => p.isExisting); const originalProductIds = originalProducts.map(p => p.value || p.id || p.product_id); const allOriginalProductsChecked = originalProductIds.every(id => newChecked.has(id)); // If all original products are checked, remove all newly added products if (allOriginalProductsChecked && newlyAddedProductIds.size > 0) { - // Find all newly added products const newlyAddedProducts = selectedProducts.filter(p => !p.isExisting && newlyAddedProductIds.has(p.value || p.id || p.product_id) ); @@ -387,8 +391,8 @@ const EditCompanyProfile = () => { const productsToAdd = newlyAddedProducts.filter(np => !prev.some(p => (p.value && (p.value === np.value || p.value === np.id || p.value === np.product_id)) || - (p.id && (p.id === np.id || p.id === np.value || p.id === np.product_id)) || - (p.product_id && (p.product_id === np.product_id || p.product_id === np.id || p.product_id === np.value)) + (p.id && (p.id === np.id || p.id === np.value || np.id === np.product_id)) || + (p.product_id && (p.product_id === np.product_id || np.product_id === np.id || np.product_id === np.value)) ) ); return [...prev, ...productsToAdd]; @@ -405,6 +409,7 @@ const EditCompanyProfile = () => { return newChecked; }); + }; // Handle adding a product @@ -412,9 +417,9 @@ const EditCompanyProfile = () => { setSelectedProducts(prev => { // Check if product is already selected const isAlreadySelected = prev.some(p => - (p.value && (p.value === product.value || p.value === product.id || p.value === product.product_id)) || - (p.id && (p.id === product.id || p.id === product.value || p.id === product.product_id)) || - (p.product_id && (p.product_id === product.product_id || p.product_id === product.id || p.product_id === product.value)) + (p.value && p.value === product.value) || + (p.id && p.id === product.id) || + (p.product_id && p.product_id === product.product_id) ); if (isAlreadySelected) { @@ -436,9 +441,9 @@ const EditCompanyProfile = () => { // Remove from available products setAvailableProducts(prev => prev.filter(p => - !(p.value && (p.value === product.value || p.value === product.id || p.value === product.product_id)) && - !(p.id && (p.id === product.id || p.id === product.value || p.id === product.product_id)) && - !(p.product_id && (p.product_id === product.product_id || p.product_id === product.id || p.product_id === product.value)) + !(p.value && p.value === product.value) && + !(p.id && p.id === product.id) && + !(p.product_id && p.product_id === product.product_id) ) ); @@ -447,10 +452,15 @@ const EditCompanyProfile = () => { new Set([...prev, product.value || product.id || product.product_id]) ); - // Set newly added product as checked by default - setCheckedProducts(prev => - new Set([...prev, product.value || product.id || product.product_id]) - ); + // Only set newly added product as checked if it's not already in checkedProducts + // This prevents overriding manual unchecking + const productId = product.value || product.id || product.product_id; + setCheckedProducts(prev => { + if (prev.has(productId)) { + return prev; // Already checked, don't override + } + return new Set([...prev, productId]); + }); }; // Remove product handler @@ -460,9 +470,9 @@ const EditCompanyProfile = () => { // Remove from selected products setSelectedProducts(prev => prev.filter(p => - !(p.value && (p.value === product.value || p.value === product.id || p.value === product.product_id)) && - !(p.id && (p.id === product.id || p.id === product.value || p.id === product.product_id)) && - !(p.product_id && (p.product_id === product.product_id || p.product_id === product.id || p.product_id === product.value)) + !(p.value && p.value === product.value) && + !(p.id && p.id === product.id) && + !(p.product_id && p.product_id === product.product_id) ) ); @@ -484,9 +494,9 @@ const EditCompanyProfile = () => { setAvailableProducts(prev => { // Check if already in available products const alreadyExists = prev.some(p => - (p.value && (p.value === product.value || p.value === product.id || p.value === product.product_id)) || - (p.id && (p.id === product.id || p.id === product.value || p.id === product.product_id)) || - (p.product_id && (p.product_id === product.product_id || p.product_id === product.id || p.product_id === product.value)) + (p.value && p.value === product.value) || + (p.id && p.id === product.id) || + (p.product_id && p.product_id === product.product_id) ); if (!alreadyExists) { @@ -500,7 +510,7 @@ const EditCompanyProfile = () => { useEffect(() => { setVisibleProductCount(14); }, [availableProducts.length, productSearchTerm]); - + // Handle scroll event for infinite loading const handleScroll = useCallback(() => { if (isLoadingMore || visibleProductCount >= availableProducts.length) return; @@ -1090,7 +1100,26 @@ const EditCompanyProfile = () => {
{/* Available Products Panel - Only show if there are available products and not all selected products are checked */} - {availableProducts.length > 0 && selectedProducts.length > 0 && checkedProducts.size < selectedProducts.length && ( + {(() => { + // More robust condition that handles state inconsistencies + const hasAvailableProducts = availableProducts.length > 0; + const hasSelectedProducts = selectedProducts.length > 0; + + // Count how many selected products are actually checked + let actuallyCheckedCount = 0; + for (const product of selectedProducts) { + const productId = product.value || product.id || product.product_id; + if (checkedProducts.has(productId)) { + actuallyCheckedCount++; + } + } + + const hasUncheckedProducts = actuallyCheckedCount < selectedProducts.length; + const shouldShow = hasAvailableProducts && hasSelectedProducts && hasUncheckedProducts; + + + return shouldShow; + })() && (
Available Products