From 9d0aca9f5969338cb819ed109523f3aa7b5933bf Mon Sep 17 00:00:00 2001 From: Senthamilselvi Date: Thu, 6 Nov 2025 16:50:33 +0530 Subject: [PATCH] edit company profile get call corrected --- ipi-survey-platform/src/App.jsx | 10 +- .../EstablishmentInfo/EstablishmentInfo.jsx | 13 +- .../configuration/EditCompanyProfile.jsx | 476 ++++++++---------- 3 files changed, 210 insertions(+), 289 deletions(-) diff --git a/ipi-survey-platform/src/App.jsx b/ipi-survey-platform/src/App.jsx index ec3874d..473405c 100644 --- a/ipi-survey-platform/src/App.jsx +++ b/ipi-survey-platform/src/App.jsx @@ -278,11 +278,11 @@ function App() { } /> */} - - - - } /> + + + +} /> {/* { + const handleEditProfile = (e) => { e.preventDefault(); - // Get establishment_id directly from sessionStorage const establishmentId = sessionStorage.getItem('establishment_id'); + console.log('Edit Profile clicked, establishment_id:', establishmentId); if (!establishmentId) { alert('No establishment ID found in session'); return; } - // Save current page to return after editing (optional) localStorage.setItem('returnTo', window.location.pathname); - - // Store context info sessionStorage.setItem('edit_profile_from', 'EstablishmentUser'); - - // Navigate to profile edit page + + console.log('Navigating to:', `/profile/edit/${establishmentId}`); navigate(`/profile/edit/${establishmentId}`); }; - const handleEmployeeChange = (field) => (event) => { onChange({ ...info, diff --git a/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx b/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx index c2211ab..8c596d2 100644 --- a/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx +++ b/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx @@ -1,5 +1,5 @@ import React, { useState, useMemo, useCallback, useEffect, useRef } from "react"; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { TextField, SelectField, PhoneField } from "@/components/common/FormControls"; import Loader from "@/components/common/Loader"; import { fetchEstablishmentDetail, updateEstablishment } from '@/services/establishments/establishmentService'; @@ -7,31 +7,57 @@ import { fetchEmirates, fetchCityTowns } from '@/services/masters/masterService' // Helper functions const createEmptyProfile = () => ({ - // Add all form fields with empty/default values here userProfileName: '', userProfileEmail: '', - // Add other fields as needed + permanentFactoryCode: '', + uniqueLicenseNumber: '', + industryCodeBusiness: '', + industryCodeCurrent: '', + contactName: '', + contactAddress: '', + contactCityTown: '', + contactCityTownId: '', + contactEmirate: '', + contactEmirateId: '', + contactMakaniNumber: '', + contactPersonName: '', + contactMobileNumber: '', + contactEmail: '', + contactPostalCode: '', + contactPoBox: '', + contactWebsite: '', + corporateName: '', + corporateAddress: '', + corporateCityTown: '', + corporateCityTownId: '', + corporateEmirate: '', + corporateEmirateId: '', + corporateMakaniNumber: '', + corporateContactPersonName: '', + corporateMobileNumber: '', + corporateEmail: '', + corporatePostalCode: '', + corporatePoBox: '', + corporateWebsite: '', + corporateSameAs: false, + employmentEmiratiMale: 0, + employmentEmiratiFemale: 0, + employmentNonEmiratiMale: 0, + employmentNonEmiratiFemale: 0, }); const mapApiEstablishmentToProfile = (apiData) => { console.log('API Data to map:', apiData); - // If the API response has a data property, use that const data = apiData.data || apiData; - // Map API response to form fields return { - // User Profile (using first user from users array) userProfileName: data.users?.[0]?.name || '', userProfileEmail: data.users?.[0]?.email || '', - - // Identification Particulars permanentFactoryCode: data.permanent_factory_code || '', uniqueLicenseNumber: data.license_number || '', industryCodeBusiness: data.isic_code || '', industryCodeCurrent: data.isic_code || '', - - // Establishment Contact Details contactName: data.factory_name || '', contactAddress: data.establishment_address || '', contactCityTown: data.establishment_city?.name || '', @@ -45,8 +71,6 @@ const mapApiEstablishmentToProfile = (apiData) => { contactPostalCode: data.establishment_postal_code || '', contactPoBox: data.establishment_po_box || '', contactWebsite: data.establishment_website || '', - - // Corporate/Head Office corporateName: data.corporate_name || '', corporateAddress: data.corporate_address || '', corporateCityTown: data.corporate_city?.name || '', @@ -61,8 +85,6 @@ const mapApiEstablishmentToProfile = (apiData) => { corporatePoBox: data.corporate_po_box || '', corporateWebsite: data.corporate_website || '', corporateSameAs: data.corporate_same_as_establishment || false, - - // Employment employmentEmiratiMale: data.emirati_male || 0, employmentEmiratiFemale: data.emirati_female || 0, employmentNonEmiratiMale: data.non_emirati_male || 0, @@ -112,8 +134,8 @@ const captureCorporateValues = (data) => { const EditCompanyProfile = ({ onClose: propOnClose }) => { const navigate = useNavigate(); const { id: establishmentId } = useParams(); - - // Define default onClose function that navigates to survey page + console.log('EditCompanyProfile mounted, establishmentId from params:', establishmentId); + const onClose = propOnClose || (() => navigate('/survey')); const [loading, setLoading] = useState(false); const [form, setForm] = useState(createEmptyProfile()); @@ -123,7 +145,6 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { const [confirmError, setConfirmError] = useState(""); const [passwordReuseError, setPasswordReuseError] = useState(""); - // State for emirate and city options const [emirateOptions, setEmirateOptions] = useState([]); const [emirateLookup, setEmirateLookup] = useState({}); const [contactCityOptions, setContactCityOptions] = useState([]); @@ -185,7 +206,6 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { ); const validateStepFields = useCallback((stepIndex) => { - // Reset password reuse error when validating setPasswordReuseError(""); const requiredFields = requiredFieldsByStep[stepIndex] || []; if (!requiredFields.length) return true; @@ -205,7 +225,6 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { }, [form, requiredFieldsByStep]); const handleFormChange = useCallback((field, value) => { - // Handle city selection if (field === 'contactCityTown') { const foundCity = contactCityOptions.find(option => option.value === value || option.label === value); setForm(prev => ({ @@ -225,10 +244,10 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { })); return; } + setForm((prev) => ({ ...prev, [field]: value })); setFieldErrors((prev) => ({ ...prev, [field]: "" })); - // Clear password errors when user starts typing if (field === 'userProfilePassword') { setPasswordError(""); setPasswordReuseError(""); @@ -236,83 +255,7 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { if (field === 'userProfileConfirmPassword') { setConfirmError(""); } - }, []); - - const handleFormSubmit = async (e) => { - e.preventDefault(); - if (validateStepFields(activeStep)) { - if (activeStep < formSteps.length - 1) { - setActiveStep(activeStep + 1); - } else { - try { - setLoading(true); - - // Prepare the data for API - const establishmentData = { - factory_name: form.contactName, - establishment_address: form.contactAddress, - establishment_city: form.contactCityTownId, - establishment_emirate: form.contactEmirateId, - establishment_makani_number: form.contactMakaniNumber, - establishment_contact_person_name: form.contactPersonName, - establishment_mobile_number: form.contactMobileNumber, - establishment_contact_email: form.contactEmail, - establishment_postal_code: form.contactPostalCode, - establishment_po_box: form.contactPoBox, - establishment_website: form.contactWebsite, - - // Corporate/Head Office - corporate_name: form.corporateName, - corporate_address: form.corporateAddress, - corporate_city: form.corporateCityTownId, - corporate_emirate: form.corporateEmirateId, - corporate_makani_number: form.corporateMakaniNumber, - corporate_contact_person_name: form.corporateContactPersonName, - corporate_mobile_number: form.corporateMobileNumber, - corporate_email: form.corporateEmail, - corporate_postal_code: form.corporatePostalCode, - corporate_po_box: form.corporatePoBox, - corporate_website: form.corporateWebsite, - corporate_same_as_establishment: form.corporateSameAs, - - // Employment - emirati_male: form.employmentEmiratiMale || 0, - emirati_female: form.employmentEmiratiFemale || 0, - non_emirati_male: form.employmentNonEmiratiMale || 0, - non_emirati_female: form.employmentNonEmiratiFemale || 0, - }; - - console.log('Submitting establishment data:', { - establishmentId, - establishmentData - }); - - // If establishmentId exists, update the establishment - if (establishmentId) { - console.log('Updating establishment with ID:', establishmentId); - const response = await updateEstablishment(establishmentId, establishmentData); - console.log('Update response:', response); - - // Show success message - alert('Establishment updated successfully!'); - - // Redirect to the dashboard or previous page - navigate('/dashboard'); - } else { - // Handle case where no establishmentId is provided - console.error('No establishment ID provided for update'); - alert('Error: No establishment ID provided for update'); - } - - } catch (error) { - console.error('Error updating establishment:', error); - alert('Failed to update establishment. Please try again.'); - } finally { - setLoading(false); - } - } - } - }; + }, [contactCityOptions, corporateCityOptions]); const handleNext = useCallback(() => { if (validateStepFields(activeStep)) { @@ -326,87 +269,11 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { if (activeStep > 0) setActiveStep(activeStep - 1); }, [activeStep]); - // Fetch establishment details when ID is provided - useEffect(() => { - const fetchData = async () => { - - if (!establishmentId) { - return; - } - - try { - setLoading(true); - console.log('Fetching establishment details for ID:', establishmentId); - - const response = await fetchEstablishmentDetail(establishmentId) - .then(res => { - console.log('Raw API Response:', res); - return res; - }) - .catch(error => { - console.error('API call failed:', { - message: error.message, - status: error.response?.status, - data: error.response?.data, - config: error.config - }); - throw error; - }); - - console.log('API Response:', response); - - if (!response) { - console.error('Empty response received'); - return; - } - - const mappedProfile = mapApiEstablishmentToProfile(response); - console.log('Mapped Profile:', mappedProfile); - - const formData = { - ...createEmptyProfile(), - ...mappedProfile, - apiId: establishmentId, - corporateSameAs: Boolean(mappedProfile.corporateSameAs) - }; - - console.log('Form Data before corporate same as:', formData); - - if (formData.corporateSameAs) { - Object.entries(contactToCorporateMap).forEach(([source, target]) => { - formData[target] = formData[source]; - }); - } - - const totals = computeEmploymentTotals(formData); - Object.assign(formData, totals); - - console.log('Final Form Data:', formData); - - setForm(formData); - initialSnapshotRef.current = formData; - corporateBackupRef.current = captureCorporateValues(formData); - - } catch (error) { - console.error('Failed to load establishment details:', { - error, - message: error.message, - response: error.response?.data, - status: error.response?.status - }); - } finally { - setLoading(false); - } - }; - - fetchData(); - }, [establishmentId]); - // Load cities based on selected emirate const loadCities = useCallback(async (emirateId, setCityOptions) => { if (!emirateId) { setCityOptions([]); - return; + return []; } try { @@ -429,6 +296,66 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { } }, []); +useEffect(() => { + console.log('useEffect triggered, establishmentId:', establishmentId); + + const fetchData = async () => { + if (!establishmentId) { + console.log('No establishmentId found, skipping fetch'); + + return; + } + + try { + setLoading(true); + console.log('Starting API call to fetch establishment details for ID:', establishmentId); + + const response = await fetchEstablishmentDetail(establishmentId); + console.log('API Response received:', response); + + if (!response) { + console.error('Empty response received'); + return; + } + + const mappedProfile = mapApiEstablishmentToProfile(response); + console.log('Mapped Profile:', mappedProfile); + + const formData = { + ...createEmptyProfile(), + ...mappedProfile, + apiId: establishmentId, + corporateSameAs: Boolean(mappedProfile.corporateSameAs) + }; + + console.log('Form Data before corporate same as:', formData); + + if (formData.corporateSameAs) { + Object.entries(contactToCorporateMap).forEach(([source, target]) => { + formData[target] = formData[source]; + }); + } + + const totals = computeEmploymentTotals(formData); + Object.assign(formData, totals); + + console.log('Final Form Data:', formData); + + setForm(formData); + initialSnapshotRef.current = formData; + corporateBackupRef.current = captureCorporateValues(formData); + + } catch (error) { + console.error('Failed to load establishment details:', error); + alert('Failed to load company details. Please try again.'); + } finally { + setLoading(false); + } + }; + + fetchData(); +}, [establishmentId]); + // Load emirates on component mount useEffect(() => { let cancelled = false; @@ -467,49 +394,31 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { }; }, []); - // Load contact cities when emirate changes + // Load contact cities when emirate ID changes useEffect(() => { const loadContactCities = async () => { if (form.contactEmirateId) { await loadCities(form.contactEmirateId, setContactCityOptions); - - // If we have a city ID but it's not in the options, try to find and add it - if (form.contactCityTownId && !contactCityOptions.some(city => city.id === form.contactCityTownId)) { - const cities = await loadCities(form.contactEmirateId, setContactCityOptions); - const currentCity = cities.find(city => city.id === form.contactCityTownId); - if (currentCity) { - setContactCityOptions(prev => [...prev, currentCity]); - } - } } else { setContactCityOptions([]); } }; loadContactCities(); - }, [form.contactEmirateId, form.contactCityTownId, loadCities]); + }, [form.contactEmirateId, loadCities]); - // Load corporate cities when emirate changes + // Load corporate cities when emirate ID changes useEffect(() => { const loadCorporateCities = async () => { if (form.corporateEmirateId) { await loadCities(form.corporateEmirateId, setCorporateCityOptions); - - // If we have a city ID but it's not in the options, try to find and add it - if (form.corporateCityTownId && !corporateCityOptions.some(city => city.id === form.corporateCityTownId)) { - const cities = await loadCities(form.corporateEmirateId, setCorporateCityOptions); - const currentCity = cities.find(city => city.id === form.corporateCityTownId); - if (currentCity) { - setCorporateCityOptions(prev => [...prev, currentCity]); - } - } } else { setCorporateCityOptions([]); } }; loadCorporateCities(); - }, [form.corporateEmirateId, form.corporateCityTownId, loadCities]); + }, [form.corporateEmirateId, loadCities]); // Calculate totals when employment numbers change useEffect(() => { @@ -525,84 +434,91 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { form.employmentNonEmiratiFemale ]); - // Handle corporate same as establishment - useEffect(() => { - if (form.corporateSameAs) { - // Save current corporate values if this is the first time checking - if (!corporateBackupRef.current) { - corporateBackupRef.current = captureCorporateValues(form); - } + // Handle corporate same as establishment checkbox + const handleCorporateSameAsChange = useCallback((checked) => { + if (checked) { + // Save current corporate values before overwriting + corporateBackupRef.current = captureCorporateValues(form); // Copy contact details to corporate - const corporateUpdates = {}; + const corporateUpdates = { corporateSameAs: true }; Object.entries(contactToCorporateMap).forEach(([source, target]) => { corporateUpdates[target] = form[source]; - // Also copy the ID fields - if (source.endsWith('CityTown')) { - corporateUpdates[`${target}Id`] = form[`${source}Id`]; - } else if (source.endsWith('Emirate')) { - corporateUpdates[`${target}Id`] = form[`${source}Id`]; - } }); setForm(prev => ({ ...prev, ...corporateUpdates })); - } else if (corporateBackupRef.current) { + } else { // Restore original corporate values setForm(prev => ({ ...prev, - ...corporateBackupRef.current + corporateSameAs: false, + ...(corporateBackupRef.current || {}) })); corporateBackupRef.current = null; } - }, [form.corporateSameAs, form.contactName, form.contactAddress, form.contactCityTown, form.contactEmirate, form.contactCityTownId, form.contactEmirateId]); + }, [form]); const handleSave = async () => { console.log("Submitted data:", form); - + try { setLoading(true); - - // Prepare the data for API + const establishmentData = { - factory_name: form.contactName, - establishment_address: form.contactAddress, - establishment_city: form.contactCityTownId, - establishment_emirate: form.contactEmirateId, - establishment_makani_number: form.contactMakaniNumber, - establishment_contact_person_name: form.contactPersonName, - establishment_mobile_number: form.contactMobileNumber, - establishment_contact_email: form.contactEmail, - establishment_postal_code: form.contactPostalCode, - establishment_po_box: form.contactPoBox, - establishment_website: form.contactWebsite, - - // Corporate/Head Office - corporate_name: form.corporateName, - corporate_address: form.corporateAddress, - corporate_city: form.corporateCityTownId, - corporate_emirate: form.corporateEmirateId, - corporate_makani_number: form.corporateMakaniNumber, - corporate_contact_person_name: form.corporateContactPersonName, - corporate_mobile_number: form.corporateMobileNumber, - corporate_email: form.corporateEmail, - corporate_postal_code: form.corporatePostalCode, - corporate_po_box: form.corporatePoBox, - corporate_website: form.corporateWebsite, - corporate_same_as_establishment: form.corporateSameAs, - - // Employment - emirati_male: form.employmentEmiratiMale || 0, - emirati_female: form.employmentEmiratiFemale || 0, - non_emirati_male: form.employmentNonEmiratiMale || 0, - non_emirati_female: form.employmentNonEmiratiFemale || 0, + establishment_code: form.uniqueLicenseNumber || "", + factory_name: form.contactName || "", + permanent_factory_code: form.permanentFactoryCode || "", + industry_code: form.industryCodeBusiness || "", + license_number: form.uniqueLicenseNumber || "", + isic_code: form.industryCodeCurrent || "", + description: form.industryDescription || "", + establishment_address: form.contactAddress || "", + establishment_city_town_id: form.contactCityTownId ? Number(form.contactCityTownId) : null, + establishment_emirate_id: form.contactEmirateId ? Number(form.contactEmirateId) : null, + corporate_city_town_id: form.corporateCityTownId ? Number(form.corporateCityTownId) : null, + corporate_emirate_id: form.corporateEmirateId ? Number(form.corporateEmirateId) : null, + establishment_postal_code: form.contactPostalCode || "", + establishment_po_box: form.contactPoBox || "", + establishment_makani_number: form.contactMakaniNumber || "", + establishment_contact_person_name: form.contactPersonName || "", + establishment_contact_person_designation: form.contactPersonDesignation || "", + establishment_mobile_number: form.contactMobileNumber || "", + establishment_contact_email: form.contactEmail || "", + establishment_website: form.contactWebsite || "", + corporate_same_as_establishment: Boolean(form.corporateSameAs), + corporate_name: form.corporateName || "", + corporate_address: form.corporateAddress || "", + corporate_postal_code: form.corporatePostalCode || "", + corporate_po_box: form.corporatePoBox || "", + corporate_makani_number: form.corporateMakaniNumber || "", + corporate_contact_person_name: form.corporateContactPersonName || "", + corporate_contact_person_designation: form.corporateContactPersonDesignation || "", + corporate_mobile_number: form.corporateMobileNumber || "", + corporate_email: form.corporateEmail || "", + corporate_website: form.corporateWebsite || "", + emirati_male: Number(form.employmentEmiratiMale) || 0, + emirati_female: Number(form.employmentEmiratiFemale) || 0, + non_emirati_male: Number(form.employmentNonEmiratiMale) || 0, + non_emirati_female: Number(form.employmentNonEmiratiFemale) || 0, + total_emirati: + (Number(form.employmentEmiratiMale) || 0) + + (Number(form.employmentEmiratiFemale) || 0), + total_employees: + (Number(form.employmentEmiratiMale) || 0) + + (Number(form.employmentEmiratiFemale) || 0) + + (Number(form.employmentNonEmiratiMale) || 0) + + (Number(form.employmentNonEmiratiFemale) || 0), + updated_by: 1 }; - + + console.log("Payload sent:", establishmentData); + if (establishmentId) { console.log('Updating establishment with ID:', establishmentId); - await updateEstablishment(establishmentId, establishmentData); + await updateEstablishment(establishmentId, establishmentData); alert('Profile updated successfully!'); onClose(); } else { @@ -616,7 +532,8 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { setLoading(false); } }; - + + const renderStepContent = () => { switch (activeStep) { case 0: @@ -765,15 +682,11 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { const selectedValue = e.target.value; const selectedEmirate = emirateOptions.find(opt => opt.value === selectedValue); - // Update emirate fields handleFormChange("contactEmirate", selectedEmirate?.name || ''); handleFormChange("contactEmirateId", selectedEmirate?.id || ''); - - // Clear city fields handleFormChange("contactCityTown", ''); handleFormChange("contactCityTownId", ''); - // Load cities for the selected emirate if (selectedEmirate?.id) { const cities = await loadCities(selectedEmirate.id, setContactCityOptions); setContactCityOptions(cities); @@ -869,7 +782,6 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { required error={fieldErrors.contactEmail} /> - { case 3: return (
-
-
-

Corporate/Head Office Contact

-
- -
-{/*
*/} +
+
+

Corporate/Head Office Contact

+
+ +
{ handleFormChange("corporateEmirate", e.target.value)} + value={form.corporateEmirateId || ""} + onChange={async (e) => { + const selectedValue = e.target.value; + const selectedEmirate = emirateOptions.find(opt => opt.value === selectedValue); + + handleFormChange("corporateEmirate", selectedEmirate?.name || ''); + handleFormChange("corporateEmirateId", selectedEmirate?.id || ''); + handleFormChange("corporateCityTown", ''); + handleFormChange("corporateCityTownId", ''); + + if (selectedEmirate?.id) { + const cities = await loadCities(selectedEmirate.id, setCorporateCityOptions); + setCorporateCityOptions(cities); + } else { + setCorporateCityOptions([]); + } + }} options={emirateOptions.map(opt => ({ - value: opt.name, - label: opt.name + value: opt.value, + label: opt.label }))} placeholder="Select Emirate" width="100%" @@ -1240,4 +1166,4 @@ const EditCompanyProfile = ({ onClose: propOnClose }) => { ); }; -export default EditCompanyProfile; +export default EditCompanyProfile; \ No newline at end of file