{"version":3,"sources":["assets/config.js","context/Auth/AuthContext.js","assets/img/RAP_high_resolution_web_1.png","components/Header/header.js","components/Menu/menu.js","components/Home/home.js","components/PrivateRoute/privateRoute.js","helpers/notifications.js","components/Login/login.js","components/Login/login_validations.js","components/ForgotPassword/validations.js","services/api.js","components/ForgotPassword/forgotPassword.js","components/ChangePassword/changePassword_validations.js","components/ChangePassword/changePassword.js","components/SystemLog/systemLogGrid.js","components/SystemLog/systemLog.js","assets/img/EN_ILO_Organization_Horizontal_RGB_Blue.png","components/AuthInstitutions/authInstitutions.js","components/ExternalAuth/externalAuth.js","assets/Constants/actionsTypes.js","components/Models/modelGrid.js","components/Models/modelModal.js","components/Models/model.js","components/Scenarios/scenarioGrid.js","components/Scenarios/scenarioModal.js","assets/Constants/matrixContext.js","components/Scenarios/scenario.js","components/Models/wizardInfo.js","components/Models/Step1.js","components/Models/constants.js","components/Models/Step2.js","components/Models/Step3.js","components/PopGroups/costants.js","components/Models/Step4.js","components/Models/Step5.js","components/Models/Step6.js","components/Models/Step7.js","components/Models/Step8.js","components/Models/Step9.js","components/Models/Step10.js","components/Models/wizard.js","components/SPFunctions/spFunctionsGrid.js","components/SPFunctions/spFunctionsModal.js","components/SPFunctions/spFunctions.js","components/SPComponents/spComponentsGrid.js","components/SPComponents/spComponentsModal.js","components/SPComponents/spComponents.js","components/PopGroups/popGroupsGrid.js","components/PopGroups/popGroupsModal.js","components/PopGroups/popGroups.js","components/Benefit/benefitGrid.js","assets/Constants/enums.js","components/Benefit/benefitModal.js","components/Benefit/benefit_cleanAndValidate.js","components/Benefit/benefit.js","components/Scenarios/dashboard.js","components/Scenarios/constants.js","components/Footer/footer.js","components/Scenarios/scenarioBenefitModalViews/selectBenefit.js","components/Scenarios/scenarioBenefitModalViews/linkBenefitandGroups.js","components/Scenarios/scenarioAddBenefit.js","components/Models/modelReports.js","components/Scenarios/matrixActionsBar.js","components/Scenarios/matrixSpreadsheet.js","components/ReusableComponents/TreeViewGA/customItem.js","components/ReusableComponents/TreeViewGA/treeViewGA.js","components/Scenarios/matrixControl.js","components/GraphControl/graphSelectors.js","components/GraphControl/graphView.js","components/GraphControl/graphControl.js","context/types.js","context/Auth/AuthReducer.js","context/Auth/AuthState.js","App.js","assets/translations/initI18n.js","index.js"],"names":["STRONG_PASSWORD_OPTIONS","minLength","minLowercase","minUppercase","minNumbers","minSymbols","returnScore","COMPLETE_MODULES","AuthContext","createContext","Header","pathname","useLocation","t","useTranslation","useContext","get_currentInstitution","is_selected_institution","baseUrlLogoInstitutions","is_login","className","href","id","to","src","rapLogo","alt","catInstitutionLogoFilename","catInstitutionCountryName","Menu","i18n","user","logout","is_firstime","history","useHistory","no_menu_title","menuOptions","activeClassName","exact","role","data-toggle","aria-haspopup","aria-expanded","aria-labelledby","currentModuleRoleCode","style","backgroundColor","color","padding","marginLeft","marginRight","type","data-target","aria-controls","aria-label","onClick","changeLanguage","email","replace","from","Home","PrivateRoute","children","rest","render","location","path","state","defaultOptions","position","hideProgressBar","closeOnClick","autoClose","toastNotifications","msg","toast","error","info","success","Login","login","useState","setEmail","password","setPassword","useEffect","push","signin","validator","isEmpty","isEmail","validate_login","length","Notifications","notify","paddingLeft","dangerouslySetInnerHTML","__html","placeholder","onKeyPress","event","key","onChange","e","target","value","validate_fields","PUBLIC","axios","create","AMS","baseURL","ForgotPassword","get_new_password","a","params","usr","API","post","response","data","code","validate_changePassword","newPassword","repeatPassword","equals","isStrongPassword","ChangePassword","props","update_first_time","setNewPassword","setRepeatPassword","firstime","save_new_password","reqData","cpw","npw","res","disabled","SystemLogGrid","height","field","title","width","Log","from_date","setFromDate","to_date","setToDate","category","setCategory","categories","setCategories","setEvent","events","setEvents","loading","setLoading","logResults","setLogResults","searchLog","url","get","String","console","log","catList","evtList","getDropdownsData","htmlFor","map","categorie","AuthInstitutions","authorizedInstitutions","select_institution","arr","setArr","institutions","item","i","catInstitutionName","catRoleCode","ExternalAuth","extAuth","queryString","URLSearchParams","search","urlParams64","ciid","cuid","ts","sk","NEW","VIEW","UPDATE","DELETE","COPY","EDIT","UNLOCK","ADD_BENEFIT","OPEN","REPORTS","ModelGrid","showUnlockAction","dataItem","editLockUserCode","text","cell","textAlign","isReadyForAssessment","gridProps","onItemClick","onActionClick","ModelModal","window","createRef","showSave","setShowSave","isUpdate","setIsUpdate","setCode","name","setName","toggleWindow","hideButtons","current","windowElement","querySelector","parentElement","visibility","initialHeight","modal","resizable","draggable","doubleClickStageChange","onClose","ref","layout","modelid","onSave","Model","viewType","setViewType","modelData","setModelData","modelsList","setModelsList","showModal","setShowModal","showAlert","setShowAlert","getModelsList","actionItem","dataItme","action","detail","onEdit","toggleAlert","onUnlock","catInstitutionId","institutionId","onDelete","haveScenarios","delete","onCopy","margin","ScenarioGrid","isCalculated","ScenarioModal","finalYear","setFinalYear","description","setDescription","selectedModel","setSelectedModel","modelId","forEach","index","model","rows","find","parseInt","scenarioId","baseYear","MatrixContext","MODEL","SCENARIO","Scenario","scenariosData","setScenariosData","scenariosList","setScenariosList","getScenariosList","onAddBenefit","onOpenScenario","scenarioData","isLockRes","isLockData","isLock","isCehckoutRes","isCheckoutData","toString","isFloat","dataScenarioData","trim","ctxtcode","scenarioid","opcode","usrcode","customparams","JSON","stringify","runblocks","WizardInfo","activeStep","isActionView","isModelCompleted","Step1","igdp","setIGDP","igex","setIGEX","setBaseYear","selectedNominal","setSelectedNominal","historicalYear","setHistoricalYear","getStep1Data","historicalYears","nominal","onNextClick","isEditMode","saveStep1Data","changeStep","parseFloat","thousandsGroupStyle","decimalSeparator","displayType","thousandSeparator","allowNegative","onValueChange","values","checked","editSteps","marginBottom","TRANSFER_TO","TRANSFER_FROM","SELECTED_FIELD","Step2","React","availableBenefits","addedBenefits","setState","selectedBenefitId","setSelectedBenefitId","getStep2_data","responseAvailable","responseAdded","availableBenefitsBD","availableBenefitsFirstSelected","benefitId","handleItemClick","connectedData","handleToolBarClick","toolName","result","processListBoxData","arrowAction","listBoxOneData","listBoxTwoData","fontWeight","textField","selectedField","toolbar","tools","dataConnected","onToolClick","Step3","testRef","benefitsList","availableGroups","addedGroups","selectedPopGroupId","setSelectedPopGroupId","selectedBeneficiaryUnit","setSelectedBeneficiaryUnit","getStep3_data","responseBenefits","benefitsListBD","benefitsListFirstSelected","getGroupsByBenefit","validateNext","beneficiaryUnit","popGroupId","modelBenfitsClick","benefitlist","responseGroups","responseAddedGroups","canSave","element","BEN_UNIT_HOUSEHOLDS","Step4","ibam","setIBAM","iantrans","setIANTRANS","iadm","setIADM","ithr","setITHR","ichh","setICHH","icpmale","setICPMale","icpfemale","setICPFemale","ihhavs","setIhhavs","setBeneficiaryUnit","setIsHouseHold","getStep4_Benefits","fillInputs","onPreviousClick","saveStep4Data","ithr_abam","itexp","responseBenefitsData","ithR_ABAM","icpMale","icpFemale","Step5","gridList","setGridList","getStep5Data","addCommas","num","formatedSex","indIncludeFemale","itexpValue","icPm","icPf","totalValue","fullData","total","titleStyle","headerClassName","headerCell","avgString","Step6","policyGaps","setPolicyGaps","impIssues","setImpIssues","policyRecom","setPolicyRecom","annotations","setAnnotations","getStep6_Benefits","saveStep6Data","implemIssues","suppleAnnotations","Step7","columns","spreadDim","setSpreadDim","spread","useRef","showSpread","setShowSpread","cells","fillSpreadSheet","getData","validate_edit","sheet","widgetInstance","activeSheet","frozenRows","fromJSON","getFemData_INATPOP","femaleDataINATPOP","split","getMaleData_INATPOP","maleDataINATPOP","range","newArray","getFemData_ILF","femaleDataILF","getMaleData_ILF","maleDataILF","enable","isNaN","saveMatrixData","actSheet","fem_inatpop_validation","male_inatpop_validation","fem_ilf_validation","male_ilf_validation","checkSPData","female_nat_pop_Vals","male_nat_pop_Vals","semiFem_inatpop","replaceAll","semiMale_inatpop","female_ilf_Vals","male_ilf_Vals","semiFem_ilf","semiMale_ilf","dataSent","every","marginTop","size","Step8","gridDataList","setGridDataList","showGapReport","setShowGapReport","maxPull","setMaxPull","taskIdForPull","setTaskIdForPull","doPull","setDoPull","checkIsReadyForAssessment","interval","setInterval","checkTaskStatus","clearInterval","getStep8Data","calculateGapAssessment","taskid","setFlags","displayInformation","Step9","getStep9Data","UserCode","ModelId","BenefitId","SPFunctionId","SPComponentId","minCreationYear","MaxCreationYear","GroupName","AdminInstitutionName","LegalFramework","Description","PolicyGaps","Issues","Recommendations","Annotations","Step10","onCompleteClick","validateIsReadyForAssessment","Wizard","setActiveStep","setIsEditMode","setIsModelCompleted","setIsActionView","setModelFlags","changeActiveStep","stepIndex","switchSteps","SPFunctionsGrid","SPFunctionsModal","spFunctionId","SPFunctions","functionsList","setFunctionsList","functionData","setFunctionData","getFunctions","SPComponentsGrid","SPComponentsModal","spComponentId","SPComponent","componentsList","setComponentsList","componentData","setComponentData","getComponentsList","PopGroupsGrid","PopGroupsModal","beneficaryUnit","setbeneficaryUnit","initialAgeMale","setInitialAgeMale","finalAgeMale","setFinalAgeMale","initialAgeFemale","setInitialAgeFemale","finalAgeFemale","setFinalAgeFemale","ec1Desc","setEC1Desc","ec2Desc","setEC2Desc","ec3Desc","setEC3Desc","ec1HH","setEC1HH","ec1Y1","setEC1Y1","ec1Y2","setEC1Y2","ec2HH","setEC2HH","ec2Y1","setEC2Y1","ec2Y2","setEC2Y2","ec3HH","setEC3HH","ec3Y1","setEC3Y1","ec3Y2","setEC3Y2","selectedRefPopulation","setSelectedRefPopulation","selectedSex","setSelectedSex","REF_POPULATION_DATA","minAgeMale","maxAgeMale","minAgeFemale","maxAgeFemale","sexId","refPopId","elegibilityCriteria1","elegibilityCriteria1Y0_HH","elegibilityCriteria1Y0_Female","elegibilityCriteria1Y0_Male","elegibilityCriteria2","elegibilityCriteria2Y0_HH","elegibilityCriteria2Y0_Female","elegibilityCriteria2Y0_Male","elegibilityCriteria3","elegibilityCriteria3Y0_HH","elegibilityCriteria3Y0_Female","elegibilityCriteria3Y0_Male","population","fontSize","toggleStateEC1","toggleStateEC2","toggleStateEC3","PopGroups","popGroupData","setpopGroupData","groupsList","setGroupsList","getPopGroupsList","refpopulation","referencePopMatrixCode","includedFemales","includedMales","sex","ec2","ec3","ecTotal","selectedFemale","selectedMale","femEC1","femEC2","femEC3","BenefitGrid","spFunctionName","creationYear","adminInstitution","CASH_OR_KIND","label","EXIST_BENEFIT","PERMANENT_OR_TEMPORAL","FINANCING_SOURCE","BenefitModal","setspFunctionId","setspComponentId","spGuaranteeId","setspGuaranteeId","setname","setcreationYear","cashOrKind","setcashOrKind","isExistingBenefit","setisExistingBenefit","permanentOrTemporal","setpermanentOrTemporal","schemeName","setschemeName","financingSource","setfinancingSource","setadminInstitution","responsibleBody","setresponsibleBody","setdescription","legalFramework","setlegalFramework","Array","isArray","spFunctionList","spComponentList","spGuaranteeList","isNumeric","guarantee","spfunction","spcomponent","option","validate_benefit","Number","clean_benefit","Benefit","benefitSelected","setBenefitSelected","benefitList","setBenefitList","setSpFunctionList","setSpComponentList","setSpGuaranteeList","getBenefits","getAllComboList","resFunction","resComponent","resGuarantees","requestData","Dashboard","showingInputs","setShowingInputs","onCalculate","Footer","currenteData","Date","rel","getFullYear","SelectBenefit","existingBenefits","setExistingBenefits","setAvailableBenefits","selectedBenefit","setSelectedBenefit","resScenarioBenefits","resAvailableBenefits","goBack","Object","keys","changeView","LinkBenefitandGroups","confirmAdd","setConfirmAdd","addAnother","setAddAnother","showAddBtn","setShowAddBtn","getScenarioGroups","resGroups","availableGroupsList","toggleConfirmAdd","toggleAddAnother","toggleShowAddBtn","handleAddBenefit","handleAddAnotherBenefit","ScenarioAddBenefit","view","setView","newView","detailsData","groupsID","IBAM","IANTRANS","IADM","ICPMale","ICPFemale","ICHH","ITHR_ABAM","switchView","ModelReports","selectedReport","setSelectedReport","reportsList","setReportsList","showSpinner","setShowSpinner","getComboboxData","getReportData","message","sheets","maxWidth","report","tag","MatrixActionsBar","sexSelector","setSexSelector","groupSelector","setGroupSelector","selectedNodeData","createSelectorsString","breadcrumb","join","onSelectorChange","dim","selectors","getMatrixData","handleCheckout","checkoutRes","checkoutInfoRes","setMatrixData","matrixData","datablockranges","handleUndoCheckout","handleExport","exportData","ischeckedout","checkoutuser","readonly","cleanMatrixData","checkinMatrixData","matrixMetadata","selectorList","selectorType","breadcrumbTypes","dimindex","dimlist","indexOf","options","dimdata","op","j","generateSelectors","MatrixSpreadSheet","dataSource","setDataSource","_export","setMatrixMetadata","getMatrixMetadaData","initialSelectors","matrixcode","setBlockTree","spreadsheet","parse","blocks","ischeckout","block","flat","dataFlat","saveRes","checkinRes","spreadInstance","saveAsExcel","excelExport","workbook","fileName","types","customItem","itemType","TreeViewGA","treeDataToShow","setTreeDataToShow","completeTreeData","setCompleteTreeData","defaultOpen","expanded","expandTreeNode","items","term","reduce","acc","contains","newItems","toLowerCase","searchingInTree","newData","expandIcons","onExpandChange","blockTree","treeDataNew","foo","selected","afterClickLeaf","leafData","aria-multiselectable","MatrixControl","get_user_from_session","setSelectedNodeData","dataTree","setDataTree","getTreeJson","matrixNoneData","GraphSelectors","setYear","setYearTComplete","setChange","sexBothSelector","setSexBothSelector","gdpgexSelector","setGdpgexSelector","graphMetadata","minVal","showGraph","setShowGraph","getGraph","toCapital","param","capLetter","charAt","toUpperCase","restWord","slice","selector","reverse","GraphView","setGraphMetadata","getGraphMeta","graphCode","setTimeout","Bokeh","embed","embed_item","GraphControl","selectedGraphNodeData","setSelectedGraphNodeData","graphDataTree","setGraphDataTree","handleGraphClick","graphData","SIGNIN","SIGNOUT","SELECT_INSTITUTION","UPDATE_FIRST_TIME","authReducer","payload","currentInstitutionIndex","isFirstTime","AuthState","useReducer","AuthReducer","dispatch","pw","cb","sessionStorage","setItem","userDataObj","getItem","urlparams","Provider","removeItem","indexID","UnderConstruction","App","i18next","init","interpolation","escapeValue","lng","resources","en","common","common_en","es","common_es","fr","common_fr","ReactDOM","I18nextProvider","document","getElementById"],"mappings":"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","file":"static/js/main.47aebb77.chunk.js","sourcesContent":["export const VALIDATE_STRONG_PASSWORD = true;\r\n\r\nexport const STRONG_PASSWORD_OPTIONS = {\r\n minLength: 8,\r\n minLowercase: 1,\r\n minUppercase: 1,\r\n minNumbers: 1,\r\n minSymbols: 1,\r\n returnScore: false\r\n}\r\n\r\nexport const COMPLETE_MODULES = {\r\n spFunction: true,\r\n spComponents: true,\r\n pGroups: true,\r\n benefits: true,\r\n models: true,\r\n wizard: true,\r\n scenarios: true,\r\n log: true\r\n}","import { createContext } from 'react';\r\n\r\n\r\n/*\r\nAuth Context have a global state for auth\r\nAuth has the provider that is used in AuthState to render \r\n the necessary children within it.\r\nWhen another component needs some variable from this context, \r\n it has to import it and use the hook of useContext to get the things that the provider offers.\r\n*/\r\n\r\nconst AuthContext = createContext();\r\n\r\nexport default AuthContext;\r\n","export default __webpack_public_path__ + \"static/media/RAP_high_resolution_web_1.125ba669.png\";","import { useTranslation } from 'react-i18next';\r\nimport React, { useContext } from 'react';\r\nimport './header.css';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { Link, useLocation } from 'react-router-dom'\r\nimport rapLogo from '../../assets/img/RAP_high_resolution_web_1.png'\r\nfunction Header() {\r\n\r\n const { pathname } = useLocation();\r\n const { t } = useTranslation('common');\r\n const { get_currentInstitution, is_selected_institution, baseUrlLogoInstitutions, is_login } = useContext(AuthContext);\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \r\n {/*In pages outside Login the logo does not redirect to Home*/}\r\n { is_login() ?\r\n \r\n \"rap \r\n \r\n :\r\n \"rap\r\n }\r\n \r\n
\r\n\r\n {is_selected_institution() && pathname !== '/AuthInstitutions' ?\r\n
\r\n \r\n {get_currentInstitution().catInstitutionCountryName}\r\n \r\n
: null\r\n }\r\n\r\n
\r\n\r\n
\r\n );\r\n}\r\n\r\nexport default Header;\r\n","import React, { useContext } from 'react';\r\nimport './menu.css';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { NavLink, useHistory, useLocation } from \"react-router-dom\";\r\n\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { FiLogOut, FiUser } from 'react-icons/fi'\r\nimport { MdLanguage } from \"react-icons/md\";\r\n\r\nfunction Menu() {\r\n\r\n const { t, i18n } = useTranslation('common');\r\n const { user, logout, is_login, is_selected_institution, is_firstime, get_currentInstitution } = useContext(AuthContext);\r\n const history = useHistory();\r\n const { pathname } = useLocation();\r\n\r\n\r\n const signout = () => {\r\n logout(() => {\r\n history.replace({ from: { pathname: \"/Login\" } });\r\n });\r\n };\r\n\r\n\r\n //The title is solved using the path, only some of them have this feature.\r\n let no_menu_title = ''\r\n switch (pathname) {\r\n case '/Login':\r\n no_menu_title = t('login.title')\r\n break;\r\n case '/ForgotPassword':\r\n no_menu_title = t('forgotPassword.menu_title');\r\n break;\r\n case '/ChangePassword':\r\n no_menu_title = t('changePassword.title');\r\n break;\r\n case '/AuthInstitutions':\r\n no_menu_title = 'Auth Institutions'\r\n break;\r\n case '/FirstTime':\r\n no_menu_title = t('changePassword.tilte_firstTime');\r\n break;\r\n case '/ExtAuth':\r\n no_menu_title = 'External Auth';\r\n break;\r\n\r\n default:\r\n no_menu_title = ''\r\n break;\r\n }\r\n\r\n //Asked whether to display a title or menu options\r\n const menuOptions = (\r\n is_login() && is_selected_institution() && pathname !== '/AuthInstitutions' ? (\r\n <>\r\n
  • \r\n {t('menu.home')}\r\n
  • \r\n
  • \r\n
    \r\n {t('menu.configuration')}\r\n
    \r\n
    \r\n {\r\n get_currentInstitution().currentModuleRoleCode === 'ADM' ?\r\n <>\r\n {t('menu.spFunctions')}\r\n {t('menu.spComponents')}\r\n : null\r\n }\r\n\r\n {t('menu.spPopGroups')}\r\n {t('menu.benefits')}\r\n
    \r\n
  • \r\n
  • \r\n {t('menu.models')}\r\n
  • \r\n
  • \r\n {t('menu.scenarios')}\r\n
  • \r\n {\r\n get_currentInstitution().currentModuleRoleCode === 'ADM' ?\r\n <>\r\n
  • \r\n {t('menu.log')}\r\n
  • \r\n : null\r\n }\r\n\r\n \r\n ) : (\r\n
  • \r\n

    {no_menu_title}

    \r\n
  • \r\n )\r\n )\r\n\r\n return (\r\n \r\n );\r\n\r\n}\r\n\r\nexport default Menu","// import { useTranslation } from 'react-i18next';\r\nimport React from 'react';\r\nimport './home.css';\r\n\r\nfunction Home(){\r\n\r\n // const {t} = useTranslation('common');\r\n\r\n return(\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default Home","import React, { useContext } from 'react';\r\nimport { Redirect, Route } from 'react-router';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nconst PrivateRoute = ({ children, ...rest }) => {\r\n const { is_login, is_selected_institution, is_firstime } = useContext(AuthContext);\r\n\r\n return (\r\n {\r\n // this \r\n if (is_login()) {\r\n if (is_firstime()) {\r\n if (rest.path === \"/FirstTime\") {\r\n return children\r\n }\r\n return \r\n } else {\r\n if (rest.path === \"/FirstTime\") {\r\n return \r\n } else {\r\n if (!is_selected_institution()) {\r\n if (rest.path === \"/AuthInstitutions\") {\r\n return children\r\n }\r\n return \r\n } else {\r\n return children\r\n }\r\n }\r\n\r\n }\r\n } else {\r\n return \r\n }\r\n\r\n }\r\n }\r\n />\r\n );\r\n};\r\n\r\nexport default PrivateRoute;\r\n","import { toast } from 'react-toastify';\r\n\r\n// * Constant variables for message types\r\nexport const ERROR_NOTIFICATION = 0\r\nexport const INFO_NOTIFICATION = 1\r\nexport const SUCCESS_NOTIFICATION = 1\r\n\r\n// * basic configuration for notification components\r\nconst defaultOptions = {\r\n position: \"top-right\",\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n autoClose: 5000\r\n}\r\n/**\r\n this class wraps the react-toastify functionality, to make it generic throughout the application.\r\n */\r\nclass ToastNotifications {\r\n notify(msg, type) {\r\n switch (type) {\r\n case ERROR_NOTIFICATION:\r\n toast.error(msg, {\r\n ...defaultOptions,\r\n autoClose: 6000\r\n })\r\n break;\r\n case INFO_NOTIFICATION:\r\n toast.info(msg, {\r\n ...defaultOptions\r\n })\r\n break;\r\n case SUCCESS_NOTIFICATION:\r\n toast.success(msg, {\r\n ...defaultOptions\r\n })\r\n break;\r\n default:\r\n toast(msg, {\r\n ...defaultOptions\r\n })\r\n break;\r\n }\r\n }\r\n}\r\n\r\nconst toastNotifications = new ToastNotifications();\r\n\r\nexport default toastNotifications;\r\n","import React, { useState, useContext, useEffect } from \"react\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport AuthContext from \"../../context/Auth/AuthContext\";\r\nimport { useTranslation } from 'react-i18next';\r\nimport { validate_login } from './login_validations.js';\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport \"./login.css\";\r\nconst Login = () => {\r\n const { t } = useTranslation('common');\r\n\r\n const { login, is_login, is_firstime } = useContext(AuthContext);\r\n\r\n const [email, setEmail] = useState('')\r\n const [password, setPassword] = useState('')\r\n\r\n const history = useHistory();\r\n\r\n\r\n useEffect(() => {\r\n if (is_login()) {\r\n if (is_firstime()) {\r\n history.push('/FirstTime');\r\n } else {\r\n history.push('/AuthInstitutions');\r\n }\r\n\r\n }\r\n }, [history, is_login, is_firstime])\r\n\r\n const signin = () => {\r\n const error = validate_login(email, password, t);\r\n if (error.length === 0) {\r\n login(email, password, () => {\r\n if (is_firstime()) {\r\n history.push('/FirstTime');\r\n } else {\r\n history.push('/AuthInstitutions');\r\n }\r\n });\r\n } else {\r\n Notifications.notify(error, ERROR_NOTIFICATION)\r\n }\r\n\r\n };\r\n\r\n return !is_login() && (\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {/*
    \r\n
    \r\n
    */}\r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { if (event.key === 'Enter') { signin() } }}\r\n onChange={(e) => { setEmail(e.target.value) }}\r\n value={email}\r\n />\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n if (event.key === 'Enter') {\r\n signin()\r\n }\r\n }}\r\n onChange={(e) => {\r\n setPassword(e.target.value)\r\n }}\r\n value={password}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n {t('login.forgotPassword')}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {t('login.changePassword')}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n )\r\n};\r\n\r\nexport default Login;\r\n","import validator from 'validator';\r\nexport const validate_login = (email, password, t) => {\r\n if (validator.isEmpty(email) || validator.isEmpty(password)) {\r\n return t('login.fields_empty');\r\n } else {\r\n if (!validator.isEmail(email)) {\r\n return t('login.email_invalid');\r\n }\r\n }\r\n return ''\r\n}\r\n","import validator from 'validator';\r\n\r\nexport const validate_fields = (email, t) => {\r\n if (validator.isEmpty(email)) {\r\n return t('forgotPassword.email_empty');\r\n } else {\r\n if (!validator.isEmail(email)) {\r\n return t('forgotPassword.email_invalid');\r\n }\r\n }\r\n return ''\r\n}\r\n\r\n","import axios from 'axios';\r\n/*\r\nHere we create an instance of axios to use in a general way throughout the application, \r\nwe can specify the baseURL to always add api/ to all the routes that we consult.\r\n*/\r\n\r\nexport const SUCCESS_RESPONSE = true;\r\nexport const ERROR_RESPONSE = false;\r\n\r\nexport const PUBLIC = axios.create();\r\n\r\nexport const AMS = axios.create({\r\n baseURL: `https://qpss.ilo.org:9083/matrix/`\r\n});\r\n\r\nexport default axios.create({\r\n baseURL: `/api`\r\n});\r\n\r\n/*\r\nUse this routes for AMS\r\nPRD: https://qpss.ilo.org:9083/matrix/\r\nQA: http://52.247.226.189:8090/matrix/\r\nDEV: http://127.0.0.1:5000/matrix/\r\n\r\n#! we use this one because we were unable to use qpss.ilo.org:9083 due to Bad Gateway reasons.\r\nPRD-workaround: http://168.62.51.191:9083/matrix/ \r\n\r\n*/","import React, { useContext, useState } from 'react'\r\nimport { Link, Redirect, useHistory } from \"react-router-dom\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { useTranslation } from 'react-i18next';\r\n/*Input fields validations*/\r\nimport { validate_fields } from './validations.js';\r\n/**Notifications */\r\nimport Notifications, { ERROR_NOTIFICATION, INFO_NOTIFICATION } from '../../helpers/notifications';\r\n//Imports the axios instance to make API calls\r\nimport API from '../../services/api';\r\n\r\nimport './forgotPassword.css';\r\n\r\nconst ForgotPassword = () => {\r\n /*Translations*/\r\n const { t } = useTranslation('common');\r\n\r\n const history = useHistory();\r\n\r\n /**Context for validations*/\r\n const { is_login } = useContext(AuthContext);\r\n\r\n /*State of the Email input*/\r\n const [email, setEmail] = useState('');\r\n\r\n /**When user clicks the Get New password button this function is triggered*/\r\n const get_new_password = async () => {\r\n /* Validates if the email typed by user is correct */\r\n const error = validate_fields(email, t);\r\n if (error.length === 0) {\r\n /**Request parameters */\r\n const params = {\r\n usr: email\r\n }\r\n setEmail('');\r\n /**Call the API to send the temporary password*/\r\n const response = await API.post(`/security/rstpw`, params);\r\n /**Response data*/\r\n const { data } = response;\r\n /**Validations according to response code */\r\n if (data.code !== 100) {\r\n /**Shows error message */\r\n Notifications.notify(`Error ${data.code}`, ERROR_NOTIFICATION)\r\n } else {\r\n /**The password was successfully sent, so, the app redirects to Login Page */\r\n Notifications.notify('Temporary password successfully sent', INFO_NOTIFICATION)\r\n history.push('/Login');\r\n }\r\n } else {\r\n /**Shows error message */\r\n Notifications.notify(error, ERROR_NOTIFICATION)\r\n }\r\n }\r\n\r\n return !is_login() ? (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n if (event.key === 'Enter') {\r\n get_new_password()\r\n }\r\n }}\r\n onChange={(e) => {\r\n setEmail(e.target.value)\r\n }}\r\n value={email}\r\n />\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n {t('forgotPassword.cancel_button')}\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n ) : (\r\n )\r\n}\r\n\r\nexport default ForgotPassword;\r\n","import validator from 'validator';\r\n\r\nimport {VALIDATE_STRONG_PASSWORD, STRONG_PASSWORD_OPTIONS} from '../../assets/config'\r\n\r\nexport const validate_changePassword = (email, password, newPassword, repeatPassword, t) => {\r\n if (validator.isEmpty(email) || validator.isEmpty(password) || validator.isEmpty(newPassword) || validator.isEmpty(repeatPassword)) {\r\n return t('changePassword.fields_empty');\r\n } else {\r\n if (!validator.isEmail(email)) {\r\n return t('changePassword.email_invalid');\r\n }\r\n if (!validator.equals(newPassword, repeatPassword)) {\r\n return t('changePassword.no_equal_password');\r\n }\r\n\r\n if (VALIDATE_STRONG_PASSWORD && !validator.isStrongPassword(newPassword, STRONG_PASSWORD_OPTIONS)){\r\n return t('changePassword.password_rules');\r\n }\r\n\r\n }\r\n return '';\r\n}\r\n","import React, { useContext, useState, useEffect } from 'react'\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { validate_changePassword } from './changePassword_validations';\r\nimport Notifications, { ERROR_NOTIFICATION, INFO_NOTIFICATION } from '../../helpers/notifications';\r\nimport API from '../../services/api';\r\n\r\nimport './changePassword.css';\r\n\r\n\r\nconst ChangePassword = (props) => {\r\n const { t } = useTranslation('common');\r\n const history = useHistory();\r\n const { is_login, user, update_first_time } = useContext(AuthContext);\r\n\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [repeatPassword, setRepeatPassword] = useState('');\r\n\r\n useEffect(() => {\r\n if (props.firstime && user) {\r\n setEmail(user.email);\r\n }\r\n }, [props.firstime, user]);\r\n\r\n if (is_login() && !props.firstime) {\r\n // * User is logged into the system and tries to go to ChangePassword\r\n history.push('/');\r\n }\r\n\r\n const save_new_password = async () => {\r\n const error = validate_changePassword(email, password, newPassword, repeatPassword, t);\r\n if (error.length === 0) {\r\n const reqData = {\r\n usr: email,\r\n cpw: password,\r\n npw: newPassword\r\n }\r\n const res = await API.post(\"/security/chngpw\", reqData);\r\n const { data } = res\r\n if (data.code !== 100) {\r\n Notifications.notify(t(`login.${data.code}`), ERROR_NOTIFICATION)\r\n } else {\r\n\r\n if (props.firstime) {\r\n update_first_time();\r\n history.push('/AuthInstitutions');\r\n } else {\r\n Notifications.notify('Password Updated', INFO_NOTIFICATION);\r\n setEmail('');\r\n setPassword('');\r\n setNewPassword('');\r\n setRepeatPassword('');\r\n }\r\n\r\n }\r\n\r\n } else {\r\n Notifications.notify(error, ERROR_NOTIFICATION)\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n { props.firstime ?\r\n
    \r\n
    \r\n
    \r\n

    {t('changePassword.legend')}

    \r\n
    \r\n
    \r\n
    \r\n :\r\n ''\r\n }\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n if (event.key === 'Enter') {\r\n save_new_password();\r\n }\r\n }}\r\n value={email}\r\n onChange={(e) => {\r\n setEmail(e.target.value)\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n if (event.key === 'Enter') {\r\n save_new_password();\r\n }\r\n }}\r\n value={password}\r\n onChange={(e) => {\r\n setPassword(e.target.value)\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n if (event.key === 'Enter') {\r\n save_new_password();\r\n }\r\n }}\r\n value={newPassword}\r\n onChange={(e) => {\r\n setNewPassword(e.target.value)\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n if (event.key === 'Enter') {\r\n save_new_password();\r\n }\r\n }}\r\n value={repeatPassword}\r\n onChange={(e) => {\r\n setRepeatPassword(e.target.value)\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n {t('changePassword.password_rules')}\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n {!props.firstime &&\r\n {t('changePassword.cancel_btn')}\r\n }\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n )\r\n}\r\n\r\nexport default ChangePassword;\r\n","import React from 'react';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst SystemLogGrid = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n return(\r\n <>\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n}\r\n\r\nexport default SystemLogGrid","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useEffect } from 'react';\r\nimport SystemLogGrid from './systemLogGrid';\r\nimport './systemLog.css';\r\n//Imports the axios instance to make API calls\r\nimport API from '../../services/api';\r\n\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications'\r\n\r\nfunction Log() {\r\n\r\n const { t } = useTranslation('common');\r\n /*Saves the input values in the state*/\r\n const [from_date, setFromDate] = useState('')\r\n const [to_date, setToDate] = useState('')\r\n /**This works for ONE category. The selected one*/\r\n const [category, setCategory] = useState('0')\r\n /**This works with the list that comes in de API*/\r\n const [categories, setCategories] = useState([]);\r\n /**This works for ONE category. The selected one*/\r\n const [event, setEvent] = useState('0')\r\n /**This works with the list that comes in de API*/\r\n const [events, setEvents] = useState([])\r\n // Used to disable the dropdowns when is loading the data\r\n const [loading, setLoading] = useState(true);\r\n // Used to save the list og logs\r\n const [logResults, setLogResults] = useState([]);\r\n\r\n /*Function called in Search button. Returns the data and populates the Grid*/\r\n const searchLog = async () => {\r\n try {\r\n\r\n if (to_date === '' || from_date === '') {\r\n Notifications.notify(t('log.dates_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n setLogResults([]);\r\n\r\n const url = `/SysLog?initialDate=${from_date ? from_date : 0}&finalDate=${to_date ? to_date : 0}&categoryName=${category}&eventTypeName=${event}`;\r\n const response = await API.get(url);\r\n\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.code, ERROR_NOTIFICATION)\r\n return;\r\n }\r\n if (response.data.data) {\r\n setLogResults(response.data.data);\r\n }\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n };\r\n\r\n /** We use useEffect to connect with de API and map the data into the SELECT (dropdown) elements*/\r\n useEffect(() => {\r\n async function getDropdownsData() {\r\n /**Call to API to get the categories list */\r\n const catList = await API.get(`/SysLog/syslogCategories`);\r\n /**Call to API to get the events list */\r\n const evtList = await API.get(`/SysLog/syslogEventTypes`);\r\n /*Map the categories to get each categorie. This allows us to use categories in the select elements*/\r\n setCategories(catList.data.data);\r\n setCategory(catList.data.data[0].value);\r\n /*Map the events to get each categorie. This allows us to use categories in the select elements*/\r\n setEvents(evtList.data.data);\r\n setEvent(evtList.data.data[0].value);\r\n /**Disables the dropdowns when the data is loading*/\r\n setLoading(false);\r\n }\r\n getDropdownsData();\r\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {/*Form*/}\r\n
    \r\n \r\n { setFromDate(e.target.value) }} value={from_date} className=\"form-control log_inputs\" id=\"log_date_from\" />\r\n
    \r\n
    \r\n \r\n { setToDate(e.target.value) }} value={to_date} className=\"form-control log_inputs\" id=\"log_date_to\" />\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Log","export default __webpack_public_path__ + \"static/media/EN_ILO_Organization_Horizontal_RGB_Blue.58443ef1.png\";","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useContext, useEffect } from 'react';\r\nimport { useHistory } from 'react-router';\r\nimport './authInstitutions.css';\r\nimport img from '../../assets/img/EN_ILO_Organization_Horizontal_RGB_Blue.png'\r\nimport AuthContext from '../../context/Auth/AuthContext'\r\n\r\nfunction AuthInstitutions() {\r\n\r\n const { t } = useTranslation('common');\r\n const { authorizedInstitutions, select_institution, baseUrlLogoInstitutions } = useContext(AuthContext);\r\n const history = useHistory();\r\n const [arr, setArr] = useState([])\r\n\r\n /**\r\n * This function is triggered when an user clicks a table´s row. \r\n * Redirects with the selected institution information\r\n * */\r\n const selectedInstitution = (index) => {\r\n /**Selected institution id*/\r\n let selectedInsId = index;\r\n select_institution(selectedInsId);\r\n history.push('/');\r\n }\r\n\r\n useEffect(() => {\r\n if (authorizedInstitutions && authorizedInstitutions.length === 1) {\r\n select_institution(0);\r\n history.push('/');\r\n } else {\r\n setArr(authorizedInstitutions ? authorizedInstitutions : []);\r\n }\r\n }, [authorizedInstitutions, select_institution, history])\r\n\r\n\r\n\r\n const institutions = arr.map((item, i) => {\r\n return (\r\n { selectedInstitution(i) }}>\r\n \r\n {item.catInstitutionCountryName}\r\n \r\n {item.catInstitutionName}\r\n {item.catInstitutionCountryName}\r\n {t(`authInstitutions.${item.catRoleCode}`)}\r\n \r\n );\r\n });\r\n\r\n return arr.length > 0 && (\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {/* \r\n \r\n \r\n \r\n \r\n \r\n \r\n */}\r\n \r\n {/**Rows render: see institutions variable*/}\r\n {institutions}\r\n \r\n
    {t('authInstitutions.tableHeader')}CountryRole
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n\r\n}\r\n\r\nexport default AuthInstitutions","import React, { useContext, useEffect } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { useHistory } from 'react-router-dom';\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nfunction ExternalAuth() {\r\n const { is_login, extAuth } = useContext(AuthContext);\r\n const history = useHistory();\r\n const queryString = new URLSearchParams(useLocation().search);\r\n const urlParams64 = useLocation().search\r\n\r\n useEffect(() => {\r\n if (is_login()) {\r\n history.push('/');\r\n return null;\r\n }\r\n\r\n const ciid = queryString.get('ciid')\r\n const cuid = queryString.get('cuid')\r\n const ts = queryString.get('ts')\r\n const sk = queryString.get('sk')\r\n\r\n if (!ciid || !cuid || !ts || !sk) {\r\n Notifications.notify('External Auth parameters missing.', ERROR_NOTIFICATION);\r\n history.push('/Login');\r\n return null;\r\n }\r\n\r\n extAuth(urlParams64, (path) => {\r\n history.push(path);\r\n return null;\r\n })\r\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return <>;\r\n\r\n}\r\n\r\nexport default ExternalAuth;\r\n","export const NEW = 'NEW';\r\nexport const VIEW = 'VIEW';\r\nexport const UPDATE = 'UPDATE';\r\nexport const DELETE = 'DELETE';\r\nexport const COPY = 'COPY';\r\nexport const READY = 'READY';\r\nexport const EDIT = 'EDIT';\r\nexport const UNLOCK = 'UNLOCK';\r\nexport const ADD_BENEFIT = 'Add benefit';\r\nexport const OPEN = 'Open';\r\nexport const REPORTS = 'Reports';","import React, { useContext } from 'react';\r\nimport { VIEW, EDIT, COPY, DELETE, UNLOCK, REPORTS } from '../../assets/Constants/actionsTypes';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { DropDownButton, DropDownButtonItem } from '@progress/kendo-react-buttons';\r\nimport { useTranslation } from 'react-i18next';\r\nimport './model.css'\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\n//* Icons\r\nimport { TiMediaStopOutline, TiInputChecked } from \"react-icons/ti\";\r\n\r\nconst ModelGrid = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext);\r\n\r\n // Used to show the icon inside the grid\r\n const showCheckIcon = (props) => {\r\n return (\r\n \r\n {\r\n props.dataItem.isReadyForAssessment ? : \r\n }\r\n \r\n );\r\n }\r\n\r\n // * If the model is being edited by the logged in user, an action called UNLOCK will appear. \r\n // * This action releases the model so that another user can edit it. \r\n const showUnlockAction = (props) => {\r\n if (props.dataItem.editLockUserCode !== null && props.dataItem.editLockUserCode === user.email) {\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n \r\n {/* action column */}\r\n (\r\n \r\n { props.onActionClick(e.item, gridProps.dataItem); }}>\r\n \r\n \r\n {showUnlockAction(gridProps)}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default ModelGrid","import React, { useEffect, createRef, useState } from 'react'\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { NEW, VIEW, UPDATE } from '../../assets/Constants/actionsTypes'\r\nimport { useTranslation } from 'react-i18next';\r\nimport './model.css';\r\n\r\nconst ModelModal = (props) => {\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n // we create a reference for the modal\r\n const window = createRef();\r\n // this variable allow us know if the save button will be shown or not\r\n const [showSave, setShowSave] = useState(false);\r\n // if is in UPDATE mode\r\n const [isUpdate, setIsUpdate] = useState(false);\r\n // inputs in the modal and its state\r\n const [code, setCode] = useState('');\r\n const [name, setName] = useState('');\r\n\r\n // here you define the configuration that the modal will have. this depends on the type with which it was opened.\r\n useEffect(() => {\r\n if (props.type === NEW) {\r\n setShowSave(true);\r\n // Clean and refresh the state of inputs\r\n setName('');\r\n setCode('');\r\n } else {\r\n if (props.data) {\r\n //* Setting data\r\n setName(props.data.name);\r\n\r\n setCode(props.data.code);\r\n\r\n if (props.type === VIEW) {\r\n setShowSave(false)\r\n } else {\r\n if (props.type === UPDATE) {\r\n setShowSave(true);\r\n setIsUpdate(true);\r\n }\r\n }\r\n } else {\r\n props.toggleWindow();\r\n }\r\n }\r\n\r\n }, [props])\r\n\r\n // with this we make sure to always hide the maximize and minimize buttons.\r\n useEffect(() => {\r\n if (window) {\r\n hideButtons();\r\n }\r\n })\r\n\r\n // with this we hide the maximize and minimize buttons.\r\n const hideButtons = () => {\r\n let maximizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-maximize\"\r\n ).parentElement;\r\n maximizeButton.style.visibility = \"hidden\";\r\n\r\n let minimizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-minimize\"\r\n ).parentElement;\r\n minimizeButton.style.visibility = \"hidden\";\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n props.toggleWindow();\r\n }}\r\n ref={window}\r\n >\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n setCode(e.target.value)}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n setName(e.target.value)}\r\n />\r\n
    \r\n
    \r\n \r\n {showSave &&\r\n {\r\n const data = {\r\n modelid: isUpdate ? props.data.modelid : 0,\r\n code,\r\n name\r\n }\r\n props.onSave(data)\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('modals.save_btn')}\r\n }\r\n\r\n \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n );\r\n}\r\n\r\nexport default ModelModal","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useContext, useEffect } from 'react';\r\nimport { VIEW, EDIT, COPY, DELETE, UPDATE, NEW, UNLOCK, REPORTS } from '../../assets/Constants/actionsTypes';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport './model.css';\r\n// * Model grid component\r\nimport ModelGrid from './modelGrid'\r\n// * Model modal\r\nimport ModelModal from './modelModal'\r\n// * Helpers\r\nimport validator from 'validator';\r\nimport API from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\nfunction Model() {\r\n\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n /**The useHistory hook allow us to redirect to another route */\r\n const history = useHistory();\r\n // Modal Window type\r\n const [viewType, setViewType] = useState('');\r\n // Single component\r\n const [modelData, setModelData] = useState({});\r\n // List of models. See useEffect\r\n const [modelsList, setModelsList] = useState([]);\r\n /**State of the modal window. True = showing ... False = hidden */\r\n const [showModal, setShowModal] = useState(false);\r\n /** State of the dialog. True = showing ... False = hidden */\r\n const [showAlert, setShowAlert] = useState(false);\r\n // Session context to get the current institution data\r\n const { get_currentInstitution, user } = useContext(AuthContext);\r\n\r\n // we use useEffect to call the function that fills the grid\r\n useEffect(() => {\r\n getModelsList();\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Triggered when the user clicks an action in the grid. Opens the modal window according to the selection\r\n const onActionClick = (actionItem, dataItme) => {\r\n const action = actionItem.value;\r\n setViewType(action);\r\n setModelData(dataItme);\r\n\r\n switch (action) {\r\n case NEW:\r\n toggleWindow();\r\n break;\r\n case VIEW:\r\n history.push({\r\n pathname: '/Wizard',\r\n state: {\r\n detail: dataItme,\r\n action: VIEW\r\n }\r\n });\r\n break;\r\n case UPDATE:\r\n toggleWindow();\r\n break;\r\n case EDIT:\r\n onEdit(dataItme);\r\n break;\r\n case COPY:\r\n toggleAlert();\r\n break\r\n case DELETE:\r\n toggleAlert();\r\n break;\r\n case UNLOCK:\r\n onUnlock(dataItme);\r\n break;\r\n case REPORTS:\r\n history.push({\r\n pathname: '/ModelReports',\r\n state: {\r\n detail: dataItme\r\n }\r\n });\r\n break\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const getModelsList = async () => {\r\n setModelsList([]);\r\n try {\r\n // data from API\r\n const response = await API.get(`/model/getAll?institutionId=${get_currentInstitution().catInstitutionId}`);\r\n setModelsList(response.data.data === null ? [] : response.data.data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // Save button\r\n const onSave = async (data) => {\r\n try {\r\n // Vaidations\r\n if (validator.isEmpty(data.name) || validator.isEmpty(data.code)) {\r\n Notifications.notify(t('model.name_code_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n data = {\r\n modelid: data.modelid,\r\n institutionId: get_currentInstitution().catInstitutionId,\r\n name: data.name,\r\n code: data.code\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/model/upsert', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`model.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we decide what kind of message of success we should give\r\n const msg = data.modelid === 0 ? t('model.new_message') : t('model.update_message');\r\n\r\n // * hide the modal, shows success message and refresh the grid\r\n toggleWindow();\r\n Notifications.notify(msg, SUCCESS_NOTIFICATION);\r\n getModelsList();\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n //* When user clicks ok in delete modal\r\n const onDelete = async () => {\r\n try {\r\n const haveScenarios = await API.get(`/model/haveScenarios?modelid=${modelData.modelid}`);\r\n // * if errors exist, it is displayed as a notification\r\n if (haveScenarios.data.code !== 100) {\r\n Notifications.notify(t(`model.${haveScenarios.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n if (!haveScenarios.data.data) {\r\n // * call the api to do the delete\r\n const res = await API.delete(`/model?modelid=${modelData.modelid}&usercode=${user.email}`);\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`model.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('model.delete_message'), SUCCESS_NOTIFICATION);\r\n getModelsList();\r\n } else {\r\n Notifications.notify(t(`model.500003`), ERROR_NOTIFICATION);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * When user clicks Edit in one model\r\n const onEdit = async (modelData) => {\r\n // **** If editLockUserCode is null then the model can be edited by the user.\r\n if (modelData.editLockUserCode === null) {\r\n\r\n // * call the api to lock the model\r\n const res = await API.post(`/model/lockModel?modelId=${modelData.modelid}&userCode=${user.email}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t('model.lockModelError'), ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n // * If all ok, the system shows the wizard\r\n history.push({\r\n pathname: '/Wizard',\r\n state: {\r\n detail: modelData,\r\n action: EDIT\r\n }\r\n });\r\n }\r\n } else if (modelData.editLockUserCode === user.email) {\r\n // **** If the model is already locked by the user, the user only enters without updating the DB.\r\n history.push({\r\n pathname: '/Wizard',\r\n state: {\r\n detail: modelData,\r\n action: EDIT\r\n }\r\n });\r\n } else {\r\n // **** If not, error is displayed\r\n Notifications.notify(t('model.inEditMode', { user: modelData.editLockUserCode }), ERROR_NOTIFICATION);\r\n }\r\n }\r\n\r\n // * When user clicks UNLOCK in one model\r\n const onUnlock = async (modelData) => {\r\n try {\r\n // * call the api to unlock the model\r\n const res = await API.post(`/model/unlockModel?modelId=${modelData.modelid}&userCode=${user.email}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t('model.unlockModelError'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n Notifications.notify(t('model.unlock_message'), SUCCESS_NOTIFICATION);\r\n getModelsList();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n //* When user clicks ok in copy modal\r\n const onCopy = async () => {\r\n try {\r\n // * call the api to unlock the model\r\n const res = await API.post(`/model/modelCopy?modelId=${modelData.modelid}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t('model.copyError'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('model.copySuccess'), SUCCESS_NOTIFICATION);\r\n getModelsList();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // Show or hide the modal window. See state variable\r\n const toggleWindow = () => {\r\n setShowModal(!showModal);\r\n }\r\n\r\n // Show or hide the alert dialog. See state variable\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n // Shows the Alert body according to the selected action \r\n const showAlertBody = () => {\r\n if (viewType === DELETE)\r\n return t('model.delete_body')\r\n else if (viewType === COPY)\r\n return t('model.copy_body')\r\n }\r\n\r\n // Shows the Alert title according to the selected action \r\n const showAlertTitle = () => {\r\n if (viewType === DELETE)\r\n return t('model.delete_title')\r\n else if (viewType === COPY)\r\n return t('model.copy_title')\r\n }\r\n\r\n // Decides which function to call according to the selected action\r\n const actionOrchestrator = () => {\r\n if (viewType === DELETE)\r\n onDelete()\r\n else if (viewType === COPY)\r\n onCopy()\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n | {t('model.modalTitle')}\r\n
    \r\n
    \r\n
    \r\n {/* modal window */}\r\n {showModal && }\r\n\r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {showAlertBody()}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n {/* grid */}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n\r\n );\r\n}\r\n\r\nexport default Model","import React, { useContext } from 'react';\r\nimport { VIEW, ADD_BENEFIT, OPEN, COPY, DELETE, UNLOCK } from '../../assets/Constants/actionsTypes';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { DropDownButton, DropDownButtonItem } from '@progress/kendo-react-buttons';\r\nimport { useTranslation } from 'react-i18next';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport './scenario.css';\r\n//* Icons\r\nimport { TiMediaStopOutline, TiInputChecked } from \"react-icons/ti\";\r\n\r\nconst ScenarioGrid = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext)\r\n // Used to show the icon inside the grid\r\n const showCheckIcon = (props) => {\r\n return (\r\n \r\n {\r\n props.dataItem.isCalculated ? : \r\n }\r\n \r\n );\r\n }\r\n\r\n // * If the model is being edited by the logged in user, an action called UNLOCK will appear. \r\n // * This action releases the model so that another user can edit it. \r\n const showUnlockAction = (gridProps) => {\r\n if (gridProps.dataItem.editLockUserCode !== null && gridProps.dataItem.editLockUserCode === user.email) {\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n //data={[...props.data]}>\r\n return (\r\n <>\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n \r\n {/* action column */}\r\n (\r\n \r\n { props.onActionClick(e.item, gridProps.dataItem); }}>\r\n \r\n \r\n {showUnlockAction(gridProps)}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default ScenarioGrid","import React, { useState, useContext, useEffect, createRef } from 'react';\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { NEW, VIEW, UPDATE } from '../../assets/Constants/actionsTypes'\r\nimport { useTranslation } from 'react-i18next';\r\n// * Helpers\r\nimport API from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nconst ScenarioModal = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // we create a reference for the modal\r\n const window = createRef();\r\n // this variable allow us know if the save button will be shown or not\r\n const [showSave, setShowSave] = useState(false);\r\n // if is in UPDATE mode\r\n const [isUpdate, setIsUpdate] = useState(false);\r\n // Inputs state\r\n const [code, setCode] = useState('');\r\n const [name, setName] = useState('');\r\n const [finalYear, setFinalYear] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [modelsList, setModelsList] = useState([]);\r\n const [selectedModel, setSelectedModel] = useState(0);\r\n // Session context to get the current institution data\r\n const { get_currentInstitution } = useContext(AuthContext);\r\n\r\n /**\r\n * here you define the configuration that the modal will have. this depends on the type with which it was opened.\r\n */\r\n useEffect(() => {\r\n getModelsList();\r\n if (props.type === NEW) {\r\n setShowSave(true);\r\n setCode('');\r\n setName('');\r\n setDescription('');\r\n setFinalYear('');\r\n } else {\r\n if (props.data) {\r\n setCode(props.data.code);\r\n setName(props.data.name);\r\n setDescription(props.data.description);\r\n setSelectedModel(props.data.modelId);\r\n setFinalYear(props.data.finalYear);\r\n if (props.type === VIEW) {\r\n setShowSave(false)\r\n } else {\r\n if (props.type === UPDATE) {\r\n setShowSave(true);\r\n setIsUpdate(true);\r\n }\r\n }\r\n } else {\r\n props.toggleWindow();\r\n }\r\n }\r\n\r\n }, [props]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // with this we make sure to always hide the maximize and minimize buttons.\r\n // Also, with this useEffect we get the list of models to show in the select option\r\n useEffect(() => {\r\n if (window) {\r\n hideButtons();\r\n }\r\n })\r\n\r\n // Returns the list of models to be displayed in the select option\r\n const getModelsList = async () => {\r\n setModelsList([]);\r\n try {\r\n // data from API\r\n const response = await API.get(`/model/getAllCompleted?institutionId=${get_currentInstitution().catInstitutionId}`);\r\n setModelsList(response.data.data === null ? [] : response.data.data);\r\n // The state of the selected model changes with the OnChange. \r\n // So if the user does not change and leaves the first element, the modelId will be 0. \r\n // So it must be set manually to avoid this error\r\n if(props.type === NEW) {\r\n if(response.data.data === null || response.data.data === []) {\r\n // Sets the state in 0 to show a error message\r\n setSelectedModel(0);\r\n } else {\r\n response.data.data.forEach((value, index) => {\r\n // first element modelId to set the state\r\n if(index === 0){\r\n setSelectedModel(value.modelid);\r\n }\r\n }); \r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // with this we hide the maximize and minimize buttons.\r\n const hideButtons = () => {\r\n let maximizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-maximize\"\r\n ).parentElement;\r\n maximizeButton.style.visibility = \"hidden\";\r\n\r\n let minimizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-minimize\"\r\n ).parentElement;\r\n minimizeButton.style.visibility = \"hidden\";\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n props.toggleWindow();\r\n }}\r\n ref={window}\r\n >\r\n
    \r\n
    \r\n {/*Code row*/}\r\n
    \r\n \r\n setCode(e.target.value)}\r\n />\r\n
    \r\n
    \r\n \r\n setName(e.target.value)}\r\n />\r\n
    \r\n
    \r\n
    \r\n {/*Name row*/}\r\n
    \r\n \r\n setFinalYear(e.target.value)}\r\n />\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n {/*Description row*/}\r\n
    \r\n \r\n setDescription(e.target.value)}\r\n >\r\n
    \r\n
    \r\n \r\n {showSave &&\r\n {\r\n const modelData = modelsList.find((item)=>{\r\n return item.modelid === parseInt(selectedModel, 10)\r\n });\r\n \r\n const data = {\r\n scenarioId: isUpdate ? parseInt(props.data.scenarioId, 10) : 0,\r\n code,\r\n modelId: modelData? modelData.modelid : 0,\r\n name,\r\n description: description === '' ? null : description,\r\n finalYear: parseInt(finalYear, 10),\r\n baseYear: modelData? modelData.baseYear : 0\r\n }\r\n \r\n props.onSave(data)\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('modals.save_btn')}\r\n }\r\n\r\n \r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default ScenarioModal","\r\nconst MatrixContext = {\r\n MODEL: 'MODEL',\r\n SCENARIO: 'SCENARIO'\r\n}\r\n\r\nexport default MatrixContext;","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useContext, useEffect } from 'react';\r\nimport { VIEW, ADD_BENEFIT, OPEN, COPY, DELETE, NEW, UNLOCK } from '../../assets/Constants/actionsTypes';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport './scenario.css';\r\n// * Scenarios grid component\r\nimport ScenarioGrid from './scenarioGrid'\r\n// * Scenarios modal\r\nimport ScenarioModal from './scenarioModal'\r\n// * Helpers\r\nimport validator from 'validator';\r\nimport API from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport MatrixContext from '../../assets/Constants/matrixContext';\r\n\r\nfunction Scenario() {\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n // Modal Window type = DELETE, NEW, VIEW or UPDATE\r\n const [viewType, setViewType] = useState('');\r\n // Single component\r\n const [scenariosData, setScenariosData] = useState({});\r\n /**State of the modal window. True = showing ... False = hidden */\r\n const [showModal, setShowModal] = useState(false);\r\n /** State of the dialog. True = showing ... False = hidden */\r\n const [showAlert, setShowAlert] = useState(false);\r\n // List of scenarios. See useEffect\r\n const [scenariosList, setScenariosList] = useState([]);\r\n // Session context to get the current institution data\r\n const { get_currentInstitution, user } = useContext(AuthContext);\r\n /**The useHistory hook allow us to redirect to another route */\r\n const history = useHistory();\r\n\r\n // we use useEffect to call the function that fills the grid\r\n useEffect(() => {\r\n //console.log(\"Hola\");\r\n getScenariosList();\r\n }, []);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getScenariosList = async () => {\r\n setScenariosList([]);\r\n try {\r\n // data from API\r\n const response = await API.get(`/scenario/getAll?institutionId=${get_currentInstitution().catInstitutionId}`);\r\n setScenariosList(response.data.data === null ? [] : response.data.data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // Triggered when the user clicks an action in the grid. Opens the modal window according to the selection\r\n const onActionClick = (actionItem, dataItem) => {\r\n const action = actionItem.value;\r\n setViewType(action);\r\n setScenariosData(dataItem);\r\n\r\n switch (action) {\r\n case NEW:\r\n toggleWindow();\r\n break;\r\n case VIEW:\r\n toggleWindow();\r\n break;\r\n case DELETE:\r\n toggleAlert();\r\n break;\r\n case COPY:\r\n toggleAlert();\r\n break;\r\n case ADD_BENEFIT:\r\n onAddBenefit(dataItem);\r\n break;\r\n case UNLOCK:\r\n onUnlock(dataItem);\r\n break;\r\n case OPEN:\r\n onOpenScenario(dataItem)\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n // * When user clicks UNLOCK in one model\r\n const onUnlock = async (scenarioData) => {\r\n try {\r\n const response = await API.get(`/Scenario/UnlockScenario?scenarioId=${scenarioData.scenarioId}`);\r\n\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n Notifications.notify(t('scenarios.unlocked_scenario'), SUCCESS_NOTIFICATION);\r\n\r\n getScenariosList();\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n const onOpenScenario = async (scenarioData) => {\r\n try {\r\n const isLockRes = await API.get(`/Scenario/IsLock?scenarioId=${scenarioData.scenarioId}&userCode=${user.email}`);\r\n\r\n\r\n if (isLockRes.data.code !== 100) {\r\n Notifications.notify(isLockRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n\r\n const isLockData = isLockRes.data.data;\r\n\r\n\r\n // * If model is not lock by other user\r\n if (!isLockData.isLock) {\r\n history.push({\r\n pathname: '/Dashboard',\r\n state: {\r\n detail: scenarioData\r\n }\r\n });\r\n\r\n\r\n } else {\r\n // **** If not, error is displayed\r\n if (isLockData.isLock) {\r\n Notifications.notify(t('scenarios.add_benefit.edit_by', { user: isLockData.editLockUserCode }), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n }\r\n }\r\n\r\n // * When user clicks Add Benefit in one scenario\r\n const onAddBenefit = async (scenarioData) => {\r\n\r\n try {\r\n const isLockRes = await API.get(`/Scenario/IsLock?scenarioId=${scenarioData.scenarioId}&userCode=${user.email}`);\r\n const isCehckoutRes = await API.get(`/Scenario/IsCheckout?scenarioId=${scenarioData.scenarioId}&userCode=${user.email}`);\r\n\r\n if (isLockRes.data.code !== 100) {\r\n Notifications.notify(isLockRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n if (isCehckoutRes.data.code !== 100) {\r\n Notifications.notify(isCehckoutRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n const isLockData = isLockRes.data.data;\r\n const isCheckoutData = isCehckoutRes.data.data;\r\n\r\n\r\n // * If model is not lock by other user\r\n if (!isLockData.isLock && !isCheckoutData) {\r\n // * call the api to lock the model\r\n const res = await API.get(`/Scenario/LockScenario?scenarioId=${scenarioData.scenarioId}&userCode=${user.email}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n // * If all ok, the system shows the add benefit\r\n history.push({\r\n pathname: '/AddScenarioBenefit',\r\n state: {\r\n detail: scenarioData\r\n }\r\n });\r\n return;\r\n }\r\n } if (isLockData.editLockUserCode === user.email && !isCheckoutData) {\r\n // * If all ok, the system shows the add benefit\r\n history.push({\r\n pathname: '/AddScenarioBenefit',\r\n state: {\r\n detail: scenarioData\r\n }\r\n });\r\n return;\r\n } else {\r\n // **** If not, error is displayed\r\n if (isLockData.isLock) {\r\n Notifications.notify(t('scenarios.add_benefit.edit_by', { user: isLockData.editLockUserCode }), ERROR_NOTIFICATION);\r\n return;\r\n } else if (isCheckoutData) {\r\n Notifications.notify(t('scenarios.add_benefit.ischeckout'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n }\r\n }\r\n\r\n // Show or hide the modal window. See state variable\r\n const toggleWindow = () => {\r\n setShowModal(!showModal);\r\n }\r\n\r\n // Show or hide the alert dialog. See state variable\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n // Shows the Alert title according to the selected action \r\n const showAlertTitle = () => {\r\n if (viewType === DELETE)\r\n return t('scenarios.delete_title')\r\n else if (viewType === COPY)\r\n return t('scenarios.copy_title')\r\n }\r\n\r\n // Shows the Alert body according to the selected action \r\n const showAlertBody = () => {\r\n if (viewType === DELETE)\r\n return t('scenarios.delete_body')\r\n else if (viewType === COPY)\r\n return t('scenarios.copy_body')\r\n }\r\n\r\n // Decides which function to call according to the selected action\r\n const actionOrchestrator = () => {\r\n if (viewType === DELETE)\r\n onDelete()\r\n else if (viewType === COPY)\r\n onCopy()\r\n }\r\n\r\n // Copy action\r\n const onCopy = async () => {\r\n try {\r\n const isLockRes = await API.get(`/Scenario/IsLock?scenarioId=${scenariosData.scenarioId}&userCode=${user.email}`);\r\n if (isLockRes.data.code !== 100) {\r\n Notifications.notify(isLockRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n const isLockData = isLockRes.data.data;\r\n\r\n // * If model is not lock by other user\r\n if (!isLockData.isLock) {\r\n // * call the api to do copy\r\n const res = await API.get(`/scenario/CopyScenario?scenarioId=${scenariosData.scenarioId}&usercode=${user.email}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('scenarios.copy_message'), SUCCESS_NOTIFICATION);\r\n getScenariosList();\r\n } else {\r\n toggleAlert();\r\n Notifications.notify(t('scenarios.add_benefit.edit_by', { user: isLockData.editLockUserCode }), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // Delete action\r\n const onDelete = async () => {\r\n try {\r\n const isLockRes = await API.get(`/Scenario/IsLock?scenarioId=${scenariosData.scenarioId}&userCode=${user.email}`);\r\n if (isLockRes.data.code !== 100) {\r\n Notifications.notify(isLockRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n const isLockData = isLockRes.data.data;\r\n\r\n // * If model is not lock by other user\r\n if (!isLockData.isLock) {\r\n // * call the api to do the delete\r\n const res = await API.delete(`/scenario?scenarioId=${scenariosData.scenarioId}&usercode=${user.email}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('scenarios.delete_message'), SUCCESS_NOTIFICATION);\r\n getScenariosList();\r\n } else {\r\n toggleAlert();\r\n Notifications.notify(t('scenarios.add_benefit.edit_by', { user: isLockData.editLockUserCode }), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // Save action\r\n const onSave = async (data) => {\r\n try {\r\n // * Validations\r\n if (validator.isEmpty(data.code.toString()) || validator.isEmpty(data.name.toString()) || data.modelId === 0 || validator.isEmpty(data.finalYear.toString())) {\r\n Notifications.notify(t('scenarios.name_code_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n if (!validator.isFloat(data.finalYear.toString())) {\r\n Notifications.notify(t('scenarios.finalYear_number'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n if (data.finalYear <= 0) {\r\n Notifications.notify(t('scenarios.finalYear_real'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n if (data.finalYear < data.baseYear) {\r\n Notifications.notify(t('scenarios.final_less_base'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n //!We assume a maximum of 50 years to be projected.\r\n if (data.finalYear - data.baseYear > 50) {\r\n Notifications.notify(t('scenarios.max_projection'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * Data to be sent\r\n // * we apply the trim to the fields\r\n const dataScenarioData = {\r\n scenarioId: data.scenarioId,\r\n institutionId: get_currentInstitution().catInstitutionId,\r\n code: validator.trim(data.code),\r\n name: validator.trim(data.name),\r\n modelId: data.modelId,\r\n description: data.description,\r\n finalYear: parseInt(data.finalYear, 10)\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/scenario/upsert', dataScenarioData);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n\r\n if (data.scenarioId === 0) {\r\n await API.get(`/Scenario/LockScenario?scenarioId=${res.data.data}&userCode=system`);\r\n // * add scenario generate task\r\n const response = await API.post(`Scheduler/addTask`, null, {\r\n params: {\r\n ctxtcode: MatrixContext.SCENARIO,\r\n scenarioid: res.data.data,\r\n opcode: 'CRE',\r\n usrcode: user ? user.email : 'get_user_error',\r\n customparams: JSON.stringify({ runblocks: ['load_data', 'gaps', 'init_elc', 'init_mtx'] })\r\n }\r\n });\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n }\r\n }\r\n\r\n // * we decide what kind of message of success we should give\r\n const msg = data.scenarioId === 0 ? t('scenarios.new_message') : t('scenarios.update_message');\r\n\r\n // * hide the modal and refresh the grid\r\n toggleWindow();\r\n Notifications.notify(msg, SUCCESS_NOTIFICATION);\r\n getScenariosList();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n | {t('scenarios.modalTitle')}\r\n
    \r\n
    \r\n
    \r\n {/* modal window */}\r\n {showModal && }\r\n\r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {showAlertBody()}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n {/* grid */}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default Scenario","import React from 'react';\r\nimport './wizardInfo.css';\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n// * Icons\r\nimport { GiCheckMark } from \"react-icons/gi\";\r\n\r\n/* This component represents the wizard (steps) information. Render at the left of the screen*/\r\nfunction WizardInfo(props) {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n return (\r\n
    \r\n {/*Here just the column, without the container. That's because the container is in the Wizard component*/}\r\n
      \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step1_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step2_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step3_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step4_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step5_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step6_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step7_wInfo_title')}
      • \r\n
      \r\n
    • \r\n
    • \r\n \r\n
        \r\n
      • {t('model.step8_wInfo_title')}
      • \r\n
      \r\n
    • \r\n\r\n
    • \r\n \r\n
        \r\n
      • {t('model.step9_wInfo_title')}
      • \r\n
      \r\n
    • \r\n {props.isActionView === VIEW ? null : !props.isModelCompleted ?
    • \r\n \r\n
        \r\n
      • {t('model.step10_wInfo_title')}
      • \r\n
      \r\n
    • : null}\r\n\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default WizardInfo","import React, { useEffect, useState } from 'react'\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n// Reac number format\r\nimport NumberFormat from 'react-number-format';\r\n\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight } from 'react-icons/im'\r\nimport validator from 'validator';\r\n\r\nconst Step1 = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // Input values state\r\n const [code, setCode] = useState('');\r\n const [igdp, setIGDP] = useState('');\r\n const [name, setName] = useState('');\r\n const [igex, setIGEX] = useState('');\r\n const [baseYear, setBaseYear] = useState('');\r\n const [selectedNominal, setSelectedNominal] = useState('n');\r\n const [historicalYear, setHistoricalYear] = useState('')\r\n const [description, setDescription] = useState('')\r\n\r\n // we use useEffect to call the function that returns the step1 data\r\n useEffect(() => {\r\n if (props.activeStep === 1) {\r\n getStep1Data();\r\n }\r\n }, [props.activeStep]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getStep1Data = async () => {\r\n try {\r\n // gets data from API\r\n const response = await API.get(`/model/step1GetData?modelId=${props.modelData.modelid}`);\r\n // if error in request\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n // settings up the state of each input\r\n setCode(response.data.data.code);\r\n setIGDP(response.data.data.igdp);\r\n setName(response.data.data.name);\r\n setIGEX(response.data.data.igex);\r\n setBaseYear(response.data.data.baseYear);\r\n setHistoricalYear(response.data.data.historicalYears);\r\n setSelectedNominal(response.data.data.nominal);\r\n setDescription(response.data.data.description === null ? '' : response.data.data.description);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * Saves the data of the step 1\r\n // * If the saves was ok, the step 2 is called\r\n const onNextClick = async () => {\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // * When calling an async/await function that returns a boolean, you must wait for its response, \r\n // * since it is a promise and will NOT return the desired bool.\r\n const returnValue = await saveStep1Data();\r\n if (returnValue) {\r\n props.changeStep(2);\r\n }\r\n } else {\r\n // Pass to step 2 without save\r\n props.changeStep(2);\r\n }\r\n }\r\n\r\n // Calls the API to save the data\r\n const saveStep1Data = async () => {\r\n // empty validations\r\n if (validator.isEmpty(igdp.toString()) || validator.isEmpty(igex.toString()) ||\r\n validator.isEmpty(baseYear.toString()) || validator.isEmpty(historicalYear.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n // number validations\r\n if (!validator.isFloat(igdp)) {\r\n Notifications.notify(t('model.igdp_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(igex)) {\r\n Notifications.notify(t('model.igex_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(baseYear.toString())) {\r\n Notifications.notify(t('model.baseYear_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(historicalYear.toString())) {\r\n Notifications.notify(t('model.historicalYear_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if(parseFloat(historicalYear.toString()) < 1){\r\n Notifications.notify(t('model.historicalYear_min'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n // data to be sent\r\n let data = {\r\n modelid: props.modelData.modelid,\r\n description: description === '' ? null : description,\r\n nominal: selectedNominal,\r\n baseYear: baseYear,\r\n historicalYears: historicalYear,\r\n igdp: igdp,\r\n igex: igex\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/model/step1InsertData', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`model.${res.data.code}`), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step1_desc')}
    \r\n
    \r\n
    \r\n
    \r\n {/**Form step1*/}\r\n
    \r\n
    \r\n \r\n setCode(e.target.value)}\r\n />\r\n
    \r\n
    \r\n \r\n setName(e.target.value)}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n setIGDP(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n {\r\n setIGEX(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n setBaseYear(e.target.value)}\r\n />\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n setHistoricalYear(e.target.value)}\r\n disabled={!props.isEditMode}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n setDescription(e.target.value)}\r\n disabled={!props.isEditMode}\r\n >\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {props.isActionView === VIEW ? null : !props.isEditMode ? (\r\n { props.editSteps(); }}\r\n className=\"btn btn-primary ilo-btn\"\r\n style={{ marginBottom: \"10px\", marginRight: \"3px\" }}\r\n >\r\n {t('model.step7_edit_btn')}\r\n \r\n ) : null\r\n }\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step1","export const TRANSFER_TO = 'transferTo';\r\nexport const TRANSFER_FROM = 'transferFrom';\r\n","import React, { useState, useEffect, useContext } from 'react'\r\nimport {\r\n ListBox,\r\n ListBoxToolbar,\r\n processListBoxData\r\n} from '@progress/kendo-react-listbox';\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\n// Constants\r\nimport { TRANSFER_TO, TRANSFER_FROM } from './constants'\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\n\r\nconst SELECTED_FIELD = \"selected\";\r\n\r\nconst Step2 = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // ListBox components state\r\n const [state, setState] = React.useState({\r\n availableBenefits: [],\r\n addedBenefits: []\r\n });\r\n // Selected benefit id state\r\n // Used to sent to save or delete\r\n const [selectedBenefitId, setSelectedBenefitId] = useState(0)\r\n\r\n // Session context to get the current institution data\r\n const { get_currentInstitution } = useContext(AuthContext);\r\n\r\n // we use useEffect to call the function that returns the step2 data\r\n useEffect(() => {\r\n if (props.activeStep === 2) {\r\n getStep2_data();\r\n }\r\n }, [props.activeStep]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Calls the API to get the list of available benefits\r\n const getStep2_data = async () => {\r\n try {\r\n // Gets the data from each of the lists, they are all fetched at once \r\n // to avoid losing data for different setSate in different functions.\r\n const responseAvailable = await API.get(`/model/step2AvailableBenefits?institutionId=${get_currentInstitution().catInstitutionId}&modelId=${props.modelData.modelid}`);\r\n const responseAdded = await API.get(`/model/step2AddedBenefits?institutionId=${get_currentInstitution().catInstitutionId}&modelId=${props.modelData.modelid}`);\r\n // if error in request\r\n if (responseAvailable.data.code !== 100 || responseAdded.data.code !== 100) {\r\n Notifications.notify(responseAvailable.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n\r\n\r\n const availableBenefitsBD = responseAvailable.data.data;\r\n\r\n const availableBenefitsFirstSelected = availableBenefitsBD.map((item, i) => {\r\n if (i === 0) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n });\r\n\r\n setState({\r\n ...state,\r\n availableBenefits: availableBenefitsFirstSelected,\r\n addedBenefits: responseAdded.data.data\r\n });\r\n\r\n if (availableBenefitsBD.length !== 0) {\r\n setSelectedBenefitId(availableBenefitsBD[0].benefitId)\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(1);\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onNextClick = () => {\r\n // You cannot proceed to the next step if you have not selected at least one benefit.\r\n if (state.addedBenefits === [] || state.addedBenefits.length <= 0) {\r\n Notifications.notify(t('model.noSelectedBenefit'), ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n props.changeStep(3);\r\n }\r\n }\r\n\r\n // * Sets the active item after click\r\n const handleItemClick = (event, data, connectedData) => {\r\n setState({\r\n ...state,\r\n [data]: state[data].map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = !item[SELECTED_FIELD];\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n }),\r\n [connectedData]: state[connectedData].map((item) => {\r\n item[SELECTED_FIELD] = false;\r\n return item;\r\n }),\r\n });\r\n setSelectedBenefitId(event.dataItem.benefitId)\r\n };\r\n\r\n // * Function to arrows\r\n const handleToolBarClick = async (e) => {\r\n let toolName = e.toolName || \"\";\r\n let result = processListBoxData(\r\n state.availableBenefits,\r\n state.addedBenefits,\r\n toolName,\r\n SELECTED_FIELD\r\n );\r\n\r\n // click in arrow \r\n let responseSave = await arrowAction(toolName)\r\n\r\n if (responseSave) {\r\n // Updates the state\r\n setState({\r\n ...state,\r\n availableBenefits: result.listBoxOneData,\r\n addedBenefits: result.listBoxTwoData,\r\n });\r\n }\r\n };\r\n\r\n // if TRANSFER_TO the benefit is saved in the model\r\n // if TRANSFER_FROM the benefit is removed from the model\r\n const arrowAction = async (toolName) => {\r\n try {\r\n if (toolName === TRANSFER_TO) {\r\n // calls the API to save the benefit\r\n const response = await API.post(`/model/step2InsertBenefit?modelId=${props.modelData.modelid}&benefitId=${selectedBenefitId}`);\r\n // Message\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return false;\r\n } else {\r\n Notifications.notify(t('model.benefitAdded'), SUCCESS_NOTIFICATION);\r\n return true;\r\n }\r\n } else {\r\n // calls the API to remove the benefit\r\n const response = await API.delete(`/model/step2DeleteBenefit?modelId=${props.modelData.modelid}&benefitId=${selectedBenefitId}`);\r\n\r\n // Message\r\n if (response.data.code !== 100) {\r\n if (response.data.code === 300002) {\r\n Notifications.notify(t('model.invalidBenefitDelete'), ERROR_NOTIFICATION);\r\n return false;\r\n } else {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n } else {\r\n Notifications.notify(t('model.benefitRemoved'), SUCCESS_NOTIFICATION);\r\n return true;\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step2_desc')}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n handleItemClick(e, \"availableBenefits\", \"addedBenefits\")}\r\n toolbar={() => {\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n handleItemClick(e, \"addedBenefits\", \"availableBenefits\")}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {props.isActionView === VIEW ? null : !props.isEditMode ? (\r\n { props.editSteps(); }}\r\n className=\"btn btn-primary ilo-btn\"\r\n style={{marginBottom:\"10px\",marginRight:\"3px\"}}\r\n >\r\n {t('model.step7_edit_btn')}\r\n \r\n ) : null\r\n }\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step2","import React, { useState, useEffect, useContext, createRef } from 'react'\r\n// * Kendo dependencies\r\nimport {\r\n ListBox,\r\n ListBoxToolbar,\r\n processListBoxData\r\n} from '@progress/kendo-react-listbox';\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\n// Constants\r\nimport { TRANSFER_TO, TRANSFER_FROM } from './constants';\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\n\r\n// Used to show the selected item inside the box\r\nconst SELECTED_FIELD = \"selected\";\r\n\r\nconst Step3 = (props) => {\r\n const testRef = createRef(null);\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // * ListBox components state\r\n const [state, setState] = React.useState({\r\n benefitsList: [],\r\n availableGroups: [],\r\n addedGroups: []\r\n });\r\n // * Selected benefit id state\r\n const [selectedBenefitId, setSelectedBenefitId] = useState(0)\r\n const [selectedPopGroupId, setSelectedPopGroupId] = useState(0)\r\n const [selectedBeneficiaryUnit, setSelectedBeneficiaryUnit] = useState('')\r\n // * Session context to get the current institution data\r\n const { get_currentInstitution } = useContext(AuthContext);\r\n\r\n // * we use useEffect to call the function that returns the step2 data\r\n useEffect(() => {\r\n if (props.activeStep === 3) {\r\n getStep3_data();\r\n }\r\n }, [props.activeStep]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // *\r\n const getStep3_data = async () => {\r\n try {\r\n // Gets the data from each of the lists, they are all fetched at once \r\n // to avoid losing data for different setSate in different functions.\r\n const responseBenefits = await API.get(`/model/step3ModelBenefits?modelId=${props.modelData.modelid}`);\r\n // if error in request\r\n if (responseBenefits.data.code !== 100) {\r\n Notifications.notify(responseBenefits.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n // Set the state and select the option\r\n const benefitsListBD = responseBenefits.data.data\r\n const benefitsListFirstSelected = benefitsListBD.map((item, i) => {\r\n if (i === 0) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n return item;\r\n });\r\n // saves the benefit id as state\r\n setSelectedBenefitId(benefitsListBD[0].benefitId);\r\n getGroupsByBenefit(benefitsListFirstSelected, benefitsListBD[0].benefitId);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(2);\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onNextClick = () => {\r\n validateNext();\r\n }\r\n\r\n const validateNext = async () => {\r\n //https://localhost:44350/api/Model/step3Validation?modelId=1\r\n try {\r\n\r\n const response = await API.get(`/model/step3Validation?modelId=${props.modelData.modelid}`);\r\n\r\n // if error in request\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n } else {\r\n if (response.data.data) {\r\n props.changeStep(4);\r\n } else {\r\n Notifications.notify(t('model.step03_atleastonegroup_error'), ERROR_NOTIFICATION);\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // Triggered when an user clicks an element inside the box of Groups or benefit groups\r\n const handleItemClick = (event, data, connectedData) => {\r\n setState({\r\n ...state,\r\n [data]: state[data].map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = !item[SELECTED_FIELD];\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n }),\r\n [connectedData]: state[connectedData].map((item) => {\r\n item[SELECTED_FIELD] = false;\r\n return item;\r\n }),\r\n });\r\n // Used to know if the selected pop group is HouseHold or Individual. This to make a validation\r\n setSelectedBeneficiaryUnit(event.dataItem.beneficiaryUnit);\r\n setSelectedPopGroupId(event.dataItem.popGroupId);\r\n };\r\n\r\n // Triggered when an user clicks an element inside the box of Benefits\r\n const modelBenfitsClick = async (event, data) => {\r\n // Set the state and select the option\r\n setState({\r\n ...state,\r\n [data]: state[data].map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = !item[SELECTED_FIELD];\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n return item;\r\n })\r\n });\r\n // saves the benefit id as state\r\n setSelectedBenefitId(event.dataItem.benefitId);\r\n getGroupsByBenefit(state.benefitsList, event.dataItem.benefitId);\r\n }\r\n\r\n const getGroupsByBenefit = async (benefitlist, benefitId) => {\r\n // Gets the available pop groups according to selected benefit\r\n const responseGroups = await API.get(`/model/step3PopGroups?institutionId=${get_currentInstitution().catInstitutionId}&benefitId=${benefitId}&modelId=${props.modelData.modelid}`);\r\n // gets the added pop Groups\r\n const responseAddedGroups = await API.get(`/model/step3AddedPopGroups?modelId=${props.modelData.modelid}&benefitId=${benefitId}`);\r\n setState({\r\n ...state,\r\n benefitsList: benefitlist,\r\n availableGroups: responseGroups.data.data,\r\n addedGroups: responseAddedGroups.data.data\r\n });\r\n }\r\n\r\n // Click in the arrows of the lists\r\n const handleToolBarClick = async (e) => {\r\n let toolName = e.toolName || \"\";\r\n let result = processListBoxData(\r\n state.addedGroups,\r\n state.availableGroups,\r\n toolName,\r\n SELECTED_FIELD\r\n );\r\n\r\n let responseState = await arrowAction(toolName);\r\n\r\n if (responseState) {\r\n setState({\r\n ...state,\r\n availableGroups: result.listBoxTwoData,\r\n addedGroups: result.listBoxOneData,\r\n });\r\n }\r\n };\r\n\r\n // if TRANSFER_TO the benefit is saved in the model\r\n // if TRANSFER_FROM the benefit is removed from the model\r\n const arrowAction = async (toolName) => {\r\n let canSave = true;\r\n try {\r\n if (toolName === TRANSFER_TO) {\r\n // calls the API to remove the benefit\r\n const response = await API.delete(`/model/step3DeletePopGroup?modelId=${props.modelData.modelid}&benefitId=${selectedBenefitId}&popGroupId=${selectedPopGroupId}`);\r\n // Message\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return false;\r\n } else {\r\n Notifications.notify(t('model.popGroupAddedRemoved'), SUCCESS_NOTIFICATION);\r\n return true;\r\n }\r\n } else {\r\n if (state.addedGroups !== []) {\r\n state.addedGroups.forEach((element, i) => {\r\n // Only the first element matters\r\n if (i === 0) {\r\n // A benefit can only have Pop Groups of the same beneficiary unit.\r\n if (selectedBeneficiaryUnit !== element.beneficiaryUnit) {\r\n canSave = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (!canSave) {\r\n Notifications.notify(t('model.wrongPopGroup'), ERROR_NOTIFICATION);\r\n return false;\r\n } else {\r\n // * If there are no groups added to the list, no beneficiary unit validation is required.\r\n // calls the API to save the pop Group\r\n const response = await API.post(`/model/step3InsertPopGroup?modelId=${props.modelData.modelid}&benefitId=${selectedBenefitId}&popGroupId=${selectedPopGroupId}`);\r\n // Message\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return false;\r\n } else {\r\n Notifications.notify(t('model.popGroupAdded'), SUCCESS_NOTIFICATION);\r\n return true;\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step3_desc')}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n\r\n modelBenfitsClick(e, \"benefitsList\")}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n handleItemClick(e, \"addedGroups\", \"availableGroups\")}\r\n toolbar={() => {\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n handleItemClick(e, \"availableGroups\", \"addedGroups\")}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {props.isActionView === VIEW ? null : !props.isEditMode ? (\r\n { props.editSteps(); }}\r\n className=\"btn btn-primary ilo-btn\"\r\n style={{marginBottom:\"10px\",marginRight:\"3px\"}}\r\n >\r\n {t('model.step7_edit_btn')}\r\n \r\n ) : null\r\n }\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step3","export const REF_POPULATION_TOTAL = 'totalPopulation';\r\nexport const REF_POPULATION_LABOUR = 'labourForce';\r\n\r\nexport const BEN_UNIT_HOUSEHOLDS = 'h';\r\nexport const BEN_UNIT_INDIVIDUALS = 'i';","import React, { useState, useEffect } from 'react'\r\nimport {\r\n ListBox\r\n} from '@progress/kendo-react-listbox';\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\nimport { BEN_UNIT_HOUSEHOLDS } from '../PopGroups/costants';\r\n// Reac number format\r\nimport NumberFormat from 'react-number-format';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\nimport validator from 'validator';\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\n// Used to show the selected item inside the box\r\nconst SELECTED_FIELD = \"selected\";\r\n\r\nconst Step4 = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // * Selected benefit id state\r\n const [selectedBenefitId, setSelectedBenefitId] = useState(0);\r\n // * Input state\r\n const [ibam, setIBAM] = useState('');\r\n const [iantrans, setIANTRANS] = useState('');\r\n const [iadm, setIADM] = useState('');\r\n const [ithr, setITHR] = useState('');\r\n const [ichh, setICHH] = useState('');\r\n const [icpmale, setICPMale] = useState('');\r\n const [icpfemale, setICPFemale] = useState('');\r\n const [ihhavs, setIhhavs] = useState('')\r\n const [beneficiaryUnit, setBeneficiaryUnit] = useState('')\r\n const [isHouseHold, setIsHouseHold] = useState(false)\r\n // * ListBox components state\r\n const [state, setState] = React.useState({\r\n benefitsList: []\r\n });\r\n\r\n // * we use useEffect to call the function that returns the step2 data\r\n useEffect(() => {\r\n if (props.activeStep === 4) {\r\n // Setting the states as shown below helps to avoid displaying incorrect data when passing \r\n // from one step to the next (or previous).\r\n setIBAM('');\r\n setIANTRANS('');\r\n setIADM('');\r\n setITHR('');\r\n setICHH('');\r\n setICPMale('');\r\n setICPFemale('');\r\n setIhhavs('');\r\n setBeneficiaryUnit('');\r\n setIsHouseHold(false);\r\n setSelectedBenefitId(0);\r\n // Gets the benefits list\r\n getStep4_Benefits();\r\n }\r\n }, [props.activeStep]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // * Gets the benefits list\r\n const getStep4_Benefits = async () => {\r\n try {\r\n // Gets the data from each of the lists, they are all fetched at once \r\n // to avoid losing data for different setSate in different functions.\r\n const responseBenefits = await API.get(`/model/step4BenefitsList?modelId=${props.modelData.modelid}`);\r\n // if error in request\r\n if (responseBenefits.data.code !== 100) {\r\n Notifications.notify(responseBenefits.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n\r\n const benefitsListBD = responseBenefits.data.data;\r\n\r\n const benefitsListFirstSelected = benefitsListBD.map((item, i) => {\r\n if (0 === i) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n return item;\r\n });\r\n\r\n setState({\r\n ...state,\r\n benefitsList: benefitsListFirstSelected\r\n });\r\n\r\n // saves the benefit id as state\r\n setSelectedBenefitId(benefitsListBD[0].benefitId);\r\n // Fills the inputs with the selected benefit information\r\n fillInputs(benefitsListBD[0].benefitId);\r\n\r\n // Searching Household benefits. This lets us know if the system should display the Average Size field.\r\n // If at least one benefit in the list is Household, the field should be displayed\r\n const firstHousehold = benefitsListBD.find((item) => item.beneficiaryUnit === BEN_UNIT_HOUSEHOLDS)\r\n if (firstHousehold) {\r\n setIsHouseHold(true);\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * Saves the data of the step 4\r\n // * If the saves was ok, the step 3 is called\r\n const onPreviousClick = async () => {\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // * When calling an async/await function that returns a boolean, you must wait for its response, \r\n // * since it is a promise and will NOT return the desired bool.\r\n const returnValue = await saveStep4Data();\r\n if (returnValue) {\r\n props.changeStep(3);\r\n }\r\n } else {\r\n props.changeStep(3);\r\n }\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * Saves the data of the step 4\r\n // * If the saves was ok, the step 5 is called\r\n const onNextClick = async () => {\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // * When calling an async/await function that returns a boolean, you must wait for its response, \r\n // * since it is a promise and will NOT return the desired bool.\r\n const returnValue = await saveStep4Data();\r\n if (returnValue) {\r\n props.changeStep(5);\r\n }\r\n } else {\r\n props.changeStep(5);\r\n }\r\n }\r\n\r\n // * Calls the API to save the data of the selected benefit\r\n // * If it returns false, it means that some input is wrong.\r\n // * If it returns true, it means that everything is OK.\r\n const saveStep4Data = async () => {\r\n // * Validations\r\n // --- selected benefit validation\r\n // selectedBenefitId = 0 means that no benefit was selected, so when going to step 5 or 3 nothing is saved.\r\n if (selectedBenefitId === 0) {\r\n return true;\r\n }\r\n // --- empty validations\r\n if (validator.isEmpty(ibam.toString()) || validator.isEmpty(iantrans.toString()) ||\r\n validator.isEmpty(iadm.toString()) || validator.isEmpty(ithr.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n // if household validations\r\n if (beneficiaryUnit === BEN_UNIT_HOUSEHOLDS) {\r\n if (validator.isEmpty(ichh.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ichh.toString())) {\r\n Notifications.notify(t('model.ichh_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n } else {\r\n if (validator.isEmpty(icpfemale.toString()) || validator.isEmpty(icpmale.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(icpfemale.toString())) {\r\n Notifications.notify(t('model.icpfemale_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(icpmale.toString())) {\r\n Notifications.notify(t('model.icpmale_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n }\r\n // --- number validations\r\n if (!validator.isFloat(ibam.toString())) {\r\n Notifications.notify(t('model.ibam_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(iantrans.toString())) {\r\n Notifications.notify(t('model.iantrans_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(iadm.toString())) {\r\n Notifications.notify(t('model.iadm_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ithr.toString())) {\r\n Notifications.notify(t('model.ithr_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (validator.isEmpty(ihhavs.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ihhavs.toString())) {\r\n Notifications.notify(t('model.ihhavs_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (parseFloat(ihhavs.toString()) < 1) {\r\n Notifications.notify(t('model.ihhavs_exception'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n // data to be sent\r\n let data = {\r\n modelid: props.modelData.modelid,\r\n benefitId: selectedBenefitId,\r\n ibam: ibam,\r\n iantrans: iantrans,\r\n iadm: iadm,\r\n ithr_abam: ithr,\r\n itexp: 0,//itexp was remove like input, but no deleted from bd\r\n ichh: beneficiaryUnit === BEN_UNIT_HOUSEHOLDS ? ichh : 0,\r\n icpmale: beneficiaryUnit === BEN_UNIT_HOUSEHOLDS ? 0 : icpmale,\r\n icpfemale: beneficiaryUnit === BEN_UNIT_HOUSEHOLDS ? 0 : icpfemale,\r\n ihhavs: ihhavs\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/model/step4InsertData', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`model.${res.data.code}`), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Triggered when an user clicks an element inside the box of Benefits\r\n const modelBenfitsClick = async (event, data) => {\r\n // Saves the previous benefit data (like an onChange event)\r\n if (selectedBenefitId !== 0) {\r\n // selectedBenefit == 0 means that there is no previous benefit\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // Tries to save the previous benefit\r\n const returnValue = await saveStep4Data();\r\n // If was successfully saved a message is displayed\r\n if (returnValue) {\r\n Notifications.notify(t(`model.benefit_step4_6_message`), SUCCESS_NOTIFICATION);\r\n }\r\n }\r\n }\r\n // Set the state and select the option\r\n setState({\r\n ...state,\r\n [data]: state[data].map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = !item[SELECTED_FIELD];\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n return item;\r\n })\r\n });\r\n // saves the benefit id as state\r\n setSelectedBenefitId(event.dataItem.benefitId);\r\n // Fills the inputs with the selected benefit information\r\n fillInputs(event.dataItem.benefitId);\r\n }\r\n\r\n // Gets the information of the selected benefit and set the state of each input\r\n const fillInputs = async (benefitId) => {\r\n try {\r\n const responseBenefitsData = await API.get(`/model/step4BenefitData?modelId=${props.modelData.modelid}&benefitId=${benefitId}`);\r\n // Message\r\n if (responseBenefitsData.data.code !== 100) {\r\n Notifications.notify(responseBenefitsData.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n setIBAM(responseBenefitsData.data.data.ibam);\r\n setIADM(responseBenefitsData.data.data.iadm);\r\n setIANTRANS(responseBenefitsData.data.data.iantrans);\r\n setITHR(responseBenefitsData.data.data.ithR_ABAM);\r\n setICHH(responseBenefitsData.data.data.ichh);\r\n setICPMale(responseBenefitsData.data.data.icpMale);\r\n setICPFemale(responseBenefitsData.data.data.icpFemale);\r\n setBeneficiaryUnit(responseBenefitsData.data.data.beneficiaryUnit);\r\n setIhhavs(responseBenefitsData.data.data.ihhavs);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step4_desc')}
    \r\n
    \r\n
    \r\n
    \r\n {/**Form step4*/}\r\n
    \r\n
    \r\n \r\n modelBenfitsClick(e, \"benefitsList\")}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n setIBAM(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n {\r\n setIANTRANS(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n setIADM(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n {\r\n setITHR(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n {beneficiaryUnit === '' ?\r\n <>\r\n :\r\n beneficiaryUnit === BEN_UNIT_HOUSEHOLDS ?\r\n
    \r\n \r\n {\r\n setICHH(values.value);\r\n }}\r\n />\r\n
    \r\n :\r\n <>\r\n
    \r\n \r\n {\r\n setICPFemale(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n {\r\n setICPMale(values.value);\r\n }}\r\n />\r\n
    \r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n setIhhavs(values.value);\r\n }}\r\n />\r\n {/**{t('wizard.benefitDetails.average_hh_des')}*/}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {props.isActionView === VIEW ? null : !props.isEditMode ? (\r\n { props.editSteps(); }}\r\n className=\"btn btn-primary ilo-btn\"\r\n style={{ marginBottom: \"10px\", marginRight: \"3px\" }}\r\n >\r\n {t('model.step7_edit_btn')}\r\n \r\n ) : null\r\n }\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step4","import React, { useEffect, useState } from 'react'\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\n\r\nconst Step5 = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // * List of data. Used to fill the grid\r\n const [gridList, setGridList] = useState([])\r\n\r\n // we use useEffect to call the function that returns the step1 data\r\n useEffect(() => {\r\n if (props.activeStep === 5) {\r\n getStep5Data();\r\n }\r\n }, [props.activeStep]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // * This line is used so that the numerical inputs have the thousands separator with comma\r\n const addCommas = num => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\n // * Gets the respective data to fill the Grid\r\n const getStep5Data = async () => {\r\n try {\r\n // gets data from API\r\n const response = await API.get(`/model/step5GetData?modelId=${props.modelData.modelid}`);\r\n // if error in request\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n const data = response.data.data.map((element, i) => {\r\n // Ex: totalPopulation comes from DB, here we chaange that by Total population\r\n // const refpopulation = t(`referencePopMatrixCode.${element.referencePopMatrixCode}`);\r\n\r\n // change the variable for the real name\r\n // element.referencePopMatrixCode = refpopulation;\r\n // Sex validations\r\n let formatedSex = ''\r\n if (!element.indIncludeFemale) {\r\n formatedSex = t('modals.sex_m');\r\n } else if (element.indIncludeFemale) {\r\n formatedSex = t('modals.sex_f');\r\n } else {\r\n formatedSex = t('modals.sex_b');\r\n }\r\n\r\n let itexpValue = 0;\r\n if (element.beneficiaryUnit === 'i') {\r\n itexpValue = ((element.icPm + element.icPf) * element.ibam * element.iantrans) + element.iadm;\r\n } else {\r\n itexpValue = (element.ichh * element.ibam * element.iantrans) + element.iadm;\r\n }\r\n\r\n let totalValue = 0;\r\n if (element.beneficiaryUnit === 'i') {\r\n totalValue = element.icPm + element.icPf;\r\n } else {\r\n totalValue = \"-\";\r\n }\r\n\r\n return {\r\n ...element,\r\n\r\n // referencePopMatrixCode: t(`referencePopMatrixCode.${element.referencePopMatrixCode}`),\r\n formatedSex: formatedSex,\r\n fullData: response.data.data,\r\n itexp: addCommas(itexpValue),\r\n total: addCommas(totalValue),\r\n iantrans: addCommas(element.iantrans),\r\n ibam: addCommas(element.ibam),\r\n iadm: addCommas(element.iadm),\r\n ichh: addCommas(element.ichh),\r\n icPm: addCommas(element.icPm),\r\n icPf: addCommas(element.icPf)\r\n }\r\n });\r\n setGridList(data);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(4);\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onNextClick = () => {\r\n props.changeStep(6);\r\n }\r\n\r\n // * Returns the information to be displayed in the ICHH column\r\n const showICHHColumn = (props) => {\r\n // if household\r\n let avgString = \"-\";\r\n if (props.dataItem.beneficiaryUnit === \"h\") {\r\n avgString = `${props.dataItem.ichh}`;\r\n }\r\n\r\n return (\r\n \r\n {avgString}\r\n \r\n );\r\n }\r\n\r\n const showICPMaleColumn = (props) => {\r\n // if household\r\n let avgString = \"-\";\r\n if (props.dataItem.beneficiaryUnit === \"i\") {\r\n avgString = `${props.dataItem.icPm}`;\r\n }\r\n\r\n return (\r\n \r\n {avgString}\r\n \r\n );\r\n }\r\n\r\n const showICPFemaleColumn = (props) => {\r\n // if household\r\n let avgString = \"-\";\r\n if (props.dataItem.beneficiaryUnit === \"i\") {\r\n avgString = `${props.dataItem.icPf}`;\r\n }\r\n\r\n return (\r\n \r\n {avgString}\r\n \r\n );\r\n }\r\n\r\n const titleStyle = (props) => {\r\n return (\r\n \r\n {props.title}\r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step5_desc')}
    \r\n
    \r\n
    \r\n
    \r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step5","import React, { useState, useEffect } from 'react'\r\nimport {\r\n ListBox\r\n} from '@progress/kendo-react-listbox';\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\n\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\n\r\n// Used to show the selected item inside the box\r\nconst SELECTED_FIELD = \"selected\";\r\n\r\nconst Step6 = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // * Selected benefit id state\r\n const [selectedBenefitId, setSelectedBenefitId] = useState(0);\r\n // * Input state\r\n const [policyGaps, setPolicyGaps] = useState('');\r\n const [impIssues, setImpIssues] = useState('');\r\n const [policyRecom, setPolicyRecom] = useState('');\r\n const [annotations, setAnnotations] = useState('');\r\n // * ListBox components state\r\n const [state, setState] = React.useState({\r\n benefitsList: []\r\n });\r\n\r\n // * we use useEffect to call the function that returns the step2 data\r\n useEffect(() => {\r\n if (props.activeStep === 6) {\r\n // Setting the states as shown below helps to avoid displaying incorrect data when passing \r\n // from one step to the next (or previous).\r\n setPolicyGaps('');\r\n setImpIssues('');\r\n setPolicyRecom('');\r\n setAnnotations('');\r\n setSelectedBenefitId(0);\r\n // Gets benefits list\r\n getStep6_Benefits();\r\n }\r\n }, [props.activeStep]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // *\r\n const getStep6_Benefits = async () => {\r\n try {\r\n // Gets the data from each of the lists, they are all fetched at once \r\n // to avoid losing data for different setSate in different functions.\r\n const responseBenefits = await API.get(`/model/step4BenefitsList?modelId=${props.modelData.modelid}`);\r\n // if error in request\r\n if (responseBenefits.data.code !== 100) {\r\n Notifications.notify(responseBenefits.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n const benefitsListBD = responseBenefits.data.data;\r\n\r\n // Set the state and select the option\r\n const benefitsListFirstSelected = benefitsListBD.map((item, i)=>{\r\n if (i === 0) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n return item;\r\n });\r\n setState({\r\n ...state,\r\n benefitsList: benefitsListFirstSelected\r\n });\r\n\r\n // saves the benefit id as state\r\n setSelectedBenefitId(benefitsListBD[0].benefitId);\r\n // Fills the inputs with the selected benefit information\r\n fillInputs(benefitsListBD[0].benefitId);\r\n\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * Saves the data of the step 4\r\n // * If the saves was ok, the step 3 is called\r\n const onPreviousClick = async () => {\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // * When calling an async/await function that returns a boolean, you must wait for its response, \r\n // * since it is a promise and will NOT return the desired bool.\r\n const returnValue = await saveStep6Data();\r\n if (returnValue) {\r\n props.changeStep(5);\r\n }\r\n } else {\r\n props.changeStep(5);\r\n }\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * Saves the data of the step 4\r\n // * If the saves was ok, the step 5 is called\r\n const onNextClick = async () => {\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // * When calling an async/await function that returns a boolean, you must wait for its response, \r\n // * since it is a promise and will NOT return the desired bool.\r\n const returnValue = await saveStep6Data();\r\n if (returnValue) {\r\n props.changeStep(7);\r\n }\r\n } else {\r\n props.changeStep(7);\r\n }\r\n }\r\n\r\n // * Calls the API to save the data of the selected benefit\r\n // * If it returns false, it means that some input is wrong.\r\n // * If it returns true, it means that everything is OK.\r\n const saveStep6Data = async () => {\r\n // * Validations\r\n // --- selected benefit validation\r\n // selectedBenefitId = 0 means that no benefit was selected, so when going to step 7 or 5 nothing is saved.\r\n if (selectedBenefitId === 0) {\r\n return true;\r\n }\r\n // --- empty validations\r\n // if (validator.isEmpty(policyGaps.toString()) || validator.isEmpty(impIssues.toString()) ||\r\n // validator.isEmpty(policyRecom.toString()) || validator.isEmpty(annotations.toString())) {\r\n // Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n // return false;\r\n // }\r\n\r\n // data to be sent\r\n let data = {\r\n modelid: props.modelData.modelid,\r\n benefitId: selectedBenefitId,\r\n policyGaps: policyGaps,\r\n implemIssues: impIssues,\r\n policyRecom: policyRecom,\r\n suppleAnnotations: annotations\r\n\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/model/step6InsertData', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`model.${res.data.code}`), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Triggered when an user clicks an element inside the box of Benefits\r\n const modelBenfitsClick = async (event, data) => {\r\n let canSave = true;\r\n // Saves the previous benefit data (like an onChange event)\r\n if (selectedBenefitId !== 0) {\r\n // selectedBenefit == 0 means that there is no previous benefit\r\n // Only saves when is in edit mode\r\n if (props.isEditMode) {\r\n // Tries to save the previous benefit\r\n const returnValue = await saveStep6Data();\r\n // If was successfully saved a message is displayed\r\n if (returnValue) {\r\n Notifications.notify(t(`model.benefit_step4_6_message`), SUCCESS_NOTIFICATION);\r\n }\r\n else {\r\n canSave = false;\r\n }\r\n }\r\n }\r\n\r\n if (canSave) {\r\n // Set the state and select the option\r\n setState({\r\n ...state,\r\n [data]: state[data].map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = !item[SELECTED_FIELD];\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n return item;\r\n })\r\n });\r\n // saves the benefit id as state\r\n setSelectedBenefitId(event.dataItem.benefitId);\r\n // Fills the inputs with the selected benefit information\r\n fillInputs(event.dataItem.benefitId);\r\n }\r\n\r\n }\r\n\r\n // Gets the information of the selected benefit and set the state of each input\r\n const fillInputs = async (benefitId) => {\r\n try {\r\n const responseBenefitsData = await API.get(`/model/step6BenefitData?modelId=${props.modelData.modelid}&benefitId=${benefitId}`);\r\n // Message\r\n if (responseBenefitsData.data.data === null) {\r\n setPolicyGaps('');\r\n setImpIssues('');\r\n setPolicyRecom('');\r\n setAnnotations('');\r\n } else if (responseBenefitsData.data.code !== 100) {\r\n Notifications.notify(responseBenefitsData.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n setPolicyGaps(responseBenefitsData.data.data.policyGaps === null ? '' : responseBenefitsData.data.data.policyGaps);\r\n setImpIssues(responseBenefitsData.data.data.implemIssues === null ? '' : responseBenefitsData.data.data.implemIssues);\r\n setPolicyRecom(responseBenefitsData.data.data.policyRecom === null ? '' : responseBenefitsData.data.data.policyRecom);\r\n setAnnotations(responseBenefitsData.data.data.suppleAnnotations === null ? '' : responseBenefitsData.data.data.suppleAnnotations);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step6_desc')}
    \r\n
    \r\n
    \r\n
    \r\n {/**Form step4*/}\r\n
    \r\n
    \r\n \r\n modelBenfitsClick(e, \"benefitsList\")}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n setPolicyGaps(e.target.value)}\r\n >\r\n
    \r\n
    \r\n \r\n setImpIssues(e.target.value)}\r\n >\r\n
    \r\n
    \r\n\r\n\r\n
    \r\n
    \r\n \r\n setPolicyRecom(e.target.value)}\r\n >\r\n
    \r\n\r\n
    \r\n \r\n setAnnotations(e.target.value)}\r\n >\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step6","import React, { useEffect, useState, useRef } from 'react'\r\nimport './wizard.css'\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API, { PUBLIC } from \"../../services/api\";\r\n// Spreadsheet control\r\nimport { Spreadsheet } from \"@progress/kendo-spreadsheet-react-wrapper\";\r\n// Import axios\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im';\r\n\r\nimport { Loader } from \"@progress/kendo-react-indicators\";\r\n\r\nconst Step7 = (props) => {\r\n const { t } = useTranslation('common');\r\n //handle rows and columns sizes\r\n const [spreadDim, setSpreadDim] = useState({ rows: 1, columns: 1 });\r\n //ref to the spread\r\n const spread = useRef(null);\r\n // if we need change the dimension of rows or columns of the spread, we need no show the spread, so that it reload\r\n const [showSpread, setShowSpread] = useState(false);\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(6);\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onNextClick = () => {\r\n props.changeStep(8);\r\n }\r\n\r\n useEffect(() => {\r\n async function getData() {\r\n try {\r\n setShowSpread(false);\r\n // * Find the template in the public folder\r\n const response = await PUBLIC.get(\"/step7_templateII.json\");\r\n const data = response.data;\r\n //update rows and columns for the spread\r\n setSpreadDim({\r\n rows: data.rows.length,\r\n columns: data.rows[0].cells.length,\r\n });\r\n //we show the spread\r\n setShowSpread(true);\r\n // sets the data in the SP\r\n fillSpreadSheet(data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n getData()\r\n\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n validate_edit()\r\n }, [props.isEditMode]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Fills the spreadsheet with the data\r\n const fillSpreadSheet = async (data) => {\r\n //if the spread is visible we load the data\r\n //if (showSpread) {\r\n // Data\r\n const responseAvailable = await API.get(`/model/step7MatrixData?modelId=${props.modelData.modelid}`);\r\n // First: Builds the spreadsheet with the template information\r\n\r\n\r\n let sheet = spread.current ? spread.current.widgetInstance.activeSheet() : null;\r\n if (sheet === null) {\r\n return;\r\n }\r\n sheet.frozenRows(1);\r\n sheet.frozenRows(2);\r\n\r\n sheet.fromJSON(data);\r\n // Second: Sets the data in the spreadsheet (according to the currnt matrix)\r\n if (responseAvailable.data.data !== null) {\r\n // * Sets INATPOP data in the spreadSheet\r\n let getFemData_INATPOP = responseAvailable.data.data.femaleDataINATPOP.split(\";\");\r\n let getMaleData_INATPOP = responseAvailable.data.data.maleDataINATPOP.split(\";\");\r\n sheet.range(\"B3:B103\").values(newArray(getFemData_INATPOP));\r\n sheet.range(\"C3:C103\").values(newArray(getMaleData_INATPOP));\r\n // * Sets ILF data in the spreadSheet\r\n let getFemData_ILF = responseAvailable.data.data.femaleDataILF.split(\";\");\r\n let getMaleData_ILF = responseAvailable.data.data.maleDataILF.split(\";\");\r\n sheet.range(\"D3:D103\").values(newArray(getFemData_ILF));\r\n sheet.range(\"E3:E103\").values(newArray(getMaleData_ILF));\r\n }\r\n validate_edit();\r\n\r\n\r\n //}\r\n }\r\n\r\n const validate_edit = () => {\r\n // If the wizard is in VIEW mode, the Spreadsheet cannot be edited\r\n let sheet = spread.current ? spread.current.widgetInstance.activeSheet() : null;\r\n if (sheet === null) {\r\n return;\r\n }\r\n if (!props.isEditMode) {\r\n\r\n sheet.range(\"B3:B103\").enable(false);\r\n sheet.range(\"C3:C103\").enable(false);\r\n sheet.range(\"D3:D103\").enable(false);\r\n sheet.range(\"E3:E103\").enable(false);\r\n } else {\r\n sheet.range(\"B3:B103\").enable(true);\r\n sheet.range(\"C3:C103\").enable(true);\r\n sheet.range(\"D3:D103\").enable(true);\r\n sheet.range(\"E3:E103\").enable(true);\r\n }\r\n }\r\n\r\n\r\n\r\n // * Each value in the array becomes an array. This is because the spreadsheet is filled in rows.\r\n // Ex: arr = [\"50\",\"3\",\"150\",\"2\"] => arr = [[\"50\"],[\"3\"],[\"150\"],[\"2\"]] \r\n const newArray = (arr) => {\r\n const result = arr.map((e, i) => {\r\n const value = parseFloat(e);\r\n if (isNaN(value)\r\n ) {\r\n return [0];\r\n }\r\n return [value];\r\n });\r\n return result\r\n }\r\n\r\n\r\n // * In the matrixData variable, the values entered for Females and Males are concatenated as a string.\r\n // * Separated by ; to assemble the data when it is to be displayed\r\n const saveMatrixData = async () => {\r\n try {\r\n // spreadsheet instance\r\n let actSheet = spread.current.widgetInstance.activeSheet();\r\n\r\n // Splits for validations\r\n let fem_inatpop_validation = actSheet.range(\"B3:B103\").values();\r\n let male_inatpop_validation = actSheet.range(\"C3:C103\").values();\r\n let fem_ilf_validation = actSheet.range(\"D3:D103\").values();\r\n let male_ilf_validation = actSheet.range(\"E3:E103\").values();\r\n\r\n // Validation that blocks the SAVE if NON-numeric values were entered.\r\n if (!checkSPData(fem_inatpop_validation) || !checkSPData(male_inatpop_validation) ||\r\n !checkSPData(fem_ilf_validation) || !checkSPData(male_ilf_validation)) {\r\n Notifications.notify(t('model.spWrongData'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * INATPOP DATA\r\n // Data from INATPOP-female row as string\r\n let female_nat_pop_Vals = actSheet.range(\"B3:B103\").values().toString();\r\n // Data from INATPOP-male row as string\r\n let male_nat_pop_Vals = actSheet.range(\"C3:C103\").values().toString();\r\n // INATPOP-Female value with ; as separator\r\n let semiFem_inatpop = female_nat_pop_Vals.replaceAll(',', ';');\r\n // INATPOP-Male value with ; as separator\r\n let semiMale_inatpop = male_nat_pop_Vals.replaceAll(',', ';');\r\n // * ILF DATA\r\n // Data from INATPOP-female row as string\r\n let female_ilf_Vals = actSheet.range(\"D3:D103\").values().toString();\r\n // Data from INATPOP-male row as string\r\n let male_ilf_Vals = actSheet.range(\"E3:E103\").values().toString();\r\n // INATPOP-Female value with ; as separator\r\n let semiFem_ilf = female_ilf_Vals.replaceAll(',', ';');\r\n // INATPOP-Male value with ; as separator\r\n let semiMale_ilf = male_ilf_Vals.replaceAll(',', ';');\r\n\r\n // object to be sent via API\r\n let dataSent = {\r\n modelid: props.modelData.modelid,\r\n femaleDataINATPOP: semiFem_inatpop,\r\n maleDataINATPOP: semiMale_inatpop,\r\n femaleDataILF: semiFem_ilf,\r\n maleDataILF: semiMale_ilf\r\n }\r\n\r\n // * call the api to sent the data\r\n const res = await API.post('/model/step7InsertMatrixData', dataSent);\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n } else {\r\n Notifications.notify(t('model.matrixDataInserted'), SUCCESS_NOTIFICATION);\r\n }\r\n\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n\r\n }\r\n\r\n // Checks if the array has string values\r\n // If it has string values, the function returns FALSE that means the SP its wrong\r\n const checkSPData = (arr) => {\r\n let result = arr.every(function (e) {\r\n return typeof e[0] === 'number';\r\n });\r\n return result;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step7_desc')}
    \r\n
    \r\n
    \r\n
    \r\n {showSpread ? (\r\n <>\r\n \r\n {props.isEditMode ? (\r\n { saveMatrixData(); }}\r\n className=\"btn btn-primary ilo-btn\"\r\n style={{ marginTop: \"20px\" }}\r\n >\r\n {t('model.step7_save_btn')}\r\n \r\n ) : null\r\n }\r\n \r\n ) : }\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {props.isActionView === VIEW ? null : !props.isEditMode ? (\r\n { props.editSteps(); }}\r\n className=\"btn btn-primary ilo-btn\"\r\n style={{ marginBottom: \"10px\", marginRight: \"3px\" }}\r\n >\r\n {t('model.step7_edit_btn')}\r\n \r\n ) : null\r\n }\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step7","import React, { useEffect, useState, useContext } from 'react'\r\n// * Kendo dependencies\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\n// import { ExcelExport } from '@progress/kendo-react-excel-export';\r\nimport { Loader } from \"@progress/kendo-react-indicators\";\r\n// * CSS\r\nimport './wizard.css'\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport MatrixContext from '../../assets/Constants/matrixContext';\r\n// * Axios\r\nimport API, { AMS } from \"../../services/api\";\r\n// Context\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\n\r\nconst Step8 = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // list of data\r\n const [gridDataList, setGridDataList] = useState([])\r\n // user information from context\r\n const { user } = useContext(AuthContext);\r\n // const _export = useRef(null);\r\n\r\n //show_report\r\n const [showGapReport, setShowGapReport] = useState('');\r\n\r\n const [maxPull, setMaxPull] = useState(0);\r\n\r\n const [taskIdForPull, setTaskIdForPull] = useState(0);\r\n\r\n const [doPull, setDoPull] = useState(false);\r\n\r\n // we use useEffect to call the function that returns the step1 data\r\n useEffect(() => {\r\n if (props.activeStep === 8) {\r\n checkIsReadyForAssessment();\r\n }\r\n }, [props.activeStep]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n if (doPull && props.activeStep === 8) {\r\n const interval = setInterval(() => {\r\n\r\n if (maxPull < 3) {\r\n checkTaskStatus();\r\n\r\n } else {\r\n setDoPull(false);\r\n setMaxPull(0);\r\n }\r\n }, 5000);\r\n return () => clearInterval(interval);\r\n }\r\n }, [doPull, maxPull]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const checkIsReadyForAssessment = async () => {\r\n try {\r\n const response = await API.get(`Model/getModelFlags?modelId=${props.modelData.modelid}`);\r\n\r\n if (response.data.code === 100) {\r\n const isReadyForAssessment = response.data.data.isReadyForAssessment\r\n if (isReadyForAssessment) {\r\n setShowGapReport('report')\r\n getStep8Data();\r\n } else {\r\n setShowGapReport('noreport')\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n setGridDataList([]);\r\n setShowGapReport('noreport')\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * This line is used so that the numerical inputs have the thousands separator with comma\r\n const addCommas = num => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\n // Gets the data to bind the Gaps Report Grid\r\n const getStep8Data = async () => {\r\n try {\r\n const response = await AMS.get(`/gaps_report/${MatrixContext.MODEL}/${props.modelData.modelid}`);\r\n if (response.data.result !== 1) {\r\n setGridDataList([]);\r\n } else {\r\n response.data.data.map((element, i) => {\r\n element[1] = addCommas(element[1]);\r\n element[2] = addCommas(element[2]*100)+ \"%\";\r\n element[3] = addCommas(element[3]);\r\n element[4] = addCommas(element[4]*100)+ \"%\";\r\n element[5] = addCommas(element[5]);\r\n element[6] = addCommas(element[6]*100) + \"%\";\r\n });\r\n setGridDataList(response.data.data);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n setGridDataList([]);\r\n console.log(e)\r\n }\r\n }\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(7);\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onNextClick = () => {\r\n props.changeStep(9);\r\n }\r\n\r\n // // * Called in the Export to Excel button\r\n // const excelExport = () => {\r\n // if (gridDataList === [] || gridDataList === null || gridDataList.length <= 0) {\r\n // Notifications.notify(t(`model.noExcelData`), ERROR_NOTIFICATION);\r\n // return;\r\n // } else {\r\n // if (_export.current !== null) {\r\n // _export.current.save();\r\n // }\r\n // }\r\n // };\r\n\r\n //\r\n const calculateGapAssessment = async () => {\r\n\r\n try {\r\n const response = await API.post(`Scheduler/addTask`, null, {\r\n params: {\r\n ctxtcode: MatrixContext.MODEL,\r\n scenarioid: props.modelData.modelid,\r\n opcode: 'CAL',\r\n usrcode: user ? user.email : 'get_user_error',\r\n customparams: JSON.stringify({ runblocks: ['load_data', 'gaps'] })\r\n }\r\n });\r\n if (response.data.code === 100) {\r\n setTaskIdForPull(response.data.data);\r\n setShowGapReport('wait');\r\n setMaxPull(0);\r\n setDoPull(true);\r\n } else {\r\n Notifications.notify(response.data.code, ERROR_NOTIFICATION);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n setGridDataList([]);\r\n setShowGapReport('');\r\n console.log(e)\r\n }\r\n }\r\n\r\n const checkTaskStatus = async () => {\r\n try {\r\n const response = await API.post(`Scheduler/getTaskStatus`, null, {\r\n params: {\r\n taskid: taskIdForPull\r\n }\r\n });\r\n if (response.data.code === 100) {\r\n if (response.data.data === 100) {\r\n\r\n setShowGapReport('report');\r\n getStep8Data();\r\n setDoPull(false);\r\n props.setFlags();\r\n } else {\r\n if (response.data.data === 20 || response.data.data === 200 || response.data.data === 300) {\r\n setShowGapReport('error');\r\n setDoPull(false);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n setMaxPull(maxPull + 1);\r\n }\r\n\r\n const titleStyle = (props) => {\r\n return (\r\n \r\n {props.title}\r\n \r\n );\r\n }\r\n\r\n const displayInformation = () => {\r\n switch (showGapReport) {\r\n case 'noreport':\r\n return (\r\n
    \r\n

    {t('model.no_report')}

    \r\n
    \r\n )\r\n case 'error':\r\n return (\r\n
    \r\n

    {t('model.error_report', { id: taskIdForPull })}

    \r\n
    \r\n )\r\n case 'wait':\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n case 'report':\r\n return (\r\n <>\r\n {/**Si se desea exportar a Excel solo se debe meter todo el grid dentro de las etiquetas comentadas abajo y descomentar el boton*/}\r\n {/****/}\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n {/**\r\n * \r\n \r\n {t('model.excelExport_btn')}\r\n \r\n \r\n * \r\n */}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n default:\r\n return null\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step8_desc')}
    \r\n
    \r\n
    \r\n
    \r\n {props.isActionView === VIEW ? null :\r\n \r\n {t('model.calculate')}\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n {\r\n displayInformation()\r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step8","import React, { useEffect, useState, useContext } from 'react'\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport './wizard.css'\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\nimport API from \"../../services/api\";\r\n// Context\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowRight, ImArrowLeft } from 'react-icons/im'\r\n\r\nconst Step9 = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // list of data\r\n const [gridDataList, setGridDataList] = useState([])\r\n // user information from context\r\n const { user } = useContext(AuthContext);\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(8);\r\n }\r\n\r\n // * This function is called when the NEXT arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onNextClick = () => {\r\n props.changeStep(10);\r\n }\r\n\r\n // we use useEffect to call the function that returns the step1 data\r\n useEffect(() => {\r\n if(props.activeStep === 9){\r\n getStep9Data();\r\n }\r\n }, [props.activeStep]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getStep9Data = async () => {\r\n try {\r\n // data to be sent\r\n let dataSent = {\r\n UserCode: user.email,\r\n ModelId: props.modelData.modelid,\r\n BenefitId: null,\r\n SPFunctionId: null,\r\n SPComponentId: null,\r\n minCreationYear: null,\r\n MaxCreationYear: null,\r\n GroupName: null,\r\n AdminInstitutionName: null,\r\n LegalFramework: null,\r\n Description: null,\r\n PolicyGaps: null,\r\n Issues: null,\r\n Recommendations: null,\r\n Annotations: null\r\n }\r\n\r\n // gets data from API\r\n const response = await API.post('/model/getAssessmentMatrix', dataSent);\r\n // if error in request\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n setGridDataList(response.data.data);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {t('model.step9_desc')}
    \r\n
    \r\n
    \r\n
    \r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {props.isActionView === VIEW ? null : !props.isModelCompleted ? :null}\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step9","import React, {useState} from \"react\";\r\nimport './wizard.css';\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { ImArrowLeft } from 'react-icons/im';\r\n\r\n// * Helpers\r\nimport { useTranslation } from 'react-i18next';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\n\r\n// * Axios\r\nimport API from \"../../services/api\";\r\n\r\nconst Step10 = (props) => {\r\n\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n const [showAlert, setShowAlert] = useState(false);\r\n\r\n // * This function is called when the PREVIOUS arrow is clicked.\r\n // * It is passed as parameter to each step \r\n const onPreviousClick = () => {\r\n props.changeStep(9);\r\n }\r\n\r\n // Calculate Model click action\r\n const onCompleteClick = async () => {\r\n try {\r\n const response = await API.get(`Model/updateIsModelCompleted`, {\r\n params: {\r\n modelId:props.modelData.modelid,\r\n isModelCompleted: true\r\n }\r\n });\r\n if (response.data.code === 100) {\r\n Notifications.notify(t('model.step10_complete_success'), SUCCESS_NOTIFICATION);\r\n toggleAlert();\r\n props.setFlags();\r\n onPreviousClick();\r\n }else{\r\n Notifications.notify('model.step10_complete_error', ERROR_NOTIFICATION);\r\n toggleAlert();\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n toggleAlert();\r\n console.log(e);\r\n }\r\n \r\n }\r\n\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n const validateIsReadyForAssessment = async () => {\r\n try {\r\n const response = await API.get(`Model/getModelFlags?modelId=${props.modelData.modelid}`);\r\n \r\n if (response.data.code === 100) {\r\n const isReadyForAssessment = response.data.data.isReadyForAssessment\r\n if (isReadyForAssessment){\r\n toggleAlert();\r\n }else{\r\n Notifications.notify(t('model.step10_model_no_calculated'), ERROR_NOTIFICATION); \r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n
    {t('model.step10_dialog_content')}
    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n
    \r\n
    {t('model.step10_desc')}
    \r\n
    \r\n
    \r\n
    \r\n { validateIsReadyForAssessment(); }}\r\n >\r\n {t('model.step10_complete_btn')}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Step10","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { VIEW } from '../../assets/Constants/actionsTypes';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport './wizard.css';\r\nimport WizardInfo from './wizardInfo'\r\n// * We use React Slick to build the carousel \r\nimport \"slick-carousel/slick/slick.css\";\r\nimport \"slick-carousel/slick/slick-theme.css\";\r\n// * Custom Components (used inside the Slider component)\r\nimport Step1 from './Step1'\r\nimport Step2 from './Step2'\r\nimport Step3 from './Step3'\r\nimport Step4 from './Step4'\r\nimport Step5 from './Step5'\r\nimport Step6 from './Step6'\r\nimport Step7 from './Step7'\r\nimport Step8 from './Step8'\r\nimport Step9 from './Step9'\r\nimport Step10 from './Step10'\r\n// \r\nimport API from \"../../services/api\";\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { BiArrowFromRight } from \"react-icons/bi\";\r\n\r\n/**This component will render the entire Wizard actions. All the steps and wizard info will be render here*/\r\nfunction Wizard() {\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n /**Used to translate the text*/\r\n const { t } = useTranslation('common');\r\n /**We use useHistory hook to redirect */\r\n const history = useHistory();\r\n /**State used to show up the current step. Green if active, red if inactive */\r\n /**Step 1 by default */\r\n const [activeStep, setActiveStep] = useState(1);\r\n\r\n // * State used to enable or disable the steps inputs according to the action\r\n const [isEditMode, setIsEditMode] = useState(true)\r\n // *\r\n const [isModelCompleted, setIsModelCompleted] = useState(false)\r\n // *\r\n const [isActionView, setIsActionView] = useState('')\r\n\r\n useEffect(() => {\r\n setModelFlags();\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const setModelFlags = async () => {\r\n try {\r\n // gets data from API\r\n const response = await API.get(`/model/getModelFlags?modelId=${location.state.detail.modelid}`);\r\n // if error in request\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n // * Set state according to the action\r\n // * If action === VIEW or the model is completed => all inputs will be disabled\r\n if (location.state.action === VIEW) {\r\n setIsEditMode(false);\r\n setIsActionView(VIEW);\r\n } else if (response.data.data.isReadyForAssessment) {\r\n setIsEditMode(false);\r\n } else {\r\n setIsEditMode(true);\r\n }\r\n setIsModelCompleted(response.data.data.isModelCompleted);\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n const editSteps = async () => {\r\n try {\r\n // gets data from API\r\n const response = await API.get(`/model/haveScenarios?modelId=${location.state.detail.modelid}`);\r\n // if error in request\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n if (response.data.data) {\r\n Notifications.notify(t('model.model_has_escenarios'), ERROR_NOTIFICATION);\r\n return;\r\n } else {\r\n // * call the api to do the upsert\r\n const response = await API.post(`/model/turnOffFlags?modelId=${location.state.detail.modelid}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (response.data.code !== 100) {\r\n Notifications.notify(t(`model.${response.data.code}`), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n setModelFlags();\r\n }\r\n }\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n /**Triggered when user clicks \"Go Back\" button. Redirects to Models view*/\r\n const goBack = () => {\r\n history.push('/Models');\r\n }\r\n\r\n /**When user clicks any arrow (previous or next) the color in the WizardInfo will be updated */\r\n const changeActiveStep = (stepIndex) => {\r\n setActiveStep(parseInt(stepIndex));\r\n }\r\n\r\n const switchSteps = () => {\r\n switch (activeStep) {\r\n case 1:\r\n return (\r\n \r\n );\r\n case 2:\r\n return (\r\n \r\n );\r\n case 3:\r\n return (\r\n \r\n );\r\n case 4:\r\n return (\r\n \r\n );\r\n case 5:\r\n return (\r\n \r\n );\r\n case 6:\r\n return (\r\n \r\n );\r\n case 7:\r\n return (\r\n \r\n );\r\n case 8:\r\n return (\r\n \r\n );\r\n case 9:\r\n return (\r\n \r\n );\r\n case 10:\r\n return (\r\n \r\n );\r\n default:\r\n return (\r\n null\r\n );\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n \r\n {isModelCompleted ?\r\n <>\r\n | {t('model.modelCalculated')} \r\n \r\n :\r\n <>\r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n {/* Wizard Info here */}\r\n \r\n {/* Steps here */}\r\n
    \r\n {switchSteps()}\r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default Wizard","import React from 'react';\r\nimport { VIEW, UPDATE, DELETE } from '../../assets/Constants/actionsTypes';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { DropDownButton, DropDownButtonItem } from '@progress/kendo-react-buttons';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\nconst SPFunctionsGrid = (props) => {\r\n // * we call the hook to make translations\r\n const {t} = useTranslation('common');\r\n return (\r\n <>\r\n \r\n {/* tthis is the message when there are no records */}\r\n {t('grids.no_records')}\r\n\r\n \r\n \r\n\r\n {/* action column */}\r\n (\r\n \r\n { props.onActionClick(e.item, gridProps.dataItem); }}>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default SPFunctionsGrid\r\n","import React, { useEffect, createRef, useState } from 'react'\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { NEW, VIEW, UPDATE } from '../../assets/Constants/actionsTypes'\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst SPFunctionsModal = (props) => {\r\n // * we call the hook to make translations\r\n const {t} = useTranslation('common');\r\n\r\n // * we create a reference for the modal\r\n const window = createRef();\r\n\r\n //// const [title, setTitle] = useState('');\r\n \r\n // * defines whether or not to display the save button\r\n const [showSave, setShowSave] = useState(false);\r\n\r\n // * defines whether we are in update mode\r\n const [isUpdate, setIsUpdate] = useState(false);\r\n\r\n // * here you define the variables linked to the inputs\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n /**\r\n * here you define the configuration that the modal will have. this depends on the type with which it was opened.\r\n */\r\n useEffect(() => {\r\n \r\n if (props.type === NEW) {\r\n setShowSave(true);\r\n setName('');\r\n setDescription('');\r\n } else {\r\n if (props.data) {\r\n setName(props.data.name);\r\n setDescription(props.data.description);\r\n if (props.type === VIEW) {\r\n\r\n setShowSave(false)\r\n } else {\r\n if (props.type === UPDATE) {\r\n setShowSave(true);\r\n setIsUpdate(true);\r\n }\r\n }\r\n } else {\r\n props.toggleWindow();\r\n }\r\n }\r\n\r\n }, [props])\r\n\r\n // * with this we make sure to always hide the maximize and minimize buttons.\r\n useEffect(() => {\r\n if (window) {\r\n hideButtons();\r\n }\r\n })\r\n\r\n // * with this we hide the maximize and minimize buttons.\r\n const hideButtons = () => {\r\n let maximizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-maximize\"\r\n ).parentElement;\r\n maximizeButton.style.visibility = \"hidden\";\r\n\r\n let minimizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-minimize\"\r\n ).parentElement;\r\n minimizeButton.style.visibility = \"hidden\";\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n props.toggleWindow();\r\n }}\r\n ref={window}\r\n >\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n setName(e.target.value)}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n setDescription(e.target.value)}\r\n >\r\n
    \r\n
    \r\n \r\n {showSave &&\r\n {\r\n const data = {\r\n spFunctionId: isUpdate ? props.data.spFunctionId : 0,\r\n name,\r\n description\r\n }\r\n props.onSave(data)\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('modals.save_btn')}\r\n }\r\n\r\n \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n )\r\n}\r\n\r\nexport default SPFunctionsModal\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\nimport SPFunctionsGrid from './spFunctionsGrid';\r\nimport { VIEW, UPDATE, DELETE, NEW } from '../../assets/Constants/actionsTypes';\r\nimport API from \"../../services/api\";\r\nimport validator from 'validator';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport SPFunctionsModal from './spFunctionsModal';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst SPFunctions = () => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n // * defines whether or not to display the modal\r\n const [showModal, setShowModal] = useState(false);\r\n\r\n // * defines whether or not to display the modal\r\n const [showAlert, setShowAlert] = useState(false);\r\n\r\n // * list of spFunctions\r\n const [functionsList, setFunctionsList] = useState([]);\r\n\r\n // * spFunction selected in grid\r\n const [functionData, setFunctionData] = useState({});\r\n\r\n // * type of modal to be displayed\r\n const [viewType, setViewType] = useState('');\r\n\r\n // * we obtain the first time the spfunctions\r\n useEffect(() => {\r\n getFunctions();\r\n }, [])\r\n\r\n /**\r\n ** here you get the database spFunction\r\n */\r\n const getFunctions = async () => {\r\n setFunctionsList([]);\r\n try {\r\n // * call the api\r\n const res = await API.get('/spfunction/getall');\r\n setFunctionsList(res.data.data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n /**\r\n ** Show or hide the modal\r\n */\r\n const toggleWindow = () => {\r\n setShowModal(!showModal);\r\n }\r\n\r\n /**\r\n ** Show or hide the alert\r\n */\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n /**\r\n ** This function is in charge of managing which type of modal or alert should be opened.\r\n */\r\n const onActionClick = (actionItem, dataItme) => {\r\n const action = actionItem.value;\r\n setViewType(action);\r\n setFunctionData(dataItme);\r\n\r\n switch (action) {\r\n case NEW:\r\n toggleWindow();\r\n break;\r\n case VIEW:\r\n toggleWindow();\r\n break;\r\n case UPDATE:\r\n toggleWindow();\r\n break;\r\n case DELETE:\r\n toggleAlert();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n ** The upsert call is handled here\r\n */\r\n const onSave = async (data) => {\r\n try {\r\n // * validate required fiels\r\n if (validator.isEmpty(data.name)) {\r\n Notifications.notify(t('spFunction.name_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we apply the trim to the fields\r\n data = {\r\n ...data,\r\n name: validator.trim(data.name),\r\n description: validator.trim(data.description)\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/spfunction/upsert', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`spFunction.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we decide what kind of message of success we should give\r\n const msg = data.spFunctionId === 0 ? t('spFunction.new_message') : t('spFunction.update_message');\r\n\r\n // * hide the modal and refresh the grid\r\n toggleWindow();\r\n Notifications.notify(msg, SUCCESS_NOTIFICATION);\r\n getFunctions();\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n\r\n }\r\n\r\n /**\r\n ** The delete call is handled here\r\n */\r\n const onDelete = async () => {\r\n try {\r\n // * call the api to do the delete\r\n const res = await API.delete(`/spfunction?spFunctionId=${functionData.spFunctionId}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`spFunction.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('spFunction.delete_message'), SUCCESS_NOTIFICATION);\r\n getFunctions();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n | {t('spFunction.modal_title')}\r\n
    \r\n
    \r\n
    \r\n {/* modal window */}\r\n {showModal && }\r\n\r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {t('spFunction.delete_body')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n\r\n
    \r\n {/* grid */}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n )\r\n}\r\n\r\nexport default SPFunctions\r\n","import React from 'react';\r\nimport { VIEW, UPDATE, DELETE } from '../../assets/Constants/actionsTypes';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { DropDownButton, DropDownButtonItem } from '@progress/kendo-react-buttons';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n// In this component we use propos because the component father (SpComponent) sent paramerters\r\nconst SPComponentsGrid = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n return (\r\n <>\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n {/* action column */}\r\n (\r\n \r\n { props.onActionClick(e.item, gridProps.dataItem); }}>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default SPComponentsGrid;","import React, { useEffect, createRef, useState } from 'react'\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { NEW, VIEW, UPDATE } from '../../assets/Constants/actionsTypes'\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst SPComponentsModal = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // we create a reference for the modal\r\n const window = createRef();\r\n // this variable allow us know if the save button will be shown or not\r\n const [showSave, setShowSave] = useState(false);\r\n // if is in UPDATE mode\r\n const [isUpdate, setIsUpdate] = useState(false);\r\n // inputs in the modal and its state\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n /**\r\n * here you define the configuration that the modal will have. this depends on the type with which it was opened.\r\n */\r\n useEffect(() => {\r\n if (props.type === NEW) {\r\n setShowSave(true);\r\n setName('');\r\n setDescription('');\r\n } else {\r\n if (props.data) {\r\n setName(props.data.name);\r\n setDescription(props.data.description);\r\n if (props.type === VIEW) {\r\n\r\n setShowSave(false)\r\n } else {\r\n if (props.type === UPDATE) {\r\n setShowSave(true);\r\n setIsUpdate(true);\r\n }\r\n }\r\n } else {\r\n props.toggleWindow();\r\n }\r\n }\r\n\r\n }, [props])\r\n\r\n // with this we make sure to always hide the maximize and minimize buttons.\r\n useEffect(() => {\r\n if (window) {\r\n hideButtons();\r\n }\r\n })\r\n\r\n // with this we hide the maximize and minimize buttons.\r\n const hideButtons = () => {\r\n let maximizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-maximize\"\r\n ).parentElement;\r\n maximizeButton.style.visibility = \"hidden\";\r\n\r\n let minimizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-minimize\"\r\n ).parentElement;\r\n minimizeButton.style.visibility = \"hidden\";\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n props.toggleWindow();\r\n }}\r\n ref={window}\r\n >\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n setName(e.target.value)}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n setDescription(e.target.value)}\r\n >\r\n
    \r\n
    \r\n \r\n {showSave &&\r\n {\r\n const data = {\r\n spComponentId: isUpdate ? props.data.spComponentId : 0,\r\n name,\r\n description\r\n }\r\n props.onSave(data)\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('modals.save_btn')}\r\n }\r\n\r\n \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n )\r\n\r\n}\r\n\r\nexport default SPComponentsModal","import React, { useState, useEffect } from 'react'\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\nimport SPComponentsGrid from './spComponentsGrid';\r\nimport { VIEW, UPDATE, DELETE, NEW } from '../../assets/Constants/actionsTypes';\r\nimport API from \"../../services/api\";\r\nimport validator from 'validator';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport SPComponentsModal from './spComponentsModal';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n// Css file\r\nimport './spComponents.css'\r\n\r\nconst SPComponent = () => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n /**State of the modal window. True = showing ... False = hidden */\r\n const [showModal, setShowModal] = useState(false);\r\n /** State of the dialog. True = showing ... False = hidden */\r\n const [showAlert, setShowAlert] = useState(false);\r\n // List of components. See useEffect\r\n const [componentsList, setComponentsList] = useState([]);\r\n // Single component\r\n const [componentData, setComponentData] = useState({});\r\n // Modal Window type = DELETE, NEW, VIEW or UPDATE\r\n const [viewType, setViewType] = useState('');\r\n\r\n // we use useEffect to call the function that fills the grid\r\n useEffect(() => {\r\n getComponentsList();\r\n }, [])\r\n\r\n // Function that updates the componentsList variable in the state. This list will be used to fill the grid \r\n const getComponentsList = async () => {\r\n setComponentsList([]);\r\n try {\r\n const response = await API.get('/spcomponent/getAll');\r\n setComponentsList(response.data.data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // Show or hide the modal window. See state variable\r\n const toggleWindow = () => {\r\n setShowModal(!showModal);\r\n }\r\n\r\n // Show or hide the alert dialog. See state variable\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n // Triggered when the user clicks an action in the grid. Opens the modal window according to the selection\r\n const onActionClick = (actionItem, dataItme) => {\r\n const action = actionItem.value;\r\n setViewType(action);\r\n setComponentData(dataItme);\r\n\r\n switch (action) {\r\n case NEW:\r\n toggleWindow();\r\n break;\r\n case VIEW:\r\n toggleWindow();\r\n break;\r\n case UPDATE:\r\n toggleWindow();\r\n break;\r\n case DELETE:\r\n toggleAlert();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n /**\r\n ** The upsert call is handled here\r\n */\r\n const onSave = async (data) => {\r\n try {\r\n // * validate required fiels\r\n if (validator.isEmpty(data.name)) {\r\n Notifications.notify(t('spComponent.name_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we apply the trim to the fields\r\n data = {\r\n ...data,\r\n name: validator.trim(data.name),\r\n description: validator.trim(data.description)\r\n }\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/spcomponent/upsert', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`spComponent.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we decide what kind of message of success we should give\r\n const msg = data.spComponentId === 0 ? t('spComponent.new_message') : t('spComponent.update_message');\r\n\r\n // * hide the modal and refresh the grid\r\n toggleWindow();\r\n Notifications.notify(msg, SUCCESS_NOTIFICATION);\r\n getComponentsList();\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n /**\r\n ** The delete call is handled here\r\n */\r\n const onDelete = async () => {\r\n try {\r\n // * call the api to do the delete\r\n const res = await API.delete(`/spComponent?spComponentId=${componentData.spComponentId}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`spComponent.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('spComponent.delete_message'), SUCCESS_NOTIFICATION);\r\n getComponentsList();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n | {t('spComponent.modal_title')}\r\n
    \r\n
    \r\n
    \r\n {/* modal window */}\r\n {showModal && }\r\n\r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {t('spComponent.delete_body')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n
    \r\n {/* grid */}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\nexport default SPComponent","import React from 'react';\r\nimport { VIEW, UPDATE, DELETE } from '../../assets/Constants/actionsTypes';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { DropDownButton, DropDownButtonItem } from '@progress/kendo-react-buttons';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst PopGroupsGrid = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n return (\r\n <>\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n {/* columns of the grid */}\r\n \r\n \r\n \r\n {/* action column */}\r\n (\r\n \r\n { props.onActionClick(e.item, gridProps.dataItem); }}>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default PopGroupsGrid","import React, { useEffect, createRef, useState } from 'react'\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { NEW, VIEW, UPDATE } from '../../assets/Constants/actionsTypes'\r\nimport { useTranslation } from 'react-i18next';\r\nimport './popGroups.css';\r\nimport {\r\n REF_POPULATION_TOTAL,\r\n REF_POPULATION_LABOUR,\r\n BEN_UNIT_HOUSEHOLDS,\r\n BEN_UNIT_INDIVIDUALS\r\n} from './costants';\r\n\r\nconst PopGroupsModal = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // we create a reference for the modal\r\n const window = createRef();\r\n // this variable allow us know if the save button will be shown or not\r\n const [showSave, setShowSave] = useState(false);\r\n // if is in UPDATE mode\r\n const [isUpdate, setIsUpdate] = useState(false);\r\n // inputs in the modal and its states. Parameters in the api calls\r\n const [name, setName] = useState('');\r\n const [beneficaryUnit, setbeneficaryUnit] = useState(BEN_UNIT_HOUSEHOLDS);\r\n const [initialAgeMale, setInitialAgeMale] = useState('');\r\n const [finalAgeMale, setFinalAgeMale] = useState('');\r\n const [initialAgeFemale, setInitialAgeFemale] = useState('');\r\n const [finalAgeFemale, setFinalAgeFemale] = useState('');\r\n const [ec1Desc, setEC1Desc] = useState('');\r\n const [ec2Desc, setEC2Desc] = useState('');\r\n const [ec3Desc, setEC3Desc] = useState('');\r\n const [ec1HH, setEC1HH] = useState('');\r\n const [ec1Y1, setEC1Y1] = useState('');\r\n const [ec1Y2, setEC1Y2] = useState('');\r\n const [ec2HH, setEC2HH] = useState('');\r\n const [ec2Y1, setEC2Y1] = useState('');\r\n const [ec2Y2, setEC2Y2] = useState('');\r\n const [ec3HH, setEC3HH] = useState('');\r\n const [ec3Y1, setEC3Y1] = useState('');\r\n const [ec3Y2, setEC3Y2] = useState('');\r\n const [selectedRefPopulation, setSelectedRefPopulation] = useState('totalPopulation');\r\n const [selectedSex, setSelectedSex] = useState('0');\r\n /**CONSTANT VARIABLES USED TO FILL UP SELECT ELEMENTS */\r\n //* Reference Population data\r\n const REF_POPULATION_DATA = [\r\n {\r\n id: REF_POPULATION_TOTAL,\r\n value: t('popGroups.refPopTotPopulation')\r\n },\r\n {\r\n id: REF_POPULATION_LABOUR,\r\n value: t('popGroups.refPopLabForce')\r\n }\r\n ];\r\n\r\n // here you define the configuration that the modal will have. this depends on the type with which it was opened.\r\n useEffect(() => {\r\n if (props.type === NEW) {\r\n setShowSave(true);\r\n // Clean and refresh the state of inputs\r\n setName('');\r\n setbeneficaryUnit(BEN_UNIT_HOUSEHOLDS);\r\n setInitialAgeMale('');\r\n setInitialAgeFemale('');\r\n setFinalAgeMale('');\r\n setFinalAgeFemale('');\r\n setEC1Desc('');\r\n setEC1HH('');\r\n setEC1Y1('');\r\n setEC1Y2('');\r\n setEC2Desc('');\r\n setEC2HH('');\r\n setEC2Y1('');\r\n setEC2Y2('');\r\n setEC3Desc('');\r\n setEC3HH('');\r\n setEC3Y1('');\r\n setEC3Y2('');\r\n setSelectedRefPopulation('totalPopulation');\r\n setSelectedSex('0');\r\n } else {\r\n if (props.data) {\r\n //* Setting data\r\n setName(props.data.name);\r\n\r\n setbeneficaryUnit(props.data.beneficiaryUnit);\r\n\r\n setInitialAgeMale(props.data.minAgeMale === null ? '' : props.data.minAgeMale);\r\n setFinalAgeMale(props.data.maxAgeMale === null ? '' : props.data.maxAgeMale);\r\n\r\n setInitialAgeFemale(props.data.minAgeFemale === null ? '' : props.data.minAgeFemale);\r\n setFinalAgeFemale(props.data.maxAgeFemale === null ? '' : props.data.maxAgeFemale);\r\n \r\n setSelectedSex(props.data.sexId.toString());\r\n setSelectedRefPopulation(props.data.refPopId);\r\n\r\n setEC1Desc(props.data.elegibilityCriteria1);\r\n setEC1HH(props.data.elegibilityCriteria1Y0_HH === null ? '' : props.data.elegibilityCriteria1Y0_HH);\r\n setEC1Y1(props.data.sexId === 1 ? props.data.elegibilityCriteria1Y0_Female === null ? '' : props.data.elegibilityCriteria1Y0_Female : props.data.elegibilityCriteria1Y0_Male === null ? '' : props.data.elegibilityCriteria1Y0_Male);\r\n setEC1Y2(props.data.elegibilityCriteria1Y0_Female === null ? '' : props.data.elegibilityCriteria1Y0_Female);\r\n\r\n setEC2Desc(props.data.elegibilityCriteria2 === null ? '' : props.data.elegibilityCriteria2);\r\n setEC2HH(props.data.elegibilityCriteria2Y0_HH === null ? '' : props.data.elegibilityCriteria2Y0_HH);\r\n setEC2Y1(props.data.sexId ===1 ? props.data.elegibilityCriteria2Y0_Female === null ? '' : props.data.elegibilityCriteria2Y0_Female : props.data.elegibilityCriteria2Y0_Male === null ? '' : props.data.elegibilityCriteria2Y0_Male);\r\n setEC2Y2(props.data.elegibilityCriteria2Y0_Female === null ? '' : props.data.elegibilityCriteria2Y0_Female);\r\n\r\n setEC3Desc(props.data.elegibilityCriteria3 === null ? '' : props.data.elegibilityCriteria3);\r\n setEC3HH(props.data.elegibilityCriteria3Y0_HH === null ? '' : props.data.elegibilityCriteria3Y0_HH);\r\n setEC3Y1(props.data.sexId === 1 ? props.data.elegibilityCriteria3Y0_Female === null ? '' : props.data.elegibilityCriteria3Y0_Female : props.data.elegibilityCriteria3Y0_Male === null ? '' : props.data.elegibilityCriteria3Y0_Male);\r\n setEC3Y2(props.data.elegibilityCriteria3Y0_Female === null ? '' : props.data.elegibilityCriteria3Y0_Female);\r\n\r\n if (props.type === VIEW) {\r\n setShowSave(false)\r\n } else {\r\n if (props.type === UPDATE) {\r\n setShowSave(true);\r\n setIsUpdate(true);\r\n }\r\n }\r\n } else {\r\n props.toggleWindow();\r\n }\r\n }\r\n\r\n }, [props])\r\n\r\n // with this we make sure to always hide the maximize and minimize buttons.\r\n useEffect(() => {\r\n if (window) {\r\n hideButtons();\r\n }\r\n })\r\n\r\n // with this we hide the maximize and minimize buttons.\r\n const hideButtons = () => {\r\n let maximizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-maximize\"\r\n ).parentElement;\r\n maximizeButton.style.visibility = \"hidden\";\r\n\r\n let minimizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-minimize\"\r\n ).parentElement;\r\n minimizeButton.style.visibility = \"hidden\";\r\n }\r\n\r\n\r\n const toggleStateEC1 = (e) => {\r\n if (beneficaryUnit === BEN_UNIT_HOUSEHOLDS) {\r\n setEC1HH(e.target.value)\r\n setEC1Y1('')\r\n } else {\r\n setEC1HH('')\r\n setEC1Y1(e.target.value)\r\n }\r\n }\r\n\r\n const toggleStateEC2 = (e) => {\r\n if (beneficaryUnit === BEN_UNIT_HOUSEHOLDS) {\r\n setEC2HH(e.target.value)\r\n setEC2Y1('')\r\n } else {\r\n setEC2HH('')\r\n setEC2Y1(e.target.value)\r\n }\r\n }\r\n\r\n const toggleStateEC3 = (e) => {\r\n if (beneficaryUnit === BEN_UNIT_HOUSEHOLDS) {\r\n setEC3HH(e.target.value)\r\n setEC3Y1('')\r\n } else {\r\n setEC3HH('')\r\n setEC3Y1(e.target.value)\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n props.toggleWindow();\r\n }}\r\n ref={window}\r\n >\r\n
    \r\n {/**Name and Ref. Population row*/}\r\n
    \r\n
    \r\n \r\n setName(e.target.value)}\r\n />\r\n
    \r\n
    \r\n {/**Space between cols*/}\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n {/**Beneficiary Unit and Initial Age - Final Age or Average Size row*/}\r\n
    \r\n
    \r\n \r\n
    \r\n { setbeneficaryUnit(e.target.value) }}\r\n value={BEN_UNIT_HOUSEHOLDS}\r\n checked={beneficaryUnit === BEN_UNIT_HOUSEHOLDS}\r\n disabled={!showSave}\r\n />\r\n \r\n
    \r\n
    \r\n { setbeneficaryUnit(e.target.value) }}\r\n value={BEN_UNIT_INDIVIDUALS}\r\n checked={beneficaryUnit === BEN_UNIT_INDIVIDUALS}\r\n disabled={!showSave}\r\n />\r\n \r\n
    \r\n
    \r\n
    \r\n {/**Space between cols*/}\r\n
    \r\n {beneficaryUnit === BEN_UNIT_HOUSEHOLDS ?\r\n <>\r\n :\r\n <>\r\n
    \r\n \r\n
    \r\n { setSelectedSex(e.target.value) }}\r\n value='0'\r\n checked={selectedSex === '0'}\r\n disabled={!showSave}\r\n />\r\n \r\n
    \r\n
    \r\n { setSelectedSex(e.target.value) }}\r\n value='1'\r\n checked={selectedSex === '1'}\r\n disabled={!showSave}\r\n />\r\n\r\n \r\n
    \r\n
    \r\n { setSelectedSex(e.target.value) }}\r\n value='2'\r\n checked={selectedSex === '2'}\r\n disabled={!showSave}\r\n />\r\n \r\n
    \r\n
    \r\n \r\n }\r\n
    \r\n {/**Sex row*/}\r\n {beneficaryUnit === BEN_UNIT_INDIVIDUALS ?\r\n
    \r\n {/**Sex and Ages titles row*/}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {/**Sex selection row */}\r\n
    \r\n
    \r\n {selectedSex === '2' ?\r\n <>\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { setInitialAgeMale(e.target.value) }}\r\n placeholder={t('modals.sex_m')}\r\n disabled={!showSave}\r\n value={initialAgeMale}\r\n />\r\n
    \r\n
    \r\n { setFinalAgeMale(e.target.value) }}\r\n placeholder={t('modals.sex_m')}\r\n disabled={!showSave}\r\n value={finalAgeMale}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { setInitialAgeFemale(e.target.value) }}\r\n placeholder={t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={initialAgeFemale}\r\n />\r\n
    \r\n
    \r\n { setFinalAgeFemale(e.target.value) }}\r\n placeholder={t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={finalAgeFemale}\r\n />\r\n
    \r\n
    \r\n \r\n :\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { selectedSex === '0' ? setInitialAgeMale(e.target.value) : setInitialAgeFemale(e.target.value) }}\r\n placeholder={selectedSex === '0' ? t('modals.sex_m') : t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={selectedSex === '0' ? initialAgeMale : initialAgeFemale}\r\n />\r\n
    \r\n
    \r\n { selectedSex === '0' ? setFinalAgeMale(e.target.value) : setFinalAgeFemale(e.target.value) }}\r\n placeholder={selectedSex === '0' ? t('modals.sex_m') : t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={selectedSex === '0' ? finalAgeMale : finalAgeFemale}\r\n />\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n :\r\n <>\r\n }\r\n {/**Elegibility Criteria title row*/}\r\n
    \r\n
    \r\n \r\n
    \r\n {beneficaryUnit === BEN_UNIT_HOUSEHOLDS ?\r\n <>\r\n
    \r\n \r\n
    \r\n \r\n :\r\n selectedSex ==='2' ?\r\n <>\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n :\r\n <>\r\n
    \r\n \r\n
    \r\n \r\n }\r\n
    \r\n {/**Elegibility Criteria 1 and its year 0 row*/}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { setEC1Desc(e.target.value) }}\r\n placeholder={t('popGroups.dsc_ipt')}\r\n disabled={!showSave}\r\n value={ec1Desc}\r\n />\r\n
    \r\n
    \r\n { toggleStateEC1(e) }}\r\n placeholder={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? t('popGroups.y0_ipt') : selectedSex === '1' ? t('modals.sex_f') : t('modals.sex_m')}\r\n disabled={!showSave}\r\n value={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? ec1HH : ec1Y1}\r\n />\r\n
    \r\n {(beneficaryUnit === BEN_UNIT_HOUSEHOLDS || selectedSex === '0' || selectedSex === '1') ?\r\n <>\r\n :\r\n
    \r\n { setEC1Y2(e.target.value) }}\r\n placeholder={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? t('popGroups.y0_ipt') : selectedSex === '0' ? t('modals.sex_m') : t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={ec1Y2}\r\n />\r\n
    \r\n }\r\n
    \r\n {/**Elegibility Criteria 2 and its year 0 row*/}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { setEC2Desc(e.target.value) }}\r\n placeholder={t('popGroups.dsc_ipt')}\r\n disabled={!showSave}\r\n value={ec2Desc}\r\n />\r\n
    \r\n
    \r\n { toggleStateEC2(e) }}\r\n placeholder={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? t('popGroups.y0_ipt') : selectedSex === '1' ? t('modals.sex_f') : t('modals.sex_m')}\r\n disabled={!showSave}\r\n value={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? ec2HH : ec2Y1}\r\n />\r\n
    \r\n {(beneficaryUnit === BEN_UNIT_HOUSEHOLDS || selectedSex === '0' || selectedSex === '1') ?\r\n <>\r\n :\r\n
    \r\n { setEC2Y2(e.target.value) }}\r\n placeholder={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? t('popGroups.y0_ipt') : selectedSex === '0' ? t('modals.sex_m') : t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={ec2Y2}\r\n />\r\n
    \r\n }\r\n
    \r\n {/**Elegibility Criteria 3 and its year 0 row*/}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { setEC3Desc(e.target.value) }}\r\n placeholder={t('popGroups.dsc_ipt')}\r\n disabled={!showSave}\r\n value={ec3Desc}\r\n />\r\n
    \r\n
    \r\n { toggleStateEC3(e) }}\r\n placeholder={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? t('popGroups.y0_ipt') : selectedSex === '1' ? t('modals.sex_f') : t('modals.sex_m')}\r\n disabled={!showSave}\r\n value={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? ec3HH : ec3Y1}\r\n />\r\n
    \r\n {(beneficaryUnit === BEN_UNIT_HOUSEHOLDS || selectedSex === '0' || selectedSex === '1') ?\r\n <>\r\n :\r\n
    \r\n { setEC3Y2(e.target.value) }}\r\n placeholder={beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? t('popGroups.y0_ipt') : selectedSex === '0' ? t('modals.sex_m') : t('modals.sex_f')}\r\n disabled={!showSave}\r\n value={ec3Y2}\r\n />\r\n
    \r\n }\r\n
    \r\n \r\n {showSave &&\r\n {\r\n const data = {\r\n popGroupId: isUpdate ? props.data.popGroupId : 0,\r\n name,\r\n selectedRefPopulation,\r\n beneficaryUnit,\r\n initialAgeMale: beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? '' : parseInt(initialAgeMale, 10),\r\n finalAgeMale: beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? '' : parseInt(finalAgeMale, 10),\r\n initialAgeFemale: beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? '' : parseInt(initialAgeFemale, 10),\r\n finalAgeFemale: beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? '' : parseInt(finalAgeFemale, 10),\r\n selectedSex: beneficaryUnit === BEN_UNIT_HOUSEHOLDS ? -1 : parseInt(selectedSex, 10),\r\n ec1Desc,\r\n ec1HH: ec1HH === null ? '' : ec1HH,\r\n ec1Y1: ec1Y1 === null ? '' : ec1Y1,\r\n ec1Y2: ec1Y2 === null ? '' : ec1Y2,\r\n ec2Desc,\r\n ec2HH: ec2HH === null ? '' : ec2HH,\r\n ec2Y1: ec2Y1 === null ? '' : ec2Y1,\r\n ec2Y2: ec2Y2 === null ? '' : ec2Y2,\r\n ec3Desc,\r\n ec3HH: ec3HH === null ? '' : ec3HH,\r\n ec3Y1: ec3Y1 === null ? '' : ec3Y1,\r\n ec3Y2: ec3Y2 === null ? '' : ec3Y2\r\n }\r\n props.onSave(data)\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >\r\n {t('modals.save_btn')}\r\n \r\n }\r\n\r\n \r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default PopGroupsModal","import React, { useState, useEffect, useContext } from 'react'\r\n\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\n\r\nimport PopGroupsGrid from './popGroupsGrid';\r\nimport PopGroupsModal from './popGroupsModal';\r\n\r\nimport { VIEW, UPDATE, DELETE, NEW } from '../../assets/Constants/actionsTypes';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { BEN_UNIT_HOUSEHOLDS } from './costants';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport API from \"../../services/api\";\r\nimport validator from 'validator';\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\nconst PopGroups = () => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // Modal Window type = DELETE, NEW, VIEW or UPDATE\r\n const [viewType, setViewType] = useState('');\r\n // Single component\r\n const [popGroupData, setpopGroupData] = useState({});\r\n /**State of the modal window. True = showing ... False = hidden */\r\n const [showModal, setShowModal] = useState(false);\r\n /** State of the dialog. True = showing ... False = hidden */\r\n const [showAlert, setShowAlert] = useState(false);\r\n // List of groups. See useEffect\r\n const [groupsList, setGroupsList] = useState([]);\r\n // Session context to get the current institution data\r\n const { get_currentInstitution } = useContext(AuthContext);\r\n\r\n // we use useEffect to call the function that fills the grid\r\n useEffect(() => {\r\n getPopGroupsList();\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n\r\n // Function that updates the groupsList variable in the state. This list will be used to fill the grid\r\n const getPopGroupsList = async () => {\r\n setGroupsList([]);\r\n try {\r\n // data from API\r\n const response = await API.get(`/populationgroups/getAll?institutionId=${get_currentInstitution().catInstitutionId}`);\r\n // Changing References population and sex ID to value. This value will appear in the grid\r\n response.data.data.forEach((element) => {\r\n // Ex: totalPopulation comes from DB, here we chaange that by Total population\r\n const refpopulation = t(`referencePopMatrixCode.${element.referencePopMatrixCode}`);\r\n // to show in \"View-Update\" modal\r\n element.refPopId = element.referencePopMatrixCode;\r\n // To show in grid\r\n element.referencePopMatrixCode = refpopulation;\r\n // Sex changing value\r\n if (element.includedFemales && !element.includedMales) {\r\n element.sex = t('modals.sex_f'); // to show in grid\r\n element.sexId = 1; // to show in \"View-Update\" modal\r\n } else if (!element.includedFemales && element.includedMales) {\r\n element.sex = t('modals.sex_m'); // to show in grid\r\n element.sexId = 0; // to show in \"View-Update\" modal\r\n } else {\r\n element.sex = t('modals.sex_b'); // to show in grid\r\n element.sexId = 2; // to show in \"View-Update\" modal\r\n }\r\n // Elegibility Criteria concatenation to show on grid\r\n const ec2 = element.elegibilityCriteria2 === null ? '' : element.elegibilityCriteria2 + ', ';\r\n const ec3 = element.elegibilityCriteria3 === null ? '' : element.elegibilityCriteria3\r\n if (ec2 === '' && ec3 === '')\r\n element.ecTotal = `${element.elegibilityCriteria1}`\r\n else\r\n element.ecTotal = `${element.elegibilityCriteria1}, ${ec2} ${ec3}`\r\n });\r\n setGroupsList(response.data.data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // Triggered when the user clicks an action in the grid. Opens the modal window according to the selection\r\n const onActionClick = (actionItem, dataItme) => {\r\n const action = actionItem.value;\r\n setViewType(action);\r\n setpopGroupData(dataItme);\r\n\r\n switch (action) {\r\n case NEW:\r\n toggleWindow();\r\n break;\r\n case VIEW:\r\n toggleWindow();\r\n break;\r\n case UPDATE:\r\n toggleWindow();\r\n break;\r\n case DELETE:\r\n toggleAlert();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n // Show or hide the modal window. See state variable\r\n const toggleWindow = () => {\r\n setShowModal(!showModal);\r\n }\r\n\r\n // Show or hide the alert dialog. See state variable\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n // The upsert call is handled here\r\n const onSave = async (data) => {\r\n try {\r\n // Validations\r\n // * Name Validation\r\n if (validator.isEmpty(data.name)) {\r\n Notifications.notify(t('popGroups.name_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * HouseHolds validations\r\n if (data.beneficaryUnit === BEN_UNIT_HOUSEHOLDS) {\r\n // * Elegibility Criteria 1 validations\r\n if (validator.isEmpty(data.ec1Desc) || validator.isEmpty(data.ec1HH.toString())) {\r\n Notifications.notify(t('popGroups.eC1_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec1Desc) && !validator.isFloat(data.ec1HH.toString())) {\r\n Notifications.notify(t('popGroups.ec1_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec1HH < 0 || data.ec1HH > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 2 validations\r\n if (!validator.isEmpty(data.ec2Desc) && validator.isEmpty(data.ec2HH.toString())) {\r\n Notifications.notify(t('popGroups.ec2_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec2Desc) && !validator.isFloat(data.ec2HH.toString())) {\r\n Notifications.notify(t('popGroups.ec2_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec2HH < 0 || data.ec2HH > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec2Desc) && !validator.isEmpty(data.ec2HH.toString())) {\r\n Notifications.notify(t('popGroups.ec2_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 3 validations\r\n if (!validator.isEmpty(data.ec3Desc) && validator.isEmpty(data.ec3HH.toString())) {\r\n Notifications.notify(t('popGroups.ec3_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec3Desc) && !validator.isFloat(data.ec3HH.toString())) {\r\n Notifications.notify(t('popGroups.ec3_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec3HH < 0 || data.ec3HH > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec3Desc) && !validator.isEmpty(data.ec3HH.toString())) {\r\n Notifications.notify(t('popGroups.ec3_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n } else {\r\n if (data.selectedSex === 0) {\r\n // * Male validations\r\n if (validator.isEmpty(data.initialAgeMale.toString()) || validator.isEmpty(data.finalAgeMale.toString())) {\r\n Notifications.notify(t('popGroups.ages_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isFloat(data.initialAgeMale.toString()) || !validator.isFloat(data.finalAgeMale.toString())) {\r\n Notifications.notify(t('popGroups.ages_number'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // Ages range\r\n if((data.initialAgeMale < 0 || data.initialAgeMale > 100) \r\n || (data.finalAgeMale < 0 || data.finalAgeMale > 100)){\r\n Notifications.notify(t('popGroups.ages_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // Age correct\r\n if(data.initialAgeMale > data.finalAgeMale) {\r\n Notifications.notify(t('popGroups.ages_correct_format'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * Elegibility Criteria 1 validations\r\n if (validator.isEmpty(data.ec1Desc) || validator.isEmpty(data.ec1Y1.toString())) {\r\n Notifications.notify(t('popGroups.eC1_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec1Desc) && !validator.isFloat(data.ec1Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec1_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec1Y1 < 0 || data.ec1Y1 > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 2 validations\r\n if (!validator.isEmpty(data.ec2Desc) && validator.isEmpty(data.ec2Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec2_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec2Desc) && !validator.isFloat(data.ec2Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec2_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec2Y1 < 0 || data.ec2Y1 > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec2Desc) && !validator.isEmpty(data.ec2Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec2_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 3 validations\r\n if (!validator.isEmpty(data.ec3Desc) && validator.isEmpty(data.ec3Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec3_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec3Desc) && !validator.isFloat(data.ec3Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec3_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec3Y1 < 0 || data.ec3Y1 > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec3Desc) && !validator.isEmpty(data.ec3Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec3_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n } else if (data.selectedSex === 1) {\r\n // * Male validations\r\n if (validator.isEmpty(data.initialAgeFemale.toString()) || validator.isEmpty(data.finalAgeFemale.toString())) {\r\n Notifications.notify(t('popGroups.ages_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isFloat(data.initialAgeFemale.toString()) || !validator.isFloat(data.finalAgeFemale.toString())) {\r\n Notifications.notify(t('popGroups.ages_number'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // Ages range\r\n if((data.initialAgeFemale < 0 || data.initialAgeFemale > 100) \r\n || (data.finalAgeFemale < 0 || data.finalAgeFemale > 100)){\r\n Notifications.notify(t('popGroups.ages_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // Ages correct\r\n if(data.initialAgeFemale > data.finalAgeFemale) {\r\n Notifications.notify(t('popGroups.ages_correct_format'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * Elegibility Criteria 1 validations\r\n if (validator.isEmpty(data.ec1Desc) || validator.isEmpty(data.ec1Y1.toString())) {\r\n Notifications.notify(t('popGroups.eC1_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec1Desc) && !validator.isFloat(data.ec1Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec1_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec1Y1 < 0 || data.ec1Y1 > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 2 validations\r\n if (!validator.isEmpty(data.ec2Desc) && validator.isEmpty(data.ec2Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec2_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec2Desc) && !validator.isFloat(data.ec2Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec2_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec2Y1 < 0 || data.ec2Y1 > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec2Desc) && !validator.isEmpty(data.ec2Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec2_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 3 validations\r\n if (!validator.isEmpty(data.ec3Desc) && validator.isEmpty(data.ec3Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec3_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec3Desc) && !validator.isFloat(data.ec3Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec3_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (data.ec3Y1 < 0 || data.ec3Y1 > 1) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec3Desc) && !validator.isEmpty(data.ec3Y1.toString())) {\r\n Notifications.notify(t('popGroups.ec3_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n } else if (data.selectedSex === 2) {\r\n // * Male validations\r\n if (validator.isEmpty(data.initialAgeFemale.toString()) || validator.isEmpty(data.finalAgeFemale.toString()) || validator.isEmpty(data.initialAgeMale.toString()) || validator.isEmpty(data.finalAgeMale.toString())) {\r\n Notifications.notify(t('popGroups.ages_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isFloat(data.initialAgeFemale.toString()) || !validator.isFloat(data.finalAgeFemale.toString()) || !validator.isFloat(data.initialAgeMale.toString()) || !validator.isFloat(data.finalAgeMale.toString())) {\r\n Notifications.notify(t('popGroups.ages_number'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n if((data.initialAgeFemale < 0 || data.initialAgeFemale > 100) \r\n || (data.finalAgeFemale < 0 || data.finalAgeFemale > 100)){\r\n Notifications.notify(t('popGroups.ages_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n if((data.initialAgeMale < 0 || data.initialAgeMale > 100) \r\n || (data.finalAgeMale < 0 || data.finalAgeMale > 100)){\r\n Notifications.notify(t('popGroups.ages_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // Ages correct\r\n if(data.initialAgeFemale > data.finalAgeFemale) {\r\n Notifications.notify(t('popGroups.ages_correct_format'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n if(data.initialAgeMale > data.finalAgeMale) {\r\n Notifications.notify(t('popGroups.ages_correct_format'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * Elegibility Criteria 1 validations\r\n if (validator.isEmpty(data.ec1Desc) || validator.isEmpty(data.ec1Y1.toString()) || validator.isEmpty(data.ec1Y2.toString())) {\r\n Notifications.notify(t('popGroups.eC1_required'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec1Desc) && (!validator.isFloat(data.ec1Y1.toString()) || !validator.isFloat(data.ec1Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec1_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if ((data.ec1Y1 < 0 || data.ec1Y1 > 1) || (data.ec1Y2 < 0 || data.ec1Y2 > 1)) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 2 validations\r\n if (!validator.isEmpty(data.ec2Desc) && (validator.isEmpty(data.ec2Y1.toString()) || validator.isEmpty(data.ec2Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec2_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec2Desc) && (!validator.isFloat(data.ec2Y1.toString()) || !validator.isFloat(data.ec2Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec2_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if ((data.ec2Y1 < 0 || data.ec2Y1 > 1) || (data.ec2Y2 < 0 || data.ec2Y2 > 1)) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec2Desc) && (!validator.isEmpty(data.ec2Y1.toString()) || !validator.isEmpty(data.ec2Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec2_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * Elegibility Criteria 3 validations\r\n if (!validator.isEmpty(data.ec3Desc) && (validator.isEmpty(data.ec3Y1.toString()) || validator.isEmpty(data.ec3Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec3_no_y0'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (!validator.isEmpty(data.ec3Desc) && (!validator.isFloat(data.ec3Y1.toString()) || !validator.isFloat(data.ec3Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec3_y1_number'), ERROR_NOTIFICATION);\r\n return;\r\n } else if ((data.ec3Y1 < 0 || data.ec3Y1 > 1) || (data.ec3Y2 < 0 || data.ec3Y2 > 1)) {\r\n Notifications.notify(t('popGroups.yearZero_range'), ERROR_NOTIFICATION);\r\n return;\r\n } else if (validator.isEmpty(data.ec3Desc) && (!validator.isEmpty(data.ec3Y1.toString()) || !validator.isEmpty(data.ec3Y2.toString()))) {\r\n Notifications.notify(t('popGroups.ec3_required'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // Variables to set the value of selectedSex according to API \r\n let selectedFemale = true;\r\n let selectedMale = true;\r\n // Variables to set the female value\r\n let femEC1 = null;\r\n let femEC2 = null;\r\n let femEC3 = null;\r\n\r\n // * Sex selection\r\n if (data.selectedSex === 0) {\r\n // Selected => Male\r\n selectedFemale = false;\r\n selectedMale = true;\r\n } else if (data.selectedSex === 1) {\r\n // Selected => Female\r\n selectedFemale = true;\r\n selectedMale = false;\r\n\r\n // toggle value\r\n femEC1 = validator.isEmpty(data.ec1Y1.toString()) ? null : data.ec1Y1;\r\n femEC2 = validator.isEmpty(data.ec2Y1.toString()) ? null : data.ec2Y1;\r\n femEC3 = validator.isEmpty(data.ec3Y1.toString()) ? null : data.ec3Y1;\r\n\r\n } else if (data.selectedSex === 2) {\r\n // Selected => Both\r\n selectedFemale = true;\r\n selectedMale = true;\r\n } else {\r\n // Selected => HOUSEHOLDS\r\n selectedFemale = false;\r\n selectedMale = false;\r\n }\r\n\r\n //* Setting data in the correct format to sent via API\r\n //* Important: There are no problems with null values because the DB supports them \r\n //* and the model in C# has the value types as nulleables \r\n data = {\r\n popGroupId: data.popGroupId,\r\n institutionId: get_currentInstitution().catInstitutionId,\r\n name: validator.trim(data.name),\r\n includedFemales: selectedFemale,\r\n includedMales: selectedMale,\r\n referencePopMatrixCode: data.selectedRefPopulation,\r\n beneficiaryUnit: data.beneficaryUnit,\r\n minAgeMale: validator.isEmpty(data.initialAgeMale.toString()) ? null : data.initialAgeMale,\r\n maxAgeMale: validator.isEmpty(data.finalAgeMale.toString()) ? null : data.finalAgeMale,\r\n minAgeFemale: validator.isEmpty(data.initialAgeFemale.toString()) ? null : data.initialAgeFemale,\r\n maxAgeFemale: validator.isEmpty(data.finalAgeFemale.toString()) ? null : data.finalAgeFemale,\r\n\r\n elegibilityCriteria1: validator.trim(data.ec1Desc),\r\n elegibilityCriteria1Y0_HH: validator.isEmpty(data.ec1HH.toString()) ? null : data.ec1HH,\r\n elegibilityCriteria1Y0_Male: data.selectedSex === 1 ? null : validator.isEmpty(data.ec1Y1.toString()) ? null : data.ec1Y1,\r\n elegibilityCriteria1Y0_Female: data.selectedSex === 1 ? femEC1 : validator.isEmpty(data.ec1Y2.toString()) ? null : data.ec1Y2,\r\n\r\n elegibilityCriteria2: validator.isEmpty(data.ec2Desc) ? null : validator.trim(data.ec2Desc),\r\n elegibilityCriteria2Y0_HH: validator.isEmpty(data.ec2HH.toString()) ? null : data.ec2HH,\r\n elegibilityCriteria2Y0_Male: data.selectedSex === 1 ? null : validator.isEmpty(data.ec2Y1.toString()) ? null : data.ec2Y1,\r\n elegibilityCriteria2Y0_Female: data.selectedSex === 1 ? femEC2 : validator.isEmpty(data.ec2Y2.toString()) ? null : data.ec2Y2,\r\n\r\n elegibilityCriteria3: validator.isEmpty(data.ec3Desc) ? null : validator.trim(data.ec3Desc),\r\n elegibilityCriteria3Y0_HH: validator.isEmpty(data.ec3HH.toString()) ? null : data.ec3HH,\r\n elegibilityCriteria3Y0_Male: data.selectedSex === 1 ? null : validator.isEmpty(data.ec3Y1.toString()) ? null : data.ec3Y1,\r\n elegibilityCriteria3Y0_Female: data.selectedSex === 1 ? femEC3 : validator.isEmpty(data.ec3Y2.toString()) ? null : data.ec3Y2\r\n }\r\n\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/populationgroups/upsert', data);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`popGroups.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we decide what kind of message of success we should give\r\n const msg = data.popGroupId === 0 ? t('popGroups.new_message') : t('popGroups.update_message');\r\n\r\n // * hide the modal, shows success message and refresh the grid\r\n toggleWindow();\r\n Notifications.notify(msg, SUCCESS_NOTIFICATION);\r\n getPopGroupsList();\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n //* When user clicks ok in delete modal\r\n const onDelete = async () => {\r\n try {\r\n // * call the api to do the delete\r\n const res = await API.delete(`/populationgroups?popGroupId=${popGroupData.popGroupId}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`popGroups.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('popGroups.delete_message'), SUCCESS_NOTIFICATION);\r\n getPopGroupsList();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n | {t('popGroups.modalTitle')}\r\n
    \r\n
    \r\n
    \r\n {/* modal window */}\r\n {showModal && }\r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {t('popGroups.delete_body')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n {/* Grid */}\r\n
    \r\n {/* grid */}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\n\r\nexport default PopGroups","import React from 'react'\r\nimport { VIEW, UPDATE, DELETE } from '../../assets/Constants/actionsTypes';\r\nimport { Grid, GridColumn as Column, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { DropDownButton, DropDownButtonItem } from '@progress/kendo-react-buttons';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst BenefitGrid = (props) => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n return (\r\n <>\r\n \r\n {/* this is the message when there are no records */}\r\n {t('grids.no_records')}\r\n\r\n {/* columns of the grid */}\r\n \r\n {\r\n const item = gridProps.dataItem;\r\n return (\r\n \r\n {item.spFunctionId ? item.spFunctionName : 'No selected'}\r\n \r\n )\r\n }}\r\n />\r\n {\r\n const item = gridProps.dataItem;\r\n return (\r\n \r\n {item.creationYear ? item.creationYear : ''}\r\n \r\n )\r\n }}\r\n />\r\n\r\n {\r\n const item = gridProps.dataItem;\r\n return (\r\n \r\n {item.adminInstitution ? item.adminInstitution : ''}\r\n \r\n )\r\n }}\r\n />\r\n\r\n {/* action column */}\r\n (\r\n \r\n { props.onActionClick(e.item, gridProps.dataItem); }}>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default BenefitGrid\r\n","export const BENEFFICIARY_UNIT = [\r\n {\r\n label: 'individual_label',\r\n value: 'i'\r\n },\r\n {\r\n label: 'household_label',\r\n value: 'h'\r\n }\r\n]\r\n\r\nexport const CASH_OR_KIND = [\r\n {\r\n label: 'cash_label',\r\n value: 'c'\r\n },\r\n {\r\n label: 'kind_label',\r\n value: 'k'\r\n }\r\n]\r\n\r\n\r\nexport const EXIST_BENEFIT = [\r\n {\r\n label: 'yes_label',\r\n value: true\r\n },\r\n {\r\n label: 'no_label',\r\n value: false\r\n }\r\n]\r\n\r\nexport const PERMANENT_OR_TEMPORAL = [\r\n {\r\n label: 'permanent_label',\r\n value: 'p'\r\n },\r\n {\r\n label: 'temporal_label',\r\n value: 't'\r\n }\r\n]\r\n\r\nexport const FINANCING_SOURCE = [\r\n {\r\n label: 'taxes_label',\r\n value: 'taxes'\r\n },\r\n {\r\n label: 'contributions_label',\r\n value: 'contributions'\r\n },\r\n {\r\n label: 'external_label',\r\n value: 'external'\r\n },\r\n {\r\n label: 'mixt_label',\r\n value: 'mixt'\r\n }\r\n]\r\n","import React, { useEffect, createRef, useState } from 'react';\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { NEW, VIEW, UPDATE } from '../../assets/Constants/actionsTypes';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { /*BENEFFICIARY_UNIT,*/ CASH_OR_KIND, EXIST_BENEFIT, PERMANENT_OR_TEMPORAL, FINANCING_SOURCE } from '../../assets/Constants/enums';\r\n\r\nimport validator from 'validator';\r\n\r\nconst BenefitModal = (props) => {\r\n\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n // we create a reference for the modal\r\n const window = createRef();\r\n\r\n const [spFunctionId, setspFunctionId] = useState('');\r\n const [spComponentId, setspComponentId] = useState('');\r\n const [spGuaranteeId, setspGuaranteeId] = useState('');\r\n const [name, setname] = useState('');\r\n const [creationYear, setcreationYear] = useState(0);\r\n // const [beneficiaryUnit, setbeneficiaryUnit] = useState(BENEFFICIARY_UNIT[0].value);\r\n const [cashOrKind, setcashOrKind] = useState(CASH_OR_KIND[0].value);\r\n const [isExistingBenefit, setisExistingBenefit] = useState(EXIST_BENEFIT[0].value);\r\n const [permanentOrTemporal, setpermanentOrTemporal] = useState(PERMANENT_OR_TEMPORAL[0].value);\r\n const [schemeName, setschemeName] = useState('');\r\n const [financingSource, setfinancingSource] = useState(FINANCING_SOURCE[0].value);\r\n const [adminInstitution, setadminInstitution] = useState('');\r\n const [responsibleBody, setresponsibleBody] = useState('');\r\n const [description, setdescription] = useState('');\r\n const [legalFramework, setlegalFramework] = useState('');\r\n\r\n\r\n // this variable allow us know if the save button will be shown or not\r\n const [showSave, setShowSave] = useState(false);\r\n // if is in UPDATE mode\r\n const [isUpdate, setIsUpdate] = useState(false);\r\n\r\n // here you define the configuration that the modal will have. this depends on the type with which it was opened.\r\n useEffect(() => {\r\n setspFunctionId(Array.isArray(props.spFunctionList) && props.spFunctionList.length ? props.spFunctionList[0].spFunctionId : '');\r\n setspComponentId(Array.isArray(props.spComponentList) && props.spComponentList.length ? props.spComponentList[0].spComponentId : '');\r\n setspGuaranteeId(Array.isArray(props.spGuaranteeList) && props.spGuaranteeList.length ? props.spGuaranteeList[0].spGuaranteeId : '');\r\n if (props.type === NEW) {\r\n setShowSave(true);\r\n setname('');\r\n setcreationYear('');\r\n // setbeneficiaryUnit(BENEFFICIARY_UNIT[0].value);\r\n setcashOrKind(CASH_OR_KIND[0].value);\r\n setisExistingBenefit(EXIST_BENEFIT[0].value);\r\n setpermanentOrTemporal(PERMANENT_OR_TEMPORAL[0].value);\r\n setfinancingSource(FINANCING_SOURCE[0].value);\r\n setschemeName('');\r\n setadminInstitution('');\r\n setresponsibleBody('');\r\n setdescription('');\r\n setlegalFramework('');\r\n\r\n\r\n\r\n } else {\r\n if (props.data) {\r\n setspFunctionId(props.data.spFunctionId);\r\n setspComponentId(props.data.spComponentId);\r\n setspGuaranteeId(props.data.spGuaranteeId);\r\n setname(props.data.name);\r\n setcreationYear(props.data.creationYear);\r\n // setbeneficiaryUnit(props.data.beneficiaryUnit);\r\n setcashOrKind(props.data.cashOrKind);\r\n setisExistingBenefit(props.data.isExistingBenefit);\r\n setpermanentOrTemporal(props.data.permanentOrTemporal);\r\n setfinancingSource(props.data.financingSource);\r\n setschemeName(props.data.schemeName);\r\n setadminInstitution(props.data.adminInstitution);\r\n setresponsibleBody(props.data.responsibleBody);\r\n setdescription(props.data.description);\r\n setlegalFramework(props.data.legalFramework);\r\n if (props.type === VIEW) {\r\n setShowSave(false);\r\n } else {\r\n if (props.type === UPDATE) {\r\n setShowSave(true);\r\n setIsUpdate(true);\r\n }\r\n }\r\n } else {\r\n props.toggleWindow();\r\n }\r\n }\r\n\r\n }, [props]);\r\n\r\n // with this we make sure to always hide the maximize and minimize buttons.\r\n useEffect(() => {\r\n if (window) {\r\n hideButtons();\r\n }\r\n })\r\n\r\n const hideButtons = () => {\r\n let maximizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-maximize\"\r\n ).parentElement;\r\n maximizeButton.style.visibility = \"hidden\";\r\n\r\n let minimizeButton = window.current.windowElement.querySelector(\r\n \".k-i-window-minimize\"\r\n ).parentElement;\r\n minimizeButton.style.visibility = \"hidden\";\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n props.toggleWindow();\r\n }}\r\n ref={window}\r\n >\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n setname(e.target.value)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setcreationYear((validator.isNumeric(e.target.value) && parseInt(e.target.value) > 0) || validator.isEmpty(e.target.value) ? e.target.value : creationYear)}\r\n />\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n \r\n { setspGuaranteeId(e.target.value) }}\r\n disabled={!showSave || isUpdate}\r\n className=\"form-control ilo-input ilo-modal-input\"\r\n >\r\n {\r\n Array.isArray(props.spGuaranteeList) && props.spGuaranteeList.length ?\r\n props.spGuaranteeList.map((guarantee) => {\r\n return (\r\n \r\n );\r\n }) :\r\n \r\n }\r\n \r\n
    \r\n\r\n
    \r\n \r\n { setspFunctionId(e.target.value) }}\r\n disabled={!showSave || isUpdate}\r\n className=\"form-control ilo-input ilo-modal-input\"\r\n >\r\n {\r\n Array.isArray(props.spFunctionList) && props.spFunctionList.length ?\r\n props.spFunctionList.map((spfunction) => {\r\n return (\r\n \r\n );\r\n }) :\r\n \r\n }\r\n \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n \r\n { setspComponentId(e.target.value) }}\r\n disabled={!showSave || isUpdate}\r\n className=\"form-control ilo-input ilo-modal-input\"\r\n >\r\n {Array.isArray(props.spComponentList) && props.spComponentList.length ?\r\n props.spComponentList.map((spcomponent) => {\r\n return (\r\n \r\n );\r\n }) :\r\n \r\n }\r\n \r\n
    \r\n\r\n
    \r\n \r\n {\r\n CASH_OR_KIND.map((option, i) => {\r\n return (\r\n
    \r\n { setcashOrKind(e.target.value) }}\r\n value={option.value}\r\n checked={cashOrKind === option.value}\r\n disabled={!showSave}\r\n />\r\n \r\n
    \r\n )\r\n })\r\n }\r\n
    \r\n \r\n
    \r\n\r\n {/*
    \r\n
    \r\n \r\n {\r\n BENEFFICIARY_UNIT.map((b, i) => {\r\n return (\r\n
    \r\n { setbeneficiaryUnit(e.target.value) }}\r\n value={b.value}\r\n checked={beneficiaryUnit === b.value}\r\n disabled={!showSave || isUpdate}\r\n />\r\n \r\n
    \r\n )\r\n })\r\n }\r\n
    \r\n
    */}\r\n\r\n
    \r\n\r\n
    \r\n \r\n { setisExistingBenefit(e.target.value) }}\r\n disabled={!showSave}\r\n className=\"form-control ilo-input ilo-modal-input\"\r\n >\r\n {EXIST_BENEFIT.map((option, i) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n\r\n
    \r\n\r\n
    \r\n \r\n { setpermanentOrTemporal(e.target.value) }}\r\n disabled={!showSave}\r\n className=\"form-control ilo-input ilo-modal-input\"\r\n >\r\n {PERMANENT_OR_TEMPORAL.map((option, i) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n \r\n setschemeName(e.target.value)}\r\n />\r\n\r\n
    \r\n\r\n
    \r\n \r\n { setfinancingSource(e.target.value) }}\r\n disabled={!showSave}\r\n className=\"form-control ilo-input ilo-modal-input\"\r\n >\r\n {FINANCING_SOURCE.map((option, i) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n \r\n setadminInstitution(e.target.value)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setresponsibleBody(e.target.value)}\r\n />\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n \r\n setdescription(e.target.value)}\r\n >\r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n setlegalFramework(e.target.value)}\r\n >\r\n
    \r\n\r\n
    \r\n\r\n\r\n\r\n \r\n {showSave &&\r\n {\r\n const data = {\r\n benefitId: isUpdate ? props.data.benefitId : 0,\r\n spFunctionId: parseInt(spFunctionId, 10),\r\n spComponentId: parseInt(spComponentId, 10),\r\n spGuaranteeId: parseInt(spGuaranteeId, 10),\r\n name,\r\n creationYear: parseInt(creationYear, 10),\r\n // beneficiaryUnit,\r\n cashOrKind,\r\n isExistingBenefit: String(isExistingBenefit) === \"true\" ? true : false,\r\n permanentOrTemporal,\r\n schemeName,\r\n financingSource,\r\n adminInstitution,\r\n responsibleBody,\r\n description,\r\n legalFramework,\r\n }\r\n props.onSave(data);\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('modals.save_btn')}\r\n }\r\n\r\n \r\n \r\n
    \r\n \r\n
    \r\n )\r\n}\r\n\r\n\r\nexport default BenefitModal\r\n","import validator from \"validator\";\r\n\r\n\r\n\r\nexport const validate_benefit = (data, t) => {\r\n if (\r\n validator.isEmpty(data.name) ||\r\n Number.isNaN(data.creationYear) ||\r\n Number.isNaN(data.spComponentId) ||\r\n Number.isNaN(data.spFunctionId) ||\r\n Number.isNaN(data.spGuaranteeId)\r\n ) {\r\n return t('benefit.input_required');\r\n }\r\n return '';\r\n}\r\n\r\nexport const clean_benefit = (data) => {\r\n return {\r\n ...data,\r\n name: validator.trim(data.name),\r\n adminInstitution: validator.trim(data.adminInstitution),\r\n schemeName: validator.trim(data.schemeName),\r\n responsibleBody: validator.trim(data.responsibleBody),\r\n description: validator.trim(data.description),\r\n legalFramework: validator.trim(data.legalFramework),\r\n }\r\n}","import React, { useEffect, useState, useContext } from 'react';\r\n\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\n\r\nimport BenefitGrid from './benefitGrid';\r\nimport BenefitModal from './benefitModal';\r\n\r\nimport { VIEW, UPDATE, DELETE, NEW } from '../../assets/Constants/actionsTypes';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport API from \"../../services/api\";\r\n\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\nimport { validate_benefit, clean_benefit } from './benefit_cleanAndValidate';\r\n\r\nimport './benefit.css';\r\n\r\nconst Benefit = () => {\r\n // * we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n // Modal Window type = DELETE, NEW, VIEW or UPDATE\r\n const [viewType, setViewType] = useState('');\r\n // Selected benefit\r\n const [benefitSelected, setBenefitSelected] = useState({});\r\n /**State of the modal window. True = showing ... False = hidden */\r\n const [showModal, setShowModal] = useState(false);\r\n /** State of the dialog. True = showing ... False = hidden */\r\n const [showAlert, setShowAlert] = useState(false);\r\n // List of groups. See useEffect\r\n const [benefitList, setBenefitList] = useState([]);\r\n\r\n // List of spFunctions. See useEffect\r\n const [spFunctionList, setSpFunctionList] = useState([]);\r\n\r\n // List of spComponents. See useEffect\r\n const [spComponentList, setSpComponentList] = useState([]);\r\n\r\n // List of spGuarantee. See useEffect\r\n const [spGuaranteeList, setSpGuaranteeList] = useState([]);\r\n\r\n // Session context to get the current institution data\r\n const { get_currentInstitution } = useContext(AuthContext);\r\n\r\n\r\n const getBenefits = async () => {\r\n setBenefitList([]);\r\n try {\r\n // * call the API\r\n const res = await API.get(`/benefit/getAll?institutionId=${get_currentInstitution().catInstitutionId}`);\r\n setBenefitList(res.data.data);\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n const getAllComboList = async () => {\r\n setSpFunctionList([]);\r\n setSpComponentList([]);\r\n setSpGuaranteeList([]);\r\n try {\r\n // * call the API\r\n const resFunction = await API.get(`/spfunction/getAll`);\r\n const resComponent = await API.get(`/spcomponent/getAll`);\r\n const resGuarantees = await API.get(`/benefit/getAllGuarantees`);\r\n\r\n setSpFunctionList(resFunction.data.data);\r\n setSpComponentList(resComponent.data.data);\r\n setSpGuaranteeList(resGuarantees.data.data);\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n }\r\n\r\n // we use useEffect to call the function that fills the grid\r\n useEffect(() => {\r\n getBenefits();\r\n getAllComboList();\r\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n\r\n /**\r\n ** Show or hide the modal\r\n */\r\n const toggleWindow = () => {\r\n setShowModal(!showModal);\r\n }\r\n\r\n /**\r\n ** Show or hide the alert\r\n */\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n const onActionClick = (actionItem, dataItem) => {\r\n const action = actionItem.value;\r\n setViewType(action);\r\n setBenefitSelected(dataItem);\r\n\r\n switch (action) {\r\n case NEW:\r\n toggleWindow();\r\n break;\r\n case VIEW:\r\n toggleWindow();\r\n break;\r\n case UPDATE:\r\n toggleWindow();\r\n break;\r\n case DELETE:\r\n toggleAlert();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const onSave = async (data) => {\r\n try {\r\n const requestData = { ...data, institutionId: get_currentInstitution().catInstitutionId }\r\n\r\n const error = validate_benefit(requestData, t);\r\n\r\n\r\n\r\n if (error.length === 0) {\r\n\r\n // * call the api to do the upsert\r\n const res = await API.post('/benefit/upsert', clean_benefit(requestData));\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`benefit.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * we decide what kind of message of success we should give\r\n const msg = data.benefitId === 0 ? t('benefit.new_message') : t('benefit.update_message');\r\n\r\n // * hide the modal, shows success message and refresh the grid\r\n toggleWindow();\r\n Notifications.notify(msg, SUCCESS_NOTIFICATION);\r\n getBenefits();\r\n } else {\r\n /**Shows error message */\r\n Notifications.notify(error, ERROR_NOTIFICATION);\r\n }\r\n\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e);\r\n }\r\n\r\n }\r\n\r\n const onDelete = async () => {\r\n try {\r\n // * call the api to do the delete\r\n const res = await API.delete(`/benefit?benefitId=${benefitSelected.benefitId}`);\r\n\r\n // * if errors exist, it is displayed as a notification\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`benefit.${res.data.code}`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * hide the alert and refresh the grid\r\n toggleAlert();\r\n Notifications.notify(t('benefit.delete_message'), SUCCESS_NOTIFICATION);\r\n getBenefits();\r\n } catch (e) {\r\n Notifications.notify(String(e), ERROR_NOTIFICATION);\r\n console.log(e)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n | {t('benefit.modalTitle')}\r\n
    \r\n
    \r\n
    \r\n {/* modal window */}\r\n {showModal &&\r\n }\r\n\r\n {/* alert window */}\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {t('benefit.delete_body')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n {/* Grid */}\r\n
    \r\n {/* grid */}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n )\r\n}\r\n\r\nexport default Benefit;\r\n","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useContext } from 'react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport './dashboard.css';\r\n// * Constants\r\nimport { HISTORICAL_INFO, EXISTING_BENEFITS, PROJECTION_PERIOD, ESTIMATION_GAPS, COVERED_POPULATION, FINANCIAL_PROJECTION, RESULTS, INDICATORS, GRAPHICS} from './constants'\r\n// * Kendo\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\n\r\n// * Helpers\r\nimport API from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport MatrixContext from '../../assets/Constants/matrixContext';\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { BiArrowFromRight } from \"react-icons/bi\";\r\n\r\nfunction Dashboard() {\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n /**Used to translate the text*/\r\n const { t } = useTranslation('common');\r\n /**We use useHistory hook to redirect */\r\n const history = useHistory();\r\n // States\r\n const [showingInputs, setShowingInputs] = useState(true)\r\n // percentage\r\n // const [historicalPercentage, setHistoricalPercentage] = useState(0);\r\n // const [demographicPercentage, setDemographicPercentage] = useState(0);\r\n // const [economicPercentage, setEconomicPercentage] = useState(0);\r\n /** State of the dialog. True = showing ... False = hidden */\r\n const [showAlert, setShowAlert] = useState(false);\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext);\r\n\r\n /**Triggered when user clicks \"Go Back\" button. Redirects to Models view*/\r\n const goBack = () => {\r\n history.push('/Scenarios');\r\n }\r\n\r\n // Show or hide the alert dialog. See state variable\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n }\r\n\r\n /**Sets the state to true, it means that the Inputs div will appear with green background*/\r\n const onInputsClick = () => {\r\n setShowingInputs(true);\r\n }\r\n\r\n /**Sets the state to false, it means that the Outputs div will appear with green background*/\r\n const onOutputsClick = () => {\r\n setShowingInputs(false);\r\n }\r\n\r\n // Navigates to the matrix control with the code of the node that should be open in the tree\r\n const onHist_info_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: HISTORICAL_INFO,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const onDemog_info_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: EXISTING_BENEFITS,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const onEcon_fin_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: PROJECTION_PERIOD,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const on_estimation_gap_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: ESTIMATION_GAPS,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const on_covered_pop_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: COVERED_POPULATION,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const on_financial_pro_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: FINANCIAL_PROJECTION,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n\r\n const on_graphics_click = () => {\r\n history.push({\r\n pathname: '/Graph',\r\n state: {\r\n code: GRAPHICS,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const on_results_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: RESULTS,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n const on_indicators_click = () => {\r\n history.push({\r\n pathname: '/MatrixControl',\r\n state: {\r\n code: INDICATORS,\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n //* When user clicks the Calculate button\r\n const onCalculate = async () => {\r\n try {\r\n const isLockRes = await API.get(`/Scenario/IsLock?scenarioId=${location.state.detail.scenarioId}&userCode=${user.email}`);\r\n const isCehckoutRes = await API.get(`/Scenario/IsCheckout?scenarioId=${location.state.detail.scenarioId}&userCode=${user.email}`);\r\n\r\n if (isLockRes.data.code !== 100) {\r\n Notifications.notify(isLockRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n if (isCehckoutRes.data.code !== 100) {\r\n Notifications.notify(isCehckoutRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n const isLockData = isLockRes.data.data;\r\n const isCheckoutData = isCehckoutRes.data.data;\r\n\r\n\r\n // * If model is not lock by other user\r\n if (!isLockData.isLock && !isCheckoutData) {\r\n await API.get(`/Scenario/LockScenario?scenarioId=${location.state.detail.scenarioId}&userCode=system`);\r\n const response = await API.post(`Scheduler/addTask`, null, {\r\n params: {\r\n ctxtcode: MatrixContext.SCENARIO,\r\n scenarioid: location.state.detail.scenarioId,\r\n opcode: 'CAL',\r\n usrcode: user ? user.email : 'get_user_error',\r\n customparams: JSON.stringify({ runblocks: ['load_data', 'gaps', 'projections', 'calc_rpt', 'make_reports'] })\r\n }\r\n });\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n toggleAlert();\r\n return;\r\n }\r\n Notifications.notify(t('scenarios.calculate_success'), SUCCESS_NOTIFICATION);\r\n toggleAlert();\r\n } else {\r\n // **** If not, error is displayed\r\n if (isLockData.isLock) {\r\n Notifications.notify(t('scenarios.add_benefit.edit_by', { user: isLockData.editLockUserCode }), ERROR_NOTIFICATION);\r\n return;\r\n } else if (isCheckoutData) {\r\n Notifications.notify(t('scenarios.add_benefit.ischeckout'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {showAlert &&\r\n toggleAlert()}\r\n >\r\n

    {t('scenarios.calculate_body')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {location.state.detail.name}
    \r\n
    \r\n
    {t('scenarios.dashboard_btnInputs')}
    \r\n
    {t('scenarios.dashboard_btnOutputs')}
    \r\n
    \r\n {\r\n showingInputs ?\r\n <>\r\n {/**Inputs dashboard*/}\r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_historical_titile')}
    \r\n
    \r\n
    \r\n

    {/**{historicalPercentage}%*/}

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_demographic_titile')}
    \r\n
    \r\n
    \r\n

    {/*{demographicPercentage}%*/}

    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_economic_titile')}
    \r\n
    \r\n
    \r\n

    {/*{economicPercentage}%*/}

    \r\n
    \r\n
    \r\n
    \r\n \r\n :\r\n <>\r\n {/**Outputs dashboard*/}\r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_gaps_title')}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_assessment_title')}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_indicators_title')}
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_finan_projection_title')}
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_graphics_title')}
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    {t('scenarios.dashboard_reports_title')}
    \r\n
    \r\n
    \r\n
    \r\n \r\n }\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n\r\n}\r\n\r\nexport default Dashboard","export const HISTORICAL_INFO = \"historicalInfo\";\r\nexport const EXISTING_BENEFITS = \"existingBenefits\";\r\nexport const PROJECTION_PERIOD = \"projectionPeriod\";\r\nexport const ESTIMATION_GAPS = 'estimationGaps';\r\nexport const COVERED_POPULATION = 'coveredPopulation';\r\nexport const FINANCIAL_PROJECTION = 'financialProjection';\r\nexport const GRAPHICS = 'allGraph';\r\nexport const RESULTS = 'results';\r\nexport const INDICATORS = 'indicators';","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport './footer.css';\r\nconst Footer = () => {\r\n const { t } = useTranslation('common');\r\n const currenteData = new Date();\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default Footer;\r\n","import React, { useEffect, useState, useContext } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ListBox } from '@progress/kendo-react-listbox';\r\nimport API from \"../../../services/api\";\r\nimport AuthContext from '../../../context/Auth/AuthContext';\r\nimport Notifications, { ERROR_NOTIFICATION, INFO_NOTIFICATION } from '../../../helpers/notifications';\r\n\r\nconst SELECTED_FIELD = \"selected\";\r\nconst SelectBenefit = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n\r\n // * list and selected option\r\n const [existingBenefits, setExistingBenefits] = useState([]);\r\n const [availableBenefits, setAvailableBenefits] = useState([]);\r\n const [selectedBenefit, setSelectedBenefit] = useState({});\r\n\r\n // Session context to get the current institution data\r\n const { get_currentInstitution } = useContext(AuthContext);\r\n\r\n\r\n useEffect(() => {\r\n getBenefits();\r\n }, []);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getBenefits = async () => {\r\n try {\r\n const resScenarioBenefits = await API.get(`/Scenario/GetBenefits?scenarioId=${props.scenarioId}`);\r\n const resAvailableBenefits = await API.get(`/Scenario/GetBenefitsNotInScenario?institutionId=${get_currentInstitution().catInstitutionId}&scenarioId=${props.scenarioId}`);\r\n if (resAvailableBenefits.data.code !== 100) {\r\n Notifications.notify(t(resAvailableBenefits.data.msg), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n if (resScenarioBenefits.data.code !== 100) {\r\n Notifications.notify(t(resScenarioBenefits.data.msg), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n setExistingBenefits(resScenarioBenefits.data.data);\r\n\r\n\r\n\r\n setAvailableBenefits(resAvailableBenefits.data.data.map((item, i) => {\r\n if (i === 0) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n }));\r\n\r\n setSelectedBenefit(resAvailableBenefits.data.data[0] ? resAvailableBenefits.data.data[0] : {});\r\n\r\n //clear\r\n props.setSelectedBenefit({});\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n\r\n }\r\n // * Sets the active item after click\r\n const handleItemClick = (event) => {\r\n setAvailableBenefits(\r\n availableBenefits.map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n })\r\n );\r\n setSelectedBenefit(event.dataItem);\r\n };\r\n\r\n return (\r\n
    \r\n\r\n
    \r\n
    \r\n

    {t('scenarios.addBenefit_desc')}

    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n\r\n
    \r\n
    \r\n \r\n handleItemClick(e)}\r\n\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n {\r\n\r\n if (Object.keys(selectedBenefit).length !== 0) {\r\n props.setSelectedBenefit(selectedBenefit);\r\n props.changeView('link_benefit_andGroups');\r\n } else {\r\n Notifications.notify(t(`scenarios.add_benefit.no_benefit_selected`), INFO_NOTIFICATION);\r\n }\r\n\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('scenarios.add_benefit.link_with_groups')}\r\n
    \r\n
    \r\n\r\n
    \r\n )\r\n}\r\n\r\nexport default SelectBenefit;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n// * Kendo dependencies\r\nimport {\r\n ListBox,\r\n ListBoxToolbar,\r\n processListBoxData\r\n} from '@progress/kendo-react-listbox';\r\nimport { TRANSFER_TO, TRANSFER_FROM } from '../../Models/constants';\r\nimport Notifications, { ERROR_NOTIFICATION, INFO_NOTIFICATION } from '../../../helpers/notifications';\r\nimport API from '../../../services/api';\r\nimport { Dialog, DialogActionsBar } from '@progress/kendo-react-dialogs';\r\n\r\nimport validator from 'validator';\r\n\r\n// Reac number format\r\nimport NumberFormat from 'react-number-format';\r\n\r\nconst SELECTED_FIELD = \"selected\";\r\nconst LinkBenefitandGroups = (props) => {\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n const [ithr, setITHR] = useState('0');\r\n const [ibam, setIBAM] = useState('0');\r\n\r\n const [confirmAdd, setConfirmAdd] = useState(false);\r\n const [addAnother, setAddAnother] = useState(false);\r\n const [showAddBtn, setShowAddBtn] = useState(false)\r\n\r\n const [selectedBeneficiaryUnit, setSelectedBeneficiaryUnit] = useState('');\r\n\r\n // * ListBox components state\r\n const [state, setState] = useState({\r\n availableGroups: [],\r\n addedGroups: []\r\n });\r\n\r\n\r\n\r\n useEffect(() => {\r\n getScenarioGroups()\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getScenarioGroups = async () => {\r\n try {\r\n const resGroups = await API.get(`/Scenario/GetGroups?scenarioId=${props.scenarioId}`);\r\n if (resGroups.data.code !== 100) {\r\n Notifications.notify(t(resGroups.data.msg), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n const availableGroupsList = resGroups.data.data.map((item, i) => {\r\n if (i === 0) {\r\n item[SELECTED_FIELD] = true;\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n });\r\n setState({\r\n ...state,\r\n availableGroups: availableGroupsList,\r\n addedGroups: []\r\n });\r\n\r\n //Used to know if the selected pop group is HouseHold or Individual. This to make a validation\r\n setSelectedBeneficiaryUnit(availableGroupsList[0].beneficiaryUnit);\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n\r\n // * Sets the active item after click\r\n const handleItemClick = (event, data, connectedData) => {\r\n setState({\r\n ...state,\r\n [data]: state[data].map((item) => {\r\n if (item.name === event.dataItem.name) {\r\n item[SELECTED_FIELD] = !item[SELECTED_FIELD];\r\n } else {\r\n item[SELECTED_FIELD] = false;\r\n }\r\n\r\n return item;\r\n }),\r\n [connectedData]: state[connectedData].map((item) => {\r\n item[SELECTED_FIELD] = false;\r\n return item;\r\n }),\r\n });\r\n\r\n //todo Used to know if the selected pop group is HouseHold or Individual. This to make a validation\r\n setSelectedBeneficiaryUnit(event.dataItem.beneficiaryUnit);\r\n };\r\n\r\n // Click in the arrows of the lists\r\n const handleToolBarClick = async (e) => {\r\n const toolName = e.toolName || \"\";\r\n let result = processListBoxData(\r\n state.addedGroups,\r\n state.availableGroups,\r\n toolName,\r\n SELECTED_FIELD\r\n );\r\n\r\n const sameBeneficiaryUnit = state.addedGroups.every((e) => {\r\n return e.beneficiaryUnit === selectedBeneficiaryUnit\r\n })\r\n\r\n if (sameBeneficiaryUnit) {\r\n setState({\r\n ...state,\r\n availableGroups: result.listBoxTwoData,\r\n addedGroups: result.listBoxOneData,\r\n });\r\n } else {\r\n Notifications.notify(t('model.wrongPopGroup'), ERROR_NOTIFICATION);\r\n }\r\n };\r\n\r\n const add_benefit = () => {\r\n\r\n // * Validations\r\n // --- empty validations\r\n if (validator.isEmpty(ithr.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ithr.toString())) {\r\n Notifications.notify(t('model.ithr_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n if (validator.isEmpty(ibam.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ibam.toString())) {\r\n Notifications.notify(t('model.ithr_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n const data = {\r\n ithr_abam: ithr,\r\n ibam: ibam\r\n }\r\n\r\n props.handleAddBenefit(state.addedGroups, data);\r\n toggleConfirmAdd();\r\n toggleShowAddBtn();\r\n\r\n //toggleAddAnother()\r\n }\r\n\r\n\r\n const add_another_benefit = () => {\r\n\r\n // * Validations\r\n // --- empty validations\r\n if (validator.isEmpty(ithr.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ithr.toString())) {\r\n Notifications.notify(t('model.ithr_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n if (validator.isEmpty(ibam.toString())) {\r\n Notifications.notify(t('model.values_required'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n if (!validator.isFloat(ibam.toString())) {\r\n Notifications.notify(t('model.ithr_number'), ERROR_NOTIFICATION);\r\n return false;\r\n }\r\n\r\n const data = {\r\n ithr_abam: ithr,\r\n ibam: ibam\r\n }\r\n\r\n props.handleAddAnotherBenefit(state.addedGroups, data);\r\n toggleConfirmAdd();\r\n toggleShowAddBtn();\r\n\r\n //toggleAddAnother()\r\n }\r\n\r\n const toggleConfirmAdd = () => {\r\n setConfirmAdd(!confirmAdd);\r\n }\r\n const toggleAddAnother = () => {\r\n setAddAnother(!addAnother);\r\n }\r\n const toggleShowAddBtn = () => {\r\n setShowAddBtn(!showAddBtn);\r\n }\r\n\r\n return (\r\n
    \r\n\r\n {/* confirm alert */}\r\n {confirmAdd &&\r\n toggleConfirmAdd()}\r\n >\r\n

    {t('scenarios.add_benefit.confirm_add')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n {/* add another alert */}\r\n {addAnother &&\r\n toggleAddAnother()}\r\n >\r\n

    {t('scenarios.add_benefit.add_anoher')}

    \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n
    \r\n
    \r\n

    {t('scenarios.add_benefit.link_with_groups_title', { name: props.selectedBenefit.name })}

    \r\n {/*
    {t('scenarios.add_benefit.step2')}
    */}\r\n
    \r\n
    \r\n \r\n {\r\n setITHR(values.value);\r\n }}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n {\r\n setIBAM(values.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n {\r\n return (\r\n \r\n );\r\n }}\r\n onItemClick={(e) => handleItemClick(e, 'addedGroups', 'availableGroups')}\r\n />\r\n\r\n
    \r\n
    \r\n \r\n handleItemClick(e, 'availableGroups', 'addedGroups')}\r\n\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n {/* {\r\n if (state.addedGroups.length !== 0) {\r\n props.setLinkGroups(state.addedGroups);\r\n props.changeView('benefitDetails');\r\n\r\n } else {\r\n Notifications.notify(t(`scenarios.add_benefit.no_groups_selected`), INFO_NOTIFICATION);\r\n }\r\n\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('scenarios.add_benefit.setDetails')} */}\r\n\r\n\r\n {\r\n toggleAddAnother();\r\n }}\r\n className=\"btn btn-primary ilo-btn mr-2\"\r\n >{t('scenarios.add_benefit.add_benefit_btn')}\r\n\r\n\r\n {\r\n\r\n if (state.addedGroups.length !== 0) {\r\n toggleConfirmAdd();\r\n } else {\r\n Notifications.notify(t(`scenarios.add_benefit.no_groups_selected`), INFO_NOTIFICATION);\r\n }\r\n }}\r\n className=\"btn btn-primary ilo-btn\"\r\n >{t('scenarios.add_benefit.complete')}\r\n\r\n\r\n
    \r\n
    \r\n\r\n
    \r\n )\r\n}\r\n\r\nexport default LinkBenefitandGroups;\r\n","import React, { useState, useContext } from 'react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport { useTranslation } from 'react-i18next';\r\n// * Helpers\r\nimport API from \"../../services/api\";\r\nimport MatrixContext from '../../assets/Constants/matrixContext';\r\n\r\nimport SelectBenefit from './scenarioBenefitModalViews/selectBenefit';\r\nimport LinkBenefitandGroups from './scenarioBenefitModalViews/linkBenefitandGroups';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { BiArrowFromRight } from \"react-icons/bi\";\r\n\r\n// import BenefitDetails from './scenarioBenefitModalViews/benefitDetails';\r\n\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\n\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\nconst ScenarioAddBenefit = () => {\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n //* We use useHistory hook to redirect\r\n const history = useHistory();\r\n // Session context to get the current institution data\r\n const { get_currentInstitution, user } = useContext(AuthContext);\r\n\r\n // we call the hook to make translations\r\n const { t } = useTranslation('common');\r\n\r\n\r\n\r\n // * For change view\r\n const [view, setView] = useState('select_benefit')\r\n\r\n\r\n\r\n // * \r\n const [selectedBenefit, setSelectedBenefit] = useState({});\r\n\r\n\r\n\r\n\r\n const changeView = (newView) => {\r\n setView(newView);\r\n\r\n }\r\n \r\n /**Triggered when user clicks \"Go Back\" button. Redirects to Scenario view*/\r\n const goBack = async () => {\r\n try {\r\n const response = await API.get(`/Scenario/UndoScenario?scenarioId=${location.state.detail.scenarioId}`);\r\n\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }else{\r\n history.push('/Scenarios');\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n }\r\n }\r\n\r\n const handleAddBenefit = async (groupsList, detailsData) => {\r\n try {\r\n const groupsID = groupsList.map((item) => {\r\n return item.popGroupId\r\n });\r\n\r\n const data = {\r\n scenarioId: location.state.detail.scenarioId,\r\n benefitId: selectedBenefit.benefitId,\r\n IBAM: detailsData.ibam,\r\n IANTRANS: 0,\r\n IADM: 0,\r\n ICPMale: 0,\r\n ICPFemale: 0,\r\n ICHH: 0,\r\n ITHR_ABAM: detailsData.ithr_abam,\r\n groupsID: groupsID\r\n\r\n }\r\n const res = await API.post('/Scenario/InsertScenarioBenefit', data);\r\n\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // APPLY CHANGES\r\n await API.get(`/Scenario/LockScenario?scenarioId=${location.state.detail.scenarioId}&userCode=system`);\r\n const response = await API.post(`Scheduler/addTask`, null, {\r\n params: {\r\n ctxtcode: MatrixContext.SCENARIO,\r\n scenarioid: location.state.detail.scenarioId,\r\n opcode: 'ADB',\r\n usrcode: user ? user.email : 'get_user_error',\r\n customparams: JSON.stringify({ runblocks: ['load_data', 'gaps', 'init_elc'] })\r\n }\r\n });\r\n if (response.data.code !== 100) {\r\n Notifications.notify(response.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n Notifications.notify(t('scenarios.add_benefit.success_confirmation'), SUCCESS_NOTIFICATION);\r\n\r\n // Redirects to scenario list\r\n history.push('/Scenarios');\r\n\r\n Notifications.notify(t('scenarios.add_benefit.success_add'), SUCCESS_NOTIFICATION);\r\n } catch (error) {\r\n console.log(error);\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n }\r\n }\r\n\r\n\r\n const handleAddAnotherBenefit = async (groupsList, detailsData) => {\r\n try {\r\n const groupsID = groupsList.map((item) => {\r\n return item.popGroupId\r\n });\r\n\r\n const data = {\r\n scenarioId: location.state.detail.scenarioId,\r\n benefitId: selectedBenefit.benefitId,\r\n IBAM: detailsData.ibam,\r\n IANTRANS: 0,\r\n IADM: 0,\r\n ICPMale: 0,\r\n ICPFemale: 0,\r\n ICHH: 0,\r\n ITHR_ABAM: detailsData.ithr_abam,\r\n groupsID: groupsID\r\n\r\n }\r\n const res = await API.post('/Scenario/InsertScenarioBenefit', data);\r\n\r\n if (res.data.code !== 100) {\r\n Notifications.notify(res.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // Redirects to select benefits view\r\n changeView('select_benefit');\r\n\r\n Notifications.notify(t('scenarios.add_benefit.success_add'), SUCCESS_NOTIFICATION);\r\n } catch (error) {\r\n console.log(error);\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n }\r\n\r\n }\r\n\r\n const switchView = () => {\r\n switch (view) {\r\n case 'select_benefit':\r\n return \r\n case 'link_benefit_andGroups':\r\n return \r\n // case 'benefitDetails':\r\n // return \r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n \r\n |\r\n {location.state.detail.name}\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {switchView()}\r\n
    \r\n
    \r\n
    \r\n \r\n\r\n\r\n\r\n );\r\n}\r\n\r\nexport default ScenarioAddBenefit;","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\n// API\r\nimport { AMS } from \"../../services/api\";\r\n// Notifications\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\n// Spreadsheet control\r\nimport { Spreadsheet } from \"@progress/kendo-spreadsheet-react-wrapper\";\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { BiArrowFromRight } from \"react-icons/bi\";\r\nimport './wizard.css'\r\n// Spinner\r\nimport { Loader } from \"@progress/kendo-react-indicators\";\r\n\r\n/**This component will render the entire Wizard actions. All the steps and wizard info will be render here*/\r\nfunction ModelReports() {\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n /**Used to translate the text*/\r\n const { t } = useTranslation('common');\r\n /**We use useHistory hook to redirect */\r\n const history = useHistory();\r\n // States\r\n const [selectedReport, setSelectedReport] = useState('rpt012_cmp_scn_b')\r\n // \r\n const [reportsList, setReportsList] = useState([]);\r\n //ref to the spread\r\n const spread = useRef(null);\r\n // if we need change the dimension of rows or columns of the spread, we need no show the spread, so that it reload\r\n const [showSpread, setShowSpread] = useState(false);\r\n //handle rows and columns sizes\r\n const [spreadDim, setSpreadDim] = useState({ rows: 1, columns: 1 });\r\n // * State variable used to hide the spinner if the report does not even have data. response.data.data === null\r\n const [showSpinner, setShowSpinner] = useState(true)\r\n\r\n /**Triggered when user clicks \"Go Back\" button. Redirects to Models view*/\r\n const goBack = () => {\r\n history.push('/Models');\r\n }\r\n\r\n // This useEffect is used to fill the combobox\r\n useEffect(() => {\r\n // API call to fill the comboBox\r\n getComboboxData();\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Calls the API to get the list of reports. This list will be used to fill the combobox\r\n // Sets the list of reports as state\r\n const getComboboxData = async () => {\r\n try{\r\n const response = await AMS.get(`/reportlist/MODEL/${location.state.detail.modelid}`);\r\n setReportsList(response.data.data);\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n\r\n // This useEffect is used to get the selected reporta data and show it in the spreadsheet\r\n useEffect(() => {\r\n // API call to fill the spreadhseet\r\n getReportData(selectedReport);\r\n }, [selectedReport]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getReportData = async (code) => {\r\n try {\r\n // Hides the spreadsheet to avoid errors\r\n setShowSpread(false);\r\n // API call to get the Report data\r\n const response = await AMS.get(`/report/MODEL/${location.state.detail.modelid}/${code}`);\r\n // Shows error message if the api call fails\r\n if (response.data.result === -1) {\r\n Notifications.notify(response.data.message, ERROR_NOTIFICATION);\r\n \r\n setShowSpinner(false);\r\n return;\r\n }\r\n // if data is null\r\n if (response.data.data === null) {\r\n Notifications.notify(t('model.dataNull'), ERROR_NOTIFICATION);\r\n \r\n setShowSpinner(false);\r\n return;\r\n }\r\n // If the model does not have scenarios\r\n if(response.data.result === -404000){\r\n Notifications.notify(t('model.modelWithoutScenarios'), ERROR_NOTIFICATION);\r\n \r\n setShowSpinner(false);\r\n return;\r\n }\r\n // if everything OK, the data is setted as state\r\n \r\n // Spreadhseet data\r\n const data = response.data.data;\r\n //update rows and columns for the spread\r\n setSpreadDim({\r\n rows: data.sheets[0].rows.length,\r\n columns: data.sheets[0].columns.length\r\n });\r\n // Shows teh spreadsheet\r\n setShowSpread(true);\r\n // Fills the spreadsheet\r\n fillSpreadSheet(data.sheets[0]);\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n\r\n // Fills the spreadsheet with the data\r\n const fillSpreadSheet = (data) => {\r\n let sheet = spread.current ? spread.current.widgetInstance.activeSheet() : null;\r\n\r\n if (sheet === null) {\r\n return;\r\n }\r\n\r\n // Fill the spreadsheet with the data\r\n sheet.fromJSON(data);\r\n }\r\n\r\n // When user selects a report from the select option\r\n const onSelectChange = (target) => {\r\n // sets the new selected report code as state\r\n setSelectedReport(target.value);\r\n // calls the appi to get the data\r\n getReportData(target.value);\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n {\r\n showSpread ?\r\n
    \r\n \r\n
    \r\n : showSpinner ?\r\n
    \r\n \r\n
    \r\n :\r\n <>\r\n }\r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default ModelReports","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useContext, useEffect } from 'react';\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useLocation } from \"react-router-dom\";\r\n// * CSS\r\nimport './scenario.css';\r\n// * Helpers\r\nimport API, { AMS } from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\nconst MatrixActionsBar = (props) => {\r\n\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext);\r\n\r\n const [sexSelector, setSexSelector] = useState(0);\r\n const [groupSelector, setGroupSelector] = useState(0);\r\n\r\n useEffect(() => {\r\n //Restore selectors values when tree view change\r\n if (props.selectedNodeData) {\r\n setSexSelector(0);\r\n setGroupSelector(0);\r\n }\r\n }, [props.selectedNodeData]);\r\n\r\n const generateSelectors = () => {\r\n // * we use breadcumb from selectedNode and metada information, to generate selectors\r\n // * only suppoty combobox for sex and group\r\n try {\r\n if (props.selectedNodeData.type === 'matrix') {\r\n if (props.selectedNodeData.breadcrumb !== \"\") {\r\n if (props.matrixMetadata) {\r\n const selectorList = props.selectedNodeData.breadcrumb.split(',');\r\n const selectorType = props.selectedNodeData.breadcrumbTypes.split(',');\r\n const selectors = selectorList.map((item, i) => {\r\n let result = null;\r\n if (selectorType[i] === 'combobox') {\r\n const dimindex = props.matrixMetadata.dimlist.indexOf(item);\r\n const options = props.matrixMetadata.dimdata[dimindex].values.map((op, j) => {\r\n return \r\n });\r\n result = (\r\n \r\n )\r\n }\r\n return result;\r\n });\r\n return selectors;\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n return null;\r\n }\r\n\r\n const createSelectorsString = () => {\r\n // * this function generate the selectors string like s=0,g=0\r\n const selectorList = props.selectedNodeData.breadcrumb.split(',');\r\n const selectors = selectorList.map((item) => {\r\n let result = '';\r\n if (item === \"s\") {\r\n result = `s=${sexSelector}`;\r\n } else if (item === \"g\") {\r\n result = `g=${groupSelector}`;\r\n }\r\n return result;\r\n });\r\n return selectors.join('');\r\n }\r\n\r\n const onSelectorChange = (event, dim) => {\r\n if (dim === \"s\") {\r\n setSexSelector(event.target.value);\r\n } else if (dim === \"g\") {\r\n setGroupSelector(event.target.value);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n // * this useEffect handle the change from the selectors and get update the matrix using the new selectors\r\n if (props.selectedNodeData.type === 'matrix') {\r\n const selectorList = props.selectedNodeData.breadcrumb.split(',');\r\n const selectors = selectorList.map((item) => {\r\n let result = '';\r\n if (item === \"s\") {\r\n result = `s=${sexSelector}`;\r\n } else if (item === \"g\") {\r\n result = `g=${groupSelector}`;\r\n }\r\n return result;\r\n });\r\n props.getMatrixData(props.selectedNodeData.code, selectors.join(','));\r\n }\r\n }, [sexSelector, groupSelector]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const handleCheckout = async () => {\r\n try {\r\n const isLockRes = await API.get(`/Scenario/IsLock?scenarioId=${location.state.detail.scenarioId}&userCode=${user.email}`);\r\n const isCehckoutRes = await API.get(`/Scenario/IsCheckout?scenarioId=${location.state.detail.scenarioId}&userCode=${user.email}`);\r\n\r\n if (isLockRes.data.code !== 100) {\r\n Notifications.notify(isLockRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n if (isCehckoutRes.data.code !== 100) {\r\n Notifications.notify(isCehckoutRes.data.msg, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n const isLockData = isLockRes.data.data;\r\n const isCheckoutData = isCehckoutRes.data.data;\r\n\r\n // * If model is not lock by other user\r\n if (!isLockData.isLock && !isCheckoutData) {\r\n // * generate selector string like s=0,g=0\r\n const selectors = createSelectorsString();\r\n\r\n\r\n // * call api to do checkout\r\n const checkoutRes = await AMS.get(`/checkout/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`, {\r\n params: {\r\n usr: user.email\r\n }\r\n });\r\n\r\n if (checkoutRes.data.result === -1) {\r\n Notifications.notify(checkoutRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n\r\n // * get checkout data to update matrixData\r\n const checkoutInfoRes = await AMS.get(`/getcheckoutinfo/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`);\r\n\r\n if (checkoutInfoRes.data.result === -1) {\r\n Notifications.notify(checkoutInfoRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n props.setMatrixData({ ...props.matrixData, ...checkoutInfoRes.data });\r\n\r\n // * enable spread\r\n props.validate_edit(props.matrixData.datablockranges, true);\r\n\r\n } else {\r\n // **** If not, error is displayed\r\n if (isLockData.isLock) {\r\n Notifications.notify(t('scenarios.add_benefit.edit_by', { user: isLockData.editLockUserCode }), ERROR_NOTIFICATION);\r\n return;\r\n } else if (isCheckoutData) {\r\n Notifications.notify(t('scenarios.add_benefit.ischeckout'), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n }\r\n }\r\n\r\n const handleUndoCheckout = async () => {\r\n // * generate selector string like s=0,g=0\r\n const selectors = createSelectorsString();\r\n\r\n // * call api to do undocheckout\r\n const checkoutRes = await AMS.get(`/undo/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`, {\r\n params: {\r\n usr: user.email\r\n }\r\n });\r\n if (checkoutRes.data.result === -1) {\r\n Notifications.notify(checkoutRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n // * get checkout data to update matrixData\r\n const checkoutInfoRes = await AMS.get(`/getcheckoutinfo/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`);\r\n if (checkoutInfoRes.data.result === -1) {\r\n Notifications.notify(checkoutInfoRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n props.getMatrixData(props.selectedNodeData.code, selectors);\r\n }\r\n\r\n const handleSave = () => {\r\n // * generate selector string like s=0,g=0\r\n const selectors = createSelectorsString();\r\n props.saveMatrixData(selectors);\r\n }\r\n\r\n const handleCheckin = () => {\r\n // * generate selector string like s=0,g=0\r\n const selectors = createSelectorsString();\r\n\r\n props.checkinMatrixData(selectors)\r\n }\r\n\r\n const handleExport = () => {\r\n props.exportData();\r\n }\r\n\r\n const handleClean = () => {\r\n props.cleanMatrixData()\r\n }\r\n return (\r\n props.selectedNodeData !== null ?\r\n
    \r\n\r\n
    \r\n
    \r\n {props.selectedNodeData.type === 'matrix' ?\r\n /**\r\n * for matrix \r\n */\r\n

    {props.matrixData?.ischeckedout ? `(${props.matrixData.checkoutuser}) ` : ''}{props.selectedNodeData.text}

    \r\n /**\r\n * for report\r\n */\r\n :

    {props.selectedNodeData.text}

    \r\n }\r\n
    \r\n
    \r\n\r\n {props.selectedNodeData.type === 'matrix' ?\r\n\r\n /**\r\n * for matrix \r\n */\r\n (props.matrixData ? (\r\n <>\r\n
    \r\n \r\n {!props.selectedNodeData.readonly ?\r\n\r\n props.matrixData.ischeckedout && user.email === props.matrixData.checkoutuser ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n ) : \r\n \r\n\r\n\r\n : null}\r\n
    \r\n
    \r\n {generateSelectors()}\r\n
    \r\n ) : null) :\r\n /**\r\n * for report\r\n */\r\n (\r\n
    \r\n \r\n
    \r\n )\r\n }\r\n
    : null\r\n\r\n );\r\n}\r\n\r\nexport default MatrixActionsBar","import React, { useEffect, useState, useRef, useContext } from 'react'\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { ExcelExport } from '@progress/kendo-react-excel-export';\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION, SUCCESS_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useTranslation } from 'react-i18next';\r\n// Import axios\r\nimport { AMS } from \"../../services/api\";\r\n// Context\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n// Spreadsheet control\r\nimport { Spreadsheet } from \"@progress/kendo-spreadsheet-react-wrapper\";\r\n// Spinner\r\nimport { Loader } from \"@progress/kendo-react-indicators\";\r\n\r\n// Matrix actions (buttons and title) bar\r\nimport MatrixActionsBar from './matrixActionsBar';\r\n\r\nconst MatrixSpreadSheet = (props) => {\r\n const { t } = useTranslation('common');\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n //handle rows and columns sizes\r\n const [spreadDim, setSpreadDim] = useState({ rows: 1, columns: 1 });\r\n //data for the spread\r\n const [dataSource, setDataSource] = useState({});\r\n //ref to the spread\r\n const spread = useRef(null);\r\n const _export = useRef(null);\r\n // if we need change the dimension of rows or columns of the spread, we need no show the spread, so that it reload\r\n const [showSpread, setShowSpread] = useState(false);\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext);\r\n\r\n // * matrix meta data\r\n const [matrixMetadata, setMatrixMetadata] = useState(null)\r\n // * matrix data\r\n const [matrixData, setMatrixData] = useState(null)\r\n\r\n useEffect(() => {\r\n //When tree change this useeffect update the matrix\r\n if (props.selectedNodeData) {\r\n // * API CALLS\r\n // Gets matrix metadata\r\n if (props.selectedNodeData.type === 'matrix') {\r\n getMatrixMetadaData(props.selectedNodeData.code);\r\n getMatrixData(props.selectedNodeData.code, props.selectedNodeData.initialSelectors);\r\n } else {\r\n setMatrixMetadata(null)\r\n getReportData(props.selectedNodeData.code);\r\n }\r\n // Gets matrix data\r\n }\r\n }, [props.selectedNodeData]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n\r\n\r\n // Calls the API to get the matrix data\r\n const getMatrixData = async (matrixcode, selectors) => {\r\n try {\r\n setShowSpread(false);\r\n const response = await AMS.get(`/spreadsheet/SCENARIO/${location.state.detail.scenarioId}/${matrixcode}/${selectors}`, {\r\n params: {\r\n usr: user.email\r\n }\r\n });\r\n if (response.data.result === -1) {\r\n Notifications.notify(response.data.message, ERROR_NOTIFICATION);\r\n setMatrixData(null);\r\n props.setBlockTree(false);\r\n\r\n return;\r\n }\r\n setMatrixData(response.data);\r\n\r\n const data = response.data.spreadsheet;\r\n\r\n //update rows and columns for the spread\r\n setSpreadDim({\r\n rows: data.rows,\r\n columns: data.columns\r\n });\r\n //set dataSource\r\n setDataSource(data.sheets[0]);\r\n //we show the spread\r\n setShowSpread(true);\r\n fillSpreadSheet(data.sheets[0]);\r\n validate_edit(response.data.datablockranges, response.data.ischeckedout ? user.email === response.data.checkoutuser : false);\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n props.setBlockTree(false);\r\n\r\n }\r\n }\r\n\r\n // Calls the API to get the report data\r\n const getReportData = async (matrixcode) => {\r\n try {\r\n setShowSpread(false);\r\n const response = await AMS.get(`/report/SCENARIO/${location.state.detail.scenarioId}/${matrixcode}`);\r\n if (response.data.result === -1) {\r\n Notifications.notify(response.data.message, ERROR_NOTIFICATION);\r\n setMatrixData(null);\r\n props.setBlockTree(false);\r\n return;\r\n }\r\n setMatrixData(response.data);\r\n\r\n const data = JSON.parse(response.data.data);\r\n\r\n //update rows and columns for the spread\r\n setSpreadDim({\r\n rows: data.rows,\r\n columns: data.columns\r\n });\r\n //set dataSource\r\n setDataSource(data.sheets[0]);\r\n //we show the spread\r\n setShowSpread(true);\r\n fillSpreadSheet(data.sheets[0]);\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n props.setBlockTree(false);\r\n\r\n }\r\n }\r\n\r\n\r\n // Calls the API to get the matrix metadata\r\n const getMatrixMetadaData = async (matrixcode) => {\r\n try {\r\n const response = await AMS.get(`/metadata/SCENARIO/${location.state.detail.scenarioId}/${matrixcode}`);\r\n if (response.data.result === -1) {\r\n Notifications.notify(response.data.message, ERROR_NOTIFICATION);\r\n setMatrixMetadata(null);\r\n props.setBlockTree(false);\r\n\r\n return;\r\n }\r\n setMatrixMetadata(response.data);\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION)\r\n console.log(error);\r\n props.setBlockTree(false);\r\n\r\n }\r\n }\r\n\r\n // Fills the spreadsheet with the data\r\n const fillSpreadSheet = async (data) => {\r\n // First: Builds the spreadsheet with the template information\r\n const sheet = spread.current ? spread.current.widgetInstance.activeSheet() : null;\r\n // to avoid kendo errors\r\n if (sheet === null) {\r\n return;\r\n }\r\n\r\n sheet.fromJSON(data);\r\n\r\n props.setBlockTree(false);\r\n }\r\n\r\n const validate_edit = (blocks, ischeckout) => {\r\n // If the wizard is in VIEW mode, the Spreadsheet cannot be edited\r\n const sheet = spread.current ? spread.current.widgetInstance.activeSheet() : null;\r\n if (sheet === null) {\r\n return;\r\n }\r\n blocks.forEach(block => {\r\n sheet.range(block).enable(ischeckout);\r\n });\r\n\r\n }\r\n\r\n\r\n\r\n\r\n // * In the matrixData variable, the values entered for Females and Males are concatenated as a string.\r\n // * Separated by ; to assemble the data when it is to be displayed\r\n const saveMatrixData = async (selectors) => {\r\n try {\r\n // spreadsheet instance\r\n const sheet = spread.current.widgetInstance.activeSheet();\r\n if (sheet === null) {\r\n return;\r\n }\r\n const data = matrixData.datablockranges.map(block => {\r\n const blockData = sheet.range(block).values();\r\n return blockData.flat();\r\n });\r\n const dataFlat = data.flat();\r\n if (!checkSPData(data.flat())) {\r\n Notifications.notify(t(`model.spWrongData`), ERROR_NOTIFICATION);\r\n return;\r\n }\r\n const saveRes = await AMS.post(`/save/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`, {\r\n usr: user.email,\r\n data: dataFlat\r\n });\r\n\r\n if (saveRes.data.result === -1) {\r\n Notifications.notify(saveRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n Notifications.notify(t(`matrixcontrol.actions.success_save`), SUCCESS_NOTIFICATION);\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n\r\n // * Checkin matrix\r\n const checkinMatrixData = async (selectors) => {\r\n try {\r\n await saveMatrixData(selectors);\r\n const checkinRes = await AMS.get(`/checkin/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`, {\r\n params: {\r\n usr: user.email\r\n }\r\n });\r\n if (checkinRes.data.result === -1) {\r\n Notifications.notify(checkinRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n // * get checkout data to update matrixData\r\n const checkoutInfoRes = await AMS.get(`/getcheckoutinfo/SCENARIO/${location.state.detail.scenarioId}/${props.selectedNodeData.code}/${selectors}`);\r\n\r\n if (checkoutInfoRes.data.result === -1) {\r\n Notifications.notify(checkoutInfoRes.data.message, ERROR_NOTIFICATION);\r\n return;\r\n }\r\n\r\n setMatrixData({ ...matrixData, ...checkoutInfoRes.data });\r\n // * enable spread\r\n validate_edit(matrixData.datablockranges, false);\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n\r\n }\r\n\r\n // !Checks if the array has string values\r\n // !If it has string values, the function returns FALSE that means the SP its wrong\r\n const checkSPData = (arr) => {\r\n let result = arr.every(function (e) {\r\n return typeof e === 'number';\r\n });\r\n return result;\r\n }\r\n\r\n const cleanMatrixData = () => {\r\n try {\r\n // spreadsheet instance\r\n const sheet = spread.current.widgetInstance.activeSheet();\r\n if (sheet === null) {\r\n return;\r\n }\r\n matrixData.datablockranges.forEach(block => {\r\n sheet.range(block).value(0);\r\n });\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n\r\n const exportData = () => {\r\n try {\r\n const spreadInstance = spread.current.widgetInstance;\r\n if (spreadInstance === null) {\r\n return;\r\n }\r\n spreadInstance.saveAsExcel();\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {showSpread ? (\r\n \r\n {\r\n e.workbook.fileName = `${props.selectedNodeData.code}.xlsx`;\r\n }}\r\n >\r\n \r\n ) : }\r\n
    \r\n
    \r\n \r\n\r\n );\r\n}\r\n\r\nexport default MatrixSpreadSheet","/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { HiOutlineDocumentText } from \"react-icons/hi\"; // ! Reports node (in treeview) icon\r\nimport { BsFileSpreadsheet } from \"react-icons/bs\"; // ! Matrix node (in treeview) icon\r\nimport { MdTitle } from \"react-icons/md\"; // ! Title node (in treeview) icon\r\nimport { GoGraph } from \"react-icons/go\"; // \r\n\r\n/*\r\n To add a new customItem you must add the rule here, specify the type of the item and how it will be rendered.\r\n*/\r\nconst types = [\r\n {\r\n name: \"matrix\",\r\n render: (title) => {\r\n return (\r\n <>\r\n {title}\r\n \r\n )\r\n }\r\n },\r\n {\r\n name: \"title\",\r\n render: (title) => {\r\n return (\r\n <>\r\n {title}\r\n \r\n\r\n )\r\n }\r\n },\r\n {\r\n name: \"report\",\r\n render: (title) => {\r\n return (\r\n <>\r\n {title}\r\n \r\n\r\n )\r\n }\r\n },\r\n {\r\n name: \"graph\",\r\n render: (title) => {\r\n return (\r\n <>\r\n {title}\r\n \r\n\r\n )\r\n }\r\n }\r\n];\r\n\r\nconst customItem = (params) => {\r\n\r\n //Search if exist the itemType\r\n const itemType = types.find(type => params.item.type === type.name);\r\n\r\n if (itemType) {\r\n return itemType.render(params.item.text)\r\n }\r\n\r\n //default\r\n return <>{params.item.text}\r\n}\r\n\r\nexport default customItem;","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useEffect } from 'react';\r\n// * Kendo\r\nimport { TreeView } from \"@progress/kendo-react-treeview\";\r\n\r\n// * custom items\r\nimport customItem from './customItem';\r\n\r\nconst TreeViewGA = (props) => {\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n\r\n //#region State\r\n\r\n // tree to show - is reduced when a search is performed\r\n const [treeDataToShow, setTreeDataToShow] = useState([]);\r\n // is always kept complete\r\n const [completeTreeData, setCompleteTreeData] = useState([])\r\n\r\n //#endregion\r\n\r\n //#region init tree\r\n // * The tree is traversed to open the corresponding node.\r\n useEffect(() => {\r\n if (props.dataSource) {\r\n\r\n const expandTreeNode = (data) => {\r\n const defaultOpen = props.defaultOpen ? props.defaultOpen : '';\r\n data.forEach((item) => {\r\n if (item.code === defaultOpen) {\r\n item.expanded = true;\r\n } else {\r\n item.expanded = false;\r\n }\r\n });\r\n // Sets the json´s state with the expanded node already defined\r\n setTreeDataToShow(data);\r\n // Always complete data\r\n setCompleteTreeData(data);\r\n }\r\n\r\n expandTreeNode(props.dataSource)\r\n }\r\n }, [props.dataSource, props.defaultOpen])\r\n //#endregion\r\n\r\n //#region handles\r\n //* This allow us to show as SELECTED the clicked element\r\n const onItemClick = (event) => {\r\n if (!event.item.items && !props.blockTree) {\r\n // Recursive function that allows us to select a node and deselect the others.\r\n const foo = (item) => {\r\n // Node with children may not be clickable\r\n if (item.items) {\r\n return {\r\n ...item,\r\n items: item.items.map(foo)\r\n }\r\n } else {\r\n if (item.text === event.item.text) {\r\n return {\r\n ...item,\r\n selected: true\r\n }\r\n } else {\r\n return {\r\n ...item,\r\n selected: false\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Variable with the new data after recursive function\r\n const treeDataNew = treeDataToShow.map(foo);\r\n\r\n // State\r\n setTreeDataToShow(treeDataNew);\r\n\r\n if (!event.item.items && props.afterClickLeaf) {\r\n // Parent handles what happens to a selected node\r\n const leafData = {\r\n ...event.item\r\n }\r\n props.afterClickLeaf(leafData)\r\n }\r\n }\r\n\r\n };\r\n\r\n // This allows the control expand\r\n const onExpandChange = (event) => {\r\n event.item.expanded = !event.item.expanded;\r\n };\r\n //#endregion\r\n\r\n //#region searching\r\n // ! We use this function to search in the treeview using the input onchange event\r\n const handleSearch = (event) => {\r\n //only search if some data exists\r\n if (completeTreeData.length === 0) return\r\n\r\n let value = event.target.value;\r\n\r\n //parent handles what happens when treeView making a search\r\n if (props.searchingInTree) {\r\n props.searchingInTree()\r\n }\r\n\r\n let newData = search(completeTreeData, value);\r\n setTreeDataToShow(newData);\r\n };\r\n\r\n const search = (items, term) => {\r\n return items.reduce((acc, item) => {\r\n if (contains(item.text, term)) {\r\n acc.push(item);\r\n } else if (item.items && item.items.length > 0) {\r\n let newItems = search(item.items, term);\r\n if (newItems && newItems.length > 0) {\r\n acc.push({\r\n text: item.text,\r\n items: newItems,\r\n expanded: true,\r\n });\r\n }\r\n }\r\n return acc;\r\n }, []);\r\n };\r\n\r\n const contains = (text, term) => {\r\n return text.toLowerCase().indexOf(term.toLowerCase()) >= 0;\r\n };\r\n //#endregion\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default TreeViewGA;","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useEffect, useContext } from 'react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\n// * CSS\r\nimport './scenario.css';\r\n// * Helpers\r\nimport { AMS } from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { BiArrowFromRight } from \"react-icons/bi\";\r\n// Matrix SpreadSheet control\r\nimport MatrixSpreadSheet from './matrixSpreadsheet';\r\n\r\n//reusable treeView\r\nimport TreeViewGA from '../ReusableComponents/TreeViewGA/treeViewGA';\r\n\r\n\r\n\r\nconst MatrixControl = () => {\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n // Session context to get the current institution data\r\n const { get_user_from_session } = useContext(AuthContext);\r\n /**The useHistory hook allow us to redirect to another route */\r\n const history = useHistory();\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n\r\n // * State used to save the selected Matrix (this in the Matrix Tree)\r\n const [selectedNodeData, setSelectedNodeData] = useState(null);\r\n\r\n //\r\n const [dataTree, setDataTree] = useState([]);\r\n\r\n //block tree when data is loading\r\n const [blockTree, setBlockTree] = useState(false);\r\n\r\n /**Triggered when user clicks \"Go Back\" button. Redirects to Dashboard view*/\r\n const goToDashboard = () => {\r\n history.push({\r\n pathname: '/Dashboard',\r\n state: {\r\n detail: location.state.detail\r\n }\r\n });\r\n }\r\n\r\n // we use useEffect to set the states\r\n useEffect(() => {\r\n // Calls the funtion that gets the tree data\r\n getTreeJson();\r\n }, []);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getTreeJson = async () => {\r\n //* call to API to get the tree json\r\n const response = await AMS.get(`/tree/SCENARIO/${location.state.detail.scenarioId}?usr=${get_user_from_session().user.email}`);\r\n //* Expand the selected node\r\n setDataTree(response.data.data);\r\n }\r\n\r\n //* Function used to set the state with the code of the selected matrix in the matrix tree\r\n //* Also gets the matrix data\r\n const getMatrixData = (matrixNoneData) => {\r\n\r\n if (matrixNoneData === null) {\r\n setSelectedNodeData(null);\r\n return;\r\n }\r\n\r\n // State variable with all selected node information\r\n setBlockTree(true);\r\n\r\n //generate initial selectors\r\n let selectors = \"\";\r\n if (matrixNoneData.type === 'matrix') {\r\n if (matrixNoneData.breadcrumb !== \"\") {\r\n const selectorsList = matrixNoneData.breadcrumb.split(',');\r\n const initialSelectors = selectorsList.map((item) => {\r\n return `${item}=0`\r\n });\r\n selectors = initialSelectors.join(',');\r\n }\r\n }\r\n\r\n\r\n\r\n setSelectedNodeData({ ...matrixNoneData, initialSelectors: selectors });//! this triggers the useEffect of matrixSpreadSheeet\r\n\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {/**Shows the tree with the list of matrix*/}\r\n { getMatrixData(null) }}\r\n />\r\n
    \r\n
    \r\n {\r\n /**Shows the spreadsheet control that will show the matrix data*/\r\n selectedNodeData === null ? <> : \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default MatrixControl","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useContext, useEffect, useRef } from 'react';\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\nimport { useLocation } from \"react-router-dom\";\r\n// * CSS\r\n// * Helpers\r\nimport API, { AMS } from \"../../services/api\";\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n// External dependencies\r\nimport { RangeStepInput } from 'react-range-step-input';\r\n\r\nconst GraphSelectors = (props) => {\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext);\r\n // State variables\r\n \r\n const [benefitSelector, setBenefitSelector] = useState(0);\r\n const [groupSelector, setGroupSelector] = useState(0);\r\n const [sexSelector, setSexSelector] = useState(0);\r\n const [yearSelector, setYearSelector] = useState(0);\r\n const [tCompleteSelector, setTCompleteSelector] = useState(0)\r\n const [year, setYear] = useState(0);\r\n const [yearTComplete, setYearTComplete] = useState(0);\r\n const [change, setChange] = useState(false); \r\n const [sexBothSelector, setSexBothSelector] = useState(2);\r\n const [gdpgexSelector, setGdpgexSelector] = useState(0);\r\n\r\n // to control first render\r\n const ref = useRef(true);\r\n\r\n // this useEffect is executed each time the selectedNodeData variable is updated in the graphControl component\r\n useEffect(() => {\r\n //Restore selectors values when tree view change\r\n if (props.selectedNodeData) {\r\n /*\r\n setSexSelector(0);\r\n setGroupSelector(0);\r\n setYearSelector(0);\r\n setBenefitSelector(0);\r\n setTCompleteSelector(0);\r\n */\r\n setSexBothSelector(2);\r\n setGdpgexSelector(0);\r\n }\r\n }, [props.selectedNodeData]);\r\n\r\n // this useEffect is executed each time the graphMetadata variable is updated in the graphView component\r\n useEffect(() => {\r\n //Restore selectors values when tree view change\r\n if (props.graphMetadata) {\r\n props.graphMetadata.dimdata.forEach((item) => {\r\n if (item.code === \"t\") {\r\n setYear(item.minVal)\r\n }\r\n if (item.code === \"t_complete\") {\r\n setYearTComplete(item.minVal)\r\n }\r\n })\r\n }\r\n }, [props.graphMetadata]);\r\n\r\n const generateSelectors = () => {\r\n // * we use breadcumb from selectedNode and metada information, to generate selectors\r\n // * only suppoty combobox for sex and group\r\n try {\r\n if (props.selectedNodeData.type === 'graph') {\r\n if (props.selectedNodeData.breadcrumb !== \"\") {\r\n if (props.graphMetadata) {\r\n\r\n const selectorList = props.selectedNodeData.breadcrumb.split(',');\r\n\r\n let result = [];\r\n\r\n // Iterates the selector´s list\r\n for (let i = 0; i < selectorList.length; i++) {\r\n const selector = selectorList[i];\r\n\r\n const dimindex = props.graphMetadata.dimlist.indexOf(selector);\r\n // Gets the list of values according to current dimension (dimindex)\r\n const options = props.graphMetadata.dimdata[dimindex].values.map((op, j) => {\r\n return \r\n });\r\n\r\n // If the current graph has the another sex dimension (with \"both\")\r\n if (selector === \"sboth\") {\r\n result.push(\r\n \r\n )\r\n }\r\n\r\n // If the current graph has the gaps dimension\r\n if (selector === \"gdpgex\") {\r\n result.push(\r\n \r\n )\r\n }\r\n\r\n /*\r\n\r\n // If the current graph has benefits\r\n if (selector === \"b\") {\r\n result.push(\r\n \r\n )\r\n }\r\n\r\n // If the current graph has groups\r\n if (selector === \"g\") {\r\n result.push(\r\n \r\n )\r\n }\r\n\r\n // If the current graph has sex\r\n if (selector === \"s\") {\r\n result.push(\r\n \r\n )\r\n }\r\n\r\n // If the current graph has time\r\n if (selector === \"t\") {\r\n result.push(\r\n <>\r\n

    {year}

    \r\n \r\n )\r\n }\r\n\r\n // If the current graph has t_complete\r\n if (selector === \"t_complete\") {\r\n result.push(\r\n <>\r\n

    {yearTComplete}

    \r\n \r\n )\r\n }\r\n\r\n */\r\n\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n return null;\r\n }\r\n\r\n useEffect(() => {\r\n if (props.showGraph) {\r\n setChange(false);\r\n }\r\n }, [props.showGraph]);\r\n\r\n useEffect(() => {\r\n // * To avoid duplicate call to getGraph function in the first render\r\n if (ref.current) {\r\n ref.current = false;\r\n } else {\r\n // * this useEffect handle the change from the selectors and get update the matrix using the new selectors\r\n if (props.selectedNodeData.type === 'graph') {\r\n props.setShowGraph(false);\r\n const selectorList = props.selectedNodeData.breadcrumb.split(',');\r\n const selectors = selectorList.map((item) => {\r\n\r\n\r\n if (item === \"sboth\") {\r\n return `sboth=${sexBothSelector}`;\r\n }\r\n if (item === \"gdpgex\") {\r\n return `gdpgex=${gdpgexSelector}`;\r\n }\r\n\r\n /*\r\n if (item === \"b\") {\r\n return `b=${benefitSelector}`;\r\n }\r\n if (item === \"g\") {\r\n return `g=${groupSelector}`;\r\n }\r\n if (item === \"s\") {\r\n return `s=${sexSelector}`;\r\n }\r\n if (item === \"t\") {\r\n return `t=${yearSelector}`;\r\n }\r\n if (item === \"t_complete\") {\r\n return `t_complete=${tCompleteSelector}`;\r\n }\r\n */\r\n\r\n });\r\n props.getGraph(props.selectedNodeData.code, selectors.join(','));\r\n }\r\n }\r\n\r\n\r\n }, [sexBothSelector, gdpgexSelector, /*sexSelector, groupSelector, benefitSelector, yearSelector, tCompleteSelector*/]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Converts the first letter of string in capital letter\r\n const toCapital = (param) => {\r\n // First letter in capital letter\r\n const capLetter = param.charAt(0).toUpperCase();\r\n // Rest of the word without the first letter\r\n const restWord = param.slice(1);\r\n // result\r\n const result = `${capLetter}${restWord}`;\r\n return result;\r\n };\r\n\r\n /*\r\n const onChangeYearSlider = (e) => {\r\n\r\n setYear(Number(e.target.value));\r\n // setChange(true);\r\n\r\n let index = 0;\r\n props.graphMetadata.dimdata.forEach((item) => {\r\n if (item.code === \"t\") {\r\n index = item.values.indexOf(Number(e.target.value));\r\n }\r\n });\r\n setYearSelector(index);\r\n }\r\n\r\n const onChangeYearCompleteSlider = (e) => {\r\n setYearTComplete(Number(e.target.value));\r\n\r\n let index = 0;\r\n props.graphMetadata.dimdata.forEach((item) => {\r\n if (item.code === \"t_complete\") {\r\n index = item.values.indexOf(Number(e.target.value));\r\n }\r\n });\r\n setTCompleteSelector(index);\r\n }\r\n */\r\n\r\n return (\r\n props.selectedNodeData !== null ?\r\n
    \r\n
    \r\n
    \r\n

    {props.selectedNodeData.text}

    \r\n
    \r\n
    \r\n
    \r\n {generateSelectors()}\r\n
    \r\n
    : null\r\n );\r\n}\r\n\r\nexport default GraphSelectors","import React, { useEffect, useState, useRef, useContext } from 'react'\r\nimport { useLocation } from \"react-router-dom\";\r\n// * Helpers\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\n// import { useTranslation } from 'react-i18next';\r\n// Import axios\r\nimport { AMS, PUBLIC } from \"../../services/api\";\r\n// Context\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n// Spinner\r\nimport { Loader } from \"@progress/kendo-react-indicators\";\r\n// graphSelector component instance\r\nimport GraphSelectors from './graphSelectors';\r\n\r\nconst GraphView = (props) => {\r\n // const { t } = useTranslation('common');\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n // if we need change the dimension of rows or columns of the spread, we need no show the spread, so that it reload\r\n const [showGraph, setShowGraph] = useState(true);\r\n\r\n const [graphMetadata, setGraphMetadata] = useState(null);\r\n\r\n // Session context to get the current institution data\r\n const { user } = useContext(AuthContext);\r\n\r\n // this useEffect is executed each time the selectedNodeData variable is updated in the graphControl component\r\n useEffect(() => {\r\n //When tree change this useeffect update the graph\r\n if (props.selectedNodeData) {\r\n setShowGraph(false)\r\n getGraphMeta(props.selectedNodeData.code)\r\n getGraph(props.selectedNodeData.code, props.selectedNodeData.initialSelectors);\r\n }\r\n }, [props.selectedNodeData]);// eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Gets the metadata of the selected graph\r\n const getGraphMeta = async (graphCode) => {\r\n try {\r\n const res = await AMS.get(`/dashboardmetadata/SCENARIO/${location.state.detail.scenarioId}/${graphCode}`, {\r\n params: {\r\n usr: user.email\r\n }\r\n });\r\n // If the request fails\r\n if (res.data.result === -1) {\r\n Notifications.notify(res.data.message, ERROR_NOTIFICATION);\r\n props.setBlockTree(false);\r\n return;\r\n }\r\n setGraphMetadata(res.data)\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n props.setBlockTree(false);\r\n }\r\n }\r\n\r\n const getGraph = async (graphCode, selectors) => {\r\n // http://127.0.0.1:5000/matrix/dashboard/SCENARIO/6/dashboard1/sboth=0?usr=aaraya@grupoasesor.net\r\n try {\r\n const res = await AMS.get(`/dashboard/SCENARIO/${location.state.detail.scenarioId}/${graphCode}/${selectors}`, {\r\n params: {\r\n usr: user.email\r\n }\r\n });\r\n\r\n if (res.data.result === -1) {\r\n Notifications.notify(res.data.message, ERROR_NOTIFICATION);\r\n props.setBlockTree(false);\r\n return;\r\n }\r\n \r\n // Show the graph using the bokeh dependecy\r\n setTimeout(() => {\r\n setShowGraph(false);\r\n window.Bokeh.embed.embed_item(JSON.parse(res.data.data), 'myplot');\r\n setShowGraph(true);\r\n }, 2000);\r\n \r\n props.setBlockTree(false);\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n props.setBlockTree(false);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {showGraph ? (\r\n
    \r\n ) : }\r\n
    \r\n
    \r\n \r\n\r\n );\r\n}\r\n\r\nexport default GraphView","import { useTranslation } from 'react-i18next';\r\nimport React, { useState, useEffect, useContext } from 'react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\n// * CSS\r\nimport './graphControl.css';\r\n\r\n\r\n\r\n// * Helpers\r\nimport AuthContext from '../../context/Auth/AuthContext';\r\n\r\n/*List of icons used in this component*/\r\n/**Important: to see the full icons list visit: https://react-icons.github.io/react-icons */\r\nimport { BiArrowFromRight } from \"react-icons/bi\";\r\n/**api connection */\r\nimport {AMS} from \"../../services/api\";\r\n/**notifications */\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications';\r\n\r\n\r\n\r\nimport TreeViewGA from '../ReusableComponents/TreeViewGA/treeViewGA';\r\nimport GraphView from './graphView';\r\n\r\nconst GraphControl = () => {\r\n /**We use the useTranslation hook to update the text when the language changes */\r\n const { t } = useTranslation('common');\r\n\r\n /**The useHistory hook allow us to redirect to another route */\r\n const history = useHistory();\r\n\r\n //* To can acess the parameters sent via history.push\r\n const location = useLocation();\r\n\r\n //block tree when data is loading\r\n const [blockTree, setBlockTree] = useState(false);\r\n\r\n // * State used to save the selected Matrix (this in the Matrix Tree)\r\n const [selectedGraphNodeData, setSelectedGraphNodeData] = useState(null);\r\n\r\n const [graphDataTree, setGraphDataTree] = useState([]);\r\n\r\n // Session context to get the current institution data\r\n const { get_user_from_session } = useContext(AuthContext);\r\n\r\n /**Triggered when user clicks \"Go Back\" button. Redirects to Dashboard view*/\r\n const goToDashboard = () => {\r\n history.push({\r\n pathname: '/Dashboard',\r\n state: {\r\n detail: location.state.detail \r\n }\r\n });\r\n }\r\n\r\n // we use useEffect to set the states\r\n useEffect(() => {\r\n // Calls the funtion that gets the tree data\r\n getTreeJson();\r\n }, []);\r\n\r\n const getTreeJson = async () => {\r\n try {\r\n //* call to API to get the tree json\r\n const response = await AMS.get(`/dashboardtree/SCENARIO/${location.state.detail.scenarioId}?usr=${get_user_from_session().user.email}`);\r\n //* Expand the selected node\r\n setGraphDataTree(response.data.data)\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error)\r\n }\r\n }\r\n const handleGraphClick = (graphData) => {\r\n setBlockTree(true);\r\n //initial selectors\r\n let selectors = \"\";\r\n if (graphData.type === 'graph') {\r\n if (graphData.breadcrumb !== \"\") {\r\n const selectorsList = graphData.breadcrumb.split(',');\r\n const initialSelectors = selectorsList.map((item) => {\r\n if(item === \"sboth\")\r\n return `${item}=2`\r\n else\r\n return `${item}=0`\r\n });\r\n selectors = initialSelectors.join(',');\r\n }\r\n }\r\n // State variable with all selected node information\r\n setSelectedGraphNodeData({...graphData, initialSelectors:selectors});\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {/**Shows the tree with the list of graphs*/}\r\n { handleGraphClick(null) }}\r\n />\r\n
    \r\n
    \r\n {\r\n /**Shows the spreadsheet control that will show the matrix data*/\r\n selectedGraphNodeData === null ? <> : \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default GraphControl","// * Types functions as an enum for the different actions to be applied in each context.\r\n\r\nexport const SIGNIN = 'SIGNIN';\r\nexport const SIGNOUT = 'SIGNOUT';\r\nexport const SELECT_INSTITUTION = 'SELECT_INSTITUTION';\r\nexport const UPDATE_FIRST_TIME = 'UPDATE_FIRST_TIME';\r\n\r\n","import { SIGNIN, SIGNOUT, SELECT_INSTITUTION, UPDATE_FIRST_TIME } from '../types';\r\n\r\n/*\r\nHere you build the function that will be used to create the reducer. \r\nThis function is in charge of updating the state as indicated in the type. \r\nThe payload is the new state that I am going to place.\r\n*/\r\nconst authReducer = (state, action) => {\r\n\r\n const { payload, type } = action;\r\n\r\n switch (type) {\r\n case SIGNIN:\r\n return {\r\n ...state,\r\n ...payload\r\n };\r\n case SIGNOUT:\r\n return {\r\n ...state,\r\n user: payload,\r\n authorizedInstitutions: payload,\r\n currentInstitutionIndex: -1\r\n };\r\n case SELECT_INSTITUTION:\r\n return {\r\n ...state,\r\n currentInstitutionIndex: payload,\r\n };\r\n case UPDATE_FIRST_TIME:\r\n return {\r\n ...state,\r\n user: { ...state.user, isFirstTime: payload }\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default authReducer;","import React, { useReducer, useEffect } from 'react';\r\n\r\n//Imports to the axios instance to make API calls\r\nimport API from '../../services/api';\r\n\r\nimport AuthContext from './AuthContext';\r\nimport AuthReducer from './AuthReducer';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n//notifications\r\nimport Notifications, { ERROR_NOTIFICATION } from '../../helpers/notifications'\r\n\r\n//These are the actions that can be performed in this context\r\nimport { SIGNIN, SIGNOUT, SELECT_INSTITUTION, UPDATE_FIRST_TIME } from '../types';\r\n\r\nconst AuthState = (props) => {\r\n //Initial state of the reducer\r\n const initialState = {\r\n user: null,\r\n authorizedInstitutions: null,\r\n currentInstitutionIndex: -1,\r\n baseUrlLogoInstitutions: ''\r\n };\r\n\r\n /*\r\n * Creation of the reducer with the function that makes the updates depending on a type and the initial state. \r\n * Retorts the state and the dispach function, which is the one we must call to update the state, \r\n * passing the type and the payload as an object. \r\n */\r\n const [state, dispatch] = useReducer(AuthReducer, initialState);\r\n const { t } = useTranslation('common');\r\n\r\n useEffect(() => {\r\n // * User is retrieved if it exists from session storage\r\n get_user_from_session()\r\n }, [])\r\n\r\n /*\r\n * This function is in charge of using the usr and pw to try to give access to the user.\r\n * If the user has access, a call is made to the cb function, to redirect the user to where it should be.\r\n */\r\n const login = async (usr, pw, cb) => {\r\n try {\r\n\r\n //http requetes to api\r\n const res = await API.post('/Security/Login', { usr, pw });\r\n\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`login.${res.data.code}`), ERROR_NOTIFICATION)\r\n return;\r\n }\r\n\r\n const { authorizedInstitutions, currentInstitutionIndex, baseUrlLogoInstitutions, ...user } = res.data.data\r\n\r\n const data = { authorizedInstitutions, currentInstitutionIndex, user, baseUrlLogoInstitutions }\r\n\r\n //save the user in the session storage\r\n sessionStorage.setItem('user_data', JSON.stringify(data))\r\n\r\n //update state of reducer\r\n dispatch({ type: SIGNIN, payload: data });\r\n\r\n //redirect the user\r\n cb();\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n }\r\n };\r\n\r\n /*\r\n * function that is in charge of removing the user's information, in order to log the user out of the system.\r\n */\r\n const logout = () => {\r\n dispatch({ type: SIGNOUT, payload: null });\r\n sessionStorage.removeItem('user_data')\r\n };\r\n\r\n /*\r\n * function that gets all the user information if it exists in the session storage\r\n */\r\n const get_user_from_session = () => {\r\n const userDataObj = JSON.parse(sessionStorage.getItem('user_data'));\r\n dispatch({ type: SIGNIN, payload: userDataObj });\r\n return userDataObj\r\n }\r\n\r\n /*\r\n * function that returns true if the user has already entered the system through the login.\r\n */\r\n const is_login = () => {\r\n return state.user || sessionStorage.getItem('user_data');\r\n }\r\n\r\n /*\r\n * function that returns true if the user has already selected an institution\r\n */\r\n const is_selected_institution = () => {\r\n const userDataObj = JSON.parse(sessionStorage.getItem('user_data'));\r\n return userDataObj ? state.currentInstitutionIndex !== -1 || userDataObj.currentInstitutionIndex !== -1 : false;\r\n }\r\n\r\n /*\r\n * function that returns true if it is the first time the user logs in to the system\r\n */\r\n const is_firstime = () => {\r\n const userDataObj = JSON.parse(sessionStorage.getItem('user_data'));\r\n return userDataObj ? state.isFirstTime || userDataObj.user.isFirstTime : false;\r\n }\r\n /*\r\n *función that change the currentInstitutionIndex\r\n */\r\n const select_institution = (indexID) => {\r\n const userDataObj = JSON.parse(sessionStorage.getItem('user_data'));\r\n sessionStorage.setItem('user_data', JSON.stringify({ ...userDataObj, currentInstitutionIndex: indexID }))\r\n dispatch({ type: SELECT_INSTITUTION, payload: indexID })\r\n }\r\n /*\r\n * function that updates the first_time variable, when the user enters the system and makes the password change.\r\n */\r\n const update_first_time = () => {\r\n const userDataObj = JSON.parse(sessionStorage.getItem('user_data'));\r\n sessionStorage.setItem('user_data', JSON.stringify({ ...userDataObj, user: { ...userDataObj.user, isFirstTime: false } }))\r\n dispatch({ type: UPDATE_FIRST_TIME, payload: true })\r\n }\r\n\r\n const extAuth = async (urlparams, cb) => {\r\n try {\r\n\r\n //http requetes to api\r\n // const res = await API.get(`/Security/Extauth?ciid=${ciid}&cuid=${cuid}&ts=${ts}&sk=${atob(sk)}`);\r\n const res = await API.get(`/Security/Extauth${urlparams}`);\r\n\r\n if (res.data.code !== 100) {\r\n Notifications.notify(t(`login.${res.data.code}`), ERROR_NOTIFICATION)\r\n cb('/Login');\r\n return;\r\n }\r\n\r\n const { authorizedInstitutions, currentInstitutionIndex, baseUrlLogoInstitutions, ...user } = res.data.data\r\n\r\n const data = { authorizedInstitutions, currentInstitutionIndex, user, baseUrlLogoInstitutions }\r\n\r\n //save the user in the session storage\r\n sessionStorage.setItem('user_data', JSON.stringify(data))\r\n\r\n //update state of reducer\r\n dispatch({ type: SIGNIN, payload: data });\r\n\r\n //redirect the user\r\n cb('/');\r\n\r\n } catch (error) {\r\n Notifications.notify(String(error), ERROR_NOTIFICATION);\r\n console.log(error);\r\n }\r\n };\r\n\r\n const get_currentInstitution = () => {\r\n const userDataObj = JSON.parse(sessionStorage.getItem('user_data'));\r\n\r\n if (userDataObj?.authorizedInstitutions) {\r\n const institution = userDataObj.authorizedInstitutions[userDataObj.currentInstitutionIndex];\r\n return institution;\r\n }\r\n return {}\r\n }\r\n\r\n /*\r\n * the context provider is the one that allows everything that is rendered inside the AuthState\r\n * to access the things specified in value \r\n */\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nexport default AuthState;\r\n","import React from 'react';\r\n/*We use Switch and Route to generate the routes of each menu item*/\r\nimport { Switch, Route } from \"react-router-dom\";\r\nimport './App.css';\r\n\r\nimport { COMPLETE_MODULES } from './assets/config'\r\n\r\n/*Custom Components*/\r\nimport Header from './components/Header/header';\r\nimport Menu from './components/Menu/menu';\r\nimport Home from './components/Home/home';\r\nimport PrivateRoute from './components/PrivateRoute/privateRoute';\r\nimport Login from './components/Login/login';\r\nimport ForgotPassword from './components/ForgotPassword/forgotPassword';\r\nimport ChangePassword from './components/ChangePassword/changePassword';\r\nimport Log from './components/SystemLog/systemLog';\r\nimport AuthInstitutions from './components/AuthInstitutions/authInstitutions';\r\nimport ExternalAuth from './components/ExternalAuth/externalAuth';\r\nimport Model from './components/Models/model'\r\nimport Scenario from './components/Scenarios/scenario'\r\nimport Wizard from './components/Models/wizard'\r\nimport SPFunctions from './components/SPFunctions/spFunctions';\r\nimport SPComponents from './components/SPComponents/spComponents';\r\nimport PopGroups from './components/PopGroups/popGroups';\r\nimport Benefit from './components/Benefit/benefit';\r\nimport Dashboard from './components/Scenarios/dashboard';\r\nimport Footer from './components/Footer/footer';\r\nimport ScenarioAddBenefit from './components/Scenarios/scenarioAddBenefit';\r\nimport ModelReports from './components/Models/modelReports'\r\n\r\n\r\nimport MatrixControl from './components/Scenarios/matrixControl'\r\nimport GraphControl from './components/GraphControl/graphControl';\r\n\r\n/*Authorization components*/\r\nimport AuthState from './context/Auth/AuthState';\r\nimport { ToastContainer } from 'react-toastify';\r\n\r\nconst UnderConstruction = (props) => {\r\n return (\r\n
    \r\n

    {props.name}

    \r\n

    Under Construction

    \r\n
    \r\n )\r\n}\r\n\r\n\r\nfunction App() {\r\n return (\r\n \r\n
    \r\n {/* Header is render */}\r\n
    \r\n\r\n {/* Menu is render */}\r\n \r\n\r\n {/**This is part of the react-router to know which route to render.*/}\r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.spFunction ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.spComponents ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.pGroups ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.benefits ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.models ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.models ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.wizard ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.scenarios ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.scenarios ?\r\n
    < Scenario />
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.scenarios ?\r\n
    < MatrixControl />
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.wizard ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n {COMPLETE_MODULES.log ?\r\n
    :\r\n \r\n }\r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n

    404

    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n \r\n
    \r\n