{"version":3,"sources":["images/specmatelogo.png","redux/actions.ts","components/Modals/ModalPopup.tsx","interfaces/interfaces.ts","redux/reducers/projectManagement.ts","redux/reducers/optimizeDesign.ts","TypescriptClient.ts","redux/store.ts","redux/reducers/componentConstruction.ts","redux/reducers/electrical.ts","redux/reducers/controls.ts","redux/reducers/unitCabinet.ts","redux/reducers/unitComponents.ts","redux/localstorage.ts","utilities/helpers.tsx","api-utilities/formatting.ts","components/Shared/NotificationMessage.tsx","api-utilities/notification-tools.tsx","security/IdentityService.ts","api-utilities/api-calls.ts","api-calls/projectDataService.ts","components/Modals/ProjectModal.tsx","components/Modals/UnitCopyModal.tsx","components/Modals/ProjectCopyModal.tsx","api-calls/chartDataService.ts","components/Modals/FanCurveModal.tsx","components/Modals/FanSoundDataModal.tsx","api-calls/emailDataService.ts","components/Modals/ContactUsModal.tsx","components/Modals/RefrigerationLocationModal.tsx","api-calls/readApiService.ts","components/Modals/TransferProjectModal.tsx","components/Modals/ModalContainer.tsx","components/Menus/TopMenu.tsx","components/Menus/DesignSubMenu.tsx","utilities/pageUtils.tsx","components/CreateDesign/ConfigurationInputs.tsx","components/CreateDesign/InletOutlet.tsx","components/CreateDesign/UnitSelection.tsx","components/CreateDesign/FluidConditionsForWSHP.tsx","components/CreateDesign/TempsSystem.tsx","api-utilities/performanceUpdate.tsx","components/CreateDesign/ComponentDisplay/UnitSizingLimits.tsx","components/CreateDesign/ComponentDisplay/ChilledWaterCoil.tsx","components/CreateDesign/ComponentDisplay/HotWaterCoil.tsx","components/CreateDesign/ComponentDisplay/SteamCoil.tsx","components/CreateDesign/ComponentDisplay/Fan.tsx","components/CreateDesign/ComponentDisplay/Filter.tsx","components/CreateDesign/ComponentDisplay/CombinedFilter.tsx","components/CreateDesign/ComponentDisplay/HumidifierManifold.tsx","components/CreateDesign/ComponentDisplay/SoundAttenuator.tsx","components/CreateDesign/ComponentDisplay/HeatWheel.tsx","components/CreateDesign/ComponentDisplay/ElectricHeater.tsx","components/CreateDesign/ComponentDisplay/IndirectFiredFurnace.tsx","components/CreateDesign/ComponentDisplay/PlateHeatExchanger.tsx","components/CreateDesign/ComponentDisplay/PackagedAc.tsx","components/CreateDesign/OptimizeDesignInputs.tsx","components/CreateDesign/OptimizeDesign.tsx","api-utilities/enums.ts","components/FineTuneDesign/DrawingViewButtons.tsx","components/FineTuneDesign/UnitDrawing.tsx","components/CreateDesign/PoolUtilities.tsx","components/CreateDesign/SinglePoolInput.tsx","components/CreateDesign/PoolInputs.tsx","utilities/specmateProHelpers.tsx","components/UnitDesign.tsx","components/Menus/DrawingSubMenu.tsx","components/Drawings.tsx","components/Menus/LayoutSubMenu.tsx","components/FineTuneDesign/DrawingViewer.tsx","components/FineTuneDesign/AccessDoors.tsx","components/FineTuneDesign/CoilConnections.tsx","components/FineTuneDesign/LayoutAdjustments.tsx","components/FineTuneDesign/UnitLayoutUtil.ts","components/FineTuneDesign/LengthInputs.tsx","components/Shared/AccordionHeader.tsx","components/FineTuneDesign/InletOutletSizing.tsx","components/UnitLayout.tsx","components/Project/ProjectUtilities.tsx","components/Project/Unit.tsx","components/Project/PagingControl.tsx","components/Project/ProjectManagement.tsx","components/Menus/SpecSubMenu.tsx","components/SelectOptions/BMSPoints.tsx","components/SelectOptions/Controls.tsx","components/SelectOptions/Electrical/PrimaryPower.tsx","components/SelectOptions/Electrical/FanVFDDisplayGroup.tsx","components/SelectOptions/Electrical/FanVFDInstall.tsx","components/SelectOptions/Electrical/FanVFD.tsx","components/SelectOptions/Electrical/Circuit120V.tsx","components/SelectOptions/Electrical/Circuit24V.tsx","components/SelectOptions/Electrical.tsx","components/SelectOptions/Construction/Accordions/EnthalpyWheel.tsx","components/SelectOptions/Construction/Accordions/CoilDisplayGroup.tsx","components/SelectOptions/Construction/Accordions/CoilDisplayGroupDX.tsx","components/SelectOptions/Construction/Accordions/CoilDisplayGroupHGRH.tsx","components/SelectOptions/Construction/Accordions/Coils.tsx","components/SelectOptions/Construction/Accordions/IDF.tsx","components/SelectOptions/Construction/Accordions/Refrigeration.tsx","components/SelectOptions/Construction/Accordions/FilterSpares.tsx","components/SelectOptions/Construction/Accordions/FanDisplayGroup.tsx","components/SelectOptions/Construction/Accordions/Fans.tsx","components/SelectOptions/Construction/Accordions/DamperDisplayGroup.tsx","components/SelectOptions/Construction/Accordions/Dampers.tsx","components/SelectOptions/Construction/Accordions/WaterSourceHeatPump.tsx","components/SelectOptions/Construction.tsx","components/SelectOptions/Warranties.tsx","components/SelectOptions/Cabinet/Exterior.tsx","components/SelectOptions/Cabinet/Interior.tsx","components/SelectOptions/Cabinet/Doors.tsx","components/SelectOptions/UnitCabinet.tsx","components/SpecItems.tsx","components/Menus/OutputsSubMenu.tsx","api-calls/pdfGeneratorService.ts","components/Outputs/PdfOutputs.tsx","components/Outputs/CadOutputs.tsx","components/Outputs.tsx","security/IdentityContext.ts","components/Auth/LoginStart.tsx","components/Auth/IdentityLogin.tsx","components/Auth/IdentityLogout.tsx","components/Menus/TopRightMenu.tsx","api-calls/pricingDataService.ts","components/Menus/TopRightPricing.tsx","components/Menus/ProjectHeader.tsx","components/Menus/ProjectManagementHeader.tsx","components/Modals/ServerError.tsx","components/Modals/Notification.tsx","components/Modals/ModalNotifications.tsx","components/Shared/Loading.tsx","components/PrivateRoute.tsx","api-calls/systemDataService.ts","components/App.tsx","serviceWorker.ts","index.tsx"],"names":["module","exports","updateReduxAction","actionType","data","type","newState","mapDispatchToProps","dispatch","updateRedux","ModalPopup","response","this","props","showModal","userResponse","hideCancelBtn","reduxModals","modalData","className","title","content","onClick","React","connect","ACCUArrangement","AirTunnelOrientation","SortBy","ProjectStatusFilterBy","state","projectManagement","projectList","projectId","selectedProject","unitList","newUnitTag","statusTypes","projectName","jobStatus","Design","projectStatusFilterBy","All","projectNameSortBy","None","projectLastModifiedSortBy","currentProjectList","totalProjectRecords","projectRecordsPerPage","currentPage","selectedUserId","ApiErrorCode","DrawingScreen","UnitType","SoundAttenuatorType","HumidifierManifoldType","EnergyRecoveryDeviceType","UnitLocationType","AirflowArrangementType","ReturnAirDirection","TunnelLocation","Cooling","Heating","CoolHeatSequence","FilterType","AirInletOrOutletType","AirInletOrOutletLocationType","PredefinedClimateOptionType","AirflowSystemType","UnitElectricalVoltageType","CasingDimensionLimitType","ComponentPerformancePanelType","CoilFluidType","FinMaterialType","CompressorType","TubeDiameterType","SoundAttenuatorLengthType","SteamSourceType","FilterLoadingLevel","FilterRemoval","DrawingViewType","UnitAccess","FluidCoilPenetration","RefrigerantCoilPenetration","FurnacePanelLocation","HeatingCoolingAccessOption","AllowFanDuctOverlapOption","CasingMaterialType","CoilCoatingType","FurnaceTubeMaterialType","FurnaceFuelType","FilterCategoryType","MotorEnclosureType","ShaftGroundingType","DamperMotorizedOrGravity","DamperTypeAndConstruction","OpeningSizingMethod","ControlsInclusionType","DamperActuatorsInclusionType","SupplyFanControlType","ReturnFanControlType","ExhaustFanControlType","TemperatureControlType","DehumidificationControlType","EconomizerInitiationType","MinimumOutsideAirControlType","UnoccupiedModeControlType","InterfaceCard","ShortCircuitCurrentRatingType","FanArrayVfdSharing","SinglePhaseCircuitPower","LightInclusionLocation","VFDProvisionInstallation","SmokeDetectors","SmokeDetectorInclusionType","SmokeDetectorType","ExteriorMaterialType","InteriorMaterialType","MountingType","CurbProvidedBy","PerforatedLinerType","FloorConstructionType","FloorMaterialType","FloorDrainsType","DrainPanMaterialType","InwardSwingingLocation","ThermalBreakLocation","WindowInclusion","WindowType","PressureReliefLatchLocation","InteriorHandlesLocation","TieBackLocation","LockType","DoorHandleInterlockLocation","TestPortLocation","defaultValues","showResetToOptimized","showRecalcButton","showUserModifiedValues","selectedComponent","selectedComponentName","defaultErrors","defaultStringArray","notificationsList","store","createStore","combineReducers","reduxSession","userActivityTimestamp","Date","now","d","Object","assign","reduxAppVersion","appVersion","action","reduxAuth","userId","access_token","userRoles","postalCode","reduxSelectedUnit","reduxConfigInputs","reduxConnections","reduxTempsAndSystem","reduxPerformance","reduxEditDrawing","reduxAccessDoors","reduxCoilConnections","reduxElectFurnacePanels","reduxLengthInputs","reduxHeatwheel","reduxPlateHeatExchanger","reduxIDF","reduxChilledWaterCoil","reduxHotWaterCoil","reduxPreHeatHotWaterCoil","reduxElectricHeater","reduxPreHeatElectHeater","reduxDXCoil","reduxHotGasReheat","reduxSteamCoil","reduxSupplyFan","reduxExhaustFan","reduxOutsidePrefilter","reduxOutsideFinalfilter","reduxSupplyAirFilter","reduxReturnAirFilter","reduxOutsideAirInlet","reduxSupplyAirOutlet","reduxReturnAirInlet","reduxExhaustAirOutlet","reduxMenus","topMenu","activeItem","sizingAccordion","activeId","drawingView","showTopRightDropdown1","showTopRightDropdown2","enableSave","enableUnitIcons","closeSetPointsAccordian","providedAndInstalledByChanged","optimizedDesignInputChanged","showPoolInputs","modalType","modalId","reduxValidation","modifyPropertyErrors","userEditedFields","reduxServerErrors","showError","errorType","errorSource","errorMessage","reduxNotifications","notifications","reduxDisplay","showLoader","unitToDelete","headerTitleChanged","reduxPrerequisiteErrors","errorList","reduxHeatWheelPanel","reduxHotWaterCoilPanel","reduxHotWaterPreheatPanel","reduxChilledWaterCoilPanel","reduxSteamCoilPanel","reduxDXCoilPanel","reduxHGRHCoilPanel","reduxIDFPanel","reduxAccuPanel","reduxOAFilterPanel","reduxHEFilterPanel","reduxSAFilterPanel","reduxRAFilterPanel","reduxSupplyFanPanel","reduxExhaustFanPanel","reduxOADamperPanel","reduxEADamperPanel","reduxRADamperPanel","reduxSADamperPanel","reduxOABypassDamperPanel","reduxEABypassDamperPanel","reduxRecircDamperPanel","reduxElectricalSupplyFan","reduxElectricalExhaustFan","reduxElectrical","reduxControls","reduxUnitCabinet","reduxSupplyAttenuator","reduxReturnAttenuator","reduxHumidifierManifold","reduxProjectManagement","reduxOptimizeDesign","reduxOutputDocumentsInfo","pdfRecords","activeProcessingRecordsCount","pollForUpdates","showDocsReadyNotificationIcon","isOutputPage","reduxPricing","priceNeedsUpdate","runPricing","reduxComponentPerformance","reduxInitialState","savedState","localStorage","getItem","token","JSON","parse","getInitialState","composeWithDevTools","Error","isEmptyObject","obj","keys","length","constructor","isEmptyArray","arr","isNullOrEmpty","item","formatNumber","value","decimalPlaces","toLocaleString","maximumFractionDigits","minimumFractionDigits","toString","resetReduxModals","sqlToJsDate","sqlDate","dt","getMonth","getDate","getFullYear","sqlToJsDateTime","hours","getHours","minutes","getMinutes","ampm","strTime","getNumericId","str","split","pop","Number","getStringId","itemType","id","roundNumber","Math","round","RoundToNearest","increment","RoundUpToNearest","decimalPart","abs","ceil","NotificationMessage","notificationData","notificationType","join","addNotification","notification","reduxStore","getState","map","x","includes","newArray","Array","from","push","removeNotification","filteredArray","filter","clearAllPerformanceNotifications","formatIndividualErrors","msg","index","key","i","IdentityService","userMgr","settings","authority","process","client_id","redirect_uri","post_logout_redirect_uri","response_type","scope","revokeAccessTokenOnSignout","automaticSilentRenew","silent_redirect_uri","userStore","Oidc","WebStorageStateStore","window","UserManager","context","events","addUserLoaded","console","log","addUserUnloaded","addAccessTokenExpiring","minutesToMilliseconds","logout","addAccessTokenExpired","addSilentRenewError","error","handleError","addUserSignedOut","Log","logger","min","signinRedirect","catch","signinRedirectCallback","user","getCurrentTimeFromStamp","expires_at","loadUserInfoToRedux","getUserRoles","rolesArray","profile","profiledata","State","PostalCode","sub","getUser","UserType","toLowerCase","UserRolesArr","lowryRoles","find","C","R","role","userInfo","userType","firstName","lastName","email","officeMembershipsArr","FirstName","LastName","Email","OfficeMembershipsArr","expired","signoutRedirect","clearStaleState","signoutRedirectCallback","removeUser","signinSilentCallback","querySessionStatus","timestamp","displayError","source","errorObj","status","message","substring","displayErrorString","apibase","getAuthToken","auth","identityService","GetFreightStatesCheckPostalCode","fetch","method","headers","Authorization","result","json","hasError","getProjectsByUser","getProject","url","getProjectProStatus","updateProject","project","editedProjectRequest","consultingEngineer","contractor","city","body","stringify","text","success","addNewProject","getUserInfo","newProjectRequest","addUnit","userRole","forEach","newUnitDto","getUnits","getOutputDocumentsData","copyUnit","sourceProjectId","targetProjectId","unitTagName","unitId","newUnitRequest","unitTag","copyProject","copyProjectRequest","getProjectAndUnitName","deleteProjectAndUnits","deleteUnit","transferProjectToNewUser","newOwnerId","request","ProjectModal","freightStates","setState","states","setToNewYorkCity","profileState","fullStateExistsInDropdownList","stateInfo","fullState","stateExistsInDropdownList","isNewYorkState","fieldName","newValue","buttonText","placeholder","onChange","event","validateAndSave","currentTarget","autoFocus","getStateOptions","Booking","Release","options","UnitCopyModal","currentUnit","disabled","getProjectChoices","currentProject","orderedProjectList","proj","name","checked","updateProjectSelected","copyUnitResponse","ProjectCopyModal","selectedProjectId","copyProjectResponse","getFanCurveChart","selectedFan","projIdStr","unitIdStr","blob","getFanSoundData","FanCurveModal","chartData","chartError","loading","chart","URL","createObjectURL","src","alt","modalResponse","FanSoundDataModal","soundData","unitFanPerformanceDTO","inletSoundlevel63hz","outletSoundlevel63hz","inletSoundlevel125hz","outletSoundlevel125hz","inletSoundlevel250hz","outletSoundlevel250hz","inletSoundlevel500hz","outletSoundlevel500hz","inletSoundlevel1000hz","outletSoundlevel1000hz","inletSoundlevel2000hz","outletSoundlevel2000hz","inletSoundlevel4000hz","outletSoundlevel4000hz","inletSoundlevel8000hz","outletSoundlevel8000hz","inletPowerWeightedLwA","outletPowerWeightedLwA","inletPressureWeightedDBa","outletPressureWeightedDBa","inletPerceivedLoudnessSones","outletPerceivedLoudnessSones","emailAddress","phone","contactUsEmailRequest","userEmail","userName","userPhone","ContactUsModal","emailValidationMessage","phoneValidationMessage","messageValidation","sendResponse","valid","validEmail","validateEmail","validPhone","validatePhone","sendSupportEmail","clearFields","test","String","RefrigerationLocationModal","accuArrangementSelected","displayFields","checkIfAutoSelected","Automatic","markAsSelected","getExhaustImages","getEndImages","sideBySideCircuitsOne","checkIfSelected","SingleCircuitSideBySide_P1","sideBySideCircuitsTwo","TwoCircuitSideBySideL_P3","TwoCircuitSideBySideInSeries_S3","stackedCircuitsOne","SingleCircuitOverUnderTopTunnel_P2","SingleCircuitOverUnderExhaust_M1","stackedCircuitsTwo","TwoCircuitOverUnderParallel_P4","TwoCircuitOverUnderExhaustSeries_M5","sideBySideCircuitsThree","ThreeCircuitSideBySide_T2","wshpSideBySideCircuitsOne","SingleCircuitWshpExhaust_W3","wshpSideBySideCircuitsTwo","TwoCircuitWshpExhaust_W6","wshpSideBySideCircuitsThree","ThreeCircuitWshpExhaust_W9","wshpSideBySideCircuitsFour","FourCircuitWshpExhaust_W12","SingleCircuitSideBySideEndTurned_M3","SingleCircuitSideBySideEnd_M4","TwoCircuitSideBySideEndParallel_M7","SingleCircuitOverUnderFullHeight_S1","SingleCircuitOverUnderEnd_M2","TwoCircuitOverUnderFullHeightParallel_S2","TwoCircuitOverUnderEndSeries_M6","singleTunnelCircuitsOne","SingleCircuitSingleTunnelEnd_P5","SingleCircuitSingleTunnelEndTurned_M8","singleTunnelCircuitsTwo","TwoCircuitSingleTunnelEndParallel_P6","TwoCircuitSingleTunnelEndSeries_M9","singleTunnelCircuitsThree","ThreeCircuitSingleTunnelT_T1","singleTunnelCircuitsFour","FourCircuitSingleTunnelEndParallel_F1","sideBySideCircuitsFour","FourCircuitSideBySide_F2","ThreeCircuitSideBySide_T3","stackedCircuitsFour","FourCircuitOverUnder_F3","stackedCircuitsThree","ThreeCircuitOverUnder_T4","SingleCircuitWshpEnd_W1","SingleCircuitWshpEndTurned_W2","TwoCircuitWshpEnd_W4","TwoCircuitWshpEndTurned_W5","ThreeCircuitWshpEndSeries_W8","ThreeCircuitWshpEndParallel_W7","FourCircuitWshpEndSeries_W11","FourCircuitWshpEndParallel_W10","wshpStackedCircuitsOne","wshpStackedCircuitsTwo","wshpStackedCircuitsThree","wshpStackedCircuitsFour","wshpSingleTunnelCircuitsOne","wshpSingleTunnelCircuitsTwo","wshpSingleTunnelCircuitsThree","wshpSingleTunnelCircuitsFour","refrigerationLocationResponse","getAllPoolValues","callGetEndpoint","getUnitType","callGetUnitType","getConfigInputsAllValues","getInletOutletValues","getTempsAndSystemValues","getSoundAttenuatorInputValues","componentName","getControlsInputValues","getBMSInputValues","getElectricalInputValues","getUnitCabinetInputValues","getWarrantyInputValues","runPerformanceCalcs","targetEndpoint","runFullUnitStructureRebuild","getComponentList","getUnitDrawing","routeParams","viewType","uiScreen","completeData","drawingRequest","ProjectId","UnitId","View","Type","CompleteData","callPostEndpoint","getInletOutletSizingDrawing","selectedConnection","inletOutletSizingSchematicRequest","SelectedConnection","callGetEndpoint2","jobSearch","searchText","jobSearchByStatusAndName","updateInputField","endpoint","targetVertex","fieldUpdateRequest","runPoolCalculations","deleteIndividualPool","poolIndex","addPoolRequest","addIndividualPool","requestObject","TransferProjectModal","individualErrors","searchByEmail","showResults","enableTransfer","userList","specmateJobCount","showSpinner","e","searchUsers","loginId","getUserList","onKeyDown","searchUsersKeyDown","ModalContainer","modalCSS","getModal","TopMenu","match","params","target","topMenuIndex","urlFragment","label","baseUrl","getBaseUrl","isActive","isPrevious","to","createMenuLink","withRouter","DesignSubMenu","isCurrentRoute","location","pathname","showPools","destination","getNextButton","getValidationError","validationErrors","cssClass","suppressErrorInUi","getPoolValidationError","getFilteredValidationErrors","errorsArray","errors","getNewValidationErrorsList","newValidationErrors","currentErrorsArray","getInputCSS","checkForErrors","getSelectBoxOptions","dropdownOptions","boxName","textValue","displayValue","getSelectBoxOptionsSingle","getNewDropdownList","newDropdownOptions","entries","getChecked","property","convertTubeWallThickness","incomingValue","convertFinThickness","ConfigurationInputs","userInputs","lastUpdatedTextbox","layoutSvg","showPrerequisiteErrors","prerequisiteErrorsList","showSecondaryHeatingToolTip","showSecondaryHeatSizingToolTip","uiDataContainer","primaryInputs","poolPrerequisiteErrors","getLayoutSchematic","PrimaryInputs","schematicSvg","saveInputValue","removeValidationError","checkReturnSupplyOutsideExhaustValidations","addValidationErrors","updateDropdowns","checkCoolingSelection","checkCfmLimitWarning","returnAirAltitudeOnlyAcfm","supplyAirAltitudeOnlyAcfmUserValue","outsideAirAltitudeOnlyAcfmUserValue","exhaustAirAltitudeOnlyAcfmUserValue","showCfmLimitWarning","showCfmLimitInfoBox","fields","showDxSplitWarning","showCoolingInfoBox","showDxSplitHGRWarning","displayMessage","newList","getPrerequisiteErrors","savedValues","getCSS","unitType","updateTextboxValue","onBlur","saveTextboxValue","unitQuantity","showEnergyRecoveryDevice","energyRecoveryDeviceType","unitLocationType","showAirflowArrangement","airflowArrangementType","airflowSystem","economizer","nightSetback","isPoolUnit","minPoolOutsideAirCfm","showOutsideAir","showSupplyAndReturnAir","disableCFMs","showExhaustAir","showUnitLayoutInputs","airTunnelOrientationType","returnAirDirectionType","returnAirDirectionDisabled","supplyTunnelLocationType","dangerouslySetInnerHTML","__html","coolingType","heatingType","showCoolHeatSequence","coolHeatSequenceType","coolHeatSequenceDisabled","preHeatType","showSecondaryHeating","secondaryHeating","disableSecondaryHeating","onMouseEnter","showTooltip","onMouseLeave","getTooltipContent","secondaryHeatSizing","soundAttenuatorType","humidifierManifoldType","airPrefilterLabel","outsideAirPrefilterType","highEfficiencyFilterLabel","outsideAirHighEfficiencyFilterType","supplyAirFinalFilterType","showReturnAirFilter","returnAirFilterType","toolTipMessage","getSecondaryHeatSizingMessage","tooltip","InletOutlet","connectionSvg","getConnectionSchematic","outsideAirInlet","outsideAndExhaustOpeningDisabled","outsideAirInletLocation","supplyAirOutletLocation","showReturnAirInlet","returnAirInletLocation","showExhaustAirOutlet","exhaustAirOutlet","exhaustAirOutletLocation","showVestibule","UnitSelection","FluidConditionsForWSHP","refrigerationInputs","waterSourceFluidType","glycolPercent","coolingEnteringFluidTemp","heatingEnteringFluidTemp","TempsSystem","disableInputs","checkForWinterDryBulbError","showWinterDryBulbWarning","oaConditionsClass","summerDryBulbFieldName","elevationReadOnly","elevation","summerDryBulbReadOnly","outsideSummerDryBulb","summerWetBulbFieldName","summerWetBulbReadOnly","outsideSummerWetBulb","outsideWinterDryBulb","renameSupplyESPToTotalESP","supplyEsp","showReturnESP","returnEsp","unitElectricalVoltage","showReturnAirConditions","returnAirConditionsReadOnly","returnSummerDryBulb","returnSummerRelativeHumidity","returnWinterDryBulb","returnWinterRelativeHumidity","showLeavingAirConditions","showCoolingDryBulbTemp","leavingAirConditionsReadOnly","coolingOffCoilDryBulb","showReheatTemp","reheatTemp","showPreheatDryBulbTemp","preheatDryBulb","showHeatingDryBulbTemp","heatingTemp","showWSHPfluidConditions","updateUnitDesign","enableReduxUpdate","perfResponse","hasCriticalError","criticalError","hasUserCasingLimitError","userCasingLimitMessage","hasCasingLimitError","casingErrorLimitMessage","hasUserCasingEscortError","userCasingEscortMessage","hasSecondaryError","secondaryErrorsList","warningMessages","element","UnitSizingLimits","fineTuneInputs","casingDimensionLimitType","casingHeightOrWidthLimit","basicDetails","coilAndFilterFpmLimit","RunPerformance","ChilledWaterCoil","operatingMode","coilInputs","chilledWaterCoilOpMode","chilledWaterCoil","enteringDryBulb","rows","enteringWetBulb","finsPerInch","leavingDryBulb","airPressureDrop","leavingWetBulb","gallonsPerMinute","enteringFluidTemperature","waterPressureDrop","leavingFluidTemperature","coilFluidType","showGlycolPercentage","maxWaterPressureDrop","tubeWallThickness","finMaterial","finThickness","includeTurbulators","HotWaterCoil","getCoilData","prevProps","hotWaterCoilOpMode","preHeatHotWaterCoilOpMode","hotWaterCoil","preheatHotWaterCoil","SteamCoil","steamCoilOpMode","steamCoil","steamPressure","condensate","tubeDiameter","Fan","dataContainer","quantityInHeight","quantityInWidth","getFanData","fanInputs","defaultFan","fanOptions","modelNumber","selectedModelNumber","getSelectedFan","getCSSClass","saveFanSelection","fanDiameter","fanRPM","motorRPM","hpPerFanLabel","staticEfficiencyPercent","fei","arrayLwAOutputDB","userSelectedWheelSize","isDefaultOption","dropDownOptionsNameWidth","dropDownOptionsNameHeight","hasVav","isVariableAirVolume","openFanCurveModal","openSoundDataModal","totalAirflow","minimumAirflowTurndown","totalStaticPressure","fanQuantityInHeight","fanQuantityInWidth","fanModelLine","getFanChoices","Filter","filterSizeUsed","getFilterData","filterInputs","filterOpMode","isSingleTunnel","loadingLevel","filterType","filterRemoval","filterRemovalDisabled","faceVelocity","filterSizeRestriction","CombinedFilter","filterInputsList","StageName","undefined","stage1FilterLoading","stage1CleanPressureDrop","stage2FilterLoading","stage2CleanPressureDrop","disableFilterRemoval","outsidePrefilter","filterLocation","highEfficiencyFilter","outsidePreFilterClass","showOutsideAirPreFilter","showHighEfficiencyFilter","highEfficiencyFilterClass","GetPressureDrop","HumidifierManifold","humidifierManifoldComponent","enteringRHPercent","getHumidifierManifoldData","humidifierManifoldInputs","humidifierManifoldOpMode","humidifierManifold","absorptionDistance","steamPressureEnabled","desiredLeavingRH","steamCapacity","steamSource","SoundAttenuator","soundAttenuatorComponent","getSoundAttenuatorData","soundAttenuatorInputs","soundAttenuator","soundAttenuatorLength","faceVelocityFPM","insertionLoss63Hz","insertionLoss1000Hz","insertionLoss125Hz","insertionLoss2000Hz","insertionLoss250Hz","insertionLoss4000Hz","insertionLoss500Hz","insertionLoss8000Hz","HeatWheel","heatWheelInputs","heatWheelOptions","getSelectedHeatWheel","replace","totalEffectiveness","summerLAT","summerWetBulbLAT","winterLAT","pressureDrop","selectedHeatWheel","getHeatWheelChoices","summerSensibleEff","summerLatentEff","summerTotalEff","winterSensibleEff","winterLatentEff","winterTotalEff","coolingEnthalpyRecoveryRatio","ElectricHeater","electricHeateroperatingMode","preheatElectricHeateroperatingMode","electricHeaterInputs","electricHeaterOpMode","preheatElectricHeaterOpMode","isSecondaryHeating","GetTitle","electricHeater","powerKw","amps","preheatElectricHeater","enteringDryBulbValueToShow","enteringDryBulbTemperature","powerKWPerHeater","amperagePerHeater","voltage","controlType","IndirectFiredFurnace","idfComponent","idf","idfOpMode","arrayDisplayString","leavingMBHOut","PlateHeatExchanger","plateHeatExchangerInputs","validationMessages","plateMessages","component","errorCollection","Inotification","getErrorNotifications","disablePlateInputs","plateHeatExhangerReadOnly","showPlateValidations","outsideAirflow","exhaustAirflow","squareAndSpacing","plateHxWidthMm","model","sensibleEffectiveness","summerTempEff","winterTempEff","PackagedAc","hasHotGasReheatCoil","hotGasReheatCoil","compressorType","propertyName","dxType","dxCoil","dxCoilOpMode","dxCoilOpModeHeating","hgrhCoilOpMode","isWSHP","fieldsetClass","showOrHideUpdate","getTitle","circuitQuantity","showCircuitQuantity","totalGPM","coolingTons","heatingTons","ambientTemp","energyEfficiencyRatio","showActualCompressorType","actualCompressorType","heatingCOP","dxSuctionTemperature","dxRows","dxTubeWallThickness","dxFinsPerInch","dxFinMaterial","dxRifledTubes","updateCheckbox","dxFinThickness","hgrhRows","hgrhTubeWallThickness","hgrhFinsPerInch","hgrhFinMaterial","hgrhFinThickness","OptimizeDesignInputs","displayName","selectComponent","componentPerformanceData","buttonArr","getButton","heatWheel","plateHx","supplyFan","exhaustFan","returnFan","outsideAirPreFilter","buttonLabel","stage2Rating","outsideAirHighEfficiencyFilter","supplyAirFilter","returnAirFilter","supplyAirSoundAttenuator","returnAirSoundAttenuator","components","unitSizingLimits","dxPackaged","dxPackagedHgrh","dxPackagedWSHP","dxPackagedHgrhWSHP","dxSplit","supplyAirFinalFilter","none","getComponentButtons","OptimizeDesign","overLimitErrorShown","runPerformanceCalculations","modal","resetToOptimized","optimizeDesignResponse","prerequisiteErrors","unit","isCustomized","isCustomizedDesign","casingHeightOptimized","casingWidthOptimized","approxWeightOptimized","heatingLeavingTempOptimized","coolingLeavingTempOptimized","mcaOptimized","mopOptimized","casingHeight","casingWidth","approxWeight","heatingLeavingTemp","coolingLeavingTemp","mca","mop","confirmReset","DrawingViewButtons","currentValue","TopUpperTunnel","TopBottomTunnel","FrontSide","BackSide","LeftEnd","RightEnd","Top","availableViewTypes","getButtonCSS","updateDrawingView","UnitDrawing","drawingState","svg","showUnitWidthTooltip","showUnitHeightTooltip","LengthLimitMessageShown","renderDefaultDrawing","defaultViewType","hoodAndLouverExtensions","showUnitLengthWarning","cabinetAndBaseHeight","hoodLouverExtensionInfo","getDefaultDrawing","showLengthLimitMessage","selectDrawingView","Drawing","dataPropertyErrors","drawings","unitDrawingSvg","bind","tooltipData","tooltipItems","getTooltipListItems","showLengthWarning","getViewButtonOptions","casingLength","shippingWeight","overallHeight","overallWidth","overallLength","operatingWeight","getWaterDesignTempMessage","getPoolApplicationTypeMessage","getTooltipMessage","SinglePoolInput","singlePoolInputs","ShowPoolDesignTypeToolTip","ShowPoolAreaToolTip","ShowWaterDesignTempToolTip","ShowPoolFeaturesToolTip","ShowActivityFactorToolTip","poolData","poolInputs","getFilteredPoolValidationErrors","pool","poolName","poolDesignType","poolArea","waterDesignTemp","poolFeatures","activityFactor","isFirstPool","deletePool","PoolInputs","poolSpaceInputs","poolOneInputs","poolTwoInputs","poolThreeInputs","poolFourInputs","poolFiveInputs","poolSpaceDisplayFields","poolsDisplayFields","poolValidationErrors","ShowDayDewPointToolTip","ShowPoolApplicationTypeToolTip","ShowPoolContructionTypeToolTip","ShowSpaceVolumeToolTip","ShowAirChangesPerHourToolTip","ShowDeckAreaToolTip","ShowWinterDesignDayDryBulbToolTip","ShowEvapMeanCoincidentDryBulbToolTip","ShowEvapWetBulbToolTip","ShowDesignDayDryBulbToolTip","ShowDryBulbMeanCoincidentWetBulbToolTip","ShowSummerSpaceLoadsToolTip","ShowWinterSpaceLoadsToolTip","ShowPurgeModeToolTip","ShowSeatsQuantityToolTip","ShowSeatingAreaToolTip","ShowSeatingIncludedInPoolDeckAreaToolTip","ShowPoolSpaceAirTemperatureToolTip","ShowSummerIndoorRelativeHumidityToolTip","ShowWinterIndoorRelativeHumidityToolTip","poolApplicationType","poolSpaceValues","addButtonClass","addPool","showPoolTwo","showPoolThree","showPoolFour","showPoolFive","dayDewPoint","updatePoolSpaceTextboxValue","poolConstructionType","summerSpaceLoadsWall","summerSpaceLoadsRoof","summerSpaceLoadsSolar","summerSpaceLoadsLighting","winterSpaceLoadsWalls","winterSpaceLoadsRoof","purgeMode","seatsQuantity","seatingArea","seatingIncludedInPoolDeckArea","spaceVolume","disableAirChangesPerHour","airChangesPerHour","deckArea","winterDesignDayDryBulb","showDesignDayDryBulb","designDayDryBulb","showDryBulbMeanCoincidentWetBulb","dryBulbMeanCoincidentWetBulb","showEvapMeanCoincidentDryBulb","evapMeanCoincidentDryBulb","showEvapWetBulb","evapWetBulb","calculatePoolValues","poolSpaceAirTemperature","summerIndoorRelativeHumidity","winterIndoorRelativeHumidity","spaceHeight","checkIsProEditMode","selectedUnit","selectedUnitId","unitCallInProgress","isProEditMode","UnitDesign","history","path","DrawingSubMenu","Drawings","LayoutSubMenu","DrawingViewer","drawingViewInfo","AccessDoors","topDrawingState","bottomDrawingState","topDrawingAvailableViewTypes","getDefaultDrawings","topDrawingView","selectTopDrawingView","selectBottomDrawingView","getDrawingState","drawingScreen","unitAccessSide","getTopDrawingViewer","getBottomDrawingViewer","CoilConnections","dxCoilFieldSetClass","showWaterConnectionsPenetration","dxCoilLegendClass","preHeatHotWaterUnitPenetration","preHeatHotWaterCoilInputs","unitPenetration","chilledWaterUnitPenetration","chilledWaterCoilInputs","hotWaterUnitPenetration","hotWaterCoilInputs","steamUnitPenetration","steamCoilInputs","dxUnitPenetration","hotGasReheatUnitPenetration","hgrhUnitPenetration","waterConnectionsUnitPenetration","showPreHeatHotWaterCoil","showChilledWaterCoil","showHotWaterCoil","showSteamCoil","showDxCoil","showHotGasReheatCoil","LayoutAdjustments","refrigerationUserInputs","refrigeratorDisplayFields","pageValidationErrors","showWshpAccessTooltip","refrigerationUIDataContainer","showErrorModal","ElectricalFurnacePanels","refrigerationSavedValues","accuArrangement","electricalPanelMountingFace","electricalPanelLocation","showFurnacePanel","furnacePanelLocation","showPackagedRefrigeration","manualACCUArrangement","openRefrigerationLocationModal","wshpAccess","SaveRefrigerationInputValue","getWshpAccessTooltipContent","stopPropagation","notificationId","pageErrors","errorString","prevState","LengthInputs","inputChanged","defaultDrawingRendered","checkForMinTransitionSpaceWarning","transitionAngles","saveAndCheckTransitionAngles","heatingCoolingAccess","allowFanDuctOverlap","minFanDoorLength","minFilterDoorLength","showEnergyRecoveryDoorLength","minEnergyRecoveryDoorLength","minCoilDoorLength","allOtherMinDoorLength","AccordionHeader","cssString","classname","active","subtitle","locked","getHeaderCSS","togglePanel","UnitSizing","drawingSVG","activeComponent","getDrawingSvg","convertToInletOutletLocationToText","inletOutletLocation","getActiveId","oaAcfm","outsideAirAltitudeOnlyAcfm","eaAcfm","exhaustAirAltitudeOnlyAcfm","outsideInletSizingMethod","outsideInletDimensionsAreReadOnly","outsideInletDimensionA","outsideInletDimensionB","outsideInletFaceVelocityIsReadOnly","outsideInletFaceVelocityFpm","showOutsideAirDimensionC","outsideInletDimensionC","outsideInletDimensionD","supplyAirOutlet","supplyAirAltitudeOnlyAcfm","supplyOutletSizingMethod","supplyOutletDimensionsAreReadOnly","supplyOutletDimensionA","supplyOutletDimensionB","supplyOutletFaceVelocityIsReadOnly","supplyOutletFaceVelocityFpm","supplyOutletDimensionC","supplyOutletDimensionD","returnAirInlet","returnInletSizingMethod","returnInletDimensionsAreReadOnly","returnInletDimensionA","returnInletDimensionB","returnInletFaceVelocityIsReadOnly","returnInletFaceVelocityFpm","returnInletDimensionC","returnInletDimensionD","exhaustOutletSizingMethod","exhaustOutletDimensionsAreReadOnly","exhaustOutletDimensionA","exhaustOutletDimensionB","exhaustOutletFaceVelocityIsReadOnly","exhaustOutletFaceVelocityFpm","showExhaustAirDimensionC","exhaustOutletDimensionC","exhaustOutletDimensionD","getSketchTitle","getConnectionLocation","getDrawingDescription","isTopView","UnitLayout","InletOutletSizing","AddNewProject","getProjectList","selectProject","updateEditedProject","updatedProjectName","NewPageSelected","transferProject","SetupPaginationWithNewProjectList","addNewUnit","projectIdString","newUnitId","addUnitResult","deleteProject","deleteUnitById","getUnitsResponse","getProjectRows","lastModifiedDate","editProject","openProjectCopyModal","deleteProjectPrompt","units","showOutputLink","getOutputDocsUrl","transferProjectPrompt","pm","hasProUnits","modalData1","projectIdToDelete","copyUnitToProject","targetProject","copyProjectWithUnits","sortByJobName","sortby","clonedList","cloneDeep","ASC","sort","compareASC","DESC","compareDESC","sortByLastModified","compareDateASC","compareDateDESC","a","b","aName","bName","hasOwnProperty","toUpperCase","projectNameSort","projectLastModifiedSort","totalRecords","currentRecords","slice","page","beginIndex","endIndex","newCurrentPage","Unit","spinnerClass","unitPrice","priceAvailable","isPriceAvailable","rowClass","copyClass","deleteClass","editUnit","openUnitCopyModal","deleteUnitPrompt","openProUnitPrompt","PagingControl","pages","getPageLinksCssClasses","blueClass","eventsClass","getPages","activeClass","totalPages","blue","objPrev","unshift","objNext","ProjectManagement","jobNameSearchText","jobIdSearchText","hasEmployeeRole","copyProjectId","copyProjectHasError","showStatusDropdown","runSearchByJobName","projectStatus","CopyProjectById","projectIdNumeric","copyRequest","newOwnerFirstName","newOwnerLastName","getProjectListByStatusAndName","pj","searchCount","filteredStatusHide","projectNameUpArrowColor","projectNameDownArrowColor","projectLastUpdateUpArrowColor","projectLastUpdateDownArrowColor","statusDropdown","handleKeyDown","handleKeyDownCopyProjectById","clearFilter","saveStatusType","handleProjectStatusClick","createDate","addNewUnitToJob","getUnitRows","SpecSubMenu","nextBtnClass","BMSSetPoints","componentData","bmsDisplayFields","openPointsAccordion","controlsInputs","togglePointsPanel","isSetPoint","validationClass","systemPointsActive","spReturnDehumControlDewDisplayName","spSpaceUnOccupiedDehumControlDisplayName","show_Any","show_SpSupplyTemp","spSupplyTemp","show_SpUnoccSupplyTemp","spUnoccSupplyTemp","show_SpActiveReturnTempCooling","spActiveReturnTempCooling","show_SpActiveReturnTempHeating","spActiveReturnTempHeating","show_SpUnoccupiedReturnTempCoolingF","spUnoccupiedReturnTempCoolingF","show_SpUnoccupiedReturnTempHeatingF","spUnoccupiedReturnTempHeatingF","show_SpActiveSpaceTempCooling","spActiveSpaceTempCooling","show_SpActiveSpaceTempHeating","spActiveSpaceTempHeating","show_SpUnoccCool","spUnoccCool","show_SpUnoccHeat","spUnoccHeat","show_SpOutsideResetMinOat","spOutsideResetMinOat","show_SpOutsideResetMaxOat","spOutsideResetMaxOat","show_SpOutsideResetMinLat","spOutsideResetMinLat","show_SpOutsideResetMaxLat","spOutsideResetMaxLat","show_SpMaxSFTurndown","spMaxSFTurndown","show_SpOccupiedSupplyFanSpeed","spOccupiedSupplyFanSpeed","show_SpUnoccupiedSupplyFanSpeed","spUnoccupiedSupplyFanSpeed","show_SpDehumCoilLeaving","spDehumCoilLeaving","show_SpHeatMin","disableEditing_SpHeatMin","spHeatMin","show_SpHeatMax","spHeatMax","show_SpCoolMin","spCoolMin","show_SpCoolMax","spCoolMax","show_SpDefrost","spDefrost","show_SpEconomizerActivationDegree","spEconomizerActivationDegree","show_SpEconomizerActivationBtu","spEconomizerActivationBtu","show_SpPreheat","spPreheat","show_SpSupplyWheelDifferential","spSupplyWheelDifferential","show_SpExhaustWheelDifferential","spExhaustWheelDifferential","show_SpPreheatLockout","spPreheatLockout","show_SpHeatingLockout","spHeatingLockout","show_SpCoolLockout","spCoolLockout","show_SpReturnDehumControlDew","spReturnDehumControlDew","show_SpReturnDehumControlHumidity","spReturnDehumControlHumidity","show_SpOutsideDehumControlDew","spOutsideDehumControlDew","show_SpSpaceDehumControlDew","spSpaceDehumControlDew","show_SpSpaceUnoccupiedDehumControlHumidity","spSpaceUnoccupiedDehumControlHumidity","show_SpDehumidCoilLeavingMinSetPt","spDehumidCoilLeavingMinSetPt","show_SpPoolSpaceStaticPressureVsAdjSpace","spPoolSpaceStaticPressureVsAdjSpace","show_SpPoolSpaceStaticPressureVsOutdoor","spPoolSpaceStaticPressureVsOutdoor","show_SpMinOaControlCfm","disableEditing_SpMinOaControlCfm","spMinOaControlCfm","show_SpMaxOaControlCfm","spMaxOaControlCfm","show_SpSupplyCfm","spSupplyCfm","show_SpMinOaControlAirflow","spMinOaControlAirflow","show_SpSupplyFanControlCfm","spSupplyFanControlCfm","show_SpExhaustReliefFanSpace","spExhaustReliefFanSpace","show_SpExhaustReliefFanCfm","spExhaustReliefFanCfm","show_SpReturnReliefFanCfm","spReturnReliefFanCfm","show_SpTrackSupplyFanOffsetReturnFanCFM","spTrackSupplyFanOffsetReturnFanCFM","show_SpTrackSupplyFanOffsetExhaustFanCfm","spTrackSupplyFanOffsetExhaustFanCfm","show_SpExhaustOaOffset","spExhaustOaOffset","show_SpCO2","spCO2","show_SpCo2oaAirflow","spCo2oaAirflow","show_SpHighDuctNum","spHighDuctNum","show_SpLowDuctNum","spLowDuctNum","show_SpSupplyFanControlDuct","spSupplyFanControlDuct","show_SpReturnReliefFanDuct","spReturnReliefFanDuct","show_SpReturnReliefFanSpace","spReturnReliefFanSpace","show_SpExhaustReliefFanDuct","spExhaustReliefFanDuct","show_SpFreezestatNum","spFreezestatNum","show_SpHumidLockout","spHumidLockout","show_SpHumid","spHumid","show_SpReturnHumidRh","spReturnHumidRh","show_SpSpaceHumidRh","spSpaceHumidRh","show_SpUnoccHumid","spUnoccHumid","show_AddHardWiredInput","addHardWiredInput","show_AddSupplyAirHumidity","addSupplyAirHumidity","show_AddOutsideAirHumidity","addOutsideAirHumidity","show_AddReturnAirTemp","addReturnAirTemp","show_AddReturnAirHumidity","addReturnAirHumidity","show_AddExhaustAirTemp","addExhaustAirTemp","show_AddExhaustAirHumidity","addExhaustAirHumidity","show_AddSpaceAirTemp","addSpaceAirTemp","show_AddSpaceAirHumidity","addSpaceAirHumidity","show_AddMixedAirTemp","addMixedAirTemp","show_AddMixedAirHumidity","addMixedAirHumidity","show_AddCoolingEnteringAirTemp","addCoolingEnteringAirTemp","show_AddCoolingLeavingAirTemp","addCoolingLeavingAirTemp","show_AddHeatingEnteringAirTemp","addHeatingEnteringAirTemp","show_AddHeatingLeavingAirTemp","addHeatingLeavingAirTemp","show_AddPreheatingEnteringAirTemp","addPreheatingEnteringAirTemp","show_AddSupplyCfm","addSupplyCfm","show_AddExhaustCfm","addExhaustCfm","show_AddReturnCfm","addReturnCfm","show_AddOutsideAirCfm","addOutsideAirCfm","show_AddHxenteringOutsideAirTemp","addHxenteringOutsideAirTemp","show_AddHxleavingSupplyAirTemp","addHxleavingSupplyAirTemp","show_AddHxenteringExhaustAirTemp","addHxenteringExhaustAirTemp","show_AddHxsupplyDifferentialPressure","addHxsupplyDifferentialPressure","show_AddHxexhaustDifferentialPressure","addHxexhaustDifferentialPressure","show_AddSupplyDuctStaticPressure","addSupplyDuctStaticPressure","show_AddReturnDuctStaticPressure","addReturnDuctStaticPressure","show_AddExhaustDuctStaticPressure","addExhaustDuctStaticPressure","show_AddSpaceStaticPressure","addSpaceStaticPressure","show_AddFilterPressureAnalogInput","addFilterPressureAnalogInput","show_AddFilterPressureTransducer","addFilterPressureTransducer","show_AddSpaceCo2","addSpaceCo2","show_AddReturnCo2","addReturnCo2","show_AddDrainCondensate","addDrainCondensate","show_AddHeatWheelRotationDetection","addHeatWheelRotationDetection","show_AddFreezestat","addFreezestat","show_AddHighSupplyDuctStatic","addHighSupplyDuctStatic","show_AddLowReturnDuctStatic","addLowReturnDuctStatic","Controls","oaDamperConstructionWarningShown","prevIncludeOutsideAirInletAirflowMonitoring","openSystemInputsAccordion","openSystemOptionsAccordion","includeOutsideAirInletAirflowMonitoring","systemInputsActive","systemOptionsActive","dehumidControlDisplayName","toggleSystemInputPanel","controlsInclusionDisabled","controlsInclusion","damperActuatorsInclusionEnabled","damperActuatorsInclusion","showInterfaceCard","interfaceCard","airFlowArrangementLabel","vavOrConstantVolumeLabel","showSupplyFanControl","supplyFanControl","supplyFanControlDisabled","showExhaustFanControl","exhaustFanControl","showReturnFanControl","returnFanControl","showTemperatureControl","temperatureControl","temperatureControlDisabled","showEconomizerInitiation","economizerInitiation","economizerInitiationDisabled","showMinimumOutsideAirControl","minimumOAControlEnabled","minimumOutsideAirControl","showUnoccupiedModeControl","unoccupiedModeControl","unoccupiedModeControlDisabled","showDehumidificationControl","dehumidificationControl","dehumidificationControlDisabled","showHumidificationControl","humidificationControl","showMasterSlaveMultiUnitControl","masterSlaveMultiUnitControl","toggleSystemOptionsPanel","showIncludeUnoccupiedWarmUp","includeUnoccupiedWarmUp","showIncludeUnoccupiedCoolDown","includeUnoccupiedCoolDown","showIncludeHeatWheelRotationDetection","includeHeatWheelRotationDetection","showIncludeDemandControlVentilationCO2","includeDemandControlVentilationCO2","showIncludeDirtyFilterSwitches","includeDirtyFilterSwitches","showIncludeFilterPressureTransducers","includeFilterPressureTransducers","showIncludeCondensateDrainPanOverflowSwitch","includeCondensateDrainPanOverflowSwitch","showIncludeFreezestat","freezeStateEnabled","includeFreezestat","showIncludeHighDuctStaticPressure","includeHighDuctStaticPressure","showIncludeLowDuctStaticPressure","includeLowDuctStaticPressure","includeOutsideAirInletDamper","outsideAirInletDamperEnabled","showIncludeReturnAirInletDamper","includeReturnAirInletDamper","showIncludeExhaustAirOutletDamper","includeExhaustAirOutletDamper","showIncludeReturnAirInletSmokeDamper","includeReturnAirInletSmokeDamper","includeSupplyAirOutletSmokeDamper","outsideAirInletAirflowMonitoringEnabled","enableSupplyFanAirFlowMonitoring","includeSupplyFanAirflowMonitoring","showExhaustFanAirFlowMonitoring","includeExhaustFanAirflowMonitoring","enableExhaustFanAirFlowMonitoring","showReturnFanAirFlowMonitoring","enableReturnFanAirFlowMonitoring","includeReturnFanAirflowMonitoring","includeMagnehelicGauges","BMSPoints","PrimaryPower","voltageLabel","shortCircuitCurrentRating","hasDisconnectFusing","disconnectFusingDisabled","phaseVoltageProtectionDisabled","hasPhaseVoltageProtection","FanVFDDisplayGroup","fanData","fanDropDownOptions","supplyFanDriveTypeOptions","fanUIDataContainer","disableManualBypass","disableSupplyManualBypass","supplyFanInputs","exhaustFanDriveTypeOptions","disableExhaustManualBypass","exhaustFanInputs","returnFanDriveTypeOptions","disableReturnManualBypass","returnFanInputs","fanArrayVfdSharing","disableMicroDrivesCheckbox","allowMicroDrives","hasManualBypass","FanVFDInstall","vfdProvisionInstallation","FanVFD","panelArr","showSupplyFan","showExhaustFan","showReturnFan","getFanDisplayGroups","Circuit120V","lightInclusion","gfciQuantity","singlePhaseCircuitPower","Circuit24V","smokeDetectors","showSmokeDetectorInclusion","smokeDetectorInclusion","showSmokeDetectorType","smokeDetectorType","Electrical","EnthalpyWheel","openAccordion","spareBeltQuantity","CoilDisplayGroup","coilCoatingOptionsName","getCoilCoatingOptionsName","casingConstruction","coilCoating","CoilDisplayGroupDX","dxCasingConstruction","dxCoilCoating","CoilDisplayGroupHGRH","hgrhCasingConstruction","hgrhCoilCoating","Coils","IDF","indirectFiredFurnaceInputs","tubeMaterial","fuelType","minTotalTurndown","Refrigeration","condenserCoilCoating","FilterSpares","showPleatedFilterDropdown","pleatedSpareFilterSetsQuantity","showCartridgeFilterDropdown","cartridgeSpareFilterSetsQuantity","showAluminumFilterDropdown","aluminumSpareFilterSetsQuantity","FanDisplayGroup","prevInputs","newInputs","update","valueHasChanged","motorEnclosureType","hasInletGuard","includeDoorSafetyKillSwitch","hasOutletSafetyCage","prevValue","refreshAllFanData","saveInputValueAllFans","motorEnclosureOptions","shaftGroundingType","shaftGroundingOptions","showSafetyCage","Fans","supplyFanMotorEnclosureOptions","exhaustFanMotorEnclosureOptions","returnFanMotorEnclosureOptions","supplyFanShaftGroundingOptions","exhaustFanShaftGroundingOptions","returnFanShaftGroundingOptions","allFansUIResponse","outletSafetyCageClass","showSupplyFanOutletSafetyCage","showExhaustFanOutletSafetyCage","showReturnFanOutletSafetyCage","DamperDisplayGroup","damperInputs","motorizedOrGravity","damperConstruction","constructionOptions","bladeType","actuatorType","Dampers","showOutsideAirDamper","outsideAirDamperInputs","damperConstructionOptionsOutsideAir","showEconomizerDamper","economizerDamperInputs","damperConstructionOptionsEconomizer","showExhaustAirDamper","exhaustAirDamperInputs","damperConstructionOptionsExhaustAir","showReturnAirDamper","returnAirDamperInputs","damperConstructionOptionsReturnAir","showSupplyAirDamper","supplyAirDamperInputs","damperConstructionOptionsSupplyAir","showOutsideAirBypassDamper","outsideAirBypassDamperInputs","damperConstructionOptions","showExhaustAirBypassDamper","exhaustAirBypassDamperInputs","showRecirculationDamper","recirculationDamperInputs","showFaceAndBypassDamper","faceAndBypassDamperInputs","WaterSourceHeatPump","waterValveType","vestibuleHeater","Construction","bodyContentClass","componentList","hasHotWaterCoil","hasPreheatHotWaterCoil","hasChilledWaterCoil","hasSteamCoil","hasPackagedRefrigeration","hasDxSplit","hasWSHP","hasOutsideAirPrefilter","hasReturnAirFilter","hasSupplyAirFinalfilter","hasOutsideAirHighEfficiencyFilter","hasSupplyFan","hasReturnFan","hasExhaustFan","hasHeatWheel","anyCoilsExist","hasIdf","anyFiltersExist","anyFansExist","hasDampers","Warranties","unitPartsWarranty","showCompressorWarranty","compressorWarranty","showPlateHXWarranty","getTextBoxValue","showIDFWarranty","Exterior","exteriorMaterial","showExteriorMaterialPaintColor","exteriorMaterialPaintColor","mountingType","showCurbProvidecBy","curbProvidedBy","casingWallThickness","showCurbHeight","curbHeight","shippingShrinkWrapEnabled","shippingShrinkWrap","Interior","toolTipDisplay","coolingOptionSelected","humidifierManifoldSharesDrainPanWithCooling","interiorMaterial","interiorMaterialDisabled","perforatedLiner","floorConstruction","floorMaterial","showSensiblePlateDrainPanMaterial","sensiblePlateDrainPanMaterial","sensiblePlateDrainPanMaterialDisabled","showCoolingCoilDrainPanMaterial","coolingCoilDrainPanMaterial","coolingCoilDrainPanMaterialDisabled","showHumidifierManifoldDrainPanMaterial","humidifierManifoldDrainPanMaterial","humidifierManifoldDrainPanMaterialDisabled","floorDrainsInletAndMixingBoxSections","floorDrainsOutletSections","showWSHPVestibuleSections","floorDrainsWshpVestibuleSection","floorDrainsAllSections","Doors","doorLengthWarningShown","windowInclusion","thermalBreak","windowTypeEnabled","windowType","pressureReliefLatch","interiorHandles","tieBack","lock","doorHandleInterlock","testPort","warning","UnitCabinet","SpecItems","OutputsSubMenu","submitPdfProcessingRequest","pdfProcessingRequest","getPdfProcessingRecords","Outputs","timer","versionTemplate","submittalCoverSheet","poolDesignSummary","performanceDataSummary","unitDrawing","salesGuidSpecification","quote","salesScope","airflowSchematic","sensorSchematic","powerElectricalSchematic","waterPipingSchematic","drainTrapDetail","submittalScope","warranty","termsAndConditions","docSelectAll","unitSelectAll","generateDocsClicked","unitSelected","sequenceGenerator","baseDetail","curbDetail","componentsInstalledByOthers","designRadioButton","quoteRadioButton","submittalRadioButton","hasPool","doesAnyUnitHaveWshp","outputUnits","checkForPool","checkIfAnyUnitHasWshp","dtos","pdfProcessingRecords","activeRecords","processingStatusName","doesUnitHaveWshp","winterDryBulb","preHeat","Disabled","DisableGenerateButton","docSelectText","unitSelectText","DocumentPackageTypeRadioClick","href","SelectAllDocuments","SelectAllUnits","buildUnitCheckboxes","SubmitProcessingRequest","getListOfPdfRecords","getPdfRows","list","getRowClassName","getPdfStatus","unitIdListString","unitTagsListString","documentType","getPdfLink","getPdfError","statusName","pdfUrl","pollingProjectMatches","pdfProcessingDTOs","unitIds","unitTags","UnitIds","SubmittalCoverSheet","PoolDesignSummary","PerformanceDataSummary","SalesGuidSpecification","Quote","SalesScope","GuideSpecVersionTemplate","AirflowSchematic","SensorSchematic","DrainTrapDetail","PowerElectricalSchematic","WaterPipingSchematic","SubmittalScope","InnoventStandardWarranty","TermsAndConditions","SequenceGenerator","BaseDetail","CurbDetail","ComponentsInstalledByOthers","IsDesignDocumentType","IsQuoteDocumentType","IsSubmittalDocumentType","UnitTags","ClearAllDocuments","ClearAllUnitCheckboxes","newlySavedUnitIds","savedUnitId","unitToUpdate","needsFullSave","docChecked","unitChecked","copyUnits","checkedUnits","isOversized","updateUnitSelected","radioName","CadOutputs","revit","dataRows","getUnitList","getCadFiles","cadFileProcessingDTOs","processingRequest","unitTagListString","fileType","cadFileUrl","PdfOutputs","IdentityContext","LoginStart","username","password","isLoggedIn","loggedIn","login","contextType","IdentityLogin","completeLogin","saveUserIdentity","LoginId","ProfileData","IdentityLogout","completeLogout","TopRightMenu","iconDesc","saveInProgress","hasRepRole","checkForRepRole","modalTitle","matchPath","exact","strict","route","displayMenu","saveClass","showSaveIconDesc","showIconDesc","saveUnit","openContactUsModal","getPriceAndRecalcLevel","updateUnitPrice","graphUnitPricingRequest","saveToDatabase","err","TopRightPricing","totalPrice","listPrice","updateInProgress","hasErrors","errorMessages","priceResponse","needsUpdate","recalcLevel","price","unitTotalListPrice","errorArray","updatePrice","priceClass","priceBtnClass","togglePriceErrorModal","closeErrorModal","getErrorMessages","ProjectHeader","headerTitle","getHeaderData","newParams","displayHeading","ProjectManagementHeader","ServerError","clearAuthData","closeError","Notification","ModalNotifications","getNotifications","Loading","loadingCSS","mainCSS","PrivateRoute","_asyncRequest","cancel","Component","rest","render","getAppVersionNumber","App","version","clearTimeout","getPDFRecordsAndConfigurePolling","previousActiveRecordsCount","previousShowDocsReadyNotificationIcon","isOnOutputPage","PollForStatusUpdates","setTimeout","Provider","imgLogo","Boolean","hostname","ReactDOM","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.ba190440.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","export const updateReduxAction = (actionType: string, data: any) => {\r\n return {\r\n type: actionType,\r\n newState: data\r\n };\r\n};\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n updateRedux: (actionType: string, data: object) => dispatch(updateReduxAction(actionType, data))\r\n };\r\n}\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport '../../css/Modals.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n reduxModals: any;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\n//This component is a modal with OK and Cancel buttons.\r\n//Mostly used by the \"Full Details\" buttons and elsewhere on the performance screen & accordions.\r\nclass ModalPopup extends React.Component {\r\n //Save the user's response and close the modal\r\n private userResponse(response: string) {\r\n this.props.updateRedux('UPDATE_MODALS', { showModal: false, userResponse: response, hideCancelBtn: false });\r\n }\r\n\r\n public render() {\r\n const data = this.props.reduxModals.modalData;\r\n\r\n return (\r\n
\r\n
{this.props.reduxModals.modalData.title}
\r\n\r\n {data.content ?
{data.content}
:
}\r\n\r\n
\r\n
this.userResponse('ok')}>\r\n OK\r\n
\r\n {\r\n //Hide the cancel button for prerequisite error modal\r\n this.props.reduxModals.hideCancelBtn ? null : (\r\n
this.userResponse('cancel')}>\r\n Cancel\r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ModalPopup);\r\n","//Used for all redux reducers\r\nexport interface IAction {\r\n type: string;\r\n newState: object;\r\n}\r\n\r\n//Used for reduxValidation\r\nexport interface IModifyPropertyError {\r\n reduxObjectName: string;\r\n propertyName: string;\r\n errorMessage: string;\r\n}\r\n\r\n//Used for reduxNotifications\r\nexport interface INotification {\r\n id: string;\r\n notificationType: string;\r\n title: string;\r\n content: any;\r\n}\r\n\r\n//Used for UserInfo (Identity Service)\r\nexport interface IUserInfo {\r\n userId : string;\r\n userType :string ;\r\n firstName : string;\r\n lastName : string;\r\n email : string;\r\n officeMembershipsArr : any[];\r\n}\r\n\r\nexport interface Ierror {\r\n validationError: string | null;\r\n modifyPropertyError: string | null;\r\n}\r\nexport enum ACCUArrangement {\r\n SingleCircuitSideBySide_P1,\r\n SingleCircuitOverUnderTopTunnel_P2,\r\n TwoCircuitSideBySideL_P3,\r\n TwoCircuitOverUnderParallel_P4,\r\n SingleCircuitOverUnderFullHeight_S1,\r\n TwoCircuitOverUnderFullHeightParallel_S2,\r\n TwoCircuitSideBySideInSeries_S3,\r\n SingleCircuitOverUnderExhaust_M1,\r\n SingleCircuitOverUnderEnd_M2,\r\n SingleCircuitSideBySideEndTurned_M3,\r\n SingleCircuitSideBySideEnd_M4,\r\n TwoCircuitOverUnderExhaustSeries_M5,\r\n TwoCircuitOverUnderEndSeries_M6,\r\n TwoCircuitSideBySideEndParallel_M7,\r\n Automatic = \"Automatic\",\r\n SingleCircuitSingleTunnelEnd_P5 = 15,\r\n SingleCircuitSingleTunnelEndTurned_M8 = 16,\r\n TwoCircuitSingleTunnelEndParallel_P6 = 17,\r\n TwoCircuitSingleTunnelEndSeries_M9 = 18,\r\n ThreeCircuitSingleTunnelT_T1 = 19,\r\n FourCircuitSingleTunnelEndParallel_F1 = 20,\r\n ThreeCircuitSideBySide_T2 = 21,\r\n ThreeCircuitSideBySide_T3 = 22,\r\n FourCircuitSideBySide_F2 = 23,\r\n ThreeCircuitOverUnder_T4 = 24,\r\n FourCircuitOverUnder_F3 = 25,\r\n SingleCircuitWshpEnd_W1 = 26,\r\n SingleCircuitWshpEndTurned_W2 = 27,\r\n SingleCircuitWshpExhaust_W3 = 28,\r\n TwoCircuitWshpEnd_W4 = 29,\r\n TwoCircuitWshpEndTurned_W5 = 30,\r\n TwoCircuitWshpExhaust_W6 = 31,\r\n ThreeCircuitWshpEndParallel_W7 = 32,\r\n ThreeCircuitWshpEndSeries_W8 = 33,\r\n ThreeCircuitWshpExhaust_W9 = 34,\r\n FourCircuitWshpEndParallel_W10 = 35,\r\n FourCircuitWshpEndSeries_W11 = 36,\r\n FourCircuitWshpExhaust_W12 = 37\r\n}\r\nexport enum AirTunnelOrientation {\r\n NotSet = 0,\r\n Stacked = 1,\r\n SideBySide = 2,\r\n}\r\nexport interface IHeatWheelOption{\r\n isDefaultSelection: boolean,\r\n modelNumber: string,\r\n WheelDiameter: number,\r\n totalEffectiveness: number,\r\n summerLAT: number,\r\n summerWetBulbLAT: number,\r\n winterLAT: number,\r\n pressureDrop: number,\r\n summerSensibleEff: number,\r\n summerLatentEff: number,\r\n summerTotalEff: number,\r\n winterSensibleEff: number,\r\n winterLatentEff: number,\r\n winterTotalEff: number\r\n}\r\nexport enum SortBy {\r\n None = 0,\r\n ASC = 1,\r\n DESC = 2\r\n}\r\nexport enum ProjectStatusFilterBy {\r\n All = 0,\r\n Design = 1,\r\n Booking = 2,\r\n Release = 3\r\n}","import { IAction, SortBy, ProjectStatusFilterBy } from '../../interfaces/interfaces';\r\n//Default values \r\nlet projectManagement:any = {\r\n projectList: [],\r\n projectId: '',\r\n selectedProject: null,\r\n unitList: [],\r\n newUnitTag: '',\r\n statusTypes: [],\r\n projectName: '',\r\n jobStatus:ProjectStatusFilterBy.Design,\r\n projectStatusFilterBy: ProjectStatusFilterBy.All,\r\n projectNameSortBy: SortBy.None,\r\n projectLastModifiedSortBy: SortBy.None,\r\n currentProjectList:[],\r\n totalProjectRecords: 0,\r\n projectRecordsPerPage: 10,\r\n currentPage: 1,\r\n selectedUserId: \"\"\r\n}\r\n\r\nexport const reduxProjectManagement = (state = projectManagement, action: IAction) => {\r\n if (action.type === 'UPDATE_PROJECT_MANAGEMENT') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};","import { IAction } from '../../interfaces/interfaces';\r\n\r\n//Default values \r\nlet defaultValues:any = {\r\n showResetToOptimized: false,\r\n showRecalcButton: false,\r\n showUserModifiedValues: false,\r\n selectedComponent:null,\r\n selectedComponentName: \"\"\r\n}\r\n\r\nexport const reduxOptimizeDesign = (state = defaultValues, action: IAction) => {\r\n if (action.type === 'UPDATE_OPTIMIZE_DESIGN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};","/* tslint:disable */\r\n/* eslint-disable */\r\n//----------------------\r\n// \r\n// Generated using the NSwag toolchain v12.2.5.0 (NJsonSchema v9.13.37.0 (Newtonsoft.Json v9.0.0.0)) (http://NSwag.org)\r\n// \r\n//----------------------\r\n// ReSharper disable InconsistentNaming\r\n\r\nexport class ConnectClient {\r\n public transformOptions: (opts: any) => Promise = opts => Promise.resolve(opts);\r\nprivate http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\r\n private baseUrl: string;\r\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\r\n\r\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\r\n this.http = http ? http : window;\r\n this.baseUrl = baseUrl ? baseUrl : \"\";\r\n }\r\n\r\n token(model: GenerateTokenModel): Promise {\r\n let url_ = this.baseUrl + \"/api/Connect/Token\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(model);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processToken(_response);\r\n });\r\n }\r\n\r\n protected processToken(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n dummyMethodRequiringAuthentication(): Promise {\r\n let url_ = this.baseUrl + \"/api/Connect/DummyMethodRequiringAuthentication\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processDummyMethodRequiringAuthentication(_response);\r\n });\r\n }\r\n\r\n protected processDummyMethodRequiringAuthentication(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\nexport class DataClient {\r\n public transformOptions: (opts: any) => Promise = opts => Promise.resolve(opts);\r\nprivate http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\r\n private baseUrl: string;\r\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\r\n\r\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\r\n this.http = http ? http : window;\r\n this.baseUrl = baseUrl ? baseUrl : \"\";\r\n }\r\n\r\n getAllProjects(statusTypeId: number, createdById: string | null): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getAllProjects/{statusTypeId}/{createdById}\";\r\n if (statusTypeId === undefined || statusTypeId === null)\r\n throw new Error(\"The parameter 'statusTypeId' must be defined.\");\r\n url_ = url_.replace(\"{statusTypeId}\", encodeURIComponent(\"\" + statusTypeId)); \r\n if (createdById === undefined || createdById === null)\r\n throw new Error(\"The parameter 'createdById' must be defined.\");\r\n url_ = url_.replace(\"{createdById}\", encodeURIComponent(\"\" + createdById)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetAllProjects(_response);\r\n });\r\n }\r\n\r\n protected processGetAllProjects(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getProjectsBySearchText(statusTypeId: number, createdById: string | null, searchText: string | null): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getProjectsBySearchText/{statusTypeId}/{createdById}/{searchText}\";\r\n if (statusTypeId === undefined || statusTypeId === null)\r\n throw new Error(\"The parameter 'statusTypeId' must be defined.\");\r\n url_ = url_.replace(\"{statusTypeId}\", encodeURIComponent(\"\" + statusTypeId)); \r\n if (createdById === undefined || createdById === null)\r\n throw new Error(\"The parameter 'createdById' must be defined.\");\r\n url_ = url_.replace(\"{createdById}\", encodeURIComponent(\"\" + createdById)); \r\n if (searchText === undefined || searchText === null)\r\n throw new Error(\"The parameter 'searchText' must be defined.\");\r\n url_ = url_.replace(\"{searchText}\", encodeURIComponent(\"\" + searchText)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetProjectsBySearchText(_response);\r\n });\r\n }\r\n\r\n protected processGetProjectsBySearchText(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getProjectByProjectId(projectId: string | null): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getProjectByProjectId/{projectId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetProjectByProjectId(_response);\r\n });\r\n }\r\n\r\n protected processGetProjectByProjectId(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getEnumValues(enumID: number): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getEnumValues/{enumID}\";\r\n if (enumID === undefined || enumID === null)\r\n throw new Error(\"The parameter 'enumID' must be defined.\");\r\n url_ = url_.replace(\"{enumID}\", encodeURIComponent(\"\" + enumID)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetEnumValues(_response);\r\n });\r\n }\r\n\r\n protected processGetEnumValues(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n // updateProject(request: ProjectRequest): Promise {\r\n // let url_ = this.baseUrl + \"/dataapi/updateProject\";\r\n // url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n // const content_ = JSON.stringify(request);\r\n\r\n // let options_ = {\r\n // body: content_,\r\n // method: \"POST\",\r\n // headers: {\r\n // \"Content-Type\": \"application/json\", \r\n // \"Accept\": \"application/json\"\r\n // }\r\n // };\r\n\r\n // return this.transformOptions(options_).then(transformedOptions_ => {\r\n // return this.http.fetch(url_, transformedOptions_);\r\n // }).then((_response: Response) => {\r\n // return this.processUpdateProject(_response);\r\n // });\r\n // }\r\n\r\n protected processUpdateProject(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n addNewProject(request: ProjectRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/addNewProject\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processAddNewProject(_response);\r\n });\r\n }\r\n\r\n protected processAddNewProject(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n addNewUnit(unit: UnitDTO): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/addNewUnit\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(unit);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processAddNewUnit(_response);\r\n });\r\n }\r\n\r\n protected processAddNewUnit(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnits(projectId: number): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getUnits/{projectId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnits(_response);\r\n });\r\n }\r\n\r\n protected processGetUnits(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnitsForOutputDocUI(projectId: number): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getUnitsForOutputDocUI/{projectId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnitsForOutputDocUI(_response);\r\n });\r\n }\r\n\r\n protected processGetUnitsForOutputDocUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnit(unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getUnit/{unitId}\";\r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnit(_response);\r\n });\r\n }\r\n\r\n protected processGetUnit(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n deleteProject(request: DeleteProjectRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/deleteProject\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processDeleteProject(_response);\r\n });\r\n }\r\n\r\n protected processDeleteProject(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n copyUnit(request: CopyUnitRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/copyUnit\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processCopyUnit(_response);\r\n });\r\n }\r\n\r\n protected processCopyUnit(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n copyProject(request: CopyProjectRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/copyProject\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processCopyProject(_response);\r\n });\r\n }\r\n\r\n protected processCopyProject(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n // getProjectAndUnitName(projectId: number, unitId: number): Promise {\r\n // let url_ = this.baseUrl + \"/dataapi/getProjectAndUnitName/{projectId}/{unitId}\";\r\n // if (projectId === undefined || projectId === null)\r\n // throw new Error(\"The parameter 'projectId' must be defined.\");\r\n // url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n // if (unitId === undefined || unitId === null)\r\n // throw new Error(\"The parameter 'unitId' must be defined.\");\r\n // url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n // url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n // let options_ = {\r\n // method: \"GET\",\r\n // headers: {\r\n // \"Accept\": \"application/json\"\r\n // }\r\n // };\r\n\r\n // return this.transformOptions(options_).then(transformedOptions_ => {\r\n // return this.http.fetch(url_, transformedOptions_);\r\n // }).then((_response: Response) => {\r\n // return this.processGetProjectAndUnitName(_response);\r\n // });\r\n // }\r\n\r\n protected processGetProjectAndUnitName(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getFanCurveChart(projectId: string | null, unitId: number, selectedFan: string | null): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getFanCurveChart/{projectId}/{unitId}/{selectedFan}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n if (selectedFan === undefined || selectedFan === null)\r\n throw new Error(\"The parameter 'selectedFan' must be defined.\");\r\n url_ = url_.replace(\"{selectedFan}\", encodeURIComponent(\"\" + selectedFan)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetFanCurveChart(_response);\r\n });\r\n }\r\n\r\n protected processGetFanCurveChart(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnitDrawingFromService(projectId: number, unitId: number, viewType: number, uiScreen: number): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getUnitDrawingFromService/{projectId}/{unitId}/{viewType}/{uiScreen}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n if (viewType === undefined || viewType === null)\r\n throw new Error(\"The parameter 'viewType' must be defined.\");\r\n url_ = url_.replace(\"{viewType}\", encodeURIComponent(\"\" + viewType)); \r\n if (uiScreen === undefined || uiScreen === null)\r\n throw new Error(\"The parameter 'uiScreen' must be defined.\");\r\n url_ = url_.replace(\"{uiScreen}\", encodeURIComponent(\"\" + uiScreen)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnitDrawingFromService(_response);\r\n });\r\n }\r\n\r\n protected processGetUnitDrawingFromService(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getFanSoundData(projectId: string | null, unitId: number, selectedFan: string | null): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getFanSoundData/{projectId}/{unitId}/{selectedFan}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n if (selectedFan === undefined || selectedFan === null)\r\n throw new Error(\"The parameter 'selectedFan' must be defined.\");\r\n url_ = url_.replace(\"{selectedFan}\", encodeURIComponent(\"\" + selectedFan)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetFanSoundData(_response);\r\n });\r\n }\r\n\r\n protected processGetFanSoundData(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getLowryProgramVersion(): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getLowryProgramVersion\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetLowryProgramVersion(_response);\r\n });\r\n }\r\n\r\n protected processGetLowryProgramVersion(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n sendSupportEmail(request: ContactUsEmailRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/sendSupportEmail\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processSendSupportEmail(_response);\r\n });\r\n }\r\n\r\n protected processSendSupportEmail(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n generateSpecMateDocuments(request: SpecMateDocumentsRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/generatespecmatedocuments\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGenerateSpecMateDocuments(_response);\r\n });\r\n }\r\n\r\n protected processGenerateSpecMateDocuments(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n generateJobPriceSummary(request: PDFRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/generatejobpricesummary\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGenerateJobPriceSummary(_response);\r\n });\r\n }\r\n\r\n protected processGenerateJobPriceSummary(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n addPdfProcessingRequest(pdfProcessingRequest: PdfProcessingRequest): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/addPdfProcessingRequest\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(pdfProcessingRequest);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processAddPdfProcessingRequest(_response);\r\n });\r\n }\r\n\r\n protected processAddPdfProcessingRequest(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getPdfProcessingRecords(projectId: number): Promise {\r\n let url_ = this.baseUrl + \"/dataapi/getPdfProcessingRecords/{projectId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetPdfProcessingRecords(_response);\r\n });\r\n }\r\n\r\n protected processGetPdfProcessingRecords(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\nexport class PingClient {\r\n public transformOptions: (opts: any) => Promise = opts => Promise.resolve(opts);\r\nprivate http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\r\n private baseUrl: string;\r\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\r\n\r\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\r\n this.http = http ? http : window;\r\n this.baseUrl = baseUrl ? baseUrl : \"\";\r\n }\r\n\r\n index(): Promise {\r\n let url_ = this.baseUrl + \"/api/Ping\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processIndex(_response);\r\n });\r\n }\r\n\r\n protected processIndex(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\nexport class ProjectClient {\r\n public transformOptions: (opts: any) => Promise = opts => Promise.resolve(opts);\r\nprivate http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\r\n private baseUrl: string;\r\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\r\n\r\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\r\n this.http = http ? http : window;\r\n this.baseUrl = baseUrl ? baseUrl : \"\";\r\n }\r\n\r\n getString(projectId: string): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/getString\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetString(_response);\r\n });\r\n }\r\n\r\n protected processGetString(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n index(projectId: string | null): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processIndex(_response);\r\n });\r\n }\r\n\r\n protected processIndex(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status === 500) {\r\n return response.text().then((_responseText) => {\r\n let result500: any = null;\r\n result500 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result500);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n debugJson(projectId: string | null): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/DebugJson\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processDebugJson(_response);\r\n });\r\n }\r\n\r\n protected processDebugJson(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n updateUnitDesign(projectId: string | null, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/UpdateUnitDesign\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(unitId);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateUnitDesign(_response);\r\n });\r\n }\r\n\r\n protected processUpdateUnitDesign(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n updateMultipleUnits(projectId: string | null, unitIds: number[]): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/UpdateMultipleUnits\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(unitIds);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateMultipleUnits(_response);\r\n });\r\n }\r\n\r\n protected processUpdateMultipleUnits(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n modifyProperty(projectId: string | null, propertyModification: PropertyModification): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/ModifyProperty\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(propertyModification);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processModifyProperty(_response);\r\n });\r\n }\r\n\r\n protected processModifyProperty(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n return;\r\n });\r\n } else if (status === 400) {\r\n return response.text().then((_responseText) => {\r\n let result400: any = null;\r\n result400 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result400);\r\n });\r\n } else if (status === 500) {\r\n return response.text().then((_responseText) => {\r\n let result500: any = null;\r\n result500 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result500);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n deleteProperty(projectId: string | null, propertyDeletion: PropertyDeletion): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/DeleteProperty\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(propertyDeletion);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processDeleteProperty(_response);\r\n });\r\n }\r\n\r\n protected processDeleteProperty(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n return;\r\n });\r\n } else if (status === 400) {\r\n return response.text().then((_responseText) => {\r\n let result400: any = null;\r\n result400 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result400);\r\n });\r\n } else if (status === 500) {\r\n return response.text().then((_responseText) => {\r\n let result500: any = null;\r\n result500 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result500);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n modifySelectedModelProperty(projectId: string | null, propertyModification: PropertyModification): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/ModifySelectedModelProperty\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(propertyModification);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processModifySelectedModelProperty(_response);\r\n });\r\n }\r\n\r\n protected processModifySelectedModelProperty(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status === 500) {\r\n return response.text().then((_responseText) => {\r\n let result500: any = null;\r\n result500 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result500);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n modifyCasingSizeLimitProperty(projectId: string | null, propertyModification: PropertyModification): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/ModifyCasingSizeLimitProperty\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(propertyModification);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processModifyCasingSizeLimitProperty(_response);\r\n });\r\n }\r\n\r\n protected processModifyCasingSizeLimitProperty(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status === 400) {\r\n return response.text().then((_responseText) => {\r\n let result400: any = null;\r\n result400 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result400);\r\n });\r\n } else if (status === 500) {\r\n return response.text().then((_responseText) => {\r\n let result500: any = null;\r\n result500 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return throwException(\"A server error occurred.\", status, _responseText, _headers, result500);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnitDrawingSvg(projectId: string | null, unitId: number | undefined, viewType: number | undefined, uiScreen: DrawingScreen | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetUnitDrawingSvg?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n if (viewType === null)\r\n throw new Error(\"The parameter 'viewType' cannot be null.\");\r\n else if (viewType !== undefined)\r\n url_ += \"viewType=\" + encodeURIComponent(\"\" + viewType) + \"&\"; \r\n if (uiScreen === null)\r\n throw new Error(\"The parameter 'uiScreen' cannot be null.\");\r\n else if (uiScreen !== undefined)\r\n url_ += \"uiScreen=\" + encodeURIComponent(\"\" + uiScreen) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnitDrawingSvg(_response);\r\n });\r\n }\r\n\r\n protected processGetUnitDrawingSvg(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getInletOutletDrawingSvg(projectId: string | null, unitId: number | undefined, selectedConnection: string | null | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetInletOutletDrawingSvg?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n if (selectedConnection !== undefined)\r\n url_ += \"selectedConnection=\" + encodeURIComponent(\"\" + selectedConnection) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetInletOutletDrawingSvg(_response);\r\n });\r\n }\r\n\r\n protected processGetInletOutletDrawingSvg(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n deleteUnit(projectId: string | null, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/DeleteUnit\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(unitId);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processDeleteUnit(_response);\r\n });\r\n }\r\n\r\n protected processDeleteUnit(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n deleteProject(projectId: string | null): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/DeleteProject\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"POST\",\r\n headers: {\r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processDeleteProject(_response);\r\n });\r\n }\r\n\r\n protected processDeleteProject(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n runPerformanceCalculations(projectId: string | null, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/RunPerformanceCalculations\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(unitId);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processRunPerformanceCalculations(_response);\r\n });\r\n }\r\n\r\n protected processRunPerformanceCalculations(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getTunnelSizingLog(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetTunnelSizingLog?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetTunnelSizingLog(_response);\r\n });\r\n }\r\n\r\n protected processGetTunnelSizingLog(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnitLengthReport(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetUnitLengthReport?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnitLengthReport(_response);\r\n });\r\n }\r\n\r\n protected processGetUnitLengthReport(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getProjectJson(projectId: string | null): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetProjectJson\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetProjectJson(_response);\r\n });\r\n }\r\n\r\n protected processGetProjectJson(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getConfigurationInputsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetConfigurationInputsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetConfigurationInputsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetConfigurationInputsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getConnectionsAndOptionsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetConnectionsAndOptionsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetConnectionsAndOptionsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetConnectionsAndOptionsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getTempsAndSystemUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetTempsAndSystemUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetTempsAndSystemUI(_response);\r\n });\r\n }\r\n\r\n protected processGetTempsAndSystemUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getPerformanceUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetPerformanceUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetPerformanceUI(_response);\r\n });\r\n }\r\n\r\n protected processGetPerformanceUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getOptimizedDesignPerformance(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetOptimizedDesignPerformance?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetOptimizedDesignPerformance(_response);\r\n });\r\n }\r\n\r\n protected processGetOptimizedDesignPerformance(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getComponentsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetComponentsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetComponentsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetComponentsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnitSelectionUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetUnitSelectionUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnitSelectionUI(_response);\r\n });\r\n }\r\n\r\n protected processGetUnitSelectionUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getAccessEditingAndDrawingUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetAccessEditingAndDrawingUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetAccessEditingAndDrawingUI(_response);\r\n });\r\n }\r\n\r\n protected processGetAccessEditingAndDrawingUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getAccessDoorsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetAccessDoorsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetAccessDoorsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetAccessDoorsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getCoilConnectionsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetCoilConnectionsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetCoilConnectionsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetCoilConnectionsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getElectFurnacePanelsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetElectFurnacePanelsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetElectFurnacePanelsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetElectFurnacePanelsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getLengthInputsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetLengthInputsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetLengthInputsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetLengthInputsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getComponentConstructionUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetComponentConstructionUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetComponentConstructionUI(_response);\r\n });\r\n }\r\n\r\n protected processGetComponentConstructionUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getInletOutletSizingUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetInletOutletSizingUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetInletOutletSizingUI(_response);\r\n });\r\n }\r\n\r\n protected processGetInletOutletSizingUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getControlsUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetControlsUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetControlsUI(_response);\r\n });\r\n }\r\n\r\n protected processGetControlsUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getElectricalUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetElectricalUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetElectricalUI(_response);\r\n });\r\n }\r\n\r\n protected processGetElectricalUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getUnitCabinetUI(projectId: string | null, unitId: number | undefined): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/GetUnitCabinetUI?\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === null)\r\n throw new Error(\"The parameter 'unitId' cannot be null.\");\r\n else if (unitId !== undefined)\r\n url_ += \"unitId=\" + encodeURIComponent(\"\" + unitId) + \"&\"; \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetUnitCabinetUI(_response);\r\n });\r\n }\r\n\r\n protected processGetUnitCabinetUI(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n resetToOptimized(projectId: string | null, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/api/Project/{projectId}/ResetToOptimized\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(unitId);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/octet-stream\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processResetToOptimized(_response);\r\n });\r\n }\r\n\r\n protected processResetToOptimized(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200 || status === 206) {\r\n const contentDisposition = response.headers ? response.headers.get(\"content-disposition\") : undefined;\r\n const fileNameMatch = contentDisposition ? /filename=\"?([^\"]*?)\"?(;|$)/g.exec(contentDisposition) : undefined;\r\n const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;\r\n return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\nexport class ReadClient {\r\n public transformOptions: (opts: any) => Promise = opts => Promise.resolve(opts);\r\nprivate http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\r\n private baseUrl: string;\r\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\r\n\r\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\r\n this.http = http ? http : window;\r\n this.baseUrl = baseUrl ? baseUrl : \"\";\r\n }\r\n\r\n getConfigInputsAllValues(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetConfigInputsAllValues/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetConfigInputsAllValues(_response);\r\n });\r\n }\r\n\r\n protected processGetConfigInputsAllValues(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getSupplementalDetailsValues(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetSupplementalDetailsValues/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetSupplementalDetailsValues(_response);\r\n });\r\n }\r\n\r\n protected processGetSupplementalDetailsValues(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getInletOutletValues(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetInletOutletValues/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetInletOutletValues(_response);\r\n });\r\n }\r\n\r\n protected processGetInletOutletValues(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getTempsAndSystemValues(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetTempsAndSystemValues/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetTempsAndSystemValues(_response);\r\n });\r\n }\r\n\r\n protected processGetTempsAndSystemValues(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getOptimizeDesignValues(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetOptimizeDesignValues/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetOptimizeDesignValues(_response);\r\n });\r\n }\r\n\r\n protected processGetOptimizeDesignValues(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getLayoutSchematicSvg(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetLayoutSchematicSvg/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetLayoutSchematicSvg(_response);\r\n });\r\n }\r\n\r\n protected processGetLayoutSchematicSvg(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n getConnectionSchematicSvg(projectId: number, unitId: number): Promise {\r\n let url_ = this.baseUrl + \"/readapi/GetConnectionSchematicSvg/{projectId}/{unitId}\";\r\n if (projectId === undefined || projectId === null)\r\n throw new Error(\"The parameter 'projectId' must be defined.\");\r\n url_ = url_.replace(\"{projectId}\", encodeURIComponent(\"\" + projectId)); \r\n if (unitId === undefined || unitId === null)\r\n throw new Error(\"The parameter 'unitId' must be defined.\");\r\n url_ = url_.replace(\"{unitId}\", encodeURIComponent(\"\" + unitId)); \r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n let options_ = {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processGetConnectionSchematicSvg(_response);\r\n });\r\n }\r\n\r\n protected processGetConnectionSchematicSvg(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\nexport class WriteClient {\r\n public transformOptions: (opts: any) => Promise = opts => Promise.resolve(opts);\r\nprivate http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\r\n private baseUrl: string;\r\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\r\n\r\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\r\n this.http = http ? http : window;\r\n this.baseUrl = baseUrl ? baseUrl : \"\";\r\n }\r\n\r\n updateConfigInputs(request: FieldUpdateRequest): Promise {\r\n let url_ = this.baseUrl + \"/writeapi/updateConfigInputs\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateConfigInputs(_response);\r\n });\r\n }\r\n\r\n protected processUpdateConfigInputs(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n updateInletOutlet(request: FieldUpdateRequest): Promise {\r\n let url_ = this.baseUrl + \"/writeapi/updateInletOutlet\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateInletOutlet(_response);\r\n });\r\n }\r\n\r\n protected processUpdateInletOutlet(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n updateTempsAndSystem(request: FieldUpdateRequest): Promise {\r\n let url_ = this.baseUrl + \"/writeapi/updateTempsAndSystem\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateTempsAndSystem(_response);\r\n });\r\n }\r\n\r\n protected processUpdateTempsAndSystem(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n updateOptimizeDesign(request: FieldUpdateRequest): Promise {\r\n let url_ = this.baseUrl + \"/writeapi/updateOptimizeDesign\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateOptimizeDesign(_response);\r\n });\r\n }\r\n\r\n protected processUpdateOptimizeDesign(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n updateSupplementalDetails(request: FieldUpdateRequest): Promise {\r\n let url_ = this.baseUrl + \"/writeapi/updateWarranty\";\r\n url_ = url_.replace(/[?&]$/, \"\");\r\n\r\n const content_ = JSON.stringify(request);\r\n\r\n let options_ = {\r\n body: content_,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\", \r\n \"Accept\": \"application/json\"\r\n }\r\n };\r\n\r\n return this.transformOptions(options_).then(transformedOptions_ => {\r\n return this.http.fetch(url_, transformedOptions_);\r\n }).then((_response: Response) => {\r\n return this.processUpdateSupplementalDetails(_response);\r\n });\r\n }\r\n\r\n protected processUpdateSupplementalDetails(response: Response): Promise {\r\n const status = response.status;\r\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\r\n if (status === 200) {\r\n return response.text().then((_responseText) => {\r\n let result200: any = null;\r\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver);\r\n return result200;\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\nexport interface TokenResponse {\r\n access_token?: string | undefined;\r\n token_type?: string | undefined;\r\n}\r\n\r\nexport interface GenerateTokenModel {\r\n username: string;\r\n password: string;\r\n}\r\n\r\nexport interface StandardResponse {\r\n hasError?: boolean;\r\n errorMessage?: string | undefined;\r\n}\r\n\r\nexport interface ProjectListResponse extends StandardResponse {\r\n projectDtoList?: ProjectDTO[] | undefined;\r\n}\r\n\r\nexport interface ProjectDTO {\r\n id?: number;\r\n guid?: string;\r\n name?: string | undefined;\r\n statusTypeID?: number | undefined;\r\n statusTypeName?: string | undefined;\r\n location?: string | undefined;\r\n repOfficeID?: string | undefined;\r\n repContactID?: string | undefined;\r\n innoventSalesEngineerID?: string | undefined;\r\n contractorName?: string | undefined;\r\n buildingType?: string | undefined;\r\n notes?: string | undefined;\r\n projectFileString?: string | undefined;\r\n createDate?: Date | undefined;\r\n createdByID?: string | undefined;\r\n lastModifiedDate?: Date | undefined;\r\n lastModifiedByID?: string | undefined;\r\n createdByFirstName?: string | undefined;\r\n createdByLastName?: string | undefined;\r\n userType?: string | undefined;\r\n officeName?: string | undefined;\r\n email?: string | undefined;\r\n units?: UnitDTO[] | undefined;\r\n}\r\n\r\nexport interface UnitDTO {\r\n id?: number;\r\n guid?: string | undefined;\r\n projectID?: number;\r\n unitQuantity?: number | undefined;\r\n unitTag?: string | undefined;\r\n createDate?: Date | undefined;\r\n createdByID?: string | undefined;\r\n lastModifiedDate?: Date | undefined;\r\n lastModifiedByID?: string | undefined;\r\n modelNumber?: string | undefined;\r\n lastFullSave?: Date | undefined;\r\n}\r\n\r\nexport interface EnumListResponse extends StandardResponse {\r\n enumDtoList?: EnumDTO[] | undefined;\r\n}\r\n\r\nexport interface EnumDTO {\r\n categoryID?: number | undefined;\r\n category?: string | undefined;\r\n enumID?: number | undefined;\r\n enumName?: string | undefined;\r\n numericValue?: number | undefined;\r\n textValue?: string | undefined;\r\n displayValue?: string | undefined;\r\n}\r\n\r\nexport interface ProjectResponse extends StandardResponse {\r\n projectDto?: ProjectDTO | undefined;\r\n}\r\n\r\nexport interface ProjectRequest {\r\n id?: number;\r\n createdByID?: string | undefined;\r\n createdByFirstName?: string | undefined;\r\n createdByLastName?: string | undefined;\r\n projectName?: string | undefined;\r\n email?: string | undefined;\r\n userType?: string | undefined;\r\n officeId?: string | undefined;\r\n officeName?: string | undefined;\r\n}\r\n\r\nexport interface UnitResponse extends StandardResponse {\r\n unitDto?: UnitDTO | undefined;\r\n}\r\n\r\nexport interface UnitListResponse extends StandardResponse {\r\n unitDtoList?: UnitDTO[] | undefined;\r\n}\r\n\r\nexport interface UnitOutputDocListResponse extends StandardResponse {\r\n outputDocUnitList?: UnitOutputDocumentDTO[] | undefined;\r\n}\r\n\r\nexport interface UnitOutputDocumentDTO {\r\n unitId?: number;\r\n needsFullSave?: boolean | undefined;\r\n overallHeight?: number | undefined;\r\n overallLength?: number | undefined;\r\n isOversized?: boolean;\r\n unitTag?: string | undefined;\r\n}\r\n\r\nexport interface DeleteProjectRequest {\r\n createdByID?: string | undefined;\r\n projectID?: number;\r\n}\r\n\r\nexport interface CopyUnitRequest {\r\n createdByID?: string | undefined;\r\n unitID?: number;\r\n unitTag?: string | undefined;\r\n targetProjectID?: number;\r\n}\r\n\r\nexport interface CopyProjectRequest {\r\n createdByID?: string | undefined;\r\n projectID?: number;\r\n projectName?: string | undefined;\r\n}\r\n\r\nexport interface ProjectAndUnitNameResponse extends StandardResponse {\r\n projectName?: string | undefined;\r\n unitTag?: string | undefined;\r\n}\r\n\r\nexport interface StandardResponse2 {\r\n hasError?: boolean;\r\n errorMessage?: string | undefined;\r\n}\r\n\r\nexport interface UnitDrawingResponse extends StandardResponse2 {\r\n drawings?: UnitDrawingItem[] | undefined;\r\n dataPropertyErrors?: string[] | undefined;\r\n hasFatalDataError?: boolean;\r\n}\r\n\r\nexport interface UnitDrawingItem {\r\n unitDrawingSvg?: string | undefined;\r\n viewType?: DrawingTypeView | undefined;\r\n}\r\n\r\nexport interface DrawingTypeView {\r\n view?: number;\r\n type?: number;\r\n}\r\n\r\nexport interface UnitFanResponse extends StandardResponse {\r\n unitFanPerformanceDTO?: UnitFanPerformanceDTO | undefined;\r\n}\r\n\r\nexport interface UnitFanPerformanceDTO {\r\n unitFanID?: number;\r\n volumeCfm?: number | undefined;\r\n operatingPower?: number | undefined;\r\n requiredPower?: number | undefined;\r\n fanSpeedRpm?: number | undefined;\r\n maxFanSpeedRpm?: number | undefined;\r\n operatingFrequency?: number | undefined;\r\n elevation?: number | undefined;\r\n feg?: number | undefined;\r\n staticEfficiencyPercent?: number | undefined;\r\n class?: string | undefined;\r\n driveType?: string | undefined;\r\n motorSpeedRpm?: number | undefined;\r\n unitElectricalVoltageTypeEnum?: number | undefined;\r\n externalStaticPressure?: number | undefined;\r\n casingLoss?: number | undefined;\r\n outsideAirPrefilterClean?: number | undefined;\r\n outsideAirPrefilterLoading?: number | undefined;\r\n outsideAirHighEfficiencyFilterClean?: number | undefined;\r\n outsideAirHighEfficiencyFilterLoading?: number | undefined;\r\n hotWaterPreheatCoilStaticPressure?: number | undefined;\r\n electricPreheatStaticPressure?: number | undefined;\r\n heatRecoveryWheelStaticPressure?: number | undefined;\r\n dxcoilStaticPressure?: number | undefined;\r\n hotGasReheatCoilStaticPressure?: number | undefined;\r\n indirectFiredFurnaceStaticPressure?: number | undefined;\r\n chilledWaterCoilStaticPressure?: number | undefined;\r\n hotWaterCoilStaticPressure?: number | undefined;\r\n steamCoilStaticPressure?: number | undefined;\r\n electricHeaterStaticPressure?: number | undefined;\r\n humidifierManifoldStaticPressure?: number | undefined;\r\n plateHeatExchangerStaticPressure?: number | undefined;\r\n soundAttenuatorStaticPressure?: number | undefined;\r\n returnAirFilterClean?: number | undefined;\r\n returnAirFilterLoading?: number | undefined;\r\n supplyAirFilterClean?: number | undefined;\r\n supplyAirFilterLoading?: number | undefined;\r\n inletSoundlevel63hz?: number | undefined;\r\n inletSoundlevel125hz?: number | undefined;\r\n inletSoundlevel250hz?: number | undefined;\r\n inletSoundlevel500hz?: number | undefined;\r\n inletSoundlevel1000hz?: number | undefined;\r\n inletSoundlevel2000hz?: number | undefined;\r\n inletSoundlevel4000hz?: number | undefined;\r\n inletSoundlevel8000hz?: number | undefined;\r\n inletPowerWeightedLwA?: number | undefined;\r\n inletPressureWeightedDBa?: number | undefined;\r\n inletPerceivedLoudnessSones?: number | undefined;\r\n outletSoundlevel63hz?: number | undefined;\r\n outletSoundlevel125hz?: number | undefined;\r\n outletSoundlevel250hz?: number | undefined;\r\n outletSoundlevel500hz?: number | undefined;\r\n outletSoundlevel1000hz?: number | undefined;\r\n outletSoundlevel2000hz?: number | undefined;\r\n outletSoundlevel4000hz?: number | undefined;\r\n outletSoundlevel8000hz?: number | undefined;\r\n outletPowerWeightedLwA?: number | undefined;\r\n outletPressureWeightedDBa?: number | undefined;\r\n outletPerceivedLoudnessSones?: number | undefined;\r\n}\r\n\r\nexport interface StandardResponse3 {\r\n hasError?: boolean;\r\n errorMessage?: string | undefined;\r\n}\r\n\r\nexport interface ApplicationDataResponse extends StandardResponse3 {\r\n applicationDataList?: ApplicationDataDTO[] | undefined;\r\n}\r\n\r\nexport interface ApplicationDataDTO {\r\n application?: string | undefined;\r\n key?: string | undefined;\r\n value?: string | undefined;\r\n}\r\n\r\nexport interface ContactUsEmailRequest {\r\n userEmail?: string | undefined;\r\n message?: string | undefined;\r\n userName?: string | undefined;\r\n userPhone?: string | undefined;\r\n}\r\n\r\nexport interface SpecMateDocumentsRequest {\r\n projectID?: number;\r\n unitIDs?: number[] | undefined;\r\n submittalCoverSheet?: boolean;\r\n performanceDataSummary?: boolean;\r\n unitDrawing?: boolean;\r\n salesGuidSpecification?: boolean;\r\n salesScope?: boolean;\r\n versionTemplate?: string | undefined;\r\n}\r\n\r\nexport interface PDFRequest {\r\n projectID?: number;\r\n unitIDs?: number[] | undefined;\r\n versionTemplate?: string | undefined;\r\n isInternalUser?: boolean;\r\n}\r\n\r\nexport interface PdfProcessingRequest {\r\n environment?: string | undefined;\r\n requestId?: string | undefined;\r\n userId?: string | undefined;\r\n projectId?: number;\r\n unitIds?: number[] | undefined;\r\n submittalCoverSheet?: boolean;\r\n performanceDataSummary?: boolean;\r\n unitDrawing?: boolean;\r\n salesGuidSpecification?: boolean;\r\n salesScope?: boolean;\r\n guideSpecVersionTemplate?: string | undefined;\r\n}\r\n\r\nexport interface PdfProcessingResponse extends StandardResponse {\r\n pdfProcessingDTOs?: PdfProcessingDTO[] | undefined;\r\n}\r\n\r\nexport interface PdfProcessingDTO {\r\n id?: number;\r\n requestId?: string | undefined;\r\n userId?: string | undefined;\r\n projectId?: number | undefined;\r\n unitIds?: number[] | undefined;\r\n unitIdListString?: string | undefined;\r\n processingStatusId?: number;\r\n processingStatusName?: string | undefined;\r\n pdfUrl?: string | undefined;\r\n errorMessage?: string | undefined;\r\n createDate?: Date | undefined;\r\n lastModifiedDate?: Date | undefined;\r\n}\r\n\r\nexport interface ProjectData {\r\n frozenEntityTypes: { [key: string] : string; };\r\n uiEntities: any[];\r\n geometries: GeometryBase[];\r\n}\r\n\r\nexport interface GeometryBase {\r\n}\r\n\r\nexport interface Box extends GeometryBase {\r\n key?: string | undefined;\r\n matrix?: number[] | undefined;\r\n size3?: Size3 | undefined;\r\n}\r\n\r\nexport interface Size3 {\r\n xSize?: number;\r\n ySize?: number;\r\n zSize?: number;\r\n}\r\n\r\nexport interface ApiError {\r\n apiErrorCode?: ApiErrorCode;\r\n errorMessage?: string | undefined;\r\n}\r\n\r\nexport enum ApiErrorCode {\r\n DeserializeProjectError = 0, \r\n ModifyPropertyBadValueError = 1, \r\n ModifyPropertyError = 2, \r\n NoSuchUnitError = 3, \r\n DeletePropertyError = 4, \r\n DatabaseError = 5, \r\n}\r\n\r\nexport interface PropertyModification {\r\n unitId?: number | undefined;\r\n propertyName: string;\r\n entityTypedRefPath?: TypedRefPathDto | undefined;\r\n newValue?: string | undefined;\r\n}\r\n\r\nexport interface TypedRefPathDto {\r\n atoms?: TypedRefAtom[] | undefined;\r\n entityType?: string | undefined;\r\n}\r\n\r\nexport interface TypedRefAtom {\r\n value?: string | undefined;\r\n}\r\n\r\nexport interface PropertyDeletion {\r\n propertyName: string;\r\n entityTypedRefPath?: TypedRefPathDto | undefined;\r\n}\r\n\r\nexport interface ModifySelectedModelResult {\r\n excessiveCasingDimension?: number | undefined;\r\n}\r\n\r\nexport interface ModifyCasingSizeLimitResult {\r\n componentNamesReset?: string[] | undefined;\r\n}\r\n\r\nexport enum DrawingScreen {\r\n Drawing = 0, \r\n CoilConnections = 1, \r\n ElectricalFurnacePanels = 2, \r\n AccessDoors = 3, \r\n LengthInputs = 4, \r\n}\r\n\r\nexport interface UIEntity {\r\n}\r\n\r\nexport interface ConfigurationInputsUI extends UIEntity {\r\n unitType?: UIPropertyOfUnitType | undefined;\r\n soundAttenuator?: UIPropertyOfSoundAttenuatorType | undefined;\r\n humidifierManifold?: UIPropertyOfHumidifierManifoldType | undefined;\r\n showSoundAttenuatorLength?: boolean;\r\n unitTag?: UIPropertyOfString | undefined;\r\n unitQuantity?: UIPropertyOfInt32 | undefined;\r\n energyRecoveryDevice?: UIPropertyOfEnergyRecoveryDeviceType | undefined;\r\n unitLocation?: UIPropertyOfUnitLocationType | undefined;\r\n airflowArrangement?: UIPropertyOfAirflowArrangementType | undefined;\r\n layoutSchematicSvg?: string | undefined;\r\n cfmLimit?: boolean;\r\n outsideAirAltitudeOnlyAcfm?: UIPropertyOfNullableOfDouble | undefined;\r\n supplyAirAltitudeOnlyAcfm?: UIPropertyOfNullableOfDouble | undefined;\r\n returnAirAltitudeOnlyAcfm?: UIPropertyOfNullableOfDouble | undefined;\r\n exhaustAirAltitudeOnlyAcfm?: UIPropertyOfNullableOfDouble | undefined;\r\n airTunnelOrientation?: UIPropertyOfAirTunnelOrientation | undefined;\r\n returnAirDirection?: UIPropertyOfReturnAirDirection | undefined;\r\n supplyTunnelLocation?: UIPropertyOfTunnelLocation | undefined;\r\n showUnitLayoutInputs?: boolean;\r\n cooling?: UIPropertyOfCooling | undefined;\r\n heating?: UIPropertyOfHeating | undefined;\r\n coolHeatSequence?: UIPropertyOfCoolHeatSequence | undefined;\r\n preHeat?: UIPropertyOfHeating | undefined;\r\n outsideAirPrefilter?: UIPropertyOfFilterType | undefined;\r\n outsideAirHighEfficiencyFilter?: UIPropertyOfFilterType | undefined;\r\n supplyAirFinalFilter?: UIPropertyOfFilterType | undefined;\r\n returnAirFilter?: UIPropertyOfFilterType | undefined;\r\n showSupplyAndReturnAirAltitudeOnlyAcfm?: boolean;\r\n showCoolHeatSequence?: boolean;\r\n disableCoolHeatSequence?: boolean;\r\n disableReturnAirDirection?: boolean;\r\n}\r\n\r\nexport interface UIProperty {\r\n id: RefPath;\r\n validationMessage?: string | undefined;\r\n entityType?: string | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfUnitType extends UIProperty {\r\n value?: UnitType;\r\n choices?: IUIPropertyChoicesListOfUnitType | undefined;\r\n}\r\n\r\nexport enum UnitType {\r\n NotSet = 0, \r\n SingleTunnel = 1, \r\n EnergyRecovery = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfUnitType {\r\n}\r\n\r\nexport interface RefPath {\r\n headAtomValueUnsafe?: string | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfSoundAttenuatorType extends UIProperty {\r\n value?: SoundAttenuatorType;\r\n choices?: IUIPropertyChoicesListOfSoundAttenuatorType | undefined;\r\n}\r\n\r\nexport enum SoundAttenuatorType {\r\n None = 0, \r\n Supply = 1, \r\n Return = 2, \r\n SupplyAndReturn = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSoundAttenuatorType {\r\n}\r\n\r\nexport interface UIPropertyOfHumidifierManifoldType extends UIProperty {\r\n value?: HumidifierManifoldType;\r\n choices?: IUIPropertyChoicesListOfHumidifierManifoldType | undefined;\r\n}\r\n\r\nexport enum HumidifierManifoldType {\r\n None = 0, \r\n Supply = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfHumidifierManifoldType {\r\n}\r\n\r\nexport interface UIPropertyOfString extends UIProperty {\r\n value?: string | undefined;\r\n choices?: IUIPropertyChoicesListOfString | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfString {\r\n}\r\n\r\nexport interface UIPropertyOfInt32 extends UIProperty {\r\n value?: number;\r\n choices?: IUIPropertyChoicesListOfInt32 | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfInt32 {\r\n}\r\n\r\nexport interface UIPropertyOfEnergyRecoveryDeviceType extends UIProperty {\r\n value?: EnergyRecoveryDeviceType;\r\n choices?: IUIPropertyChoicesListOfEnergyRecoveryDeviceType | undefined;\r\n}\r\n\r\nexport enum EnergyRecoveryDeviceType {\r\n ChooseAnOption = 0, \r\n SensiblePlate = 1, \r\n EnthalpyWheel = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfEnergyRecoveryDeviceType {\r\n}\r\n\r\nexport interface UIPropertyOfUnitLocationType extends UIProperty {\r\n value?: UnitLocationType;\r\n choices?: IUIPropertyChoicesListOfUnitLocationType | undefined;\r\n}\r\n\r\nexport enum UnitLocationType {\r\n NotSet = 0, \r\n Outdoor = 1, \r\n Indoor = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfUnitLocationType {\r\n}\r\n\r\nexport interface UIPropertyOfAirflowArrangementType extends UIProperty {\r\n value?: AirflowArrangementType;\r\n choices?: IUIPropertyChoicesListOfAirflowArrangementType | undefined;\r\n}\r\n\r\nexport enum AirflowArrangementType {\r\n NotSet = 0, \r\n _100PercentOA = 1, \r\n PartialRecircWithEconomizer = 2, \r\n PartialRecircWOEconomizer = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfAirflowArrangementType {\r\n}\r\n\r\nexport interface UIPropertyOfNullableOfDouble extends UIProperty {\r\n value?: number | undefined;\r\n choices?: IUIPropertyChoicesListOfNullableOfDouble | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfNullableOfDouble {\r\n}\r\n\r\nexport interface UIPropertyOfAirTunnelOrientation extends UIProperty {\r\n value?: AirTunnelOrientation;\r\n choices?: IUIPropertyChoicesListOfAirTunnelOrientation | undefined;\r\n}\r\n\r\nexport enum AirTunnelOrientation {\r\n NotSet = 0, \r\n Stacked = 1, \r\n SideBySide = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfAirTunnelOrientation {\r\n}\r\n\r\nexport interface UIPropertyOfReturnAirDirection extends UIProperty {\r\n value?: ReturnAirDirection;\r\n choices?: IUIPropertyChoicesListOfReturnAirDirection | undefined;\r\n}\r\n\r\nexport enum ReturnAirDirection {\r\n NotSet = 0, \r\n ParallelToOA = 1, \r\n OppositeOfOA = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfReturnAirDirection {\r\n}\r\n\r\nexport interface UIPropertyOfTunnelLocation extends UIProperty {\r\n value?: TunnelLocation;\r\n choices?: IUIPropertyChoicesListOfTunnelLocation | undefined;\r\n}\r\n\r\nexport enum TunnelLocation {\r\n NotSet = 0, \r\n Bottom = 1, \r\n Top = 2, \r\n Front = 3, \r\n Back = 4, \r\n Single = 5, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfTunnelLocation {\r\n}\r\n\r\nexport interface UIPropertyOfCooling extends UIProperty {\r\n value?: Cooling;\r\n choices?: IUIPropertyChoicesListOfCooling | undefined;\r\n}\r\n\r\nexport enum Cooling {\r\n None = 0, \r\n ChilledWater = 1, \r\n DXPackaged = 2, \r\n DXPackagedWithHotGasReheat = 3, \r\n DXSplit = 4, \r\n DXSplitWithHotGasReheat = 5, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCooling {\r\n}\r\n\r\nexport interface UIPropertyOfHeating extends UIProperty {\r\n value?: Heating;\r\n choices?: IUIPropertyChoicesListOfHeating | undefined;\r\n}\r\n\r\nexport enum Heating {\r\n None = 0, \r\n HotWater = 1, \r\n Steam = 2, \r\n IndirectFiredFurnace = 3, \r\n Electric = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfHeating {\r\n}\r\n\r\nexport interface UIPropertyOfCoolHeatSequence extends UIProperty {\r\n value?: CoolHeatSequence;\r\n choices?: IUIPropertyChoicesListOfCoolHeatSequence | undefined;\r\n}\r\n\r\nexport enum CoolHeatSequence {\r\n NotSet = 0, \r\n HeatCool = 1, \r\n CoolHeat = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCoolHeatSequence {\r\n}\r\n\r\nexport interface UIPropertyOfFilterType extends UIProperty {\r\n value?: FilterType;\r\n choices?: IUIPropertyChoicesListOfFilterType | undefined;\r\n}\r\n\r\nexport enum FilterType {\r\n None = 0, \r\n MERV8_2Inch = 1, \r\n MERV13_2Inch = 2, \r\n MERV8_4Inch = 3, \r\n MERV13_4Inch = 4, \r\n MERV11_4Inch = 5, \r\n MERV15_4Inch = 6, \r\n MERV11_12Inch = 7, \r\n MERV13_12Inch = 8, \r\n MERV15_12Inch = 9, \r\n HEPA9997_12Inch = 10, \r\n HEPA9999_12Inch = 11, \r\n HEPA99999_12Inch = 12, \r\n MERV14_4Inch = 13, \r\n MERV14_12Inch = 14, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFilterType {\r\n}\r\n\r\nexport interface ConnectionsAndOptionsUI extends UIEntity {\r\n showVestibule?: boolean;\r\n outsideAirInlet?: UIPropertyOfAirInletOrOutletType | undefined;\r\n supplyAirOutlet?: UIPropertyOfAirInletOrOutletType | undefined;\r\n returnAirInlet?: UIPropertyOfAirInletOrOutletType | undefined;\r\n exhaustAirOutlet?: UIPropertyOfAirInletOrOutletType | undefined;\r\n outsideAirInletLocation?: UIPropertyOfAirInletOrOutletLocationType | undefined;\r\n supplyAirOutletLocation?: UIPropertyOfAirInletOrOutletLocationType | undefined;\r\n returnAirInletLocation?: UIPropertyOfAirInletOrOutletLocationType | undefined;\r\n exhaustAirOutletLocation?: UIPropertyOfAirInletOrOutletLocationType | undefined;\r\n disableOutsideAirInletOrExhaustAirOutlet?: boolean;\r\n connectionsSchematicSvg?: string | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfAirInletOrOutletType extends UIProperty {\r\n value?: AirInletOrOutletType;\r\n choices?: IUIPropertyChoicesListOfAirInletOrOutletType | undefined;\r\n}\r\n\r\nexport enum AirInletOrOutletType {\r\n Duct = 1, \r\n Hood = 2, \r\n Louver = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfAirInletOrOutletType {\r\n}\r\n\r\nexport interface UIPropertyOfAirInletOrOutletLocationType extends UIProperty {\r\n value?: AirInletOrOutletLocationType;\r\n choices?: IUIPropertyChoicesListOfAirInletOrOutletLocationType | undefined;\r\n}\r\n\r\nexport enum AirInletOrOutletLocationType {\r\n LeftEnd = 1, \r\n RightEnd = 2, \r\n FrontSide = 3, \r\n BackSide = 4, \r\n Top = 5, \r\n Bottom = 6, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfAirInletOrOutletLocationType {\r\n}\r\n\r\nexport interface TempsAndSystemUI extends UIEntity {\r\n elevation?: UIPropertyOfDouble | undefined;\r\n predefinedClimateOption?: UIPropertyOfPredefinedClimateOptionType | undefined;\r\n outsideSummerDryBulb?: UIPropertyOfNullableOfDouble | undefined;\r\n outsideSummerWetBulb?: UIPropertyOfNullableOfDouble | undefined;\r\n outsideWinterDryBulb?: UIPropertyOfNullableOfDouble | undefined;\r\n supplyESP?: UIPropertyOfDouble | undefined;\r\n returnESP?: UIPropertyOfDouble | undefined;\r\n airflowSystem?: UIPropertyOfAirflowSystemType | undefined;\r\n unitElectricalVoltage?: UIPropertyOfUnitElectricalVoltageType | undefined;\r\n returnSummerDryBulb?: UIPropertyOfDouble | undefined;\r\n returnSummerRelativeHumidity?: UIPropertyOfDouble | undefined;\r\n returnWinterDryBulb?: UIPropertyOfDouble | undefined;\r\n returnWinterRelativeHumidity?: UIPropertyOfDouble | undefined;\r\n coolingOffCoilDryBulb?: UIPropertyOfNullableOfDouble | undefined;\r\n preheatDryBulb?: UIPropertyOfNullableOfDouble | undefined;\r\n reheatTemp?: UIPropertyOfNullableOfDouble | undefined;\r\n heatingTemp?: UIPropertyOfNullableOfDouble | undefined;\r\n showReheatTemp?: boolean;\r\n showPreheatDryBulbTemp?: boolean;\r\n preHeat?: UIPropertyOfHeating | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfDouble extends UIProperty {\r\n value?: number;\r\n choices?: IUIPropertyChoicesListOfDouble | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDouble {\r\n}\r\n\r\nexport interface UIPropertyOfPredefinedClimateOptionType extends UIProperty {\r\n value?: PredefinedClimateOptionType;\r\n choices?: IUIPropertyChoicesListOfPredefinedClimateOptionType | undefined;\r\n}\r\n\r\nexport enum PredefinedClimateOptionType {\r\n None = 0, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfPredefinedClimateOptionType {\r\n}\r\n\r\nexport interface UIPropertyOfAirflowSystemType extends UIProperty {\r\n value?: AirflowSystemType;\r\n choices?: IUIPropertyChoicesListOfAirflowSystemType | undefined;\r\n}\r\n\r\nexport enum AirflowSystemType {\r\n ChooseAnOption = 0, \r\n ConstantVolume = 1, \r\n VariableAirVolume = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfAirflowSystemType {\r\n}\r\n\r\nexport interface UIPropertyOfUnitElectricalVoltageType extends UIProperty {\r\n value?: UnitElectricalVoltageType;\r\n choices?: IUIPropertyChoicesListOfUnitElectricalVoltageType | undefined;\r\n}\r\n\r\nexport enum UnitElectricalVoltageType {\r\n NotSet = 0, \r\n _208_3_60 = 1, \r\n _230_3_60 = 2, \r\n _460_3_60 = 3, \r\n _575_3_60 = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfUnitElectricalVoltageType {\r\n}\r\n\r\nexport interface UiScreenResultOfPerformanceUI {\r\n uiScreen?: PerformanceUI | undefined;\r\n propertyErrorsByScreenName?: { [key: string] : string[]; } | undefined;\r\n}\r\n\r\nexport interface PerformanceUI extends UIEntity {\r\n coilAndFilterFpmLimit?: UIPropertyOfDouble | undefined;\r\n casingDimensionLimitType?: UIPropertyOfCasingDimensionLimitType | undefined;\r\n casingHeightOrWidthLimit?: UIPropertyOfNullableOfDouble | undefined;\r\n excessiveCasingDimension?: UIPropertyOfNullableOfDouble | undefined;\r\n casingWallThickness?: UIPropertyOfDouble | undefined;\r\n overallHeight?: number;\r\n overallWidth?: number;\r\n isAHUUnitType?: boolean;\r\n designPerformanceResult?: DesignPerformanceResult | undefined;\r\n isCustomizedDesign?: boolean;\r\n customizeButtonEnabled?: boolean;\r\n panelInfos?: ComponentPerformancePanelInfo[] | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfCasingDimensionLimitType extends UIProperty {\r\n value?: CasingDimensionLimitType;\r\n choices?: IUIPropertyChoicesListOfCasingDimensionLimitType | undefined;\r\n}\r\n\r\nexport enum CasingDimensionLimitType {\r\n None = 0, \r\n Height = 1, \r\n Width = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCasingDimensionLimitType {\r\n}\r\n\r\nexport interface DesignPerformanceResult {\r\n casingHeight?: number;\r\n casingWidth?: number;\r\n approxWeight?: number;\r\n budgetPrice?: number;\r\n heatingLeavingTemp?: number | undefined;\r\n coolingLeavingTemp?: number | undefined;\r\n coolingReheatTemp?: number | undefined;\r\n mca?: number;\r\n mop?: number;\r\n}\r\n\r\nexport interface ComponentPerformancePanelInfo {\r\n panelType?: ComponentPerformancePanelType;\r\n title?: string | undefined;\r\n subTitle?: string | undefined;\r\n componentUiId?: string | undefined;\r\n}\r\n\r\nexport enum ComponentPerformancePanelType {\r\n HeatWheel = 0, \r\n PlateHeatExchanger = 1, \r\n ChilledWaterCoil = 2, \r\n Refrigeration = 3, \r\n DirectExpansionCoil = 4, \r\n HotGasReheatCoil = 5, \r\n HotWaterCoil = 6, \r\n SteamCoil = 7, \r\n IndirectFiredFurnace = 8, \r\n ElectricHeater = 9, \r\n HumidifierManifold = 10, \r\n Fan = 11, \r\n Filter = 12, \r\n SoundAttenuator = 13, \r\n}\r\n\r\nexport interface OptimizedPerformanceResponse {\r\n designPerformanceResult?: DesignPerformanceResult | undefined;\r\n hasError?: boolean;\r\n errorMessage?: string | undefined;\r\n}\r\n\r\nexport interface ComponentsUI {\r\n heatWheelComponent?: HeatWheelComponentUI | undefined;\r\n plateHXComponent?: PlateHXComponentUI | undefined;\r\n idfComponent?: IDFComponentUI | undefined;\r\n chilledWaterCoilComponent?: ChilledWaterCoilComponentUI | undefined;\r\n hotWaterCoilComponent?: HotWaterCoilComponentUI | undefined;\r\n preHeatHotWaterCoilComponent?: HotWaterCoilComponentUI | undefined;\r\n electricHeaterComponent?: ElectricHeaterComponentUI | undefined;\r\n preHeatElectricHeaterComponent?: ElectricHeaterComponentUI | undefined;\r\n dxCoilComponent?: DxCoilComponentUI | undefined;\r\n hotGasReheatComponent?: HotGasReheatComponentUI | undefined;\r\n steamCoilComponent?: SteamCoilComponentUI | undefined;\r\n supplyFanComponent?: FanComponentUI | undefined;\r\n exhaustFanComponent?: FanComponentUI | undefined;\r\n supplyAirSoundAttenuatorComponent?: SoundAttenuatorComponentUI | undefined;\r\n returnAirSoundAttenuatorComponent?: SoundAttenuatorComponentUI | undefined;\r\n humidifierManifoldComponent?: HumidifierManifoldComponentUI | undefined;\r\n outsideAirPreFilterComponent?: FilterComponentUI | undefined;\r\n outsideAirFinalFilterComponent?: FilterComponentUI | undefined;\r\n supplyAirFilterComponent?: FilterComponentUI | undefined;\r\n returnAirFilterComponent?: FilterComponentUI | undefined;\r\n}\r\n\r\nexport interface ComponentUI extends UIEntity {\r\n errorMessages?: string[] | undefined;\r\n componentUiId?: string | undefined;\r\n}\r\n\r\nexport interface HeatWheelComponentUI extends ComponentUI {\r\n heatWheelChoices?: HeatWheelDto[] | undefined;\r\n summerEffectivenessValues?: EffectivenessValues | undefined;\r\n winterEffectivenessValues?: EffectivenessValues | undefined;\r\n defaultHeatWheelModel?: string | undefined;\r\n selectedHeatWheelModel?: UIPropertyOfString | undefined;\r\n isSelectionLocked?: UIPropertyOfBoolean | undefined;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface HeatWheelDto {\r\n modelNumber?: string | undefined;\r\n displayModelNumber?: string | undefined;\r\n totalEffectiveness?: number;\r\n summerLeavingAirTemperature?: number;\r\n winterLeavingAirTemperature?: number;\r\n pressureDrop?: number;\r\n}\r\n\r\nexport interface EffectivenessValues {\r\n sensibleEffectiveness?: number;\r\n latentEffectiveness?: number;\r\n totalEffectiveness?: number;\r\n}\r\n\r\nexport interface UIPropertyOfBoolean extends UIProperty {\r\n value?: boolean;\r\n choices?: IUIPropertyChoicesListOfBoolean | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfBoolean {\r\n}\r\n\r\nexport interface PlateHXComponentUI extends ComponentUI {\r\n isSelectionLocked?: UIPropertyOfBoolean | undefined;\r\n supplyAirAltitudeOnlyAcfm?: number;\r\n returnAirAltitudeOnlyAcfm?: number;\r\n summerTempEfficiency?: number;\r\n winterTempEfficiency?: number;\r\n manuallySetSquareAndSpacing?: UIPropertyOfString | undefined;\r\n manuallySetPlateHxWidthMm?: UIPropertyOfString | undefined;\r\n selectedPlateHXModel?: UIPropertyOfString | undefined;\r\n errorMessages?: string[] | undefined;\r\n plateHXChoices?: PlateHXDisplay[] | undefined;\r\n}\r\n\r\nexport interface PlateHXDisplay {\r\n model?: string | undefined;\r\n sensibleEfficiency?: number;\r\n summerDesignLat?: number;\r\n winterDesignLat?: number;\r\n airPressureDrop?: number;\r\n squareSize?: number;\r\n plateSpacing?: string | undefined;\r\n hxWidthMm?: number;\r\n targetOaBypassArea?: number;\r\n}\r\n\r\nexport interface IDFComponentUI extends ComponentUI {\r\n enteringAirTemperature?: number;\r\n modelNumber?: string | undefined;\r\n leavingAirTemperature?: number;\r\n outputMbh?: number;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface CoilComponentUIOfChilledWaterCoilComponent extends ComponentUI {\r\n rows?: number;\r\n finsPerInch?: number;\r\n rowsOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n finsPerInchOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n tubeWallThickness?: UIPropertyOfDouble | undefined;\r\n finMaterial?: UIPropertyOfFinMaterialType | undefined;\r\n finThickness?: UIPropertyOfDouble | undefined;\r\n}\r\n\r\nexport interface ChilledWaterCoilComponentUI extends CoilComponentUIOfChilledWaterCoilComponent {\r\n enteringAirDryBulb?: number;\r\n enteringAirWetBulb?: number;\r\n waterPressureDrop?: number;\r\n leavingAirDryBulb?: number;\r\n leavingAirWetBulb?: number;\r\n enteringFluidTemperature?: UIPropertyOfDouble | undefined;\r\n leavingFluidTemperature?: UIPropertyOfDouble | undefined;\r\n coilFluidType?: UIPropertyOfCoilFluidType | undefined;\r\n glycolPercent?: UIPropertyOfDouble | undefined;\r\n shouldShowGlycolPercent?: boolean;\r\n airPressureDrop?: number;\r\n fluidFlowRateGPM?: number;\r\n maxWaterPressureDrop?: UIPropertyOfDouble | undefined;\r\n includeTurbulators?: UIPropertyOfBoolean | undefined;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfCoilFluidType extends UIProperty {\r\n value?: CoilFluidType;\r\n choices?: IUIPropertyChoicesListOfCoilFluidType | undefined;\r\n}\r\n\r\nexport enum CoilFluidType {\r\n None = 0, \r\n Water = 1, \r\n PropyleneGlycol = 2, \r\n EthyleneGlycol = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCoilFluidType {\r\n}\r\n\r\nexport interface UIPropertyOfNullableOfInt32 extends UIProperty {\r\n value?: number | undefined;\r\n choices?: IUIPropertyChoicesListOfNullableOfInt32 | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfNullableOfInt32 {\r\n}\r\n\r\nexport interface UIPropertyOfFinMaterialType extends UIProperty {\r\n value?: FinMaterialType;\r\n choices?: IUIPropertyChoicesListOfFinMaterialType | undefined;\r\n}\r\n\r\nexport enum FinMaterialType {\r\n Aluminum = 1, \r\n Copper = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFinMaterialType {\r\n}\r\n\r\nexport interface CoilComponentUIOfHotWaterCoilComponent extends ComponentUI {\r\n rows?: number;\r\n finsPerInch?: number;\r\n rowsOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n finsPerInchOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n tubeWallThickness?: UIPropertyOfDouble | undefined;\r\n finMaterial?: UIPropertyOfFinMaterialType | undefined;\r\n finThickness?: UIPropertyOfDouble | undefined;\r\n}\r\n\r\nexport interface HotWaterCoilComponentUI extends CoilComponentUIOfHotWaterCoilComponent {\r\n enteringAirDryBulb?: number;\r\n waterPressureDrop?: number;\r\n leavingAirDryBulb?: number;\r\n enteringFluidTemperature?: UIPropertyOfDouble | undefined;\r\n leavingFluidTemperature?: UIPropertyOfDouble | undefined;\r\n coilFluidType?: UIPropertyOfCoilFluidType | undefined;\r\n glycolPercent?: UIPropertyOfDouble | undefined;\r\n shouldShowGlycolPercent?: boolean;\r\n airPressureDrop?: number;\r\n fluidFlowRateGPM?: number;\r\n maxWaterPressureDrop?: UIPropertyOfDouble | undefined;\r\n includeTurbulators?: UIPropertyOfBoolean | undefined;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface ElectricHeaterComponentUI extends ComponentUI {\r\n enteringAirDryBulb?: number;\r\n leavingAirTemp?: number;\r\n voltage?: number;\r\n powerKw?: number;\r\n controlType?: string | undefined;\r\n amps?: number;\r\n}\r\n\r\nexport interface CoilComponentUIOfDXCoilComponent extends ComponentUI {\r\n rows?: number;\r\n finsPerInch?: number;\r\n rowsOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n finsPerInchOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n tubeWallThickness?: UIPropertyOfDouble | undefined;\r\n finMaterial?: UIPropertyOfFinMaterialType | undefined;\r\n finThickness?: UIPropertyOfDouble | undefined;\r\n}\r\n\r\nexport interface DxCoilComponentUI extends CoilComponentUIOfDXCoilComponent {\r\n isPackaged?: boolean;\r\n isEnergyRecovery?: boolean;\r\n hasHGRHCoil?: boolean;\r\n coolingType?: Cooling;\r\n enteringAirDryBulb?: number;\r\n enteringAirWetBulb?: number;\r\n leavingAirDryBulb?: number;\r\n leavingAirWetBulb?: number;\r\n suctionTemperature?: UIPropertyOfDouble | undefined;\r\n circuitQuantity_UserValue?: UIPropertyOfString | undefined;\r\n condensingCapacity?: number;\r\n balancedCircuitQuantity?: number;\r\n coolingTons?: number;\r\n forceCircuitQuantityToTwo?: boolean;\r\n compressorType?: UIPropertyOfCompressorType | undefined;\r\n ambientTemp?: UIPropertyOfDouble | undefined;\r\n eer?: number;\r\n actualCompressorType?: string | undefined;\r\n includeRifledTubes?: UIPropertyOfBoolean | undefined;\r\n airPressureDrop?: number;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfCompressorType extends UIProperty {\r\n value?: CompressorType;\r\n choices?: IUIPropertyChoicesListOfCompressorType | undefined;\r\n}\r\n\r\nexport enum CompressorType {\r\n Automatic = 0, \r\n VFDScroll = 1, \r\n DigitalScroll = 2, \r\n StagedScroll = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCompressorType {\r\n}\r\n\r\nexport interface CoilComponentUIOfHotGasReheatCoilComponent extends ComponentUI {\r\n rows?: number;\r\n finsPerInch?: number;\r\n rowsOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n finsPerInchOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n tubeWallThickness?: UIPropertyOfDouble | undefined;\r\n finMaterial?: UIPropertyOfFinMaterialType | undefined;\r\n finThickness?: UIPropertyOfDouble | undefined;\r\n}\r\n\r\nexport interface HotGasReheatComponentUI extends CoilComponentUIOfHotGasReheatCoilComponent {\r\n enteringAirTemp?: number;\r\n leavingAirTemp?: number;\r\n reheatCircuits?: number;\r\n airPressureDrop?: number;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface CoilComponentUIOfSteamCoilComponent extends ComponentUI {\r\n rows?: number;\r\n finsPerInch?: number;\r\n rowsOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n finsPerInchOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n tubeWallThickness?: UIPropertyOfDouble | undefined;\r\n finMaterial?: UIPropertyOfFinMaterialType | undefined;\r\n finThickness?: UIPropertyOfDouble | undefined;\r\n}\r\n\r\nexport interface SteamCoilComponentUI extends CoilComponentUIOfSteamCoilComponent {\r\n enteringAirTemp?: number;\r\n leavingAirTemp?: number;\r\n steamPressure?: UIPropertyOfDouble | undefined;\r\n steamLoading?: number;\r\n tubeDiameter?: UIPropertyOfTubeDiameterType | undefined;\r\n airPressureDrop?: number;\r\n errorMessages?: string[] | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfTubeDiameterType extends UIProperty {\r\n value?: TubeDiameterType;\r\n choices?: IUIPropertyChoicesListOfTubeDiameterType | undefined;\r\n}\r\n\r\nexport enum TubeDiameterType {\r\n ThreeEighths = 1, \r\n OneHalf = 2, \r\n FiveEighths = 3, \r\n One = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfTubeDiameterType {\r\n}\r\n\r\nexport interface FanComponentUI extends ComponentUI {\r\n airflow?: number;\r\n totalStaticPressure?: number;\r\n totalStaticPressureOverride?: UIPropertyOfNullableOfDouble | undefined;\r\n fanQuantity?: number;\r\n isSideBySideUnit?: boolean;\r\n minimumFanQuantity?: number;\r\n minimumFanQuantityInHeight?: number;\r\n minimumFanQuantityInWidth?: number;\r\n fanChoices?: FanDto[] | undefined;\r\n defaultFanKey?: FanKey | undefined;\r\n selectedFanKey?: UIPropertyOfFanKey | undefined;\r\n isSelectionLocked?: UIPropertyOfBoolean | undefined;\r\n errorMessages?: string[] | undefined;\r\n fanQuantityInHeight?: number;\r\n fanQuantityInWidth?: number;\r\n fanQuantityInHeightOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n fanQuantityInWidthOverride?: UIPropertyOfNullableOfInt32 | undefined;\r\n}\r\n\r\nexport interface FanDto {\r\n fanKey?: FanKey | undefined;\r\n modelDisplayName?: string | undefined;\r\n fanRpm?: number;\r\n motorRpm?: number;\r\n horsePowerDescription?: string | undefined;\r\n staticEfficiencyPercent?: number;\r\n arrayLwaOutletDb?: number;\r\n}\r\n\r\nexport interface FanKey {\r\n modelNumber?: string | undefined;\r\n quantity?: number;\r\n motorRpm?: number | undefined;\r\n fanId?: string | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfFanKey extends UIProperty {\r\n value?: FanKey | undefined;\r\n choices?: IUIPropertyChoicesListOfFanKey | undefined;\r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFanKey {\r\n}\r\n\r\nexport interface SoundAttenuatorComponentUI extends ComponentUI {\r\n soundAttenuatorLength?: UIPropertyOfSoundAttenuatorLengthType | undefined;\r\n faceVelocity?: number;\r\n insertionLoss63Hz?: number;\r\n insertionLoss125Hz?: number;\r\n insertionLoss250Hz?: number;\r\n insertionLoss500Hz?: number;\r\n insertionLoss1000Hz?: number;\r\n insertionLoss2000Hz?: number;\r\n insertionLoss4000Hz?: number;\r\n insertionLoss8000Hz?: number;\r\n}\r\n\r\nexport interface UIPropertyOfSoundAttenuatorLengthType extends UIProperty {\r\n value?: SoundAttenuatorLengthType;\r\n choices?: IUIPropertyChoicesListOfSoundAttenuatorLengthType | undefined;\r\n}\r\n\r\nexport enum SoundAttenuatorLengthType {\r\n NotSet = 0, \r\n _24 = 1, \r\n _36 = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSoundAttenuatorLengthType {\r\n}\r\n\r\nexport interface HumidifierManifoldComponentUI extends ComponentUI {\r\n airTemp?: number;\r\n enteringRH?: number;\r\n steamCapacity?: number;\r\n steamPressureEnabled?: boolean;\r\n desiredLeavingRH?: UIPropertyOfNullableOfDouble | undefined;\r\n steamSource?: UIPropertyOfSteamSourceType | undefined;\r\n absorptionDistance?: number;\r\n steamPressure?: UIPropertyOfNullableOfDouble | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfSteamSourceType extends UIProperty {\r\n value?: SteamSourceType;\r\n choices?: IUIPropertyChoicesListOfSteamSourceType | undefined;\r\n}\r\n\r\nexport enum SteamSourceType {\r\n SteamGeneratorByOthers = 0, \r\n BuildingSteam = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSteamSourceType {\r\n}\r\n\r\nexport interface FilterComponentUI extends ComponentUI {\r\n loadingLevel?: UIPropertyOfFilterLoadingLevel | undefined;\r\n filterRemoval?: UIPropertyOfFilterRemoval | undefined;\r\n filterRemovalDisabled?: boolean;\r\n type?: string | undefined;\r\n faceVelocity?: number;\r\n pressureDrop?: number;\r\n}\r\n\r\nexport interface UIPropertyOfFilterLoadingLevel extends UIProperty {\r\n value?: FilterLoadingLevel;\r\n choices?: IUIPropertyChoicesListOfFilterLoadingLevel | undefined;\r\n}\r\n\r\nexport enum FilterLoadingLevel {\r\n Clean = 1, \r\n Mean = 2, \r\n Dirty = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFilterLoadingLevel {\r\n}\r\n\r\nexport interface UIPropertyOfFilterRemoval extends UIProperty {\r\n value?: FilterRemoval;\r\n choices?: IUIPropertyChoicesListOfFilterRemoval | undefined;\r\n}\r\n\r\nexport enum FilterRemoval {\r\n Side = 1, \r\n Front = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFilterRemoval {\r\n}\r\n\r\nexport interface UnitSelectionUI extends UIEntity {\r\n unitType?: UIPropertyOfUnitType | undefined;\r\n}\r\n\r\nexport interface AccessEditingAndDrawingUI extends UIEntity {\r\n cabinetAndBaseHeight?: number;\r\n cabinetWidth?: number;\r\n cabinetLength?: number;\r\n overallHeight?: number;\r\n overallWidth?: number;\r\n overallLength?: number;\r\n showUnitLengthWarning?: boolean;\r\n shippingWeight?: number;\r\n operatingWeight?: number;\r\n drawingViewInfo?: DrawingViewInfo | undefined;\r\n hoodAndLouverExtensions?: { [key: string] : number; } | undefined;\r\n}\r\n\r\nexport interface DrawingViewInfo {\r\n defaultViewType?: DrawingViewType;\r\n availableViewTypes?: DrawingViewType[] | undefined;\r\n}\r\n\r\nexport enum DrawingViewType {\r\n FrontSide = 0, \r\n BackSide = 1, \r\n LeftEnd = 2, \r\n RightEnd = 3, \r\n Top = 4, \r\n TopUpperTunnel = 5, \r\n TopBottomTunnel = 6, \r\n}\r\n\r\nexport interface AccessDoorsUI extends UIEntity {\r\n unitAccessSide?: UIPropertyOfUnitAccess | undefined;\r\n topDrawingViewInfo?: DrawingViewInfo | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfUnitAccess extends UIProperty {\r\n value?: UnitAccess;\r\n choices?: IUIPropertyChoicesListOfUnitAccess | undefined;\r\n}\r\n\r\nexport enum UnitAccess {\r\n FrontSide = 1, \r\n BackSide = 2, \r\n Automatic = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfUnitAccess {\r\n}\r\n\r\nexport interface CoilConnectionsUI extends UIEntity {\r\n preHeatHotWaterUnitPenetration?: UIPropertyOfFluidCoilPenetration | undefined;\r\n chilledWaterUnitPenetration?: UIPropertyOfFluidCoilPenetration | undefined;\r\n hotWaterUnitPenetration?: UIPropertyOfFluidCoilPenetration | undefined;\r\n steamUnitPenetration?: UIPropertyOfFluidCoilPenetration | undefined;\r\n dxUnitPenetration?: UIPropertyOfRefrigerantCoilPenetration | undefined;\r\n hotGasReheatUnitPenetration?: UIPropertyOfRefrigerantCoilPenetration | undefined;\r\n topDrawingViewInfo?: DrawingViewInfo | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfFluidCoilPenetration extends UIProperty {\r\n value?: FluidCoilPenetration;\r\n choices?: IUIPropertyChoicesListOfFluidCoilPenetration | undefined;\r\n}\r\n\r\nexport enum FluidCoilPenetration {\r\n PipeChase = 1, \r\n FrontSide = 2, \r\n BackSide = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFluidCoilPenetration {\r\n}\r\n\r\nexport interface UIPropertyOfRefrigerantCoilPenetration extends UIProperty {\r\n value?: RefrigerantCoilPenetration;\r\n choices?: IUIPropertyChoicesListOfRefrigerantCoilPenetration | undefined;\r\n}\r\n\r\nexport enum RefrigerantCoilPenetration {\r\n None = 0, \r\n FrontSideWithinCompressorVestibule = 1, \r\n FrontSide = 2, \r\n BackSide = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfRefrigerantCoilPenetration {\r\n}\r\n\r\nexport interface ElectFurnacePanelsUI extends UIEntity {\r\n electricalPanelLocation?: UIPropertyOfString | undefined;\r\n furnacePanelLocation?: UIPropertyOfFurnacePanelLocation | undefined;\r\n topDrawingViewInfo?: DrawingViewInfo | undefined;\r\n hasCondensingSection?: boolean;\r\n airTunnelOrientation?: number | undefined;\r\n circuitQuantity?: number;\r\n accuArrangement?: number;\r\n cabinetAndBaseHeight?: number;\r\n cabinetWidth?: number;\r\n cabinetLength?: number;\r\n overallHeight?: number;\r\n overallWidth?: number;\r\n overallLength?: number;\r\n shippingWeight?: number;\r\n operatingWeight?: number;\r\n hoodAndLouverExtensions?: { [key: string] : number; } | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfFurnacePanelLocation extends UIProperty {\r\n value?: FurnacePanelLocation;\r\n choices?: IUIPropertyChoicesListOfFurnacePanelLocation | undefined;\r\n}\r\n\r\nexport enum FurnacePanelLocation {\r\n FrontSide = 1, \r\n BackSide = 2, \r\n BothSides = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFurnacePanelLocation {\r\n}\r\n\r\nexport interface LengthInputsUI extends UIEntity {\r\n cabinetLength?: number;\r\n overallLength?: number;\r\n transitionAngles?: UIPropertyOfDouble | undefined;\r\n heatingCoolingAccess?: UIPropertyOfHeatingCoolingAccessOption | undefined;\r\n allowFanDuctOverlap?: UIPropertyOfAllowFanDuctOverlapOption | undefined;\r\n minFilterDoorLength?: UIPropertyOfDouble | undefined;\r\n minFanDoorLength?: UIPropertyOfDouble | undefined;\r\n minEnergyRecoveryDoorLength?: UIPropertyOfDouble | undefined;\r\n minCoilDoorLength?: UIPropertyOfDouble | undefined;\r\n allOtherMinDoorLength?: UIPropertyOfDouble | undefined;\r\n topDrawingViewInfo?: DrawingViewInfo | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfHeatingCoolingAccessOption extends UIProperty {\r\n value?: HeatingCoolingAccessOption;\r\n choices?: IUIPropertyChoicesListOfHeatingCoolingAccessOption | undefined;\r\n}\r\n\r\nexport enum HeatingCoolingAccessOption {\r\n BothFaces = 0, \r\n SingleFace = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfHeatingCoolingAccessOption {\r\n}\r\n\r\nexport interface UIPropertyOfAllowFanDuctOverlapOption extends UIProperty {\r\n value?: AllowFanDuctOverlapOption;\r\n choices?: IUIPropertyChoicesListOfAllowFanDuctOverlapOption | undefined;\r\n}\r\n\r\nexport enum AllowFanDuctOverlapOption {\r\n No = 0, \r\n Yes = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfAllowFanDuctOverlapOption {\r\n}\r\n\r\nexport interface ComponentConstructionUI extends UIEntity {\r\n heatWheelPanel?: HeatWheelPanel | undefined;\r\n coilPanel?: CoilPanel | undefined;\r\n indirectFiredFurnacePanel?: IndirectFiredFurnacePanel | undefined;\r\n accuPanel?: AccuPanel | undefined;\r\n filterPanel?: FilterPanel | undefined;\r\n fanPanel?: FanPanel | undefined;\r\n damperPanel?: DamperPanel | undefined; \r\n}\r\n\r\nexport interface HeatWheelPanel extends UIEntity {\r\n spareBeltsQuantity?: UIPropertyOfNullableOfInt32 | undefined;\r\n}\r\n\r\nexport interface CoilPanel extends UIEntity {\r\n coilPanelItems?: CoilPanelItem[] | undefined;\r\n}\r\n\r\nexport interface CoilPanelItem extends UIEntity {\r\n componentName?: string | undefined;\r\n includeUVLights?: UIPropertyOfBoolean | undefined;\r\n casingConstruction?: UIPropertyOfCasingMaterialType | undefined;\r\n coating?: UIPropertyOfCoilCoatingType | undefined;\r\n tubeThickness?: number;\r\n finMaterial?: string | undefined;\r\n finThickness?: number;\r\n}\r\n\r\nexport interface UIPropertyOfCasingMaterialType extends UIProperty {\r\n value?: CasingMaterialType;\r\n choices?: IUIPropertyChoicesListOfCasingMaterialType | undefined;\r\n}\r\n\r\nexport enum CasingMaterialType {\r\n SixteenGaGalvSteelStd = 1, \r\n FourteenGaGalvSteel = 2, \r\n SixteenGaStainlessSteel = 3, \r\n PointZeroNineThickCopper = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCasingMaterialType {\r\n}\r\n\r\nexport interface UIPropertyOfCoilCoatingType extends UIProperty {\r\n value?: CoilCoatingType;\r\n choices?: IUIPropertyChoicesListOfCoilCoatingType | undefined;\r\n}\r\n\r\nexport enum CoilCoatingType {\r\n None = 0, \r\n BakedPhenolic = 1, \r\n EpoxyCoat = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCoilCoatingType {\r\n}\r\n\r\nexport interface IndirectFiredFurnacePanel extends UIEntity {\r\n tubeMaterial?: UIPropertyOfFurnaceTubeMaterialType | undefined;\r\n tubeMaterialWarningMessage?: string | undefined;\r\n fuelType?: UIPropertyOfFurnaceFuelType | undefined;\r\n minTotalTurnDown?: UIPropertyOfString | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfFurnaceTubeMaterialType extends UIProperty {\r\n value?: FurnaceTubeMaterialType;\r\n choices?: IUIPropertyChoicesListOfFurnaceTubeMaterialType | undefined;\r\n}\r\n\r\nexport enum FurnaceTubeMaterialType {\r\n Stainless409 = 1, \r\n Stainless304 = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFurnaceTubeMaterialType {\r\n}\r\n\r\nexport interface UIPropertyOfFurnaceFuelType extends UIProperty {\r\n value?: FurnaceFuelType;\r\n choices?: IUIPropertyChoicesListOfFurnaceFuelType | undefined;\r\n}\r\n\r\nexport enum FurnaceFuelType {\r\n NaturalGas = 1, \r\n Propane = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFurnaceFuelType {\r\n}\r\n\r\nexport interface AccuPanel extends UIEntity {\r\n condenserCoilCoating?: UIPropertyOfCoilCoatingType | undefined;\r\n}\r\n\r\nexport interface FilterPanel extends UIEntity {\r\n filterPanelItems?: FilterPanelItem[] | undefined;\r\n}\r\n\r\nexport interface FilterPanelItem extends UIEntity {\r\n name?: string | undefined;\r\n filterCategory?: FilterCategoryType;\r\n spareFilterSetsQuantity?: UIPropertyOfInt32 | undefined;\r\n}\r\n\r\nexport enum FilterCategoryType {\r\n Pleated = 1, \r\n Cartridge = 2, \r\n HEPA = 3, \r\n}\r\n\r\nexport interface FanPanel extends UIEntity {\r\n fanPanelItems?: FanPanelItem[] | undefined;\r\n}\r\n\r\nexport interface FanPanelItem extends UIEntity {\r\n name?: string | undefined;\r\n motorEnclosure?: UIPropertyOfMotorEnclosureType | undefined;\r\n shaftGrounding?: UIPropertyOfShaftGroundingType | undefined;\r\n inletGuard?: UIPropertyOfBoolean | undefined;\r\n outletSafetyCage?: UIPropertyOfBoolean | undefined;\r\n includeDoorSafetyKillSwitch?: UIPropertyOfBoolean | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfMotorEnclosureType extends UIProperty {\r\n value?: MotorEnclosureType;\r\n choices?: IUIPropertyChoicesListOfMotorEnclosureType | undefined;\r\n}\r\n\r\nexport enum MotorEnclosureType {\r\n TEFC = 1, \r\n ODP = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfMotorEnclosureType {\r\n}\r\n\r\nexport interface UIPropertyOfShaftGroundingType extends UIProperty {\r\n value?: ShaftGroundingType;\r\n choices?: IUIPropertyChoicesListOfShaftGroundingType | undefined;\r\n}\r\n\r\nexport enum ShaftGroundingType {\r\n YesForGreaterThanOrEqualTo10hp = 1, \r\n Yes = 2, \r\n No = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfShaftGroundingType {\r\n}\r\n\r\nexport interface DamperPanel extends UIEntity {\r\n damperPanelItems?: DamperPanelItem[] | undefined;\r\n}\r\n\r\nexport interface DamperPanelItem extends UIEntity {\r\n name?: string | undefined;\r\n motorizedOrGravity?: UIPropertyOfDamperMotorizedOrGravity | undefined;\r\n typeAndConstruction?: UIPropertyOfDamperTypeAndConstruction | undefined;\r\n blade?: string | undefined;\r\n actuator?: string | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfDamperMotorizedOrGravity extends UIProperty {\r\n value?: DamperMotorizedOrGravity;\r\n choices?: IUIPropertyChoicesListOfDamperMotorizedOrGravity | undefined;\r\n}\r\n\r\nexport enum DamperMotorizedOrGravity {\r\n Motorized = 1, \r\n Gravity = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDamperMotorizedOrGravity {\r\n}\r\n\r\nexport interface UIPropertyOfDamperTypeAndConstruction extends UIProperty {\r\n value?: DamperTypeAndConstruction;\r\n choices?: IUIPropertyChoicesListOfDamperTypeAndConstruction | undefined;\r\n}\r\n\r\nexport enum DamperTypeAndConstruction {\r\n GalvanizedFormed = 1, \r\n GalvanizedAirfoil = 2, \r\n AluminumAirfoil = 3, \r\n AluminumBladeGalvanizedFrame = 4, \r\n Stainless304Formed = 5, \r\n Stainless304Airfoil = 6, \r\n AluminumAirfoilInsulatedBlade = 7, \r\n AluminumAirfoilInsulatedBladeAndFrame = 8, \r\n GalvanizedFormedSmoke = 9, \r\n GalvanizedAirfoilSmoke = 10, \r\n AluminumAirfoilSmoke = 11, \r\n GalvanizedFormedAirflowMonitoring = 12, \r\n GalvanizedAirfoilAirflowMonitoring = 13, \r\n AluminumAirfoilAirflowMonitoring = 14, \r\n Aluminum = 15, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDamperTypeAndConstruction {\r\n}\r\n\r\nexport interface InletOutletSizingUI extends UIEntity {\r\n outsideAirInlet?: InletOutletUI | undefined;\r\n supplyAirOutlet?: InletOutletUI | undefined;\r\n returnAirInlet?: InletOutletUI | undefined;\r\n exhaustAirOutlet?: InletOutletUI | undefined;\r\n}\r\n\r\nexport interface InletOutletUI extends UIEntity {\r\n connectionType?: AirInletOrOutletType;\r\n connectionLocationDisplayName?: string | undefined;\r\n airflowCFM?: number;\r\n sizingMethod?: UIPropertyOfOpeningSizingMethod | undefined;\r\n sizingMethodValidationMessage?: string | undefined;\r\n dimensionA?: UIPropertyOfNullableOfDouble | undefined;\r\n dimensionB?: UIPropertyOfNullableOfDouble | undefined;\r\n dimensionC?: UIPropertyOfNullableOfDouble | undefined;\r\n dimensionD?: UIPropertyOfNullableOfDouble | undefined;\r\n dimensionsAreReadOnly?: boolean;\r\n faceVelocityIsReadOnly?: boolean;\r\n faceVelocityFpm?: UIPropertyOfDouble | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfOpeningSizingMethod extends UIProperty {\r\n value?: OpeningSizingMethod;\r\n choices?: IUIPropertyChoicesListOfOpeningSizingMethod | undefined;\r\n}\r\n\r\nexport enum OpeningSizingMethod {\r\n FullSize = 1, \r\n FullWidth = 2, \r\n FullHeight = 3, \r\n Manual = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfOpeningSizingMethod {\r\n}\r\n\r\nexport interface ControlsUI extends UIEntity {\r\n airflowArrangement?: UIPropertyOfAirflowArrangementType | undefined;\r\n controlsInclusion?: UIPropertyOfControlsInclusionType | undefined;\r\n damperActuatorsInclusion?: UIPropertyOfDamperActuatorsInclusionType | undefined;\r\n outsideAirInletDamperEnabled?: boolean;\r\n outsideAirInletAirflowMonitoringEnabled?: boolean;\r\n damperActuatorsInclusionEnabled?: boolean;\r\n outsideAirInletDamper?: UIPropertyOfBoolean | undefined;\r\n exhaustAirOutletDamper?: UIPropertyOfBoolean | undefined;\r\n returnAirInletDamper?: UIPropertyOfBoolean | undefined;\r\n supplyAirOutletSmokeDamper?: UIPropertyOfBoolean | undefined;\r\n returnAirInletSmokeDamper?: UIPropertyOfBoolean | undefined;\r\n outsideAirInletAirflowMonitoring?: UIPropertyOfBoolean | undefined;\r\n supplyFanAirflowMonitoring?: UIPropertyOfBoolean | undefined;\r\n showReturnFanAirFlowMonitoring?: boolean;\r\n returnFanAirflowMonitoring?: UIPropertyOfBoolean | undefined;\r\n enableSupplyFanAirFlowMonitoring?: boolean;\r\n showExhaustFanAirFlowMonitoring?: boolean;\r\n exhaustFanAirflowMonitoring?: UIPropertyOfBoolean | undefined;\r\n magnehelicGauges?: UIPropertyOfBoolean | undefined;\r\n vavOrConstantVolume?: string | undefined;\r\n supplyFanControl?: UIPropertyOfSupplyFanControlType | undefined;\r\n returnFanControl?: UIPropertyOfReturnFanControlType | undefined;\r\n exhaustFanControl?: UIPropertyOfExhaustFanControlType | undefined;\r\n temperatureControl?: UIPropertyOfTemperatureControlType | undefined;\r\n dehumidificationControl?: UIPropertyOfDehumidificationControlType | undefined;\r\n economizerInitiation?: UIPropertyOfEconomizerInitiationType | undefined;\r\n minimumOutsideAirControl?: UIPropertyOfMinimumOutsideAirControlType | undefined;\r\n unoccupiedModeControl?: UIPropertyOfUnoccupiedModeControlType | undefined;\r\n unoccupiedWarmUp?: UIPropertyOfBoolean | undefined;\r\n unoccupiedCoolDown?: UIPropertyOfBoolean | undefined;\r\n heatWheelRotationDetection?: UIPropertyOfBoolean | undefined;\r\n demandControlVentilationCO2?: UIPropertyOfBoolean | undefined;\r\n dirtyFilterSwitches?: UIPropertyOfBoolean | undefined;\r\n filterPressureTransducers?: UIPropertyOfBoolean | undefined;\r\n condensateDrainPanOverflowSwitch?: UIPropertyOfBoolean | undefined;\r\n freezestat?: UIPropertyOfBoolean | undefined;\r\n highDuctStaticPressure?: UIPropertyOfBoolean | undefined;\r\n lowDuctStaticPressure?: UIPropertyOfBoolean | undefined;\r\n interfaceCard?: UIPropertyOfInterfaceCard | undefined;\r\n showInterfaceCard?: boolean;\r\n}\r\n\r\nexport interface UIPropertyOfControlsInclusionType extends UIProperty {\r\n value?: ControlsInclusionType;\r\n choices?: IUIPropertyChoicesListOfControlsInclusionType | undefined;\r\n}\r\n\r\nexport enum ControlsInclusionType {\r\n None = 0, \r\n ProvidedByAndInstalledByInnovent = 1, \r\n ProvidedByAndInstalledByOthers = 2, \r\n RefrigerationProvidedByAndInstalledByInnovent = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfControlsInclusionType {\r\n}\r\n\r\nexport interface UIPropertyOfDamperActuatorsInclusionType extends UIProperty {\r\n value?: DamperActuatorsInclusionType;\r\n choices?: IUIPropertyChoicesListOfDamperActuatorsInclusionType | undefined;\r\n}\r\n\r\nexport enum DamperActuatorsInclusionType {\r\n ProvidedByInnoventAndInstalledByInnovent = 0, \r\n ProvidedByOthersAndInstalledByOthers = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDamperActuatorsInclusionType {\r\n}\r\n\r\nexport interface UIPropertyOfSupplyFanControlType extends UIProperty {\r\n value?: SupplyFanControlType;\r\n choices?: IUIPropertyChoicesListOfSupplyFanControlType | undefined;\r\n}\r\n\r\nexport enum SupplyFanControlType {\r\n None = 0, \r\n ManualBalance = 1, \r\n DuctStaticPressure = 2, \r\n SupplyCfm = 3, \r\n HardwiredSignal0to10VDC = 4, \r\n SingleZone = 5, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSupplyFanControlType {\r\n}\r\n\r\nexport interface UIPropertyOfReturnFanControlType extends UIProperty {\r\n value?: ReturnFanControlType;\r\n choices?: IUIPropertyChoicesListOfReturnFanControlType | undefined;\r\n}\r\n\r\nexport enum ReturnFanControlType {\r\n None = 0, \r\n SpaceStaticPressure = 1, \r\n ManualBalance = 2, \r\n DuctStaticPressure = 3, \r\n ReturnCFM = 4, \r\n HardwiredSignal0to10VDC = 5, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfReturnFanControlType {\r\n}\r\n\r\nexport interface UIPropertyOfExhaustFanControlType extends UIProperty {\r\n value?: ExhaustFanControlType;\r\n choices?: IUIPropertyChoicesListOfExhaustFanControlType | undefined;\r\n}\r\n\r\nexport enum ExhaustFanControlType {\r\n None = 0, \r\n ManualBalance = 1, \r\n DuctStaticPressure = 2, \r\n ExhaustCfm = 3, \r\n PositiveSpaceStaticPressure = 4, \r\n NegativeSpaceStaticPressure = 5, \r\n HardwiredSignal0to10VDC = 6, \r\n TrackSupplyFan = 7, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfExhaustFanControlType {\r\n}\r\n\r\nexport interface UIPropertyOfTemperatureControlType extends UIProperty {\r\n value?: TemperatureControlType;\r\n choices?: IUIPropertyChoicesListOfTemperatureControlType | undefined;\r\n}\r\n\r\nexport enum TemperatureControlType {\r\n None = 0, \r\n SupplyDischarge = 1, \r\n ReturnReset = 2, \r\n SpaceReset = 3, \r\n OutsideAirReset = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfTemperatureControlType {\r\n}\r\n\r\nexport interface UIPropertyOfDehumidificationControlType extends UIProperty {\r\n value?: DehumidificationControlType;\r\n choices?: IUIPropertyChoicesListOfDehumidificationControlType | undefined;\r\n}\r\n\r\nexport enum DehumidificationControlType {\r\n None = 0, \r\n ReturnDewPointGreaterThanDehumSetPoint = 1, \r\n SpaceDewPointGreaterThanDehumSetPoint = 2, \r\n OutsideDewPointGreaterThanDehumsetPoint = 3, \r\n ReturnRelativeHumidityGreaterThanDehumSetPoint = 4, \r\n SpaceRelativeHumidityGreaterThanDehumSetPoint = 5, \r\n SpaceOrOaDewPointGreaterThanDehumSetPoint = 6, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDehumidificationControlType {\r\n}\r\n\r\nexport interface UIPropertyOfEconomizerInitiationType extends UIProperty {\r\n value?: EconomizerInitiationType;\r\n choices?: IUIPropertyChoicesListOfEconomizerInitiationType | undefined;\r\n}\r\n\r\nexport enum EconomizerInitiationType {\r\n None = 0, \r\n OutsideDryBulbLessThanReturnDryBulb = 1, \r\n OutsideDryBulbLessThanSpaceDryBulb = 2, \r\n OutsideDryBulbLessThanDryBulbSetpoint = 3, \r\n OutsideEnthalpyLessThanReturnEnthalpy = 4, \r\n OutsideEnthalpyLessThanSpaceEnthalpy = 5, \r\n OutsideEnthalpyLessThanEnthalpySetpoint = 6, \r\n ReturnEnthalpyAndOutsideDryBulb = 7, \r\n SpaceEnthalpyAndOutsideDryBulb = 8, \r\n EnthalpySetPointAndOutsideDryBulb = 9, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfEconomizerInitiationType {\r\n}\r\n\r\nexport interface UIPropertyOfMinimumOutsideAirControlType extends UIProperty {\r\n value?: MinimumOutsideAirControlType;\r\n choices?: IUIPropertyChoicesListOfMinimumOutsideAirControlType | undefined;\r\n}\r\n\r\nexport enum MinimumOutsideAirControlType {\r\n None = 0, \r\n MinimumOutsideAirCfm = 1, \r\n MinimumPercentOfDesignAirflow = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfMinimumOutsideAirControlType {\r\n}\r\n\r\nexport interface UIPropertyOfUnoccupiedModeControlType extends UIProperty {\r\n value?: UnoccupiedModeControlType;\r\n choices?: IUIPropertyChoicesListOfUnoccupiedModeControlType | undefined;\r\n}\r\n\r\nexport enum UnoccupiedModeControlType {\r\n None = 0, \r\n UnitIsOff = 1, \r\n NightSetbackWithSupplyFanStandby = 2, \r\n NightSetbackWithSupplyFanOn = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfUnoccupiedModeControlType {\r\n}\r\n\r\nexport interface UIPropertyOfInterfaceCard extends UIProperty {\r\n value?: InterfaceCard;\r\n choices?: IUIPropertyChoicesListOfInterfaceCard | undefined;\r\n}\r\n\r\nexport enum InterfaceCard {\r\n None = 0, \r\n BacnetMSTP = 1, \r\n BacnetIP = 2, \r\n LonworksFTT10A = 3, \r\n ModbusRTUModeoverRS485 = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfInterfaceCard {\r\n}\r\n\r\nexport interface ElectricalUI extends UIEntity {\r\n voltage?: string | undefined;\r\n sccr?: UIPropertyOfShortCircuitCurrentRatingType | undefined;\r\n disconnectFusing?: UIPropertyOfBoolean | undefined;\r\n disconnectFusingDisabled?: UIPropertyOfBoolean | undefined;\r\n phaseVoltageProtection?: UIPropertyOfBoolean | undefined;\r\n phaseVoltageProtectionDisabled?: boolean;\r\n fanVfdItems?: FanVfdItem[] | undefined;\r\n gfciQuantity?: UIPropertyOfInt32 | undefined;\r\n circuitPower?: UIPropertyOfSinglePhaseCircuitPower | undefined;\r\n lightInclusion?: UIPropertyOfLightInclusionLocation | undefined;\r\n vfdProvisionInstallation?: UIPropertyOfVFDProvisionInstallation | undefined;\r\n smokeDetectors?: UIPropertyOfSmokeDetectors | undefined;\r\n smokeDetectorInclusion?: UIPropertyOfSmokeDetectorInclusionType | undefined;\r\n smokeDetectorType?: UIPropertyOfSmokeDetectorType | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfShortCircuitCurrentRatingType extends UIProperty {\r\n value?: ShortCircuitCurrentRatingType;\r\n choices?: IUIPropertyChoicesListOfShortCircuitCurrentRatingType | undefined;\r\n}\r\n\r\nexport enum ShortCircuitCurrentRatingType {\r\n None = 0, \r\n FivekA = 1, \r\n SixtyFivekA = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfShortCircuitCurrentRatingType {\r\n}\r\n\r\nexport interface FanVfdItem extends UIEntity {\r\n showVfdSharingErrorMessage?: boolean;\r\n quantity?: UIPropertyOfFanArrayVfdSharing | undefined;\r\n allowMicrodrives?: UIPropertyOfBoolean | undefined;\r\n manualBypass?: UIPropertyOfBoolean | undefined;\r\n name?: UIPropertyOfString | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfFanArrayVfdSharing extends UIProperty {\r\n value?: FanArrayVfdSharing;\r\n choices?: IUIPropertyChoicesListOfFanArrayVfdSharing | undefined;\r\n}\r\n\r\nexport enum FanArrayVfdSharing {\r\n OnePerFan = 1, \r\n OnePerArray = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFanArrayVfdSharing {\r\n}\r\n\r\nexport interface UIPropertyOfSinglePhaseCircuitPower extends UIProperty {\r\n value?: SinglePhaseCircuitPower;\r\n choices?: IUIPropertyChoicesListOfSinglePhaseCircuitPower | undefined;\r\n}\r\n\r\nexport enum SinglePhaseCircuitPower {\r\n NotApplicable = 0, \r\n UnitTransformer = 1, \r\n PowerByOthers = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSinglePhaseCircuitPower {\r\n}\r\n\r\nexport interface UIPropertyOfLightInclusionLocation extends UIProperty {\r\n value?: LightInclusionLocation;\r\n choices?: IUIPropertyChoicesListOfLightInclusionLocation | undefined;\r\n}\r\n\r\nexport enum LightInclusionLocation {\r\n None = 0, \r\n Fansections = 1, \r\n FilterSections = 2, \r\n FanAndFilterSections = 3, \r\n AllAccessSections = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfLightInclusionLocation {\r\n}\r\n\r\nexport interface UIPropertyOfVFDProvisionInstallation extends UIProperty {\r\n value?: VFDProvisionInstallation;\r\n choices?: IUIPropertyChoicesListOfVFDProvisionInstallation | undefined;\r\n}\r\n\r\nexport enum VFDProvisionInstallation {\r\n ProvidedByAndInstalledByInnovent = 0, \r\n ProvidedByAndInstalledByOthers = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfVFDProvisionInstallation {\r\n}\r\n\r\nexport interface UIPropertyOfSmokeDetectors extends UIProperty {\r\n value?: SmokeDetectors;\r\n choices?: IUIPropertyChoicesListOfSmokeDetectors | undefined;\r\n}\r\n\r\nexport enum SmokeDetectors {\r\n None = 0, \r\n Supply = 1, \r\n Return = 2, \r\n SupplyAndReturn = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSmokeDetectors {\r\n}\r\n\r\nexport interface UIPropertyOfSmokeDetectorInclusionType extends UIProperty {\r\n value?: SmokeDetectorInclusionType;\r\n choices?: IUIPropertyChoicesListOfSmokeDetectorInclusionType | undefined;\r\n}\r\n\r\nexport enum SmokeDetectorInclusionType {\r\n None = 0, \r\n ProvidedByOthersAndInstalledByOthers = 1, \r\n ProvidedByInnoventAndInstalledByInnovent = 2, \r\n ProvidedByInnoventAndInstalledByOthers = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSmokeDetectorInclusionType {\r\n}\r\n\r\nexport interface UIPropertyOfSmokeDetectorType extends UIProperty {\r\n value?: SmokeDetectorType;\r\n choices?: IUIPropertyChoicesListOfSmokeDetectorType | undefined;\r\n}\r\n\r\nexport enum SmokeDetectorType {\r\n None = 0, \r\n PhotoElectric = 1, \r\n Ionization = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfSmokeDetectorType {\r\n}\r\n\r\nexport interface UnitCabinetUI extends UIEntity {\r\n exteriorMaterial?: UIPropertyOfExteriorMaterialType | undefined;\r\n exteriorMaterialPaintColor?: UIPropertyOfString | undefined;\r\n interiorMaterial?: UIPropertyOfInteriorMaterialType | undefined;\r\n mountingType?: UIPropertyOfMountingType | undefined;\r\n curbProvidedBy?: UIPropertyOfCurbProvidedBy | undefined;\r\n curbHeight?: UIPropertyOfInt32 | undefined;\r\n perforatedLiner?: UIPropertyOfPerforatedLinerType | undefined;\r\n floorConstruction?: UIPropertyOfFloorConstructionType | undefined;\r\n floorMaterial?: UIPropertyOfFloorMaterialType | undefined;\r\n floorDrains?: UIPropertyOfFloorDrainsType | undefined;\r\n shippingShrinkWrap?: UIPropertyOfBoolean | undefined;\r\n shippingShrinkWrapEnabled?: boolean;\r\n coolingOptionSelected?: boolean;\r\n sensiblePlateSelected?: boolean;\r\n humidifierManifoldSharesDrainPanWithCooling?: boolean;\r\n hasHumidifierManifold?: boolean;\r\n displayCurbProvidecBy?: boolean;\r\n displayCurbHeight?: boolean;\r\n sensiblePlateDrainPanMaterial?: UIPropertyOfDrainPanMaterialType | undefined;\r\n coolingCoilDrainPanMaterial?: UIPropertyOfDrainPanMaterialType | undefined;\r\n humidifierManifoldDrainPanMaterial?: UIPropertyOfDrainPanMaterialType | undefined;\r\n inwardSwinging?: UIPropertyOfInwardSwingingLocation | undefined;\r\n thermalBreak?: UIPropertyOfThermalBreakLocation | undefined;\r\n windowInclusion?: UIPropertyOfWindowInclusion | undefined;\r\n doorLengthWarning?: string | undefined;\r\n window?: UIPropertyOfWindowType | undefined;\r\n pressureReliefLatch?: UIPropertyOfPressureReliefLatchLocation | undefined;\r\n interiorHandles?: UIPropertyOfInteriorHandlesLocation | undefined;\r\n tieBack?: UIPropertyOfTieBackLocation | undefined;\r\n lock?: UIPropertyOfLockType | undefined;\r\n doorHandleInterlock?: UIPropertyOfDoorHandleInterlockLocation | undefined;\r\n testPort?: UIPropertyOfTestPortLocation | undefined;\r\n}\r\n\r\nexport interface UIPropertyOfExteriorMaterialType extends UIProperty {\r\n value?: ExteriorMaterialType;\r\n choices?: IUIPropertyChoicesListOfExteriorMaterialType | undefined;\r\n}\r\n\r\nexport enum ExteriorMaterialType {\r\n NotSet = 0, \r\n HiproPolyPaintedSteel = 1, \r\n CustomColorAirDriedSteel = 2, \r\n GalvanizedSteel = 3, \r\n Aluminum = 4, \r\n StainlessSteel304 = 5, \r\n StainlessSteel316 = 6, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfExteriorMaterialType {\r\n}\r\n\r\nexport interface UIPropertyOfInteriorMaterialType extends UIProperty {\r\n value?: InteriorMaterialType;\r\n choices?: IUIPropertyChoicesListOfInteriorMaterialType | undefined;\r\n}\r\n\r\nexport enum InteriorMaterialType {\r\n NotSet = 0, \r\n GalvanizedSteel = 1, \r\n StainlessSteel304 = 2, \r\n StainlessSteel316 = 3, \r\n Aluminum = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfInteriorMaterialType {\r\n}\r\n\r\nexport interface UIPropertyOfMountingType extends UIProperty {\r\n value?: MountingType;\r\n choices?: IUIPropertyChoicesListOfMountingType | undefined;\r\n}\r\n\r\nexport enum MountingType {\r\n ConcretePad = 0, \r\n StructuralSteelDunnage = 1, \r\n RoofCurb = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfMountingType {\r\n}\r\n\r\nexport interface UIPropertyOfCurbProvidedBy extends UIProperty {\r\n value?: CurbProvidedBy;\r\n choices?: IUIPropertyChoicesListOfCurbProvidedBy | undefined;\r\n}\r\n\r\nexport enum CurbProvidedBy {\r\n ProvidedByInnovent = 0, \r\n ProvidedByOthers = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfCurbProvidedBy {\r\n}\r\n\r\nexport interface UIPropertyOfPerforatedLinerType extends UIProperty {\r\n value?: PerforatedLinerType;\r\n choices?: IUIPropertyChoicesListOfPerforatedLinerType | undefined;\r\n}\r\n\r\nexport enum PerforatedLinerType {\r\n None = 0, \r\n FanSections = 1, \r\n EntireUnit = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfPerforatedLinerType {\r\n}\r\n\r\nexport interface UIPropertyOfFloorConstructionType extends UIProperty {\r\n value?: FloorConstructionType;\r\n choices?: IUIPropertyChoicesListOfFloorConstructionType | undefined;\r\n}\r\n\r\nexport enum FloorConstructionType {\r\n NotSet = 0, \r\n Paneled = 1, \r\n FlatWelded = 2, \r\n DroppedWelded = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFloorConstructionType {\r\n}\r\n\r\nexport interface UIPropertyOfFloorMaterialType extends UIProperty {\r\n value?: FloorMaterialType;\r\n choices?: IUIPropertyChoicesListOfFloorMaterialType | undefined;\r\n}\r\n\r\nexport enum FloorMaterialType {\r\n NotSet = 0, \r\n GalvanizedSteel = 1, \r\n StainlessSteel304 = 2, \r\n StainlessSteel316 = 3, \r\n EpoxyCoatedSteelTreadplate = 4, \r\n FlatAluminum = 5, \r\n AluminumTreadplate = 6, \r\n CoatedSteel = 7, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFloorMaterialType {\r\n}\r\n\r\nexport interface UIPropertyOfFloorDrainsType extends UIProperty {\r\n value?: FloorDrainsType;\r\n choices?: IUIPropertyChoicesListOfFloorDrainsType | undefined;\r\n}\r\n\r\nexport enum FloorDrainsType {\r\n None = 0, \r\n InletAndMixingBoxSections = 1, \r\n OutletSections = 2, \r\n BothInletAndOutletSections = 3, \r\n AllSections = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfFloorDrainsType {\r\n}\r\n\r\nexport interface UIPropertyOfDrainPanMaterialType extends UIProperty {\r\n value?: DrainPanMaterialType;\r\n choices?: IUIPropertyChoicesListOfDrainPanMaterialType | undefined;\r\n}\r\n\r\nexport enum DrainPanMaterialType {\r\n None = 0, \r\n StainlessSteel201 = 1, \r\n StainlessSteel304 = 2, \r\n StainlessSteel316 = 3, \r\n Aluminum = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDrainPanMaterialType {\r\n}\r\n\r\nexport interface UIPropertyOfInwardSwingingLocation extends UIProperty {\r\n value?: InwardSwingingLocation;\r\n choices?: IUIPropertyChoicesListOfInwardSwingingLocation | undefined;\r\n}\r\n\r\nexport enum InwardSwingingLocation {\r\n None = 0, \r\n DoorsOpeningWithPressure = 1, \r\n AllDoors = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfInwardSwingingLocation {\r\n}\r\n\r\nexport interface UIPropertyOfThermalBreakLocation extends UIProperty {\r\n value?: ThermalBreakLocation;\r\n choices?: IUIPropertyChoicesListOfThermalBreakLocation | undefined;\r\n}\r\n\r\nexport enum ThermalBreakLocation {\r\n None = 0, \r\n DownstreamOfCoolingComponents = 1, \r\n AllDoors = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfThermalBreakLocation {\r\n}\r\n\r\nexport interface UIPropertyOfWindowInclusion extends UIProperty {\r\n value?: WindowInclusion;\r\n choices?: IUIPropertyChoicesListOfWindowInclusion | undefined;\r\n}\r\n\r\nexport enum WindowInclusion {\r\n None = 0, \r\n AllDoors = 1, \r\n FanSectionsOnly = 2, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfWindowInclusion {\r\n}\r\n\r\nexport interface UIPropertyOfWindowType extends UIProperty {\r\n value?: WindowType;\r\n choices?: IUIPropertyChoicesListOfWindowType | undefined;\r\n}\r\n\r\nexport enum WindowType {\r\n None = 0, \r\n SinglePaneWireglass12by12 = 1, \r\n DoublePaneWireglass12by12 = 2, \r\n SinglePanePlexiglass12by12 = 3, \r\n DoublePanePlexiglass12by12 = 4, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfWindowType {\r\n}\r\n\r\nexport interface UIPropertyOfPressureReliefLatchLocation extends UIProperty {\r\n value?: PressureReliefLatchLocation;\r\n choices?: IUIPropertyChoicesListOfPressureReliefLatchLocation | undefined;\r\n}\r\n\r\nexport enum PressureReliefLatchLocation {\r\n None = 0, \r\n DoorsOpeningWithPressure = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfPressureReliefLatchLocation {\r\n}\r\n\r\nexport interface UIPropertyOfInteriorHandlesLocation extends UIProperty {\r\n value?: InteriorHandlesLocation;\r\n choices?: IUIPropertyChoicesListOfInteriorHandlesLocation | undefined;\r\n}\r\n\r\nexport enum InteriorHandlesLocation {\r\n None = 0, \r\n AllDoors = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfInteriorHandlesLocation {\r\n}\r\n\r\nexport interface UIPropertyOfTieBackLocation extends UIProperty {\r\n value?: TieBackLocation;\r\n choices?: IUIPropertyChoicesListOfTieBackLocation | undefined;\r\n}\r\n\r\nexport enum TieBackLocation {\r\n None = 0, \r\n AllDoors = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfTieBackLocation {\r\n}\r\n\r\nexport interface UIPropertyOfLockType extends UIProperty {\r\n value?: LockType;\r\n choices?: IUIPropertyChoicesListOfLockType | undefined;\r\n}\r\n\r\nexport enum LockType {\r\n NotSet = 0, \r\n Tool = 1, \r\n Key = 2, \r\n Pad = 3, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfLockType {\r\n}\r\n\r\nexport interface UIPropertyOfDoorHandleInterlockLocation extends UIProperty {\r\n value?: DoorHandleInterlockLocation;\r\n choices?: IUIPropertyChoicesListOfDoorHandleInterlockLocation | undefined;\r\n}\r\n\r\nexport enum DoorHandleInterlockLocation {\r\n None = 0, \r\n AllDoors = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfDoorHandleInterlockLocation {\r\n}\r\n\r\nexport interface UIPropertyOfTestPortLocation extends UIProperty {\r\n value?: TestPortLocation;\r\n choices?: IUIPropertyChoicesListOfTestPortLocation | undefined;\r\n}\r\n\r\nexport enum TestPortLocation {\r\n None = 0, \r\n AllDoors = 1, \r\n}\r\n\r\nexport interface IUIPropertyChoicesListOfTestPortLocation {\r\n}\r\n\r\nexport interface StandardResponse4 {\r\n hasError?: boolean;\r\n errorMessage?: string | undefined;\r\n}\r\n\r\nexport interface ConfigInputsUIResponse extends StandardResponse4 {\r\n unitBasicDetails?: UnitBasicDetails | undefined;\r\n dropdownOptions?: ConfigInputsOptionsDTO | undefined;\r\n validationErrors?: ClientError[] | undefined;\r\n}\r\n\r\nexport interface UnitBasicDetails {\r\n unitBasicDetailsDTO?: UnitBasicDetailsDTO | undefined;\r\n editedFields?: string[] | undefined;\r\n unitBasicDetailsDisplayFields?: UnitBasicDetailsDisplayFields | undefined;\r\n}\r\n\r\nexport interface StandardClientDTO {\r\n userId?: string | undefined;\r\n projectId?: number;\r\n unitId?: number;\r\n updatedFieldName?: string | undefined;\r\n}\r\n\r\nexport interface UnitBasicDetailsDTO extends StandardClientDTO {\r\n unitTag?: string | undefined;\r\n unitQuantity?: number | undefined;\r\n unitType?: number | undefined;\r\n unitLocationType?: number | undefined;\r\n airflowArrangementType?: number | undefined;\r\n airTunnelOrientationType?: number | undefined;\r\n returnAirDirectionType?: number | undefined;\r\n supplyTunnelLocationType?: number | undefined;\r\n energyRecoveryDeviceType?: number | undefined;\r\n outsideAirAltitudeOnlyAcfm?: number | undefined;\r\n outsideAirAltitudeOnlyAcfmUserValue?: number | undefined;\r\n supplyAirAltitudeOnlyAcfm?: number | undefined;\r\n supplyAirAltitudeOnlyAcfmUserValue?: number | undefined;\r\n returnAirAltitudeOnlyAcfm?: number | undefined;\r\n exhaustAirAltitudeOnlyAcfm?: number | undefined;\r\n exhaustAirAltitudeOnlyAcfmUserValue?: number | undefined;\r\n coolingType?: number | undefined;\r\n heatingType?: number | undefined;\r\n preHeatType?: number | undefined;\r\n coolHeatSequenceType?: number | undefined;\r\n outsideAirPrefilterType?: number | undefined;\r\n outsideAirHighEfficiencyFilterType?: number | undefined;\r\n supplyAirFinalFilterType?: number | undefined;\r\n returnAirFilterType?: number | undefined;\r\n soundAttenuatorType?: number | undefined;\r\n humidifierManifoldType?: number | undefined;\r\n airHandlerType?: number | undefined;\r\n outsideAirInlet?: number | undefined;\r\n supplyAirOutlet?: number | undefined;\r\n returnAirInlet?: number | undefined;\r\n exhaustAirOutlet?: number | undefined;\r\n outsideAirInletLocation?: number | undefined;\r\n supplyAirOutletLocation?: number | undefined;\r\n returnAirInletLocation?: number | undefined;\r\n exhaustAirOutletLocation?: number | undefined;\r\n elevation?: number | undefined;\r\n outsideSummerDryBulb?: number | undefined;\r\n outsideSummerWetBulb?: number | undefined;\r\n outsideWinterDryBulb?: number | undefined;\r\n supplyEsp?: number | undefined;\r\n returnEsp?: number | undefined;\r\n unitElectricalVoltage?: number | undefined;\r\n returnSummerDryBulb?: number | undefined;\r\n returnSummerRelativeHumidity?: number | undefined;\r\n returnWinterDryBulb?: number | undefined;\r\n returnWinterRelativeHumidity?: number | undefined;\r\n coolingOffCoilDryBulb?: number | undefined;\r\n reheatTemp?: number | undefined;\r\n preheatDryBulb?: number | undefined;\r\n heatingTemp?: number | undefined;\r\n airflowSystem?: number | undefined;\r\n coilAndFilterFpmLimit?: number | undefined;\r\n casingWallThickness?: number | undefined;\r\n casingDimensionLimitType?: number | undefined;\r\n casingHeightOrWidthLimit?: number | undefined;\r\n}\r\n\r\nexport interface UnitBasicDetailsDisplayFields {\r\n showEnergyRecoveryDevice?: boolean | undefined;\r\n showSupplyAndReturnAir?: boolean | undefined;\r\n showCoolHeatSequence?: boolean | undefined;\r\n showUnitLayoutInputs?: boolean | undefined;\r\n showReheatTemp?: boolean | undefined;\r\n showHeatingDryBulbTemp?: boolean | undefined;\r\n showCoolingDryBulbTemp?: boolean | undefined;\r\n showPreheatDryBulbTemp?: boolean | undefined;\r\n showWinterDryBulbWarning?: boolean | undefined;\r\n showCfmLimitWarning?: boolean | undefined;\r\n showDxSplitWarning?: boolean | undefined;\r\n showDxSplitHGRWarning?: boolean | undefined;\r\n showAirHandlerType?: boolean | undefined;\r\n showReturnAirFilter?: boolean | undefined;\r\n showReturnAirInlet?: boolean | undefined;\r\n showExhaustAirOutlet?: boolean | undefined;\r\n showExhaustAir?: boolean | undefined;\r\n showAirflowArrangement?: boolean | undefined;\r\n coolHeatSequenceDisabled?: boolean | undefined;\r\n returnAirDirectionDisabled?: boolean | undefined;\r\n casingDimensionLimitDisabled?: boolean | undefined;\r\n outsideAndExhaustOpeningDisabled?: boolean | undefined;\r\n unoccupiedModeRequiresRecircDamper?: boolean | undefined;\r\n airPrefilterLabel?: string | undefined;\r\n highEfficiencyFilterLabel?: string | undefined;\r\n}\r\n\r\nexport interface ConfigInputsOptionsDTO {\r\n unitTypeOptions?: DropdownOptionDTO[] | undefined;\r\n energyRecoveryDeviceOptions?: DropdownOptionDTO[] | undefined;\r\n unitLocationOptions?: DropdownOptionDTO[] | undefined;\r\n airflowArrangementOptions?: DropdownOptionDTO[] | undefined;\r\n airTunnelOrientationOptions?: DropdownOptionDTO[] | undefined;\r\n returnAirDirectionOptions?: DropdownOptionDTO[] | undefined;\r\n supplyTunnelLocationOptions?: DropdownOptionDTO[] | undefined;\r\n coolingOptions?: DropdownOptionDTO[] | undefined;\r\n heatingOptions?: DropdownOptionDTO[] | undefined;\r\n coolHeatSequenceOptions?: DropdownOptionDTO[] | undefined;\r\n preHeatOptions?: DropdownOptionDTO[] | undefined;\r\n outsideAirPrefilterOptions?: DropdownOptionDTO[] | undefined;\r\n outsideAirHighEfficiencyFilterOptions?: DropdownOptionDTO[] | undefined;\r\n supplyAirFinalFilterOptions?: DropdownOptionDTO[] | undefined;\r\n returnAirFilterOptions?: DropdownOptionDTO[] | undefined;\r\n soundAttenuatorOptions?: DropdownOptionDTO[] | undefined;\r\n humidifierManifoldOptions?: DropdownOptionDTO[] | undefined;\r\n airHandlerOptions?: DropdownOptionDTO[] | undefined;\r\n}\r\n\r\nexport interface DropdownOptionDTO {\r\n numericValue?: number | undefined;\r\n textValue?: string | undefined;\r\n displayValue?: string | undefined;\r\n}\r\n\r\nexport interface ClientError {\r\n fieldName?: string | undefined;\r\n errorMessage?: string | undefined;\r\n suppressErrorInUi?: boolean;\r\n}\r\n\r\nexport interface SupplementalDetailsUIResponse extends StandardResponse4 {\r\n supplementalDetails?: UnitSupplementalDetails | undefined;\r\n dropdownOptions?: SupplementaryDetailsOptionsDTO | undefined;\r\n}\r\n\r\nexport interface UnitSupplementalDetails {\r\n supplementalDetailsDTO?: SupplementalDetailsDTO | undefined;\r\n unitSupplementalDetailsDisplayFields?: UnitSupplementalDetailsDisplayFields | undefined;\r\n}\r\n\r\nexport interface SupplementalDetailsDTO extends StandardClientDTO {\r\n unitPartsWarranty?: number | undefined;\r\n compressorWarranty?: number | undefined;\r\n plateHXWarranty?: number | undefined;\r\n idfWarranty?: number | undefined;\r\n}\r\n\r\nexport interface UnitSupplementalDetailsDisplayFields {\r\n showIDFWarranty?: boolean;\r\n showCompressorWarranty?: boolean;\r\n showPlateHXWarranty?: boolean;\r\n}\r\n\r\nexport interface SupplementaryDetailsOptionsDTO {\r\n unitPartsWarrantyOptions?: DropdownOptionDTO[] | undefined;\r\n compressorWarrantyOptions?: DropdownOptionDTO[] | undefined;\r\n plateHXWarrantyOptions?: DropdownOptionDTO[] | undefined;\r\n idfWarrantyOptions?: DropdownOptionDTO[] | undefined;\r\n}\r\n\r\nexport interface InletOutletUIResponse extends StandardResponse4 {\r\n unitBasicDetails?: UnitBasicDetails | undefined;\r\n dropdownOptions?: InletOutletOptionsDTO | undefined;\r\n validationErrors?: ClientError[] | undefined;\r\n}\r\n\r\nexport interface InletOutletOptionsDTO {\r\n inletOutletTypes?: DropdownOptionDTO[] | undefined;\r\n inletOutletLocations?: DropdownOptionDTO[] | undefined;\r\n outsideAirInletOptions?: DropdownOptionDTO[] | undefined;\r\n outsideAirInletLocationOptions?: DropdownOptionDTO[] | undefined;\r\n supplyAirOutletLocationOptions?: DropdownOptionDTO[] | undefined;\r\n returnAirInletLocationOptions?: DropdownOptionDTO[] | undefined;\r\n exhaustAirOutletOptions?: DropdownOptionDTO[] | undefined;\r\n exhaustAirOutletLocationOptions?: DropdownOptionDTO[] | undefined;\r\n}\r\n\r\nexport interface TempsAndSystemUIResponse extends StandardResponse4 {\r\n unitBasicDetails?: UnitBasicDetails | undefined;\r\n dropdownOptions?: TempsAndSystemOptionsDTO | undefined;\r\n validationErrors?: ClientError[] | undefined;\r\n}\r\n\r\nexport interface TempsAndSystemOptionsDTO {\r\n unitVoltageOptions?: DropdownOptionDTO[] | undefined;\r\n airVolumeControlOptions?: DropdownOptionDTO[] | undefined;\r\n}\r\n\r\nexport interface SchematicResponse extends StandardResponse2 {\r\n schematicSvg?: string | undefined;\r\n}\r\n\r\nexport interface FieldUpdateRequest {\r\n projectId?: number;\r\n unitId?: number;\r\n fieldName?: string | undefined;\r\n newValue?: string | undefined;\r\n}\r\n\r\nexport interface FileResponse {\r\n data: Blob;\r\n status: number;\r\n fileName?: string;\r\n headers?: { [name: string]: any };\r\n}\r\n\r\nexport class SwaggerException extends Error {\r\n message: string;\r\n status: number; \r\n response: string; \r\n headers: { [key: string]: any; };\r\n result: any; \r\n\r\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\r\n super();\r\n\r\n this.message = message;\r\n this.status = status;\r\n this.response = response;\r\n this.headers = headers;\r\n this.result = result;\r\n }\r\n\r\n protected isSwaggerException = true;\r\n\r\n static isSwaggerException(obj: any): obj is SwaggerException {\r\n return obj.isSwaggerException === true;\r\n }\r\n}\r\n\r\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\r\n if(result !== null && result !== undefined)\r\n throw result;\r\n else\r\n throw new SwaggerException(message, status, response, headers, null);\r\n}","import { createStore, combineReducers } from 'redux';\r\nimport { composeWithDevTools } from 'redux-devtools-extension';\r\nimport {\r\n UnitSelectionUI,\r\n ConfigurationInputsUI,\r\n ConnectionsAndOptionsUI,\r\n TempsAndSystemUI,\r\n PerformanceUI,\r\n HeatWheelComponentUI,\r\n PlateHXComponentUI,\r\n IDFComponentUI,\r\n ChilledWaterCoilComponentUI,\r\n HotWaterCoilComponentUI,\r\n ElectricHeaterComponentUI,\r\n DxCoilComponentUI,\r\n HotGasReheatComponentUI,\r\n SteamCoilComponentUI,\r\n FanComponentUI,\r\n FilterComponentUI,\r\n AccessEditingAndDrawingUI,\r\n AccessDoorsUI,\r\n CoilConnectionsUI,\r\n LengthInputsUI,\r\n ElectFurnacePanelsUI\r\n} from '../TypescriptClient';\r\nimport { IAction, IModifyPropertyError, INotification } from '../interfaces/interfaces';\r\nimport {\r\n reduxHeatWheelPanel,\r\n reduxHotWaterCoilPanel,\r\n reduxHotWaterPreheatPanel,\r\n reduxChilledWaterCoilPanel,\r\n reduxSteamCoilPanel,\r\n reduxDXCoilPanel,\r\n reduxHGRHCoilPanel,\r\n reduxIDFPanel,\r\n reduxAccuPanel,\r\n reduxOAFilterPanel,\r\n reduxHEFilterPanel,\r\n reduxSAFilterPanel,\r\n reduxRAFilterPanel,\r\n reduxSupplyFanPanel,\r\n reduxExhaustFanPanel,\r\n reduxOADamperPanel,\r\n reduxEADamperPanel,\r\n reduxRADamperPanel,\r\n reduxSADamperPanel,\r\n reduxOABypassDamperPanel,\r\n reduxEABypassDamperPanel,\r\n reduxRecircDamperPanel\r\n} from './reducers/componentConstruction';\r\nimport { reduxElectricalSupplyFan, reduxElectricalExhaustFan, reduxElectrical } from './reducers/electrical';\r\nimport { reduxControls } from './reducers/controls';\r\nimport {reduxProjectManagement} from './reducers/projectManagement';\r\nimport { reduxUnitCabinet } from './reducers/unitCabinet';\r\nimport { reduxSupplyAttenuator, reduxReturnAttenuator, reduxHumidifierManifold } from './reducers/unitComponents';\r\nimport { getInitialState } from '../redux/localstorage';\r\nimport {reduxOptimizeDesign} from './reducers/optimizeDesign';\r\n\r\n//GLOBAL REDUCER: This is a special reducer that fires on every redux update\r\n//It updates a timestamp to keep track of user session activity.\r\nconst reduxSession = (state = { userActivityTimestamp: Date.now() }, action: IAction) => {\r\n const d = new Date();\r\n return Object.assign({}, state, { userActivityTimestamp: d });\r\n};\r\n\r\nconst reduxAppVersion = (state = { appVersion: '' }, action: IAction) => {\r\n if (action.type === 'UPDATE_APP_VERSION') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxAuth = (state = { userId: '', access_token: '', userRoles:[], state: '', postalCode: ''}, action: IAction) => {\r\n if (action.type === 'UPDATE_AUTH') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxSelectedUnit = (state = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_SELECTED_UNIT') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\n\r\nconst reduxConfigInputs = (state: ConfigurationInputsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_CONFIG_INPUTS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxConnections = (state: ConnectionsAndOptionsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_CONNECTIONS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxTempsAndSystem = (state: TempsAndSystemUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_TEMPS_SYSTEM') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxPerformance = (state: PerformanceUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PERFORMANCE') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxEditDrawing = (state: AccessEditingAndDrawingUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_EDIT_DRAWING') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxAccessDoors = (state: AccessDoorsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_ACCESS_DOORS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nconst reduxCoilConnections = (state: CoilConnectionsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_COIL_CONNECTIONS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nconst reduxElectFurnacePanels = (state: ElectFurnacePanelsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_ELECTRICAL_FURNACE_PANELS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nconst reduxLengthInputs = (state: LengthInputsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_LENGTH_INPUTS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxHeatwheel = (state: HeatWheelComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_HEATWHEEL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxPlateHeatExchanger = (state: PlateHXComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PLATEHEATEXCHANGER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nconst reduxIDF = (state: IDFComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_IDF') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxChilledWaterCoil = (state: ChilledWaterCoilComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_CHILLEDWATER_COIL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxHotWaterCoil = (state: HotWaterCoilComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_HOTWATER_COIL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxPreHeatHotWaterCoil = (state: HotWaterCoilComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PREHEATHOTWATER_COIL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxElectricHeater = (state: ElectricHeaterComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_ELECTRICHEATER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxPreHeatElectHeater = (state: ElectricHeaterComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PREHEAT_ELECTHEATER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxDXCoil = (state: DxCoilComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_DXCOIL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxHotGasReheat = (state: HotGasReheatComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_HOTGAS_REHEAT') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxSteamCoil = (state: SteamCoilComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_STEAMCOIL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxSupplyFan = (state: FanComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_SUPPLYFAN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxExhaustFan = (state: FanComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_EXHAUSTFAN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxOutsidePrefilter = (state: FilterComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_OUTSIDE_PREFILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxOutsideFinalfilter = (state: FilterComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_OUTSIDE_FINALFILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxSupplyAirFilter = (state: FilterComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_SUPPLY_FILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxReturnAirFilter = (state: FilterComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_RETURN_FILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxOutsideAirInlet = (state: any = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_OUTSIDE_INLET') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxSupplyAirOutlet = (state: any = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_SUPPLY_OUTLET') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxReturnAirInlet = (state: any = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_RETURN_INLET') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxExhaustAirOutlet = (state: any = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_EXHAUST_OUTLET') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxMenus = (\r\n state = {\r\n topMenu: { activeItem: 0 },\r\n sizingAccordion: { activeId: 'SAOutlet', drawingView: 'Top' },\r\n showModal: false,\r\n showTopRightDropdown1: false,\r\n showTopRightDropdown2: false,\r\n enableSave: true,\r\n enableUnitIcons:true,\r\n closeSetPointsAccordian: false,\r\n providedAndInstalledByChanged: false,\r\n optimizedDesignInputChanged: false,\r\n showPoolInputs: false\r\n },\r\n action: IAction\r\n) => {\r\n if (action.type === 'UPDATE_MENUS') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxModals = (\r\n state = { showModal: false, modalType: '', modalId: '', modalData: null, hideCancelBtn: false, userResponse: null },\r\n action: IAction\r\n) => {\r\n if (action.type === 'UPDATE_MODALS') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxOutputDocumentsInfo = (\r\n state={projectId: null, pdfRecords:null, activeProcessingRecordsCount: 0, pollForUpdates : false, showDocsReadyNotificationIcon: false, isOutputPage: false},\r\n action: IAction\r\n) => {\r\n if(action.type === 'UPDATE_ACTIVEOUTPUTDOCUMENTS'){\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\nconst defaultErrors: Array = [];\r\n//NOTE on [userEditedFields]: keeps track of fields a user has edited at least once on the current page.\r\n//Its just used to prevent initial field validation errors when you land on a screen the first time.\r\n//This gets reset each time user goes to a new page.\r\nconst defaultStringArray: Array = [];\r\nconst reduxValidation = (\r\n state = { modifyPropertyErrors: defaultErrors, userEditedFields: defaultStringArray },\r\n action: IAction\r\n) => {\r\n if (action.type === 'UPDATE_VALIDATION') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\nconst reduxServerErrors = (\r\n state = { showError: false, errorType: null, errorSource: '', errorMessage: '' },\r\n action: IAction\r\n) => {\r\n if (action.type === 'UPDATE_SERVER_ERROR') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\n//Toast-like notifications that appear at the bottom of the screen\r\n//Types: success, info, warning, error\r\nconst notificationsList: Array = [];\r\nconst reduxNotifications = (state = { notifications: notificationsList }, action: IAction) => {\r\n if (action.type === 'UPDATE_NOTIFICATIONS') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\n//Container for any special items we need to display\r\nconst reduxDisplay = (state = { showLoader: false, unitToDelete:\"\", headerTitleChanged:false}, action: IAction) => {\r\n if (action.type === 'UPDATE_DISPLAY') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\n//Container for errors that prevent a page from being able to load\r\nconst reduxPrerequisiteErrors = (state = { errorList: null }, action: IAction) => {\r\n if (action.type === 'UPDATE_PREREQUISITE_ERRORS') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\n\r\n//Container for pricing at top right of screen\r\nconst reduxPricing = (state = { priceNeedsUpdate: true, runPricing: false }, action: IAction) => {\r\n if (action.type === 'UPDATE_PRICING') {\r\n return Object.assign({}, state, action.newState);\r\n }\r\n return state;\r\n};\r\nconst reduxComponentPerformance = (state: any = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_COMPONENT_PERFORMANCE') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const store = createStore(\r\n combineReducers({\r\n reduxSession: reduxSession,\r\n reduxAppVersion: reduxAppVersion,\r\n reduxAuth: reduxAuth,\r\n reduxSelectedUnit: reduxSelectedUnit,\r\n reduxConfigInputs: reduxConfigInputs,\r\n reduxConnections: reduxConnections,\r\n reduxTempsAndSystem: reduxTempsAndSystem,\r\n reduxPerformance: reduxPerformance,\r\n reduxEditDrawing: reduxEditDrawing,\r\n reduxAccessDoors: reduxAccessDoors,\r\n reduxCoilConnections: reduxCoilConnections,\r\n reduxElectFurnacePanels: reduxElectFurnacePanels,\r\n reduxLengthInputs: reduxLengthInputs,\r\n reduxHeatwheel: reduxHeatwheel,\r\n reduxPlateHeatExchanger:reduxPlateHeatExchanger,\r\n reduxIDF: reduxIDF,\r\n reduxChilledWaterCoil: reduxChilledWaterCoil,\r\n reduxHotWaterCoil: reduxHotWaterCoil,\r\n reduxPreHeatHotWaterCoil: reduxPreHeatHotWaterCoil,\r\n reduxElectricHeater: reduxElectricHeater,\r\n reduxPreHeatElectHeater: reduxPreHeatElectHeater,\r\n reduxDXCoil: reduxDXCoil,\r\n reduxHotGasReheat: reduxHotGasReheat,\r\n reduxSteamCoil: reduxSteamCoil,\r\n reduxSupplyFan: reduxSupplyFan,\r\n reduxExhaustFan: reduxExhaustFan,\r\n reduxOutsidePrefilter: reduxOutsidePrefilter,\r\n reduxOutsideFinalfilter: reduxOutsideFinalfilter,\r\n reduxSupplyAirFilter: reduxSupplyAirFilter,\r\n reduxReturnAirFilter: reduxReturnAirFilter,\r\n reduxOutsideAirInlet: reduxOutsideAirInlet,\r\n reduxSupplyAirOutlet: reduxSupplyAirOutlet,\r\n reduxReturnAirInlet: reduxReturnAirInlet,\r\n reduxExhaustAirOutlet: reduxExhaustAirOutlet,\r\n reduxMenus: reduxMenus,\r\n reduxModals: reduxModals,\r\n reduxValidation: reduxValidation,\r\n reduxServerErrors: reduxServerErrors,\r\n reduxNotifications: reduxNotifications,\r\n reduxDisplay: reduxDisplay,\r\n reduxPrerequisiteErrors: reduxPrerequisiteErrors,\r\n reduxHeatWheelPanel: reduxHeatWheelPanel,\r\n reduxHotWaterCoilPanel: reduxHotWaterCoilPanel,\r\n reduxHotWaterPreheatPanel: reduxHotWaterPreheatPanel,\r\n reduxChilledWaterCoilPanel: reduxChilledWaterCoilPanel,\r\n reduxSteamCoilPanel: reduxSteamCoilPanel,\r\n reduxDXCoilPanel: reduxDXCoilPanel,\r\n reduxHGRHCoilPanel: reduxHGRHCoilPanel,\r\n reduxIDFPanel: reduxIDFPanel,\r\n reduxAccuPanel: reduxAccuPanel,\r\n reduxOAFilterPanel: reduxOAFilterPanel,\r\n reduxHEFilterPanel: reduxHEFilterPanel,\r\n reduxSAFilterPanel: reduxSAFilterPanel,\r\n reduxRAFilterPanel: reduxRAFilterPanel,\r\n reduxSupplyFanPanel: reduxSupplyFanPanel,\r\n reduxExhaustFanPanel: reduxExhaustFanPanel,\r\n reduxOADamperPanel: reduxOADamperPanel,\r\n reduxEADamperPanel: reduxEADamperPanel,\r\n reduxRADamperPanel: reduxRADamperPanel,\r\n reduxSADamperPanel: reduxSADamperPanel,\r\n reduxOABypassDamperPanel: reduxOABypassDamperPanel,\r\n reduxEABypassDamperPanel: reduxEABypassDamperPanel,\r\n reduxRecircDamperPanel: reduxRecircDamperPanel,\r\n reduxElectricalSupplyFan: reduxElectricalSupplyFan,\r\n reduxElectricalExhaustFan: reduxElectricalExhaustFan,\r\n reduxElectrical: reduxElectrical,\r\n reduxControls: reduxControls,\r\n reduxUnitCabinet: reduxUnitCabinet,\r\n reduxSupplyAttenuator: reduxSupplyAttenuator,\r\n reduxReturnAttenuator: reduxReturnAttenuator,\r\n reduxHumidifierManifold: reduxHumidifierManifold,\r\n reduxProjectManagement:reduxProjectManagement,\r\n reduxOptimizeDesign: reduxOptimizeDesign,\r\n reduxOutputDocumentsInfo: reduxOutputDocumentsInfo,\r\n reduxPricing: reduxPricing,\r\n reduxComponentPerformance: reduxComponentPerformance\r\n }),\r\n getInitialState(),\r\n composeWithDevTools()\r\n);\r\n","import { IAction } from '../../interfaces/interfaces';\r\nimport {\r\n HeatWheelPanel,\r\n CoilPanelItem,\r\n IndirectFiredFurnacePanel,\r\n AccuPanel,\r\n FilterPanelItem,\r\n FanPanelItem,\r\n DamperPanelItem\r\n} from '../../TypescriptClient';\r\n\r\nexport const reduxHeatWheelPanel = (state: HeatWheelPanel = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_HEATWHEEL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxHotWaterCoilPanel = (state: CoilPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_HOTWATER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxHotWaterPreheatPanel = (state: CoilPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_PREHEAT') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxChilledWaterCoilPanel = (state: CoilPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_CHILLEDWATER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxSteamCoilPanel = (state: CoilPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_STEAM') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxDXCoilPanel = (state: CoilPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_DX') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxHGRHCoilPanel = (state: CoilPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_HGRH') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxIDFPanel = (state: IndirectFiredFurnacePanel = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_IDF') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxAccuPanel = (state: AccuPanel = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_ACCU') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxOAFilterPanel = (state: FilterPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_OAFILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxHEFilterPanel = (state: FilterPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_HEFILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxSAFilterPanel = (state: FilterPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_SAFILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxRAFilterPanel = (state: FilterPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_RAFILTER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxSupplyFanPanel = (state: FanPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_SUPPLYFAN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxExhaustFanPanel = (state: FanPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_EXHASTFAN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxOADamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_OADAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxEADamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_EADAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxRADamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_RADAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxSADamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_SADAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxOABypassDamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_OABYPASSDAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxEABypassDamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_EABYPASSDAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxRecircDamperPanel = (state: DamperPanelItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_PANELS_RECIRCDAMPER') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n","import { IAction } from '../../interfaces/interfaces';\r\nimport { FanVfdItem } from '../../TypescriptClient';\r\n\r\nexport const reduxElectricalSupplyFan = (state: FanVfdItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_ELECTRICAL_SUPPLYFAN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxElectricalExhaustFan = (state: FanVfdItem = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_ELECTRICAL_EXHASTFAN') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\nexport const reduxElectrical = (state: any = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_ELECTRICAL') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n","import { IAction } from '../../interfaces/interfaces';\r\nimport { ControlsUI } from '../../TypescriptClient';\r\n\r\nexport const reduxControls = (state: ControlsUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_CONTROLS') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n","import { IAction } from '../../interfaces/interfaces';\r\nimport { UnitCabinetUI } from '../../TypescriptClient';\r\n\r\nexport const reduxUnitCabinet = (state: UnitCabinetUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_UNITCABINET') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n","import { IAction } from '../../interfaces/interfaces';\r\nimport { SoundAttenuatorComponentUI, HumidifierManifoldComponentUI } from '../../TypescriptClient';\r\n\r\nexport const reduxSupplyAttenuator = (state: SoundAttenuatorComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_SUPPLY_ATTENUATOR') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nexport const reduxReturnAttenuator = (state: SoundAttenuatorComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_RETURN_ATTENUATOR') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n\r\nexport const reduxHumidifierManifold = (state: HumidifierManifoldComponentUI = {}, action: IAction) => {\r\n if (action.type === 'UPDATE_HUMIDIFIER_MANIFOLD') {\r\n return action.newState ? Object.assign({}, state, action.newState) : {};\r\n }\r\n return state;\r\n};\r\n","export function setLocalStorageKey(key: string, data: string) {\r\n localStorage.setItem(key, data);\r\n}\r\nexport function clearLocalStorageKey(key: string) {\r\n localStorage.removeItem(key);\r\n}\r\n//Get any keys we've saved in localStorage and use them to set default state values for\r\n//the matching objects in redux.\r\nexport function getInitialState() {\r\n let reduxInitialState = {};\r\n\r\n //TODO: Later we can expand this if we want to store multiple things in localStorage.\r\n //Right now, we're only storing the auth token for reduxAuth.\r\n\r\n //TODO: Probably remove this. IdentityService is now handling auth.\r\n //We won't be putting tokens in reduxAuth anymore.\r\n const savedState = localStorage.getItem('reduxAuth');\r\n if (savedState) {\r\n reduxInitialState = { reduxAuth: { token: JSON.parse(savedState) } };\r\n }\r\n\r\n return reduxInitialState;\r\n}\r\n","import { store } from \"../redux/store\";\r\nimport { updateReduxAction } from \"../redux/actions\";\r\nimport { AirInletOrOutletType } from \"../TypescriptClient\";\r\n\r\nexport function isEmptyObject(obj: any) {\r\n if (typeof obj === \"undefined\" || obj === null) {\r\n return true; //object does not exist\r\n }\r\n if (Object.keys(obj).length === 0 && obj.constructor === Object) {\r\n return true; //object exists but is empty\r\n }\r\n return false;\r\n}\r\n\r\nexport function isEmptyArray(arr: any) {\r\n if (typeof arr === \"undefined\" || arr === null) {\r\n return true;\r\n }\r\n if (arr.length === null || !(arr.length > 0)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function isNullOrEmpty(item: any) {\r\n if (typeof item === \"undefined\" || item === null || item === \"\") {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n//Format with commas and specified number of decimal places\r\nexport function formatNumber(value: number, decimalPlaces: number) {\r\n if (value) {\r\n const formatted = value.toLocaleString(\"en-US\", {\r\n maximumFractionDigits: decimalPlaces,\r\n minimumFractionDigits: decimalPlaces\r\n });\r\n return formatted.toString();\r\n }\r\n return value;\r\n}\r\n\r\nexport function isOddNumber(num: number) {\r\n return num % 2 === 1;\r\n}\r\n\r\n//TODO: take a closer look at the generated typescript objects.\r\n//Why do most of the generated classes include \" | undefined\"?\r\n//That kind of defeats the purpose of strong-types, makes it difficult to access properties\r\n//and requires this function just to get a boolean value.\r\nexport function getBooleanValue(property: any) {\r\n if (property.value && property.value === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function resetReduxModals() {\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: false,\r\n modalType: \"\",\r\n modalId: \"\",\r\n modalData: null,\r\n userResponse: null,\r\n hideCancelBtn: false\r\n })\r\n );\r\n}\r\n\r\nexport function getConnectionTypeName(connectionType?: AirInletOrOutletType) {\r\n switch (connectionType) {\r\n case AirInletOrOutletType.Duct:\r\n return \"Duct\";\r\n case AirInletOrOutletType.Hood:\r\n return \"Hood\";\r\n case AirInletOrOutletType.Louver:\r\n return \"Louver\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\nexport function sqlToJsDate(sqlDate: any) {\r\n if (sqlDate) {\r\n //convert to javascript date\r\n let dt = new Date(sqlDate);\r\n\r\n return `${dt.getMonth() + 1}/${dt.getDate()}/${dt.getFullYear()}`;\r\n } else {\r\n return \"\";\r\n }\r\n}\r\n\r\nexport function sqlToJsDateTime(sqlDate: any) {\r\n if (sqlDate) {\r\n //convert to javascript date and time\r\n let dt = new Date(sqlDate);\r\n\r\n let hours = dt.getHours();\r\n let minutes = dt.getMinutes();\r\n let ampm = hours >= 12 ? \"pm\" : \"am\";\r\n hours = hours % 12;\r\n hours = hours ? hours : 12; // the hour '0' should be '12'\r\n let minutesStr = minutes < 10 ? \"0\" + minutes : minutes;\r\n let strTime = hours + \":\" + minutesStr + \" \" + ampm;\r\n\r\n return `${dt.getMonth() + 1}/${dt.getDate()}/${dt.getFullYear()} \\xa0\\xa0 ${strTime}`; //NOTE: \\xa0 is a 'space'\r\n } else {\r\n return \"\";\r\n }\r\n}\r\n","import { DesignPerformanceResult, EffectivenessValues } from '../TypescriptClient';\r\n\r\n//Get the numeric part of a project or unit id.\r\nexport function getNumericId(value: string){\r\n //Example: \"proj-354\" ==> 354\r\n //Example: \"unit-302\" ==> 302\r\n let str = value.split('-').pop(); //split returns an array. pop returns the last element.\r\n return Number(str); //convert to number\r\n}\r\n\r\n//Get the string version of a project or unit id.\r\nexport function getStringId(itemType: string, id: number){\r\n //Example: 354 ==> \"proj-354\"\r\n //Example: 302 ==> \"unit-302\"\r\n if(itemType == \"project\"){\r\n return `proj-${id}`;\r\n }\r\n if(itemType == \"unit\"){\r\n return `unit-${id}`;\r\n }\r\n}\r\n\r\n\r\n\r\n//Function to remove commas from a string\r\nexport function removeCommas(value: string) {\r\n return value.replace(/,/g, '');\r\n}\r\n\r\n//Format with commas and specified number of decimal places\r\nexport function roundNumber(value: number) {\r\n if (value) {\r\n const formatted = Math.round(value);\r\n return formatted.toString();\r\n }\r\n return value;\r\n}\r\n\r\n//Format with commas and specified number of decimal places\r\nexport function formatNumber(value: any, decimalPlaces: number) { \r\n\r\n //for some reason zero returns empty string. so we have to manually deal with zero here.\r\n if(value === 0 && decimalPlaces == 0){return \"0\";}\r\n if(value === 0 && decimalPlaces == 1){return \"0.0\";}\r\n if(value === 0 && decimalPlaces == 2){return \"0.00\";}\r\n \r\n if (value) {\r\n const formatted = value.toLocaleString('en-US', {\r\n maximumFractionDigits: decimalPlaces,\r\n minimumFractionDigits: decimalPlaces\r\n });\r\n return formatted.toString();\r\n }\r\n return \"\"; //If value was null or undefined, return empty string\r\n}\r\n\r\nexport function RoundToNearest(value: number, increment: number) {\r\n return formatNumber(Math.round((value / increment)) * increment, 0);\r\n}\r\nexport function RoundUpToNearest(value: number, increment: number){\r\n //LOWRY-16913: Round up when the decimal is at or above 0.1 and round down when below\r\n let decimalPart = value % 1;\r\n if (Math.abs(decimalPart) > .1){\r\n return formatNumber(Math.ceil((value/increment)) * increment, 0)\r\n }\r\n else {\r\n return RoundToNearest(value, 1);\r\n }\r\n}\r\n//Formatting function for most of the common textbox inputs in the app that have a \"value\" property.\r\n//Loop through each of the properties on the dataObject coming back from the server.\r\n//If property is listed in the formatObject, then call formatNumber() to format it properly.\r\nexport function formatData(dataObject: any, formatObject: any) {\r\n //Loop through each property on dataObject\r\n Object.keys(dataObject).forEach(function (key) {\r\n //If the propertyName exists in formatObject\r\n if (key in formatObject) {\r\n //If propertyName isn't null and has a \"value\" property\r\n if (dataObject[key] && dataObject[key].value) {\r\n //Get the properly formatted string with commas & correct decimal places\r\n const formattedValue = formatNumber(dataObject[key].value, formatObject[key].decimalPlaces);\r\n //Update the property on dataObject\r\n dataObject[key] = Object.assign({}, dataObject[key], { value: formattedValue });\r\n }\r\n }\r\n });\r\n return dataObject;\r\n}\r\n\r\nexport const ConfigInputFormats = {\r\n outsideAirAltitudeOnlyAcfm: { decimalPlaces: 0 },\r\n supplyAirAltitudeOnlyAcfm: { decimalPlaces: 0 },\r\n returnAirAltitudeOnlyAcfm: { decimalPlaces: 0 },\r\n exhaustAirAltitudeOnlyAcfm: { decimalPlaces: 0 }\r\n};\r\n\r\nexport const TempsSystemFormats = {\r\n elevation: { decimalPlaces: 0 },\r\n outsideSummerDryBulb: { decimalPlaces: 1 },\r\n outsideSummerWetBulb: { decimalPlaces: 1 },\r\n outsideWinterDryBulb: { decimalPlaces: 1 },\r\n supplyESP: { decimalPlaces: 2 },\r\n returnESP: { decimalPlaces: 2 },\r\n returnSummerDryBulb: { decimalPlaces: 1 },\r\n returnSummerRelativeHumidity: { decimalPlaces: 0 },\r\n returnWinterDryBulb: { decimalPlaces: 1 },\r\n returnWinterRelativeHumidity: { decimalPlaces: 0 },\r\n coolingOffCoilDryBulb: { decimalPlaces: 1 },\r\n preheatDryBulb: {decimalPlaces: 1},\r\n heatingTemp: { decimalPlaces: 1 },\r\n reheatTemp: { decimalPlaces: 1 }\r\n};\r\n\r\nexport const CommonFormats = {\r\n enteringAirTemp: { decimalPlaces: 1 },\r\n leavingAirTemp: { decimalPlaces: 1 },\r\n rows: { decimalPlaces: 0 },\r\n finsPerInch: { decimalPlaces: 0 },\r\n enteringAirDryBulb: { decimalPlaces: 1 },\r\n enteringAirWetBulb: { decimalPlaces: 1 },\r\n leavingAirDryBulb: { decimalPlaces: 1 },\r\n leavingAirWetBulb: { decimalPlaces: 1 }\r\n};\r\n\r\n// --------------------- Formatting for HeatWheel ---------------------\r\nfunction formatEffectiveness(val: number) {\r\n return formatNumber(val * 100, HeatWheelFormats.effectiveness.decimalPlaces) + '%';\r\n}\r\nfunction formatEffectivenessValues(vals: EffectivenessValues) {\r\n return {\r\n sensibleEffectiveness: formatEffectiveness(vals.sensibleEffectiveness!),\r\n latentEffectiveness: formatEffectiveness(vals.latentEffectiveness!),\r\n totalEffectiveness: formatEffectiveness(vals.totalEffectiveness!)\r\n };\r\n}\r\nexport function formatPlateHeatExchangerData(plateHXData:any){\r\n if (plateHXData){\r\n for (const item of plateHXData.plateHXChoices) {\r\n item.sensibleEfficiency =\r\n formatNumber(item.sensibleEfficiency * 100, PlateHXFormats.sensibleEfficiency.decimalPlaces) + '%';\r\n item.airPressureDrop = formatNumber(item.airPressureDrop, PlateHXFormats.pressureDrop.decimalPlaces) + '\"';\r\n item.summerDesignLat =\r\n formatNumber(item.summerDesignLat, PlateHXFormats.airTemperature.decimalPlaces) + 'F';\r\n item.winterDesignLat =\r\n formatNumber(item.winterDesignLat, PlateHXFormats.airTemperature.decimalPlaces) + 'F';\r\n }\r\n plateHXData.supplyAirAltitudeOnlyAcfm = formatNumber(plateHXData.supplyAirAltitudeOnlyAcfm,0);\r\n plateHXData.returnAirAltitudeOnlyAcfm = formatNumber(plateHXData.returnAirAltitudeOnlyAcfm,0);\r\n plateHXData.summerTempEfficiency = formatNumber(plateHXData.summerTempEfficiency * 100, 0) + '%';\r\n plateHXData.winterTempEfficiency = formatNumber(plateHXData.winterTempEfficiency * 100, 0) + '%';\r\n }\r\n return plateHXData;\r\n}\r\nexport const PlateHXFormats = {\r\n sensibleEfficiency: { decimalPlaces: 0 },\r\n pressureDrop: { decimalPlaces: 2 },\r\n airTemperature: { decimalPlaces: 1 },\r\n};\r\nexport function formatHeatWheelData(heatWheelData: any) {\r\n if (heatWheelData) {\r\n for (const item of heatWheelData.heatWheelChoices) {\r\n item.totalEffectiveness =\r\n formatNumber(item.totalEffectiveness * 100, HeatWheelFormats.totalEffectiveness.decimalPlaces) + '%';\r\n item.pressureDrop = formatNumber(item.pressureDrop, HeatWheelFormats.pressureDrop.decimalPlaces) + '\"';\r\n item.summerLeavingAirTemperature =\r\n formatNumber(item.summerLeavingAirTemperature, HeatWheelFormats.airTemperature.decimalPlaces) + 'F';\r\n item.winterLeavingAirTemperature =\r\n formatNumber(item.winterLeavingAirTemperature, HeatWheelFormats.airTemperature.decimalPlaces) + 'F';\r\n }\r\n heatWheelData.summerEffectivenessValues = formatEffectivenessValues(heatWheelData.summerEffectivenessValues);\r\n heatWheelData.winterEffectivenessValues = formatEffectivenessValues(heatWheelData.winterEffectivenessValues);\r\n }\r\n return heatWheelData;\r\n}\r\nexport const HeatWheelFormats = {\r\n totalEffectiveness: { decimalPlaces: 0 },\r\n pressureDrop: { decimalPlaces: 2 },\r\n relativeCost: { decimalPlaces: 2 },\r\n airTemperature: { decimalPlaces: 1 },\r\n effectiveness: { decimalPlaces: 0 }\r\n};\r\n\r\n// --------------------- Formatting for Inlets/Outlets ---------------------\r\nexport function formatInletOutletData(inletOutletData: any) {\r\n if (inletOutletData) {\r\n inletOutletData.airflowCFM = formatNumber(inletOutletData.airflowCFM, InletOutletFormats.airflow.decimalPlaces);\r\n inletOutletData.faceVelocityFpm.value = formatNumber(\r\n inletOutletData.faceVelocityFpm.value,\r\n InletOutletFormats.faceVelocity.decimalPlaces\r\n );\r\n inletOutletData.dimensionA.value = formatNumber(\r\n inletOutletData.dimensionA.value,\r\n InletOutletFormats.dimensions.decimalPlaces\r\n );\r\n inletOutletData.dimensionB.value = formatNumber(\r\n inletOutletData.dimensionB.value,\r\n InletOutletFormats.dimensions.decimalPlaces\r\n );\r\n inletOutletData.dimensionC.value = formatNumber(\r\n inletOutletData.dimensionC.value,\r\n InletOutletFormats.dimensions.decimalPlaces\r\n );\r\n inletOutletData.dimensionD.value = formatNumber(\r\n inletOutletData.dimensionD.value,\r\n InletOutletFormats.dimensions.decimalPlaces\r\n );\r\n }\r\n return inletOutletData;\r\n}\r\nexport const InletOutletFormats = {\r\n airflow: { decimalPlaces: 0 },\r\n dimensions: { decimalPlaces: 0 },\r\n faceVelocity: { decimalPlaces: 0 }\r\n};\r\n\r\n// --------------------- Formatting for Filters ---------------------\r\nexport function formatFilterData(filterData: any) {\r\n if (filterData) {\r\n filterData.faceVelocity = formatNumber(filterData.faceVelocity, FilterFormats.faceVelocity.decimalPlaces);\r\n filterData.pressureDrop = formatNumber(filterData.pressureDrop, FilterFormats.pressureDrop.decimalPlaces);\r\n }\r\n return filterData;\r\n}\r\nexport const FilterFormats = {\r\n faceVelocity: { decimalPlaces: 0 },\r\n pressureDrop: { decimalPlaces: 2 }\r\n};\r\n\r\n// --------------------- Formatting for HotGasReheat Coil ---------------------\r\nexport function formatHGRHCoilData(coilData: any) {\r\n if (coilData) {\r\n coilData.enteringAirTemp = formatNumber(coilData.enteringAirTemp, CommonFormats.enteringAirTemp.decimalPlaces);\r\n coilData.leavingAirTemp = formatNumber(coilData.leavingAirTemp, CommonFormats.leavingAirTemp.decimalPlaces);\r\n coilData.reheatCircuits = formatNumber(coilData.reheatCircuits, HGRHCoilFormats.reheatCircuits.decimalPlaces);\r\n coilData.rows = formatNumber(coilData.rows, CommonFormats.rows.decimalPlaces);\r\n coilData.finsPerInch = formatNumber(coilData.finsPerInch, CommonFormats.finsPerInch.decimalPlaces);\r\n coilData.airPressureDrop = formatNumber(coilData.airPressureDrop, CoilFormats.airPressureDrop.decimalPlaces);\r\n }\r\n return coilData;\r\n}\r\nexport const HGRHCoilFormats = {\r\n reheatCircuits: { decimalPlaces: 0 }\r\n};\r\n\r\n// --------------------- Formatting for Direct Expansion Coil --------------\r\nexport function formatDxCoilData(coilData: any) {\r\n if (coilData) {\r\n coilData.enteringAirDryBulb = formatNumber(\r\n coilData.enteringAirDryBulb,\r\n CommonFormats.enteringAirDryBulb.decimalPlaces\r\n );\r\n coilData.enteringAirWetBulb = formatNumber(\r\n coilData.enteringAirWetBulb,\r\n CommonFormats.enteringAirWetBulb.decimalPlaces\r\n );\r\n coilData.leavingAirDryBulb = formatNumber(\r\n coilData.leavingAirDryBulb,\r\n CommonFormats.leavingAirDryBulb.decimalPlaces\r\n );\r\n coilData.leavingAirWetBulb = formatNumber(\r\n coilData.leavingAirWetBulb,\r\n CommonFormats.leavingAirWetBulb.decimalPlaces\r\n );\r\n coilData.eer = formatNumber(coilData.eer, DxCoilFormats.eer.decimalPlaces);\r\n coilData.condensingCapacity = formatNumber(\r\n coilData.condensingCapacity,\r\n DxCoilFormats.condensingCapacity.decimalPlaces\r\n );\r\n coilData.coolingTons = formatNumber(coilData.coolingTons, DxCoilFormats.coolingTons.decimalPlaces);\r\n coilData.rows = formatNumber(coilData.rows, CommonFormats.rows.decimalPlaces);\r\n coilData.finsPerInch = formatNumber(coilData.finsPerInch, CommonFormats.finsPerInch.decimalPlaces);\r\n\r\n const stmp = formatNumber(coilData.suctionTemperature.value, DxCoilFormats.suctionTemperature.decimalPlaces);\r\n coilData.suctionTemperature = Object.assign({}, coilData.suctionTemperature, { value: stmp });\r\n\r\n const atmp = formatNumber(coilData.ambientTemp.value, DxCoilFormats.ambientTemp.decimalPlaces);\r\n coilData.ambientTemp = Object.assign({}, coilData.ambientTemp, { value: atmp });\r\n\r\n coilData.airPressureDrop = formatNumber(coilData.airPressureDrop, CoilFormats.airPressureDrop.decimalPlaces);\r\n }\r\n return coilData;\r\n}\r\nexport const DxCoilFormats = {\r\n suctionTemperature: { decimalPlaces: 1 },\r\n condensingCapacity: { decimalPlaces: 0 },\r\n ambientTemp: { decimalPlaces: 0 },\r\n eer: { decimalPlaces: 1 },\r\n coolingTons: { decimalPlaces: 1 }\r\n};\r\n\r\n// --------------------- Formatting for Electric Heaters ---------------------\r\nexport function formatElectHeaterData(heaterData: any) {\r\n if (heaterData) {\r\n heaterData.enteringAirDryBulb = formatNumber(\r\n heaterData.enteringAirDryBulb,\r\n CommonFormats.enteringAirDryBulb.decimalPlaces\r\n );\r\n heaterData.leavingAirTemp = formatNumber(heaterData.leavingAirTemp, CommonFormats.leavingAirTemp.decimalPlaces);\r\n heaterData.voltage = formatNumber(heaterData.voltage, ElectHeaterFormats.voltage.decimalPlaces);\r\n heaterData.powerKw = formatNumber(heaterData.powerKw, ElectHeaterFormats.powerKw.decimalPlaces);\r\n heaterData.amps = formatNumber(heaterData.amps, ElectHeaterFormats.amps.decimalPlaces);\r\n }\r\n return heaterData;\r\n}\r\nexport const ElectHeaterFormats = {\r\n voltage: { decimalPlaces: 0 },\r\n powerKw: { decimalPlaces: 1 },\r\n amps: { decimalPlaces: 1 }\r\n};\r\n\r\n// --------------------- Formatting for Indirect Fired Furnace ---------------------\r\nexport function formatIDFData(furnaceData: any) {\r\n if (furnaceData) {\r\n furnaceData.enteringAirTemperature = formatNumber(\r\n furnaceData.enteringAirTemperature,\r\n FurnaceFormats.enteringAirTemperature.decimalPlaces\r\n );\r\n furnaceData.leavingAirTemperature = formatNumber(\r\n furnaceData.leavingAirTemperature,\r\n FurnaceFormats.leavingAirTemperature.decimalPlaces\r\n );\r\n furnaceData.outputMbh = formatNumber(furnaceData.outputMbh, FurnaceFormats.outputMbh.decimalPlaces);\r\n }\r\n return furnaceData;\r\n}\r\nexport const FurnaceFormats = {\r\n enteringAirTemperature: { decimalPlaces: 1 },\r\n leavingAirTemperature: { decimalPlaces: 1 },\r\n outputMbh: { decimalPlaces: 0 }\r\n};\r\n\r\n// --------------------- Formatting for Hot/Cold Water Coils ---------------------\r\nexport function formatCoilData(coilData: any) {\r\n if (coilData) {\r\n coilData.enteringAirDryBulb = formatNumber(\r\n coilData.enteringAirDryBulb,\r\n CommonFormats.enteringAirDryBulb.decimalPlaces\r\n );\r\n if (coilData.enteringAirWetBulb) {\r\n coilData.enteringAirWetBulb = formatNumber(\r\n coilData.enteringAirWetBulb,\r\n CommonFormats.enteringAirWetBulb.decimalPlaces\r\n );\r\n }\r\n coilData.waterPressureDrop = formatNumber(coilData.waterPressureDrop, CoilFormats.waterPressureDrop.decimalPlaces);\r\n if (coilData.maxWaterPressureDrop) {\r\n coilData.maxWaterPressureDrop.value = formatNumber(\r\n coilData.maxWaterPressureDrop.value,\r\n CoilFormats.maxWaterPressureDrop.decimalPlaces\r\n );\r\n }\r\n coilData.leavingAirDryBulb = formatNumber(\r\n coilData.leavingAirDryBulb,\r\n CommonFormats.leavingAirDryBulb.decimalPlaces\r\n );\r\n if (coilData.leavingAirWetBulb) {\r\n coilData.leavingAirWetBulb = formatNumber(\r\n coilData.leavingAirWetBulb,\r\n CommonFormats.leavingAirWetBulb.decimalPlaces\r\n );\r\n }\r\n coilData.rows = formatNumber(coilData.rows, CommonFormats.rows.decimalPlaces);\r\n coilData.finsPerInch = formatNumber(coilData.finsPerInch, CommonFormats.finsPerInch.decimalPlaces);\r\n\r\n const eft = formatNumber(\r\n coilData.enteringFluidTemperature.value,\r\n CoilFormats.enteringFluidTemperature.decimalPlaces\r\n );\r\n coilData.enteringFluidTemperature = Object.assign({}, coilData.enteringFluidTemperature, { value: eft });\r\n\r\n const lft = formatNumber(coilData.leavingFluidTemperature.value, CoilFormats.leavingFluidTemperature.decimalPlaces);\r\n coilData.leavingFluidTemperature = Object.assign({}, coilData.leavingFluidTemperature, { value: lft });\r\n\r\n const gpct = formatNumber(coilData.glycolPercent.value, CoilFormats.glycolPercent.decimalPlaces);\r\n coilData.glycolPercent = Object.assign({}, coilData.glycolPercent, { value: gpct });\r\n\r\n coilData.airPressureDrop = formatNumber(coilData.airPressureDrop, CoilFormats.airPressureDrop.decimalPlaces);\r\n\r\n if (coilData.fluidFlowRateGPM) {\r\n coilData.fluidFlowRateGPM = formatNumber(coilData.fluidFlowRateGPM, CoilFormats.fluidFlowRateGPM.decimalPlaces);\r\n }\r\n }\r\n return coilData;\r\n}\r\nexport const CoilFormats = {\r\n waterPressureDrop: { decimalPlaces: 1 },\r\n maxWaterPressureDrop: { decimalPlaces: 1 },\r\n enteringFluidTemperature: { decimalPlaces: 1 },\r\n leavingFluidTemperature: { decimalPlaces: 1 },\r\n glycolPercent: { decimalPlaces: 0 },\r\n airPressureDrop: { decimalPlaces: 2 },\r\n fluidFlowRateGPM: { decimalPlaces: 1 }\r\n};\r\n\r\n// --------------------- Formatting for Steam Coil ---------------------\r\nexport function formatSteamCoilData(coilData: any) {\r\n if (coilData) {\r\n coilData.enteringAirTemp = formatNumber(coilData.enteringAirTemp, CommonFormats.enteringAirTemp.decimalPlaces);\r\n coilData.leavingAirTemp = formatNumber(coilData.leavingAirTemp, CommonFormats.leavingAirTemp.decimalPlaces);\r\n coilData.steamLoading = formatNumber(coilData.steamLoading, SteamCoilFormats.steamLoading.decimalPlaces);\r\n coilData.rows = formatNumber(coilData.rows, CommonFormats.rows.decimalPlaces);\r\n coilData.finsPerInch = formatNumber(coilData.finsPerInch, CommonFormats.finsPerInch.decimalPlaces);\r\n\r\n const sp = formatNumber(coilData.steamPressure.value, SteamCoilFormats.steamPressure.decimalPlaces);\r\n coilData.steamPressure = Object.assign({}, coilData.steamPressure, { value: sp });\r\n\r\n coilData.airPressureDrop = formatNumber(coilData.airPressureDrop, CoilFormats.airPressureDrop.decimalPlaces);\r\n }\r\n return coilData;\r\n}\r\nexport const SteamCoilFormats = {\r\n steamPressure: { decimalPlaces: 1 },\r\n steamLoading: { decimalPlaces: 1 }\r\n};\r\n\r\n// --------------------- Formatting for Fans ---------------------\r\nexport function formatFanData(fanData: any) {\r\n if (fanData) {\r\n const spo = formatNumber(\r\n fanData.totalStaticPressureOverride.value,\r\n fanFormats.totalStaticPressureOverride.decimalPlaces\r\n );\r\n fanData.totalStaticPressureOverride = Object.assign({}, fanData.totalStaticPressureOverride, { value: spo });\r\n\r\n fanData.airflow = formatNumber(fanData.airflow, fanFormats.airflow.decimalPlaces);\r\n fanData.totalStaticPressure = formatNumber(\r\n fanData.totalStaticPressure,\r\n fanFormats.totalStaticPressure.decimalPlaces\r\n );\r\n\r\n for (const item of fanData.fanChoices) {\r\n item.fanRpm = formatNumber(item.fanRpm, fanFormats.fanRpm.decimalPlaces);\r\n item.motorRpm = formatNumber(item.motorRpm, fanFormats.motorRpm.decimalPlaces);\r\n item.horsePowerDescription = formatNumber(\r\n item.horsePowerDescription,\r\n fanFormats.horsePowerDescription.decimalPlaces\r\n );\r\n item.staticEfficiencyPercent = formatNumber(\r\n item.staticEfficiencyPercent,\r\n fanFormats.staticEfficiencyPercent.decimalPlaces\r\n );\r\n item.arrayLwaOutletDb = formatNumber(item.arrayLwaOutletDb, fanFormats.arrayLwaOutletDb.decimalPlaces);\r\n }\r\n }\r\n return fanData;\r\n}\r\nexport const fanFormats = {\r\n airflow: { decimalPlaces: 0 },\r\n totalStaticPressure: { decimalPlaces: 2 },\r\n totalStaticPressureOverride: { decimalPlaces: 2 },\r\n fanRpm: { decimalPlaces: 0 },\r\n motorRpm: { decimalPlaces: 0 },\r\n horsePowerDescription: { decimalPlaces: 1 },\r\n staticEfficiencyPercent: { decimalPlaces: 1 },\r\n arrayLwaOutletDb: { decimalPlaces: 1 }\r\n};\r\n\r\n// --------------------- Formatting for Performance Page ---------------------\r\nexport function formatPerformanceData(performanceData: any, optimizedDesignPerformance: DesignPerformanceResult) {\r\n if (performanceData) {\r\n const fpmLimit = formatNumber(\r\n performanceData.coilAndFilterFpmLimit.value,\r\n PerformanceFormats.coilAndFilterFpmLimit.decimalPlaces\r\n );\r\n performanceData.coilAndFilterFpmLimit = Object.assign({}, performanceData.coilAndFilterFpmLimit, {\r\n value: fpmLimit\r\n });\r\n\r\n const hwLimit = formatNumber(\r\n performanceData.casingHeightOrWidthLimit.value,\r\n PerformanceFormats.casingHeightOrWidthLimit.decimalPlaces\r\n );\r\n performanceData.casingHeightOrWidthLimit = Object.assign({}, performanceData.casingHeightOrWidthLimit, {\r\n value: hwLimit\r\n });\r\n //----- optimizedDesignPerformanceResult -----\r\n const optCasHeight = formatNumber(\r\n optimizedDesignPerformance.casingHeight!,\r\n PerformanceFormats.casingHeight.decimalPlaces\r\n );\r\n const optCasWidth = formatNumber(\r\n optimizedDesignPerformance.casingWidth!,\r\n PerformanceFormats.casingWidth.decimalPlaces\r\n );\r\n const optCasWeight = formatNumber(\r\n optimizedDesignPerformance.approxWeight!,\r\n PerformanceFormats.approxWeight.decimalPlaces\r\n );\r\n const optPrice = formatNumber(\r\n optimizedDesignPerformance.budgetPrice!,\r\n PerformanceFormats.budgetPrice.decimalPlaces\r\n );\r\n const formattedOptimizedDesignPerformance = {\r\n casingHeight: optCasHeight,\r\n casingWidth: optCasWidth,\r\n approxWeight: optCasWeight,\r\n budgetPrice: '$' + optPrice\r\n };\r\n performanceData.optimizedDesignPerformanceResult = Object.assign(\r\n {},\r\n optimizedDesignPerformance,\r\n formattedOptimizedDesignPerformance\r\n );\r\n\r\n //----- designPerformanceResult -----\r\n const custCasHeight = formatNumber(\r\n performanceData.designPerformanceResult.casingHeight,\r\n PerformanceFormats.casingHeight.decimalPlaces\r\n );\r\n performanceData.designPerformanceResult = Object.assign({}, performanceData.designPerformanceResult, {\r\n casingHeight: custCasHeight\r\n });\r\n\r\n const custCasWidth = formatNumber(\r\n performanceData.designPerformanceResult.casingWidth,\r\n PerformanceFormats.casingWidth.decimalPlaces\r\n );\r\n performanceData.designPerformanceResult = Object.assign({}, performanceData.designPerformanceResult, {\r\n casingWidth: custCasWidth\r\n });\r\n\r\n const custCasWeight = formatNumber(\r\n performanceData.designPerformanceResult.approxWeight,\r\n PerformanceFormats.approxWeight.decimalPlaces\r\n );\r\n performanceData.designPerformanceResult = Object.assign({}, performanceData.designPerformanceResult, {\r\n approxWeight: custCasWeight\r\n });\r\n\r\n const custPrice = formatNumber(\r\n performanceData.designPerformanceResult.budgetPrice,\r\n PerformanceFormats.budgetPrice.decimalPlaces\r\n );\r\n performanceData.designPerformanceResult = Object.assign({}, performanceData.designPerformanceResult, {\r\n budgetPrice: '$' + custPrice\r\n });\r\n }\r\n return performanceData;\r\n}\r\nexport const PerformanceFormats = {\r\n coilAndFilterFpmLimit: { decimalPlaces: 0 },\r\n casingHeightOrWidthLimit: { decimalPlaces: 0 },\r\n casingHeight: { decimalPlaces: 0 },\r\n casingWidth: { decimalPlaces: 0 },\r\n approxWeight: { decimalPlaces: 0 },\r\n budgetPrice: { decimalPlaces: 0 }\r\n};\r\n\r\n// --------------------- Formatting for Sound Attenuators ---------------------\r\nexport function formatAttenuatorData(attenuatorData: any) {\r\n if (attenuatorData) {\r\n attenuatorData.faceVelocity = formatNumber(\r\n attenuatorData.faceVelocity,\r\n AttenuatorFormats.faceVelocity.decimalPlaces\r\n );\r\n }\r\n return attenuatorData;\r\n}\r\nexport const AttenuatorFormats = {\r\n faceVelocity: { decimalPlaces: 0 }\r\n};\r\n\r\n// --------------------- Formatting for Humidifier Manifold ---------------------\r\nexport function formatHumidifierData(humidifierData: any) {\r\n if (humidifierData) {\r\n humidifierData.airTemp = formatNumber(humidifierData.airTemp, HumidifierFormats.airTemp.decimalPlaces);\r\n humidifierData.enteringRH = formatNumber(humidifierData.enteringRH, HumidifierFormats.enteringRH.decimalPlaces);\r\n humidifierData.desiredLeavingRH.value = formatNumber(\r\n humidifierData.desiredLeavingRH.value,\r\n HumidifierFormats.desiredLeavingRH.decimalPlaces\r\n );\r\n humidifierData.steamPressure.value = formatNumber(\r\n humidifierData.steamPressure.value,\r\n HumidifierFormats.steamPressure.decimalPlaces\r\n );\r\n humidifierData.steamCapacity = formatNumber(\r\n humidifierData.steamCapacity,\r\n HumidifierFormats.steamCapacity.decimalPlaces\r\n );\r\n }\r\n return humidifierData;\r\n}\r\nexport const HumidifierFormats = {\r\n airTemp: { decimalPlaces: 1 },\r\n enteringRH: { decimalPlaces: 1 },\r\n desiredLeavingRH: { decimalPlaces: 0 },\r\n steamPressure: { decimalPlaces: 0 },\r\n steamCapacity: { decimalPlaces: 1 }\r\n}\r\n\r\n//------------------------Formatting for Unit Price Summary Objects----------------------\r\nexport function formatProjectInfo(projectInfo : any){\r\n if(projectInfo){\r\n projectInfo.createdByFirstName = titleCase(projectInfo.createdByFirstName);\r\n projectInfo.createdByLastName = titleCase(projectInfo.createdByLastName);\r\n projectInfo.officeName = titleCase(projectInfo.officeName);\r\n }\r\n return projectInfo;\r\n}\r\nexport function formatUnitListPriceInfo(unitListPriceInfo : any){\r\n if(unitListPriceInfo){\r\n if(unitListPriceInfo.unitTag === null || unitListPriceInfo.unitTag === \"\"){\r\n unitListPriceInfo.unitTag = \"No tag added to this unit\";\r\n }\r\n if(unitListPriceInfo.listPrice !== null && unitListPriceInfo.listPrice > 0){\r\n unitListPriceInfo.listPrice = \"$\" + formatNumber(unitListPriceInfo.listPrice, 0).toString()\r\n }\r\n if(unitListPriceInfo.totalListPrice !== null && unitListPriceInfo.totalListPrice > 0){\r\n unitListPriceInfo.totalListPrice = \"$\" +formatNumber(unitListPriceInfo.totalListPrice, 0).toString()\r\n }\r\n if(unitListPriceInfo.netPrice !== null && unitListPriceInfo.netPrice > 0){\r\n unitListPriceInfo.netPrice = \"$\" +formatNumber(unitListPriceInfo.netPrice, 0).toString()\r\n }\r\n if(unitListPriceInfo.totalFreightCost !== null && unitListPriceInfo.unitTag !== \"\" && unitListPriceInfo.totalFreightCost > 0){\r\n unitListPriceInfo.totalFreightCost = \"$\" +formatNumber(unitListPriceInfo.totalFreightCost, 2).toString()\r\n }\r\n \r\n }\r\n return unitListPriceInfo;\r\n}\r\nexport function formatTrucksRequired(trucksRequired:any, unitQuantity: any){\r\n let formattedTrucksRequired;\r\n if((unitQuantity ?? 0) > 1){\r\n if(trucksRequired !== null && trucksRequired !== \"\" && trucksRequired !== \"Unshippable\"){\r\n formattedTrucksRequired = unitQuantity.toString() + \" \" + trucksRequired;\r\n return formattedTrucksRequired;\r\n }\r\n }\r\n return trucksRequired;\r\n}\r\nexport function titleCase(str : any) {\r\n if(str){\r\n str.toLowerCase();\r\n var strAr = str.split(\" \");\r\n for(var i=0;i {\r\n public render() {\r\n const data = this.props.notificationData;\r\n const type = this.props.notificationData.notificationType; //success,info,warning,error\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
{data.content}
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default NotificationMessage;\r\n","import * as React from \"react\";\r\nimport { store } from \"../redux/store\";\r\nimport { updateReduxAction } from \"../redux/actions\";\r\nimport { INotification } from \"../interfaces/interfaces\";\r\nimport { isEmptyArray } from \"../utilities/helpers\";\r\nimport NotificationMessage from \"../components/Shared/NotificationMessage\";\r\n\r\nexport function addNotification(notification: INotification) {\r\n const reduxStore = store.getState();\r\n //Get list of existing ids\r\n const idList = reduxStore.reduxNotifications.notifications.map((x) => x.id);\r\n //Add this item to the notifications array if it doesn't already exist\r\n if (!idList.includes(notification.id)) {\r\n //Clone the redux array\r\n const newArray = Array.from(reduxStore.reduxNotifications.notifications);\r\n newArray.push(notification);\r\n store.dispatch(updateReduxAction(\"UPDATE_NOTIFICATIONS\", { notifications: newArray }));\r\n }\r\n}\r\n\r\nexport function removeNotification(id: string) {\r\n const reduxStore = store.getState();\r\n //Clone the redux array\r\n const newArray = Array.from(reduxStore.reduxNotifications.notifications);\r\n //Get items that don't match the given id\r\n const filteredArray = newArray.filter((item) => item.id !== id);\r\n //update redux with filtered list\r\n store.dispatch(updateReduxAction(\"UPDATE_NOTIFICATIONS\", { notifications: filteredArray }));\r\n}\r\n\r\nexport function clearAllPerformanceNotifications() {\r\n removeNotification(\"selectreduxSupplyFanFailure\");\r\n removeNotification(\"selectreduxExhaustFanFailure\");\r\n removeNotification(\"selectHeatWheelFailure\");\r\n removeNotification(\"casingLimitReset\");\r\n}\r\n\r\n//Method to support smaller notification messages in context (like the ones inside accordions)\r\nexport function getErrorNotifications(errorCollection: string[] | undefined) {\r\n if (!isEmptyArray(errorCollection)) {\r\n const content = errorCollection!.map((msg, index) =>
{msg}
);\r\n\r\n const Inotification = {\r\n id: \"\",\r\n notificationType: \"error\",\r\n title: \"\",\r\n content: content\r\n };\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n return null;\r\n}\r\n\r\nexport function accordionHasError(errorCollection: string[] | undefined) {\r\n return isEmptyArray(errorCollection) ? false : true;\r\n}\r\n\r\nexport function formatIndividualErrors(errorList: string[]) {\r\n return errorList.map((msg, index) =>
{msg}
);\r\n}\r\n","import Oidc from 'oidc-client';\r\nimport { store } from '../redux/store';\r\nimport { updateReduxAction } from '../redux/actions';\r\nimport { addNotification } from '../api-utilities/notification-tools';\r\nimport {IUserInfo} from '../interfaces/interfaces';\r\n\r\nexport class IdentityService {\r\n private userMgr: any;\r\n // public user: any;\r\n\r\n public constructor() {\r\n const settings = {\r\n authority: process.env.REACT_APP_IDENTITY_AUTHORITY,\r\n client_id: process.env.REACT_APP_IDENTITY_CLIENTID,\r\n redirect_uri: process.env.REACT_APP_IDENTITY_LOGINREDIRECT,\r\n post_logout_redirect_uri: process.env.REACT_APP_IDENTITY_LOGOUTREDIRECT,\r\n response_type: 'id_token token',\r\n scope: `openid profile ${process.env.REACT_APP_IDENTITY_LOWRYAPISCOPE}`,\r\n revokeAccessTokenOnSignout: true,\r\n automaticSilentRenew: true,\r\n silent_redirect_uri: process.env.REACT_APP_IDENTITY_SILENT,\r\n userStore: new Oidc.WebStorageStateStore({ store: window.localStorage })\r\n };\r\n this.userMgr = new Oidc.UserManager(settings);\r\n let context = this;\r\n\r\n this.userMgr.events.addUserLoaded(() => {\r\n console.log('******** USER LOADED');\r\n });\r\n this.userMgr.events.addUserUnloaded(() => {\r\n console.log('******** USER UNLOADED');\r\n });\r\n //If the browser is still open, the access_token will auto-renew indefinitely through the\r\n //silent-renew process (see silent-refresh.html in the \"public\" folder)\r\n //We don't want that. If there's no user activity, let it expire and log the user out.\r\n //This event should fire every 4 hours (AccessTokenLifetime setting on Identity Server) just\r\n //before the access token expires.\r\n this.userMgr.events.addAccessTokenExpiring(() => {\r\n console.log('******** ACCESS TOKEN EXPIRING');\r\n const timeStamp = store.getState().reduxSession.userActivityTimestamp;\r\n const timeout = Date.now() - context.minutesToMilliseconds(30); //30 minutes ago\r\n\r\n //See if the user is actively using the site. If so, let the accessToken auto-renew.\r\n //If not, let it expire and log them out.\r\n if (timeStamp < timeout) {\r\n console.log('****** USER INACTIVITY TIMEOUT');\r\n context.logout();\r\n }\r\n console.log('TIME NOW: ' + new Date());\r\n });\r\n this.userMgr.events.addAccessTokenExpired(() => {\r\n console.log('******** ACCESS TOKEN EXPIRED');\r\n context.logout();\r\n });\r\n this.userMgr.events.addSilentRenewError((error: any) => {\r\n console.log('******** SILENT RENEW ERROR');\r\n this.handleError(error);\r\n });\r\n //This event notifies us that user is signed out on the provider side\r\n this.userMgr.events.addUserSignedOut(() => {\r\n console.log('******** USER SIGNED OUT');\r\n context.logout();\r\n });\r\n Oidc.Log.logger = console;\r\n }\r\n minutesToMilliseconds(min: number) {\r\n return min * 60000;\r\n }\r\n\r\n public async login() {\r\n this.userMgr.signinRedirect().catch((error: any) => this.handleError(error));\r\n }\r\n public async completeLogin() {\r\n try {\r\n const user = await this.userMgr.signinRedirectCallback();\r\n console.log('LOGIN SUCCESSFUL: ' + new Date());\r\n console.log('Access Token Exp: ' + this.getCurrentTimeFromStamp(user.expires_at).toString());\r\n this.loadUserInfoToRedux(user);\r\n return user;\r\n } catch (err) {\r\n return null;\r\n }\r\n }\r\n\r\n public async loadUserInfoToRedux(user:any){\r\n //Get user roles\r\n let rolesArray = await this.getUserRoles(user);\r\n var obj = JSON.parse(user.profile.profiledata);\r\n let state = obj.State;\r\n let postalCode = obj.PostalCode;\r\n store.dispatch(updateReduxAction('UPDATE_AUTH', {userId:user.profile.sub,\r\n access_token: user.access_token, userRoles:rolesArray, state: state, postalCode: postalCode }));\r\n }\r\n\r\n public async getUser() {\r\n const user = await this.userMgr.getUser();\r\n if (user) {\r\n return user;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n public async getUserRoles(user:any){\r\n let client_id = process.env.REACT_APP_IDENTITY_CLIENTID;\r\n let rolesArray = [];\r\n\r\n if(user && user.profile){\r\n //Get the auto-assigned role from the IdentityService \"UserType\" variable (employee, rep, customer)\r\n if(user.profile.UserType){\r\n rolesArray.push(user.profile.UserType.toLowerCase());\r\n }\r\n\r\n //Get custom roles from the IdentityService profiledata (any new roles we have manually assigned to people)\r\n if(user.profile.profiledata){\r\n let obj = JSON.parse(user.profile.profiledata);\r\n let userRoles = obj.UserRolesArr;\r\n\r\n //Get the roles matching the client_id for this app.\r\n //NOTE: there are different client_ids for dev, qa, stg, etc...\r\n let lowryRoles = userRoles.find((x: any) => x.C === client_id);\r\n if(lowryRoles){\r\n for(const role of lowryRoles.R){\r\n rolesArray.push(role.toLowerCase());\r\n }\r\n }\r\n }\r\n }\r\n return rolesArray; \r\n }\r\n\r\n public async getUserInfo(user:any){\r\n\r\n let userInfo: IUserInfo = {\r\n userId : '',\r\n userType :'',\r\n firstName : '',\r\n lastName : '',\r\n email : '',\r\n officeMembershipsArr : []\r\n };\r\n \r\n\r\n if(user && user.profile){\r\n userInfo.userId = user.profile.sub;\r\n userInfo.firstName = user.profile.FirstName;\r\n userInfo.lastName = user.profile.LastName;\r\n userInfo.email = user.profile.Email;\r\n //Get the auto-assigned role from the IdentityService \"UserType\" variable (employee, rep, customer)\r\n if(user.profile.UserType){\r\n userInfo.userType = user.profile.UserType.toLowerCase();\r\n }\r\n //Get custom officeMemberShipArr from the IdentityService profiledata \r\n if(user.profile.profiledata){\r\n let obj = JSON.parse(user.profile.profiledata);\r\n if(obj.OfficeMembershipsArr != null && obj.OfficeMembershipsArr.length > 0){\r\n userInfo.officeMembershipsArr = obj.OfficeMembershipsArr;\r\n }\r\n }\r\n }\r\n return userInfo; \r\n }\r\n\r\n public async isLoggedIn() {\r\n const user = await this.userMgr.getUser();\r\n if (user) {\r\n return user.access_token && !user.expired;\r\n }\r\n return false;\r\n }\r\n\r\n public async logout() {\r\n await this.userMgr.signoutRedirect().catch((error: any) => this.handleError(error));\r\n await this.userMgr.clearStaleState();\r\n console.log('******** IDENTITY LOGOUT');\r\n store.dispatch(updateReduxAction('UPDATE_AUTH', {userId:'', access_token: '', userRoles:[], state: '', postalCode: ''}));\r\n }\r\n public async completeLogout() {\r\n await this.userMgr.signoutRedirectCallback().catch((error: any) => this.handleError(error));\r\n await this.userMgr.removeUser(); //removes user from localStorage\r\n return null;\r\n }\r\n public async silentRedirectCallback() {\r\n await this.userMgr.signinSilentCallback().catch((error: any) => this.handleError(error));\r\n return null;\r\n }\r\n public async handleError(error: any) {\r\n console.log('Problem with authentication endpoint: ', error);\r\n const notification = {\r\n id: 'authenticationError',\r\n notificationType: 'error',\r\n title: 'Error',\r\n content: error.toString()\r\n };\r\n addNotification(notification);\r\n }\r\n public async querySessionStatus() {\r\n return await this.userMgr.querySessionStatus().catch((error: any) => this.handleError(error));\r\n }\r\n //unix timestamp conversion\r\n public getCurrentTimeFromStamp(timestamp: any) {\r\n let d = new Date(timestamp * 1000);\r\n return d;\r\n }\r\n}\r\n","import { store } from '../redux/store';\r\nimport { updateReduxAction } from '../redux/actions';\r\nimport {\r\n ProjectClient,\r\n TypedRefAtom,\r\n TypedRefPathDto,\r\n DrawingViewType,\r\n PropertyModification,\r\n UIProperty,\r\n DrawingScreen\r\n} from '../TypescriptClient';\r\nimport { clearAllModifyPropertyErrors, updateEditedFields } from './validations';\r\nimport {\r\n distributeComponentsUI,\r\n distributeInletOutlets,\r\n distributeComponentConstructionPanels,\r\n distributeElectrical\r\n} from './accordion-data';\r\nimport { formatData, ConfigInputFormats, TempsSystemFormats, formatPerformanceData } from './formatting';\r\nimport { IdentityService } from '../security/IdentityService';\r\nconst baseUrl = '';\r\n\r\nexport async function getUnitSelection(routeParams: any) {\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n try {\r\n const unitDefinition = await projClient.getUnitSelectionUI(projectId, unitId);\r\n\r\n store.dispatch(updateReduxAction('UPDATE_UNIT_DEFINITION', unitDefinition));\r\n } catch (error) {\r\n displayError(error, 'getUnitSelectionUI');\r\n }\r\n}\r\n\r\n//Purpose: Get ConfigurationInputs object from the API and put into reduxConfigInputs\r\nexport async function getConfigInputs(initialLoad: boolean, routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const configInputs = await projClient.getConfigurationInputsUI(projectId, unitId);\r\n\r\n //If this is the first call (at page load) we need to clear out all the validation messages\r\n //that come back from the server. (Don't want a bunch of red errors appearing right away)\r\n if (initialLoad) {\r\n store.dispatch(updateReduxAction('UPDATE_VALIDATION', { userEditedFields: [] }));\r\n }\r\n\r\n const newState = formatData(configInputs, ConfigInputFormats);\r\n\r\n //1. Update redux with the configInputsUI values that come from the Lowry API endpoint.\r\n store.dispatch(updateReduxAction('UPDATE_CONFIG_INPUTS', newState));\r\n } \r\n catch (error) {\r\n displayError(error, 'getConfigurationInputsUI');\r\n }\r\n}\r\n\r\n//Purpose: Get ConnectionsOptions object from the API and put into reduxConnections\r\nexport async function getConnectionsOptions(initialLoad: boolean, routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const connectInputs = await projClient.getConnectionsAndOptionsUI(projectId, unitId);\r\n\r\n //If this is the first call (at page load) we need to clear out all the validation messages\r\n //that come back from the server. (Don't want a bunch of red errors appearing right away)\r\n if (initialLoad) {\r\n store.dispatch(updateReduxAction('UPDATE_VALIDATION', { userEditedFields: [] }));\r\n }\r\n\r\n store.dispatch(updateReduxAction('UPDATE_CONNECTIONS', connectInputs));\r\n } catch (error) {\r\n displayError(error, 'getConnectionsAndOptionsUI');\r\n }\r\n}\r\n\r\n//Purpose: Get TempsAndSystem object from the API and put into reduxTempsAndSystem\r\nexport async function getTempsAndSystemInputs(initialLoad: boolean, routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const tempAndSystemInputs = await projClient.getTempsAndSystemUI(projectId, unitId);\r\n\r\n //If this is the first call (at page load) we need to clear out all the validation messages\r\n //that come back from the server. (Don't want a bunch of red errors appearing right away)\r\n if (initialLoad) {\r\n store.dispatch(updateReduxAction('UPDATE_VALIDATION', { userEditedFields: [] }));\r\n }\r\n\r\n const newState = formatData(tempAndSystemInputs, TempsSystemFormats);\r\n\r\n store.dispatch(updateReduxAction('UPDATE_TEMPS_SYSTEM', newState));\r\n } catch (error) {\r\n displayError(error, 'getTempsAndSystemUI');\r\n }\r\n}\r\n\r\n//Purpose: Get Performance object from the API and put into reduxPerformance\r\nexport async function getPerformance(initialLoad: boolean, routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n const performanceUIpromise = projClient.getPerformanceUI(projectId, unitId);\r\n const optimizedDesignPerformancePromise = projClient.getOptimizedDesignPerformance(projectId, unitId);\r\n const responses = await Promise.all([performanceUIpromise, optimizedDesignPerformancePromise]);\r\n const performanceScreenResult = responses[0];\r\n const optimizedDesignPerformance = responses[1];\r\n\r\n //If inputs are missing, don't show design performance errors.\r\n if (optimizedDesignPerformance.hasError === true && !performanceScreenResult.propertyErrorsByScreenName){\r\n displayErrorString(optimizedDesignPerformance.errorMessage ?? \"Unknown Error Occured\", \"getOptimizedDesignPerformance\");\r\n }\r\n //If this is the first call (at page load) we need to clear out all the validation messages\r\n //that come back from the server. (Don't want a bunch of red errors appearing right away)\r\n if (initialLoad) {\r\n store.dispatch(updateReduxAction('UPDATE_VALIDATION', { userEditedFields: [] }));\r\n }\r\n\r\n if (performanceScreenResult.propertyErrorsByScreenName) {\r\n store.dispatch(\r\n updateReduxAction('UPDATE_PREREQUISITE_ERRORS', {\r\n errorList: performanceScreenResult.propertyErrorsByScreenName\r\n })\r\n );\r\n } else {\r\n const newState = formatPerformanceData(performanceScreenResult.uiScreen, optimizedDesignPerformance.designPerformanceResult!);\r\n store.dispatch(updateReduxAction('UPDATE_PREREQUISITE_ERRORS', { errorList: null }));\r\n store.dispatch(updateReduxAction('UPDATE_PERFORMANCE', newState));\r\n }\r\n } catch (error) {\r\n displayError(error, 'getPerformanceUI');\r\n } finally {\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n }\r\n}\r\n\r\n//Purpose: Get UnitDefinition object from the API (it contains all the data objects for accordions)\r\nexport async function getAccordions(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const componentsUI = await projClient.getComponentsUI(projectId, unitId);\r\n //ComponentsUI will be null if required inputs are not valid. This call is for the\r\n //optimize design screen and if ComponentsUI is null, the missing field modal will show\r\n // and the screen will be blank.\r\n if (componentsUI !== null){\r\n distributeComponentsUI(componentsUI);\r\n }\r\n \r\n } catch (error) {\r\n displayError(error, 'getComponentsUI');\r\n }\r\n}\r\n\r\n//Purpose: Get Performance object from the API and put into reduxPerformance\r\nexport async function getAccessEditingAndDrawingUI(initialLoad: boolean, routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const drawingInputs = await projClient.getAccessEditingAndDrawingUI(projectId, unitId);\r\n\r\n //If this is the first call (at page load) we need to clear out all the validation messages\r\n //that come back from the server. (Don't want a bunch of red errors appearing right away)\r\n if (initialLoad) {\r\n store.dispatch(updateReduxAction('UPDATE_VALIDATION', { userEditedFields: [] }));\r\n }\r\n\r\n store.dispatch(updateReduxAction('UPDATE_EDIT_DRAWING', drawingInputs));\r\n } catch (error) {\r\n displayError(error, 'getAccessEditingAndDrawingUI');\r\n }\r\n}\r\n\r\nexport async function getAccessDoorsUI(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const accessDoors = await projClient.getAccessDoorsUI(projectId, unitId);\r\n store.dispatch(updateReduxAction('UPDATE_ACCESS_DOORS', accessDoors));\r\n } catch (error) {\r\n displayError(error, 'getAccessEditingAndDrawingUI');\r\n }\r\n}\r\nexport async function getCoilConnectionsUI(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const rslt = await projClient.getCoilConnectionsUI(projectId, unitId);\r\n store.dispatch(updateReduxAction('UPDATE_COIL_CONNECTIONS', rslt));\r\n } catch (error) {\r\n displayError(error, 'getCoilConnectionsUI');\r\n }\r\n}\r\nexport async function getElectFurnacePanelsUI(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const rslt = await projClient.getElectFurnacePanelsUI(projectId, unitId);\r\n store.dispatch(updateReduxAction('UPDATE_ELECTRICAL_FURNACE_PANELS', rslt));\r\n } catch (error) {\r\n displayError(error, 'getElectFurnacePanelsUI');\r\n }\r\n}\r\nexport async function getLengthInputsUI(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const rslt = await projClient.getLengthInputsUI(projectId, unitId);\r\n store.dispatch(updateReduxAction('UPDATE_LENGTH_INPUTS', rslt));\r\n } catch (error) {\r\n displayError(error, 'getLengthInputsUI');\r\n }\r\n}\r\n\r\n//Purpose: Get UnitDrawing from the API\r\nexport async function getUnitDrawing(routeParams: any, viewType: DrawingViewType, uiScreen: DrawingScreen) {\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const apiResponse = await projClient.getUnitDrawingSvg(projectId, unitId, viewType, uiScreen);\r\n return apiResponse;\r\n } catch (error) {\r\n displayError(error, 'getUnitDrawingSvg');\r\n }\r\n return null;\r\n}\r\n\r\nexport async function getInletOutletDrawing(routeParams: any, selectedConnection: string) {\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const apiResponse = await projClient.getInletOutletDrawingSvg(projectId, unitId, selectedConnection);\r\n return apiResponse;\r\n } catch (error) {\r\n displayError(error, 'getInletOutletDrawingSvg');\r\n }\r\n return null;\r\n}\r\n\r\n//Purpose: Get all 4 Inlet/Outlet objects from the API\r\nexport async function getInletsOutlets(initialLoad: boolean, routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const inletsOutlets = await projClient.getInletOutletSizingUI(projectId, unitId);\r\n distributeInletOutlets(inletsOutlets);\r\n } catch (error) {\r\n displayError(error, 'getInletOutletSizingUI');\r\n }\r\n}\r\n\r\n//Purpose: Get data for the component construction screens\r\nexport async function getComponentConstruction(routeParams: any) {\r\n // clearAllModifyPropertyErrors();\r\n // const projClient = await getClientWithAuth();\r\n // const { projectId, unitId } = routeParams;\r\n\r\n // try {\r\n // const data = await projClient.getComponentConstructionUI(projectId, unitId);\r\n // distributeComponentConstructionPanels(data);\r\n // } catch (error) {\r\n // displayError(error, 'getComponentConstructionUI');\r\n // }\r\n}\r\n\r\n//Purpose: Get data for the spec/electrical screens\r\nexport async function getElectrical(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const data = await projClient.getElectricalUI(projectId, unitId);\r\n distributeElectrical(data);\r\n } catch (error) {\r\n displayError(error, 'getElectrical');\r\n }\r\n}\r\n\r\n//Purpose: Get data for the spec/controls screen\r\nexport async function getControls(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const data = await projClient.getControlsUI(projectId, unitId);\r\n store.dispatch(updateReduxAction('UPDATE_CONTROLS', data));\r\n } catch (error) {\r\n displayError(error, 'getControls');\r\n }\r\n}\r\n\r\n//Purpose: Get data for the spec/unit cabinet screen\r\nexport async function getUnitCabinet(routeParams: any) {\r\n clearAllModifyPropertyErrors();\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const data = await projClient.getUnitCabinetUI(projectId, unitId);\r\n store.dispatch(updateReduxAction('UPDATE_UNITCABINET', data));\r\n } catch (error) {\r\n displayError(error, 'getUnitCabinet');\r\n }\r\n}\r\n//Purpose: Delete a project by Id\r\nexport async function deleteProject(projectId: any) {\r\n const projClient = await getClientWithAuth();\r\n\r\n try {\r\n const apiResponse = await projClient.deleteProject(projectId);\r\n store.dispatch(updateReduxAction('UPDATE_ENTITY_TYPES', {}));\r\n return apiResponse.status;\r\n } catch (error) {\r\n displayError(error, 'deleteProject');\r\n }\r\n return 0;\r\n}\r\n\r\n//Purpose: Get ConfigurationInputs object from the API and put into reduxConfigInputs\r\nexport async function runAdjustedPerformance(routeParams: any) {\r\n//Update redux to invalidate the unit price\r\nstore.dispatch(updateReduxAction('UPDATE_PRICING', { priceNeedsUpdate: true }));\r\n\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n const apiResponse = await projClient.runPerformanceCalculations(projectId, unitId);\r\n if (apiResponse.status === 200) {\r\n return 'success';\r\n } else {\r\n displayErrorString(\"Request Failed\", \"RunPerformanceCalculations\");\r\n return 'failed';\r\n }\r\n } catch (error) {\r\n displayError(error, 'runPerformanceCalculations');\r\n return 'failed';\r\n } finally {\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n }\r\n}\r\n\r\n/**\r\n * Makes a resetToOptimized API call which clears almost all the user's performance screen changes\r\n */\r\nexport async function resetToOptimized(routeParams: any) {\r\n//Update redux to invalidate the unit price\r\nstore.dispatch(updateReduxAction('UPDATE_PRICING', { priceNeedsUpdate: true }));\r\n\r\n const projClient = await getClientWithAuth();\r\n const { projectId, unitId } = routeParams;\r\n\r\n try {\r\n const apiResponse = await projClient.resetToOptimized(projectId, unitId);\r\n if (apiResponse.status === 200) {\r\n return 'success';\r\n } else {\r\n displayErrorString(\"Request Failed\", \"resetToOptimized\");\r\n return 'failed';\r\n }\r\n } catch (error) {\r\n displayError(error, 'resetToOptimized');\r\n return 'failed';\r\n }\r\n}\r\n\r\n//Saves newValue for a property to \"save file\". \r\n//Returns configInputsUI\r\nexport async function modifyConfigInputsProperty(\r\n reduxObject: any,\r\n propertyName: string,\r\n newValue: any,\r\n projectId: string,\r\n unitId: number\r\n) {\r\n // const projClient = await getClientWithAuth();\r\n // const propertyMod = createPropertyModification(unitId, newValue, propertyName, reduxObject);\r\n\r\n // if (propertyMod) {\r\n // updateEditedFields(propertyName.toString()); //let redux know the user has edited this field\r\n // try {\r\n // return await projClient.modifyConfigInputs(projectId, propertyMod);\r\n // } \r\n // catch (error) {\r\n // displayError(error, 'modifyConfigInputsProperty');\r\n // return {hasError:true, errorMessage: \"server 500 error\"};\r\n // }\r\n // // catch (error) {\r\n // // if (error.status === 401) {\r\n // // displayError(error, 'modifyConfigInputsProperty');\r\n // // return \"failed\";\r\n // // } else {\r\n // // return \"failed\";\r\n // // }\r\n // // }\r\n // }\r\n}\r\nexport async function UpdateMultipleUnits(projectId:any, unitIds:Array){\r\n const projClient = await getClientWithAuth();\r\n const reduxMenus = store.getState().reduxMenus;\r\n\r\n //Check if another save is already in progress\r\n if(reduxMenus.enableSave == false){\r\n return;\r\n }\r\n\r\n try { \r\n \r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n \r\n //Disable saving while a save is in progress (prevents multiple save calls at the same time)\r\n store.dispatch(updateReduxAction('UPDATE_MENUS', { enableSave: false }));\r\n\r\n let response = await projClient.updateMultipleUnits(projectId, unitIds);\r\n\r\n store.dispatch(updateReduxAction('UPDATE_MENUS', { enableSave: true }));\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n\r\n let hasError = response.hasError ? \"failed\": \"success\";\r\n if (hasError === \"failed\"){\r\n let ErrorObj = {\r\n status: 500,\r\n message: \"UpdateMultipleUnits failed \" + response.errorMessage\r\n }\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n displayError(ErrorObj, \"UpdateMultipleUnits\");\r\n }\r\n return hasError;\r\n } catch (error) {\r\n store.dispatch(updateReduxAction('UPDATE_MENUS', { enableSave: true }));\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n let ErrorObj = {\r\n status: 500,\r\n message: \"UpdateMultipleUnits failed\" \r\n }\r\n displayError(ErrorObj, \"UpdateMultipleUnits\");\r\n return \"failed\";\r\n } \r\n}\r\n\r\n//Update full unit details in the database\r\n//NOTE: this call doesn't return anything.\r\nexport async function saveUnitDesign(projectId:any, unitId:any, showLoader:boolean = false) {\r\n const projClient = await getClientWithAuth();\r\n const reduxMenus = store.getState().reduxMenus;\r\n\r\n //Check if another save is already in progress\r\n if(reduxMenus.enableSave == false){\r\n return;\r\n }\r\n\r\n try { \r\n if (showLoader){\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n }\r\n //Disable saving while a save is in progress (prevents multiple save calls at the same time)\r\n store.dispatch(updateReduxAction('UPDATE_MENUS', { enableSave: false }));\r\n\r\n let response = await projClient.updateUnitDesign(projectId, unitId);\r\n\r\n store.dispatch(updateReduxAction('UPDATE_MENUS', { enableSave: true }));\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n\r\n let hasError = response.hasError ? \"failed\": \"success\";\r\n if (hasError === \"failed\"){\r\n let ErrorObj = {\r\n status: 500,\r\n message: \"updateUnitDesign failed \" + response.errorMessage\r\n }\r\n displayError(ErrorObj, \"UpdateUnitDesign\");\r\n }\r\n return hasError;\r\n } catch (error) {\r\n store.dispatch(updateReduxAction('UPDATE_MENUS', { enableSave: true }));\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n let ErrorObj = {\r\n status: 500,\r\n message: \"updateUnitDesign failed\" \r\n }\r\n displayError(ErrorObj, \"UpdateUnitDesign\");\r\n return \"failed\";\r\n }\r\n}\r\n\r\n//Saves newValue for a property to \"save file\". Does not return any response.\r\nexport async function modifyServerProperty(\r\n reduxObject: any,\r\n propertyName: string,\r\n newValue: any,\r\n projectId: string,\r\n unitId: number\r\n) {\r\n //Update redux to invalidate the unit price\r\n store.dispatch(updateReduxAction('UPDATE_PRICING', { priceNeedsUpdate: true }));\r\n\r\n const projClient = await getClientWithAuth();\r\n const propertyMod = createPropertyModification(unitId, newValue, propertyName, reduxObject);\r\n\r\n if (propertyMod) {\r\n updateEditedFields(propertyName.toString()); //let redux know the user has edited this field\r\n\r\n try {\r\n console.log(\"ModifyProperty, UnitId:\"+unitId);\r\n await projClient.modifyProperty(projectId, propertyMod);\r\n return \"success\";\r\n } catch (error) {\r\n // if (error.status === 401) {\r\n // displayError(error, 'modifyProperty');\r\n // return {apiErrorCode:401, errorMessage: \"unauthorized\"};\r\n // } else {\r\n //displayError(error, 'modifyServerProperty ' + propertyMod.propertyName);\r\n return error;\r\n // }\r\n }\r\n }\r\n}\r\n\r\nexport async function modifySelectedModelProperty(\r\n reduxObject: T,\r\n propertyName: K,\r\n newValue: any,\r\n projectId: string,\r\n unitId:number\r\n) {\r\n //Update redux to invalidate the unit price\r\n store.dispatch(updateReduxAction('UPDATE_PRICING', { priceNeedsUpdate: true }));\r\n\r\n const projClient = await getClientWithAuth();\r\n const propertyMod = createPropertyModification(unitId, newValue, propertyName, reduxObject);\r\n if (propertyMod) {\r\n try {\r\n return await projClient.modifySelectedModelProperty(projectId, propertyMod);\r\n } catch (error) {\r\n // if (error.status === 401) {\r\n // displayError(error, 'modifySelectedModelProperty');\r\n // } else {\r\n // throw error;\r\n // }\r\n return error;\r\n }\r\n }\r\n}\r\n\r\nexport async function modifyCasingSizeLimitProperty(\r\n reduxObject: T,\r\n propertyName: K,\r\n newValue: any,\r\n projectId: string,\r\n unitId:number\r\n) {\r\n //Update redux to invalidate the unit price\r\n store.dispatch(updateReduxAction('UPDATE_PRICING', { priceNeedsUpdate: true }));\r\n \r\n const projClient = await getClientWithAuth();\r\n const propertyMod = createPropertyModification(unitId, newValue, propertyName, reduxObject);\r\n if (propertyMod) {\r\n updateEditedFields(propertyName.toString()); //let redux know the user has edited this field\r\n try {\r\n return await projClient.modifyCasingSizeLimitProperty(projectId, propertyMod);\r\n } catch (error) {\r\n // if (error.status === 401) {\r\n // displayError(error, 'modifyCasingSizeLimitProperty');\r\n // } else {\r\n // throw error;\r\n // }\r\n return error;\r\n }\r\n }\r\n}\r\n\r\nfunction createPropertyModification(unitId: number, newValue: any, propertyName: K, reduxObject: T) {\r\n const reduxProperty = reduxObject[propertyName];\r\n const id = (reduxProperty as any)['id'] as string;\r\n const typedRefPath = createTypedRefPath(id, true, reduxProperty as any); //pointer to back-end class\r\n if (reduxProperty) {\r\n return {\r\n unitId: unitId,\r\n propertyName: id.split('.').slice(-1)[0], // Property name is the last item in the refPath\r\n entityTypedRefPath: typedRefPath,\r\n newValue: newValue\r\n } as PropertyModification;\r\n }\r\n return null;\r\n}\r\n\r\n//Delete a property from the save file\r\n//This not only removes the user-entered value, but also deletes the property from the save file altogether.\r\nexport async function deleteServerProperty(\r\n reduxObject: T,\r\n propertyName: K,\r\n projectId: string,\r\n unitId: number\r\n) {\r\n const projClient = await getClientWithAuth();\r\n const reduxProperty = reduxObject[propertyName];\r\n\r\n if (reduxProperty) {\r\n const id = (reduxProperty as any)['id'] as string;\r\n const typedRefPath = createTypedRefPath(id, true, reduxProperty as any); //pointer to back-end class\r\n\r\n try {\r\n await projClient.deleteProperty(projectId, {\r\n propertyName: id.split('.').slice(-1)[0], // Property name is the last item in the refPath\r\n entityTypedRefPath: typedRefPath\r\n });\r\n } catch (error) {\r\n // if (error.status === 401) {\r\n // displayError(error, 'deleteProperty');\r\n // } else {\r\n // throw error;\r\n // }\r\n return error;\r\n }\r\n }\r\n}\r\nexport async function getProjectJsonFile(routeParams: any) {\r\n const projClient = await getClientWithAuth();\r\n const { projectId } = routeParams;\r\n\r\n try {\r\n return await projClient.getProjectJson(projectId);\r\n } catch (error) {\r\n displayError(error, 'getProjectJson');\r\n return null;\r\n }\r\n}\r\n\r\n//Purpose: Get an Auth token to use when making API calls\r\nexport async function getClientWithAuth() {\r\n const projClient = new ProjectClient(baseUrl);\r\n const auth = store.getState().reduxAuth;\r\n let token = '';\r\n //Check to see if reduxAuth contains the access_token. \r\n //Using access_token from Redux prevents a bunch of calls to identityserver,\r\n //but on page reload, sometimes redux doesn't get populated fast enough, and the page tries\r\n //to call the server with no token, and fails. So in that case we should get it from IdentityServer.\r\n if(auth.access_token !== ''){\r\n token = auth.access_token;\r\n }\r\n else{\r\n const identityService = new IdentityService();\r\n const user = await identityService.getUser();\r\n token = user.access_token;\r\n }\r\n \r\n\r\n projClient.transformOptions = (opts) => {\r\n const headers = (opts as RequestInit).headers;\r\n (opts as RequestInit).headers = { ...headers, Authorization: `Bearer ${token}` };\r\n return Promise.resolve(opts);\r\n };\r\n\r\n return projClient;\r\n}\r\n\r\n//Purpose: something to do with pointers to API objects\r\n//TODO: Nate fill in detail here\r\n//Parameter2: id: \"Root.UnitCollection.Units[0].UnitTag\"\r\n//Parameter3: true\r\nexport function createTypedRefPath(refPath: string, stripPropertyFromEnd: boolean, uiProperty: UIProperty) {\r\n const refPathAtoms = refPath.split('.');\r\n if (stripPropertyFromEnd) {\r\n refPathAtoms.pop(); // Remove the property name atom\r\n }\r\n const typedAtoms = refPathAtoms.map((refAtom) => ({ value: refAtom } as TypedRefAtom));\r\n return { atoms: typedAtoms, entityType: uiProperty.entityType } as TypedRefPathDto;\r\n}\r\n\r\n//Looks like this can take in a standard http error object or a custom error object.\r\nexport function displayError(error: any, source: string) {\r\n const reduxStore = store.getState();\r\n\r\n //Only display this error if there's not already an error showing\r\n if (reduxStore.reduxServerErrors.showError !== true) {\r\n const errorObj: any = { showError: true, errorSource: source };\r\n if (error.status === 401) {\r\n errorObj.errorType = 401;\r\n } else {\r\n errorObj.errorType = 500;\r\n errorObj.errorMessage = `${source} ${error.status} Error: ${(error.message?.substring(0,650) || '')}`;\r\n }\r\n\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n store.dispatch(updateReduxAction('UPDATE_SERVER_ERROR', errorObj));\r\n }\r\n}\r\nexport function displayErrorString(errorMessage: string, source: string) {\r\n const reduxStore = store.getState();\r\n const errorObj: any = { showError: true, errorSource: source };\r\n //Only display this error if there's not already an error showing\r\n \r\n \r\n if (reduxStore.reduxServerErrors.showError !== true) {\r\n errorObj.errorType = 500;\r\n errorObj.errorMessage = source + ' Error: ' + (errorMessage?.substring(0,650) || '');\r\n }\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n store.dispatch(updateReduxAction('UPDATE_SERVER_ERROR', errorObj));\r\n}","import { store } from '../redux/store';\r\nimport { displayError, displayErrorString} from '../api-utilities/api-calls';\r\nimport { IdentityService } from '../security/IdentityService';\r\nimport { IUserInfo } from '../interfaces/interfaces';\r\n//This file contains calls to the Lowry backend, which gets results from the ProjectDataAPI\r\n\r\nconst apibase = process.env.REACT_APP_CLIENT_API;\r\n\r\nexport async function getAuthToken() {\r\n const auth = store.getState().reduxAuth;\r\n let token = '';\r\n //Check to see if reduxAuth contains the access_token. \r\n //Using access_token from Redux prevents a bunch of calls to identityserver,\r\n //but on page reload, sometimes redux doesn't get populated fast enough, and the page tries\r\n //to call the server with no token, and fails. So in that case we should get it from IdentityServer.\r\n if(auth.access_token !== ''){\r\n token = auth.access_token;\r\n }\r\n else{\r\n const identityService = new IdentityService();\r\n const user = await identityService.getUser();\r\n if(user != null){\r\n token = user.access_token;\r\n }\r\n }\r\n return token;\r\n}\r\nexport async function GetFreightStatesCheckPostalCode(postalCode: any) {\r\n const token = await getAuthToken();\r\n try {\r\n const result = await fetch(apibase + '/dataapi/getFreightStatesCheckPostalCode/' + postalCode, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getFreightStatesCheckPostalCode\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getFreightStatesCheckPostalCode');\r\n }\r\n } catch (error) {\r\n displayError(error, 'getFreightStatesCheckPostalCode');\r\n } \r\n}\r\nexport async function getProjectsByUser() {\r\n const token = await getAuthToken();\r\n try {\r\n const result = await fetch(apibase + '/dataapi/getProjectsByUser', {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getAllProjects\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getAllProjects');\r\n }\r\n } catch (error) {\r\n displayError(error, 'getAllProjects');\r\n }\r\n}\r\n\r\nexport async function getProject(projectId:string) {\r\n const token = await getAuthToken();\r\n let source = \"\";\r\n let url = \"\";\r\n\r\n url = apibase + '/dataapi/getProject/'+ projectId;\r\n source = \"getProject\";\r\n\r\n const result = await fetch(url, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, source);\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", source);\r\n }\r\n}\r\n\r\nexport async function getProjectProStatus(projectId:string) {\r\n const token = await getAuthToken();\r\n let source = \"\";\r\n let url = \"\";\r\n\r\n url = apibase + '/dataapi/getProjectProStatus/'+ projectId;\r\n source = \"getProjectProStatus\";\r\n\r\n const result = await fetch(url, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, source);\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", source);\r\n }\r\n}\r\n\r\nexport async function getStatusTypes() {\r\n const token = await getAuthToken();\r\ntry{\r\n const result = await fetch(apibase + '/dataapi/getEnumValues/100', {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getEnumValues(100)\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", \"getEnumValues(100)\");\r\n }\r\n}\r\ncatch{\r\n console.log(\"request failed: getEnumValues(100)\");\r\n displayErrorString(\"Requst failed\", \"getEnumValues(100)\");\r\n let response:any = {\r\n enumDtoList: []\r\n };\r\n return response;\r\n}\r\n}\r\n\r\n//Update project based on user changes in the edit project modal dialog.\r\nexport async function updateProject(project:any, reduxProjectManagement:any){\r\n //const auth = store.getState().reduxAuth;\r\n const token = await getAuthToken();\r\n\r\n const editedProjectRequest = {\r\n //createdById: auth.userId,\r\n projectName: reduxProjectManagement.projectName,\r\n consultingEngineer: reduxProjectManagement.consultingEngineer,\r\n contractor: reduxProjectManagement.contractor,\r\n city: reduxProjectManagement.city,\r\n state: reduxProjectManagement.state,\r\n projectId:project.id,\r\n jobStatus:reduxProjectManagement.jobStatus\r\n };\r\n \r\n const result = await fetch(apibase + '/dataapi/updateProject', {\r\n method: 'post',\r\n body: JSON.stringify(editedProjectRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\nexport async function addNewProject(reduxProjectManagement: any) {\r\n const token = await getAuthToken();\r\n const identityService = new IdentityService();\r\n const user = await identityService.getUser();\r\n const userInfo: IUserInfo = await identityService.getUserInfo(user);\r\n const newProjectRequest = {\r\n projectName: reduxProjectManagement.projectName,\r\n consultingEngineer:reduxProjectManagement.consultingEngineer ?? \"\",\r\n contractor: reduxProjectManagement.contractor ?? \"\",\r\n city: reduxProjectManagement.city ?? \"\",\r\n state: reduxProjectManagement.state ?? \"\",\r\n userId: userInfo.userId,\r\n firstName: userInfo.firstName,\r\n lastName: userInfo.lastName,\r\n userType: userInfo.userType,\r\n email: userInfo.email,\r\n jobStatus:reduxProjectManagement.jobStatus\r\n };\r\n const result = await fetch(apibase + '/dataapi/createproject', {\r\n method: 'post',\r\n body: JSON.stringify(newProjectRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\n//Add new unit to the database and projectFileString\r\nexport async function addUnit(projectId: number) {\r\n const token = await getAuthToken();\r\n let userRole = null;\r\n // const identityService = new IdentityService();\r\n // const user = await identityService.getUser();\r\n // const userInfo: IUserInfo = await identityService.getUserInfo(user);\r\n const auth = store.getState().reduxAuth;\r\n if (auth.userRoles?.length > 0) {\r\n auth.userRoles.forEach((role: any) => {\r\n if (role === \"rep\") {\r\n userRole = \"rep\";\r\n }\r\n if (role === \"employee\"){\r\n userRole = \"employee\";\r\n }\r\n if (role === \"customer\"){\r\n userRole = \"customer\";\r\n }\r\n });\r\n }\r\n const newUnitDto = {\r\n projectId: projectId,\r\n userType: userRole\r\n };\r\n const result = await fetch(apibase + '/dataapi/createUnit', {\r\n method: 'post',\r\n body: JSON.stringify(newUnitDto),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\nexport async function getUnits(projectId: number) {\r\n const token = await getAuthToken();\r\ntry{\r\n const result = await fetch(apibase + '/dataapi/getUnits/' + projectId, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getUnits\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getUnits');\r\n }\r\n }\r\n catch{\r\n displayErrorString(\"Requst failed\", 'getUnits');\r\n }\r\n}\r\n\r\nexport async function getOutputDocumentsData(projectId: any) {\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + '/dataapi/getOutputDocumentsData/' + projectId, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getOutputDocumentsData\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getOutputDocumentsData');\r\n }\r\n}\r\n\r\nexport async function getUnitsWithOversizedInfo(projectId: any) {\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + '/dataapi/getUnitsWithOversizedInfo/' + projectId, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getUnitsWithOversizedInfo\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getUnitsWithOversizedInfo');\r\n }\r\n}\r\n\r\nexport async function getUnitsForOutputDocs(projectId: number) {\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + '/dataapi/getUnitsForOutputDocUI/' + projectId, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getUnits\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getUnits');\r\n }\r\n}\r\n\r\nexport async function getUnit(routeParams: any) {\r\n const { unitId } = routeParams;\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + '/dataapi/getUnit/' + unitId, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getUnit\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getUnit');\r\n }\r\n}\r\n\r\n//Copy a unit - call goes directly to ProjectDataAPI\r\nexport async function copyUnit(sourceProjectId:string, targetProjectId:string, unitTagName:string, unitId:number) {\r\n const token = await getAuthToken();\r\n\r\n const newUnitRequest = {\r\n sourceProjectId: sourceProjectId,\r\n targetProjectId: targetProjectId,\r\n unitId: unitId,\r\n unitTag: unitTagName\r\n };\r\n const result = await fetch(apibase + '/dataapi/copyUnit', {\r\n method: 'post',\r\n body: JSON.stringify(newUnitRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\n//Copy a Project - call goes directly to ProjectDataAPI\r\nexport async function copyProject(projectId:string, projectName:string) {\r\n const token = await getAuthToken();\r\n\r\n const copyProjectRequest = {\r\n projectId: projectId,\r\n projectName: projectName,\r\n };\r\n const result = await fetch(apibase + '/dataapi/copyProject', {\r\n method: 'post',\r\n body: JSON.stringify(copyProjectRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\nexport async function getProjectAndUnitName(projectId: string, unitId: string, appVersion:string) {\r\n const token = await getAuthToken();\r\n let targetEndpoint = \"dataapi/getProjectAndUnitName\";\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${projectId}/${unitId}/${appVersion}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getProjectAndUnitName\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'getProjectAndUnitName');\r\n }\r\n}\r\n\r\nexport async function deleteProjectAndUnits(projectId:string){\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + `/dataapi/deleteProject/${projectId}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json = successful object\r\n //result.text = error message\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\nexport async function deleteUnit(projectId:string, unitId:string){\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + `/dataapi/deleteUnit/${projectId}/${unitId}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json = successful object\r\n //result.text = error message\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\n\r\n//---------------------- Project Transfer -----------------------------------\r\n\r\nexport async function getRepsByOfficeId() {\r\n const token = await getAuthToken();\r\n const identityService = new IdentityService();\r\n const user = await identityService.getUser();\r\n const userInfo: IUserInfo = await identityService.getUserInfo(user);\r\n\r\n //TODO: Take this out\r\n // console.log(\"--------- Calling with hardcoded officeId -----------\");\r\n // console.log(userInfo);\r\n // let testMembershipArray = [{OfficeName: \"testOffice\", OfficeId:1239}];\r\n\r\n const req = {\r\n userId: userInfo.userId,\r\n repOfficeMemberships: userInfo.officeMembershipsArr\r\n //repOfficeMemberships: testMembershipArray\r\n };\r\n\r\n const result = await fetch(apibase + '/dataapi/getContactsByOfficeId', {\r\n method: 'post',\r\n body: JSON.stringify(req),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\nexport async function transferProjectToNewUser(projectId: string, selectedUserId:string){\r\n const token = await getAuthToken();\r\n\r\n const editedProjectRequest = {\r\n projectId: projectId,\r\n newOwnerId: selectedUserId\r\n };\r\n \r\n const result = await fetch(apibase + '/dataapi/transferProjectToNewUser', {\r\n method: 'post',\r\n body: JSON.stringify(editedProjectRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n//Save user profile info to sql table.\r\nexport async function saveUserIdentity(request:any){\r\n const token = await getAuthToken();\r\n \r\n const result = await fetch(apibase + '/dataapi/saveUserIdentity', {\r\n method: 'post',\r\n body: JSON.stringify(request),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //Server side method is Void. No response.\r\n\r\n}\r\n\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport \"../../css/ProjectModal.scss\";\r\nimport { ProjectStatusFilterBy } from \"../../interfaces/interfaces\";\r\nimport { GetFreightStatesCheckPostalCode } from \"../../api-calls/projectDataService\";\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n reduxProjectManagement: any;\r\n reduxAuth: any;\r\n}\r\n// local state\r\ninterface IState {\r\n projectName: string;\r\n consultingEngineer: string;\r\n contractor: string;\r\n city: string;\r\n state: string;\r\n jobStatus: string;\r\n freightStates:any[];\r\n}\r\n\r\nclass ProjectModal extends React.Component {\r\n public state: IState = {\r\n projectName: \"\",\r\n consultingEngineer: \"\",\r\n contractor: \"\",\r\n city: \"\",\r\n state: \"\",\r\n jobStatus: ProjectStatusFilterBy[ProjectStatusFilterBy.Design],\r\n freightStates: []\r\n };\r\n\r\n //This is a specific modal for adding or editing a project. Input is project name.\r\n async componentDidMount() {\r\n if (this.props.reduxModals.modalId === \"edit-project\" || this.props.reduxModals.modalId === \"add-new-project\") {\r\n if (this.props.reduxModals.modalId === \"edit-project\"){\r\n this.setState({\r\n projectName: this.props.reduxProjectManagement.selectedProject.projectName,\r\n consultingEngineer: this.props.reduxProjectManagement.selectedProject.consultingEngineer,\r\n contractor: this.props.reduxProjectManagement.selectedProject.contractor,\r\n city: this.props.reduxProjectManagement.selectedProject.city,\r\n state: this.props.reduxProjectManagement.selectedProject.state,\r\n jobStatus: this.props.reduxProjectManagement.selectedProject.jobStatus\r\n });\r\n }\r\n //Get all the state choices for the dropdown and check to see if the zip code in the user's profile is in New York city.\r\n let response = await GetFreightStatesCheckPostalCode(this.props.reduxAuth.postalCode);\r\n\r\n //response.states is a list of objects that contain a state (state abbrev) and a fullState property.\r\n this.setState({freightStates: response.states});\r\n\r\n let setToNewYorkCity: boolean = false;\r\n\r\n //Set profileState to user's logged in profile state.\r\n let profileState = this.props.reduxAuth.state;\r\n\r\n if (profileState && profileState.toLowerCase() === \"ny\"){\r\n profileState = \"NY - State\";\r\n }\r\n //If the profile state is the full state name, find it's match and assign profile state to it's abbreviation.\r\n let fullStateExistsInDropdownList = response.states.find((stateInfo:any) => stateInfo.fullState.toLowerCase() === profileState?.toLowerCase());\r\n if (fullStateExistsInDropdownList){\r\n profileState = fullStateExistsInDropdownList.state;\r\n }\r\n //Verify the profile state exists in list of abbreviated states.\r\n let stateExistsInDropdownList = response.states.find((stateInfo:any) => stateInfo.state.toLowerCase() === profileState?.toLowerCase());\r\n\r\n //Set state to \"NY - City\" if:\r\n //1. The profile postal code is in NY - City.\r\n //2. There hasn't been a state selected by the user yet. \r\n if (response.isNewYorkState === true && !this.props.reduxProjectManagement.selectedProject?.state){\r\n this.setState({state: \"NY - City\"});\r\n setToNewYorkCity = true;\r\n }\r\n\r\n //Set state to a value other than \"NY - City\" if:\r\n //1. The user's profile State matches one of the states in the dropdown.\r\n //2. There hasn't been a state selected by the user yet (state is empty or null and not \"Choose an Options\").\r\n //3. The profile postal code is not in NY - City.\r\n else if (stateExistsInDropdownList && setToNewYorkCity === false && \r\n (!this.props.reduxProjectManagement.selectedProject?.state)){\r\n console.log(\"Set profile state.\");\r\n this.setState({state: profileState});\r\n }\r\n //Default to Alabama if nothing has been previously selected and user's postal code is not in NY - City \r\n //and user's state is not in the list of states.\r\n else if (!this.props.reduxProjectManagement.selectedProject?.state){\r\n console.log(\"Set default Alabama.\");\r\n this.setState({state: \"AL\"});\r\n }\r\n else {\r\n console.log(\"Set state to previously selected.\");\r\n this.setState({state: this.props.reduxProjectManagement.selectedProject?.state})\r\n }\r\n }\r\n }\r\n\r\n validateAndSave(fieldName: any, newValue: any) {\r\n if (newValue.length <= 50) {\r\n this.setState({ [fieldName]: newValue } as Pick);\r\n }\r\n }\r\n\r\n public render() {\r\n const title = this.props.reduxModals.modalId === \"edit-project\" ? \"Edit Job\" : \"New Job\";\r\n const buttonText = this.props.reduxModals.modalId === \"edit-project\" ? \"Save\" : \"Create\";\r\n return (\r\n
\r\n
{title}
\r\n
\r\n \r\n this.validateAndSave(\"projectName\", event.currentTarget.value)}\r\n autoFocus\r\n />\r\n
\r\n
\r\n \r\n this.validateAndSave(\"consultingEngineer\", event.currentTarget.value)}\r\n />\r\n
\r\n
\r\n \r\n this.validateAndSave(\"contractor\", event.currentTarget.value)}\r\n />\r\n
\r\n
\r\n \r\n this.validateAndSave(\"city\", event.currentTarget.value)}\r\n />\r\n
\r\n
\r\n
State
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
Job Status
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
this.userResponse(\"ok\")}>\r\n {buttonText}\r\n
\r\n
this.userResponse(\"cancel\")}>\r\n Cancel\r\n
\r\n
\r\n
\r\n );\r\n }\r\n //This will trigger the componentDidUpdate method on ProjectManagement.tsx\r\n private userResponse(response: string) {\r\n this.props.updateRedux(\"UPDATE_MODALS\", { showModal: false, userResponse: response });\r\n if (response === \"ok\" && this.state.projectName !== \"\") {\r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", {\r\n projectName: this.state.projectName,\r\n consultingEngineer: this.state.consultingEngineer,\r\n contractor: this.state.contractor,\r\n city: this.state.city,\r\n state: this.state.state,\r\n jobStatus: this.state.jobStatus\r\n });\r\n if (this.props.reduxModals.modalId === \"edit-project\") {\r\n let selectedProject = this.props.reduxProjectManagement.selectedProject;\r\n selectedProject.projectName = this.state.projectName;\r\n selectedProject.consultingEngineer = this.state.consultingEngineer;\r\n selectedProject.contractor = this.state.contractor;\r\n selectedProject.city = this.state.city;\r\n selectedProject.state = this.state.state;\r\n selectedProject.jobStatus = this.state.jobStatus;\r\n \r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", {selectedProject: selectedProject});\r\n }\r\n }\r\n if (response === \"cancel\") {\r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", { projectName: \"\" });\r\n }\r\n }\r\n private getStateOptions(){\r\n const options = this.state.freightStates;\r\n \r\n if (options) {\r\n return options.map((item: any, index: number) => (\r\n \r\n ));\r\n }\r\n return ;\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxProjectManagement: state.reduxProjectManagement,\r\n reduxModals: state.reduxModals,\r\n reduxAuth: state.reduxAuth\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ProjectModal);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport \"../../css/UnitCopyModal.scss\";\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n reduxProjectManagement: any;\r\n}\r\n// local state\r\ninterface IState {\r\n unitTagName: string;\r\n sourceProjectId: string;\r\n targetProjectId: string;\r\n}\r\n\r\nclass UnitCopyModal extends React.Component {\r\n public state: IState = { unitTagName: \"\", sourceProjectId: \"\", targetProjectId: \"\" };\r\n\r\n //This is a specific modal for copying a unit to the project selected by the user.\r\n componentDidMount() {\r\n console.log(this.props.reduxModals.modalData);\r\n console.log(this.props.reduxProjectManagement.projectList);\r\n //return;\r\n\r\n let currentUnit = this.props.reduxModals.modalData;\r\n let projectList = this.props.reduxProjectManagement.projectList;\r\n let selectedProject = this.props.reduxProjectManagement.selectedProject;\r\n\r\n //Default Unit tag name to \"copy of...current unit tag\"\r\n //Default seleted project to same as current project\r\n //...User may edit both.\r\n let unitTag = \"Copy of \" + currentUnit.unitTag;\r\n this.setState({ unitTagName: unitTag, sourceProjectId: selectedProject.id, targetProjectId: selectedProject.id });\r\n }\r\n public render() {\r\n let disabled = this.state.unitTagName === \"\" || this.state.targetProjectId === \"\" ? \"disabledDiv\" : \"\";\r\n\r\n return (\r\n
\r\n
Copy Unit
\r\n
\r\n \r\n this.setState({ unitTagName: event.currentTarget.value })}\r\n />\r\n
\r\n Select Job to Copy to\r\n\r\n
{this.getProjectChoices()}
\r\n
\r\n
this.userResponse(\"ok\")}>\r\n Copy\r\n
\r\n
this.userResponse(\"cancel\")}>\r\n Cancel\r\n
\r\n
\r\n
\r\n );\r\n }\r\n private getProjectChoices() {\r\n //Show radio button for each project.\r\n let projectList = this.props.reduxProjectManagement.projectList;\r\n\r\n //Find the project this unit belongs to, and show it at top of the list,\r\n //because most times, users will copy a unit to the same project. (Per Dave)\r\n let currentUnit = this.props.reduxModals.modalData;\r\n let currentProject = this.props.reduxProjectManagement.selectedProject;\r\n //let currentProject = projectList.find((x: any) => x.id === currentUnit.projectID);\r\n\r\n //Create an ordered list, with the currentProject at the top\r\n let orderedProjectList = [];\r\n orderedProjectList.push(currentProject);\r\n\r\n //Add the rest of the projects, but don't add currentProject twice\r\n for (const proj of projectList) {\r\n if (proj.id !== currentProject.id) {\r\n orderedProjectList.push(proj);\r\n }\r\n }\r\n\r\n return orderedProjectList.map((item: any, index: number) => (\r\n
\r\n this.updateProjectSelected(item.id)}\r\n />\r\n
{item.projectName}
\r\n
\r\n ));\r\n }\r\n\r\n //Select the project to copy to\r\n private updateProjectSelected(projectId: string) {\r\n console.log(\"seletedProjectId:\" + projectId);\r\n this.setState({ targetProjectId: projectId });\r\n }\r\n\r\n private userResponse(response: string) {\r\n let copyUnitResponse = {\r\n response: response,\r\n sourceProjectId: this.state.sourceProjectId,\r\n targetProjectId: this.state.targetProjectId,\r\n unitTagName: this.state.unitTagName,\r\n unitId: this.props.reduxModals.modalData.id\r\n };\r\n //This will trigger the componentDidUpdate method on ProjectManagement.tsx\r\n this.props.updateRedux(\"UPDATE_MODALS\", { showModal: false, userResponse: copyUnitResponse });\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxProjectManagement: state.reduxProjectManagement,\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitCopyModal);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport \"../../css/UnitCopyModal.scss\";\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n reduxProjectManagement: any;\r\n}\r\n// local state\r\ninterface IState {\r\n projectName: string;\r\n selectedProjectId: string;\r\n}\r\n\r\nclass ProjectCopyModal extends React.Component {\r\n public state: IState = { projectName: \"\", selectedProjectId: \"\" };\r\n\r\n //This is a specific modal for copying a unit to the project selected by the user.\r\n componentDidMount() {\r\n //Default Unit tag name...User may edit.\r\n let projectName = \"Copy of \" + this.props.reduxModals.modalData.projectName;\r\n this.setState({ projectName: projectName, selectedProjectId: this.props.reduxModals.modalData.id });\r\n }\r\n public render() {\r\n let disabled = this.state.projectName === \"\" || this.state.selectedProjectId === \"\" ? \"disabledDiv\" : \"\";\r\n\r\n return (\r\n
\r\n
Copy Job
\r\n
\r\n \r\n this.setState({ projectName: event.currentTarget.value })}\r\n />\r\n
\r\n\r\n
\r\n
this.userResponse(\"ok\")}>\r\n Copy\r\n
\r\n
this.userResponse(\"cancel\")}>\r\n Cancel\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private userResponse(response: string) {\r\n let copyProjectResponse = {\r\n response: response,\r\n projectId: this.state.selectedProjectId,\r\n projectName: this.state.projectName\r\n };\r\n //This will trigger the componentDidUpdate method on ProjectManagement.tsx\r\n this.props.updateRedux(\"UPDATE_MODALS\", { showModal: false, userResponse: copyProjectResponse });\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxProjectManagement: state.reduxProjectManagement,\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ProjectCopyModal);\r\n","import { store } from '../redux/store';\r\nimport { IdentityService } from '../security/IdentityService';\r\nimport { getStringId } from '../api-utilities/formatting';\r\n//This file contains calls to the Lowry backend, which gets results from the ChartAPI\r\n\r\n\r\nconst apibase = process.env.REACT_APP_CLIENT_API;\r\n\r\nexport async function getAuthToken() {\r\n const auth = store.getState().reduxAuth;\r\n let token = '';\r\n //Check to see if reduxAuth contains the access_token. \r\n //Using access_token from Redux prevents a bunch of calls to identityserver,\r\n //but on page reload, sometimes redux doesn't get populated fast enough, and the page tries\r\n //to call the server with no token, and fails. So in that case we should get it from IdentityServer.\r\n if(auth.access_token !== ''){\r\n token = auth.access_token;\r\n }\r\n else{\r\n const identityService = new IdentityService();\r\n const user = await identityService.getUser();\r\n token = user.access_token;\r\n }\r\n return token;\r\n}\r\n\r\nexport async function getFanCurveChart(projectId: number, unitId: number, selectedFan: string) {\r\n const token = await getAuthToken();\r\n \r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n \r\n const result = await fetch(apibase + `/dataapi/getFanCurveChart/${projIdStr}/${unitIdStr}/${selectedFan}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n if(result.status === 400){\r\n return null;\r\n }\r\n if (result.status === 200) {\r\n console.log(result);\r\n const data = await result.blob();\r\n console.log(data);\r\n return data;\r\n }\r\n}\r\n\r\nexport async function getFanSoundData(projectId: number, unitId: number, selectedFan: string) {\r\n const token = await getAuthToken();\r\n\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const result = await fetch(apibase + `/dataapi/getFanSoundData/${projIdStr}/${unitIdStr}/${selectedFan}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport {getFanCurveChart} from '../../api-calls/chartDataService';\r\nimport '../../css/Modals.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n}\r\n// local state\r\ninterface IState {chartData:any; chartError:boolean, loading:boolean}\r\n\r\nclass FanCurveModal extends React.Component {\r\n public state: IState = {chartData:null, chartError:false, loading:false};\r\n\r\n //This is a specific modal for displaying a fan curve chart\r\n async componentDidMount() {\r\n let data = this.props.reduxModals.modalData;\r\n let projectId = data.projectId;\r\n let unitId = data.unitId;\r\n let selectedFan = data.selectedFan;\r\n this.setState({loading:true});\r\n let chart = await getFanCurveChart(projectId, unitId, selectedFan);\r\n if(chart != null){\r\n let url = URL.createObjectURL(chart);\r\n this.setState({chartData:url, loading:false});\r\n }\r\n else{\r\n this.setState({chartError: true, loading:false});\r\n }\r\n }\r\n public render() {\r\n \r\n return (\r\n
\r\n\r\n {this.state.loading ? (
) : null}\r\n\r\n {this.state.chartData != null ? \"\" : null}\r\n\r\n {this.state.chartError ?
\r\n
\r\n Unable to create fan curve chart based on the available data.\r\n

Please update unit design and try again.
\r\n
: null}\r\n \r\n\r\n
\r\n
this.userResponse('cancel')}>\r\n Close\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n\r\n private userResponse(response: string) {\r\n let modalResponse = {\r\n response:response,\r\n unitId:this.props.reduxModals.modalData.id\r\n }\r\n //This will trigger ModalContainer.tsx to hide all modals\r\n this.props.updateRedux('UPDATE_MODALS', { showModal: false, userResponse: modalResponse});\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxProjectManagement: state.reduxProjectManagement,\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FanCurveModal);\r\n\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport {getFanSoundData} from '../../api-calls/chartDataService';\r\nimport {roundNumber} from '../../api-utilities/formatting';\r\nimport '../../css/Modals.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n}\r\n// local state\r\ninterface IState {soundData:any; chartError:boolean, loading:boolean}\r\n\r\nclass FanSoundDataModal extends React.Component {\r\n public state: IState = {soundData:null, chartError:false, loading:false};\r\n\r\n //This is a specific modal for displaying fan sound data\r\n async componentDidMount() {\r\n let data = this.props.reduxModals.modalData;\r\n let projectId = data.projectId;\r\n let unitId = data.unitId;\r\n let selectedFan = data.selectedFan;\r\n\r\n this.setState({loading:true});\r\n let soundData = await getFanSoundData(projectId, unitId, selectedFan);\r\n if(soundData.success){\r\n this.setState({soundData:soundData.data.unitFanPerformanceDTO, loading:false});\r\n }\r\n else{\r\n this.setState({chartError: true, loading:false});\r\n }\r\n }\r\n public render() {\r\n let data = this.state.soundData;\r\n return (\r\n
\r\n\r\n {this.state.loading ? (
) : null}\r\n\r\n {this.state.soundData != null ? (\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 \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
Sound DataInletOutlet
62.5{roundNumber(data.inletSoundlevel63hz)}{roundNumber(data.outletSoundlevel63hz)}
125{roundNumber(data.inletSoundlevel125hz)}{roundNumber(data.outletSoundlevel125hz)}
250{roundNumber(data.inletSoundlevel250hz)}{roundNumber(data.outletSoundlevel250hz)}
500{roundNumber(data.inletSoundlevel500hz)}{roundNumber(data.outletSoundlevel500hz)}
1000{roundNumber(data.inletSoundlevel1000hz)}{roundNumber(data.outletSoundlevel1000hz)}
2000{roundNumber(data.inletSoundlevel2000hz)}{roundNumber(data.outletSoundlevel2000hz)}
4000{roundNumber(data.inletSoundlevel4000hz)}{roundNumber(data.outletSoundlevel4000hz)}
8000{roundNumber(data.inletSoundlevel8000hz)}{roundNumber(data.outletSoundlevel8000hz)}
LwA{roundNumber(data.inletPowerWeightedLwA)}{roundNumber(data.outletPowerWeightedLwA)}
dBA{roundNumber(data.inletPressureWeightedDBa)}{roundNumber(data.outletPressureWeightedDBa)}
Sones{roundNumber(data.inletPerceivedLoudnessSones)}{roundNumber(data.outletPerceivedLoudnessSones)}
\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
Lwa:A weighted sound power level based on ANSI 1.4
dBA:A weighted sound pressure level based on 11.5 dB attenuation per octave band at 5ft-dBA levels are not licensed by AMCA International
Sones:Calculated using AMCA 301 at 5ft.
\r\n
\r\n\r\n\r\n
\r\n \r\n ) : null}\r\n\r\n {this.state.chartError ?
\r\n
\r\n Unable to get fan sound data.\r\n

Please click the button to update unit design and try again.
\r\n
: null}\r\n \r\n\r\n
\r\n
this.userResponse('cancel')}>\r\n Close\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n\r\n private userResponse(response: string) {\r\n let modalResponse = {\r\n response:response,\r\n unitId:this.props.reduxModals.modalData.id\r\n }\r\n //This will trigger ModalContainer.tsx to hide all modals\r\n this.props.updateRedux('UPDATE_MODALS', { showModal: false, userResponse: modalResponse});\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FanSoundDataModal);\r\n\r\n","import { store } from '../redux/store';\r\nimport {getAuthToken} from '../api-calls/projectDataService';\r\nimport {displayErrorString} from '../api-utilities/api-calls';\r\n//This file contains calls to the Lowry backend, which gets results from the ChartAPI\r\n\r\nconst apibase = process.env.REACT_APP_CLIENT_API;\r\n\r\nexport async function sendSupportEmail(emailAddress: string, message: string, name: string, phone: string){\r\n const token = await getAuthToken();\r\n\r\n const contactUsEmailRequest = {\r\n userEmail: emailAddress,\r\n message: message,\r\n userName: name,\r\n userPhone: phone\r\n };\r\n\r\n const result = await fetch(apibase + '/dataapi/sendSupportEmail', {\r\n method: 'post',\r\n body: JSON.stringify(contactUsEmailRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"sendSupportEmail\");\r\n }\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", 'sendSupportEmail');\r\n }\r\n }\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport {sendSupportEmail} from '../../api-calls/emailDataService';\r\nimport '../../css/ContactUs.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n}\r\n// local state\r\ninterface IState {emailAddress:string, name:string, phone:string, message:string, emailValidationMessage:string,\r\n phoneValidationMessage:string, messageValidation:string}\r\n\r\nclass ContactUsModal extends React.Component {\r\n public state: IState = {emailAddress:\"\", name:\"\", phone:\"\", message:\"\", emailValidationMessage:\"\", phoneValidationMessage:\"\", messageValidation:\"\"};\r\n \r\n public render() {\r\n \r\n return (\r\n
\r\n
\r\n
CONTACT US
\r\n
this.userResponse('cancel')}>X
\r\n
\r\n
\r\n
\r\n
*Email Address
\r\n this.setState({'emailAddress': event.currentTarget.value})}\r\n >\r\n
{this.state.emailValidationMessage}
\r\n
Name
\r\n this.setState({'name': event.currentTarget.value})}\r\n >\r\n\r\n
Phone Number
\r\n this.setState({'phone': event.currentTarget.value})}\r\n >
{this.state.phoneValidationMessage}
\r\n
\r\n {/*
Keep in case we add content to the right side.\r\n
\r\n
*/}\r\n
\r\n
\r\n
*Message
\r\n
{this.state.messageValidation}
\r\n \r\n
\r\n
\r\n
this.sendResponse()}>\r\n SEND\r\n
\r\n
\r\n
\r\n );\r\n }\r\n private sendResponse(){\r\n //Validate inputs and send email if valid, otherwise set validation error messages.\r\n let valid = true;\r\n if (this.state.emailAddress === \"\"){\r\n valid = false;\r\n this.setState({emailValidationMessage:\"Email is required\"});\r\n }\r\n else {\r\n this.setState({emailValidationMessage:\"\"});\r\n }\r\n if (this.state.message === \"\") {\r\n valid = false;\r\n this.setState({messageValidation:\"Message is required\"})\r\n }\r\n else {\r\n this.setState({messageValidation:\"\"});\r\n }\r\n let validEmail = this.validateEmail(this.state.emailAddress);\r\n let validPhone = this.validatePhone(this.state.phone);\r\n if (this.state.emailAddress !== \"\" && !validEmail){\r\n valid = false;\r\n this.setState({\"emailValidationMessage\": \"Email format incorrect\"});\r\n }\r\n else if (this.state.emailAddress !== \"\" && validEmail) {\r\n this.setState({\"emailValidationMessage\": \"\"});\r\n }\r\n if (this.state.phone !== \"\" && !validPhone){\r\n valid = false;\r\n this.setState({\"phoneValidationMessage\": \"Phone number format incorrect\"});\r\n }\r\n else if (this.state.phone !== \"\" && validPhone) {\r\n this.setState({\"phoneValidationMessage\": \"\"});\r\n }\r\n if (valid){\r\n let response = sendSupportEmail(this.state.emailAddress, this.state.message, this.state.name, this.state.phone);\r\n this.clearFields();\r\n this.userResponse(\"cancel\");\r\n }\r\n }\r\n\r\n private userResponse(response: string) {\r\n let modalResponse = {\r\n response:response\r\n }\r\n this.clearFields();\r\n //This will trigger ModalContainer.tsx to hide all modals\r\n this.props.updateRedux('UPDATE_MODALS', { showModal: false, userResponse: modalResponse});\r\n }\r\n\r\n private validateEmail(email:string) {\r\n const re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(String(email).toLowerCase());\r\n }\r\n\r\n private validatePhone(phone:string) {\r\n const re = /^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;;\r\n return re.test(phone);\r\n }\r\n private clearFields(){\r\n this.setState({emailAddress:\"\", name:\"\", phone:\"\", message:\"\", emailValidationMessage:\"\", phoneValidationMessage:\"\", messageValidation:\"\"});\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ContactUsModal);\r\n\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { ACCUArrangement } from \"../../interfaces/interfaces\";\r\nimport \"../../css/RefrigerationSelectionModal.scss\";\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n}\r\n// local state\r\ninterface IState {\r\n accuArrangementSelected: string;\r\n displayFields: any;\r\n}\r\n\r\nclass RefrigerationLocationModal extends React.Component {\r\n public state: IState = { accuArrangementSelected: \"Automatic\", displayFields: null };\r\n\r\n componentDidMount() {\r\n this.setState({ accuArrangementSelected: this.props.reduxModals.modalData.ACCUArrangement, displayFields: this.props.reduxModals.modalData.displayFields });\r\n }\r\n //return the \"selected\" classname for the currently selected option\r\n private checkIfSelected(type: string) {\r\n return this.state.accuArrangementSelected === type ? \"refrig-img-selected\" : \"refrig-img-not-selected\";\r\n }\r\n private checkIfAutoSelected(type: string) {\r\n if (this.state.accuArrangementSelected === type) {\r\n return \"refrig-img-auto-container-selected\";\r\n } else {\r\n return \"refrig-img-auto-container\";\r\n }\r\n }\r\n private markAsSelected(type: string) {\r\n this.setState({ accuArrangementSelected: type });\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n
Edit Circuit Arrangement and Location
\r\n
\r\n
\r\n
\r\n
this.markAsSelected(ACCUArrangement[ACCUArrangement.Automatic])}>\r\n Automatic\r\n
\r\n
\r\n
\r\n {this.getExhaustImages()}\r\n
\r\n {this.getEndImages()}\r\n
\r\n
\r\n\r\n
\r\n
this.userResponse(\"ok\")}>\r\n Save\r\n
\r\n
this.userResponse(\"cancel\")}>\r\n Cancel\r\n
\r\n
\r\n
\r\n );\r\n }\r\n private getExhaustImages() {\r\n let displayFields = this.props.reduxModals.modalData.displayFields;\r\n\r\n if (displayFields.sideBySideCircuitsOne) {\r\n return (\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitSideBySide_P1])}\r\n >
\r\n
Exhaust
\r\n \r\n );\r\n } else if (displayFields.sideBySideCircuitsTwo) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitSideBySideL_P3])}\r\n >
\r\n
Exhaust & End Turned
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitSideBySideInSeries_S3])}\r\n >
\r\n
Exhaust Series
\r\n \r\n \r\n );\r\n } else if (displayFields.stackedCircuitsOne) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderTopTunnel_P2])}\r\n >
\r\n
Exhaust Turned
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderExhaust_M1])}\r\n >
\r\n
Exhaust
\r\n \r\n \r\n );\r\n } else if (displayFields.stackedCircuitsTwo) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderParallel_P4])}\r\n >
\r\n
Exhaust Parallel
\r\n \r\n\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderExhaustSeries_M5])}\r\n >
\r\n
Exhaust Series
\r\n \r\n \r\n );\r\n } else if (displayFields.sideBySideCircuitsThree) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitSideBySide_T2])}\r\n >
\r\n
Exhaust & End Parallel
\r\n \r\n \r\n );\r\n } else if (displayFields.wshpSideBySideCircuitsOne) {//HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpExhaust_W3])}\r\n >
\r\n
Exhaust
\r\n \r\n \r\n );\r\n } else if (displayFields.wshpSideBySideCircuitsTwo) {//HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpExhaust_W6])}\r\n >
\r\n
Exhaust Series
\r\n \r\n \r\n );\r\n } else if (displayFields.wshpSideBySideCircuitsThree) {//HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpExhaust_W9])}\r\n >
\r\n
Exhaust Series
\r\n \r\n \r\n );\r\n } else if (displayFields.wshpSideBySideCircuitsFour) {//HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpExhaust_W12])}\r\n >
\r\n
Exhaust Series
\r\n \r\n \r\n );\r\n } \r\n else {\r\n return null;\r\n }\r\n }\r\n private getEndImages() {\r\n let displayFields = this.props.reduxModals.modalData.displayFields;\r\n if (displayFields.sideBySideCircuitsOne) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitSideBySideEndTurned_M3])}\r\n >
\r\n
End Turned
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitSideBySideEnd_M4])}\r\n >
\r\n
End
\r\n \r\n \r\n );\r\n } else if (displayFields.sideBySideCircuitsTwo) {\r\n return (\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitSideBySideEndParallel_M7])}\r\n >
\r\n
End Parallel
\r\n \r\n );\r\n } else if (displayFields.stackedCircuitsOne) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderFullHeight_S1])}\r\n >
\r\n
End Turned
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderEnd_M2])}\r\n >
\r\n
End
\r\n \r\n \r\n );\r\n } else if (displayFields.stackedCircuitsTwo) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderFullHeightParallel_S2])}\r\n >
\r\n
End Parallel
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderEndSeries_M6])}\r\n >
\r\n
End Series
\r\n \r\n \r\n );\r\n } else if (displayFields.singleTunnelCircuitsOne) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitSingleTunnelEnd_P5])}\r\n >
\r\n
End
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitSingleTunnelEndTurned_M8])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n } else if (displayFields.singleTunnelCircuitsTwo) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitSingleTunnelEndParallel_P6])}\r\n >
\r\n
End Parallel
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitSingleTunnelEndSeries_M9])}\r\n >
\r\n
End Series
\r\n \r\n \r\n );\r\n } else if (displayFields.singleTunnelCircuitsThree) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitSingleTunnelT_T1])}\r\n >
\r\n
End Parallel & Turned
\r\n \r\n \r\n );\r\n } else if (displayFields.singleTunnelCircuitsFour) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitSingleTunnelEndParallel_F1])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n } else if (displayFields.sideBySideCircuitsFour) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitSideBySide_F2])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n } else if (displayFields.sideBySideCircuitsThree) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitSideBySide_T3])}\r\n >
\r\n
End Parallel & Turned
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.stackedCircuitsFour) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitOverUnder_F3])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.stackedCircuitsThree) {\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitOverUnder_T4])}\r\n >
\r\n
End Parallel & Turned
\r\n \r\n \r\n );\r\n } \r\n else if (displayFields.wshpSideBySideCircuitsOne) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpEnd_W1])}\r\n >
\r\n
End
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpEndTurned_W2])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n } \r\n else if (displayFields.wshpSideBySideCircuitsTwo) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpEnd_W4])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpEndTurned_W5])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n } \r\n else if (displayFields.wshpSideBySideCircuitsThree) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndSeries_W8])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndParallel_W7])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n } \r\n else if (displayFields.wshpSideBySideCircuitsFour) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpEndSeries_W11])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpEndParallel_W10])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n } \r\n else if (displayFields.wshpStackedCircuitsOne) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpEnd_W1])}\r\n >
\r\n
End
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpEndTurned_W2])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpStackedCircuitsTwo) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpEnd_W4])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpEndTurned_W5])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpStackedCircuitsThree) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndSeries_W8])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndParallel_W7])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpStackedCircuitsFour) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpEndSeries_W11])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpEndParallel_W10])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpSingleTunnelCircuitsOne) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpEnd_W1])}\r\n >
\r\n
End
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.SingleCircuitWshpEndTurned_W2])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpSingleTunnelCircuitsTwo) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpEnd_W4])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.TwoCircuitWshpEndTurned_W5])}\r\n >
\r\n
End Turned
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpSingleTunnelCircuitsThree) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndSeries_W8])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndParallel_W7])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n }\r\n else if (displayFields.wshpSingleTunnelCircuitsFour) { //HERE\r\n return (\r\n <>\r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpEndSeries_W11])}\r\n >
\r\n
End Series
\r\n \r\n
\r\n this.markAsSelected(ACCUArrangement[ACCUArrangement.FourCircuitWshpEndParallel_W10])}\r\n >
\r\n
End Parallel & Series
\r\n \r\n \r\n );\r\n } \r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n private userResponse(response: string) {\r\n let refrigerationLocationResponse = {\r\n response: response,\r\n accuArrangementSelected: this.state.accuArrangementSelected\r\n };\r\n //This will trigger the componentDidUpdate method on ProjectManagement.tsx\r\n this.props.updateRedux(\"UPDATE_MODALS\", { showModal: false, userResponse: refrigerationLocationResponse });\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RefrigerationLocationModal);\r\n","import {getAuthToken} from './projectDataService';\r\nimport {displayErrorString} from '../api-utilities/api-calls';\r\nimport { store } from '../redux/store';\r\nimport { updateReduxAction } from '../redux/actions';\r\nimport {DrawingScreen, DrawingViewType} from '../api-utilities/enums';\r\nimport { getStringId } from '../api-utilities/formatting';\r\n\r\nconst apibase = process.env.REACT_APP_CLIENT_API;\r\n\r\nexport async function getAllPoolValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetAllPoolValues\", projectId, unitId);\r\n}\r\nexport async function getUnitType(projectId: number, unitId: number){\r\n return await callGetUnitType(\"readapi/GetUnitType\", projectId, unitId);\r\n}\r\nexport async function getConfigInputsAllValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetConfigInputsAllValues\", projectId, unitId);\r\n}\r\nexport async function getInletOutletValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetInletOutletValues\", projectId, unitId);\r\n}\r\nexport async function getTempsAndSystemValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetTempsAndSystemValues\", projectId, unitId);\r\n}\r\nexport async function getCoilInputValues(projectId: number, unitId:number, componentName: string) {\r\n return await callGetEndpoint(`readapi/GetCoilInputValues/${componentName}`, projectId, unitId);\r\n}\r\n// export async function getAllCoilInputValues(projectId: number, unitId:number) {\r\n// return await callGetEndpoint(`readapi/GetAllCoilInputValues`, projectId, unitId);\r\n// }\r\nexport async function getRefrigerationInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetRefrigerationInputValues\", projectId, unitId);\r\n}\r\nexport async function getFanInputValues(projectId: number, unitId:number, componentName: string) {\r\n return await callGetEndpoint(`readapi/GetFanInputValues/${componentName}`, projectId, unitId);\r\n}\r\n// export async function getAllFanInputValues(projectId: number, unitId:number) {\r\n// return await callGetEndpoint(`readapi/GetAllFanInputValues`, projectId, unitId);\r\n// }\r\nexport async function getFilterInputValues(projectId: number, unitId:number, componentName: string) {\r\n return await callGetEndpoint(`readapi/GetFilterInputValues/${componentName}`, projectId, unitId);\r\n}\r\n// export async function getHeatWheelInputValues(projectId: number, unitId:number) {\r\n// return await callGetEndpoint(\"readapi/GetHeatWheelInputValues\", projectId, unitId);\r\n// }\r\nexport async function getPlateHeatExchangerInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetPlateHeatExchangerInputValues\", projectId, unitId);\r\n}\r\n// export async function getHumidifierManifoldInputValues(projectId: number, unitId:number, componentName: string) {\r\n// return await callGetEndpoint(`readapi/GetHumidifierManifoldInputValues/${componentName}`, projectId, unitId);\r\n// }\r\nexport async function getSoundAttenuatorInputValues(projectId: number, unitId:number, componentName: string) {\r\n return await callGetEndpoint(`readapi/GetSoundAttenuatorInputValues/${componentName}`, projectId, unitId);\r\n}\r\nexport async function getIndirectFiredFurnaceInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetIndirectFiredFurnaceInputValues\", projectId, unitId);\r\n}\r\nexport async function getControlsInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetControlsInputValues\", projectId, unitId);\r\n}\r\nexport async function getBMSInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetBMSInputValues\", projectId, unitId);\r\n}\r\nexport async function getElectricalInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetElectricalInputValues\", projectId, unitId);\r\n}\r\nexport async function getUnitCabinetInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetUnitCabinetInputValues\", projectId, unitId);\r\n}\r\nexport async function getWarrantyInputValues(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"readapi/GetWarrantyInputValues\", projectId, unitId);\r\n}\r\n //ClientAPI will check the \"NeedsRecalcLevel\" on the Unit vertex and only run the appropriate calculations\r\n //Note: I'm not using callGetEndpoint here because I don't want it displaying the default red error box when hasError:true\r\n export async function runPerformanceCalcs(projectId: number, unitId:number) {\r\n let targetEndpoint = \"writeapi/runPerformanceCalculations\";\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${projIdStr}/${unitIdStr}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n if (result.status === 200) {\r\n const data = await result.json();\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", targetEndpoint);\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\n//This is called by the save button on toolbar.\r\nexport async function setReCalcLevel(projectId:string, unitId:string, recalcLevel:string){\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + `/writeapi/setNeedsReCalcLevel/${projectId}/${unitId}/${recalcLevel}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n//This is called by the save button on toolbar.\r\nexport async function runFullUnitStructureRebuild(projectId:string, unitId:string){\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(apibase + `/writeapi/runFullUnitStructureRebuild/${projectId}/${unitId}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\nexport async function getComponentList(projectId: number, unitId:number) {\r\n return await callGetEndpoint(\"dataapi/getComponentList\", projectId, unitId);\r\n}\r\n//Use this method to get any drawing (not schematic) for the UI only.\r\nexport async function getUnitDrawing(routeParams: any, viewType: DrawingViewType, uiScreen: DrawingScreen, completeData:string) {\r\n const { unitId, projectId } = routeParams;\r\n const drawingRequest = {\r\n ProjectId: projectId,\r\n UnitId: unitId,\r\n View: viewType,\r\n Type: uiScreen,\r\n CompleteData: completeData\r\n }\r\n return await callPostEndpoint(\"readapi/GetUnitDrawing\", drawingRequest);\r\n}\r\nexport async function getInletOutletSizingDrawing(routeParams: any, selectedConnection: string, completeData: any){\r\n const { unitId, projectId } = routeParams;\r\n const inletOutletSizingSchematicRequest = {\r\n ProjectId: projectId,\r\n UnitId: unitId,\r\n SelectedConnection: selectedConnection,\r\n CompleteData: completeData\r\n }\r\n return await callPostEndpoint(\"readapi/GetInletOutletSizingSchematicSvg\", inletOutletSizingSchematicRequest);\r\n}\r\nexport async function callGetUnitType(targetEndpoint: string, projectId: number, unitId:number){\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${projIdStr}/${unitIdStr}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n if (result.status === 200) {\r\n const data = await result.text();\r\n //Error notifications are displayed on individual pages.\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", targetEndpoint);\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n } \r\n}\r\n\r\n//For all GET endpoints that include projectId and unitId\r\nexport async function callGetEndpoint(targetEndpoint: string, projectId: number, unitId:number) {\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${projIdStr}/${unitIdStr}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n if (result.status === 200) {\r\n const data = await result.json();\r\n //Error notifications are displayed on individual pages.\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", targetEndpoint);\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\n\r\n//For all GET endpoints that don't include the unitId\r\nexport async function callGetEndpoint2(targetEndpoint: string, projectId: number) {\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${projIdStr}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n if (result.status === 200) {\r\n const data = await result.json();\r\n //Error notifications are displayed on individual pages.\r\n return data;\r\n }\r\n else{\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\n\r\nexport async function jobSearch(targetEndpoint: string, searchText: string) {\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${searchText}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n if (result.status === 200) {\r\n const data = await result.json();\r\n //Error notifications are displayed on individual pages.\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", targetEndpoint);\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\nexport async function jobSearchByStatusAndName(targetEndpoint: string, jobStatus: string, searchText: string) {\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(`${apibase}/${targetEndpoint}/${jobStatus}?search=${searchText}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n \r\n if (result.status === 200) {\r\n const data = await result.json();\r\n //Error notifications are displayed on individual pages.\r\n return data;\r\n }\r\n else{\r\n displayErrorString(\"Requst failed\", targetEndpoint);\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\nexport async function testUpdateProject(){\r\n const token = await getAuthToken();\r\n\r\n const editedProjectRequest = {\r\n projectName: \"test\",\r\n projectId:\"proj-7\"\r\n };\r\n const result = await fetch(apibase + '/dataapi/updateProject', {\r\n method: 'post',\r\n body: JSON.stringify(editedProjectRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //result.json is our expected json object.\r\n //result.text is how error messages come in.\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\n\r\n\r\nexport async function getLayoutSchematicSVG(projectId: number, unitId: number) {\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n //if(token != ''){\r\n const result = await fetch(`${apibase}/readapi/GetLayoutSchematicSvg/${projIdStr}/${unitIdStr}`\r\n , {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n return await result.json();\r\n }\r\n else{\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\n\r\n// export async function getConnectionSchematicSvg(projectId: number, unitId: number){\r\n// const token = await getAuthToken();\r\n// let projIdStr = getStringId('project', projectId);\r\n// let unitIdStr = getStringId('unit', unitId);\r\n// //if (token != '') {\r\n// const result = await fetch(`${apibase}/readapi/GetConnectionSchematicSvg/${projIdStr}/${unitIdStr}`,\r\n// {\r\n// method: 'get',\r\n// headers: {Authorization: `Bearer ${token}`}\r\n// });\r\n\r\n// if (result.status === 200) {\r\n// const data = await result.json();\r\n// if (data.hasError) {\r\n// //do we want to show anything if there is an error?\r\n// }\r\n// return data;\r\n// }\r\n// else{\r\n// return {hasError:true, errorMessage: \"Request failed.\"};\r\n// }\r\n// }\r\n//Standard method for updating any field.\r\n//Each component needs to specify its targetVertex (ChilledWaterCoilInputs, HotWaterCoilInputs, etc.)\r\nexport async function updateInputField(endpoint:string, projectId: number, unitId: number, fieldName:string, newValue:string, targetVertex: string) {\r\n //For now we just have every \"component\" field trigger a recalc. We can get more granular later.\r\n store.dispatch(updateReduxAction('UPDATE_OPTIMIZE_DESIGN', {showRecalcButton: true})); \r\n\r\n //Update redux to invalidate the unit price\r\n store.dispatch(updateReduxAction('UPDATE_PRICING', { priceNeedsUpdate: true }));\r\n\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const fieldUpdateRequest = {\r\n projectId: projIdStr,\r\n unitId: unitIdStr,\r\n fieldName: fieldName,\r\n newValue: newValue,\r\n targetVertex: targetVertex\r\n };\r\n return await callPostEndpoint(`writeapi/${endpoint}`, fieldUpdateRequest);\r\n}\r\nexport async function runPoolCalculations(projectId: number, unitId: number){\r\n\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId); \r\n\r\n const token = await getAuthToken();\r\n\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n\r\n const result = await fetch(`${apibase}/writeapi/runPoolCalculations/${projIdStr}/${unitIdStr}`,\r\n {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n return response;\r\n}\r\nexport async function runPoolSpaceValidations(projectId: number, unitId: number){\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const result = await fetch(`${apibase}/readapi/GetPoolSpaceValidations/${projIdStr}/${unitIdStr}`\r\n , {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n return await result.json();\r\n }\r\n else{\r\n return {hasError:true, errorMessage: \"Request failed.\"};\r\n }\r\n}\r\nexport async function deleteIndividualPool(projectId: number, unitId: number, poolIndex: number){\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const addPoolRequest = {\r\n projectId: projIdStr,\r\n unitId: unitIdStr,\r\n poolIndex: poolIndex\r\n };\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(`${apibase}/writeapi/deleteIndividualPool`, {\r\n method: 'post',\r\n body: JSON.stringify(addPoolRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //success: data will be in result.json\r\n //error: error message will be in result.text\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n return response; \r\n}\r\nexport async function addIndividualPool(projectId: number, unitId: number){\r\n \r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const addPoolRequest = {\r\n projectId: projIdStr,\r\n unitId: unitIdStr,\r\n };\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: true }));\r\n const token = await getAuthToken();\r\n\r\n const result = await fetch(`${apibase}/writeapi/addIndividualPool`, {\r\n method: 'post',\r\n body: JSON.stringify(addPoolRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n\r\n //success: data will be in result.json\r\n //error: error message will be in result.text\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n store.dispatch(updateReduxAction('UPDATE_DISPLAY', { showLoader: false }));\r\n return response; \r\n}\r\n\r\n export async function callPostEndpoint(targetEndpoint:string, requestObject:any) {\r\n const token = await getAuthToken();\r\n\r\n try{\r\n const result = await fetch(`${apibase}/${targetEndpoint}`, {\r\n method: 'post',\r\n body: JSON.stringify(requestObject),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n \r\n //success: data will be in result.json\r\n //error: error message will be in result.text\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n\r\n return response; \r\n }\r\n catch(error:any){\r\n let response = {\r\n success:false,\r\n data: error.toString()\r\n }\r\n return response;\r\n }\r\n }","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { getRepsByOfficeId } from \"../../api-calls/projectDataService\";\r\nimport \"../../css/ProjectModal.scss\";\r\nimport { ProjectStatusFilterBy } from \"../../interfaces/interfaces\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\nimport { addNotification } from \"../../api-utilities/notification-tools\";\r\nimport { callPostEndpoint } from \"../../api-calls/readApiService\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n reduxProjectManagement: any;\r\n}\r\n// local state\r\ninterface IState {\r\n individualErrors: any[];\r\n searchByEmail: string;\r\n showResults: boolean;\r\n enableTransfer:boolean;\r\n userList: any[];\r\n specmateJobCount: any;\r\n showSpinner: boolean;\r\n}\r\n\r\nclass TransferProjectModal extends React.Component {\r\n public state: IState = {\r\n individualErrors: [],\r\n searchByEmail: \"\",\r\n showResults: false,\r\n enableTransfer:false,\r\n userList: [],\r\n specmateJobCount: null, \r\n showSpinner: false\r\n };\r\n\r\n \r\n private searchUsersKeyDown(e: React.KeyboardEvent) {\r\n if (e.key === \"Enter\") {\r\n this.searchUsers();\r\n }\r\n }\r\n private async searchUsers() {\r\n if (this.state.searchByEmail !== \"\") {\r\n this.setState({showResults:false, showSpinner:true});\r\n let request = {\r\n email: this.state.searchByEmail\r\n };\r\n let result = await callPostEndpoint(\"dataapi/searchUsersByEmail\", request);\r\n if (result.success) {\r\n //console.log(result.data);\r\n if(result.data.hasError){\r\n const notification = {\r\n id: \"searchUsersError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
SearchUsers {result.data.errorMessage}
\r\n };\r\n addNotification(notification);\r\n\r\n this.setState({ showSpinner:false,\r\n showResults: false, \r\n enableTransfer:false, \r\n userList: [], \r\n specmateJobCount: null });\r\n }\r\n else{\r\n let enableTransfer = result.data.userList.length == 1 ? true : false;\r\n this.setState({ showSpinner:false,\r\n showResults: true, \r\n enableTransfer:enableTransfer, \r\n userList: result.data.userList, \r\n specmateJobCount: result.data.specmateJobCount });\r\n }\r\n }\r\n else{\r\n const notification = {\r\n id: \"searchUsersError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
SearchUsers {result.data}
\r\n };\r\n addNotification(notification);\r\n\r\n this.setState({ showSpinner:false,\r\n showResults: false, \r\n enableTransfer:false, \r\n userList: [], \r\n specmateJobCount: null });\r\n }\r\n } \r\n } \r\n\r\n private getUserList(){\r\n return this.state.userList.map((item: any, index: number) => (\r\n
{this.state.userList[0].firstName} {this.state.userList[0].lastName}
\r\n ));\r\n }\r\n\r\n //This will trigger the componentDidUpdate method on ProjectManagement.tsx\r\n private userResponse(response: string) {\r\n this.props.updateRedux(\"UPDATE_MODALS\", { showModal: false, userResponse: response });\r\n if (response === \"ok\" && this.state.userList.length == 1) {\r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", {\r\n selectedUserId: this.state.userList[0].loginId\r\n });\r\n }\r\n if (response === \"cancel\") {\r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", { selectedUserId: \"\" });\r\n }\r\n }\r\n //------------------------------------------------------------------------------\r\n public render() {\r\n let userList = this.getUserList();\r\n return (\r\n
\r\n
Transfer Job
\r\n\r\n
\r\n
\r\n Find User:\r\n this.setState({ searchByEmail: event.currentTarget.value, showResults: false, enableTransfer:false, showSpinner:false })}\r\n onKeyDown={(event) => this.searchUsersKeyDown(event)}\r\n />\r\n
this.searchUsers()}>\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n {this.state.showResults ? (\r\n
\r\n {this.state.userList.length == 0 ? (\r\n <>\r\n
\r\n
Not Found
\r\n
\r\n
\r\n
\r\n
{this.state.searchByEmail}
\r\n
\r\n
This user was not found in Specmate. Users must log into Specmate at least once to create an account.
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n ) : null}\r\n\r\n {this.state.userList.length == 1 ? (\r\n <>\r\n
\r\n
Found
\r\n
\r\n
\r\n
\r\n
{this.state.userList[0].firstName} {this.state.userList[0].lastName}
\r\n
{this.state.searchByEmail}
\r\n
Specmate Jobs: {this.state.specmateJobCount}
\r\n
\r\n
\r\n Warning: Job will be transferred to {this.state.userList[0].firstName} {this.state.userList[0].lastName}. \r\n You will no longer have access to it in Specmate.\r\n {this.state.individualErrors}\r\n
\r\n \r\n ) : null}\r\n\r\n {this.state.userList.length > 1 ? (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Duplicate user records found
\r\n {userList}\r\n
\r\n
\r\n Multiple user records were found matching the same email address. Please contact Innovent to remove the duplicates.\r\n {this.state.individualErrors}\r\n
\r\n \r\n ) : null}\r\n
\r\n ): null}\r\n\r\n\r\n {this.state.enableTransfer ? (\r\n \r\n
\r\n
this.userResponse(\"ok\")}>\r\n Transfer\r\n
\r\n \r\n
this.userResponse(\"cancel\")}>\r\n Cancel\r\n
\r\n
\r\n \r\n ) : (\r\n <>\r\n {this.state.showSpinner ? (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n ) : null } \r\n
\r\n
this.userResponse(\"cancel\")}>\r\n Cancel\r\n
\r\n
\r\n \r\n ) }\r\n \r\n
\r\n );\r\n }\r\n\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxProjectManagement: state.reduxProjectManagement,\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(TransferProjectModal);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport ModalPopup from \"./ModalPopup\";\r\nimport ProjectModal from \"./ProjectModal\";\r\nimport UnitCopyModal from \"./UnitCopyModal\";\r\nimport ProjectCopyModal from \"./ProjectCopyModal\";\r\nimport FanCurveModal from \"./FanCurveModal\";\r\nimport FanSoundDataModal from \"./FanSoundDataModal\";\r\nimport ContactUsModal from \"./ContactUsModal\";\r\nimport RefrigerationLocationModal from \"./RefrigerationLocationModal\";\r\nimport TransferProjectModal from \"./TransferProjectModal\";\r\nimport { resetReduxModals } from \"../../utilities/helpers\";\r\nimport \"../../css/Modals.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n reduxModals: any;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\n//This container covers the whole screen and has the black semi-transparent background.\r\n//modalType: indicates which modal box to display in the middle of the screen.\r\nclass ModalContainer extends React.Component {\r\n private getModal() {\r\n if (this.props.reduxModals.modalType === \"ModalPopup\") {\r\n return ;\r\n }\r\n //No longer used. Saved in case we go back to selecting unit type via modal.\r\n // if (this.props.reduxModals.modalType === 'UnitTypeModal') {\r\n // return ;\r\n // }\r\n if (this.props.reduxModals.modalType === \"ProjectModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"UnitCopyModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"ProjectCopyModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"FanCurveModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"FanSoundDataModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"ContactUsModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"RefrigerationLocationModal\") {\r\n return ;\r\n }\r\n if (this.props.reduxModals.modalType === \"TransferProjectModal\") {\r\n return ;\r\n }\r\n }\r\n\r\n //modal-click-target is the black background, so the user can click anywhere on screen outside of\r\n //the modal, and it will close & reset.\r\n public render() {\r\n const modalCSS = this.props.reduxModals.showModal ? \"modal-container\" : \"app-display-none\";\r\n\r\n return (\r\n
\r\n
{this.props.reduxModals.showModal ? this.getModal() : null}
\r\n
resetReduxModals()}>
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ModalContainer);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { getUnitType } from \"../../api-calls/readApiService\";\r\nimport { Link, match, withRouter } from \"react-router-dom\";\r\nimport \"../../css/TopMenu.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n reduxMenus: any;\r\n match: match;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass TopMenu extends React.Component {\r\n //public state: IState = { };\r\n async componentDidMount() {\r\n if (this.props.match) {\r\n const { projectId, unitId } = this.props.match.params;\r\n if (projectId && unitId) {\r\n let unitType = await getUnitType(projectId, unitId);\r\n\r\n if (unitType === \"Pool\") {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { showPoolInputs: true });\r\n } else {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { showPoolInputs: false });\r\n }\r\n }\r\n }\r\n }\r\n private getLinkUrl(target: string) {\r\n if (target === \"design\") {\r\n let newTarget = this.props.reduxMenus.showPoolInputs ? \"design/pools\" : \"design/config\";\r\n target = newTarget;\r\n }\r\n const routeParams = this.props.match.params;\r\n return \"/pid/\" + routeParams.projectId + \"/uid/\" + routeParams.unitId + \"/\" + target;\r\n }\r\n private getBaseUrl() {\r\n const routeParams = this.props.match.params;\r\n return \"/pid/\" + routeParams.projectId + \"/uid/\" + routeParams.unitId;\r\n }\r\n\r\n private createMenuLink(topMenuIndex: number, urlFragment: string, label: string) {\r\n const baseUrl = urlFragment == \"/project\" ? \"\" : this.getBaseUrl(); //don't include baseUrl for job files page\r\n const isActive = this.props.reduxMenus.topMenu.activeItem == topMenuIndex;\r\n const isPrevious = topMenuIndex == this.props.reduxMenus.topMenu.activeItem - 1; //Don't show arrow tip if menuItem is immediately previous to the selected one\r\n return (\r\n \r\n {isActive ?
: null}\r\n
{label}
\r\n {isPrevious ? null :
}\r\n \r\n );\r\n }\r\n public render() {\r\n const active = this.props.reduxMenus.topMenu.activeItem;\r\n\r\n return (\r\n
\r\n {this.createMenuLink(1, \"/project\", \"Job Files\")}\r\n {this.createMenuLink(2, \"/design/config\", \"Create Design\")}\r\n {this.createMenuLink(3, \"/drawing/drawing\", \"Drawings\")}\r\n {this.createMenuLink(4, \"/layout/doors\", \"Fine Tune Design\")}\r\n {this.createMenuLink(5, \"/spec/controls\", \"Select Options\")}\r\n {this.createMenuLink(6, \"/outputs/pdfoutputs\", \"Outputs\")}\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(TopMenu));\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, match } from 'react-router-dom'; //needed for 'location' object and 'match.params'\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { Link } from 'react-router-dom';\r\nimport '../../css/DesignSubMenu.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n location: any;\r\n match: match;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass DesignSubMenu extends React.Component {\r\n //TODO: animate underlining\r\n\r\n private createMenuLink(urlFragment: string, label: string) {\r\n //Make this the active(underlined) link if it matches the current route\r\n const isActive = this.isCurrentRoute(urlFragment);\r\n const baseUrl = this.getBaseUrl();\r\n return (\r\n \r\n
{label}
\r\n \r\n );\r\n }\r\n private isCurrentRoute(urlFragment: string) {\r\n return this.props.location.pathname.includes(urlFragment);\r\n }\r\n\r\n private getBaseUrl() {\r\n const routeParams = this.props.match.params;\r\n return '/pid/' + routeParams.projectId + '/uid/' + routeParams.unitId;\r\n }\r\n private getNextButton() {\r\n let showPools = this.props.reduxMenus.showPoolInputs;\r\n let destination = '';\r\n\r\n if (this.isCurrentRoute('/design/unittype') && !showPools ) {\r\n destination = '/design/config';\r\n }\r\n if (this.isCurrentRoute('/design/unittype') && showPools ) {\r\n destination = '/design/pools';\r\n }\r\n if (this.isCurrentRoute('/design/pools') && showPools) {\r\n destination = '/design/config';\r\n }\r\n if (this.isCurrentRoute('/design/config')) {\r\n destination = '/design/options';\r\n }\r\n if (this.isCurrentRoute('/design/options')) {\r\n destination = '/design/system';\r\n }\r\n if (this.isCurrentRoute('/design/system')) {\r\n destination = '/design/performance';\r\n }\r\n if (this.isCurrentRoute('/design/performance')) {\r\n destination = '/drawing/drawing';\r\n }\r\n\r\n const baseUrl = this.getBaseUrl();\r\n\r\n return (\r\n \r\n
Next >
\r\n \r\n );\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n
\r\n {this.createMenuLink('/design/unittype', 'Unit Type')}\r\n {this.props.reduxMenus.showPoolInputs ? this.createMenuLink('/design/pools', 'Pool Space'):null}\r\n {this.createMenuLink('/design/config', 'Configuration Inputs')}\r\n {this.createMenuLink('/design/options', 'Inlet & Outlet')}\r\n {this.createMenuLink('/design/system', 'Temps & System')}\r\n {this.createMenuLink('/design/performance', 'Optimize Design')}\r\n {this.getNextButton()}\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(DesignSubMenu));\r\n","import * as React from \"react\";\r\n\r\n//Get validation error div to display below the affected field\r\nexport function getValidationError(validationErrors: any[], fieldName: string, cssClass: string) {\r\n if (validationErrors) {\r\n const error = validationErrors.find((x: any) => x.fieldName.toLowerCase() === fieldName.toLowerCase() && x.suppressErrorInUi !== true);\r\n if (error) {\r\n return
{error.errorMessage}
;\r\n }\r\n }\r\n return null;\r\n}\r\nexport function getPoolValidationError(validationErrors: any[], fieldName: string, poolIndex: number, cssClass: string) {\r\n if (validationErrors) {\r\n const error = validationErrors.find((x: any) => x.fieldName.toLowerCase() === fieldName.toLowerCase() && x.poolIndex === poolIndex && x.suppressErrorInUi !== true);\r\n if (error) {\r\n return
{error.errorMessage}
;\r\n }\r\n }\r\n return null;\r\n}\r\nexport function checkForErrors(validationErrors: any[], fieldName: string) {\r\n if (validationErrors) {\r\n const hasError = validationErrors.find((x: any) => x.fieldName.toLowerCase() === fieldName.toLowerCase() && x.suppressErrorInUi !== true);\r\n return hasError ? true : false;\r\n }\r\n return false;\r\n}\r\n\r\nexport function getFilteredValidationErrors(validationErrors: any[], fieldName: string) {\r\n if (!validationErrors) {\r\n return [];\r\n }\r\n //make a copy of error messages collection from state\r\n let errorsArray = [...validationErrors];\r\n //Make a new array that only includes items not matching the given fieldName\r\n let errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== fieldName.toLowerCase());\r\n\r\n //----- Special case for UnitLocation: also need to remove any validation error on the CoolingType field -----\r\n if (fieldName.toLowerCase() === \"unitlocation\") {\r\n errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== \"coolingtype\");\r\n }\r\n return errors;\r\n}\r\nexport function getFilteredPoolValidationErrors(validationErrors: any[], fieldName: string, poolIndex: number) {\r\n if (!validationErrors) {\r\n return [];\r\n }\r\n //make a copy of error messages collection from state\r\n let errorsArray = [...validationErrors];\r\n //Make a new array that only includes items not matching the given fieldName\r\n let errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== fieldName.toLowerCase() && item.poolIndex === poolIndex);\r\n\r\n //----- Special case for UnitLocation: also need to remove any validation error on the CoolingType field -----\r\n if (fieldName.toLowerCase() === \"unitlocation\") {\r\n errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== \"coolingtype\");\r\n }\r\n return errors;\r\n}\r\n//When receiving a response from the server, we want to:\r\n//1. Add any new validation messages to state\r\n//2. Preserve any previous validation messages that were already in state\r\n//3. Replace any validation messages that have the same name but a new message coming from the server\r\nexport function getNewValidationErrorsList(validationErrors: any[], newValidationErrors: any[]) {\r\n //make a copy of previous error messages collection from state\r\n let currentErrorsArray = [...validationErrors];\r\n\r\n //newValidationErrors is a list of new errors that came from the server\r\n\r\n //now loop through existing(previous) errors, and add back to the list if there's not already a new one with the same name\r\n for (const error of currentErrorsArray) {\r\n const exists = newValidationErrors.find((x: any) => x.fieldName.toLowerCase() === error.fieldName.toLowerCase());\r\n if (!exists) {\r\n newValidationErrors.push(error);\r\n }\r\n }\r\n return newValidationErrors;\r\n}\r\n\r\n//Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\nexport function getInputCSS(validationErrors: any[], fieldName: string, type: string) {\r\n const hasError = checkForErrors(validationErrors, fieldName);\r\n\r\n let className = \"\";\r\n if (type === \"textbox\") {\r\n className = \"input-numeric\";\r\n }\r\n if (type === \"selectbox\") {\r\n className = \"input-select\";\r\n }\r\n if (type === \"accordiontextbox\") {\r\n className = \"accordion-textbox\";\r\n }\r\n if (type === \"accordionselect\") {\r\n className = \"accordion-select\";\r\n }\r\n if (type === \"coilFilterFPMtextbox\") {\r\n className = \"input-numeric-40\";\r\n }\r\n if (type === \"accordiontextbox-50\") {\r\n className = \"input-numeric-50\";\r\n }\r\n if (fieldName === \"coilAndFilterFpmLimit\") {\r\n className = \"input-numeric-40\";\r\n }\r\n if (type === \"casingDimensionTextbox\") {\r\n className = \"input-numeric-100\";\r\n }\r\n if (type === \"spectextbox\") {\r\n className = \"spec-textbox\";\r\n }\r\n if (type === \"poolInput\"){\r\n className = \"pool-input-numeric\";\r\n }\r\n if (type === \"poolInputSmall\"){\r\n className = \"pool-input-numeric-50\";\r\n }\r\n if (type === \"poolSelect\"){\r\n className = \"pool-select\";\r\n }\r\n if (type === \"poolSelectLarge\"){\r\n className = \"pool-select-large\";\r\n }\r\n //If error exists, add the error class\r\n if (hasError) {\r\n className += \" input-error\";\r\n }\r\n return className;\r\n}\r\n\r\nexport function getSelectBoxOptions(dropdownOptions: any[], boxName: any) {\r\n const options = dropdownOptions[boxName];\r\n if (options) {\r\n return options.map((item: any, index: number) => (\r\n \r\n ));\r\n }\r\n return ;\r\n}\r\nexport function getSelectBoxOptionsSingle(dropdownOptions: any[]){\r\n const options = dropdownOptions;\r\n if (options) {\r\n return options.map((item: any, index: number) => (\r\n \r\n ));\r\n }\r\n return ;\r\n}\r\nexport function getNewDropdownList(dropdownOptions: any[], newDropdownOptions: any) {\r\n //Make a copy of the list from state.dropdownOptions\r\n const newState = Object.assign({}, dropdownOptions, {});\r\n\r\n //Update newState with any new values we got from the server\r\n Object.entries(newDropdownOptions).forEach(([key, value]) => {\r\n if (value != null) {\r\n (newState as any)[key] = value;\r\n }\r\n });\r\n return newState;\r\n}\r\n\r\n//Checks whether a checkbox is checked or not\r\n// export function getChecked(property: any) {\r\n// if (property && property.value) {\r\n// return property.value;\r\n// }\r\n// return false;\r\n// }\r\nexport function getChecked(property: any) {\r\n if (typeof property === \"undefined\" || property === null || property == \"false\" || property == false) {\r\n return false;\r\n }\r\n if (property == true || property == \"true\") {\r\n return true;\r\n }\r\n}\r\nexport function convertTubeWallThickness(incomingValue: string){\r\n switch(incomingValue) {\r\n case \"SixteenThousandths\":\r\n return \"0.016\";\r\n case \"TwentyThousandths\":\r\n return \"0.02\";\r\n case \"TwentyFiveThousandths\":\r\n return \"0.025\";\r\n case \"ThirtyFiveThousandths\":\r\n return \"0.035\";\r\n case \"FortyNineThousandths\":\r\n return \"0.049\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\nexport function convertFinThickness(incomingValue: string){\r\n switch(incomingValue) {\r\n case \"SixThousandths\":\r\n return \"0.006\";\r\n case \"EightThousandths\":\r\n return \"0.008\";\r\n case \"TenThousandths\":\r\n return \"0.010\";\r\n default:\r\n return \"\";\r\n }\r\n}","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { store } from \"../../redux/store\";\r\nimport { updateReduxAction } from \"../../redux/actions\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getConfigInputsAllValues, updateInputField, callPostEndpoint } from \"../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport \"../../css/ConfigurationInputs.scss\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\nimport { getStringId } from \"../../api-utilities/formatting\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n layoutSvg: string;\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n showSecondaryHeatingToolTip: boolean;\r\n showSecondaryHeatSizingToolTip: boolean;\r\n}\r\n\r\nclass ConfigurationInputs extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n layoutSvg: \"\",\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: [],\r\n showSecondaryHeatingToolTip: false,\r\n showSecondaryHeatSizingToolTip: false\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await getConfigInputsAllValues(projectId, unitId);\r\n \r\n if (result.hasError){\r\n const notification = {\r\n id: \"configInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
getConfigInputsAllValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n this.setState({\r\n userInputs: result.uiDataContainer?.primaryInputs,\r\n displayFields: result.uiDataContainer?.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.poolPrerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.poolPrerequisiteErrors });\r\n }\r\n else {\r\n this.getLayoutSchematic(result.uiDataContainer.primaryInputs);\r\n }\r\n }\r\n\r\n private async getLayoutSchematic(primaryInputs: any) {\r\n const { projectId, unitId } = this.props.match.params;\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n let request = {\r\n PrimaryInputs: primaryInputs,\r\n ProjectId: projIdStr,\r\n UnitId: unitIdStr\r\n }\r\n if (primaryInputs != null) {\r\n let result = await callPostEndpoint(\"readapi/GetLayoutSchematicSvg\", request);\r\n if (result.success) {\r\n this.setState({ layoutSvg: result.data.schematicSvg });\r\n }\r\n }\r\n }\r\n\r\n // private async getLayoutSchematic(projectId: any, unitId: any) {\r\n // if (projectId != null && unitId != null) {\r\n // let svgData = await getLayoutSchematicSVG(projectId, unitId);\r\n // if (!svgData.hasError) {\r\n // this.setState({ layoutSvg: svgData.schematicSvg });\r\n // }\r\n // }\r\n // }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName);\r\n //Special case: If airHandlerType is changed, need to remove validations for Return Air\r\n //because diffrent validations apply depending on airHandlerType selected. Mixing box validations\r\n //are diffrent from economizer validations so when switching between the two, we should remove\r\n //the validation messages that were there before the change.\r\n if (fieldName === \"airflowArrangement\") {\r\n this.removeValidationError(\"ReturnAirAltitudeOnlyAcfm\");\r\n }\r\n let result = await updateInputField(\"updateConfigInputs\", projectId, unitId, fieldName, newValue, \"PrimaryInputs\");\r\n\r\n if (result.success) {\r\n if (fieldName === \"unitType\"){\r\n if (newValue === \"Pool\"){\r\n this.props.updateRedux('UPDATE_MENUS', { showPoolInputs: true});\r\n }\r\n else {\r\n this.props.updateRedux('UPDATE_MENUS', { showPoolInputs: false});\r\n }\r\n }\r\n if (result.data.uiDataContainer != null) {\r\n //Remove prior validation messages for return, supply, outside, and exhaust air.\r\n //New validation messages will be populated from the validations passed in.\r\n this.checkReturnSupplyOutsideExhaustValidations(result.data.uiDataContainer);\r\n }\r\n\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n if (fieldName === \"unitTag\"){\r\n //Notify projectHeader that the title has changed.\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { headerTitleChanged: true }));\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.primaryInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n //update the schematic drawing\r\n this.getLayoutSchematic(result.data.uiDataContainer.primaryInputs);\r\n \r\n //check for coolingType warnings\r\n this.checkCoolingSelection(result.data.uiDataContainer);\r\n //check for CFM limit warning\r\n this.checkCfmLimitWarning(result.data.uiDataContainer);\r\n }\r\n }\r\n }\r\n //Return, Supply, Outside, and Exhaust air have validations run on them when:\r\n //1. Their value is changed.\r\n //2. After any of these fields get auto-calculated.\r\n //3. When you first enter the page.\r\n //Note: Most validations set their value to null and do not get removed here because of the null check.\r\n //If the values are not null, remove the previous errors.\r\n public checkReturnSupplyOutsideExhaustValidations(uiDataContainer: any) {\r\n if (\r\n uiDataContainer.primaryInputs.returnAirAltitudeOnlyAcfm !== null &&\r\n this.state.validationErrors.find((x: any) => x.fieldName === \"ReturnAirAltitudeOnlyAcfm\")\r\n ) {\r\n this.removeValidationError(\"ReturnAirAltitudeOnlyAcfm\");\r\n }\r\n if (\r\n uiDataContainer.primaryInputs.supplyAirAltitudeOnlyAcfmUserValue !== null &&\r\n this.state.validationErrors.find((x: any) => x.fieldName === \"SupplyAirAltitudeOnlyAcfmUserValue\")\r\n ) {\r\n this.removeValidationError(\"SupplyAirAltitudeOnlyAcfmUserValue\");\r\n }\r\n if (\r\n uiDataContainer.primaryInputs.outsideAirAltitudeOnlyAcfmUserValue !== null &&\r\n this.state.validationErrors.find((x: any) => x.fieldName === \"OutsideAirAltitudeOnlyAcfmUserValue\")\r\n ) {\r\n this.removeValidationError(\"OutsideAirAltitudeOnlyAcfmUserValue\");\r\n }\r\n if (uiDataContainer.primaryInputs.exhaustAirAltitudeOnlyAcfmUserValue !== null) {\r\n this.removeValidationError(\"ExhaustAirAltitudeOnlyAcfmUserValue\");\r\n }\r\n }\r\n\r\n private checkCfmLimitWarning(uiDataContainer: any) {\r\n removeNotification(\"cfmlimit\"); //clear previous notifications\r\n\r\n if (uiDataContainer && uiDataContainer.displayFields) {\r\n const fields = uiDataContainer.displayFields;\r\n if (fields.showCfmLimitWarning) {\r\n this.showCfmLimitInfoBox();\r\n }\r\n }\r\n }\r\n private showCfmLimitInfoBox() {\r\n const notification = {\r\n id: \"cfmlimit\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content: (\r\n
\r\n {\"The entered CFMs may exceed the limits of what is possible or shippable. This would be seen on the Optimize Design screen.\"}\r\n
\r\n )\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n //Check if we should show the coolingType warning box\r\n private checkCoolingSelection(uiDataContainer: any) {\r\n removeNotification(\"coolingInfoBox\"); //clear previous notifications\r\n\r\n if (uiDataContainer && uiDataContainer.displayFields) {\r\n const fields = uiDataContainer.displayFields;\r\n if (fields.showDxSplitWarning) {\r\n this.showCoolingInfoBox(\r\n \"Unit does not include compressors or a condensing section and shall require a separate remote air cooled condensing unit. Contact Innovent sales for a quote on ACCU unit or provide by others.\"\r\n );\r\n }\r\n if (fields.showDxSplitHGRWarning) {\r\n this.showCoolingInfoBox(\r\n \"Unit includes compressors but not a condensing section and shall require a separate remote air cooled condenser. Contact Innovent sales for a quote on air cooled condenser or provide by others.\"\r\n );\r\n }\r\n }\r\n }\r\n private showCoolingInfoBox(displayMessage: string) {\r\n const notification = {\r\n id: \"coolingInfoBox\",\r\n notificationType: \"info\",\r\n title: \"Info\",\r\n content:
{displayMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
\r\n
{item.source}
\r\n
{item.errorMessage}
\r\n
\r\n ));\r\n }\r\n return null;\r\n }\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
\r\n
Warning
\r\n
Certain configuration fields cannot be calculated due to missing/invalid fields:
\r\n
\r\n
Page
\r\n
Field
\r\n
\r\n {this.getPrerequisiteErrors()}\r\n
\r\n\r\n
Please revisit these page(s) and fix any invalid inputs.
\r\n
\r\n );\r\n }\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
Unit Basics
\r\n
\r\n
\r\n
Unit Type
\r\n
\r\n this.saveInputValue(\"unitType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"unitTypeOptions\")}\r\n \r\n *\r\n
\r\n {this.getValidationError(\"unitType\")}\r\n
\r\n\r\n
\r\n
Unit Tag
\r\n
\r\n this.updateTextboxValue(\"unitTag\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"unitTag\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"unitTag\")}\r\n
\r\n\r\n
\r\n
Unit Quantity
\r\n
\r\n this.updateTextboxValue(\"unitQuantity\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"unitQuantity\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"unitQuantity\")}\r\n
\r\n\r\n {displayFields.showEnergyRecoveryDevice ? (\r\n
\r\n
Energy Recovery Device
\r\n
\r\n this.saveInputValue(\"energyRecoveryDeviceType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"energyRecoveryDeviceOptions\")}\r\n \r\n *\r\n
\r\n {this.getValidationError(\"energyRecoveryDeviceType\")}\r\n
\r\n ) : null}\r\n\r\n
\r\n
Unit Location
\r\n
\r\n this.saveInputValue(\"unitLocationType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"unitLocationOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"unitLocationType\")}\r\n
\r\n
\r\n
Application
\r\n
\r\n {displayFields.showAirflowArrangement ? (\r\n
\r\n
Airflow Arrangement
\r\n
\r\n this.saveInputValue(\"airflowArrangementType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"airflowArrangementOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"airflowArrangementType\")}\r\n
\r\n ) : null}\r\n
\r\n
Airflow Control
\r\n
\r\n this.saveInputValue(\"airflowSystem\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"airVolumeControlOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"airflowSystem\")}\r\n
\r\n\r\n
\r\n
Economizer
\r\n
\r\n this.saveInputValue(\"economizer\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"economizerOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"economizer\")}\r\n
\r\n\r\n
\r\n
Night Setback
\r\n
\r\n this.saveInputValue(\"nightSetback\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"nightSetbackOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"nightSetback\")}\r\n
\r\n
\r\n\r\n
Heat/Cool Airflow Rate
\r\n
\r\n\r\n {displayFields.isPoolUnit ? (\r\n <>\r\n
\r\n
Min Outside Air
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
Max Outside Air
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
Supply Air
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
Return Air
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
Exhaust Air
\r\n
\r\n \r\n
\r\n
\r\n \r\n ): null}\r\n {/* Not Pool Units */}\r\n {displayFields.showOutsideAir && !displayFields.isPoolUnit ? (\r\n
\r\n
Outside Air
\r\n
\r\n this.updateTextboxValue(\"outsideAirAltitudeOnlyAcfmUserValue\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideAirAltitudeOnlyAcfmUserValue\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"outsideAirAltitudeOnlyAcfmUserValue\")}\r\n
\r\n ) : null}\r\n {displayFields.showSupplyAndReturnAir && !displayFields.isPoolUnit ? (\r\n <>\r\n
\r\n
Supply Air
\r\n
\r\n this.updateTextboxValue(\"supplyAirAltitudeOnlyAcfmUserValue\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyAirAltitudeOnlyAcfmUserValue\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"supplyAirAltitudeOnlyAcfmUserValue\")}\r\n
\r\n\r\n
\r\n
Return Air
\r\n
\r\n this.updateTextboxValue(\"returnAirAltitudeOnlyAcfm\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnAirAltitudeOnlyAcfm\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"returnAirAltitudeOnlyAcfm\")}\r\n
\r\n \r\n ) : null}\r\n {displayFields.showExhaustAir && !displayFields.isPoolUnit? (\r\n
\r\n
Exhaust Air
\r\n
\r\n this.updateTextboxValue(\"exhaustAirAltitudeOnlyAcfmUserValue\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exhaustAirAltitudeOnlyAcfmUserValue\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"exhaustAirAltitudeOnlyAcfmUserValue\")}\r\n
\r\n ) : null}\r\n
\r\n\r\n {displayFields.showUnitLayoutInputs ? (\r\n <>\r\n
Unit Layout
\r\n
\r\n
\r\n
Air Tunnel Orientation
\r\n
\r\n this.saveInputValue(\"airTunnelOrientationType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"airTunnelOrientationOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"airTunnelOrientationType\")}\r\n
\r\n\r\n
\r\n
Return Air Direction
\r\n
\r\n this.saveInputValue(\"returnAirDirectionType\", event.currentTarget.value)}\r\n disabled={displayFields.returnAirDirectionDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"returnAirDirectionOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"returnAirDirectionType\")}\r\n
\r\n\r\n
\r\n
Supply Tunnel Location
\r\n
\r\n this.saveInputValue(\"supplyTunnelLocationType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"supplyTunnelLocationOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"supplyTunnelLocationType\")}\r\n
\r\n
\r\n \r\n ) : null}\r\n
\r\n
\r\n
\r\n
{this.state.layoutSvg ?
: null}
\r\n\r\n
\r\n
Heating & Cooling
\r\n
\r\n
\r\n
Cooling (incl.HG Reheat)
\r\n
\r\n this.saveInputValue(\"coolingType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"coolingOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"coolingType\")}\r\n
\r\n\r\n
\r\n
Heating
\r\n
\r\n this.saveInputValue(\"heatingType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"heatingOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"heatingType\")}\r\n
\r\n\r\n {displayFields.showCoolHeatSequence ? (\r\n <>\r\n
\r\n
Cool/Heat Order
\r\n
\r\n this.saveInputValue(\"coolHeatSequenceType\", event.currentTarget.value)}\r\n disabled={displayFields.coolHeatSequenceDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"coolHeatSequenceOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"coolHeatSequenceType\")}\r\n
\r\n \r\n ) : null}\r\n\r\n
\r\n
Pre-Heat
\r\n
\r\n this.saveInputValue(\"preHeatType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"preHeatOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"preHeatType\")}\r\n
\r\n\r\n {displayFields.showSecondaryHeating ? (\r\n <>\r\n
\r\n
Secondary Heating
\r\n
\r\n this.saveInputValue(\"secondaryHeating\", event.currentTarget.value)}\r\n disabled={displayFields.disableSecondaryHeating}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"secondaryHeatingOptions\")}\r\n \r\n
\r\n this.showTooltip(\"secondaryHeating\", true)}\r\n onMouseLeave={() => this.showTooltip(\"secondaryHeating\", false)}\r\n >\r\n {this.getTooltipContent(\"secondaryHeating\", this.state.showSecondaryHeatingToolTip)}\r\n {this.getValidationError(\"secondaryHeating\")}\r\n
\r\n \r\n ) : null}\r\n\r\n {displayFields.showSecondaryHeating ? (\r\n <>\r\n
\r\n
Secondary Heat Sizing
\r\n
\r\n this.saveInputValue(\"secondaryHeatSizing\", event.currentTarget.value)}\r\n disabled={displayFields.disableSecondaryHeating}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"secondaryHeatSizingOptions\")}\r\n \r\n
\r\n this.showTooltip(\"secondaryHeatSizing\", true)}\r\n onMouseLeave={() => this.showTooltip(\"secondaryHeatSizing\", false)}\r\n >\r\n {this.getTooltipContent(\"secondaryHeatSizing\", this.state.showSecondaryHeatSizingToolTip)}\r\n {this.getValidationError(\"secondaryHeatSizing\")}\r\n
\r\n \r\n ) : null}\r\n\r\n
\r\n {!displayFields.isPoolUnit ? (\r\n <>\r\n
Other Components
\r\n
\r\n
\r\n
Sound Attenuator
\r\n
\r\n this.saveInputValue(\"soundAttenuatorType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"soundAttenuatorOptions\")}\r\n \r\n {this.getValidationError(\"soundAttenuatorType\")}\r\n
\r\n
\r\n\r\n
\r\n
Humidifier Manifold
\r\n
\r\n this.saveInputValue(\"humidifierManifoldType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"humidifierManifoldOptions\")}\r\n \r\n {this.getValidationError(\"humidifierManifoldType\")}\r\n
\r\n
\r\n
\r\n \r\n ):null}\r\n
\r\n\r\n
\r\n
Filters
\r\n
\r\n
{displayFields.airPrefilterLabel}
\r\n
\r\n this.saveInputValue(\"outsideAirPrefilterType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"outsideAirPrefilterOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"outsideAirPrefilterType\")}\r\n
\r\n\r\n
\r\n
{displayFields.highEfficiencyFilterLabel}
\r\n
\r\n this.saveInputValue(\"outsideAirHighEfficiencyFilterType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"outsideAirHighEfficiencyFilterOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"outsideAirHighEfficiencyFilterType\")}\r\n
\r\n\r\n
\r\n
Supply Air Final Filter
\r\n
\r\n this.saveInputValue(\"supplyAirFinalFilterType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"supplyAirFinalFilterOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"supplyAirFinalFilterType\")}\r\n
\r\n\r\n {displayFields.showReturnAirFilter ? (\r\n
\r\n
Return Air Filter
\r\n
\r\n this.saveInputValue(\"returnAirFilterType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"returnAirFilterOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"returnAirFilterType\")}\r\n
\r\n ) : null}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n private getTooltipContent(fieldName: string, showTooltip: boolean){\r\n let toolTipMessage = \"\";\r\n if (fieldName === \"secondaryHeating\"){\r\n toolTipMessage = \"Secondary heating consists of back-up and/or supplemental heat\";\r\n }\r\n if (fieldName === \"secondaryHeatSizing\"){\r\n return this.getSecondaryHeatSizingMessage(showTooltip);\r\n }\r\n return (\r\n
\r\n
\r\n {toolTipMessage}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n //Show/Hide tooltips on mouseover and mouseleave\r\n private showTooltip(tooltip: any, state: boolean) {\r\n if (tooltip === \"secondaryHeating\") {\r\n this.setState({ showSecondaryHeatingToolTip: state });\r\n }\r\n if (tooltip === \"secondaryHeatSizing\") {\r\n this.setState({ showSecondaryHeatSizingToolTip: state });\r\n }\r\n }\r\n private getSecondaryHeatSizingMessage(showTooltip: boolean){\r\n return (\r\n
\r\n
\r\n
    \r\n
  • Back-up Heat = heat required to handle the entire heating load when the heat pump is not available
  • \r\n
  • Supplemental Heat = heat required to maintain the supply air temperature set point and has ability to run concurrently with refrigeration system in heating mode
  • \r\n
\r\n
\r\n
\r\n );\r\n}\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n //reduxConfigInputs: state.reduxConfigInputs as ConfigurationInputsUI,\r\n //reduxValidation: state.reduxValidation\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ConfigurationInputs);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { getInletOutletValues, updateInputField, callPostEndpoint } from \"../../api-calls/readApiService\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getValidationError, getInputCSS, getNewDropdownList, getNewValidationErrorsList } from \"../../utilities/pageUtils\";\r\nimport \"../../css/ConnectionsOptions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n connectionSvg: string;\r\n}\r\n\r\nclass InletOutlet extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n connectionSvg: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await getInletOutletValues(projectId, unitId);\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"inletOutletInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
getInletOutletValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n this.setState({\r\n userInputs: result.uiDataContainer.primaryInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n this.getConnectionSchematic(result.uiDataContainer.primaryInputs);\r\n }\r\n\r\n private async getConnectionSchematic(primaryInputs: any) {\r\n if (primaryInputs != null) {\r\n let result = await callPostEndpoint(\"readapi/GetConnectionSchematicSvg\", primaryInputs);\r\n if (result.success) {\r\n this.setState({ connectionSvg: result.data.schematicSvg });\r\n }\r\n }\r\n // if (projectId != null && unitId != null) {\r\n // let svgData = await getConnectionSchematicSvg(projectId, unitId);\r\n // if (!svgData.hasError) {\r\n // this.setState({ connectionSvg: svgData.schematicSvg });\r\n // }\r\n // }\r\n }\r\n\r\n public getSelectBoxOptions(boxName: any) {\r\n const options = (this.state.dropdownOptions as any)[boxName];\r\n return options.map((item: any, index: number) => (\r\n \r\n ));\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateInletOutlet\", projectId, unitId, fieldName, newValue, \"PrimaryInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.primaryInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n this.getConnectionSchematic(result.data.uiDataContainer.primaryInputs);\r\n }\r\n }\r\n }\r\n\r\n //Whenever we update a field, we'll remove any previous error, and reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n //Make a new array that only includes items not matching the given fieldName\r\n let errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== fieldName.toLowerCase());\r\n\r\n //Exhaust and Outside air inlets/outlets cannot share the same location if both types are hoods or louvers.\r\n //This error can be triggered by 4 different inputs:outsideairinletlocation, exhaustairoutletlocation, outsideairinlet, exhaustairoutlet\r\n //If we clear the error for 1 of those fields, we need to clear it for the other 3.\r\n //----- Special case for outsideairinletlocation, exhaustairoutletlocation -----\r\n if (fieldName.toLowerCase() === \"outsideairinletlocation\" || fieldName.toLowerCase() === \"exhaustairoutletlocation\") {\r\n errors = errors.filter(\r\n (item: any) => item.fieldName.toLowerCase() !== \"exhaustairoutletlocation\" && item.fieldName.toLowerCase() !== \"outsideairinletlocation\"\r\n );\r\n }\r\n //Return and Outside air inlets/outlets cannot share the same location for ARU units that have mixing box as the airHandlerType.\r\n if (fieldName.toLowerCase() === \"outsideairinletlocation\" || fieldName.toLowerCase() === \"returnairinletlocation\") {\r\n errors = errors.filter(\r\n (item: any) => item.fieldName.toLowerCase() !== \"returnairinletlocation\" && item.fieldName.toLowerCase() !== \"outsideairinletlocation\"\r\n );\r\n }\r\n\r\n //----- Special case for outsideairinlet, exhaustairoutlet -----\r\n if (fieldName.toLowerCase() === \"outsideairinlet\" || fieldName.toLowerCase() === \"exhaustairoutlet\") {\r\n errors = errors.filter(\r\n (item: any) => item.fieldName.toLowerCase() !== \"outsideairinletlocation\" && item.fieldName.toLowerCase() !== \"exhaustairoutletlocation\"\r\n );\r\n }\r\n this.setState({ validationErrors: errors, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n let cssClass = \"validation-err-right\";\r\n if (fieldName === \"outsideAirInletLocation\" || fieldName === \"supplyAirOutletLocation\" || fieldName === \"returnAirInletLocation\" || fieldName === \"exhaustAirOutletLocation\"){\r\n cssClass = \"validation-err-right-inlet-outlet\";\r\n }\r\n return getValidationError(this.state.validationErrors, fieldName, cssClass);\r\n }\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
Air Inlet and Outlet
\r\n\r\n
\r\n
\r\n
Type
\r\n
Location
\r\n
\r\n\r\n
\r\n
\r\n
Outside Air Inlet
\r\n
\r\n this.saveInputValue(\"outsideAirInlet\", event.currentTarget.value)}\r\n disabled={displayFields.outsideAndExhaustOpeningDisabled}\r\n >\r\n {this.getSelectBoxOptions(\"outsideAirInletOptions\")}\r\n \r\n {this.getValidationError(\"outsideAirInlet\")}\r\n
\r\n
\r\n this.saveInputValue(\"outsideAirInletLocation\", event.currentTarget.value)}\r\n >\r\n {this.getSelectBoxOptions(\"outsideAirInletLocationOptions\")}\r\n \r\n
{this.getValidationError(\"outsideAirInletLocation\")}
\r\n
\r\n
\r\n
\r\n
Supply Air Outlet
\r\n
Duct
\r\n
\r\n this.saveInputValue(\"supplyAirOutletLocation\", event.currentTarget.value)}\r\n >\r\n {this.getSelectBoxOptions(\"supplyAirOutletLocationOptions\")}\r\n \r\n
{this.getValidationError(\"supplyAirOutletLocation\")}
\r\n
\r\n
\r\n {displayFields.showReturnAirInlet ? (\r\n
\r\n
Return Air Inlet
\r\n
Duct
\r\n
\r\n this.saveInputValue(\"returnAirInletLocation\", event.currentTarget.value)}\r\n >\r\n {this.getSelectBoxOptions(\"returnAirInletLocationOptions\")}\r\n \r\n
{this.getValidationError(\"returnAirInletLocation\")}
\r\n
\r\n
\r\n ) : null}\r\n {displayFields.showExhaustAirOutlet ? (\r\n
\r\n
Exhaust Air Outlet
\r\n
\r\n this.saveInputValue(\"exhaustAirOutlet\", event.currentTarget.value)}\r\n disabled={displayFields.outsideAndExhaustOpeningDisabled}\r\n >\r\n {this.getSelectBoxOptions(\"exhaustAirOutletOptions\")}\r\n \r\n {this.getValidationError(\"exhaustAirOutlet\")}\r\n
\r\n
\r\n this.saveInputValue(\"exhaustAirOutletLocation\", event.currentTarget.value)}\r\n >\r\n {this.getSelectBoxOptions(\"exhaustAirOutletLocationOptions\")}\r\n \r\n
{this.getValidationError(\"exhaustAirOutletLocation\")}
\r\n
\r\n
\r\n ) : null}\r\n
\r\n\r\n {displayFields.showVestibule ? (\r\n <>\r\n
Vestibule
\r\n
\r\n
\r\n
Unit Position
\r\n
\r\n this.saveInputValue(\"outsideAirInlet\", event.currentTarget.value)}\r\n >\r\n {this.getSelectBoxOptions(\"outsideAirInlet\")}\r\n \r\n {this.getValidationError(\"outsideAirInlet\")}\r\n
\r\n
\r\n
\r\n
Depth
\r\n
\r\n this.updateTextboxValue(\"outsideAirInlet\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideAirInlet\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"outsideAirInlet\")}\r\n
\r\n
\r\n
\r\n \r\n ) : null}\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n
\r\n {this.state.connectionSvg ?
: null}\r\n\r\n
Elevation View
\r\n
\r\n
\r\n\r\n {/*
*/}\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(InletOutlet);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { match } from \"react-router\";\r\nimport { callGetEndpoint, updateInputField } from \"../../api-calls/readApiService\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport \"../../css/UnitSelection.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n}\r\n\r\nclass UnitSelection extends React.Component {\r\n public state: IState = { userInputs: null };\r\n //This is a specific page for selecting the unit type.\r\n //It contains the 6 Unit Type images the user can click on to select UnitType.\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetUnitSelectionAllValues\", projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"unitSelectionError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetUnitSelectionAllValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.primaryInputs\r\n });\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n //Don't call the backend if the unitType has not changed.\r\n if (this.state.userInputs.unitType === newValue) {\r\n return;\r\n }\r\n let result = await updateInputField(\"UpdateUnitSelectionInputs\", projectId, unitId, fieldName, newValue, \"PrimaryInputs\");\r\n\r\n if (result.success) {\r\n if (newValue === \"Pool\") {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { showPoolInputs: true });\r\n } else {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { showPoolInputs: false });\r\n }\r\n //If unitBasicDetails was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({ userInputs: result.data.uiDataContainer.primaryInputs });\r\n }\r\n }\r\n }\r\n\r\n //return the \"selected\" classname for the currently selected option\r\n private checkIfSelected(type: string) {\r\n if (this.state.userInputs && this.state.userInputs.unitType == type) {\r\n return \"unit-img-selected\";\r\n } else return \"\";\r\n }\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {/* NOTE: this is hardcoded to 2, because that's the index for UnitDefinition.UnitTypes.EnergyRecovery ENUM in Lowry.\r\n TODO: We should refactor this to fetch these ID's from the database table Lowry.UnitType. */}\r\n this.saveInputValue(\"unitType\", \"EnergyRecovery\")}\r\n >
\r\n\r\n {/* NOTE: this is hardcoded to 1, because that's the index for UnitDefinition.UnitTypes.SingleTunnel ENUM in Lowry.\r\n TODO: We should refactor this to fetch these ID's from the database table Lowry.UnitType. */}\r\n this.saveInputValue(\"unitType\", \"SingleTunnel\")}\r\n >
\r\n\r\n
\r\n {/* to disable pools, add class pointer-events-none */}\r\n
this.saveInputValue(\"unitType\", \"Pool\")}>\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n //reduxConfigInputs: state.reduxConfigInputs\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitSelection);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification } from \"../../api-utilities/notification-tools\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport { callGetEndpoint, updateInputField } from \"../../api-calls/readApiService\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass FluidConditionsForWSHP extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetRefrigerationInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"refrigerationInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetRefrigerationInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n \r\n if (result.uiDataContainer && result.uiDataContainer.refrigerationInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.refrigerationInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.refrigerationInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
WSHP Fluid Conditions
\r\n\r\n
\r\n
\r\n
Fluid Type
\r\n
\r\n this.saveInputValue(\"waterSourceFluidType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"waterSourceFluidTypeOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"waterSourceFluidType\")}\r\n
\r\n\r\n {savedValues.waterSourceFluidType !== \"Water\" ? ( \r\n
\r\n
Glycol %
\r\n
\r\n this.updateTextboxValue(\"glycolPercent\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"glycolPercent\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"glycolPercent\")}\r\n
\r\n ) : null}\r\n\r\n
\r\n
Cooling Entering Fluid Temp
\r\n
\r\n this.updateTextboxValue(\"coolingEnteringFluidTemp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"coolingEnteringFluidTemp\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"coolingEnteringFluidTemp\")}\r\n
\r\n\r\n
\r\n
Heating Entering Fluid Temp
\r\n
\r\n this.updateTextboxValue(\"heatingEnteringFluidTemp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"heatingEnteringFluidTemp\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"heatingEnteringFluidTemp\")}\r\n
\r\n\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FluidConditionsForWSHP);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getTempsAndSystemValues, updateInputField } from \"../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport FluidConditionsForWSHP from \"./FluidConditionsForWSHP\";\r\nimport \"../../css/TempsSystem.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n disableInputs: boolean;\r\n}\r\n\r\nclass TempsSystem extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n disableInputs: false\r\n };\r\n\r\n async componentDidMount() {\r\n // await getTempsAndSystemInputs(true, this.props.match.params);\r\n // this.checkForWinterDryBulbError();\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await getTempsAndSystemValues(projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"tempsAndSystemInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
getTempsAndSystemValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n this.setState({\r\n userInputs: result.uiDataContainer.primaryInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n this.checkForWinterDryBulbError(result.uiDataContainer.displayFields, result.uiDataContainer.primaryInputs.energyRecoveryDeviceType);\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n if (this.state.disableInputs) {\r\n return;\r\n }\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n this.setState({ disableInputs: true });\r\n let result = await updateInputField(\"updateTempsAndSystem\", projectId, unitId, fieldName, newValue, \"PrimaryInputs\");\r\n this.setState({ disableInputs: false });\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.primaryInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n\r\n //Special case if we updated outsideWinterDryBulb. Check if we need to display the notification box.\r\n if (result.data.uiDataContainer != null && fieldName === \"outsideWinterDryBulb\") {\r\n this.checkForWinterDryBulbError(result.data.uiDataContainer.displayFields, result.data.uiDataContainer.primaryInputs.energyRecoveryDeviceType);\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n //Remove warning when navigating to another page.\r\n removeNotification(\"winterdrybulb\");\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n // private async updateWinterDryBulb(newValue: string) {\r\n // if (this.state.lastUpdatedTextbox !== 'outsideWinterDryBulb') {\r\n // return;\r\n // }\r\n // await this.saveInputValue('outsideWinterDryBulb', newValue);\r\n // this.checkForWinterDryBulbError();\r\n // }\r\n\r\n private checkForWinterDryBulbError(displayFields: any, energyRecoveryDeviceType: any) {\r\n //const displayFields = this.state.displayFields;\r\n //console.log(energyRecoveryDeviceType);\r\n if (displayFields.showWinterDryBulbWarning) {\r\n let message = \"\";\r\n if (energyRecoveryDeviceType === \"SensiblePlate\") {\r\n message = \"Preheat recommended to avoid plate frosting.\";\r\n } else if (energyRecoveryDeviceType === \"EnthalpyWheel\") {\r\n message = \"Preheat recommended to avoid wheel frosting.\";\r\n } else {\r\n message = \"Please select an energy recovery device.\";\r\n }\r\n\r\n const notification = {\r\n id: \"winterdrybulb\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
{message}
\r\n };\r\n addNotification(notification);\r\n } else {\r\n removeNotification(\"winterdrybulb\");\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n\r\n const displayFields = this.state.displayFields;\r\n let oaConditionsClass = \"\";\r\n if (displayFields?.summerDryBulbFieldName?.length > 27){\r\n oaConditionsClass = \"oaConditionsLabel\";\r\n }\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
Location
\r\n
\r\n
\r\n
Elevation
\r\n
\r\n this.updateTextboxValue(\"elevation\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"elevation\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"elevation\")}\r\n
\r\n\r\n
(For elevations below 2000 ft, airflows shall be treated as standard air)
\r\n
\r\n\r\n
Outside Air Conditions
\r\n
\r\n
\r\n
{displayFields.summerDryBulbFieldName}
\r\n
\r\n this.updateTextboxValue(\"outsideSummerDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideSummerDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"outsideSummerDryBulb\")}\r\n
\r\n\r\n
\r\n
{displayFields.summerWetBulbFieldName}
\r\n
\r\n this.updateTextboxValue(\"outsideSummerWetBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideSummerWetBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"outsideSummerWetBulb\")}\r\n
\r\n\r\n
\r\n
Winter Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"outsideWinterDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideWinterDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"outsideWinterDryBulb\")}\r\n
\r\n
\r\n
\r\n\r\n
\r\n
External SP and Power Supply
\r\n\r\n
\r\n
\r\n
{displayFields.renameSupplyESPToTotalESP ? \"Total ESP\" : \"Supply ESP\"}
\r\n
\r\n this.updateTextboxValue(\"supplyEsp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyEsp\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"supplyEsp\")}\r\n
\r\n\r\n {displayFields.showReturnESP ? (\r\n
\r\n
Return ESP
\r\n
\r\n this.updateTextboxValue(\"returnEsp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnEsp\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"returnEsp\")}\r\n
\r\n ) : null}\r\n\r\n
\r\n
Unit Electrical - Voltage
\r\n
\r\n this.saveInputValue(\"unitElectricalVoltage\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"unitVoltageOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"unitElectricalVoltage\")}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n {displayFields.showReturnAirConditions ? (\r\n
\r\n
Return Air Conditions
\r\n
\r\n
\r\n
\r\n
Summer Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"returnSummerDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnSummerDryBulb\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"returnSummerDryBulb\")}\r\n
\r\n\r\n
\r\n
Summer Relative Humidity %
\r\n
\r\n this.updateTextboxValue(\"returnSummerRelativeHumidity\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnSummerRelativeHumidity\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"returnSummerRelativeHumidity\")}\r\n
\r\n\r\n
\r\n
Winter Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"returnWinterDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnWinterDryBulb\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"returnWinterDryBulb\")}\r\n
\r\n\r\n
\r\n
Winter Relative Humidity %
\r\n
\r\n this.updateTextboxValue(\"returnWinterRelativeHumidity\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnWinterRelativeHumidity\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"returnWinterRelativeHumidity\")}\r\n
\r\n
{\" \"}\r\n
\r\n ) : null}\r\n\r\n {displayFields.showLeavingAirConditions ?
Leaving Air Conditions
: null}\r\n
\r\n {displayFields.showCoolingDryBulbTemp ? (\r\n
\r\n
Cooling Off-Coil Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"coolingOffCoilDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"coolingOffCoilDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"coolingOffCoilDryBulb\")}\r\n
\r\n ) : null}\r\n\r\n {displayFields.showReheatTemp ? (\r\n <>\r\n
\r\n
Reheat Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"reheatTemp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"reheatTemp\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"reheatTemp\")}\r\n
\r\n \r\n ) : null}\r\n {displayFields.showPreheatDryBulbTemp ? (\r\n <>\r\n
\r\n
Preheat Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"preheatDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"preheatDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"preheatDryBulb\")}\r\n
\r\n \r\n ) : null}\r\n\r\n {displayFields.showHeatingDryBulbTemp ? (\r\n
\r\n
Heating Dry Bulb
\r\n
\r\n this.updateTextboxValue(\"heatingTemp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"heatingTemp\", event.currentTarget.value)}\r\n />\r\n *\r\n
\r\n {this.getValidationError(\"heatingTemp\")}\r\n
\r\n ) : null}\r\n
\r\n \r\n {displayFields.showWSHPfluidConditions ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(TempsSystem);\r\n","import * as React from \"react\";\r\nimport { store } from \"../redux/store\";\r\nimport { updateReduxAction } from \"../redux/actions\";\r\nimport { runPerformanceCalcs } from \"../api-calls/readApiService\";\r\nimport { addNotification, formatIndividualErrors } from \"../api-utilities/notification-tools\";\r\n\r\nexport async function updateUnitDesign(projectId: number, unitId: number) {\r\n let enableReduxUpdate = true;\r\n let perfResponse = await runPerformanceCalcs(projectId, unitId);\r\n //----------Display error messages------------\r\n if (perfResponse.hasCriticalError) {\r\n const notification = {\r\n id: \"performanceCriticalError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Performance calculations failed. {perfResponse.criticalError}
\r\n };\r\n addNotification(notification);\r\n enableReduxUpdate = false; //In the case of a critical error, all components will come back null, so don't update the page or it will be blank.\r\n }\r\n if (perfResponse.hasUserCasingLimitError) {\r\n const notification = {\r\n id: \"userCasingHeightWidthError\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
{perfResponse.userCasingLimitMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (perfResponse.hasCasingLimitError) {\r\n const notification = {\r\n id: \"casingHeightWidthError\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
{perfResponse.casingErrorLimitMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (perfResponse.hasUserCasingEscortError) {\r\n const notification = {\r\n id: \"casingEscortError\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
{perfResponse.userCasingEscortMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (perfResponse.hasError) {\r\n const notification = {\r\n id: \"performanceError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Performance calculations failed. {perfResponse.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (perfResponse.hasSecondaryError) {\r\n const notification = {\r\n id: \"performanceSecondaryError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
{formatIndividualErrors(perfResponse.secondaryErrorsList)}
\r\n };\r\n addNotification(notification);\r\n }\r\n if(perfResponse.warningMessages && perfResponse.warningMessages.length > 0 ){\r\n perfResponse.warningMessages.forEach((element:any, index: number) => {\r\n const notification = {\r\n id: \"WarningMessages\"+ index,\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
{element}
\r\n };\r\n addNotification(notification);\r\n });\r\n }\r\n\r\n\r\n if (enableReduxUpdate) {\r\n store.dispatch(updateReduxAction(\"UPDATE_COMPONENT_PERFORMANCE\", perfResponse));\r\n }\r\n\r\n return perfResponse;\r\n}\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass UnitSizingLimits extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetUnitSizingLimitsValues\", projectId, unitId);\r\n if (result.uiDataContainer && result.uiDataContainer.fineTuneInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.fineTuneInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n componentWillUnmount(){\r\n const { projectId, unitId } = this.props.match.params;\r\n //Make sure to set back casingDimensionLimitType to \"None\" if no inches are input.\r\n if (this.state.userInputs.casingDimensionLimitType !== \"None\" && (this.state.userInputs.casingHeightOrWidthLimit === null ||\r\n this.state.userInputs.casingHeightOrWidthLimit === \"\")){\r\n let result = updateInputField(\"UpdateUnitSizingLimits\", projectId, unitId, \"casingDimensionLimitType\", \"None\", \"FineTuneInputs\");\r\n }\r\n }\r\n private async RunPerformance(){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n if (this.state.userInputs.casingDimensionLimitType !== \"None\" && (this.state.userInputs.casingHeightOrWidthLimit === null ||\r\n this.state.userInputs.casingHeightOrWidthLimit === \"\")){\r\n //Don't run performance. Must have a value for limit (inches) if the limitType is Height or Width.\r\n return;\r\n }\r\n else {\r\n this.removeValidationError(\"casingHeightOrWidthLimit\");\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for unit sizing and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n getCasingHeightWidthDisabled() {\r\n const basicDetails = this.state.userInputs;\r\n if (basicDetails && basicDetails.casingDimensionLimitType) {\r\n if (basicDetails.casingDimensionLimitType !== null) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n public getSelectBoxOptions(boxName: any) {\r\n return [, , ];\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n\r\n //Remove validation for casingHeightOrWidthLimit if limit type is set to \"None\".\r\n if (fieldName === \"casingDimensionLimitType\" && newValue === \"None\"){\r\n this.removeValidationError(\"casingHeightOrWidthLimit\");\r\n }\r\n let result = await updateInputField(\"UpdateUnitSizingLimits\", projectId, unitId, fieldName, newValue, \"FineTuneInputs\");\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error1\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n Unit Sizing Limits\r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Cabinet Limit Type
\r\n
\r\n this.saveInputValue(\"casingDimensionLimitType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"casingDimensionLimitOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"casingDimensionLimitType\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Cabinet Limit
\r\n
\r\n this.updateTextboxValue(\"casingHeightOrWidthLimit\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"casingHeightOrWidthLimit\", event.currentTarget.value)}\r\n placeholder=\"inches\"\r\n />\r\n
\r\n {this.getValidationError(\"casingHeightOrWidthLimit\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Coil FPM Limit
\r\n
\r\n this.updateTextboxValue(\"coilAndFilterFpmLimit\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"coilAndFilterFpmLimit\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"coilAndFilterFpmLimit\")}\r\n
\r\n
\r\n
\r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitSizingLimits);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { addNotification, removeNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n reduxComponentPerformance:any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n operatingMode: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass ChilledWaterCoil extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n operatingMode: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetCoilInputValues/ChilledWaterCoilInputs\", projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"chilledCoilInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetCoilInputValues/ChilledWaterCoilInputs {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.coilInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.coilInputs,\r\n operatingMode: result.uiDataContainer.chilledWaterCoilOpMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n private async RunPerformance(){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for chilled water coil and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n\r\n const result = await callGetEndpoint(\"readapi/GetCoilInputValues/ChilledWaterCoilInputs\", projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"chilledCoilInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetCoilInputValues/ChilledWaterCoilInputs {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.coilInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.coilInputs,\r\n operatingMode: result.uiDataContainer.chilledWaterCoilOpMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateCoil\", projectId, unitId, fieldName, newValue, \"ChilledWaterCoilInputs\");\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.coilInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n const chilledWaterCoil = this.props.reduxComponentPerformance.chilledWaterCoil;\r\n if (isEmptyObject(chilledWaterCoil)) {\r\n return null;\r\n }\r\n\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n let operatingMode = this.state.operatingMode;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n if (isEmptyObject(operatingMode)) {\r\n const notification = {\r\n id: \"coilOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Chilled water coil operating mode not found.
\r\n };\r\n addNotification(notification);\r\n operatingMode = {};\r\n }\r\n\r\n return (\r\n
\r\n Chilled Water Coil\r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n
Entering Air DB
\r\n
\r\n
{formatNumber(operatingMode.enteringDryBulb, 1)}
\r\n
\r\n
Rows
\r\n
{chilledWaterCoil.rows}
\r\n
\r\n\r\n
\r\n
Entering Air WB
\r\n
\r\n
{formatNumber(operatingMode.enteringWetBulb, 1)}
\r\n
\r\n
Fins Per Inch
\r\n
{chilledWaterCoil.finsPerInch}
\r\n
\r\n\r\n
\r\n
Leaving Air DB
\r\n
\r\n
{formatNumber(operatingMode.leavingDryBulb, 1)}
\r\n
\r\n
Air Pressure Drop
\r\n
{formatNumber(operatingMode.airPressureDrop, 2)}
\r\n
\r\n\r\n
\r\n
Leaving Air WB
\r\n
\r\n
{formatNumber(operatingMode.leavingWetBulb, 1)}
\r\n
\r\n
GPM
\r\n
{formatNumber(operatingMode.gallonsPerMinute, 1)}
\r\n
\r\n
\r\n
\r\n
Entering Fluid Temp
\r\n
\r\n this.updateTextboxValue(\"enteringFluidTemperature\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"enteringFluidTemperature\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"enteringFluidTemperature\")}\r\n
\r\n
Water Pressure Drop
\r\n
{formatNumber(operatingMode.waterPressureDrop, 1)}
\r\n
\r\n\r\n
\r\n
\r\n
Leaving Fluid Temp
\r\n
\r\n this.updateTextboxValue(\"leavingFluidTemperature\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"leavingFluidTemperature\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"leavingFluidTemperature\")}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Fluid Type
\r\n
\r\n this.saveInputValue(\"coilFluidType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"coilFluidTypeOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"coilFluidType\")}\r\n
\r\n
\r\n
\r\n
\r\n\r\n {displayFields.showGlycolPercentage ? (\r\n
\r\n
\r\n
Glycol %
\r\n
\r\n this.updateTextboxValue(\"glycolPercent\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"glycolPercent\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"glycolPercent\")}\r\n
\r\n
\r\n
\r\n
\r\n ) : null}\r\n\r\n
\r\n\r\n
\r\n
\r\n
\r\n
Max WPD
\r\n
\r\n this.updateTextboxValue(\"maxWaterPressureDrop\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"maxWaterPressureDrop\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"maxWaterPressureDrop\")}\r\n
\r\n
\r\n
Tube Thickness
\r\n
\r\n this.saveInputValue(\"tubeWallThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"tubeWallThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"tubeWallThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rows Override
\r\n
\r\n this.saveInputValue(\"rows\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"rowsOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"rows\")}\r\n
\r\n\r\n
\r\n
Fin Material
\r\n
\r\n this.saveInputValue(\"finMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finMaterialOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finMaterial\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Fins per Inch Override
\r\n
\r\n this.saveInputValue(\"finsPerInch\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finsPerInchOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finsPerInch\")}\r\n
\r\n\r\n
\r\n
Fin Thickness
\r\n
\r\n this.saveInputValue(\"finThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
Turbulators
\r\n this.saveInputValue(\"includeTurbulators\", event.currentTarget.checked.toString())}\r\n />\r\n
\r\n
\r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxValidation: state.reduxValidation,\r\n reduxComponentPerformance: state.reduxComponentPerformance,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ChilledWaterCoil);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { addNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n reduxComponentPerformance:any;\r\n targetVertex: string; //HotWaterCoilInputs or PreHeatHotWaterCoilInputs\r\n updateRedux: any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n operatingMode: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\n//TODO: Need to add a HotWaterPreheat.tsx component?\r\n\r\nclass HotWaterCoil extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n operatingMode: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n await this.getCoilData(this.props.targetVertex);\r\n }\r\n\r\n //targetVertex will be passed in. It will be either HotWaterCoilInputs or PreHeatHotWaterCoilInputs\r\n //If user switches between hotWater and preHeatHotWater, we need to fetch the new data\r\n async componentDidUpdate(prevProps: IProps) {\r\n if (prevProps.targetVertex != this.props.targetVertex) {\r\n await this.getCoilData(this.props.targetVertex);\r\n }\r\n }\r\n\r\n private async getCoilData(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(`readapi/GetCoilInputValues/${targetVertex}`, projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"getCoilInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetCoilInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (result.uiDataContainer && result.uiDataContainer.coilInputs) {\r\n let operatingMode = {};\r\n if (targetVertex == \"HotWaterCoilInputs\") {\r\n operatingMode = result.uiDataContainer.hotWaterCoilOpMode;\r\n }\r\n if (targetVertex == \"PreHeatHotWaterCoilInputs\") {\r\n operatingMode = result.uiDataContainer.preHeatHotWaterCoilOpMode;\r\n }\r\n\r\n this.setState({\r\n userInputs: result.uiDataContainer.coilInputs,\r\n operatingMode: operatingMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n private async RunPerformance(targetVertex: any){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for hot water coil and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(`readapi/GetCoilInputValues/${targetVertex}`, projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"getCoilInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetCoilInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (result.uiDataContainer && result.uiDataContainer.coilInputs) {\r\n let operatingMode = {};\r\n if (targetVertex == \"HotWaterCoilInputs\") {\r\n operatingMode = result.uiDataContainer.hotWaterCoilOpMode;\r\n }\r\n if (targetVertex == \"PreHeatHotWaterCoilInputs\") {\r\n operatingMode = result.uiDataContainer.preHeatHotWaterCoilOpMode;\r\n }\r\n\r\n this.setState({\r\n userInputs: result.uiDataContainer.coilInputs,\r\n operatingMode: operatingMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateCoil\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.coilInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n let hotWaterCoil = {} as any;\r\n if (this.props.targetVertex == \"HotWaterCoilInputs\") {\r\n hotWaterCoil = this.props.reduxComponentPerformance.hotWaterCoil;\r\n }\r\n if (this.props.targetVertex == \"PreHeatHotWaterCoilInputs\") {\r\n hotWaterCoil = this.props.reduxComponentPerformance.preheatHotWaterCoil;\r\n }\r\n\r\n if (isEmptyObject(hotWaterCoil)) {\r\n return null;\r\n }\r\n\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n let operatingMode = this.state.operatingMode;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n if (isEmptyObject(operatingMode)) {\r\n const notification = {\r\n id: \"coilOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Hot water coil operating mode not found.
\r\n };\r\n addNotification(notification);\r\n operatingMode = {};\r\n }\r\n\r\n let title = \"\";\r\n if (this.props.targetVertex == \"HotWaterCoilInputs\") {\r\n title = \"Hot Water Coil\";\r\n }\r\n if (this.props.targetVertex == \"PreHeatHotWaterCoilInputs\") {\r\n title = \"Preheat Hot Water Coil\";\r\n }\r\n\r\n return (\r\n
\r\n {title}\r\n\r\n
\r\n
\r\n
\r\n\r\n {/* {getErrorNotifications(this.props.reduxhotWaterCoil.errorMessages)} */}\r\n\r\n
\r\n
Entering Air DB
\r\n
\r\n
{formatNumber(operatingMode.enteringDryBulb, 1) || \"\"}
\r\n
\r\n
Rows
\r\n
{hotWaterCoil.rows || \"\"}
\r\n
\r\n\r\n
\r\n
Leaving Air DB
\r\n
\r\n
{formatNumber(operatingMode.leavingDryBulb, 1)}
\r\n
\r\n
Fins Per Inch
\r\n
{hotWaterCoil.finsPerInch}
\r\n
\r\n\r\n
\r\n
\r\n
Entering Fluid Temp
\r\n
\r\n this.updateTextboxValue(\"enteringFluidTemperature\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"enteringFluidTemperature\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"enteringFluidTemperature\")}\r\n
\r\n
Air Pressure Drop
\r\n
{formatNumber(operatingMode.airPressureDrop, 2)}
\r\n
\r\n\r\n
\r\n
\r\n
Leaving Fluid Temp
\r\n
\r\n this.updateTextboxValue(\"leavingFluidTemperature\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"leavingFluidTemperature\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"leavingFluidTemperature\")}\r\n
\r\n
GPM
\r\n
{formatNumber(operatingMode.gallonsPerMinute, 1)}
\r\n
\r\n\r\n
\r\n
\r\n
Fluid Type
\r\n
\r\n this.saveInputValue(\"coilFluidType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"coilFluidTypeOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"coilFluidType\")}\r\n
\r\n
Water Pressure Drop
\r\n
{formatNumber(operatingMode.waterPressureDrop, 1)}
\r\n
\r\n\r\n {displayFields.showGlycolPercentage ? (\r\n
\r\n
\r\n
Glycol %
\r\n
\r\n this.updateTextboxValue(\"glycolPercent\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"glycolPercent\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"glycolPercent\")}\r\n
\r\n
\r\n
\r\n
\r\n ) : null}\r\n\r\n
\r\n\r\n
\r\n
\r\n
\r\n
Max WPD
\r\n
\r\n this.updateTextboxValue(\"maxWaterPressureDrop\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"maxWaterPressureDrop\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"maxWaterPressureDrop\")}\r\n
\r\n
\r\n
Tube Thickness
\r\n
\r\n this.saveInputValue(\"tubeWallThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"tubeWallThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"tubeWallThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rows Override
\r\n
\r\n this.saveInputValue(\"rows\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"rowsOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"rows\")}\r\n
\r\n\r\n
\r\n
Fin Material
\r\n
\r\n this.saveInputValue(\"finMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finMaterialOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finMaterial\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Fins per Inch Override
\r\n
\r\n this.saveInputValue(\"finsPerInch\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finsPerInchOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finsPerInch\")}\r\n
\r\n\r\n
\r\n
Fin Thickness
\r\n
\r\n this.saveInputValue(\"finThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
Turbulators
\r\n this.saveInputValue(\"includeTurbulators\", event.currentTarget.checked.toString())}\r\n />\r\n
\r\n
\r\n
this.RunPerformance(this.props.targetVertex)}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxValidation: state.reduxValidation,\r\n reduxComponentPerformance: state.reduxComponentPerformance,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(HotWaterCoil);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { addNotification} from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n reduxComponentPerformance:any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n operatingMode: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\nclass SteamCoil extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n operatingMode: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetCoilInputValues/SteamCoilInputs\", projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"steamCoilInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetCoilInputValues/SteamCoilInputs {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.coilInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.coilInputs,\r\n operatingMode: result.uiDataContainer.steamCoilOpMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n private async RunPerformance(){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for steam coil and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(\"readapi/GetCoilInputValues/SteamCoilInputs\", projectId, unitId);\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"steamCoilInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetCoilInputValues/SteamCoilInputs {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.coilInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.coilInputs,\r\n operatingMode: result.uiDataContainer.steamCoilOpMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateCoil\", projectId, unitId, fieldName, newValue, \"SteamCoilInputs\");\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.coilInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n const steamCoil = this.props.reduxComponentPerformance.steamCoil;\r\n if (isEmptyObject(steamCoil)) {\r\n return null;\r\n }\r\n \r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n let operatingMode = this.state.operatingMode;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n if (isEmptyObject(operatingMode)) {\r\n const notification = {\r\n id: \"coilOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Steam coil operating mode not found.
\r\n };\r\n addNotification(notification);\r\n operatingMode = {};\r\n }\r\n\r\n return (\r\n
\r\n Steam Coil\r\n\r\n
\r\n
\r\n
Entering Air Temp
\r\n
\r\n
{formatNumber(operatingMode.enteringDryBulb, 1) || \"\"}
\r\n
\r\n
Rows
\r\n
{steamCoil.rows}
\r\n
\r\n
\r\n
Leaving Air Temp
\r\n
\r\n
{formatNumber(operatingMode.leavingDryBulb, 1) || \"\"}
\r\n
\r\n
Fins Per Inch
\r\n
{steamCoil.finsPerInch}
\r\n
\r\n
\r\n
\r\n
Steam Pressure
\r\n
\r\n this.updateTextboxValue(\"steamPressure\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"steamPressure\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"steamPressure\")}\r\n
\r\n
Air Pressure Drop
\r\n
{formatNumber(operatingMode.airPressureDrop, 2)}
\r\n
\r\n
\r\n
\r\n
\r\n
Condensate (lb/hr)
\r\n
{formatNumber(operatingMode.condensate, 1)}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Rows Override
\r\n
\r\n this.saveInputValue(\"rows\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"rowsOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"rows\")}\r\n
\r\n\r\n
\r\n
Tube Thickness
\r\n
\r\n this.saveInputValue(\"tubeWallThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"tubeWallThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"tubeWallThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Fins per Inch Override
\r\n
\r\n this.saveInputValue(\"finsPerInch\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finsPerInchOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finsPerInch\")}\r\n
\r\n\r\n
\r\n
Fin Material
\r\n
\r\n this.saveInputValue(\"finMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finMaterialOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finMaterial\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Tube Diameter
\r\n
\r\n this.saveInputValue(\"tubeDiameter\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"tubeDiameterOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"tubeDiameter\")}\r\n
\r\n\r\n
\r\n
Fin Thickness
\r\n
\r\n this.saveInputValue(\"finThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"finThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finThickness\")}\r\n
\r\n
\r\n
\r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxComponentPerformance: state.reduxComponentPerformance,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(SteamCoil);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { addNotification, clearAllPerformanceNotifications } from \"../../../api-utilities/notification-tools\";\r\nimport { isNullOrEmpty } from \"../../../utilities/helpers\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n targetVertex: string;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n dataContainer: any;\r\n quantityInHeight: number;\r\n quantityInWidth: number;\r\n}\r\nclass Fan extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n dataContainer: null,\r\n quantityInHeight: 0,\r\n quantityInWidth: 0\r\n };\r\n\r\n async componentDidMount() {\r\n await this.getFanData(this.props.targetVertex);\r\n }\r\n\r\n //targetVertex will be passed in.\r\n //If user switches between different fans we need to fetch the new data\r\n async componentDidUpdate(prevProps: IProps) {\r\n if (prevProps.targetVertex != this.props.targetVertex) {\r\n await this.getFanData(this.props.targetVertex);\r\n }\r\n }\r\n\r\n private async getFanData(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(`readapi/GetFanInputValues/${targetVertex}`, projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"fanInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetFanInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n //NOTE: quantityInHeight and quantityInWidth are saved in state here and remain unchanged so that the user can see what the initial\r\n // quantities were even when they change them.\r\n if (result.uiDataContainer && result.uiDataContainer.fanInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.fanInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer, //contains all the extra data fields\r\n quantityInHeight: result.uiDataContainer.defaultFan.quantityInHeight,\r\n quantityInWidth: result.uiDataContainer.defaultFan.quantityInWidth\r\n });\r\n }\r\n }\r\n private async RunPerformance(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for fan and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n\r\n const result = await callGetEndpoint(`readapi/GetFanInputValues/${targetVertex}`, projectId, unitId);\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"fanInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetFanInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n //NOTE: quantityInHeight and quantityInWidth are saved in state here and remain unchanged so that the user can see what the initial\r\n // quantities were even when they change them.\r\n if (result.uiDataContainer && result.uiDataContainer.fanInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.fanInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer, //contains all the extra data fields\r\n quantityInHeight: result.uiDataContainer.defaultFan.quantityInHeight,\r\n quantityInWidth: result.uiDataContainer.defaultFan.quantityInWidth\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n if (result.uiDataContainer.fanOptions.length === 0){\r\n const notification = {\r\n id: \"fanInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
{\"No fan options exist for the given inputs\"}
\r\n };\r\n addNotification(notification);\r\n }\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateFan\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fanInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n public async saveFanSelection(newValue: string) {\r\n let fieldName = \"UserSelectedWheelSize\";\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n clearAllPerformanceNotifications();\r\n let updateResult = await updateInputField(\"updateFan\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(`readapi/GetFanInputValues/${this.props.targetVertex}`, projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"fanInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetFanInputValues {result.data.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n if (result.uiDataContainer && result.uiDataContainer.fanInputs) {\r\n //If there are any errors in the response, add them to state\r\n if (result.validationErrors != null) {\r\n this.addValidationErrors(result.validationErrors);\r\n }\r\n if (result.uiDataContainer && result.uiDataContainer.fanInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.fanInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error1\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n private async openFanCurveModal() {\r\n const routeParams = this.props.match.params;\r\n const projectId = routeParams.projectId;\r\n const unitId = routeParams.unitId;\r\n\r\n let selectedFan = \"\";\r\n if (this.props.targetVertex === \"SupplyFanInputs\") {\r\n selectedFan = \"supply\";\r\n }\r\n if (this.props.targetVertex === \"ExhaustFanInputs\") {\r\n selectedFan = \"exhaust\";\r\n }\r\n if (this.props.targetVertex === \"ReturnFanInputs\") {\r\n selectedFan = \"return\";\r\n }\r\n const modalData = { projectId: projectId, unitId: unitId, selectedFan: selectedFan };\r\n this.props.updateRedux(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"FanCurveModal\",\r\n modalData: modalData,\r\n hideCancelBtn: false\r\n });\r\n }\r\n\r\n private async openSoundDataModal() {\r\n const routeParams = this.props.match.params;\r\n const projectId = routeParams.projectId;\r\n const unitId = routeParams.unitId;\r\n\r\n let selectedFan = \"\";\r\n if (this.props.targetVertex === \"SupplyFanInputs\") {\r\n selectedFan = \"supply\";\r\n }\r\n if (this.props.targetVertex === \"ExhaustFanInputs\") {\r\n selectedFan = \"exhaust\";\r\n }\r\n if (this.props.targetVertex === \"ReturnFanInputs\") {\r\n selectedFan = \"return\";\r\n }\r\n const modalData = { projectId: projectId, unitId: unitId, selectedFan: selectedFan };\r\n this.props.updateRedux(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"FanSoundDataModal\",\r\n modalData: modalData,\r\n hideCancelBtn: false\r\n });\r\n }\r\n\r\n getCSSClass(modelNumber: string, selectedModelNumber: string) {\r\n return modelNumber == selectedModelNumber ? \"acc-td-optional acc-td-selected\" : \"acc-td-optional\";\r\n }\r\n getFanChoices(dataContainer: any) {\r\n const context = this;\r\n const options = dataContainer.fanOptions;\r\n const selectedFan = this.getSelectedFan(dataContainer);\r\n\r\n const selectedModelNumber = selectedFan ? selectedFan.modelNumber : 0;\r\n\r\n const arr = options.map(function (item: any, index: number) {\r\n return (\r\n \r\n
\r\n
context.saveFanSelection(item.fanDiameter)}>\r\n
{item.modelNumber}
\r\n
{formatNumber(item.fanRPM, 0)}
\r\n
{formatNumber(item.motorRPM, 0)}
\r\n
{item.hpPerFanLabel}
\r\n
{formatNumber(item.staticEfficiencyPercent, 1)}%
\r\n
{formatNumber(item.fei, 2)}
\r\n
{formatNumber(item.arrayLwAOutputDB, 1)}
\r\n
\r\n
\r\n );\r\n });\r\n return arr;\r\n }\r\n\r\n getSelectedFan(dataContainer: any) {\r\n const userInputs = this.state.userInputs;\r\n const options = dataContainer.fanOptions;\r\n //If the user has selected a fan and it matches one of the available options, return it\r\n if (!isNullOrEmpty(userInputs.userSelectedWheelSize)) {\r\n let selectedFan = options.find((x: any) => x.fanDiameter == userInputs.userSelectedWheelSize);\r\n if (selectedFan) {\r\n return selectedFan;\r\n }\r\n }\r\n\r\n //otherwise return the default one\r\n return options.find((x: any) => x.isDefaultOption);\r\n }\r\n\r\n public render() {\r\n let title = \"\";\r\n let dropDownOptionsNameWidth = \"\";\r\n let dropDownOptionsNameHeight = \"\";\r\n let dataContainer = this.state.dataContainer;\r\n\r\n if (!dataContainer) {\r\n return null;\r\n }\r\n\r\n let hasVav = this.state.displayFields.isVariableAirVolume;\r\n\r\n if (this.props.targetVertex == \"SupplyFanInputs\") {\r\n title = \"Supply Fan\";\r\n dropDownOptionsNameWidth = \"supplyFanQuantityOptionsWidth\";\r\n dropDownOptionsNameHeight = \"supplyFanQuantityOptionsHeight\";\r\n } else if (this.props.targetVertex === \"ExhaustFanInputs\") {\r\n title = \"Exhaust Fan\";\r\n dropDownOptionsNameWidth = \"exhaustFanQuantityOptionsWidth\";\r\n dropDownOptionsNameHeight = \"exhaustFanQuantityOptionsHeight\";\r\n } else if (this.props.targetVertex == \"ReturnFanInputs\") {\r\n title = \"Return Fan\";\r\n dropDownOptionsNameWidth = \"returnFanQuantityOptionsWidth\";\r\n dropDownOptionsNameHeight = \"returnFanQuantityOptionsHeight\";\r\n }\r\n\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n return (\r\n
\r\n {title}\r\n\r\n
\r\n
\r\n
\r\n
\r\n\r\n
this.openFanCurveModal()}>\r\n Fan Curves\r\n
\r\n
this.openSoundDataModal()}>\r\n Sound Data\r\n
\r\n\r\n {/* {getErrorNotifications(fan!.errorMessages)} */}\r\n\r\n
\r\n
Total Airflow
\r\n
\r\n
{formatNumber(dataContainer.totalAirflow, 0)}
\r\n
\r\n {!hasVav ? (\r\n
\r\n Overrides\r\n
\r\n ) : null}\r\n
\r\n
\r\n\r\n {hasVav ? (\r\n
\r\n
Minimum Airflow Turndown
\r\n
\r\n
{dataContainer.minimumAirflowTurndown}
\r\n
\r\n
\r\n Overrides\r\n
\r\n
\r\n
\r\n ) : null}\r\n\r\n
\r\n
Total Static Pressure
\r\n
\r\n
{formatNumber(dataContainer.totalStaticPressure, 2)}
\r\n
\r\n
\r\n this.updateTextboxValue(\"totalStaticPressure\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"totalStaticPressure\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"totalStaticPressure\")}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Fan Quantity in Height
\r\n
\r\n
{this.state.quantityInHeight}
\r\n
\r\n
\r\n this.saveInputValue(\"fanQuantityInHeight\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, dropDownOptionsNameHeight)}\r\n \r\n {this.getValidationError(\"fanQuantityInHeight\")}\r\n
\r\n
\r\n
\r\n\r\n
\r\n
Fan Quantity in Width
\r\n
\r\n
{this.state.quantityInWidth}
\r\n
\r\n
\r\n this.saveInputValue(\"fanQuantityInWidth\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, dropDownOptionsNameWidth)}\r\n \r\n {this.getValidationError(\"fanQuantityInWidth\")}\r\n
\r\n
\r\n
\r\n
\r\n {/* )} */}\r\n
\r\n
Fan Model
\r\n
\r\n this.saveInputValue(\"fanModelLine\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"fanModelLineOptions\")}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Model\r\n
\r\n
Fan RPM
\r\n
Motor RPM
\r\n
MHP Per Fan
\r\n
Static Eff.
\r\n
FEI
\r\n
Array LwA Outlet dB
\r\n
\r\n
\r\n\r\n {this.getFanChoices(dataContainer)}\r\n
\r\n \r\n
this.RunPerformance(this.props.targetVertex)}>Update Design
\r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxValidation: state.reduxValidation,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Fan);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport {addNotification} from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n targetVertex: string;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n operatingMode: any;\r\n filterSizeUsed: string;\r\n}\r\nclass Filter extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n operatingMode: null,\r\n filterSizeUsed: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n await this.getFilterData(this.props.targetVertex);\r\n }\r\n\r\n async componentDidUpdate(prevProps: IProps) {\r\n if (prevProps.targetVertex != this.props.targetVertex) {\r\n await this.getFilterData(this.props.targetVertex);\r\n }\r\n }\r\n\r\n private async getFilterData(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(`readapi/GetFilterInputValues/${targetVertex}`, projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"filterInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetFilterInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.filterInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.filterInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n operatingMode: result.uiDataContainer.filterOpMode,\r\n filterSizeUsed: result.uiDataContainer.filterSizeUsed\r\n });\r\n }\r\n }\r\n private async RunPerformance(targetVertex: string){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for filters and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(`readapi/GetFilterInputValues/${targetVertex}`, projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"filterInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetFilterInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.filterInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.filterInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n operatingMode: result.uiDataContainer.filterOpMode,\r\n filterSizeUsed: result.uiDataContainer.filterSizeUsed\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n //const filterType = this.props.filterType;\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateFilter\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.filterInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n filterSizeUsed: result.data.uiDataContainer.filterSizeUsed\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n let operatingMode = this.state.operatingMode;\r\n let filterSizeUsed = this.state.filterSizeUsed;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n let label = \"\";\r\n if (displayFields) {\r\n label = displayFields.isSingleTunnel ? \"Supply\" : \"Outside\";\r\n }\r\n\r\n let title =\r\n this.props.targetVertex == \"SupplyAirFinalFilterInputs\"\r\n ? \"Supply Air Final Filter\"\r\n : this.props.targetVertex == \"ReturnAirFilterInputs\"\r\n ? \"Return Air Filter\"\r\n : \"\";\r\n\r\n return (\r\n
\r\n {title}\r\n\r\n
\r\n
\r\n
\r\n
\r\n
Loading Level
\r\n
\r\n this.saveInputValue(\"loadingLevel\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"loadingLevelOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"loadingLevel\")}\r\n
\r\n
Type
\r\n
{savedValues.filterType}
\r\n
\r\n\r\n
\r\n
\r\n
Filter Removal
\r\n
\r\n this.saveInputValue(\"filterRemoval\", event.currentTarget.value)}\r\n disabled={displayFields.filterRemovalDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"filterRemovalOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"filterRemoval\")}\r\n
\r\n
Face Velocity
\r\n
{formatNumber(operatingMode.faceVelocity, 0)}
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
Pressure Drop
\r\n
{formatNumber(operatingMode.airPressureDrop, 2)}
\r\n
\r\n
\r\n
\r\n
Filter Size(s) Allowed
\r\n
\r\n this.saveInputValue(\"filterSizeRestriction\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"filterSizeOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"filterSizeRestriction\")}\r\n
\r\n
Filter Size(s) Used
\r\n
{filterSizeUsed}
\r\n
\r\n\r\n
\r\n
this.RunPerformance(this.props.targetVertex)}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Filter);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n operatingMode: any;\r\n filterSizeUsed: string;\r\n}\r\nclass CombinedFilter extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n operatingMode: null,\r\n filterSizeUsed: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n await this.getFilterData();\r\n }\r\n\r\n private async getFilterData() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(`readapi/GetCombinedFilterInputValues`, projectId, unitId);\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.filterInputsList) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.filterInputsList,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n operatingMode: result.uiDataContainer.filterOpMode,\r\n filterSizeUsed: result.uiDataContainer.filterSizeUsed\r\n });\r\n }\r\n }\r\n private async RunPerformance(){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for filters and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n this.getFilterData();\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n\r\n private GetPressureDrop(StageName : string, operatingMode: any){\r\n \r\n if(StageName === \"Stage1\"){\r\n if (operatingMode.stage1FilterLoading === undefined || operatingMode.stage1FilterLoading === null){\r\n return formatNumber((operatingMode.stage1CleanPressureDrop), 2);\r\n }\r\n else{\r\n return formatNumber((operatingMode.stage1CleanPressureDrop + operatingMode.stage1FilterLoading), 2);\r\n }\r\n }\r\n else{\r\n if (operatingMode.stage2FilterLoading === undefined || operatingMode.stage2FilterLoading === null){\r\n return formatNumber((operatingMode.stage2CleanPressureDrop), 2);\r\n }\r\n else{\r\n return formatNumber((operatingMode.stage2CleanPressureDrop + operatingMode.stage2FilterLoading), 2);\r\n }\r\n }\r\n\r\n }\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string, targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n //const filterType = this.props.filterType;\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateFilter\", projectId, unitId, fieldName, newValue, targetVertex);\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.filterInputsList,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n filterSizeUsed: result.data.uiDataContainer.filterSizeUsed\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n if (!this.state.userInputs) {\r\n return null;\r\n }\r\n\r\n const outsidePrefilter = this.state.userInputs.find((x: any) => x.filterLocation === \"OutsideAirPreFilter\");\r\n const highEfficiencyFilter = this.state.userInputs.find((x: any) => x.filterLocation === \"OutsideAirHighEfficiencyFilter\");\r\n let operatingMode = this.state.operatingMode;\r\n const displayFields = this.state.displayFields;\r\n let filterSizeUsed = this.state.filterSizeUsed;\r\n\r\n //Determine whether to show the update design button.\r\n let outsidePreFilterClass = displayFields.showOutsideAirPreFilter && displayFields.showHighEfficiencyFilter === false ? \"\" : \"app-display-none\";\r\n let highEfficiencyFilterClass = displayFields.showOutsideAirPreFilter === true ? \"\" : \"app-display-none\";\r\n\r\n let disableFilterRemoval;\r\n let label = \"\";\r\n if (displayFields) {\r\n label = displayFields.isSingleTunnel ? \"Supply\" : \"Outside\";\r\n }\r\n let title = \"\";\r\n //if userInputs has more than one record, there's a preFilter and High efficiency filter.\r\n if (this.state.userInputs.length > 1) {\r\n title = `${label} Air Filters`;\r\n disableFilterRemoval = true; //Always disable filter removal if a preFilter and High Efficiency filter exist.\r\n } else {\r\n title = `${label} Air PreFilter`;\r\n //Both preFilter and High Efficiency do not exist so Use server side logic (property) to determine.\r\n disableFilterRemoval = displayFields.filterRemovalDisabled;\r\n }\r\n\r\n return (\r\n
\r\n {title}\r\n\r\n {displayFields.showOutsideAirPreFilter ? (\r\n
\r\n
\r\n
\r\n
Pre-Filter
\r\n
\r\n
Loading Level
\r\n
\r\n this.saveInputValue(\"loadingLevel\", event.currentTarget.value, \"OutsideAirPreFilterInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"loadingLevelOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"loadingLevel\")}\r\n
\r\n
Type
\r\n
{outsidePrefilter.filterType}
\r\n
\r\n\r\n
\r\n
\r\n
Filter Removal
\r\n
\r\n this.saveInputValue(\"filterRemoval\", event.currentTarget.value, \"OutsideAirPreFilterInputs\")}\r\n disabled={disableFilterRemoval}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"filterRemovalOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"filterRemoval\")}\r\n
\r\n
Face Velocity
\r\n
{formatNumber(operatingMode.faceVelocity, 0)}
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
Pressure Drop
\r\n
{this.GetPressureDrop(\"Stage1\",operatingMode)}
\r\n
\r\n {!displayFields.showHighEfficiencyFilter ? (\r\n
\r\n
\r\n
Filter Size(s) Allowed
\r\n
\r\n this.saveInputValue(\"filterSizeRestriction\", event.currentTarget.value,\"OutsideAirPreFilterInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"filterSizeOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"filterSizeRestriction\")}\r\n
\r\n
Filter Size(s) Used
\r\n
{filterSizeUsed}
\r\n
\r\n ) : null}\r\n
\r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n ) : null}\r\n\r\n {displayFields.showHighEfficiencyFilter ? (\r\n
\r\n
\r\n
\r\n
High Efficiency Filter
\r\n
\r\n
Loading Level
\r\n
\r\n this.saveInputValue(\"loadingLevel\", event.currentTarget.value, \"OutsideAirHighEfficiencyFilterInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"loadingLevelOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"loadingLevel\")}\r\n
\r\n
Type
\r\n
{highEfficiencyFilter.filterType}
\r\n
\r\n\r\n
\r\n
\r\n
Filter Removal
\r\n
\r\n this.saveInputValue(\"filterRemoval\", event.currentTarget.value, \"OutsideAirHighEfficiencyFilterInputs\")}\r\n disabled={disableFilterRemoval}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"filterRemovalOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"filterRemoval\")}\r\n
\r\n
Face Velocity
\r\n
{formatNumber(operatingMode.faceVelocity, 0)}
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
Pressure Drop
\r\n
{this.GetPressureDrop(\"Stage2\",operatingMode)}
\r\n
\r\n\r\n
\r\n\r\n
\r\n
Filter Size
\r\n
\r\n
Filter Size(s) Allowed
\r\n
\r\n this.saveInputValue(\"filterSizeRestriction\", event.currentTarget.value, \"OutsideAirHighEfficiencyFilterInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"filterSizeHighEfficiencyOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"filterSizeRestriction\")}\r\n
\r\n
Filter Size(s) Used
\r\n
{filterSizeUsed}
\r\n
\r\n\r\n
\r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n ) : null}\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CombinedFilter);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { addNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n targetVertex: string;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n operatingMode: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n humidifierManifoldComponent: any;\r\n enteringRHPercent: any;\r\n}\r\nclass HumidifierManifold extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n operatingMode: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n humidifierManifoldComponent: null,\r\n enteringRHPercent: null\r\n };\r\n\r\n async componentDidMount() {\r\n await this.getHumidifierManifoldData(this.props.targetVertex);\r\n }\r\n\r\n async componentDidUpdate(prevProps: IProps) {\r\n if (prevProps.targetVertex != this.props.targetVertex) {\r\n await this.getHumidifierManifoldData(this.props.targetVertex);\r\n }\r\n }\r\n\r\n private async getHumidifierManifoldData(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(`readapi/GetHumidifierManifoldInputValues/${targetVertex}`, projectId, unitId);\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.humidifierManifoldInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.humidifierManifoldInputs,\r\n operatingMode: result.uiDataContainer.humidifierManifoldOpMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n humidifierManifoldComponent: result.uiDataContainer.humidifierManifold,\r\n enteringRHPercent: result.uiDataContainer.enteringRHPercent\r\n });\r\n }\r\n }\r\n private async RunPerformance(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for humidifier manifold and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(`readapi/GetHumidifierManifoldInputValues/${targetVertex}`, projectId, unitId);\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.humidifierManifoldInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.humidifierManifoldInputs,\r\n operatingMode: result.uiDataContainer.humidifierManifoldOpMode,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n humidifierManifoldComponent: result.uiDataContainer.humidifierManifold,\r\n enteringRHPercent: result.uiDataContainer.enteringRHPercent\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateHumidifierManifold\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.humidifierManifoldInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n let savedValues = this.state.userInputs;\r\n let humidifierManifoldComponent = this.state.humidifierManifoldComponent;\r\n let displayFields = this.state.displayFields;\r\n let operatingMode = this.state.operatingMode;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n if (isEmptyObject(operatingMode)) {\r\n const notification = {\r\n id: \"coilOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Humidifier manifold operating mode not found.
\r\n };\r\n addNotification(notification);\r\n operatingMode = {};\r\n }\r\n\r\n return (\r\n
\r\n Humidifier Manifold\r\n\r\n
\r\n
\r\n
\r\n
\r\n
Air Temp
\r\n
\r\n
{formatNumber(operatingMode.enteringDryBulb, 1)}
\r\n
\r\n
\r\n
Absorption Distance
\r\n
{humidifierManifoldComponent.absorptionDistance}
\r\n
\r\n\r\n
\r\n
\r\n
Entering RH%
\r\n
\r\n
{formatNumber(this.state.enteringRHPercent, 1)}
\r\n
\r\n
\r\n
\r\n
Steam Pressure(PSIG)
\r\n
\r\n this.updateTextboxValue(\"steamPressure\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"steamPressure\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"steamPressure\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Desired Leaving RH%
\r\n
\r\n this.updateTextboxValue(\"desiredLeavingRH\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"desiredLeavingRH\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"desiredLeavingRH\")}\r\n
\r\n
Steam Capacity(lb/hr)
\r\n
{formatNumber(operatingMode.steamCapacity, 1) || \"\"}
\r\n
\r\n\r\n
\r\n
\r\n
Steam Source
\r\n
\r\n this.saveInputValue(\"steamSource\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"steamSourceOptions\")}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
this.RunPerformance(this.props.targetVertex)}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(HumidifierManifold);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { getSoundAttenuatorInputValues, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { addNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n targetVertex: string;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n soundAttenuatorComponent: any;\r\n}\r\nclass SoundAttenuator extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n soundAttenuatorComponent: null\r\n };\r\n\r\n async componentDidMount() {\r\n await this.getSoundAttenuatorData(this.props.targetVertex);\r\n }\r\n\r\n async componentDidUpdate(prevProps: IProps) {\r\n console.log(prevProps.targetVertex + \":\" + this.props.targetVertex);\r\n if (prevProps.targetVertex != this.props.targetVertex) {\r\n await this.getSoundAttenuatorData(this.props.targetVertex);\r\n }\r\n }\r\n\r\n private async getSoundAttenuatorData(targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await getSoundAttenuatorInputValues(projectId, unitId, targetVertex);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"soundAttenuatorInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetSoundAttenuatorInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.soundAttenuatorInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.soundAttenuatorInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n soundAttenuatorComponent: result.uiDataContainer.soundAttenuator\r\n });\r\n }\r\n }\r\n private async RunPerformance(targetVertex: string){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for sound attenuator and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await getSoundAttenuatorInputValues(projectId, unitId, targetVertex);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"soundAttenuatorInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetSoundAttenuatorInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.soundAttenuatorInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.soundAttenuatorInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n soundAttenuatorComponent: result.uiDataContainer.soundAttenuator\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateSoundAttenuator\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.soundAttenuatorInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n let title =\r\n this.props.targetVertex == \"SupplySoundAttenuatorInputs\"\r\n ? \"Supply Sound Attenuator\"\r\n : this.props.targetVertex == \"ReturnSoundAttenuatorInputs\"\r\n ? \"Return Sound Attenuator\"\r\n : \"\";\r\n\r\n let savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n let soundAttenuatorComponent = this.state.soundAttenuatorComponent;\r\n if (!soundAttenuatorComponent) {\r\n return null;\r\n }\r\n console.log(savedValues.soundAttenuatorLength);\r\n console.log(this.state.dropdownOptions);\r\n\r\n return (\r\n
\r\n {title}\r\n\r\n
\r\n
\r\n
\r\n
\r\n
Length
\r\n
\r\n this.saveInputValue(\"soundAttenuatorLength\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"soundAttenuatorLengthOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"soundAttenuatorLength\")}\r\n
\r\n
Face Velocity
\r\n
{formatNumber(soundAttenuatorComponent.faceVelocityFPM, 0)}
\r\n
\r\n\r\n
\r\n
\r\n
63 Hz Insertion Loss
\r\n
\r\n
{soundAttenuatorComponent.insertionLoss63Hz}
\r\n
\r\n
\r\n
1000 Hz Insertion Loss
\r\n
{soundAttenuatorComponent.insertionLoss1000Hz}
\r\n
\r\n\r\n
\r\n
\r\n
125 Hz Insertion Loss
\r\n
\r\n
{soundAttenuatorComponent.insertionLoss125Hz}
\r\n
\r\n
\r\n
2000 Hz Insertion Loss
\r\n
{soundAttenuatorComponent.insertionLoss2000Hz}
\r\n
\r\n\r\n
\r\n
\r\n
250 Hz Insertion Loss
\r\n
\r\n
{soundAttenuatorComponent.insertionLoss250Hz}
\r\n
\r\n
\r\n
4000 Hz Insertion Loss
\r\n
{soundAttenuatorComponent.insertionLoss4000Hz}
\r\n
\r\n\r\n
\r\n
\r\n
500 Hz Insertion Loss
\r\n
\r\n
{soundAttenuatorComponent.insertionLoss500Hz}
\r\n
\r\n
\r\n
8000 Hz Insertion Loss
\r\n
{soundAttenuatorComponent.insertionLoss8000Hz}
\r\n
\r\n
\r\n
\r\n
\r\n
this.RunPerformance(this.props.targetVertex)}>Update Design
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(SoundAttenuator);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject, isNullOrEmpty } from \"../../../utilities/helpers\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport { IHeatWheelOption } from \"../../../interfaces/interfaces\";\r\nimport { addNotification, clearAllPerformanceNotifications } from \"../../../api-utilities/notification-tools\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n dataContainer: any;\r\n}\r\n\r\nclass HeatWheel extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n dataContainer: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetHeatWheelPerformanceValues\", projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n if (result.uiDataContainer && result.uiDataContainer.heatWheelInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.heatWheelInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"wheelInputValuesError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetHeatWheelPerformanceValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(newValue: string) {\r\n let fieldName = \"modelNumber\";\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n clearAllPerformanceNotifications();\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n let inputResult = await updateInputField(\"updateHeatWheel\", projectId, unitId, fieldName, newValue, \"HeatWheelInputs\");\r\n\r\n //Run performance to update read-only props for chilled water coil and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n\r\n const result = await callGetEndpoint(\"readapi/GetHeatWheelPerformanceValues\", projectId, unitId);\r\n \r\n if (result.uiDataContainer && result.uiDataContainer.heatWheelInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.heatWheelInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n getCSSClass(modelNumber: string, selectedModelNumber: string) {\r\n return modelNumber == selectedModelNumber ? \"acc-td-optional acc-td-selected\" : \"acc-td-optional\";\r\n }\r\n getHeatWheelChoices(dataContainer: any) {\r\n const context = this;\r\n const options = dataContainer.heatWheelOptions;\r\n\r\n const selectedHeatWheel = this.getSelectedHeatWheel(dataContainer);\r\n const selectedModelNumber = selectedHeatWheel.modelNumber;\r\n\r\n const arr = options.map(function (item: IHeatWheelOption, index: number) {\r\n return (\r\n \r\n
\r\n
context.saveInputValue(item.modelNumber)}>\r\n
{item.modelNumber.replace(\"3C\", \"\")}
\r\n
{formatNumber(item.totalEffectiveness, 0)}%
\r\n
{formatNumber(item.summerLAT, 1)}F
\r\n
{formatNumber(item.summerWetBulbLAT, 1)}F
\r\n
{formatNumber(item.winterLAT, 1)}F
\r\n
{formatNumber(item.pressureDrop, 2)}\"
\r\n
\r\n
\r\n );\r\n });\r\n return arr;\r\n }\r\n\r\n getSelectedHeatWheel(dataContainer: any) {\r\n const userInputs = this.state.userInputs;\r\n const options = dataContainer.heatWheelOptions;\r\n\r\n //If the user has selected a heatWheel, return that\r\n if (!isNullOrEmpty(userInputs.modelNumber)) {\r\n return options.find((x: any) => x.modelNumber == userInputs.modelNumber);\r\n } else {\r\n //otherwise return the default one\r\n return options.find((x: any) => x.isDefaultOption);\r\n }\r\n }\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n let dataContainer = this.state.dataContainer;\r\n const isLocked = false;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n const selectedHeatWheel = this.getSelectedHeatWheel(dataContainer);\r\n\r\n return (\r\n
\r\n Heat Wheel\r\n\r\n
\r\n {/*
\r\n
\r\n
\r\n this.inputBuilder.updateCheckbox('isSelectionLocked', event)}\r\n />\r\n Lock Heat Wheel Selection\r\n
*/}\r\n\r\n
\r\n\r\n {/* {getErrorNotifications(this.props.reduxHeatwheel.errorMessages)} */}\r\n\r\n
\r\n
\r\n
\r\n Model\r\n
\r\n
Total Effectiveness
\r\n
Summer Design DB LAT
\r\n
Summer Design WB LAT
\r\n
Winter Design LAT
\r\n
Air Pressure Drop
\r\n
\r\n\r\n {this.getHeatWheelChoices(dataContainer)}\r\n
\r\n\r\n {/*
\r\n this.toggleMoreFields()}>\r\n {this.state.openMoreFields ? 'Show less...' : 'Show more...'}\r\n \r\n
*/}\r\n
\r\n\r\n
\r\n
\r\n
Sensible
\r\n
Latent
\r\n
Total
\r\n
\r\n
Summer Eff.
\r\n
{formatNumber(selectedHeatWheel.summerSensibleEff, 0)}%
\r\n
{formatNumber(selectedHeatWheel.summerLatentEff, 0)}%
\r\n
{formatNumber(selectedHeatWheel.summerTotalEff, 0)}%
\r\n
\r\n
Winter Eff.
\r\n
{formatNumber(selectedHeatWheel.winterSensibleEff, 0)}%
\r\n
{formatNumber(selectedHeatWheel.winterLatentEff, 0)}%
\r\n
{formatNumber(selectedHeatWheel.winterTotalEff, 0)}%
\r\n
\r\n
Enthalpy Rec. Ratio (ERR)
\r\n
-
\r\n
-
\r\n
{formatNumber(selectedHeatWheel.coolingEnthalpyRecoveryRatio, 0)}%
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(HeatWheel);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { addNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\nimport { getFilteredValidationErrors, getInputCSS, getNewValidationErrorsList, getValidationError } from \"../../../utilities/pageUtils\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n reduxComponentPerformance:any;\r\n targetVertex: string;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n electricHeateroperatingMode: any;\r\n preheatElectricHeateroperatingMode: any;\r\n electricHeaterInputs: any;\r\n dataContainer: any;\r\n displayFields:any;\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\nclass ElectricHeater extends React.Component {\r\n public state: IState = {\r\n electricHeateroperatingMode: null,\r\n preheatElectricHeateroperatingMode: null,\r\n electricHeaterInputs: null,\r\n dataContainer: null,\r\n displayFields: null,\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(`readapi/GetElectricHeaterInputValues/${this.props.targetVertex}`, projectId, unitId);\r\n\r\n if (result.uiDataContainer) {\r\n this.setState({\r\n electricHeateroperatingMode: result.uiDataContainer.electricHeaterOpMode,\r\n preheatElectricHeateroperatingMode: result.uiDataContainer.preheatElectricHeaterOpMode,\r\n dataContainer: result.uiDataContainer, //contains all the extra data fields\r\n displayFields: result.uiDataContainer.displayFields,\r\n electricHeaterInputs: result.uiDataContainer.electricHeaterInputs,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n //--------------------------RUN PERFORMANCE---------------------------------\r\n private async RunPerformance(targetVertex: string){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for filters and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(`readapi/GetElectricHeaterInputValues/${this.props.targetVertex}`, projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"ElectricHeaterError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetElectricHeaterInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.filterInputs) {\r\n this.setState({\r\n electricHeateroperatingMode: result.uiDataContainer.electricHeaterOpMode,\r\n preheatElectricHeateroperatingMode: result.uiDataContainer.preheatElectricHeaterOpMode,\r\n dataContainer: result.uiDataContainer, //contains all the extra data fields\r\n displayFields: result.uiDataContainer.displayFields,\r\n electricHeaterInputs: result.uiDataContainer.electricHeaterInputs,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n\r\n //*************** Methods only apply when it's a SecondaryElectricHeater ********************\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n public getValidationError(fieldName: string, className: string = \"\") {\r\n //Call the validation method from pageUtils\r\n let cssClass = className === \"\" ? \"validation-error1\" : \"validation-error-float\";\r\n return getValidationError(this.state.validationErrors, fieldName, cssClass);\r\n }\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.electricHeaterInputs, { [fieldName]: newValue });\r\n this.setState({ electricHeaterInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n \r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.removeValidationError(fieldName);\r\n\r\n //The target vertex for inputs at this point is SecondaryElectricHeater. The other heater types do not have inputs yet.\r\n let targetVertex = this.state.displayFields.isSecondaryHeating ? \"SecondaryElectricHeaterInputs\" : \"ElectricHeaterInputs\";\r\n let result = await updateInputField(\"updateElectricHeater\", projectId, unitId, fieldName, newValue, targetVertex);\r\n \r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n \r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n electricHeaterInputs: result.data.uiDataContainer.electricHeaterInputs,\r\n });\r\n }\r\n }\r\n }\r\n //*************** End Of Methods only apply when it's a SecondaryElectricHeater ********************\r\n GetTitle(targetVertex: string){\r\n if (targetVertex === \"ElectricHeater\"){\r\n return \"Electric Heater\";\r\n }\r\n else if (targetVertex === \"PreheatElectricHeater\") {\r\n return \"Electric Preheat\";\r\n }\r\n else {\r\n return \"\";\r\n }\r\n }\r\n public render() {\r\n let dataContainer = this.state.dataContainer;\r\n if (isEmptyObject(dataContainer)) {\r\n return null;\r\n }\r\n let targetVertex = this.props.targetVertex;\r\n let title = this.GetTitle(targetVertex);\r\n\r\n //SecondaryHeating can only exist on Electric Heaters and not Preheat Electric heaters.\r\n //Note: If user selects Electric Heater for Heating Type, then Secondary Heaters are not allowd.\r\n //The target vertex coming in is \"ElectricHeater\" for both an Electric heater that is chosen as the heating\r\n //type and a Secondary Electric Heater. PreHeat Electric Heater has a target vertex of \"PreheatElectricHeater\"\r\n let isSecondaryHeating = this.state.displayFields.isSecondaryHeating && targetVertex === \"ElectricHeater\";\r\n\r\n let electricHeater = {} as any;\r\n let operatingMode = {} as any;\r\n let powerKw = null;\r\n let amps = null;\r\n \r\n //Only populated if it's a SecondaryElectricHeater.\r\n const savedValues = this.state.electricHeaterInputs;\r\n \r\n if (this.props.targetVertex == \"ElectricHeater\") {\r\n electricHeater = this.props.reduxComponentPerformance.electricHeater;\r\n operatingMode = this.state.electricHeateroperatingMode;\r\n }\r\n if (this.props.targetVertex == \"PreheatElectricHeater\") {\r\n electricHeater = this.props.reduxComponentPerformance.preheatElectricHeater;\r\n operatingMode = this.state.preheatElectricHeateroperatingMode;\r\n }\r\n //EnteringDryBulb for an Electric Heater is for display only and comes from the operatingMode.\r\n //EnteringDryBulb for a Secondary Electric heater is editable and will show\r\n //1. the value from the operatingMode if the value has not been edited (enteringDryBulbTemperature from electricHeaterInputs will be null)\r\n //2. the value from electricHeaterInputs only after the value has been edited.\r\n let enteringDryBulbValueToShow = savedValues?.enteringDryBulbTemperature === null ? operatingMode.enteringDryBulb : savedValues?.enteringDryBulbTemperature;\r\n\r\n if (isEmptyObject(electricHeater)) {\r\n return null;\r\n }\r\n else{ //We need to show the total PowerKw and Amps\r\n if(electricHeater.powerKWPerHeater !== null && electricHeater.quantityInHeight !== null && electricHeater.quantityInWidth !== null){\r\n powerKw = electricHeater.powerKWPerHeater * electricHeater.quantityInHeight * electricHeater.quantityInWidth;\r\n }\r\n if(electricHeater.amperagePerHeater !== null && electricHeater.quantityInHeight !== null && electricHeater.quantityInWidth !== null){\r\n amps = electricHeater.amperagePerHeater * electricHeater.quantityInHeight * electricHeater.quantityInWidth;\r\n }\r\n }\r\n if (!operatingMode) {\r\n return null;\r\n }\r\n\r\n if (isEmptyObject(operatingMode)) {\r\n const notification = {\r\n id: \"elecOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
{targetVertex} operating mode not found.
\r\n };\r\n addNotification(notification);\r\n operatingMode = {};\r\n }\r\n\r\n return (\r\n
\r\n {title}\r\n\r\n
\r\n
\r\n\r\n
\r\n
Entering Air Temp
\r\n \r\n {!isSecondaryHeating ? \r\n
\r\n
{formatNumber(operatingMode.enteringDryBulb, 1) || \"\"}
\r\n
\r\n :\r\n
\r\n this.updateTextboxValue(\"enteringDryBulbTemperature\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"enteringDryBulbTemperature\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"enteringDryBulbTemperature\", \"validation-error-float\")}\r\n
\r\n }\r\n\r\n
Leaving Air Temp
\r\n
{formatNumber(operatingMode.leavingDryBulb, 1) || \"\"}
\r\n
\r\n\r\n
\r\n
Voltage
\r\n
\r\n
{dataContainer.voltage}
\r\n
\r\n
Power (kW)
\r\n
{formatNumber(powerKw, 1) || \"\"}
\r\n
\r\n\r\n
\r\n
Control Type
\r\n
\r\n
{dataContainer.controlType}
\r\n
\r\n
Amps
\r\n
{formatNumber(amps, 1) || \"\"}
\r\n
\r\n\r\n
\r\n {isSecondaryHeating ? \r\n <>\r\n
\r\n
this.RunPerformance(this.props.targetVertex)}>Update Design
\r\n
\r\n
\r\n \r\n : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxComponentPerformance: state.reduxComponentPerformance,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ElectricHeater);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { callGetEndpoint } from \"../../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { addNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n operatingMode: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n idfComponent: any;\r\n}\r\nclass IndirectFiredFurnace extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n operatingMode: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n idfComponent: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetIndirectFiredFurnaceInputValues\", projectId, unitId);\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"idfInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetIndirectFiredFurnaceInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer) {\r\n this.setState({\r\n idfComponent: result.uiDataContainer.idf,\r\n operatingMode: result.uiDataContainer.idfOpMode\r\n //displayFields: result.uiDataContainer.displayFields,\r\n //dropdownOptions: result.dropdownOptions,\r\n //validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n let idfComponent = this.state.idfComponent;\r\n let operatingMode = this.state.operatingMode;\r\n\r\n if (!idfComponent) {\r\n return null;\r\n }\r\n\r\n if (isEmptyObject(operatingMode)) {\r\n const notification = {\r\n id: \"coilOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Indirect fired furnace operating mode not found.
\r\n };\r\n addNotification(notification);\r\n operatingMode = {};\r\n }\r\n\r\n return (\r\n
\r\n Indirect Fired Furnace\r\n\r\n
\r\n
\r\n\r\n {/* {getErrorNotifications(this.props.reduxIDF.errorMessages)} */}\r\n\r\n
\r\n
Entering Air Temp
\r\n
\r\n
{formatNumber(operatingMode.enteringDryBulb, 1) || \"\"}
\r\n
\r\n
Leaving Air Temp
\r\n
{formatNumber(operatingMode.leavingDryBulb, 1) || \"\"}
\r\n
\r\n\r\n
\r\n
Model
\r\n
\r\n
{idfComponent.arrayDisplayString}
\r\n
\r\n
Output MBH
\r\n
{formatNumber(operatingMode.leavingMBHOut,1)}
\r\n
\r\n\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(IndirectFiredFurnace);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { getErrorNotifications, accordionHasError } from \"../../../api-utilities/notification-tools\";\r\nimport { addNotification, removeNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\nimport SpecItems from \"../../SpecItems\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n reduxComponentPerformance:any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n dataContainer: any;\r\n}\r\n\r\nclass PlateHeatExchanger extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n dataContainer: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetPlateHeatExchangerInputValues\", projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"plateInputValuesError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetPlateHeatExchangerInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.plateHeatExchangerInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.plateHeatExchangerInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n }\r\n private async RunPerformance(){\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for plate and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(\"readapi/GetPlateHeatExchangerInputValues\", projectId, unitId);\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"plateInputValuesError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetPlateHeatExchangerInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.plateHeatExchangerInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.plateHeatExchangerInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updatePlateHeatExchanger\", projectId, unitId, fieldName, newValue, \"PlateHeatExchangerInputs\");\r\n\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.plateHeatExchangerInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n public showPlateValidations(){\r\n if (this.props.reduxComponentPerformance.validationMessages){\r\n var plateMessages = this.props.reduxComponentPerformance.validationMessages.filter((item:any) => item.component === \"PlateHx\");\r\n if (plateMessages){\r\n var messages = plateMessages.map((item: any, index: number) => (\r\n item.message\r\n ));\r\n return getErrorNotifications(messages);\r\n }\r\n }\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const disablePlateInputs = this.state.displayFields?.plateHeatExhangerReadOnly;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n // const selectedPlateHxModelNumber = plateHX.selectedPlateHXModel ? plateHX.selectedPlateHXModel.value : '';\r\n // const isLocked = getBooleanValue(plateHX.isSelectionLocked);\r\n const isLocked = false;\r\n\r\n let dataContainer = this.state.dataContainer;\r\n\r\n return (\r\n
\r\n Plate Heat Exchanger\r\n\r\n
\r\n {/* //
\r\n // this.togglePanel()}\r\n // />\r\n\r\n //
\r\n //
\r\n //
\r\n // this.updateLockCheckBox(event.currentTarget.checked, selectedPlateHxModelNumber, event)}\r\n // />\r\n // Lock Plate HX Selection\r\n //
*/}\r\n\r\n
\r\n \r\n {this.showPlateValidations()}\r\n\r\n
Outside Airflow
\r\n {formatNumber(dataContainer.outsideAirflow, 0)}\r\n
\r\n
Exhaust Airflow
\r\n {formatNumber(dataContainer.exhaustAirflow, 0)}\r\n
\r\n
\r\n
Square Size & Spacing
\r\n
\r\n this.saveInputValue(\"squareAndSpacing\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"plateHxSquareAndSpacingOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"squareAndSpacing\")}\r\n
\r\n\r\n
\r\n
Width (mm)
\r\n
\r\n this.saveInputValue(\"plateHxWidthMm\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"plateHxWidthOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"plateHxWidthMm\")}\r\n
\r\n {/* Labels for choices */}\r\n
\r\n
\r\n
\r\n Model\r\n
\r\n
Sensible Effectiveness
\r\n
Summer Design DB LAT
\r\n
Summer Design WB LAT
\r\n
Winter Design LAT
\r\n
Air Pressure Drop
\r\n
\r\n
\r\n
\r\n
{dataContainer.model}
\r\n
{formatNumber(dataContainer.sensibleEffectiveness, 0)}%
\r\n
{formatNumber(dataContainer.summerLAT, 1)}F
\r\n
{formatNumber(dataContainer.summerWetBulbLAT, 1)}F
\r\n
{formatNumber(dataContainer.winterLAT, 1)}F
\r\n
{formatNumber(dataContainer.airPressureDrop, 2)}\"
\r\n
\r\n {/* {this.getPlateHXChoices(plateHX, selectedPlateHxModelNumber)} */}\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n
Sensible
\r\n
\r\n
Summer Temp Eff.
\r\n
{formatNumber(dataContainer.summerTempEff, 0)}%
\r\n
\r\n
Winter Temp Eff.
\r\n
{formatNumber(dataContainer.winterTempEff, 0)}%
\r\n
\r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxComponentPerformance: state.reduxComponentPerformance,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PlateHeatExchanger);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { updateUnitDesign } from \"../../../api-utilities/performanceUpdate\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { addNotification } from \"../../../api-utilities/notification-tools\";\r\nimport { formatNumber } from \"../../../api-utilities/formatting\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n reduxMenus: any;\r\n dxType: string;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n hasHotGasReheatCoil: boolean;\r\n dataContainer: any;\r\n}\r\n\r\nclass PackagedAc extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n hasHotGasReheatCoil: false,\r\n dataContainer: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetRefrigerationInputValues\", projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"refrigerationInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetRefrigerationInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.refrigerationInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.refrigerationInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n hasHotGasReheatCoil: result.uiDataContainer.hotGasReheatCoil != null ? true : false,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n }\r\n private async RunPerformance() {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n //Run performance to update read-only props for coils and update optimized design numbers.\r\n let perResponse = await updateUnitDesign(projectId, unitId);\r\n const result = await callGetEndpoint(\"readapi/GetRefrigerationInputValues\", projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"refrigerationInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
GetRefrigerationInputValues {result.errorMessage}
\r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer && result.uiDataContainer.refrigerationInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.refrigerationInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n hasHotGasReheatCoil: result.uiDataContainer.hotGasReheatCoil != null ? true : false,\r\n dataContainer: result.uiDataContainer //contains all the extra data fields\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n if (result.success) {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: true });\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.refrigerationInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n private showActualCompressorType() {\r\n if (this.state.userInputs.compressorType === \"Automatic\") {\r\n return true;\r\n }\r\n return false;\r\n }\r\n public async updateCheckbox(propertyName: string, newValue: any) {\r\n await this.saveInputValue(propertyName, newValue.toString());\r\n }\r\n\r\n private getTitle() {\r\n if (this.props.dxType == \"packaged\") {\r\n return \"Refrigeration - Packaged Air Cooled\";\r\n }\r\n if (this.props.dxType == \"packagedHgrh\") {\r\n return \"Refrigeration - Packaged Air Cooled w/HGRH\";\r\n }\r\n if (this.props.dxType == \"split\") {\r\n return \"Refrigeration - Split System (Remote Compressors/Condensers by Others)\";\r\n }\r\n if (this.props.dxType == \"dxPackagedWSHP\") {\r\n return \"Refrigeration - Packaged Water Source Heat Pump\";\r\n }\r\n if (this.props.dxType == \"dxPackagedHgrhWSHP\") {\r\n return \"Refrigeration - Packaged Water Source Heat Pump w/HGRH\";\r\n }\r\n return \"Refrigeration\";\r\n }\r\n\r\n //-----------------------------------------------------------------------------------------------\r\n public render() {\r\n let dataContainer = this.state.dataContainer;\r\n if (isEmptyObject(dataContainer)) {\r\n return null;\r\n }\r\n\r\n const dxCoil = dataContainer.dxCoil;\r\n let dxCoilOpMode = dataContainer.dxCoilOpMode;\r\n let dxCoilOpModeHeating = dataContainer.dxCoilOpModeHeating;\r\n const hotGasReheatCoil = dataContainer.hotGasReheatCoil;\r\n const hgrhCoilOpMode = dataContainer.hgrhCoilOpMode;\r\n\r\n //dxCoil object has to exist. HGRH is optional.\r\n if (isEmptyObject(dxCoil)) {\r\n return null;\r\n }\r\n\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n const isWSHP = displayFields.isWSHP;\r\n if (isEmptyObject(dxCoilOpMode)) {\r\n const notification = {\r\n id: \"coilOperatingModeError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
DX Coil operating mode not found.
\r\n };\r\n addNotification(notification);\r\n dxCoilOpMode = {};\r\n }\r\n\r\n let disableCircuits = false; //dxcoil.forceCircuitQuantityToTwo;\r\n let fieldsetClass = isWSHP ? \"optimize-fieldset-wshp\" : \"optimize-fieldset\";\r\n //Determine whether to show the update design button.\r\n let showOrHideUpdate = this.state.hasHotGasReheatCoil ? \"app-display-none\" : \"\";\r\n\r\n return (\r\n
\r\n {this.getTitle()}\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Circuit Quantity
\r\n
\r\n this.saveInputValue(\"circuitQuantity\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"circuitQuantityOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"circuitQuantity\")}\r\n
\r\n {displayFields.showCircuitQuantity ? (\r\n <>\r\n
Circuit Quantity
\r\n
{dataContainer.circuitQuantity}
\r\n \r\n ) : null}\r\n {isWSHP ? (\r\n <>\r\n
Total GPM
\r\n
{formatNumber(dataContainer.totalGPM, 1)}
\r\n \r\n ) : null}\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Cooling Tons
\r\n
{formatNumber(dataContainer.coolingTons, 1)}
\r\n {isWSHP ? (\r\n <>\r\n
Heating Tons
\r\n
{formatNumber(dataContainer.heatingTons, 1)}
\r\n \r\n ) : null}\r\n
\r\n\r\n {!isWSHP ? \r\n this.props.dxType == \"split\" ? null : (\r\n
\r\n \r\n
\r\n
Ambient Temp
\r\n
\r\n this.updateTextboxValue(\"ambientTemp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"ambientTemp\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"ambientTemp\")}\r\n
\r\n
Refrigeration EER
\r\n
{formatNumber(dataContainer.energyEfficiencyRatio, 1)}
\r\n
\r\n )\r\n : null}\r\n {this.props.dxType == \"split\" ? null : (\r\n
\r\n
\r\n
Compressor Type
\r\n
\r\n this.saveInputValue(\"compressorType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"compressorTypeOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"compressorType\")}\r\n
\r\n {this.showActualCompressorType() ? (\r\n <>\r\n
Compressor Type
\r\n
{dataContainer.actualCompressorType}
\r\n \r\n ) : null}\r\n {isWSHP ? \r\n <>\r\n
Refrigeration EER
\r\n
{formatNumber(dataContainer.energyEfficiencyRatio, 1)}
\r\n \r\n : null}\r\n {isWSHP ? (\r\n <>\r\n
Heating COP
\r\n
{formatNumber(dataContainer.heatingCOP, 1)}
\r\n \r\n ) : null}\r\n
\r\n )}\r\n
\r\n\r\n\r\n\r\n {/* /** =================== DIRECT EXPANSION COIL SECTION ========================== **/}\r\n
\r\n
Direct Expansion Coil
\r\n {isWSHP ? \r\n
\r\n
Cooling
\r\n
Heating
\r\n
\r\n : null}\r\n
\r\n
Entering Air DB
\r\n
\r\n
{formatNumber(dxCoilOpMode.enteringDryBulb, 1)}
\r\n
\r\n\r\n {isWSHP ? \r\n
{formatNumber(dxCoilOpModeHeating.enteringDryBulb, 1)}
\r\n : null\r\n }\r\n
Rows
\r\n
{dxCoil.rows}
\r\n\r\n
\r\n
\r\n
Entering Air WB
\r\n
\r\n
{formatNumber(dxCoilOpMode.enteringWetBulb, 1)}
\r\n
\r\n\r\n {isWSHP ?\r\n
{formatNumber(dxCoilOpModeHeating.enteringWetBulb, 1)}
\r\n : null\r\n }\r\n {/*
Leaving Air WB
\r\n
{dxcoil.leavingAirWetBulb}
*/}\r\n
Fins Per Inch
\r\n
{dxCoil.finsPerInch}
\r\n
\r\n
\r\n
Leaving Air DB
\r\n
\r\n
{formatNumber(dxCoilOpMode.leavingDryBulb, 1)}
\r\n
\r\n {isWSHP ?\r\n
{formatNumber(dxCoilOpModeHeating.leavingDryBulb, 1)}
\r\n : null\r\n }\r\n
Air Pressure Drop
\r\n
{formatNumber(dxCoilOpMode.airPressureDrop, 2)}
\r\n
\r\n
\r\n
Leaving Air WB
\r\n
\r\n
{formatNumber(dxCoilOpMode.leavingWetBulb, 1)}
\r\n
\r\n {isWSHP ?\r\n
{formatNumber(dxCoilOpModeHeating.leavingWetBulb, 1)}
\r\n : null\r\n }\r\n
\r\n
\r\n
\r\n {isWSHP ? \r\n <>\r\n
\r\n
Entering Fluid Temp
\r\n
\r\n
{formatNumber(dxCoilOpMode.enteringFluidTemperature, 1)}
\r\n
\r\n {isWSHP ?\r\n
{formatNumber(dxCoilOpModeHeating.enteringFluidTemperature, 1)}
\r\n : null\r\n }\r\n
\r\n
\r\n
\r\n
\r\n
Leaving Fluid Temp
\r\n
\r\n
{formatNumber(dxCoilOpMode.leavingFluidTemperature, 1)}
\r\n
\r\n {isWSHP ?\r\n
{formatNumber(dxCoilOpModeHeating.leavingFluidTemperature, 1)}
\r\n : null\r\n }\r\n
\r\n
\r\n
\r\n \r\n : null}\r\n {\r\n //TODO: figure out a way to implement this\r\n this.props.dxType === \"split\" ? (\r\n
\r\n
\r\n
Suction Temp
\r\n
\r\n this.updateTextboxValue(\"dxSuctionTemperature\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"dxSuctionTemperature\", event.currentTarget.value)}\r\n />\r\n
\r\n {this.getValidationError(\"dxSuctionTemperature\")}\r\n
\r\n
\r\n ) : null\r\n }\r\n
\r\n {/*
\r\n this.toggleMoreFields()}>\r\n {this.state.openMoreFields ? 'Show less...' : 'Show more...'}\r\n \r\n
*/}\r\n
\r\n
\r\n
\r\n
\r\n
Rows Override
\r\n
\r\n this.saveInputValue(\"dxRows\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dxRowsOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"dxRows\")}\r\n
\r\n\r\n
\r\n
Tube Thickness
\r\n
\r\n this.saveInputValue(\"dxTubeWallThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dxTubeWallThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"dxTubeWallThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Fins per Inch Override
\r\n
\r\n this.saveInputValue(\"dxFinsPerInch\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dxFinsPerInchOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"dxFinsPerInch\")}\r\n
\r\n\r\n
\r\n
Fin Material
\r\n
\r\n this.saveInputValue(\"dxFinMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dxFinMaterialOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"dxFinMaterial\")}\r\n
\r\n
\r\n\r\n
\r\n
Rifled Tubes
\r\n
\r\n this.updateCheckbox(\"dxRifledTubes\", event.currentTarget.checked)}\r\n />\r\n
\r\n
\r\n
Fin Thickness
\r\n
\r\n this.saveInputValue(\"dxFinThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dxFinThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"finThickness\")}\r\n
\r\n
\r\n \r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n
\r\n\r\n {/* /** =================== HOT GAS REHEAT COIL SECTION ========================== **/}\r\n {this.state.hasHotGasReheatCoil ? (\r\n <>\r\n
\r\n\r\n
\r\n
Hot Gas Reheat Coil
\r\n\r\n
\r\n\r\n {/* TODO: get this working again */}\r\n {/* {getErrorNotifications(this.props.reduxHotGasReheat.errorMessages)} */}\r\n\r\n
\r\n
Entering Air Temp
\r\n
\r\n
{formatNumber(hgrhCoilOpMode.enteringDryBulb, 1)}
\r\n
\r\n
Rows
\r\n
{hotGasReheatCoil.rows}
\r\n
\r\n\r\n
\r\n
Leaving Air Temp
\r\n
\r\n
{formatNumber(hgrhCoilOpMode.leavingDryBulb, 1)}
\r\n
\r\n
Fins Per Inch
\r\n
{hotGasReheatCoil.finsPerInch}
\r\n
\r\n\r\n
\r\n
Reheat Circuits
\r\n
\r\n
{hotGasReheatCoil.circuitQuantity}
\r\n
\r\n
Air Pressure Drop
\r\n
{formatNumber(hgrhCoilOpMode.airPressureDrop, 2)}
\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n
Rows Override
\r\n
\r\n this.saveInputValue(\"hgrhRows\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"hgrhRowsOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"hgrhRows\")}\r\n
\r\n\r\n
\r\n
Tube Thickness
\r\n
\r\n this.saveInputValue(\"hgrhTubeWallThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"hgrhTubeWallThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"hgrhTubeWallThickness\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Fins per Inch Override
\r\n
\r\n this.saveInputValue(\"hgrhFinsPerInch\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"hgrhFinsPerInchOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"hgrhFinsPerInch\")}\r\n
\r\n
\r\n
Fin Material
\r\n
\r\n this.saveInputValue(\"hgrhFinMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"hgrhFinMaterialOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"hgrhFinMaterial\")}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n
Fin Thickness
\r\n
\r\n this.saveInputValue(\"hgrhFinThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"hgrhFinThicknessOptions\")}\r\n \r\n
\r\n {this.getValidationError(\"hgrhFinThickness\")}\r\n
\r\n
\r\n \r\n
this.RunPerformance()}>Update Design
\r\n
\r\n
\r\n
\r\n \r\n ) : null}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxValidation: state.reduxValidation,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PackagedAc);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { match } from \"react-router\";\r\nimport UnitSizingLimits from \"./ComponentDisplay/UnitSizingLimits\";\r\nimport ChilledWaterCoil from \"./ComponentDisplay/ChilledWaterCoil\";\r\nimport HotWaterCoil from \"./ComponentDisplay/HotWaterCoil\";\r\nimport SteamCoil from \"./ComponentDisplay/SteamCoil\";\r\nimport Fan from \"./ComponentDisplay/Fan\";\r\nimport Filter from \"./ComponentDisplay/Filter\";\r\nimport CombinedFilter from \"./ComponentDisplay/CombinedFilter\";\r\nimport HumidifierManifold from \"./ComponentDisplay/HumidifierManifold\";\r\nimport SoundAttenuator from \"./ComponentDisplay/SoundAttenuator\";\r\nimport HeatWheel from \"./ComponentDisplay/HeatWheel\";\r\nimport ElectricHeater from \"./ComponentDisplay/ElectricHeater\";\r\nimport IndirectFiredFurnace from \"./ComponentDisplay/IndirectFiredFurnace\";\r\nimport PlateHeatExchanger from \"./ComponentDisplay/PlateHeatExchanger\";\r\nimport PackagedAc from \"./ComponentDisplay/PackagedAc\";\r\nimport \"../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n // updateRedux: any\r\n reduxOptimizeDesign: any;\r\n match: match;\r\n componentPerformanceData: any;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass OptimizeDesignInputs extends React.Component {\r\n public state: IState = {};\r\n\r\n public getButton(componentName: string, displayName: string) {\r\n const selectedComponent = this.props.reduxOptimizeDesign.selectedComponent;\r\n const selectedComponentName = this.props.reduxOptimizeDesign.selectedComponentName;\r\n const isActive = selectedComponentName == componentName ? true : false;\r\n //console.log(selectedComponentName + \":\" + componentName);\r\n const locked = false;\r\n const hasError = false;\r\n\r\n return (\r\n
this.selectComponent(componentName)}>\r\n {locked ?
: null}\r\n {hasError ?
: null}\r\n {displayName}\r\n
\r\n );\r\n }\r\n\r\n componentWillUnmount() {\r\n this.selectComponent(\"none\");\r\n }\r\n\r\n //Create buttons for all the components that got returned by the runPerformanceCalculations api call\r\n public getComponentButtons() {\r\n const componentPerformanceData = this.props.componentPerformanceData;\r\n if (!componentPerformanceData) {\r\n return null;\r\n }\r\n\r\n let primaryInputs = componentPerformanceData.primaryInputs;\r\n if (!primaryInputs) {\r\n return null;\r\n }\r\n const buttonArr = [];\r\n\r\n buttonArr.push(this.getButton(\"unitSizingLimits\", \"Unit Sizing Limits\"));\r\n if (componentPerformanceData.heatWheel) {\r\n buttonArr.push(this.getButton(\"heatWheel\", \"Heat Wheel\"));\r\n }\r\n if (componentPerformanceData.plateHx) {\r\n buttonArr.push(this.getButton(\"plateHx\", \"Plate Heat Exchanger\"));\r\n }\r\n if (componentPerformanceData.chilledWaterCoil) {\r\n buttonArr.push(this.getButton(\"chilledWaterCoil\", \"Chilled Water Coil\"));\r\n }\r\n if (primaryInputs.coolingType == \"DXSplit\") {\r\n buttonArr.push(this.getButton(\"dxSplit\", \"Refrigeration Split System\"));\r\n }\r\n if (primaryInputs.coolingType == \"DXPackaged\") {\r\n buttonArr.push(this.getButton(\"dxPackaged\", \"Packaged AC\"));\r\n }\r\n if (primaryInputs.coolingType == \"DXPackagedWithHotGasReheat\") {\r\n buttonArr.push(this.getButton(\"dxPackagedHgrh\", \"Packaged AC w/HGRH\"));\r\n }\r\n //WSHP\r\n if (primaryInputs.coolingType == \"WSHP\") {\r\n buttonArr.push(this.getButton(\"dxPackagedWSHP\", \"Packaged WSHP\"));\r\n }\r\n if (primaryInputs.coolingType == \"WSHPWithHotGasReheat\") {\r\n buttonArr.push(this.getButton(\"dxPackagedHgrhWSHP\", \"Packaged WSHP w/HGRH\"));\r\n }\r\n\r\n if (componentPerformanceData.preheatHotWaterCoil) {\r\n buttonArr.push(this.getButton(\"preheatHotWaterCoil\", \"Hot Water Preheat\"));\r\n }\r\n if (componentPerformanceData.preheatElectricHeater) {\r\n buttonArr.push(this.getButton(\"preheatElectricHeater\", \"Electric Preheat\"));\r\n }\r\n if (componentPerformanceData.hotWaterCoil) {\r\n buttonArr.push(this.getButton(\"hotWaterCoil\", \"Hot Water Coil\"));\r\n }\r\n if (componentPerformanceData.steamCoil) {\r\n buttonArr.push(this.getButton(\"steamCoil\", \"Steam Coil\"));\r\n }\r\n if (componentPerformanceData.idf) {\r\n buttonArr.push(this.getButton(\"idf\", \"Indirect Fired Furnace\"));\r\n }\r\n if (componentPerformanceData.electricHeater) {\r\n buttonArr.push(this.getButton(\"electricHeater\", \"Electric Heater\"));\r\n }\r\n if (componentPerformanceData.humidifierManifold) {\r\n buttonArr.push(this.getButton(\"humidifierManifold\", \"Humidifier Manifold\"));\r\n }\r\n if (componentPerformanceData.supplyFan) {\r\n buttonArr.push(this.getButton(\"supplyFan\", \"Supply Fan\"));\r\n }\r\n if (componentPerformanceData.exhaustFan) {\r\n buttonArr.push(this.getButton(\"exhaustFan\", \"Exhaust Fan\"));\r\n }\r\n if (componentPerformanceData.returnFan) {\r\n buttonArr.push(this.getButton(\"returnFan\", \"Return Fan\"));\r\n }\r\n //outsideAirPreFilter is the object that holds both Outside Air and Supply Air\r\n //Pre and high efficiency filters. Determin label to show on button.\r\n if (componentPerformanceData.outsideAirPreFilter) {\r\n let buttonLabel = \"\";\r\n if (componentPerformanceData.primaryInputs.airTunnelOrientationType !== \"NotSet\") {\r\n if (componentPerformanceData.outsideAirPreFilter.stage2Rating) {\r\n buttonLabel = \"Outside Air Filters\";\r\n } else {\r\n buttonLabel = \"Outside Air Prefilter\";\r\n }\r\n } else {\r\n if (componentPerformanceData.outsideAirPreFilter.stage2Rating) {\r\n buttonLabel = \"Supply Air Filters\";\r\n } else {\r\n buttonLabel = \"Supply Air Prefilter\";\r\n }\r\n }\r\n buttonArr.push(this.getButton(\"outsideAirPreFilter\", buttonLabel));\r\n }\r\n if (componentPerformanceData.outsideAirHighEfficiencyFilter) {\r\n buttonArr.push(this.getButton(\"outsideAirHighEfficiencyFilter\", \"Outside Air High Efficiency Filter\"));\r\n }\r\n if (componentPerformanceData.supplyAirFilter) {\r\n buttonArr.push(this.getButton(\"supplyAirFinalFilter\", \"Supply Air Final Filter\"));\r\n }\r\n if (componentPerformanceData.returnAirFilter) {\r\n buttonArr.push(this.getButton(\"returnAirFilter\", \"Return Air Filter\"));\r\n }\r\n if (componentPerformanceData.supplyAirSoundAttenuator) {\r\n buttonArr.push(this.getButton(\"supplyAirSoundAttenuator\", \"Supply Sound Attenuator\"));\r\n }\r\n if (componentPerformanceData.returnAirSoundAttenuator) {\r\n buttonArr.push(this.getButton(\"returnAirSoundAttenuator\", \"Return Sound Attenuator\"));\r\n }\r\n return buttonArr;\r\n }\r\n\r\n public selectComponent(componentName: string) {\r\n const components = {\r\n unitSizingLimits: ,\r\n chilledWaterCoil: ,\r\n dxPackaged: ,\r\n dxPackagedHgrh: ,\r\n dxPackagedWSHP: ,\r\n dxPackagedHgrhWSHP: ,\r\n dxSplit: ,\r\n electricHeater: ,\r\n exhaustFan: ,\r\n heatWheel: ,\r\n hotWaterCoil: ,\r\n humidifierManifold: ,\r\n idf: ,\r\n outsideAirPreFilter: ,\r\n plateHx: ,\r\n preheatElectricHeater: ,\r\n preheatHotWaterCoil: ,\r\n returnAirFilter: ,\r\n returnAirSoundAttenuator: ,\r\n returnFan: ,\r\n steamCoil: ,\r\n supplyAirFinalFilter: ,\r\n supplyAirSoundAttenuator: ,\r\n supplyFan: ,\r\n none: null\r\n };\r\n\r\n //stupid sytax to appease typescript. This puts the actual TSX component in redux, so it can be displayed below.\r\n this.props.updateRedux(\"UPDATE_OPTIMIZE_DESIGN\", {\r\n selectedComponent: components[componentName as keyof typeof components],\r\n selectedComponentName: componentName\r\n });\r\n }\r\n\r\n public render() {\r\n const selectedComponent = this.props.reduxOptimizeDesign.selectedComponent;\r\n return (\r\n
\r\n
Review & Modify
\r\n\r\n
\r\n
\r\n
{this.getComponentButtons()}
\r\n
\r\n
{selectedComponent}
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxOptimizeDesign: state.reduxOptimizeDesign\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(OptimizeDesignInputs);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { formatNumber, RoundUpToNearest } from \"../../api-utilities/formatting\";\r\nimport { callGetEndpoint } from \"../../api-calls/readApiService\";\r\nimport { updateUnitDesign } from \"../../api-utilities/performanceUpdate\";\r\nimport { displayErrorString } from \"../../api-utilities/api-calls\";\r\nimport { getValidationError, getInputCSS } from \"../../utilities/pageUtils\";\r\nimport { addNotification, removeNotification, formatIndividualErrors } from \"../../api-utilities/notification-tools\";\r\nimport OptimizeDesignInputs from \"./OptimizeDesignInputs\";\r\nimport { isEmptyArray, resetReduxModals } from \"../../utilities/helpers\";\r\nimport \"../../css/Performance.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxComponentPerformance: any;\r\n match: match;\r\n reduxModals: any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n //This property keeps track of whether the error box relating to height/width dimensions being over the limits\r\n //has already appeared at least once. Otherwise it keeps popping up even if the user has closed it.\r\n overLimitErrorShown: boolean;\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n}\r\n\r\nclass OptimizeDesign extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n overLimitErrorShown: false,\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: []\r\n };\r\n async componentDidMount() {\r\n await this.runPerformanceCalculations();\r\n //optimizedDesignInputChanged property determines whether the \"Update Design\" green button is lit up\r\n //or not on some of the optimize design accordians. Since performance was just run, set \r\n //optimizedDesignInputChanged to false since all updates have been handled and the buttons should be grey.\r\n this.props.updateRedux(\"UPDATE_MENUS\", { optimizedDesignInputChanged: false });\r\n }\r\n componentDidUpdate(prevProps: IProps){\r\n const modal = this.props.reduxModals;\r\n\r\n //If modal state changed from open to closed\r\n if (prevProps.reduxModals.showModal !== modal.showModal && modal.showModal === false) {\r\n //If the modal that just closed was the 'reset-design' modal, and the user response was 'ok'\r\n if (modal.modalId === 'reset-design' && modal.userResponse === 'ok') {\r\n this.resetToOptimized();\r\n }\r\n resetReduxModals();\r\n }\r\n }\r\n private async runPerformanceCalculations() {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n //This fetches read-only component data (not user inputs)\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const optimizeDesignResponse = await updateUnitDesign(projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(optimizeDesignResponse.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: optimizeDesignResponse.prerequisiteErrors });\r\n }\r\n\r\n //only turn off the recalc button if recalculation was successful.\r\n // if (!optimizeDesignResponse.hasCriticalError) {\r\n // this.props.updateRedux(\"UPDATE_OPTIMIZE_DESIGN\", { showRecalcButton: false });\r\n // }\r\n }\r\n\r\n private async recalculateUnitDesign() {\r\n //only run the update if the button is enabled\r\n // if (this.props.reduxOptimizeDesign.showRecalcButton) {\r\n // await this.runPerformanceCalculations();\r\n //this.props.updateRedux(\"UPDATE_OPTIMIZE_DESIGN\", { showRecalcButton: false });\r\n // }\r\n }\r\n private async confirmReset() {\r\n const modalData = {\r\n title: 'Warning',\r\n content:
By resetting, you will lose any modifications made within this screen.
\r\n };\r\n this.props.updateRedux('UPDATE_MODALS', {\r\n showModal: true,\r\n modalType: 'ModalPopup',\r\n modalId: 'reset-design',\r\n modalData: modalData,\r\n hideCancelBtn: false\r\n });\r\n }\r\n private async resetToOptimized() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n\r\n const optimizeDesignResponse = await callGetEndpoint(\"writeapi/resetToOptimizedDesign\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_COMPONENT_PERFORMANCE', optimizeDesignResponse);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_OPTIMIZE_DESIGN\", { showRecalcButton: false });\r\n this.props.updateRedux(\"UPDATE_OPTIMIZE_DESIGN\", { selectedComponent: null });\r\n //Update redux to invalidate the unit price\r\n this.props.updateRedux(\"UPDATE_PRICING\", { priceNeedsUpdate: true });\r\n }\r\n\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
\r\n
{item.source}
\r\n
{item.errorMessage}
\r\n
\r\n ));\r\n }\r\n return null;\r\n }\r\n\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
\r\n
Warning
\r\n
Design calculations cannot be run due to missing/invalid fields:
\r\n
\r\n
Page
\r\n
Field
\r\n
\r\n {this.getPrerequisiteErrors()}\r\n
\r\n\r\n
Please revisit these page(s) and fix any invalid inputs.
\r\n
\r\n );\r\n }\r\n\r\n const componentPerformanceData = this.props.reduxComponentPerformance;\r\n\r\n if (componentPerformanceData == null) {\r\n return null;\r\n }\r\n let unit = componentPerformanceData.unit;\r\n if (unit == null) {\r\n unit = {};\r\n }\r\n const isCustomized = unit && unit.isCustomizedDesign ? true : false;\r\n\r\n const optimizedLabel1 = !isCustomized ? \"optimize-label1\" : \"optimize-label1 optimize-label-disabled\";\r\n const optimizedLabel2 = !isCustomized ? \"optimize-label2\" : \"optimize-label2 optimize-label-disabled\";\r\n //const recalcButton = this.props.reduxOptimizeDesign.showRecalcButton ? \"optimize-update-btn\" : \"optimize-update-btn optimize-update-btn-disabled\";\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n SpecMate has created an optimized design based on your selections.\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/* {this.props.reduxOptimizeDesign.showRecalcButton ? (\r\n
this.recalculateUnitDesign()}>\r\n Apply Design Changes\r\n
\r\n ) : null} */}\r\n
\r\n
Casing Height
\r\n
Casing Width
\r\n
Approx. Weight
\r\n
Heating Leaving Temp
\r\n
Cooling Leaving Temp
\r\n
MCA
\r\n
MOP
\r\n\r\n
\r\n
SpecMate-Optimized Design
\r\n
{RoundUpToNearest(unit.casingHeightOptimized ?? 0, 1) || \"n/a\"}
\r\n
{RoundUpToNearest(unit.casingWidthOptimized ?? 0, 1) || \"n/a\"}
\r\n
{unit.approxWeightOptimized || \"n/a\"}
\r\n
{formatNumber(unit.heatingLeavingTempOptimized ?? 0, 2)}
\r\n
{formatNumber(unit.coolingLeavingTempOptimized ?? 0, 2)}
\r\n
{formatNumber(unit.mcaOptimized ?? 0, 1)}
\r\n
{formatNumber(unit.mopOptimized ?? 0, 1)}
\r\n\r\n {isCustomized ? (\r\n <>\r\n
\r\n
User-Modified Design
\r\n
{unit.casingHeight || \"n/a\"}
\r\n
{unit.casingWidth || \"n/a\"}
\r\n
{unit.approxWeight || \"n/a\"}
\r\n
{formatNumber(unit.heatingLeavingTemp ?? 0, 2)}
\r\n
{formatNumber(unit.coolingLeavingTemp ?? 0, 2)}
\r\n
{formatNumber(unit.mca ?? 0, 1)}
\r\n
{formatNumber(unit.mop ?? 0, 1)}
\r\n \r\n ) : null}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n {isCustomized ? (\r\n
\r\n
this.confirmReset()}>\r\n Reset to SpecMate-Optimized Design\r\n
\r\n
\r\n ) : (\r\n
Modify the design using the inputs below.
\r\n )}\r\n\r\n {/* {this.showCoolingReheatTemp() ? (\r\n
\r\n
Cooling Reheat Temp
\r\n
{this.formatTempValue(optimizedDesignPerformanceResult, \"coolingReheatTemp\")}
\r\n
\r\n ) : null} */}\r\n\r\n
\r\n \r\n\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxComponentPerformance: state.reduxComponentPerformance,\r\n reduxModals: state.reduxModals,\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(OptimizeDesign);\r\n","export enum DrawingScreen {\r\n Drawing = 0, \r\n CoilConnections = 1, \r\n ElectricalFurnacePanels = 2, \r\n AccessDoors = 3, \r\n LengthInputs = 4, \r\n}\r\nexport enum DrawingViewType {\r\n FrontSide = 0, \r\n BackSide = 1, \r\n LeftEnd = 2, \r\n RightEnd = 3, \r\n Top = 4, \r\n TopUpperTunnel = 5, \r\n TopBottomTunnel = 6, \r\n}","import * as React from 'react';\r\nimport {DrawingViewType} from '../../api-utilities/enums';\r\nimport '../../css/UnitDrawing.scss';\r\n\r\ninterface IProps {\r\n drawingView?: DrawingViewType;\r\n availableViewTypes: DrawingViewType[];\r\n updateDrawingView: (view: DrawingViewType) => Promise;\r\n}\r\ninterface IState {}\r\n\r\nexport class DrawingViewButtons extends React.Component {\r\n private getButtonCSS(value: number) {\r\n const currentValue = this.props.drawingView;\r\n\r\n //add class to extend button length if its one of the longer display values\r\n let cssClass =\r\n value === DrawingViewType.TopUpperTunnel || value === DrawingViewType.TopBottomTunnel\r\n ? 'drawing-btn drawing-btn-135'\r\n : 'drawing-btn';\r\n\r\n if (value === currentValue) {\r\n cssClass += ' drawing-btn-selected';\r\n }\r\n return cssClass;\r\n }\r\n\r\n public render() {\r\n const context = this;\r\n const options = {\r\n [DrawingViewType.FrontSide]: 'Front Side',\r\n [DrawingViewType.BackSide]: 'Back Side',\r\n [DrawingViewType.LeftEnd]: 'Left End',\r\n [DrawingViewType.RightEnd]: 'Right End',\r\n [DrawingViewType.Top]: 'Top',\r\n [DrawingViewType.TopUpperTunnel]: 'Top (Upper Tunnel)',\r\n [DrawingViewType.TopBottomTunnel]: 'Top (Lower Tunnel)'\r\n };\r\n return this.props.availableViewTypes.map((value) => {\r\n const displayValue = options[value];\r\n return (\r\n
this.props.updateDrawingView(value)}>\r\n {displayValue}\r\n
\r\n );\r\n });\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { match, matchPath } from 'react-router-dom';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { DrawingScreen, DrawingViewType} from '../../api-utilities/enums';\r\nimport { getUnitDrawing, callGetEndpoint } from \"../../api-calls/readApiService\";\r\nimport { addNotification, removeNotification } from '../../api-utilities/notification-tools';\r\nimport { DrawingViewButtons } from './DrawingViewButtons';\r\nimport { formatNumber, RoundToNearest, RoundUpToNearest } from '../../api-utilities/formatting';\r\nimport { isEmptyArray } from '../../utilities/helpers';\r\nimport '../../css/UnitDrawing.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxNotifications: any;\r\n reduxMenus: any;\r\n match: match;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {\r\n drawingState: IDrawingState;\r\n showUnitWidthTooltip: boolean;\r\n showUnitHeightTooltip: boolean;\r\n renderDefaultDrawing:boolean;\r\n LengthLimitMessageShown:boolean;\r\n completeData: string;\r\n defaultViewType: DrawingViewType;\r\n availableViewTypes: DrawingViewType[];\r\n hoodAndLouverExtensions: any;\r\n unit: any;\r\n showUnitLengthWarning: boolean;\r\n cabinetAndBaseHeight: any;\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n}\r\n\r\ninterface IDrawingState {\r\n svg: string;\r\n drawingView?: DrawingViewType;\r\n}\r\n\r\nclass UnitDrawing extends React.Component {\r\n public state: IState = {\r\n drawingState: { svg: '', drawingView: undefined },\r\n showUnitWidthTooltip: false,\r\n showUnitHeightTooltip: false,\r\n LengthLimitMessageShown:false,\r\n renderDefaultDrawing:false,\r\n completeData:\"\",\r\n defaultViewType: DrawingViewType.Top,\r\n availableViewTypes: [],\r\n hoodAndLouverExtensions: [],\r\n unit: null,\r\n showUnitLengthWarning: false,\r\n cabinetAndBaseHeight: null,\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: []\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetDrawingValues\", projectId, unitId);\r\n this.setState({\r\n unit: result.unit,\r\n completeData: result.completeData,\r\n defaultViewType: result.defaultViewType,\r\n availableViewTypes: result.availableViewTypes,\r\n renderDefaultDrawing:true,\r\n showUnitLengthWarning: result.showUnitLengthWarning,\r\n cabinetAndBaseHeight: result.cabinetAndBaseHeight,\r\n hoodAndLouverExtensions: result.hoodLouverExtensionInfo\r\n });\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.prerequisiteErrors });\r\n }\r\n else {\r\n //Get default drawing.\r\n await this.getDefaultDrawing();\r\n this.showLengthLimitMessage();\r\n }\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n }\r\n componentWillUnmount() {\r\n removeNotification('unitLengthLimitWarning');\r\n removeNotification('drawingDataErrors');\r\n }\r\n private async getDefaultDrawing(){\r\n //Get defualt drawing view.\r\n const drawingView =\r\n this.state.drawingState.drawingView === undefined\r\n ? this.state.defaultViewType!\r\n : this.state.drawingState.drawingView;\r\n //Show the default drawing.\r\n await this.selectDrawingView(drawingView);\r\n }\r\n //Get the updated SVG\r\n private async selectDrawingView(newValue: number) {\r\n let completeData = this.state.completeData;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const response = await getUnitDrawing(this.props.match.params, newValue, DrawingScreen.Drawing, completeData);\r\n\r\n if (response?.data?.dataPropertyErrors?.length > 0){\r\n const notification = {\r\n id: \"drawingDataErrors\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
Drawing data errors {response.data.dataPropertyErrors}
\r\n };\r\n addNotification(notification);\r\n }\r\n let svg = '';\r\n if (response?.data.drawings?.length){\r\n svg = response?.data.drawings[0].unitDrawingSvg;\r\n }\r\n this.setState({ drawingState: { svg: svg ?? '', drawingView: newValue } });\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n }\r\n\r\n private getViewButtonOptions() {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n }\r\n //Show/Hide tooltips on mouseover\r\n private showTooltip(tooltip: 'width' | 'length', state: boolean) {\r\n if (tooltip === 'width') {\r\n this.setState({ showUnitWidthTooltip: state });\r\n } else {\r\n this.setState({ showUnitHeightTooltip: state });\r\n }\r\n }\r\n //Get display content for each tooltip\r\n private getTooltipContent(tooltip: string) {\r\n const tooltipData = this.state.hoodAndLouverExtensions;\r\n if (tooltipData) {\r\n const tooltipItems = this.getTooltipListItems(tooltipData);\r\n const showTooltip = tooltip === 'width' ? this.state.showUnitWidthTooltip : this.state.showUnitHeightTooltip;\r\n\r\n return (\r\n
\r\n
\r\n The Overall Width and Overall Length values account for unit features such as roof overhang, electrical\r\n panels, and lifting lugs but do not include hoods and louvers{isEmptyArray(tooltipItems) ? '.' : ':'}\r\n
\r\n
    {tooltipItems}
\r\n
\r\n
\r\n );\r\n }\r\n }\r\n //hoodAndLouverExtensions comes from the server as a list of strings.\r\n private getTooltipListItems(tooltipData: any) {\r\n return tooltipData.map((item: any, index: number) => (\r\n
  • \r\n {item}\r\n
  • \r\n ));\r\n }\r\n //------------------------------------------------------------------------------------------\r\n private showLengthLimitMessage(){\r\n let showLengthWarning = this.state.showUnitLengthWarning;\r\n \r\n //Pop up the error message at bottom of screen, if it hasn't already been shown.\r\n if (showLengthWarning && !this.state.LengthLimitMessageShown) {\r\n let message =\r\n 'Unit dimensions exceed what is shippable without unit splits based on the unit’s length (Overall Length Limit w/o Split: 576). Unit is designed with a split as shown in drawings.';\r\n const notification = {\r\n id: 'unitLengthLimitWarning',\r\n notificationType: 'warning',\r\n title: 'Warning',\r\n content:
    {message}
    \r\n };\r\n addNotification(notification);\r\n this.setState({ LengthLimitMessageShown: true });\r\n }\r\n //Remove notification if there is no height or width error and we have previously shown the notification.\r\n else if (!showLengthWarning && this.state.LengthLimitMessageShown) {\r\n this.setState({ LengthLimitMessageShown: false });\r\n removeNotification('unitLengthLimitWarning');\r\n }\r\n return showLengthWarning;\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.source}
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
    \r\n
    Warning
    \r\n
    Design calculations cannot be run due to missing/invalid fields:
    \r\n
    \r\n
    Page
    \r\n
    Field
    \r\n
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n\r\n
    Please revisit these page(s) and fix any invalid inputs.
    \r\n
    \r\n );\r\n }\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    Recommended Clearances
    \r\n\r\n
    \r\n
    \r\n
  • \r\n
  • \r\n
    Minimum 40\" in front of access doors.
    \r\n
    \r\n\r\n
    \r\n
    \r\n
  • \r\n
  • \r\n
    \r\n Minimum 36\" in front of electrical panels. Electrical panel depth can vary from 8\" to 16\".\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
  • \r\n
  • \r\n
    \r\n Component removal may require more space than listed recommended clearances.\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n
    Curb Height Reminder
    \r\n\r\n
    \r\n
    \r\n
  • \r\n
  • \r\n
    \r\n All unit height values shown here are NOT inclusive of the unit curb if one is included.\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Unit Drawing Preview
    \r\n\r\n
    \r\n
    \r\n
    View:
    \r\n {this.getViewButtonOptions()}\r\n
    \r\n
    \r\n {this.state.drawingState.svg !== '' ? (\r\n
    \r\n ) : null}\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
    {/* Take up remaining horizontal space in browser */}
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus,\r\n reduxNotifications: state.reduxNotifications\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitDrawing);\r\n","import React from \"react\";\r\n\r\nexport function getTooltipContent(fieldName: string, showTooltip: boolean){\r\n \r\n //These fields require special html.\r\n if (fieldName === \"waterDesignTemp\"){\r\n return getWaterDesignTempMessage(showTooltip);\r\n }\r\n if (fieldName === \"poolApplicationType\"){\r\n return getPoolApplicationTypeMessage(showTooltip);\r\n }\r\n //Other fields. \r\n const toolTipMessage = getTooltipMessage(fieldName);\r\n \r\n return (\r\n
    \r\n
    \r\n {toolTipMessage}\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\nfunction getTooltipMessage(fieldName: string){\r\n let message = \"\";\r\n if (fieldName === \"poolDesignType\"){\r\n message = \"Used for determining the initial activity factor before accounting for additional activity from pool features.\";\r\n }\r\n if (fieldName === \"poolArea\"){\r\n message = \"Used for calculating the pool evaporation rate.\";\r\n }\r\n if (fieldName === \"poolFeatures\"){\r\n message = `Pool features increase the water evaporation rate and must be accounted for using the activity factor. If you are at \r\n all uncertain about whether a pool space includes one of these features or whether the activity factor listed is accurate for the given feature, contact Innovent for assistance.`;\r\n }\r\n if (fieldName === \"activityFactor\"){\r\n message = `The Activity Factor is a multiplier used to modify the ASHRAE equation for evaporation rate based on the type of pool and water \r\n features. If you are at all uncertain about whether the activity factor listed is accurate for a pool within a pool space, contact Innovent for assistance.`;\r\n }\r\n if (fieldName === \"dayDewPoint\"){\r\n message = \"Recommended to use 0.4% ASHRAE Dehumidification Dewpoint Day.\";\r\n }\r\n if (fieldName === \"spaceVolume\"){\r\n message = \"Used for calculating the Supply Air CFM (Supply CFM = Space Volume x ACH).\";\r\n }\r\n if (fieldName === \"airChangesPerHour\"){\r\n message = `ASHRAE recommends 4-6 ACH for recreational pools and 6-8 ACH for competition pools with spectators. Innovent recommends using 6 ACH, \r\n if you'd like to design lower than 6 ACH, then please reach out to your RSM.`;\r\n }\r\n if (fieldName === \"deckArea\"){\r\n message = `Used for calculating outside airflow per sqft to ensure the design stays above the min required. This is the area of the \r\n pool space not including the area of the pools themselves.`;\r\n }\r\n if (fieldName === \"winterDesignDayDryBulb\"){\r\n message = \"Recommended to use 0.4% ASHRAE Heating DB Temperature.\";\r\n }\r\n if (fieldName === \"evapMeanCoincidentDryBulb\"){\r\n message = \"Recommended to use 0.4% ASHRAE Evaporation MCDB Temperature.\";\r\n }\r\n if (fieldName === \"poolConstructionType\"){\r\n message = `New applications should always use 6 ACH, if you'd like to design with less ACH then please reach out to your RSM. Retrofit \r\n applications allow different ACH values in order to help meet the existing design CFM and corresponding duct work.`;\r\n }\r\n if (fieldName === \"evapWetBulb\"){\r\n message = \"Recommended to use 0.4% ASHRAE Evaporation WB Temperature.\";\r\n }\r\n if (fieldName === \"designDayDryBulb\"){\r\n message = \"Recommended to use 0.4% ASHRAE Cooling DB Temperature.\";\r\n }\r\n if (fieldName === \"dryBulbMeanCoincidentWetBulb\"){\r\n message = \"Recommended to use 0.4% ASHRAE Cooling MCWB Temperature.\";\r\n }\r\n if (fieldName === \"summerSpaceLoads\"){\r\n message = \"These are any additional sensible loads which will be used in the design for cooling components.\";\r\n }\r\n if (fieldName === \"winterSpaceLoads\"){\r\n message = \"These are any additional sensible loads which will be used in the design for heating components. Enter a positive number.\";\r\n }\r\n if (fieldName === \"purgeMode\"){\r\n message = `A high ventilation mode used after superchlorination to more rapidly remove airborne disinfection by-products from the \r\n space to keep contaminants from being re-entrained in the water so the pool can be safely re-opened for use.`;\r\n }\r\n if (fieldName === \"seatsQuantity\"){\r\n message = \"ASHRAE requires designing the amount of outside air to include 7.5 CFM per spectator.\";\r\n }\r\n if (fieldName === \"seatingArea\"){\r\n message = \"ASHRAE requires designing the amount of outside air to include 0.06 CFM/sq ft of spectator area.\";\r\n }\r\n if (fieldName === \"seatingIncludedInPoolDeckArea\"){\r\n message = `The Innovent unit can be designed to include the spectator area in the design which will increase the design CFM. \r\n If not included, then it is assumed the spectator area is being served by a dedicated air handling unit.`;\r\n }\r\n if (fieldName === \"poolSpaceAirTemperature\"){\r\n message = \"It is recommended to have the air temperature 2°F warmer than the pool water so that swimmers don't feel cold when leaving the pool.\";\r\n }\r\n if (fieldName === \"summerIndoorRelativeHumidity\"){\r\n message = `The higher the relative humidity design set point the lower the dehumidification load. ASHRAE recommends maintaining the pool area \r\n relative humidity between 50-60% RH for swimmer comfort and preventing organism growth.`;\r\n }\r\n if (fieldName === \"winterIndoorRelativeHumidity\"){\r\n message = \"In winter, the outdoor air is used exclusively for dehumidifying the space and no mechanical cooling is required.\";\r\n }\r\n return message;\r\n}\r\nfunction getWaterDesignTempMessage(showTooltip: boolean){\r\n return (\r\n
    \r\n
    \r\n ASHRAE guidelines are the following ranges based on Pool Type:\r\n
      \r\n
    • Competition Pool = 78-80°F
    • \r\n
    • Recreation Pool = 82-84°F
    • \r\n
    • Therapy Pool = 90-95°F
    • \r\n
    • Spa = 100-104°F
    • \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\nfunction getPoolApplicationTypeMessage(showTooltip: boolean){\r\n return (\r\n
    \r\n
    \r\n The default is set to \"Standard\" when the design dewpoint is above 68°F. \r\n If you'd like to design with 100% OA/No Cooling when the design dewpoint is greater than 68°F, then please reach out to your RSM.\r\n
      \r\n
    • Standard - Cooling coil is required in the unit design
    • \r\n
    • Arid Climate - No additional dehumidification is required, using min OA is sufficient but still may require a sensible cooling coil
    • \r\n
    • 100% OA/No Cooling - No cooling coil is required, the unit will use up to 100% OA for dehumidification
    • \r\n
    \r\n
    \r\n
    \r\n );\r\n}","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { updateInputField } from \"../../api-calls/readApiService\";\r\nimport {\r\n getPoolValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredPoolValidationErrors,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport \"../../css/PoolInputs.scss\";\r\nimport { formatNumber } from \"../../utilities/helpers\";\r\nimport { getTooltipContent } from \"./PoolUtilities\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n poolData:any;\r\n isFirstPool:boolean;\r\n displayFields: any;\r\n validationErrors:any[];\r\n dropdownOptions: any[];\r\n targetVertex:string;\r\n deletePool: (poolIndex: number) => void;\r\n //runPoolSpaceValidations: () => void;\r\n}\r\n// local state\r\ninterface IState {\r\n singlePoolInputs: any,\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n ShowPoolDesignTypeToolTip: boolean;\r\n ShowPoolAreaToolTip: boolean;\r\n ShowWaterDesignTempToolTip: boolean;\r\n ShowPoolFeaturesToolTip: boolean;\r\n ShowActivityFactorToolTip: boolean;\r\n}\r\n\r\nclass SinglePoolInput extends React.Component {\r\n public state: IState = {\r\n singlePoolInputs: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n displayFields: null,\r\n ShowPoolDesignTypeToolTip: false,\r\n ShowPoolAreaToolTip: false,\r\n ShowWaterDesignTempToolTip: false,\r\n ShowPoolFeaturesToolTip: false,\r\n ShowActivityFactorToolTip: false\r\n };\r\n\r\n async componentDidMount() {\r\n this.setState({\r\n singlePoolInputs: this.props.poolData,\r\n displayFields: this.props.displayFields,\r\n dropdownOptions: this.props.dropdownOptions,\r\n validationErrors: this.props.validationErrors\r\n });\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.singlePoolInputs, { [fieldName]: newValue });\r\n this.setState({ singlePoolInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string, poolIndex: number) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue, poolIndex);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string, poolIndex: number) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName, poolIndex);\r\n let result = await updateInputField(\"updateSinglePoolInputs\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.data.hasError){\r\n const notification = {\r\n id: \"individualPoolInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    updateSinglePoolInputs {result.data.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n if (result.success) {\r\n //If pool area was modified, need to run validations on the main page as pool area can affect the validation\r\n //for the deck area field on poolInputs page.\r\n // if (fieldName === \"poolArea\"){\r\n // this.props.runPoolSpaceValidations();\r\n // }\r\n \r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n singlePoolInputs: result.data.uiDataContainer.poolInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n if (result.data.uiDataContainer.dropdownOptions){\r\n this.setState({dropdownOptions: result.data.uiDataContainer.dropdownOptions});\r\n }\r\n }\r\n }\r\n }\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string, poolIndex: number, className:string = \"validation-pool\") {\r\n //Call the validation method from pageUtils\r\n return getPoolValidationError(this.state.validationErrors, fieldName, poolIndex, className);\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string, poolIndex: number) {\r\n let newArray = getFilteredPoolValidationErrors(this.state.validationErrors, fieldName, poolIndex);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //Show/Hide tooltips on mouseover and mouseleave\r\n private showTooltip(tooltip: any, state: boolean) {\r\n if (tooltip === \"poolDesignType\") {\r\n this.setState({ ShowPoolDesignTypeToolTip: state });\r\n }\r\n if (tooltip === \"poolArea\") {\r\n this.setState({ ShowPoolAreaToolTip: state });\r\n }\r\n if (tooltip === \"waterDesignTemp\") {\r\n this.setState({ ShowWaterDesignTempToolTip: state });\r\n }\r\n if (tooltip === \"poolFeatures\"){\r\n this.setState({ ShowPoolFeaturesToolTip:state});\r\n }\r\n if (tooltip === \"activityFactor\") {\r\n this.setState({ ShowActivityFactorToolTip: state });\r\n }\r\n }\r\n public render() {\r\n const pool = this.state.singlePoolInputs;\r\n const displayFields = this.state.displayFields;\r\n if (!displayFields || !pool) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n this.updateTextboxValue(\"poolName\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"poolName\", event.currentTarget.value, pool.poolIndex)}\r\n />\r\n {this.getValidationError(\"poolName\", pool.poolIndex)}\r\n
    \r\n
    \r\n this.saveInputValue(\"poolDesignType\", event.currentTarget.value, pool.poolIndex)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"poolTypeOptions\")}\r\n \r\n *\r\n this.showTooltip(\"poolDesignType\", true)}\r\n onMouseLeave={() => this.showTooltip(\"poolDesignType\", false)}\r\n >\r\n {getTooltipContent(\"poolDesignType\", this.state.ShowPoolDesignTypeToolTip)}\r\n
    \r\n
    \r\n this.updateTextboxValue(\"poolArea\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"poolArea\", event.currentTarget.value, pool.poolIndex)}\r\n />\r\n *\r\n this.showTooltip(\"poolArea\", true)}\r\n onMouseLeave={() => this.showTooltip(\"poolArea\", false)}\r\n >\r\n {getTooltipContent(\"poolArea\", this.state.ShowPoolAreaToolTip)}\r\n {this.getValidationError(\"poolArea\", pool.poolIndex)}\r\n
    \r\n
    \r\n this.updateTextboxValue(\"waterDesignTemp\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"waterDesignTemp\", event.currentTarget.value, pool.poolIndex)}\r\n />\r\n *\r\n this.showTooltip(\"waterDesignTemp\", true)}\r\n onMouseLeave={() => this.showTooltip(\"waterDesignTemp\", false)}\r\n >\r\n {getTooltipContent(\"waterDesignTemp\", this.state.ShowWaterDesignTempToolTip)}\r\n {this.getValidationError(\"waterDesignTemp\", pool.poolIndex)}\r\n
    \r\n
    \r\n this.saveInputValue(\"poolFeatures\", event.currentTarget.value, pool.poolIndex)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"pool\" + pool.poolIndex + \"FeaturesOptions\")}\r\n \r\n *\r\n this.showTooltip(\"poolFeatures\", true)}\r\n onMouseLeave={() => this.showTooltip(\"poolFeatures\", false)}\r\n >\r\n {getTooltipContent(\"poolFeatures\", this.state.ShowPoolFeaturesToolTip)}\r\n
    \r\n
    \r\n \r\n this.showTooltip(\"activityFactor\", true)}\r\n onMouseLeave={() => this.showTooltip(\"activityFactor\", false)}\r\n >\r\n {getTooltipContent(\"activityFactor\", this.state.ShowActivityFactorToolTip)}\r\n
    \r\n
    \r\n {this.props.isFirstPool === false ? \r\n this.props.deletePool(pool.poolIndex)}>Delete \r\n : }\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(SinglePoolInput);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { store } from \"../../redux/store\";\r\nimport { updateReduxAction } from \"../../redux/actions\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport {\r\n getAllPoolValues,\r\n updateInputField,\r\n addIndividualPool,\r\n deleteIndividualPool,\r\n runPoolCalculations,\r\n runPoolSpaceValidations\r\n} from \"../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport \"../../css/PoolInputs.scss\";\r\nimport { formatNumber, isEmptyArray, isNullOrEmpty } from \"../../utilities/helpers\";\r\nimport SinglePoolInput from \"./SinglePoolInput\";\r\nimport { getTooltipContent } from \"./PoolUtilities\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n poolSpaceInputs: any;\r\n poolOneInputs: any;\r\n poolTwoInputs: any;\r\n poolThreeInputs: any;\r\n poolFourInputs: any;\r\n poolFiveInputs: any;\r\n poolSpaceDisplayFields: any;\r\n poolsDisplayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n poolValidationErrors: any[];\r\n poolPrerequisiteErrors: any[];\r\n lastUpdatedTextbox: string;\r\n showPrerequisiteErrors: boolean;\r\n ShowDayDewPointToolTip: boolean;\r\n ShowPoolApplicationTypeToolTip: boolean;\r\n ShowPoolContructionTypeToolTip: boolean;\r\n ShowSpaceVolumeToolTip: boolean;\r\n ShowAirChangesPerHourToolTip: boolean;\r\n ShowDeckAreaToolTip: boolean;\r\n ShowWinterDesignDayDryBulbToolTip: boolean;\r\n ShowEvapMeanCoincidentDryBulbToolTip: boolean;\r\n ShowEvapWetBulbToolTip: boolean;\r\n ShowDesignDayDryBulbToolTip: boolean;\r\n ShowDryBulbMeanCoincidentWetBulbToolTip: boolean;\r\n ShowSummerSpaceLoadsToolTip: boolean;\r\n ShowWinterSpaceLoadsToolTip: boolean;\r\n ShowPurgeModeToolTip: boolean;\r\n ShowSeatsQuantityToolTip: boolean;\r\n ShowSeatingAreaToolTip: boolean;\r\n ShowSeatingIncludedInPoolDeckAreaToolTip: boolean;\r\n ShowPoolSpaceAirTemperatureToolTip: boolean;\r\n ShowSummerIndoorRelativeHumidityToolTip: boolean;\r\n ShowWinterIndoorRelativeHumidityToolTip: boolean;\r\n}\r\n\r\nclass PoolInputs extends React.Component {\r\n public state: IState = {\r\n poolSpaceInputs: null,\r\n poolOneInputs: null,\r\n poolTwoInputs: null,\r\n poolThreeInputs: null,\r\n poolFourInputs: null,\r\n poolFiveInputs: null,\r\n poolSpaceDisplayFields: null,\r\n poolsDisplayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n poolValidationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n poolPrerequisiteErrors: [],\r\n showPrerequisiteErrors: false,\r\n ShowDayDewPointToolTip: false,\r\n ShowPoolApplicationTypeToolTip: false,\r\n ShowPoolContructionTypeToolTip: false,\r\n ShowSpaceVolumeToolTip: false,\r\n ShowAirChangesPerHourToolTip: false,\r\n ShowDeckAreaToolTip: false,\r\n ShowWinterDesignDayDryBulbToolTip: false,\r\n ShowEvapMeanCoincidentDryBulbToolTip: false,\r\n ShowEvapWetBulbToolTip: false,\r\n ShowDesignDayDryBulbToolTip: false,\r\n ShowDryBulbMeanCoincidentWetBulbToolTip: false,\r\n ShowSummerSpaceLoadsToolTip: false,\r\n ShowWinterSpaceLoadsToolTip: false,\r\n ShowPurgeModeToolTip: false,\r\n ShowSeatsQuantityToolTip: false,\r\n ShowSeatingAreaToolTip: false,\r\n ShowSeatingIncludedInPoolDeckAreaToolTip: false,\r\n ShowPoolSpaceAirTemperatureToolTip: false,\r\n ShowSummerIndoorRelativeHumidityToolTip: false,\r\n ShowWinterIndoorRelativeHumidityToolTip: false\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await getAllPoolValues(projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"configInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    getAllPoolValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n let data = result.uiDataContainer;\r\n console.log(data);\r\n this.setState({\r\n poolSpaceInputs: data.poolSpaceInputs, //All inputs on pool page except individual pools.\r\n poolOneInputs: isNullOrEmpty(data.poolOneInputs) ? \"\" : data.poolOneInputs, // Pools 1 through 5.\r\n poolTwoInputs: isNullOrEmpty(data.poolTwoInputs) ? \"\" : data.poolTwoInputs,\r\n poolThreeInputs: isNullOrEmpty(data.poolThreeInputs) ? \"\" : data.poolThreeInputs,\r\n poolFourInputs: isNullOrEmpty(data.poolFourInputs) ? \"\" : data.poolFourInputs,\r\n poolFiveInputs: isNullOrEmpty(data.poolFiveInputs) ? \"\" : data.poolFiveInputs,\r\n poolSpaceDisplayFields: data.poolSpaceDisplayFields, //Display fields for all inputs except indivual pools.\r\n poolsDisplayFields: data.poolsDisplayFields, //Display fields for individual pools.\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n poolValidationErrors: result.poolValidationErrors\r\n });\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updatePoolSpaceTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.poolSpaceInputs, { [fieldName]: newValue });\r\n this.setState({ poolSpaceInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n this.removeValidationError(fieldName);\r\n if (fieldName === \"seatingArea\" || fieldName === \"seatingIncludedInPoolDeckArea\") {\r\n this.removeValidationError(\"deckArea\");\r\n }\r\n let result = await updateInputField(\"updatePoolSpaceInputs\", projectId, unitId, fieldName, newValue, \"PoolSpaceInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n poolSpaceInputs: result.data.uiDataContainer.poolSpaceInputs,\r\n poolSpaceDisplayFields: result.data.uiDataContainer.poolSpaceDisplayFields\r\n });\r\n }\r\n }\r\n }\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string, className: string = \"validation-pool\") {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, className);\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //Add an individual pool.\r\n private async addPool() {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n let result = await addIndividualPool(projectId, unitId);\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n poolOneInputs: result.data.uiDataContainer.poolOneInputs,\r\n poolTwoInputs: result.data.uiDataContainer.poolTwoInputs,\r\n poolThreeInputs: result.data.uiDataContainer.poolThreeInputs,\r\n poolFourInputs: result.data.uiDataContainer.poolFourInputs,\r\n poolFiveInputs: result.data.uiDataContainer.poolFiveInputs,\r\n poolsDisplayFields: result.data.uiDataContainer.poolsDisplayFields\r\n });\r\n }\r\n }\r\n }\r\n // public runPoolSpaceValidations = async () => {\r\n // let context = this;\r\n // const { projectId, unitId } = context.props.match.params;\r\n // let result = await runPoolSpaceValidations(projectId, unitId);\r\n // if (result.hasError) {\r\n // const notification = {\r\n // id: \"configInputsError\",\r\n // notificationType: \"error\",\r\n // title: \"Error\",\r\n // content:
    runPoolSpaceValidations {result.errorMessage}
    \r\n // };\r\n // addNotification(notification);\r\n // }\r\n // context.setState({\r\n // validationErrors: result.validations\r\n // });\r\n // }\r\n public deletePool = async (poolIndex: number) => {\r\n let context = this;\r\n const { projectId, unitId } = context.props.match.params;\r\n let result = await deleteIndividualPool(projectId, unitId, poolIndex);\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n context.addValidationErrors(result.data.validationErrors);\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n context.setState({\r\n poolOneInputs: result.data.uiDataContainer.poolOneInputs,\r\n poolTwoInputs: result.data.uiDataContainer.poolTwoInputs,\r\n poolThreeInputs: result.data.uiDataContainer.poolThreeInputs,\r\n poolFourInputs: result.data.uiDataContainer.poolFourInputs,\r\n poolFiveInputs: result.data.uiDataContainer.poolFiveInputs,\r\n poolsDisplayFields: result.data.uiDataContainer.poolsDisplayFields\r\n });\r\n }\r\n }\r\n };\r\n private async calculatePoolValues() {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n if (this.state.poolSpaceInputs.poolApplicationType === \"OneHundredPercentOANoCooling\") {\r\n const notification = {\r\n id: \"poolApplicationType\",\r\n notificationType: \"warning\",\r\n title: \"warning\",\r\n content: (\r\n
    \r\n 100% OA/No Cooling pool application selected. Summer indoor RH% reflects a Dry Bulb Design Day and will rise higher when OA dew point is greater\r\n than the dew point at this condition and will be uncontrollable. Space temp will be higher than shown and uncontrollable when OA Dry Bulb is greater\r\n than design space temp.\r\n
    \r\n )\r\n };\r\n addNotification(notification);\r\n }\r\n //SpaceHeight validation is done after pool calculations. Need to clear this error each time\r\n //pool calculations are run.\r\n this.removeValidationError(\"SpaceHeight\");\r\n let result = await runPoolCalculations(projectId, unitId);\r\n\r\n if (result.data.hasError) {\r\n const notification = {\r\n id: \"configInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    runPoolCalculations {result.data.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n poolSpaceInputs: result.data.uiDataContainer.poolSpaceInputs\r\n });\r\n }\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.data.poolPrerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, poolPrerequisiteErrors: result.data.poolPrerequisiteErrors });\r\n } else {\r\n this.setState({ showPrerequisiteErrors: false, poolPrerequisiteErrors: result.data.poolPrerequisiteErrors });\r\n }\r\n }\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.poolPrerequisiteErrors;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n //Show/Hide tooltips on mouseover and mouseleave\r\n private showTooltip(tooltip: any, state: boolean) {\r\n if (tooltip === \"dayDewPoint\") {\r\n this.setState({ ShowDayDewPointToolTip: state });\r\n }\r\n if (tooltip === \"poolApplicationType\") {\r\n this.setState({ ShowPoolApplicationTypeToolTip: state });\r\n }\r\n if (tooltip === \"poolConstructionType\") {\r\n this.setState({ ShowPoolContructionTypeToolTip: state });\r\n }\r\n if (tooltip === \"spaceVolume\") {\r\n this.setState({ ShowSpaceVolumeToolTip: state });\r\n }\r\n if (tooltip === \"airChangesPerHour\") {\r\n this.setState({ ShowAirChangesPerHourToolTip: state });\r\n }\r\n if (tooltip === \"deckArea\") {\r\n this.setState({ ShowDeckAreaToolTip: state });\r\n }\r\n if (tooltip === \"winterDesignDayDryBulb\") {\r\n this.setState({ ShowWinterDesignDayDryBulbToolTip: state });\r\n }\r\n if (tooltip === \"evapMeanCoincidentDryBulb\") {\r\n this.setState({ ShowEvapMeanCoincidentDryBulbToolTip: state });\r\n }\r\n if (tooltip === \"evapWetBulb\") {\r\n this.setState({ ShowEvapWetBulbToolTip: state });\r\n }\r\n if (tooltip === \"designDayDryBulb\") {\r\n this.setState({ ShowDesignDayDryBulbToolTip: state });\r\n }\r\n if (tooltip === \"dryBulbMeanCoincidentWetBulb\") {\r\n this.setState({ ShowDryBulbMeanCoincidentWetBulbToolTip: state });\r\n }\r\n if (tooltip === \"summerSpaceLoads\") {\r\n this.setState({ ShowSummerSpaceLoadsToolTip: state });\r\n }\r\n if (tooltip === \"winterSpaceLoads\") {\r\n this.setState({ ShowWinterSpaceLoadsToolTip: state });\r\n }\r\n if (tooltip === \"purgeMode\") {\r\n this.setState({ ShowPurgeModeToolTip: state });\r\n }\r\n if (tooltip === \"seatsQuantity\") {\r\n this.setState({ ShowSeatsQuantityToolTip: state });\r\n }\r\n if (tooltip === \"seatingArea\") {\r\n this.setState({ ShowSeatingAreaToolTip: state });\r\n }\r\n if (tooltip === \"seatingIncludedInPoolDeckArea\") {\r\n this.setState({ ShowSeatingIncludedInPoolDeckAreaToolTip: state });\r\n }\r\n if (tooltip === \"poolSpaceAirTemperature\") {\r\n this.setState({ ShowPoolSpaceAirTemperatureToolTip: state });\r\n }\r\n if (tooltip === \"summerIndoorRelativeHumidity\") {\r\n this.setState({ ShowSummerIndoorRelativeHumidityToolTip: state });\r\n }\r\n if (tooltip === \"winterIndoorRelativeHumidity\") {\r\n this.setState({ ShowWinterIndoorRelativeHumidityToolTip: state });\r\n }\r\n }\r\n public render() {\r\n const poolSpaceValues = this.state.poolSpaceInputs;\r\n const addButtonClass = this.state.poolFiveInputs ? \"pools-add-button-disable\" : \"\";\r\n const poolsDisplayFields = this.state.poolsDisplayFields;\r\n const poolSpaceDisplayFields = this.state.poolSpaceDisplayFields;\r\n if (!poolSpaceValues) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n
    \r\n
    Pool Information
    \r\n
    \r\n
    \r\n
    this.addPool()}>+ Add Pool
    \r\n
    \r\n
    Pool Type
    \r\n
    Pool Surface Area (ft²)
    \r\n
    Water Design Temp (°F)
    \r\n
    Pool Features
    \r\n
    Activity Factor
    \r\n
    \r\n\r\n \r\n\r\n {poolsDisplayFields.showPoolTwo === true ? (\r\n \r\n ) : null}\r\n\r\n {poolsDisplayFields.showPoolThree ? (\r\n \r\n ) : null}\r\n\r\n {poolsDisplayFields.showPoolFour ? (\r\n \r\n ) : null}\r\n\r\n {poolsDisplayFields.showPoolFive ? (\r\n \r\n ) : null}\r\n\r\n
    \r\n
    \r\n
    \r\n
    Job Information
    \r\n
    \r\n
    \r\n
    Dew Point Day Dew Point (°F)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"dayDewPoint\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"dayDewPoint\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"dayDewPoint\", true)}\r\n onMouseLeave={() => this.showTooltip(\"dayDewPoint\", false)}\r\n >\r\n {getTooltipContent(\"dayDewPoint\", this.state.ShowDayDewPointToolTip)}\r\n {this.getValidationError(\"dayDewPoint\")}\r\n
    \r\n
    Pool Application Type
    \r\n
    \r\n this.saveInputValue(\"poolApplicationType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"poolApplicationTypeOptions\")}\r\n \r\n *\r\n this.showTooltip(\"poolApplicationType\", true)}\r\n onMouseLeave={() => this.showTooltip(\"poolApplicationType\", false)}\r\n >\r\n {getTooltipContent(\"poolApplicationType\", this.state.ShowPoolApplicationTypeToolTip)}\r\n {this.getValidationError(\"poolApplicationType\")}\r\n
    \r\n
    Pool Construction Type
    \r\n
    \r\n this.saveInputValue(\"poolConstructionType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"poolConstructionTypeOptions\")}\r\n \r\n this.showTooltip(\"poolConstructionType\", true)}\r\n onMouseLeave={() => this.showTooltip(\"poolConstructionType\", false)}\r\n >\r\n {getTooltipContent(\"poolConstructionType\", this.state.ShowPoolContructionTypeToolTip)}\r\n {this.getValidationError(\"poolConstructionType\")}\r\n
    \r\n
    Elevation (ft)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"elevation\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"elevation\", event.currentTarget.value)}\r\n />\r\n *\r\n {this.getValidationError(\"elevation\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    Space Loads
    \r\n
    \r\n
    Summer Space Loads (btu/hr)
    \r\n this.showTooltip(\"summerSpaceLoads\", true)}\r\n onMouseLeave={() => this.showTooltip(\"summerSpaceLoads\", false)}\r\n >\r\n {getTooltipContent(\"summerSpaceLoads\", this.state.ShowSummerSpaceLoadsToolTip)}\r\n\r\n
    \r\n
    Walls
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"summerSpaceLoadsWall\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"summerSpaceLoadsWall\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"summerSpaceLoadsWall\", \"validation-pool-space-loads\")}\r\n
    \r\n
    Roof
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"summerSpaceLoadsRoof\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"summerSpaceLoadsRoof\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"summerSpaceLoadsRoof\", \"validation-pool-space-loads\")}\r\n
    \r\n
    Solar
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"summerSpaceLoadsSolar\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"summerSpaceLoadsSolar\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"summerSpaceLoadsSolar\", \"validation-pool-space-loads\")}\r\n
    \r\n
    Lighting
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"summerSpaceLoadsLighting\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"summerSpaceLoadsLighting\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"summerSpaceLoadsLighting\", \"validation-pool-space-loads\")}\r\n
    \r\n
    \r\n
    Winter Space Loads (btu/hr)
    \r\n this.showTooltip(\"winterSpaceLoads\", true)}\r\n onMouseLeave={() => this.showTooltip(\"winterSpaceLoads\", false)}\r\n >\r\n {getTooltipContent(\"winterSpaceLoads\", this.state.ShowWinterSpaceLoadsToolTip)}\r\n
    \r\n
    Walls
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"winterSpaceLoadsWalls\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"winterSpaceLoadsWalls\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"winterSpaceLoadsWalls\", \"validation-pool-space-loads\")}\r\n
    \r\n
    Roof
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"winterSpaceLoadsRoof\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"winterSpaceLoadsRoof\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"winterSpaceLoadsRoof\", \"validation-pool-space-loads\")}\r\n
    \r\n
    \r\n
    \r\n
    Purge Mode
    \r\n
    \r\n this.saveInputValue(\"purgeMode\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"poolPurgeModeOptions\")}\r\n \r\n this.showTooltip(\"purgeMode\", true)}\r\n onMouseLeave={() => this.showTooltip(\"purgeMode\", false)}\r\n >\r\n {getTooltipContent(\"purgeMode\", this.state.ShowPurgeModeToolTip)}\r\n
    \r\n
    \r\n
    \r\n
    # of Spectator Seats
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"seatsQuantity\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"seatsQuantity\", event.currentTarget.value)}\r\n />\r\n this.showTooltip(\"seatsQuantity\", true)}\r\n onMouseLeave={() => this.showTooltip(\"seatsQuantity\", false)}\r\n >\r\n {getTooltipContent(\"seatsQuantity\", this.state.ShowSeatsQuantityToolTip)}\r\n {this.getValidationError(\"seatsQuantity\")}\r\n
    \r\n
    \r\n
    \r\n
    Spectator Seating Area (ft²)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"seatingArea\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"seatingArea\", event.currentTarget.value)}\r\n />\r\n this.showTooltip(\"seatingArea\", true)}\r\n onMouseLeave={() => this.showTooltip(\"seatingArea\", false)}\r\n >\r\n {getTooltipContent(\"seatingArea\", this.state.ShowSeatingAreaToolTip)}\r\n {this.getValidationError(\"seatingArea\")}\r\n
    \r\n
    \r\n
    \r\n
    Spectator Seating Included in Pool/Deck Area?
    \r\n
    \r\n this.saveInputValue(\"seatingIncludedInPoolDeckArea\", event.currentTarget.checked.toString())}\r\n />\r\n this.showTooltip(\"seatingIncludedInPoolDeckArea\", true)}\r\n onMouseLeave={() => this.showTooltip(\"seatingIncludedInPoolDeckArea\", false)}\r\n >\r\n {getTooltipContent(\"seatingIncludedInPoolDeckArea\", this.state.ShowSeatingIncludedInPoolDeckAreaToolTip)}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    Airflow and Design Temps
    \r\n
    \r\n
    \r\n
    Space Volume (ft³)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"spaceVolume\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"spaceVolume\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"spaceVolume\", true)}\r\n onMouseLeave={() => this.showTooltip(\"spaceVolume\", false)}\r\n >\r\n {getTooltipContent(\"spaceVolume\", this.state.ShowSpaceVolumeToolTip)}\r\n {this.getValidationError(\"spaceVolume\")}\r\n
    \r\n
    \r\n
    \r\n
    Air Changes Per Hour
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"airChangesPerHour\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"airChangesPerHour\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"airChangesPerHour\", true)}\r\n onMouseLeave={() => this.showTooltip(\"airChangesPerHour\", false)}\r\n >\r\n {getTooltipContent(\"airChangesPerHour\", this.state.ShowAirChangesPerHourToolTip)}\r\n {this.getValidationError(\"airChangesPerHour\")}\r\n
    \r\n
    \r\n
    \r\n
    Deck Area (ft²)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"deckArea\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"deckArea\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"deckArea\", true)}\r\n onMouseLeave={() => this.showTooltip(\"deckArea\", false)}\r\n >\r\n {getTooltipContent(\"deckArea\", this.state.ShowDeckAreaToolTip)}\r\n {this.getValidationError(\"deckArea\")}\r\n
    \r\n
    \r\n
    \r\n
    Winter Design Day Dry Bulb (°F)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"winterDesignDayDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"winterDesignDayDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"winterDesignDayDryBulb\", true)}\r\n onMouseLeave={() => this.showTooltip(\"winterDesignDayDryBulb\", false)}\r\n >\r\n {getTooltipContent(\"winterDesignDayDryBulb\", this.state.ShowWinterDesignDayDryBulbToolTip)}\r\n {this.getValidationError(\"winterDesignDayDryBulb\")}\r\n
    \r\n
    \r\n {poolSpaceDisplayFields.showDesignDayDryBulb ? (\r\n
    \r\n
    Dry Bulb Design Day Dry Bulb (°F)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"designDayDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"designDayDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"designDayDryBulb\", true)}\r\n onMouseLeave={() => this.showTooltip(\"designDayDryBulb\", false)}\r\n >\r\n {getTooltipContent(\"designDayDryBulb\", this.state.ShowDesignDayDryBulbToolTip)}\r\n {this.getValidationError(\"designDayDryBulb\")}\r\n
    \r\n
    \r\n ) : null}\r\n {poolSpaceDisplayFields.showDryBulbMeanCoincidentWetBulb ? (\r\n
    \r\n
    Dry Bulb Design Day Mean Coincident Wet Bulb (°F)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"dryBulbMeanCoincidentWetBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"dryBulbMeanCoincidentWetBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"dryBulbMeanCoincidentWetBulb\", true)}\r\n onMouseLeave={() => this.showTooltip(\"dryBulbMeanCoincidentWetBulb\", false)}\r\n >\r\n {getTooltipContent(\"dryBulbMeanCoincidentWetBulb\", this.state.ShowDryBulbMeanCoincidentWetBulbToolTip)}\r\n {this.getValidationError(\"dryBulbMeanCoincidentWetBulb\")}\r\n
    \r\n
    \r\n ) : null}\r\n {poolSpaceDisplayFields.showEvapMeanCoincidentDryBulb ? (\r\n
    \r\n
    Evaporation Design Day Mean Coincident Dry Bulb (°F)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"evapMeanCoincidentDryBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"evapMeanCoincidentDryBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"evapMeanCoincidentDryBulb\", true)}\r\n onMouseLeave={() => this.showTooltip(\"evapMeanCoincidentDryBulb\", false)}\r\n >\r\n {getTooltipContent(\"evapMeanCoincidentDryBulb\", this.state.ShowEvapMeanCoincidentDryBulbToolTip)}\r\n {this.getValidationError(\"evapMeanCoincidentDryBulb\")}\r\n
    \r\n
    \r\n ) : null}\r\n {poolSpaceDisplayFields.showEvapWetBulb ? (\r\n
    \r\n
    Evaporation Design Day Wet Bulb (°F)
    \r\n
    \r\n this.updatePoolSpaceTextboxValue(\"evapWetBulb\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"evapWetBulb\", event.currentTarget.value)}\r\n />\r\n *\r\n this.showTooltip(\"evapWetBulb\", true)}\r\n onMouseLeave={() => this.showTooltip(\"evapWetBulb\", false)}\r\n >\r\n {getTooltipContent(\"evapWetBulb\", this.state.ShowEvapWetBulbToolTip)}\r\n {this.getValidationError(\"evapWetBulb\")}\r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n\r\n
    \r\n
    \r\n
    this.calculatePoolValues()}>\r\n Calculate Pool Values\r\n
    \r\n
    \r\n
    \r\n
    Pool Air Design Temp (°F)
    \r\n \r\n this.showTooltip(\"poolSpaceAirTemperature\", true)}\r\n onMouseLeave={() => this.showTooltip(\"poolSpaceAirTemperature\", false)}\r\n >\r\n {getTooltipContent(\"poolSpaceAirTemperature\", this.state.ShowPoolSpaceAirTemperatureToolTip)}\r\n
    \r\n
    \r\n
    \r\n
    Summer Indoor Relative Humidity %
    \r\n \r\n this.showTooltip(\"summerIndoorRelativeHumidity\", true)}\r\n onMouseLeave={() => this.showTooltip(\"summerIndoorRelativeHumidity\", false)}\r\n >\r\n {getTooltipContent(\"summerIndoorRelativeHumidity\", this.state.ShowSummerIndoorRelativeHumidityToolTip)}\r\n {this.getValidationError(\"summerIndoorRelativeHumidity\")}\r\n
    \r\n
    \r\n
    \r\n
    Winter Indoor Relative Humidity %
    \r\n \r\n this.showTooltip(\"winterIndoorRelativeHumidity\", true)}\r\n onMouseLeave={() => this.showTooltip(\"winterIndoorRelativeHumidity\", false)}\r\n >\r\n {getTooltipContent(\"winterIndoorRelativeHumidity\", this.state.ShowWinterIndoorRelativeHumidityToolTip)}\r\n {this.getValidationError(\"winterIndoorRelativeHumidity\")}\r\n
    \r\n
    \r\n
    \r\n
    Calculated Average Space Height (ft)
    \r\n \r\n {this.getValidationError(\"spaceHeight\")}\r\n
    \r\n {this.state.showPrerequisiteErrors ? (\r\n
    \r\n
    Pool calculations cannot be run due to these missing/invalid fields:
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PoolInputs);\r\n","import { store } from \"../redux/store\";\r\nimport { updateReduxAction } from \"../redux/actions\";\r\nimport { callGetEndpoint } from \"../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../utilities/helpers\";\r\n\r\nexport async function checkIsProEditMode(projectId: number, unitId: number) {\r\n const selectedUnit = store.getState().reduxSelectedUnit as any;\r\n const selectedUnitId = isEmptyObject(selectedUnit) || isEmptyObject(selectedUnit.unit) ? 0 : selectedUnit.unit.id;\r\n\r\n //Check if selectedUnit in redux matches unitId in the URL\r\n //If not, fetch unit from Graph\r\n if (`unit-${unitId}` != selectedUnitId) {\r\n if (!selectedUnit.unitCallInProgress) {\r\n store.dispatch(updateReduxAction(\"UPDATE_SELECTED_UNIT\", { unitCallInProgress: true }));\r\n\r\n const response = await callGetEndpoint(\"readapi/getUnit\", projectId, unitId);\r\n if (!response.hasError) {\r\n store.dispatch(updateReduxAction(\"UPDATE_SELECTED_UNIT\", { unit: response.unit }));\r\n if (response.unit.isProEditMode == true) {\r\n return true;\r\n }\r\n }\r\n store.dispatch(updateReduxAction(\"UPDATE_SELECTED_UNIT\", { unitCallInProgress: false }));\r\n }\r\n } else {\r\n if (selectedUnit.unit.isProEditMode == true) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Route, match } from \"react-router-dom\";\r\nimport DesignSubMenu from \"./Menus/DesignSubMenu\";\r\nimport ConfigurationInputs from \"./CreateDesign/ConfigurationInputs\";\r\n//import ConnectionsOptions from './CreateDesign/ConnectionsOptions';\r\nimport InletOutlet from \"./CreateDesign/InletOutlet\"; //\r\nimport UnitSelection from \"./CreateDesign/UnitSelection\";\r\nimport TempsSystem from \"./CreateDesign/TempsSystem\";\r\n//import Performance from \"./CreateDesign/Performance\";\r\nimport OptimizeDesign from \"./CreateDesign/OptimizeDesign\";\r\nimport UnitDrawing from \"./FineTuneDesign/UnitDrawing\";\r\nimport { mapDispatchToProps } from \"../redux/actions\";\r\nimport PoolInputs from \"./CreateDesign/PoolInputs\";\r\nimport { checkIsProEditMode } from \"../utilities/specmateProHelpers\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass UnitDesign extends React.Component {\r\n public state: IState = {};\r\n componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { enableUnitIcons: true });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 2 } });\r\n }\r\n async componentDidUpdate() {\r\n const { projectId, unitId } = this.props.match.params;\r\n let isProEditMode = await checkIsProEditMode(projectId, unitId);\r\n\r\n if (isProEditMode) {\r\n this.props.history.push(\"/project\"); //redirect to project page\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n \r\n {this.props.reduxMenus.showPoolInputs ? : null}\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitDesign);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, match } from 'react-router-dom'; //needed for 'location' object and 'match.params'\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { Link } from 'react-router-dom';\r\nimport '../../css/DesignSubMenu.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n location: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass DrawingSubMenu extends React.Component {\r\n //TODO: animate underlining\r\n\r\n private createMenuLink(urlFragment: string, label: string) {\r\n //Make this the active(underlined) link if it matches the current route\r\n const isActive = this.isCurrentRoute(urlFragment);\r\n const baseUrl = this.getBaseUrl();\r\n return (\r\n \r\n
    {label}
    \r\n \r\n );\r\n }\r\n private isCurrentRoute(urlFragment: string) {\r\n return this.props.location.pathname.includes(urlFragment);\r\n }\r\n\r\n private getBaseUrl() {\r\n const routeParams = this.props.match.params;\r\n return '/pid/' + routeParams.projectId + '/uid/' + routeParams.unitId;\r\n }\r\n private getNextButton() {\r\n let destination = '';\r\n if (this.isCurrentRoute('/drawing/drawing')) {\r\n destination = '/layout/doors';\r\n }\r\n // if (this.isCurrentRoute('/design/drawing')) {\r\n // destination = '/layout/doors';\r\n // }\r\n const baseUrl = this.getBaseUrl();\r\n\r\n return (\r\n \r\n
    Next >
    \r\n \r\n );\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n {this.createMenuLink('/drawing/drawing', 'Drawings')}\r\n {this.getNextButton()}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(DrawingSubMenu));\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Route, match } from \"react-router-dom\";\r\nimport DrawingSubMenu from \"./Menus/DrawingSubMenu\";\r\nimport UnitDrawing from \"./FineTuneDesign/UnitDrawing\";\r\nimport { mapDispatchToProps } from \"../redux/actions\";\r\nimport { checkIsProEditMode } from \"../utilities/specmateProHelpers\";\r\nimport \"../css/UnitSelection.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass Drawings extends React.Component {\r\n componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 3 } });\r\n }\r\n\r\n async componentDidUpdate() {\r\n const { projectId, unitId } = this.props.match.params;\r\n let isProEditMode = await checkIsProEditMode(projectId, unitId);\r\n\r\n if (isProEditMode) {\r\n this.props.history.push(\"/project\"); //redirect to project page\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Drawings);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, match } from 'react-router-dom'; //needed for 'location' object and 'match.params'\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { Link } from 'react-router-dom';\r\nimport '../../css/DesignSubMenu.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n location: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass LayoutSubMenu extends React.Component {\r\n private createMenuLink(urlFragment: string, label: string) {\r\n //Make this the active(underlined) link if it matches the current route\r\n const isActive = this.isCurrentRoute(urlFragment);\r\n const baseUrl = this.getBaseUrl();\r\n return (\r\n \r\n
    {label}
    \r\n \r\n );\r\n }\r\n\r\n private isCurrentRoute(urlFragment: string) {\r\n return this.props.location.pathname.includes(urlFragment);\r\n }\r\n private getBaseUrl() {\r\n const routeParams = this.props.match.params;\r\n return '/pid/' + routeParams.projectId + '/uid/' + routeParams.unitId;\r\n }\r\n private getNextButton() {\r\n let destination = '';\r\n if (this.isCurrentRoute('/layout/doors')) {\r\n destination = '/layout/coil';\r\n }\r\n if (this.isCurrentRoute('/layout/coil')) {\r\n destination = '/layout/panels';\r\n }\r\n if (this.isCurrentRoute('/layout/panels')) {\r\n destination = '/layout/length';\r\n }\r\n if (this.isCurrentRoute('/layout/length')) {\r\n destination = '/layout/sizing';\r\n }\r\n if (this.isCurrentRoute('/layout/sizing')) {\r\n destination = '/spec/controls';\r\n }\r\n const baseUrl = this.getBaseUrl();\r\n\r\n return (\r\n \r\n
    Next >
    \r\n \r\n );\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n {this.createMenuLink('/layout/doors', 'Access Doors')}\r\n {this.createMenuLink('/layout/coil', 'Coil Connections')}\r\n {this.createMenuLink('/layout/panels', 'Layout Adjustments')}\r\n {this.createMenuLink('/layout/length', 'Length Inputs')}\r\n {this.createMenuLink('/layout/sizing', 'Inlet/Outlet Sizing')}\r\n {this.getNextButton()}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(LayoutSubMenu));\r\n","import * as React from 'react';\r\nimport {DrawingScreen, DrawingViewType} from '../../api-utilities/enums';\r\nimport { DrawingViewButtons } from './DrawingViewButtons';\r\n\r\ninterface IProps {\r\n drawingScreen: DrawingScreen;\r\n availableViewTypes: DrawingViewType[];\r\n drawingViewInfo: { svg: string; drawingView?: DrawingViewType };\r\n selectDrawingView: (newValue: DrawingViewType) => Promise;\r\n}\r\ninterface IState {}\r\n\r\nexport class DrawingViewer extends React.Component {\r\n private getViewButtonOptions() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n
    View:
    \r\n {this.getViewButtonOptions()}\r\n
    \r\n
    \r\n {this.props.drawingViewInfo.svg !== '' ? (\r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match, matchPath } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { DrawingScreen, DrawingViewType} from '../../api-utilities/enums';\r\nimport { DrawingViewer } from \"./DrawingViewer\";\r\nimport { callGetEndpoint, updateInputField, getUnitDrawing } from \"../../api-calls/readApiService\";\r\nimport { getValidationError } from \"../../utilities/pageUtils\";\r\nimport \"../../css/UnitDrawing.scss\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n topDrawingState: IDrawingState;\r\n bottomDrawingState: IDrawingState;\r\n renderDefaultDrawing: boolean;\r\n userInputs: any;\r\n primaryInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n completeData: string;\r\n airTunnelOrientationType:string;\r\n defaultViewType: DrawingViewType;\r\n topDrawingAvailableViewTypes: DrawingViewType[];\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n \r\n}\r\n\r\ninterface IDrawingState {\r\n svg: string;\r\n drawingView?: DrawingViewType;\r\n}\r\n\r\nclass AccessDoors extends React.Component {\r\n public state: IState = {\r\n topDrawingState: { svg: \"\", drawingView: undefined },\r\n bottomDrawingState: { svg: \"\", drawingView: undefined },\r\n renderDefaultDrawing: false,\r\n userInputs: null,\r\n primaryInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n completeData:\"\",\r\n airTunnelOrientationType:\"\",\r\n defaultViewType: DrawingViewType.Top,\r\n topDrawingAvailableViewTypes: [],\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: []\r\n };\r\n\r\n async componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n if (this.props.reduxMenus.enableSave){\r\n this.setState({renderDefaultDrawing:true});\r\n }\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetAccessDoorsValues\", projectId, unitId);\r\n this.setState({\r\n userInputs: result.uiDataContainer?.fineTuneInputs,\r\n primaryInputs: result.uiDataContainer?.primaryInputs,\r\n displayFields: result.uiDataContainer?.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n completeData: result.completeData,\r\n airTunnelOrientationType: result.airTunnelOrientationType,\r\n defaultViewType: result.defaultViewType,\r\n topDrawingAvailableViewTypes: result.topDrawingAvailableViewTypes\r\n });\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.prerequisiteErrors });\r\n }\r\n else {\r\n await this.getDefaultDrawings();\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n componentDidUpdate(prevProps: any) {\r\n //If a save was in progress, render the default drawings after it finishes.\r\n // if (prevProps.reduxMenus.enableSave !== this.props.reduxMenus.enableSave && !this.state.renderDefaultDrawing) {\r\n // this.getDefaultDrawings();\r\n // }\r\n }\r\n private async getDefaultDrawings() {\r\n //Get defualt drawing view for Access doors.\r\n let topDrawingView =\r\n this.state.topDrawingState.drawingView === undefined\r\n ? this.state.defaultViewType\r\n : this.state.topDrawingState.drawingView;\r\n if (typeof topDrawingView === 'undefined') {\r\n topDrawingView = this.state.airTunnelOrientationType === \"Stacked\" ? DrawingViewType.TopUpperTunnel : DrawingViewType.Top;\r\n }\r\n await this.selectTopDrawingView(topDrawingView);\r\n await this.selectBottomDrawingView(this.state.bottomDrawingState.drawingView ?? DrawingViewType.FrontSide);\r\n }\r\n private async selectTopDrawingView(newValue: DrawingViewType) {\r\n this.setState({ topDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n private async selectBottomDrawingView(newValue: DrawingViewType) {\r\n this.setState({ bottomDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n //Get the updated SVG\r\n private async getDrawingState(newValue: number) {\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n let completeData = this.state.completeData;\r\n const response = await getUnitDrawing(this.props.match.params, newValue, DrawingScreen.AccessDoors, completeData);\r\n let svg = '';\r\n //let svg = \"\\r\\n \\r\\n \\r\\n \\r\\n\";\r\n if (response?.data.drawings?.length) {\r\n svg = response?.data.drawings[0].unitDrawingSvg;\r\n }\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n return { svg: svg ?? '', drawingView: newValue } as IDrawingState;\r\n }\r\n\r\n private getTopDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n private getBottomDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n public checkForErrors(fieldName: string) {\r\n const errors = this.state.validationErrors;\r\n if (errors) {\r\n const hasError = errors.find((x: any) => x.fieldName.toLowerCase() === fieldName.toLowerCase() && x.suppressErrorInUi !== true);\r\n return hasError ? true : false;\r\n }\r\n return false;\r\n }\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getInputCSS(fieldName: string, type: string) {\r\n const hasError = this.checkForErrors(fieldName);\r\n\r\n let className = \"\";\r\n if (type === \"textbox\") {\r\n className = \"input-numeric\";\r\n }\r\n if (type === \"selectbox\") {\r\n className = \"input-select\";\r\n }\r\n //If error exists, add the error class\r\n if (hasError) {\r\n className += \" input-error\";\r\n }\r\n return className;\r\n }\r\n //------------------------------------------------------------------------------------------\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string, targetVertex: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n let result = await updateInputField(\"updateAccessDoors\", projectId, unitId, fieldName, newValue, targetVertex);\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If unitBasicsData was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n completeData: result.data.completeData\r\n });\r\n this.getDefaultDrawings();\r\n }\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n //Make a new array that only includes items not matching the given fieldName\r\n let errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== fieldName.toLowerCase());\r\n\r\n this.setState({ validationErrors: errors, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n //Make a copy of the list from state.dropdownOptions\r\n const newState = Object.assign({}, this.state.dropdownOptions, {});\r\n\r\n //Update newState with any new values we got from the server\r\n Object.entries(newDropdownOptions).forEach(([key, value]) => {\r\n if (value != null) {\r\n (newState as any)[key] = value;\r\n }\r\n });\r\n\r\n this.setState({ dropdownOptions: newState });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n //make a copy of error messages collection in state\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n for (const error of validationErrors) {\r\n const exists = this.state.validationErrors.find((x: any) => x.fieldName.toLowerCase() === error.fieldName.toLowerCase());\r\n if (!exists) {\r\n errorsArray.push(error);\r\n }\r\n }\r\n this.setState({ validationErrors: errorsArray });\r\n }\r\n public getSelectBoxOptions(boxName: any) {\r\n const options = (this.state.dropdownOptions as any)[boxName];\r\n return options.map((item: any, index: number) => (\r\n \r\n ));\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.source}
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
    \r\n
    Warning
    \r\n
    Design calculations cannot be run due to missing/invalid fields:
    \r\n
    \r\n
    Page
    \r\n
    Field
    \r\n
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n\r\n
    Please revisit these page(s) and fix any invalid inputs.
    \r\n
    \r\n );\r\n }\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n Overall Door Plan\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Access Side
    \r\n
    \r\n this.saveInputValue(\"unitAccessSide\", event.currentTarget.value, \"FineTuneInputs\")}\r\n >\r\n {this.getSelectBoxOptions(\"unitAccessSideOptions\")}\r\n \r\n {this.getValidationError(\"unitAccessSide\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Unit Drawing Preview
    \r\n {this.getTopDrawingViewer()}\r\n {this.getBottomDrawingViewer()}\r\n
    \r\n\r\n
    {/* Take up remaining horizontal space in browser */}
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AccessDoors);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match, matchPath } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport {DrawingScreen, DrawingViewType} from '../../api-utilities/enums';\r\nimport { DrawingViewer } from \"./DrawingViewer\";\r\nimport {getValidationError, getSelectBoxOptions, getInputCSS, getFilteredValidationErrors, getNewDropdownList, getNewValidationErrorsList} from \"../../utilities/pageUtils\";\r\nimport { callGetEndpoint, updateInputField, getUnitDrawing } from \"../../api-calls/readApiService\";\r\nimport \"../../css/UnitDrawing.scss\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n reduxMenus: any;\r\n}\r\n\r\n// local state\r\ninterface IState {\r\n topDrawingState: IDrawingState;\r\n bottomDrawingState: IDrawingState;\r\n renderDefaultDrawing: boolean;\r\n uiDataContainer: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n completeData: string;\r\n airTunnelOrientationType:string;\r\n defaultViewType: DrawingViewType;\r\n topDrawingAvailableViewTypes: DrawingViewType[];\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n}\r\n\r\ninterface IDrawingState {\r\n svg: string;\r\n drawingView?: DrawingViewType;\r\n}\r\n\r\nclass CoilConnections extends React.Component {\r\n public state: IState = {\r\n topDrawingState: { svg: \"\", drawingView: undefined },\r\n bottomDrawingState: { svg: \"\", drawingView: undefined },\r\n renderDefaultDrawing: false,\r\n uiDataContainer: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n completeData: \"\",\r\n airTunnelOrientationType:\"\",\r\n defaultViewType: DrawingViewType.Top,\r\n topDrawingAvailableViewTypes: [],\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: []\r\n };\r\n\r\n async componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n if (this.props.reduxMenus.enableSave){\r\n this.setState({renderDefaultDrawing:true});\r\n }\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetCoilConnectionValues\", projectId, unitId);\r\n this.setState({\r\n uiDataContainer: result.uiDataContainer,\r\n displayFields: result.uiDataContainer?.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n completeData: result.completeData,\r\n airTunnelOrientationType: result.airTunnelOrientationType,\r\n defaultViewType: result.defaultViewType,\r\n topDrawingAvailableViewTypes: result.topDrawingAvailableViewTypes\r\n });\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.prerequisiteErrors });\r\n }\r\n else {\r\n await this.getDefaultDrawings();\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n componentDidUpdate(prevProps: any) {\r\n //If a save was in progress, render the default drawings after it finishes.\r\n // if (prevProps.reduxMenus.enableSave !== this.props.reduxMenus.enableSave && !this.state.renderDefaultDrawing) {\r\n // this.getDefaultDrawings();\r\n // }\r\n }\r\n private async getDefaultDrawings() {\r\n //Get defualt drawing view for Coil Connections.\r\n let topDrawingView =\r\n this.state.topDrawingState.drawingView === undefined\r\n ? this.state.defaultViewType\r\n : this.state.topDrawingState.drawingView;\r\n if (typeof(topDrawingView) === 'undefined'){\r\n topDrawingView = this.state.airTunnelOrientationType === \"Stacked\" ? DrawingViewType.TopUpperTunnel : DrawingViewType.Top;\r\n }\r\n await this.selectTopDrawingView(topDrawingView);\r\n await this.selectBottomDrawingView(this.state.bottomDrawingState.drawingView ?? DrawingViewType.FrontSide);\r\n }\r\n\r\n //Get the updated SVG\r\n private async getDrawingState(newValue: DrawingViewType) {\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n let completeData = this.state.completeData;\r\n const response = await getUnitDrawing(this.props.match.params, newValue, DrawingScreen.CoilConnections, completeData);\r\n let svg = '';\r\n //let svg = \"\\r\\n \\r\\n \\r\\n \\r\\n\";\r\n if (response?.data.drawings?.length) {\r\n svg = response?.data.drawings[0].unitDrawingSvg;\r\n }\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n return { svg: svg ?? '', drawingView: newValue } as IDrawingState;\r\n }\r\n private async selectTopDrawingView(newValue: DrawingViewType) {\r\n this.setState({ topDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n private async selectBottomDrawingView(newValue: DrawingViewType) {\r\n this.setState({ bottomDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n\r\n private getTopDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n private getBottomDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n //------------------------------------------------------------------------------------------\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string, targetVertex: string) {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateCoilConnections\", projectId, unitId, fieldName, newValue, targetVertex);\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n uiDataContainer: result.data.uiDataContainer,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n completeData: result.data.completeData\r\n });\r\n this.getDefaultDrawings();\r\n }\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.source}
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
    \r\n
    Warning
    \r\n
    Design calculations cannot be run due to missing/invalid fields:
    \r\n
    \r\n
    Page
    \r\n
    Field
    \r\n
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n\r\n
    Please revisit these page(s) and fix any invalid inputs.
    \r\n
    \r\n );\r\n }\r\n const displayFields = this.state.displayFields;\r\n const uiDataContainer = this.state.uiDataContainer;\r\n if (!uiDataContainer) {\r\n return null;\r\n }\r\n const dxCoilFieldSetClass = displayFields.showWaterConnectionsPenetration ? \"wshp-dxcoil-fieldset\" : \"cwcoil-fieldset\";\r\n const dxCoilLegendClass = displayFields.showWaterConnectionsPenetration ? \"wshp-dxcoil\" : \"cwcoil-legend\";\r\n const preHeatHotWaterUnitPenetration = uiDataContainer.preHeatHotWaterCoilInputs ? uiDataContainer.preHeatHotWaterCoilInputs.unitPenetration : \"\";\r\n const chilledWaterUnitPenetration = uiDataContainer.chilledWaterCoilInputs ? uiDataContainer.chilledWaterCoilInputs.unitPenetration : \"\";\r\n const hotWaterUnitPenetration = uiDataContainer.hotWaterCoilInputs ? uiDataContainer.hotWaterCoilInputs.unitPenetration : \"\";\r\n const steamUnitPenetration = uiDataContainer.steamCoilInputs ? uiDataContainer.steamCoilInputs.unitPenetration : \"\";\r\n const dxUnitPenetration = uiDataContainer.refrigerationInputs ? uiDataContainer.refrigerationInputs.dxUnitPenetration : \"\";\r\n const hotGasReheatUnitPenetration = uiDataContainer.refrigerationInputs ? uiDataContainer.refrigerationInputs.hgrhUnitPenetration : \"\";\r\n const waterConnectionsUnitPenetration = uiDataContainer.refrigerationInputs ? uiDataContainer.refrigerationInputs.waterConnectionsUnitPenetration : \"\";\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {/* ================== Preheat Hot Water Coil Connections =========================== */}\r\n {displayFields.showPreHeatHotWaterCoil ? (\r\n
    \r\n Preheat Hot Water Coil Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"unitPenetration\", event.currentTarget.value, \"PreHeatHotWaterCoilInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"preHeatFluidPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"preHeatHotWaterUnitPenetration\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ================== Chilled Water Coil Connections =========================== */}\r\n {displayFields.showChilledWaterCoil ? (\r\n
    \r\n Chilled Water Coil Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"unitPenetration\", event.currentTarget.value, \"ChilledWaterCoilInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"fluidCoilPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"chilledWaterUnitPenetration\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ================== Hot Water Coil Connections =========================== */}\r\n {displayFields.showHotWaterCoil ? (\r\n
    \r\n Hot Water Coil Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"unitPenetration\", event.currentTarget.value, \"HotWaterCoilInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"fluidCoilPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"hotWaterUnitPenetration\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ================== Steam Coil Connections =========================== */}\r\n {displayFields.showSteamCoil ? (\r\n
    \r\n Steam Coil Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"unitPenetration\", event.currentTarget.value, \"SteamCoilInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"fluidCoilPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"steamUnitPenetration\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ================== Direct Expansion Coil Connections =========================== */}\r\n {displayFields.showDxCoil ? (\r\n
    \r\n Direct Expansion Coil Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"dxUnitPenetration\", event.currentTarget.value, \"RefrigerationInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"refrigerationPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"dxUnitPenetration\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ================== Water Connections Penetration (WSHP)=========================== */}\r\n {displayFields.showWaterConnectionsPenetration ? (\r\n
    \r\n Water Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"waterConnectionsUnitPenetration\", event.currentTarget.value, \"RefrigerationInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"waterConnectionsUnitPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"waterConnectionsUnitPenetration\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ================== Hot Gas Reheat Connections =========================== */}\r\n {displayFields.showHotGasReheatCoil ? (\r\n
    \r\n Hot Gas Reheat Connections\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Unit Penetration
    \r\n\r\n
    \r\n this.saveInputValue(\"hgrhUnitPenetration\", event.currentTarget.value, \"RefrigerationInputs\")}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"refrigerationPenetrationOptions\")}\r\n \r\n {this.getValidationError(\"hgrhUnitPenetration\")}\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\n
    Unit Drawing Preview
    \r\n\r\n {this.getTopDrawingViewer()}\r\n\r\n {this.getBottomDrawingViewer()}\r\n
    \r\n\r\n
    {/* Take up remaining horizontal space in browser */}
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CoilConnections);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match, matchPath } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { DrawingScreen, DrawingViewType } from \"../../api-utilities/enums\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport \"../../css/UnitDrawing.scss\";\r\nimport { DrawingViewer } from \"./DrawingViewer\";\r\nimport { resetReduxModals,isEmptyArray } from \"../../utilities/helpers\";\r\nimport { getAccuArrangement } from \"./UnitLayoutUtil\";\r\nimport { callGetEndpoint, updateInputField, getUnitDrawing } from \"../../api-calls/readApiService\";\r\nimport { getValidationError, getInputCSS, getSelectBoxOptions } from \"../../utilities/pageUtils\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n reduxMenus: any;\r\n reduxModals: any;\r\n}\r\n\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n refrigeratorDisplayFields: any;\r\n refrigerationUserInputs: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n topDrawingState: IDrawingState;\r\n bottomDrawingState: IDrawingState;\r\n renderDefaultDrawing: boolean;\r\n showUnitWidthTooltip: boolean;\r\n showUnitHeightTooltip: boolean;\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n unit: any;\r\n completeData: string;\r\n airTunnelOrientationType: string;\r\n defaultViewType: DrawingViewType;\r\n topDrawingAvailableViewTypes: any[];\r\n pageValidationErrors: string[];\r\n hoodAndLouverExtensions: any;\r\n showWshpAccessTooltip: boolean\r\n}\r\n\r\ninterface IDrawingState {\r\n svg: string;\r\n drawingView?: DrawingViewType;\r\n}\r\n\r\nclass LayoutAdjustments extends React.Component {\r\n public state: IState = {\r\n topDrawingState: { svg: \"\", drawingView: undefined },\r\n bottomDrawingState: { svg: \"\", drawingView: undefined },\r\n renderDefaultDrawing: false,\r\n showUnitWidthTooltip: false,\r\n showUnitHeightTooltip: false,\r\n userInputs: null,\r\n refrigerationUserInputs: null,\r\n refrigeratorDisplayFields: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: [],\r\n unit: null,\r\n completeData: \"\",\r\n airTunnelOrientationType: \"\",\r\n defaultViewType: DrawingViewType.Top,\r\n topDrawingAvailableViewTypes: [],\r\n pageValidationErrors: [],\r\n hoodAndLouverExtensions: [],\r\n showWshpAccessTooltip: false\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n //Get FineTuneInput values for Electrical/Control/Furnace Panels\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetLayoutAdjustmentValues\", projectId, unitId);\r\n\r\n this.setState({\r\n userInputs: result.uiDataContainer?.fineTuneInputs,\r\n displayFields: result.uiDataContainer?.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n prerequisiteErrorsList: result.prerequisiteErrors,\r\n refrigerationUserInputs: result.refrigerationUIDataContainer?.refrigerationInputs,\r\n refrigeratorDisplayFields: result.refrigerationUIDataContainer?.displayFields,\r\n unit: result.unit,\r\n completeData: result.completeData,\r\n airTunnelOrientationType: result.airTunnelOrientationType,\r\n defaultViewType: result.defaultViewType,\r\n topDrawingAvailableViewTypes: result.topDrawingAvailableViewTypes,\r\n pageValidationErrors: result.individualErrors,\r\n hoodAndLouverExtensions: result.hoodLouverExtensionInfo\r\n });\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.prerequisiteErrors });\r\n }\r\n else {\r\n await this.getDefaultDrawings();\r\n this.showErrorModal(\"layoutadjustmentspage\");\r\n }\r\n \r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n private async getDefaultDrawings() {\r\n //Get defualt drawing view for Electrical Panels.\r\n let topDrawingView = this.state.topDrawingState.drawingView === undefined ? this.state.defaultViewType : this.state.topDrawingState.drawingView;\r\n if (typeof topDrawingView === \"undefined\") {\r\n topDrawingView = this.state.airTunnelOrientationType === \"Stacked\" ? DrawingViewType.TopUpperTunnel : DrawingViewType.Top;\r\n }\r\n await this.selectTopDrawingView(topDrawingView);\r\n await this.selectBottomDrawingView(this.state.bottomDrawingState.drawingView ?? DrawingViewType.FrontSide);\r\n }\r\n //Get the updated SVG\r\n private async getDrawingState(newValue: number) {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n let completeData = this.state.completeData;\r\n const response = await getUnitDrawing(this.props.match.params, newValue, DrawingScreen.ElectricalFurnacePanels, completeData);\r\n let svg = \"\";\r\n //let svg = \"\\r\\n \\r\\n \\r\\n \\r\\n\";\r\n if (response?.data.drawings?.length) {\r\n svg = response?.data.drawings[0].unitDrawingSvg;\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n return { svg: svg ?? \"\", drawingView: newValue } as IDrawingState;\r\n }\r\n private async selectTopDrawingView(newValue: DrawingViewType) {\r\n this.setState({ topDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n private async selectBottomDrawingView(newValue: DrawingViewType) {\r\n this.setState({ bottomDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n\r\n private getTopDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n private getBottomDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n //Save new value to redis and DB\r\n public async SaveRefrigerationInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n refrigerationUserInputs: result.data.uiDataContainer.refrigerationInputs,\r\n pageValidationErrors: result.data.individualErrors,\r\n completeData: result.data.completeData,\r\n unit: result.data.completeData.unit\r\n //NOTE: don't update displayFields when updating manualAccu.\r\n //DisplayFields get returned at pageLoad and the manualAccu update doesn't recalculate them.\r\n });\r\n this.getDefaultDrawings();\r\n this.showErrorModal(\"layoutadjustmentspage\");\r\n }\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n //Control Panel Location or Control Panel Mounting Face.\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateLayout\", projectId, unitId, fieldName, newValue, \"FineTuneInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //Update state.\r\n if (result.data.uiDataContainer != null) {\r\n if (result.data.completeData != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n pageValidationErrors: result.data.individualErrors,\r\n completeData: result.data.completeData,\r\n unit: result.data.unit\r\n });\r\n this.getDefaultDrawings();\r\n } else {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n pageValidationErrors: result.data.individualErrors,\r\n unit: result.data.unit\r\n });\r\n }\r\n this.showErrorModal(\"layoutadjustmentspage\");\r\n }\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n //Make a new array that only includes items not matching the given fieldName\r\n let errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== fieldName.toLowerCase());\r\n\r\n this.setState({ validationErrors: errors, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n //Make a copy of the list from state.dropdownOptions\r\n const newState = Object.assign({}, this.state.dropdownOptions, {});\r\n\r\n //Update newState with any new values we got from the server\r\n Object.entries(newDropdownOptions).forEach(([key, value]) => {\r\n if (value != null) {\r\n (newState as any)[key] = value;\r\n }\r\n });\r\n\r\n this.setState({ dropdownOptions: newState });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n //make a copy of error messages collection in state\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n for (const error of validationErrors) {\r\n const exists = this.state.validationErrors.find((x: any) => x.fieldName.toLowerCase() === error.fieldName.toLowerCase());\r\n if (!exists) {\r\n errorsArray.push(error);\r\n }\r\n }\r\n this.setState({ validationErrors: errorsArray });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.source}
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
    \r\n
    Warning
    \r\n
    Design calculations cannot be run due to missing/invalid fields:
    \r\n
    \r\n
    Page
    \r\n
    Field
    \r\n
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n\r\n
    Please revisit these page(s) and fix any invalid inputs.
    \r\n
    \r\n );\r\n }\r\n const savedValues = this.state.userInputs;\r\n const refrigerationSavedValues = this.state.refrigerationUserInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n const displayFields = this.state.displayFields;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {/* ELECTRICAL/CONTROL PANEL */}\r\n
    \r\n Electrical/Control Panel\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Mounting
    \r\n
    \r\n this.saveInputValue(\"electricalPanelMountingFace\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"electricalPanelMountingFaceOptions\")}\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    Location
    \r\n
    \r\n this.saveInputValue(\"electricalPanelLocation\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"electricalPanelLocationOptions\")}\r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n {/* FURNACE PANEL */}\r\n {displayFields.showFurnacePanel ? (\r\n
    \r\n Furnace Panel\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Location
    \r\n
    \r\n this.saveInputValue(\"furnacePanelLocation\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"furnacePanelLocationOptions\")}\r\n \r\n {this.getValidationError(\"furnacePanelLocation\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* PACKAGED REFRIGERATION */}\r\n {displayFields.showPackagedRefrigeration ? (\r\n
    \r\n Packaged Refrigeration\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Location
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    this.openRefrigerationLocationModal(event)}>\r\n Edit\r\n
    \r\n
    \r\n
    \r\n {displayFields.isWSHP ? (\r\n
    \r\n
    Access
    \r\n
    \r\n
    \r\n this.SaveRefrigerationInputValue(\"wshpAccess\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"wshpAccessOptions\")}\r\n \r\n this.showTooltip(\"wshpAccess\", true)}\r\n onMouseLeave={() => this.showTooltip(\"wshpAccess\", false)}\r\n >\r\n {this.getWshpAccessTooltipContent()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* UNIT DIMENSIONS */}\r\n
    \r\n Unit Dimensions\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
    Unit Drawing Preview
    \r\n\r\n {this.getTopDrawingViewer()}\r\n\r\n {this.getBottomDrawingViewer()}\r\n
    \r\n\r\n
    {/* Take up remaining horizontal space in browser */}
    \r\n
    \r\n
    \r\n );\r\n }\r\n openRefrigerationLocationModal(event: React.SyntheticEvent) {\r\n //User clicked Edit link on Packaged Refrigeration Section. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n const modalData = {\r\n displayFields: this.state.refrigeratorDisplayFields,\r\n ACCUArrangement: this.state.refrigerationUserInputs.manualACCUArrangement\r\n };\r\n //This triggers ModalContainer.tsx to open the modal\r\n //Should pass the selected location, orientation, and number of circuits.\r\n this.props.updateRedux(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"RefrigerationLocationModal\",\r\n modalData: modalData,\r\n modalId: \"refrigeration-location\"\r\n });\r\n }\r\n private showErrorModal(notificationId: string) {\r\n const pageErrors = this.state.pageValidationErrors;\r\n if (pageErrors && pageErrors.length > 0) {\r\n var errorString = pageErrors.join(\", \");\r\n const notification = {\r\n id: notificationId,\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    {errorString}
    \r\n };\r\n addNotification(notification);\r\n } else {\r\n removeNotification(notificationId);\r\n }\r\n }\r\n\r\n //Show/Hide tooltips on mouseover\r\n private showTooltip(tooltip: \"width\" | \"length\" | \"wshpAccess\", state: boolean) {\r\n if (tooltip === \"width\") {\r\n this.setState({ showUnitWidthTooltip: state });\r\n } \r\n if (tooltip === \"length\"){\r\n this.setState({ showUnitHeightTooltip: state });\r\n }\r\n if (tooltip === \"wshpAccess\"){\r\n this.setState({ showWshpAccessTooltip: state });\r\n }\r\n }\r\n //Get display content for each tooltip\r\n private getTooltipContent(tooltip: string) {\r\n const tooltipData = this.state.hoodAndLouverExtensions;;\r\n if (tooltipData) {\r\n const tooltipItems = this.getTooltipListItems(tooltipData);\r\n const showTooltip = tooltip === \"width\" ? this.state.showUnitWidthTooltip : this.state.showUnitHeightTooltip;\r\n return (\r\n
    \r\n
    \r\n The Overall Width and Overall Length values account for unit features such as roof overhang, electrical\r\n panels, and lifting lugs but do not include hoods and louvers{isEmptyArray(tooltipItems) ? '.' : ':'}\r\n
    \r\n
      {tooltipItems}
    \r\n
    \r\n
    \r\n );\r\n }\r\n }\r\n //hoodAndLouverExtensions comes from the server as an object with a dynamic list of properties.\r\n //so we need to loop through it, break each property down and get the pieces we need.\r\n private getTooltipListItems(tooltipData: any) {\r\n return tooltipData.map((item: any, index: number) => (\r\n
  • \r\n {item}\r\n
  • \r\n ));\r\n }\r\n\r\n private getWshpAccessTooltipContent(){\r\n return (\r\n
    \r\n
    \r\n
      \r\n
    • Door per Circuit = includes a door to access each individual circuit
    • \r\n
    • Walkway = includes (1) door with walkway clearances within the vestibule
    • \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n //Check for user response to the delete-project modal or the addNewProject modal.\r\n async componentDidUpdate(prevProps: IProps, prevState: IState) {\r\n //If a save was in progress, render the default drawings after it finishes.\r\n // if (prevProps.reduxMenus.enableSave !== this.props.reduxMenus.enableSave && !this.state.renderDefaultDrawing) {\r\n // this.getDefaultDrawings();\r\n // }\r\n const modal = this.props.reduxModals;\r\n\r\n //If modal was open but is now closed, check what user's response was.\r\n if (prevProps.reduxModals.showModal !== modal.showModal && modal.showModal === false) {\r\n if (modal.modalId === \"refrigeration-location\") {\r\n if (modal.userResponse.response === \"ok\") {\r\n this.SaveRefrigerationInputValue(\"manualACCUArrangement\", modal.userResponse.accuArrangementSelected);\r\n }\r\n }\r\n resetReduxModals();\r\n }\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus,\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(LayoutAdjustments);\r\n","import { store } from '../../redux/store';\r\nimport { DrawingViewType } from '../../TypescriptClient';\r\nimport { ACCUArrangement } from '../../interfaces/interfaces';\r\n\r\nexport function getDefaultDrawingView() {\r\n const config = store.getState().reduxConfigInputs;\r\n return config.airTunnelOrientation?.value === 1 ? DrawingViewType.TopUpperTunnel : DrawingViewType.Top;\r\n}\r\nexport function getAccuArrangement(accuArrangement:any){\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitSideBySide_P1]){\r\n return \"Exhaust\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderTopTunnel_P2]){\r\n return \"Exhaust Turned\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitSideBySideL_P3]){\r\n return \"Exhaust & End Turned\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderParallel_P4]){\r\n return \"Exhaust Parallel\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderFullHeight_S1]){\r\n return \"End Turned\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderFullHeightParallel_S2]){\r\n return \"End Parallel\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitSideBySideInSeries_S3]){\r\n return \"Exhaust Series\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderExhaust_M1]){\r\n return \"Exhaust\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitOverUnderEnd_M2]){\r\n return \"End\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitSideBySideEndTurned_M3]){\r\n return \"End Turned\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitSideBySideEnd_M4]){\r\n return \"End\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderExhaustSeries_M5]){\r\n return \"Exhaust Series\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitOverUnderEndSeries_M6]){\r\n return \"End Series\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitSideBySideEndParallel_M7]){\r\n return \"End Parallel\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitSingleTunnelEnd_P5]){\r\n return \"End\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitSingleTunnelEndTurned_M8]){\r\n return \"End Turned\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitSingleTunnelEndParallel_P6]){\r\n return \"End Parallel\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitSingleTunnelEndSeries_M9]){\r\n return \"End Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitSingleTunnelT_T1]){\r\n return \"End Parallel & Turned\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.FourCircuitSingleTunnelEndParallel_F1]){\r\n return \"End Parallel & Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitSideBySide_T2]){\r\n return \"Exhaust & End Parallel\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitSideBySide_T3]){\r\n return \"End Parallel & Turned\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.FourCircuitSideBySide_F2]){\r\n return \"End Parallel & Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitOverUnder_T4]){\r\n return \"End Parallel & Turned\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.FourCircuitOverUnder_F3]){\r\n return \"End Parallel & Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.FourCircuitWshpEndParallel_W10]){\r\n return \"End Parallel & Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.FourCircuitWshpEndSeries_W11]){\r\n return \"End Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.FourCircuitWshpExhaust_W12]){\r\n return \"Exhaust Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitWshpEndTurned_W2]){\r\n return \"End Turned\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitWshpEnd_W1]){\r\n return \"End\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.SingleCircuitWshpExhaust_W3]){\r\n return \"Exhaust\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndParallel_W7]){\r\n return \"End Parallel & Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitWshpEndSeries_W8]){\r\n return \"End Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.ThreeCircuitWshpExhaust_W9]){\r\n return \"Exhaust Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitWshpEndTurned_W5]){\r\n return \"End Turned\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitWshpEnd_W4]){\r\n return \"End Series\";\r\n }\r\n else if (accuArrangement === ACCUArrangement[ACCUArrangement.TwoCircuitWshpExhaust_W6]){\r\n return \"Exhaust Series\";\r\n }\r\n if (accuArrangement === ACCUArrangement[ACCUArrangement.Automatic]){\r\n return \"Automatic\";\r\n }\r\n }","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match, matchPath } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { DrawingScreen, DrawingViewType} from '../../api-utilities/enums';\r\nimport \"../../css/UnitDrawing.scss\";\r\nimport \"../../css/Performance.scss\";\r\nimport { DrawingViewer } from \"./DrawingViewer\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { callGetEndpoint, updateInputField, getUnitDrawing } from \"../../api-calls/readApiService\";\r\nimport { getValidationError, getInputCSS, getSelectBoxOptions } from \"../../utilities/pageUtils\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\n\r\n// expected props\r\ninterface IProps {\r\n //reduxLengthInputs: LengthInputsUI;\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n}\r\n\r\n// local state\r\ninterface IState {\r\n topDrawingState: IDrawingState;\r\n bottomDrawingState: IDrawingState;\r\n inputChanged: boolean;\r\n defaultDrawingRendered: boolean;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n unit: any;\r\n completeData: string;\r\n airTunnelOrientationType:string;\r\n defaultViewType: DrawingViewType;\r\n topDrawingAvailableViewTypes: DrawingViewType[];\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n}\r\n\r\ninterface IDrawingState {\r\n svg: string;\r\n drawingView?: DrawingViewType;\r\n}\r\n\r\nclass LengthInputs extends React.Component {\r\n public state: IState = {\r\n topDrawingState: { svg: \"\", drawingView: undefined },\r\n bottomDrawingState: { svg: \"\", drawingView: undefined },\r\n inputChanged: false,\r\n defaultDrawingRendered: false,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n unit: null,\r\n completeData:\"\",\r\n airTunnelOrientationType:\"\",\r\n defaultViewType: DrawingViewType.Top,\r\n topDrawingAvailableViewTypes: [],\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: []\r\n };\r\n componentWillUnmount() {\r\n //Remove warning when navigating to another page.\r\n removeNotification(\"airflowtransitions\");\r\n }\r\n async componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetLengthInputValues\", projectId, unitId);\r\n this.setState({\r\n userInputs: result.uiDataContainer?.fineTuneInputs,\r\n displayFields: result.uiDataContainer?.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n unit: result.unit,\r\n completeData: result.completeData,\r\n airTunnelOrientationType: result.airTunnelOrientationType,\r\n defaultViewType: result.defaultViewType,\r\n topDrawingAvailableViewTypes: result.topDrawingAvailableViewTypes\r\n });\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.prerequisiteErrors });\r\n }\r\n else {\r\n await this.getDefaultDrawings();\r\n this.checkForMinTransitionSpaceWarning();\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n private async getDefaultDrawings() {\r\n //Get defualt drawing view for Length Inputs.\r\n let topDrawingView =\r\n this.state.topDrawingState.drawingView === undefined\r\n ? this.state.defaultViewType\r\n : this.state.topDrawingState.drawingView;\r\n if (typeof(topDrawingView) === 'undefined'){\r\n topDrawingView = this.state.airTunnelOrientationType === \"Stacked\" ? DrawingViewType.TopUpperTunnel : DrawingViewType.Top;\r\n }\r\n await this.selectTopDrawingView(topDrawingView);\r\n await this.selectBottomDrawingView(this.state.bottomDrawingState.drawingView ?? DrawingViewType.FrontSide);\r\n }\r\n private async selectTopDrawingView(newValue: DrawingViewType) {\r\n this.setState({ topDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n private async selectBottomDrawingView(newValue: DrawingViewType) {\r\n this.setState({ bottomDrawingState: await this.getDrawingState(newValue) });\r\n }\r\n //Get the updated SVG\r\n private async getDrawingState(newValue: number) {\r\n //New UnitDrawingService endpoint.\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n let completeData = this.state.completeData;\r\n const response = await getUnitDrawing(this.props.match.params, newValue, DrawingScreen.AccessDoors, completeData);\r\n let svg = '';\r\n //let svg = \"\\r\\n \\r\\n \\r\\n \\r\\n\";\r\n if (response?.data.drawings?.length){\r\n svg = response?.data.drawings[0].unitDrawingSvg;\r\n }\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n return { svg: svg ?? '', drawingView: newValue } as IDrawingState;\r\n }\r\n\r\n private getTopDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n private getBottomDrawingViewer() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n private async RunPerformance(){\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetLengthInputValues\", projectId, unitId);\r\n this.setState({\r\n userInputs: result.uiDataContainer.fineTuneInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n unit: result.unit,\r\n completeData: result.completeData,\r\n inputChanged: false\r\n });\r\n\r\n await this.getDefaultDrawings();\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n }\r\n private async saveAndCheckTransitionAngles(fieldName: string, newValue: string) {\r\n await this.saveInputValue(fieldName, newValue);\r\n this.checkForMinTransitionSpaceWarning(newValue);\r\n }\r\n private checkForMinTransitionSpaceWarning(value: string = \"\") {\r\n //JIRA-7909:A toast warning message should appear anytime the user changes the value of Airflow Transitions to ‘Min Transition Space’.\r\n //50.0, \"Min Transition Space\", 45.0, \"Standard Transition Space\", 40.0, \"Max Transition Space\"\r\n if (value == \"Minimum\"){\r\n const notification = {\r\n id: \"airflowtransitions\",\r\n notificationType: 'warning',\r\n title: 'Warning',\r\n content:
    {\"Selecting Min Transition Space means airflow transitional angles shall be pushed to the limit of acceptability for each component. Doors may additionally impact overall unit length.\"}
    \r\n };\r\n addNotification(notification);\r\n }\r\n else {\r\n removeNotification(\"airflowtransitions\");\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateLengthInputs\", projectId, unitId, fieldName, newValue, \"FineTuneInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If unitBasicsData was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n inputChanged: true\r\n });\r\n }\r\n }\r\n }\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n console.log(this.state.validationErrors);\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n //Make a new array that only includes items not matching the given fieldName\r\n let errors = errorsArray.filter((item: any) => item.fieldName.toLowerCase() !== fieldName.toLowerCase());\r\n\r\n this.setState({ validationErrors: errors, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n //Make a copy of the list from state.dropdownOptions\r\n const newState = Object.assign({}, this.state.dropdownOptions, {});\r\n\r\n //Update newState with any new values we got from the server\r\n Object.entries(newDropdownOptions).forEach(([key, value]) => {\r\n if (value != null) {\r\n (newState as any)[key] = value;\r\n }\r\n });\r\n\r\n this.setState({ dropdownOptions: newState });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n //make a copy of error messages collection in state\r\n let errorsArray = [...this.state.validationErrors];\r\n\r\n for (const error of validationErrors) {\r\n const exists = this.state.validationErrors.find((x: any) => x.fieldName.toLowerCase() === error.fieldName.toLowerCase());\r\n if (!exists) {\r\n errorsArray.push(error);\r\n }\r\n }\r\n this.setState({ validationErrors: errorsArray });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.source}
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
    \r\n
    Warning
    \r\n
    Design calculations cannot be run due to missing/invalid fields:
    \r\n
    \r\n
    Page
    \r\n
    Field
    \r\n
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n\r\n
    Please revisit these page(s) and fix any invalid inputs.
    \r\n
    \r\n );\r\n }\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n const displayFields = this.state.displayFields;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n Component Spacing Inputs\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Airflow Transitions
    \r\n
    \r\n this.saveAndCheckTransitionAngles(\"transitionAngles\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"transitionAnglesOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"transitionAngles\")}\r\n
    \r\n
    \r\n
    Heating/Cooling Access
    \r\n
    \r\n this.saveInputValue(\"heatingCoolingAccess\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"heatingCoolingAccessOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"heatingCoolingAccess\")}\r\n
    \r\n
    \r\n
    Allow Fan/Duct Overlap
    \r\n
    \r\n this.saveInputValue(\"allowFanDuctOverlap\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"allowFanDuctOverlapOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"allowFanDuctOverlap\")}\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n Door Length Inputs\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Fan Door Length
    \r\n
    \r\n this.saveInputValue(\"minFanDoorLength\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"minFanDoorLengthOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"minFanDoorLength\")}\r\n
    \r\n\r\n
    \r\n
    Filter Door Length
    \r\n
    \r\n this.saveInputValue(\"minFilterDoorLength\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"minFilterDoorLengthOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"minFilterDoorLength\")}\r\n
    \r\n\r\n {displayFields.showEnergyRecoveryDoorLength ? \r\n
    \r\n
    Energy Recovery Door Length
    \r\n
    \r\n this.saveInputValue(\"minEnergyRecoveryDoorLength\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"minEnergyRecoveryDoorLengthOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"minEnergyRecoveryDoorLength\")}\r\n
    \r\n : null}\r\n
    \r\n
    Heating Coil Door Length
    \r\n
    \r\n this.saveInputValue(\"minCoilDoorLength\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"minCoilDoorLengthOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"minCoilDoorLength\")}\r\n
    \r\n\r\n
    \r\n
    All Other Door Length
    \r\n
    \r\n this.saveInputValue(\"allOtherMinDoorLength\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"allOtherMinDoorLengthOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"allOtherMinDoorLength\")}\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n Length Outputs\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Cabinet Length
    \r\n
    {this.state.unit.casingLength || \"n/a\"}\"
    \r\n
    \r\n\r\n
    \r\n
    Overall Length
    \r\n
    {this.state.unit.overallLength || \"n/a\"}\"
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    this.RunPerformance()}>Update Design
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Unit Drawing Preview
    \r\n\r\n {this.getTopDrawingViewer()}\r\n\r\n {this.getBottomDrawingViewer()}\r\n
    \r\n\r\n
    {/* Take up remaining horizontal space in browser */}
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(LengthInputs);\r\n","import * as React from 'react';\r\nimport '../../css/Accordions.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n title: string;\r\n subtitle: string;\r\n classname: string;\r\n active: boolean;\r\n locked: boolean;\r\n hasError: boolean;\r\n togglePanel: () => void;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\n/** NOTE: this header is the same on all accordions.\r\n * We just pass in the title, subtitle, its active state, and a function to toggle it on/off.\r\n */\r\nclass AccordionHeader extends React.Component {\r\n private getHeaderCSS() {\r\n let cssString = this.props.classname;\r\n if (this.props.active) {\r\n cssString += ' active-accordian';\r\n }\r\n //Gold bottom border. Try without for now (per Dave). May bring it back.\r\n // if (this.props.locked) {\r\n // cssString += ' acc-header-locked';\r\n // }\r\n\r\n return cssString;\r\n }\r\n\r\n public render() {\r\n const title = this.props.title;\r\n const subtitle = this.props.subtitle;\r\n const active = this.props.active;\r\n const locked = this.props.locked;\r\n const hasError = this.props.hasError;\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default AccordionHeader;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { match } from \"react-router\";\r\nimport { callGetEndpoint, getInletOutletSizingDrawing, updateInputField } from \"../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport AccordionHeader from \"../Shared/AccordionHeader\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\nimport { formatNumber } from \"../../api-utilities/formatting\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport \"../../css/UnitSizing.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n drawingSVG: string;\r\n showPrerequisiteErrors: boolean;\r\n prerequisiteErrorsList: any[];\r\n individualErrors: any[];\r\n activeComponent: string;\r\n completeData: string;\r\n activeId: string;\r\n}\r\n\r\nclass UnitSizing extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n drawingSVG: \"\",\r\n showPrerequisiteErrors: false,\r\n prerequisiteErrorsList: [],\r\n individualErrors: [],\r\n completeData: \"\",\r\n activeComponent: \"SupplyAirOutlet\",\r\n activeId: \"SAOutlet\"\r\n };\r\n\r\n async componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"readapi/GetInletOutletSizingValues\", projectId, unitId);\r\n this.setState({\r\n userInputs: result.uiDataContainer?.primaryInputs,\r\n displayFields: result.uiDataContainer?.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n individualErrors: result.individualErrors,\r\n completeData: result.completeData\r\n });\r\n\r\n //Display prerequisite errors if there are any\r\n if (!isEmptyArray(result.prerequisiteErrors)) {\r\n this.setState({ showPrerequisiteErrors: true, prerequisiteErrorsList: result.prerequisiteErrors });\r\n }\r\n else {\r\n if (!isEmptyArray(result.individualErrors)) {\r\n //display the nice error dialog box\r\n const notification = {\r\n id: \"inletOutletSizingError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    {result.individualErrors.toString()}
    \r\n };\r\n addNotification(notification);\r\n }\r\n \r\n this.getDrawingSvg();\r\n }\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n private async getDrawingSvg() {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const response = await getInletOutletSizingDrawing(this.props.match.params, this.state.activeId, this.state.completeData);\r\n if (response?.data.schematicSvg?.length) {\r\n this.setState({ drawingSVG: response.data.schematicSvg });\r\n } else {\r\n this.setState({ drawingSVG: \"\" });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n getSketchTitle() {\r\n switch (this.state.activeId) {\r\n case \"OAInlet\":\r\n return \"Outside Air Inlet\";\r\n case \"SAOutlet\":\r\n return \"Supply Air Outlet\";\r\n case \"RAInlet\":\r\n return \"Return Air Inlet\";\r\n case \"EAOutlet\":\r\n return \"Exhaust Air Outlet\";\r\n }\r\n return \"\";\r\n }\r\n getConnectionLocation() {\r\n const primaryInputs = this.state.userInputs;\r\n switch (this.state.activeId) {\r\n case \"OAInlet\":\r\n return this.convertToInletOutletLocationToText(primaryInputs.outsideAirInletLocation);\r\n case \"SAOutlet\":\r\n return this.convertToInletOutletLocationToText(primaryInputs.supplyAirOutletLocation);\r\n case \"RAInlet\":\r\n return this.convertToInletOutletLocationToText(primaryInputs.returnAirInletLocation);\r\n case \"EAOutlet\":\r\n return this.convertToInletOutletLocationToText(primaryInputs.exhaustAirOutletLocation);\r\n }\r\n return \"\";\r\n }\r\n convertToInletOutletLocationToText(inletOutletLocation: string){\r\n switch (inletOutletLocation) {\r\n case \"LeftEnd\":\r\n return \"Left End\";\r\n case \"RightEnd\":\r\n return \"Right End\";\r\n case \"FrontSide\":\r\n return \"Front Side\";\r\n case \"BackSide\":\r\n return \"Back Side\";\r\n }\r\n return inletOutletLocation;\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateInletOutletSizing\", projectId, unitId, fieldName, newValue, \"primaryInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.primaryInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n completeData: result.data.completeData\r\n });\r\n }\r\n this.getDrawingSvg();\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error0\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n private getActiveId(componentName: string) {\r\n if (componentName === \"OutsideAirInlet\") {\r\n return \"OAInlet\";\r\n }\r\n if (componentName === \"SupplyAirOutlet\") {\r\n return \"SAOutlet\";\r\n }\r\n if (componentName === \"ExhaustAirOutlet\") {\r\n return \"EAOutlet\";\r\n }\r\n if (componentName === \"ReturnAirInlet\") {\r\n return \"RAInlet\";\r\n }\r\n return \"\";\r\n }\r\n private async togglePanel(componentName: string) {\r\n this.setState({ activeComponent: componentName, activeId: this.getActiveId(componentName) });\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(`readapi/GetInletOutletSizingValuesByComponent/${componentName}`, projectId, unitId);\r\n this.setState({\r\n userInputs: result.uiDataContainer.primaryInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors,\r\n individualErrors: result.individualErrors,\r\n completeData: result.completeData\r\n });\r\n this.getDrawingSvg();\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n }\r\n private getPrerequisiteErrors() {\r\n const errors = this.state.prerequisiteErrorsList;\r\n if (errors) {\r\n return errors.map((item: any, index: number) => (\r\n
    \r\n
    {item.source}
    \r\n
    {item.errorMessage}
    \r\n
    \r\n ));\r\n }\r\n return null;\r\n }\r\n public render() {\r\n if (this.state.showPrerequisiteErrors) {\r\n return (\r\n
    \r\n
    Warning
    \r\n
    Design calculations cannot be run due to missing/invalid fields:
    \r\n
    \r\n
    Page
    \r\n
    Field
    \r\n
    \r\n {this.getPrerequisiteErrors()}\r\n
    \r\n\r\n
    Please revisit these page(s) and fix any invalid inputs.
    \r\n
    \r\n );\r\n }\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n let activeComponent = this.state.activeComponent;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n let oaAcfm = savedValues.economizer === \"None\" ? savedValues.outsideAirAltitudeOnlyAcfmUserValue : savedValues.outsideAirAltitudeOnlyAcfm;\r\n let eaAcfm = savedValues.economizer === \"None\" ? savedValues.exhaustAirAltitudeOnlyAcfmUserValue : savedValues.exhaustAirAltitudeOnlyAcfm;\r\n\r\n return (\r\n
    \r\n
    \r\n
    Air Inlets and Outlets
    \r\n
    \r\n {/* ------------------------------ OutsideAirInlet ------------------------------------------------------------------------ */}\r\n
    \r\n this.togglePanel(\"OutsideAirInlet\")}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Airflow
    \r\n
    {formatNumber(oaAcfm, 0)}
    \r\n\r\n
    \r\n
    Sizing Method
    \r\n
    \r\n this.saveInputValue(\"OutsideInletSizingMethod\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"outsideAirSizingMethodOptions\")}\r\n \r\n {this.getValidationError(\"outsideInletSizingMethod\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    {savedValues.outsideAirInlet} Size
    \r\n\r\n
    \r\n
    \r\n
    Dimension A
    \r\n\r\n {displayFields.outsideInletDimensionsAreReadOnly ? (\r\n
    {savedValues.outsideInletDimensionA}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"outsideInletDimensionA\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideInletDimensionA\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"outsideInletDimensionA\")}\r\n
    \r\n\r\n
    \r\n
    Dimension B
    \r\n\r\n {displayFields.outsideInletDimensionsAreReadOnly ? (\r\n
    {savedValues.outsideInletDimensionB}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"outsideInletDimensionB\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideInletDimensionB\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"outsideInletDimensionB\")}\r\n
    \r\n\r\n
    \r\n
    {savedValues.outsideAirInlet === \"Louver\" ? \"Free Area Face Velocity\" : \"Face Velocity\"}
    \r\n\r\n {displayFields.outsideInletFaceVelocityIsReadOnly ? (\r\n
    \r\n
    {formatNumber(savedValues.outsideInletFaceVelocityFpm, 0)}
    \r\n
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"outsideInletFaceVelocityFpm\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideInletFaceVelocityFpm\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"outsideInletFaceVelocityFpm\")}\r\n
    \r\n
    \r\n\r\n
    {savedValues.outsideAirInlet} Position
    \r\n\r\n
    \r\n {this.state.displayFields.showOutsideAirDimensionC ? (\r\n
    \r\n
    Dimension C
    \r\n\r\n {displayFields.outsideInletDimensionsAreReadOnly ? (\r\n
    {savedValues.outsideInletDimensionC}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"outsideInletDimensionC\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideInletDimensionC\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"outsideInletDimensionC\")}\r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Dimension D
    \r\n\r\n {displayFields.outsideInletDimensionsAreReadOnly ? (\r\n
    {savedValues.outsideInletDimensionD}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"outsideInletDimensionD\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"outsideInletDimensionD\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"outsideInletDimensionD\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* ------------------------------------- SupplyAirOutlet ----------------------------------------------------------------- */}\r\n
    \r\n this.togglePanel(\"SupplyAirOutlet\")}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Airflow
    \r\n
    {formatNumber(this.state.userInputs.supplyAirAltitudeOnlyAcfm, 0)}
    \r\n\r\n
    \r\n
    Sizing Method
    \r\n
    \r\n this.saveInputValue(\"supplyOutletSizingMethod\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"supplyAirSizingMethodOptions\")}\r\n \r\n {this.getValidationError(\"supplyOutletSizingMethod\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    {savedValues.supplyAirOutlet} Size
    \r\n\r\n
    \r\n
    \r\n
    Dimension A
    \r\n\r\n {displayFields.supplyOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.supplyOutletDimensionA}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"supplyOutletDimensionA\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyOutletDimensionA\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"supplyOutletDimensionA\")}\r\n
    \r\n\r\n
    \r\n
    Dimension B
    \r\n\r\n {displayFields.supplyOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.supplyOutletDimensionB}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"supplyOutletDimensionB\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyOutletDimensionB\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"supplyOutletDimensionB\")}\r\n
    \r\n\r\n
    \r\n
    {savedValues.supplyAirOutlet === \"Louver\" ? \"Free Area Face Velocity\" : \"Face Velocity\"}
    \r\n\r\n {displayFields.supplyOutletFaceVelocityIsReadOnly ? (\r\n
    \r\n
    {formatNumber(savedValues.supplyOutletFaceVelocityFpm, 0)}
    \r\n
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"supplyOutletFaceVelocityFpm\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyOutletFaceVelocityFpm\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"supplyOutletFaceVelocityFpm\")}\r\n
    \r\n
    \r\n\r\n
    {savedValues.supplyAirOutlet} Position
    \r\n\r\n
    \r\n
    \r\n
    Dimension C
    \r\n\r\n {displayFields.supplyOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.supplyOutletDimensionC}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"supplyOutletDimensionC\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyOutletDimensionC\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"supplyOutletDimensionC\")}\r\n
    \r\n\r\n
    \r\n
    Dimension D
    \r\n\r\n {displayFields.supplyOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.supplyOutletDimensionD}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"supplyOutletDimensionD\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"supplyOutletDimensionD\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"supplyOutletDimensionD\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* ------------------------------------- ReturnAirInlet ----------------------------------------------------------------- */}\r\n\r\n {this.state.displayFields.showReturnAirInlet ? (\r\n
    \r\n this.togglePanel(\"ReturnAirInlet\")}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Airflow
    \r\n
    {formatNumber(this.state.userInputs.returnAirAltitudeOnlyAcfm, 0)}
    \r\n\r\n
    \r\n
    Sizing Method
    \r\n
    \r\n this.saveInputValue(\"returnInletSizingMethod\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"returnAirSizingMethodOptions\")}\r\n \r\n {this.getValidationError(\"returnInletSizingMethod\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    {savedValues.returnAirInlet} Size
    \r\n\r\n
    \r\n
    \r\n
    Dimension A
    \r\n\r\n {displayFields.returnInletDimensionsAreReadOnly ? (\r\n
    {savedValues.returnInletDimensionA}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"returnInletDimensionA\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnInletDimensionA\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"returnInletDimensionA\")}\r\n
    \r\n\r\n
    \r\n
    Dimension B
    \r\n\r\n {displayFields.returnInletDimensionsAreReadOnly ? (\r\n
    {savedValues.returnInletDimensionB}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"returnInletDimensionB\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnInletDimensionB\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"returnInletDimensionB\")}\r\n
    \r\n\r\n
    \r\n
    {savedValues.returnAirInlet === \"Louver\" ? \"Free Area Face Velocity\" : \"Face Velocity\"}
    \r\n\r\n {displayFields.returnInletFaceVelocityIsReadOnly ? (\r\n
    \r\n
    {formatNumber(savedValues.returnInletFaceVelocityFpm, 0)}
    \r\n
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"returnInletFaceVelocityFpm\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnInletFaceVelocityFpm\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"returnInletFaceVelocityFpm\")}\r\n
    \r\n
    \r\n\r\n
    {savedValues.returnAirInlet} Position
    \r\n\r\n
    \r\n
    \r\n
    Dimension C
    \r\n\r\n {displayFields.returnInletDimensionsAreReadOnly ? (\r\n
    {savedValues.returnInletDimensionC}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"returnInletDimensionC\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnInletDimensionC\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"returnInletDimensionC\")}\r\n
    \r\n\r\n
    \r\n
    Dimension D
    \r\n\r\n {displayFields.returnInletDimensionsAreReadOnly ? (\r\n
    {savedValues.returnInletDimensionD}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"returnInletDimensionD\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"returnInletDimensionD\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"returnInletDimensionD\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* ------------------------------------- ExhaustAirOutlet ----------------------------------------------------------------- */}\r\n\r\n {this.state.displayFields.showExhaustAirOutlet ? (\r\n
    \r\n this.togglePanel(\"ExhaustAirOutlet\")}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Airflow
    \r\n
    {formatNumber(eaAcfm, 0)}
    \r\n\r\n
    \r\n
    Sizing Method
    \r\n
    \r\n this.saveInputValue(\"exhaustOutletSizingMethod\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"exhaustAirSizingMethodOptions\")}\r\n \r\n {this.getValidationError(\"exhaustOutletSizingMethod\")}\r\n
    \r\n
    \r\n
    \r\n\r\n
    {savedValues.exhaustAirOutlet} Size
    \r\n\r\n
    \r\n
    \r\n
    Dimension A
    \r\n {displayFields.exhaustOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.exhaustOutletDimensionA}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"exhaustOutletDimensionA\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exhaustOutletDimensionA\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"exhaustOutletDimensionA\")}\r\n
    \r\n\r\n
    \r\n
    Dimension B
    \r\n {displayFields.exhaustOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.exhaustOutletDimensionB}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"exhaustOutletDimensionB\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exhaustOutletDimensionB\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"exhaustOutletDimensionB\")}\r\n
    \r\n\r\n
    \r\n
    {savedValues.exhaustAirOutlet === \"Louver\" ? \"Free Area Face Velocity\" : \"Face Velocity\"}
    \r\n {displayFields.exhaustOutletFaceVelocityIsReadOnly ? (\r\n
    \r\n
    {formatNumber(savedValues.exhaustOutletFaceVelocityFpm, 0)}
    \r\n
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"exhaustOutletFaceVelocityFpm\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exhaustOutletFaceVelocityFpm\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"exhaustOutletFaceVelocityFpm\")}\r\n
    \r\n
    \r\n\r\n
    {savedValues.exhaustAirOutlet} Position
    \r\n\r\n
    \r\n {this.state.displayFields.showExhaustAirDimensionC ? (\r\n
    \r\n
    Dimension C
    \r\n {displayFields.exhaustOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.exhaustOutletDimensionC}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"exhaustOutletDimensionC\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exhaustOutletDimensionC\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"exhaustOutletDimensionC\")}\r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Dimension D
    \r\n {displayFields.exhaustOutletDimensionsAreReadOnly ? (\r\n
    {savedValues.exhaustOutletDimensionD}
    \r\n ) : (\r\n
    \r\n this.updateTextboxValue(\"exhaustOutletDimensionD\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exhaustOutletDimensionD\", event.currentTarget.value)}\r\n />\r\n
    \r\n )}\r\n {this.getValidationError(\"exhaustOutletDimensionD\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n\r\n
    \r\n
    {`${this.getSketchTitle()}`} Dimensioning Sketch
    \r\n\r\n
    \r\n {this.state.drawingSVG !== \"\" ?
    : null}\r\n
    {this.getConnectionLocation()}
    \r\n {this.getDrawingDescription()}\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n getDrawingDescription() {\r\n //const drawingView = this.props.reduxMenus.sizingAccordion.drawingView.toLowerCase();\r\n const drawingView = this.getConnectionLocation();\r\n const isTopView = drawingView.toLowerCase().includes(\"top\");\r\n\r\n return (\r\n
    \r\n Note: C and D are dimensioned to the casing {isTopView ? \"\" : \"and base\"}{\" \"}\r\n exterior.\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitSizing);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Route, match } from \"react-router-dom\";\r\nimport LayoutSubMenu from \"./Menus/LayoutSubMenu\";\r\nimport AccessDoors from \"./FineTuneDesign/AccessDoors\";\r\nimport CoilConnections from \"./FineTuneDesign/CoilConnections\";\r\nimport LayoutAdjustments from \"./FineTuneDesign/LayoutAdjustments\";\r\nimport LengthInputs from \"./FineTuneDesign/LengthInputs\";\r\nimport InletOutletSizing from \"./FineTuneDesign/InletOutletSizing\";\r\nimport { mapDispatchToProps } from \"../redux/actions\";\r\nimport { checkIsProEditMode } from \"../utilities/specmateProHelpers\";\r\nimport \"../css/UnitSelection.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass UnitLayout extends React.Component {\r\n componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 4 } });\r\n }\r\n\r\n async componentDidUpdate() {\r\n const { projectId, unitId } = this.props.match.params;\r\n let isProEditMode = await checkIsProEditMode(projectId, unitId);\r\n\r\n if (isProEditMode) {\r\n this.props.history.push(\"/project\"); //redirect to project page\r\n }\r\n }\r\n\r\n public render() {\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitLayout);\r\n","import * as React from \"react\";\r\nimport { store } from \"../../redux/store\";\r\nimport { SortBy, ProjectStatusFilterBy } from \"../../interfaces/interfaces\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n getUnits,\r\n addNewProject,\r\n getProjectsByUser,\r\n deleteProjectAndUnits,\r\n updateProject,\r\n copyUnit,\r\n copyProject,\r\n addUnit,\r\n getProject,\r\n deleteUnit,\r\n getProjectProStatus,\r\n transferProjectToNewUser\r\n} from \"../../api-calls/projectDataService\";\r\nimport { displayError } from \"../../api-utilities/api-calls\";\r\nimport { isEmptyArray, sqlToJsDate } from \"../../utilities/helpers\";\r\nimport { updateReduxAction } from \"../../redux/actions\";\r\nimport { getNumericId } from \"../../api-utilities/formatting\";\r\nimport { cloneDeep } from \"lodash\";\r\n//This file contains methods that pertain to the ProjectManagement component.\r\n\r\n//Calls Project service when user hits \"Add New\" project button.\r\nexport async function AddNewProject() {\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n const projectName = reduxProjectManagement.projectName;\r\n\r\n if (projectName !== \"\") {\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { projectName: \"\" }));\r\n\r\n //This adds a project to the database and returns a ProjectDTO object with the new id.\r\n const response = await addNewProject(reduxProjectManagement);\r\n console.log(\"-------Response from addNewProject --->\");\r\n console.log(response);\r\n if (response.success) {\r\n const projectList = response.data.projectList;\r\n\r\n //refresh the project list\r\n await getProjectList();\r\n\r\n console.log(\"------- getProjectList --->\");\r\n console.log(projectList);\r\n\r\n //Select the newly created project row & show the units.\r\n if (!isEmptyArray(projectList)) {\r\n selectProject(projectList[0]); //should only be 1 item in the list\r\n }\r\n } else {\r\n const error = { status: 500, message: \"Add Project failed. Please try again.\" };\r\n displayError(error, \"addNewProject\");\r\n }\r\n }\r\n}\r\n\r\nexport async function updateEditedProject() {\r\n //Will update project data as edited by the user.\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n const updatedProjectName = reduxProjectManagement.projectName;\r\n const selectedProject = reduxProjectManagement.selectedProject;\r\n\r\n if (updatedProjectName !== \"\") {\r\n //Re-set project name in redux for the next edit or add new project.\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { projectName: \"\" }));\r\n\r\n //Call the project data service method to update project data.\r\n const response = await updateProject(selectedProject, reduxProjectManagement);\r\n\r\n if (response.success) {\r\n //refresh the project list\r\n await getProjectList();\r\n\r\n //Select the updated project so the project bar gets updated if the name was edited.\r\n selectProject(selectedProject);\r\n\r\n //Go back to the page that the edit was on.\r\n NewPageSelected(reduxProjectManagement.currentPage);\r\n } else {\r\n const error = { status: 500, message: \"Edit Project failed. Please try again.\" };\r\n displayError(error, \"updateEditedProject\");\r\n }\r\n }\r\n}\r\n\r\nexport async function transferProject() {\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n let selectedUserId = reduxProjectManagement.selectedUserId;\r\n let selectedProject = reduxProjectManagement.selectedProject;\r\n console.log(selectedProject);\r\n\r\n if (selectedProject && selectedProject.id) {\r\n return await transferProjectToNewUser(selectedProject.id, selectedUserId);\r\n }\r\n}\r\n\r\n//Get List of Projects from server and store in state\r\nexport async function getProjectList() {\r\n const response = await getProjectsByUser();\r\n if (response) {\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { unitList: [], selectedProject: null, projectStatusFilterBy: ProjectStatusFilterBy.All }));\r\n SetupPaginationWithNewProjectList(response.projectList, SortBy.None, SortBy.None);\r\n }\r\n}\r\n\r\n//Get list of Units when user clicks a project.\r\nexport async function selectProject(project: any) {\r\n //let projectId = getNumericId(project.id);\r\n //console.log(\"selectProject:\" + project.id)\r\n\r\n const response = await getUnits(project.id);\r\n const unitList = response.unitList != null ? response.unitList : [];\r\n\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", {\r\n selectedProject: project,\r\n unitList: unitList,\r\n newUnitTag: \"\"\r\n })\r\n );\r\n return;\r\n}\r\n\r\nexport async function addNewUnit() {\r\n //New units created here have no tag yet.\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n const projectIdString = reduxProjectManagement.selectedProject.id;\r\n\r\n //Get the number part of the string (\"proj-342\") because we return that for routing in the URL\r\n let projectId = getNumericId(projectIdString);\r\n\r\n //Response object to return from this method.\r\n let response = { success: false, projectId: projectId, newUnitId: 0 };\r\n\r\n //GraphAPI endpoints use the full string version of the Id (ex: \"proj-342\", \"unit-351\")\r\n const addUnitResult = await addUnit(projectIdString);\r\n\r\n //If addUnit was successful, add new UnitId to the response\r\n if (addUnitResult.success && !addUnitResult.data.hasError) {\r\n const unit = addUnitResult.data.unit;\r\n\r\n if (unit.id !== null) {\r\n let unitId = getNumericId(unit.id);\r\n\r\n response.success = true;\r\n response.newUnitId = unitId;\r\n response.projectId = projectId;\r\n return response;\r\n }\r\n }\r\n\r\n const error = { status: 500, message: \"Add Unit failed. Please try again.\" };\r\n displayError(error, \"addNewProject\");\r\n return response;\r\n}\r\n\r\n//Get options for the Project Status dropdown\r\nexport function getStatusOptions() {\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n const statusOptions = reduxProjectManagement.statusTypes;\r\n if (!isEmptyArray(statusOptions)) {\r\n return statusOptions.map((item: any, index: number) => (\r\n \r\n ));\r\n }\r\n return null;\r\n}\r\n\r\n//Delete project and its associated units\r\nexport async function deleteProject(projectId: string) {\r\n //Call server to delete this project and its units\r\n if (projectId) {\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: true }));\r\n const response = await deleteProjectAndUnits(projectId);\r\n if (response.success) {\r\n //refresh the project list\r\n await getProjectList();\r\n\r\n //Clear the selected unit list\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { selectedProject: null }));\r\n }\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: false }));\r\n }\r\n}\r\n\r\nexport async function deleteUnitById(unitId: string) {\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n const projectId = reduxProjectManagement.selectedProject.id;\r\n //Call server to delete this unit.\r\n if (unitId) {\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { unitToDelete: unitId }));\r\n const response = await deleteUnit(projectId, unitId);\r\n if (response.success) {\r\n //refresh the unit list so the deleted unit is removed.\r\n const getUnitsResponse = await getUnits(projectId);\r\n const unitList = getUnitsResponse.unitList;\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { unitList: unitList, newUnitTag: \"\" }));\r\n }\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { unitToDelete: \"\" }));\r\n }\r\n}\r\n\r\n//Build table rows from the project list in state\r\nexport function getProjectRows() {\r\n //NOTE: don't move reduxProjectManagement into state. Several components use it.\r\n const reduxProjectManagement = store.getState().reduxProjectManagement;\r\n const selectedProjectId = reduxProjectManagement.selectedProject ? reduxProjectManagement.selectedProject.id : \"\";\r\n\r\n if (!isEmptyArray(reduxProjectManagement.currentProjectList)) {\r\n return reduxProjectManagement.currentProjectList.map((item: any, index: number) =>\r\n selectedProjectId === item.id ? (\r\n
    \r\n
    \r\n
    {item.projectName}
    \r\n
    {item.jobStatus}
    \r\n
    {sqlToJsDate(item.lastModifiedDate)}
    \r\n
    \r\n
    \r\n
    \r\n
    editProject(event, item)}>\r\n edit\r\n
    \r\n
    openProjectCopyModal(event, item)}>\r\n copy\r\n
    \r\n
    deleteProjectPrompt(event, item)}>\r\n delete\r\n
    \r\n\r\n {showOutputLink() === true ? (\r\n \r\n
    outputs
    \r\n \r\n ) : (\r\n
    outputs
    \r\n )}\r\n
    transferProjectPrompt(event, item)}>\r\n transfer\r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : (\r\n
    \r\n
    selectProject(item)}>\r\n
    {item.projectName}
    \r\n
    {item.jobStatus}
    \r\n
    {sqlToJsDate(item.lastModifiedDate)}
    \r\n
    \r\n
    \r\n )\r\n );\r\n } else {\r\n return
    No Results Found
    ;\r\n }\r\n}\r\n\r\nfunction showOutputLink() {\r\n const units = store.getState().reduxProjectManagement.unitList;\r\n if (units && units.length > 0) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction getOutputDocsUrl() {\r\n const pm = store.getState().reduxProjectManagement;\r\n\r\n //Don't really need the unit number. Pass only the unit number. Comes in as example unit-3715.\r\n const unitId = pm.unitList[0].id.split(\"-\")[1];\r\n //pass only the project number. Comes in as example proj-415\r\n const projectId = pm.selectedProject.id.split(\"-\")[1];\r\n\r\n return \"/pid/\" + projectId + \"/uid/\" + unitId + \"/outputs/pdfoutputs\";\r\n}\r\n\r\n//Open modal window to edit Project details\r\nexport async function editProject(event: React.SyntheticEvent, project: any) {\r\n //User clicked edit link on project bar. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n //await selectProject(project);\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ProjectModal\",\r\n modalData: \"\",\r\n modalId: \"edit-project\"\r\n })\r\n );\r\n}\r\n\r\n//Launch modal to prompt user about deleting a project\r\nexport async function deleteProjectPrompt(event: React.SyntheticEvent, project: any) {\r\n //User clicked Delete link on project bar. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n\r\n //Call graphDataApi to find out if this unit IsProEditMode\r\n let response = await getProjectProStatus(project.id);\r\n\r\n //---------- Show this modal if project has pro units and can't be deleted -----------\r\n if (response.hasProUnits) {\r\n const modalData1 = {\r\n title: \"Please Note:\",\r\n content:
    {\"Deleting this job is not allowed because it contains one or more units submitted for custom modifications.\"}
    ,\r\n projectIdToDelete: project.id\r\n };\r\n //componentDidUpdate method on ProjectManagment.tsx responds to this event\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ModalPopup\",\r\n modalId: \"delete-project-pro\",\r\n modalData: modalData1,\r\n hideCancelBtn: true,\r\n userResponse: \"\"\r\n })\r\n );\r\n } else {\r\n //--------- Show default modal if there are no pro units --------------------------------------\r\n const modalData = {\r\n title: \"Warning\",\r\n content:
    {\"Delete project \" + project.projectName + \" and all its units?\"}
    ,\r\n projectIdToDelete: project.id\r\n };\r\n //componentDidUpdate method on ProjectManagment.tsx responds to this event\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ModalPopup\",\r\n modalId: \"delete-project\",\r\n modalData: modalData,\r\n hideCancelBtn: false,\r\n userResponse: \"\"\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport async function deleteUnitPrompt(event: React.SyntheticEvent, unit: any) {\r\n //User clicked Delete link on unit band. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n if (unit.isProEditMode) {\r\n const modalData = {\r\n title: \"Please Note\",\r\n content:
    {\"This unit has been submitted to the Innovent engineering team for custom modifications, and cannot be deleted.\"}
    ,\r\n unitToDelete: unit.id\r\n };\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ModalPopup\",\r\n modalId: \"delete-unit-pro\",\r\n modalData: modalData,\r\n hideCancelBtn: true,\r\n userResponse: \"\"\r\n })\r\n );\r\n } else {\r\n const modalData = {\r\n title: \"Warning\",\r\n content:
    {\"Delete unit \" + unit.unitTag + \"?\"}
    ,\r\n unitToDelete: unit.id\r\n };\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ModalPopup\",\r\n modalId: \"delete-unit\",\r\n modalData: modalData,\r\n hideCancelBtn: false,\r\n userResponse: \"\"\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport async function openProUnitPrompt(unit: any) {\r\n //User clicked Delete link on unit band. Don't fire the click event attached to that bar.\r\n let msg =\r\n \"This unit has been submitted to the Innovent engineering team for custom modifications. It can no longer be edited in SpecMate. Please contact your Innovent Sales Person for more information.\";\r\n const modalData = {\r\n title: \"Please Note:\",\r\n content:
    {msg}
    ,\r\n unitToDelete: unit.id\r\n };\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ModalPopup\",\r\n modalId: \"pro-unit\",\r\n modalData: modalData,\r\n hideCancelBtn: true,\r\n userResponse: \"\"\r\n })\r\n );\r\n}\r\n\r\nexport async function transferProjectPrompt(event: React.SyntheticEvent, project: any) {\r\n //User clicked edit link on project bar. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n //await selectProject(project);\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"TransferProjectModal\",\r\n modalData: \"\",\r\n modalId: \"transfer-project\"\r\n })\r\n );\r\n}\r\n\r\nexport function openUnitCopyModal(event: React.SyntheticEvent, unit: any) {\r\n //User clicked Copy link on unit band. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n //This triggers ModalContainer.tsx to open the modal\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"UnitCopyModal\",\r\n modalData: unit,\r\n modalId: \"copy-unit\"\r\n })\r\n );\r\n}\r\n\r\nexport function openProjectCopyModal(event: React.SyntheticEvent, project: any) {\r\n //User clicked Copy link on unit bar. Don't fire the click event attached to that bar.\r\n event.stopPropagation();\r\n //This triggers ModalContainer.tsx to open the modal\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ProjectCopyModal\",\r\n modalData: project,\r\n modalId: \"copy-project\"\r\n })\r\n );\r\n}\r\n\r\nexport function openProjectModal() {\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { selectedProject: null }));\r\n //This triggers ModalContainer.tsx to open the modal\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ProjectModal\",\r\n modalData: \"\",\r\n modalId: \"add-new-project\"\r\n })\r\n );\r\n}\r\n\r\nexport async function copyUnitToProject(modalData: any) {\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: true }));\r\n let response = await copyUnit(modalData.sourceProjectId, modalData.targetProjectId, modalData.unitTagName, modalData.unitId);\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: false }));\r\n\r\n //handle failed network or api call\r\n if (response.success === false) {\r\n const error = {\r\n status: 500,\r\n message: response.data\r\n };\r\n displayError(error, \"Copy Unit\");\r\n }\r\n //handle api logic error\r\n if (response.data.hasError) {\r\n const error = {\r\n status: 500,\r\n message: response.data.errorMessage\r\n };\r\n displayError(error, \"Copy Unit\");\r\n }\r\n //select the project that we just added a unit to (so its unit list shows up with the new item)\r\n const projectList = store.getState().reduxProjectManagement.projectList;\r\n let targetProject = projectList.find((x: any) => x.id === modalData.targetProjectId);\r\n await selectProject(targetProject);\r\n}\r\n\r\nexport async function copyProjectWithUnits(userResponse: any) {\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: true }));\r\n\r\n let response = await copyProject(userResponse.projectId, userResponse.projectName);\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: false }));\r\n\r\n //handle failed network or api call\r\n if (response.success === false) {\r\n const error = {\r\n status: 500,\r\n message: response.data\r\n };\r\n displayError(error, \"Copy Project\");\r\n }\r\n //handle api logic error\r\n if (response.data.hasError) {\r\n const error = {\r\n status: 500,\r\n message: response.data.errorMessage\r\n };\r\n displayError(error, \"Copy Project\");\r\n }\r\n}\r\n\r\nexport function sortByJobName(sortby: SortBy) {\r\n const projectList = store.getState().reduxProjectManagement.projectList;\r\n let clonedList = cloneDeep(projectList);\r\n\r\n if (sortby === SortBy.ASC) {\r\n clonedList.sort(compareASC);\r\n } else if (sortby === SortBy.DESC) {\r\n clonedList.sort(compareDESC);\r\n }\r\n SetupPaginationWithNewProjectList(clonedList, sortby, SortBy.None);\r\n clonedList = null;\r\n}\r\n\r\nexport function sortByLastModified(sortby: SortBy) {\r\n const projectList = store.getState().reduxProjectManagement.projectList;\r\n let clonedList = cloneDeep(projectList);\r\n\r\n if (sortby === SortBy.ASC) {\r\n clonedList.sort(compareDateASC);\r\n } else if (sortby === SortBy.DESC) {\r\n clonedList.sort(compareDateDESC);\r\n }\r\n SetupPaginationWithNewProjectList(clonedList, SortBy.None, sortby);\r\n clonedList = null;\r\n}\r\n\r\nfunction compareASC(a: any, b: any) {\r\n let aName, bName;\r\n\r\n if (a.hasOwnProperty(\"projectName\")) {\r\n aName = a.projectName.toUpperCase();\r\n bName = b.projectName.toUpperCase();\r\n }\r\n if (aName < bName) {\r\n return -1;\r\n }\r\n if (aName > bName) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction compareDESC(a: any, b: any) {\r\n let aName, bName;\r\n\r\n if (a.hasOwnProperty(\"projectName\")) {\r\n aName = a.projectName.toUpperCase();\r\n bName = b.projectName.toUpperCase();\r\n }\r\n if (aName < bName) {\r\n return 1;\r\n }\r\n if (aName > bName) {\r\n return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction compareDateASC(a: any, b: any) {\r\n let aName, bName;\r\n if (a.hasOwnProperty(\"lastModifiedDate\")) {\r\n aName = a.lastModifiedDate;\r\n bName = b.lastModifiedDate;\r\n }\r\n if (aName < bName) {\r\n return -1;\r\n }\r\n if (aName > bName) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction compareDateDESC(a: any, b: any) {\r\n let aName, bName;\r\n if (a.hasOwnProperty(\"lastModifiedDate\")) {\r\n aName = a.lastModifiedDate;\r\n bName = b.lastModifiedDate;\r\n }\r\n if (aName < bName) {\r\n return 1;\r\n }\r\n if (aName > bName) {\r\n return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport function SetupPaginationWithNewProjectList(projectList: any, projectNameSort: any, projectLastModifiedSort: any) {\r\n const totalRecords = projectList && projectList.length > 0 ? projectList.length : 0;\r\n // Records to be displayed on the current page\r\n const currentRecords = projectList.slice(0, 10);\r\n store.dispatch(\r\n updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", {\r\n projectList: projectList,\r\n projectNameSortBy: projectNameSort,\r\n projectLastModifiedSortBy: projectLastModifiedSort,\r\n totalProjectRecords: totalRecords,\r\n currentProjectList: currentRecords,\r\n currentPage: 1\r\n })\r\n );\r\n\r\n //If no projects are returned, then clear the unit list and set selectedProject to null.\r\n if (projectList && projectList.length === 0) {\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { unitList: [], selectedProject: null }));\r\n }\r\n}\r\n\r\n//Called from the paging links at the bottom of the paging control.\r\nexport function NewPageSelected(page: string) {\r\n const pm = store.getState().reduxProjectManagement;\r\n let currentRecords: any[] = [];\r\n let newCurrentPage = 0;\r\n let beginIndex = 0;\r\n let endIndex = 0;\r\n\r\n if (page === \"prev\") {\r\n //0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22\r\n newCurrentPage = pm.currentPage - 1;\r\n } else if (page === \"next\") {\r\n newCurrentPage = pm.currentPage + 1;\r\n } else {\r\n newCurrentPage = Number(page);\r\n }\r\n\r\n beginIndex = newCurrentPage * pm.projectRecordsPerPage - 10;\r\n endIndex = beginIndex + 10;\r\n currentRecords = pm.projectList.slice(beginIndex, endIndex);\r\n\r\n store.dispatch(updateReduxAction(\"UPDATE_PROJECT_MANAGEMENT\", { currentProjectList: currentRecords, currentPage: newCurrentPage }));\r\n}\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { deleteUnitPrompt, openUnitCopyModal, openProUnitPrompt } from \"./ProjectUtilities\";\r\nimport { getNumericId } from \"../../api-utilities/formatting\";\r\nimport \"../../css/Project.scss\";\r\nimport { formatNumber } from \"../../utilities/helpers\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n unit: any;\r\n projectId: string;\r\n history: any;\r\n reduxDisplay: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass Unit extends React.Component {\r\n public state: IState = {};\r\n\r\n public render() {\r\n let isProEditMode = this.props.unit.isProEditMode;\r\n let spinnerClass = this.props.reduxDisplay.unitToDelete === this.props.unit.id ? \"\" : \"app-display-none\";\r\n let unitPrice = this.props.unit.unitPrice ? \"$\" + formatNumber(this.props.unit.unitPrice, 0) : \"-\";\r\n let priceAvailable = this.props.unit.isPriceAvailable;\r\n let rowClass = isProEditMode ? \"proj-unit-tr-purple\" : \"proj-unit-tr\";\r\n let copyClass = isProEditMode ? \"proj-unit-td proj-link-white\" : \"proj-unit-td proj-link\";\r\n let deleteClass = this.props.reduxDisplay.unitToDelete === this.props.unit.id ? \"app-display-none\" : \"proj-unit-td proj-link\";\r\n\r\n return (\r\n
    this.editUnit(this.props.unit)}>\r\n {/* The \"title\" property enables tooltips when user mouses over a long unitTag */}\r\n
    \r\n {isProEditMode ? (\r\n <>\r\n
    \r\n
    \r\n \r\n ) : null}\r\n\r\n {/*
    {this.props.unit.unitTag}
    */}\r\n\r\n {this.props.unit.unitTag}\r\n
    \r\n {/* The \"title\" property enables tooltips when user mouses over a long modelNumber */}\r\n
    \r\n {this.props.unit.modelNumber}\r\n
    \r\n
    {priceAvailable ? unitPrice : \"Unavailable\"}
    \r\n
    {this.props.unit.unitQuantity}
    \r\n
    openUnitCopyModal(event, this.props.unit)}>\r\n copy\r\n
    \r\n\r\n
    deleteUnitPrompt(event, this.props.unit)}>\r\n delete\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n private editUnit(unit: any) {\r\n if (unit.isProEditMode) {\r\n openProUnitPrompt(this.props.unit);\r\n return;\r\n }\r\n\r\n let projectId = getNumericId(this.props.projectId);\r\n let unitId = getNumericId(this.props.unit.id);\r\n this.props.history.push(\"/pid/\" + projectId + \"/uid/\" + unitId + \"/design/unittype\");\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return { reduxDisplay: state.reduxDisplay };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Unit);\r\n","import * as React from 'react';\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { connect } from \"react-redux\";\r\nimport { NewPageSelected } from './ProjectUtilities';\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxProjectManagement: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n//NOTE:\r\n//Paging control assumes there will be at most 30 page links. This allows for 300 projects.\r\nclass PagingControl extends React.Component {\r\n public render() {\r\n const pm = this.props.reduxProjectManagement;\r\n if (!pm.totalProjectRecords || pm.totalProjectRecords === 0){\r\n return null;\r\n }\r\n \r\n let pages:any[] = [];\r\n pages = this.getPageLinksCssClasses();\r\n return (\r\n
    \r\n
    NewPageSelected(\"prev\")}>< prev
    \r\n {this.getPages(pages)}\r\n
    NewPageSelected(\"next\")}>next >
    \r\n
    \r\n );\r\n }\r\n getPages(pages:any){\r\n //Hard-coding 30 pages at 10 per page = 300 projects.\r\n const pageLinks = pages.map(function (page: any, index: number) {\r\n // Index 0 and 31 are the prev / next pages, so don't include them.\r\n if (index !== 0 && index !== 31){\r\n return
    NewPageSelected((index).toString())}>{index}
    \r\n }\r\n });\r\n return pageLinks;\r\n }\r\n getPageLinksCssClasses(){\r\n \r\n let pages:any[] = [];\r\n const pm = this.props.reduxProjectManagement;\r\n \r\n let totalPages = Math.ceil(pm.totalProjectRecords / pm.projectRecordsPerPage);\r\n\r\n if (!pm.totalProjectRecords || pm.totalProjectRecords === 0){\r\n return pages;\r\n }\r\n const currentPage = pm.currentPage;\r\n\r\n let active = \"\"; //means the currently selected page.\r\n let blue = \"\"; //means a page in which there will be records to show.\r\n let pointerEvents = \"\"; // means a page that has click events.\r\n\r\n //Set up the list of objects for pages 1 through 20.\r\n for(let x = 1; x <= 30; x++){\r\n //Determin which \"pages\" should be blue, which is active, and which have click events.\r\n active = currentPage === x ? \"proj-paging-active\" : \"\";\r\n \r\n //[1,2,3,4,5,6,7,8,9,10],11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\r\n active = currentPage === x ? \"proj-paging-active\" : \"\";\r\n blue = x <= totalPages ? \"blue\" : \"project-hide\";\r\n pointerEvents = active === \"\" && blue === \"blue\" ? \"\" : \"\";\r\n\r\n //Only show the previous 10 pages from the current page. \r\n if (x + 10 <= currentPage){\r\n blue = \"project-hide\";\r\n }\r\n let obj = {\r\n activeClass: active,\r\n blueClass: blue,\r\n eventsClass: pointerEvents\r\n }\r\n pages.push(obj);\r\n }\r\n //prev page\r\n active = \"\";\r\n blue = currentPage > 1 ? \"blue\" : \"\";\r\n pointerEvents = blue === \"blue\" ? \"\" : \"noPointerEvents\";\r\n let objPrev = {\r\n activeClass: active,\r\n blueClass: blue,\r\n eventsClass: pointerEvents\r\n }\r\n //unshift puts the object at the beginning of the array.\r\n pages.unshift(objPrev);\r\n\r\n //next page\r\n active = \"\";\r\n blue = currentPage < totalPages ? \"blue\" : \"\";\r\n pointerEvents = blue === \"blue\" ? \"\" : \"noPointerEvents\";\r\n let objNext = {\r\n activeClass: \"\",\r\n blueClass: blue,\r\n eventsClass: pointerEvents\r\n }\r\n pages.push(objNext);\r\n return pages;\r\n }\r\n}\r\n function mapStateToProps(state: any) {\r\n return {\r\n reduxProjectManagement: state.reduxProjectManagement\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PagingControl);\r\n","import * as React from \"react\";\r\nimport { store } from \"../../redux/store\";\r\nimport { connect } from \"react-redux\";\r\nimport { sqlToJsDate } from \"../../utilities/helpers\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification } from \"../../api-utilities/notification-tools\";\r\nimport {\r\n AddNewProject,\r\n getProjectList,\r\n getStatusOptions,\r\n addNewUnit,\r\n deleteProject,\r\n deleteUnitById,\r\n getProjectRows,\r\n openProjectModal,\r\n selectProject,\r\n updateEditedProject,\r\n copyUnitToProject,\r\n copyProjectWithUnits,\r\n sortByJobName,\r\n sortByLastModified,\r\n SetupPaginationWithNewProjectList,\r\n transferProject\r\n} from \"./ProjectUtilities\";\r\nimport Unit from \"./Unit\";\r\nimport PagingControl from \"./PagingControl\";\r\nimport { resetReduxModals } from \"../../utilities/helpers\";\r\nimport { jobSearch, jobSearchByStatusAndName } from \"../../api-calls/readApiService\";\r\nimport { getProject } from \"../../api-calls/projectDataService\";\r\nimport \"../../css/Project.scss\";\r\nimport { ProjectStatusFilterBy, SortBy } from \"../../interfaces/interfaces\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxModals: any;\r\n reduxProjectManagement: any;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {\r\n jobNameSearchText: string;\r\n jobIdSearchText: string;\r\n hasEmployeeRole: boolean;\r\n copyProjectId: string;\r\n copyProjectHasError: boolean;\r\n showStatusDropdown: boolean;\r\n}\r\n\r\nclass ProjectManagement extends React.Component {\r\n //jobSearchText means a search was done and the results were filtered on this text.\r\n public state: IState = {\r\n jobNameSearchText: \"\",\r\n jobIdSearchText: \"\",\r\n hasEmployeeRole: false,\r\n copyProjectId: \"\",\r\n copyProjectHasError: false,\r\n showStatusDropdown: false\r\n };\r\n\r\n async componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 1 } });\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n\r\n await getProjectList();\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { enableUnitIcons: false });\r\n //Need to refresh the unit list in order to show the Unit tag name that is added on the configuration screen.\r\n //THe unit tag name is shown on the unit bars.\r\n if (this.props.reduxProjectManagement.selectedProject) {\r\n selectProject(this.props.reduxProjectManagement.selectedProject);\r\n }\r\n\r\n const auth = store.getState().reduxAuth;\r\n if (auth.userRoles?.length > 0) {\r\n auth.userRoles.forEach((role: any) => {\r\n if (role === \"employee\") {\r\n this.setState({ hasEmployeeRole: true });\r\n }\r\n });\r\n }\r\n }\r\n\r\n private handleKeyDown(e: React.KeyboardEvent) {\r\n if (e.key === \"Enter\") {\r\n this.runSearchByJobName();\r\n }\r\n }\r\n\r\n private async getProjectListByStatusAndName(projectStatus: string) {\r\n let response = await jobSearchByStatusAndName(\"dataapi/searchJobsByStatusAndName\", projectStatus, this.state.jobNameSearchText);\r\n\r\n if (response.hasError) {\r\n const notification = {\r\n id: \"searchJobsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    searchJobsByStatusAndName {response.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n SetupPaginationWithNewProjectList(response.projectList, SortBy.None, SortBy.None);\r\n }\r\n\r\n private async runSearchByJobName() {\r\n //Search jobs by name if search text was provided\r\n if (this.state.jobNameSearchText !== \"\") {\r\n let response = await jobSearch(\"dataapi/searchJobsByName\", this.state.jobNameSearchText);\r\n\r\n if (response.hasError) {\r\n const notification = {\r\n id: \"searchJobsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    searchJobsByName {response.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", { projectStatusFilterBy: ProjectStatusFilterBy.All });\r\n\r\n SetupPaginationWithNewProjectList(response.projectList, SortBy.None, SortBy.None);\r\n } else {\r\n //If search text is empty, just get all jobs\r\n await getProjectList();\r\n }\r\n }\r\n\r\n private handleKeyDownCopyProjectById(e: React.KeyboardEvent) {\r\n if (e.key === \"Enter\") {\r\n this.CopyProjectById();\r\n }\r\n }\r\n\r\n private async CopyProjectById() {\r\n this.setState({ copyProjectHasError: false });\r\n\r\n //strip all non-numeric characters from the user-entered projectId\r\n let projectIdNumeric = this.state.copyProjectId.replace(/\\D/g, \"\");\r\n\r\n //GraphDB projectId format\r\n let projectId = `proj-${projectIdNumeric}`;\r\n\r\n //Check if project exists\r\n const response = await getProject(projectId);\r\n\r\n if (response.hasError || response.projectList == null) {\r\n this.setState({ copyProjectHasError: true });\r\n return;\r\n }\r\n\r\n if (response.hasError == false && response.projectList.length > 0) {\r\n let project = response.projectList.find((x: any) => x.id == projectId);\r\n\r\n let copyRequest = { projectId: projectId, projectName: `Copy of ${project.projectName}(${projectIdNumeric})` };\r\n await copyProjectWithUnits(copyRequest);\r\n\r\n //wait for the copy method to finish, then update the project list\r\n getProjectList();\r\n } else {\r\n this.setState({ copyProjectHasError: true });\r\n }\r\n }\r\n\r\n private async clearFilter() {\r\n this.setState({ jobNameSearchText: \"\", jobIdSearchText: \"\" });\r\n //Filter has been cleared, so get all the projects.\r\n await getProjectList();\r\n }\r\n //Add new unit and go to config input screen.\r\n private async addNewUnitToJob() {\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n let response = await addNewUnit();\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (response.success === true) {\r\n //redirect to unit config input screen.\r\n this.props.history.push(\"/pid/\" + response.projectId + \"/uid/\" + response.newUnitId + \"/design/unittype\");\r\n }\r\n }\r\n //Display list of Units from state.\r\n private getUnitRows() {\r\n const selectedProject = this.props.reduxProjectManagement.selectedProject;\r\n\r\n const units = this.props.reduxProjectManagement.unitList;\r\n if (units) {\r\n return units.map((item: any, index: number) => );\r\n }\r\n return null;\r\n }\r\n //Check for user response to the delete-project modal or the addNewProject modal.\r\n async componentDidUpdate(prevProps: IProps, prevState: IState) {\r\n const modal = this.props.reduxModals;\r\n\r\n //If modal was open but is now closed, check what user's response was.\r\n if (prevProps.reduxModals.showModal !== modal.showModal && modal.showModal === false) {\r\n if (modal.modalId === \"delete-project\") {\r\n if (modal.userResponse === \"ok\") {\r\n deleteProject(modal.modalData.projectIdToDelete);\r\n }\r\n } else if (modal.modalId === \"delete-unit\") {\r\n if (modal.userResponse === \"ok\") {\r\n deleteUnitById(modal.modalData.unitToDelete);\r\n }\r\n } else if (modal.modalId === \"add-new-project\") {\r\n if (this.props.reduxProjectManagement.projectName !== \"\" && modal.userResponse === \"ok\") {\r\n AddNewProject();\r\n }\r\n } else if (modal.modalId === \"edit-project\") {\r\n if (this.props.reduxProjectManagement.projectName !== \"\" && modal.userResponse === \"ok\") {\r\n updateEditedProject();\r\n }\r\n } else if (modal.modalId === \"copy-unit\") {\r\n if (modal.userResponse.response === \"ok\") {\r\n copyUnitToProject(modal.userResponse);\r\n }\r\n } else if (modal.modalId === \"copy-project\") {\r\n if (modal.userResponse.response === \"ok\") {\r\n await copyProjectWithUnits(modal.userResponse);\r\n\r\n //wait for the copy method to finish, then update the project list\r\n getProjectList();\r\n }\r\n } else if (modal.modalId === \"transfer-project\") {\r\n if (this.props.reduxProjectManagement.selectedUserId != \"\" && modal.userResponse === \"ok\") {\r\n let response: any = await transferProject();\r\n\r\n if (response.data.hasError) {\r\n const notification = {\r\n id: \"transfer-project\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    {response.data.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n } else {\r\n const notification = {\r\n id: \"transfer-project\",\r\n notificationType: \"info\",\r\n title: \"Success\",\r\n content:
    Job transferred to: {response.data.newOwnerFirstName + \" \" + response.data.newOwnerLastName}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n //wait for the transfer method to finish, then update the project list\r\n getProjectList();\r\n }\r\n }\r\n resetReduxModals();\r\n }\r\n }\r\n\r\n saveStatusType(projectStatus: any) {\r\n //Set status selection, remove sorting by name and last modified date because we're getting a whole new list of projects.\r\n this.props.updateRedux(\"UPDATE_PROJECT_MANAGEMENT\", {\r\n projectStatusFilterBy: ProjectStatusFilterBy[projectStatus],\r\n projectNameSortBy: SortBy.None,\r\n projectLastModifiedSortBy: SortBy.None\r\n });\r\n this.setState({ showStatusDropdown: false });\r\n this.getProjectListByStatusAndName(projectStatus);\r\n }\r\n\r\n handleProjectStatusClick() {\r\n if (this.state.showStatusDropdown === false) {\r\n this.setState({ showStatusDropdown: true });\r\n } else {\r\n this.setState({ showStatusDropdown: false });\r\n }\r\n }\r\n\r\n public render() {\r\n const pj = this.props.reduxProjectManagement;\r\n const searchCount = pj.projectList?.length;\r\n const filteredStatusHide = this.state.jobNameSearchText === \"\" ? \"app-visibility-hidden\" : \"\";\r\n const projectNameUpArrowColor = pj.projectNameSortBy == SortBy.ASC ? \"yellow\" : \"white\";\r\n const projectNameDownArrowColor = pj.projectNameSortBy == SortBy.DESC ? \"yellow\" : \"white\";\r\n const projectLastUpdateUpArrowColor = pj.projectLastModifiedSortBy == SortBy.ASC ? \"yellow\" : \"white\";\r\n const projectLastUpdateDownArrowColor = pj.projectLastModifiedSortBy == SortBy.DESC ? \"yellow\" : \"white\";\r\n const statusDropdown = this.state.showStatusDropdown === false ? \"project-hide\" : \"\";\r\n return (\r\n
    \r\n
    \r\n {/* ---------- Project status search, dropdown and New Project input ----------- */}\r\n
    \r\n Job Search:\r\n this.setState({ jobNameSearchText: event.currentTarget.value })}\r\n onKeyDown={(event) => this.handleKeyDown(event)}\r\n />\r\n
    this.runSearchByJobName()}>\r\n
    \r\n
    \r\n {/* ---------- Copy Job by ID----------- Only shows for employee role ------ */}\r\n {this.state.hasEmployeeRole ? (\r\n
    \r\n Copy Job By ID:\r\n\r\n this.setState({ copyProjectId: event.currentTarget.value })}\r\n onKeyDown={(event) => this.handleKeyDownCopyProjectById(event)}\r\n />\r\n
    this.CopyProjectById()}>\r\n
    Copy
    \r\n
    \r\n {this.state.copyProjectHasError ?
    Job not found
    : null}\r\n
    \r\n ) : (\r\n
    \r\n )}\r\n
    \r\n\r\n {/* ==================== Projects List ============================= */}\r\n
    \r\n
    \r\n {\"Search Results (\" + searchCount + \")\"}\r\n
    \r\n
    this.clearFilter()}>\r\n Clear Search{\" \"}\r\n
    \r\n\r\n
    \r\n
    openProjectModal()}>\r\n + Add New Job\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n Job Name\r\n sortByJobName(SortBy.ASC)}\r\n >\r\n sortByJobName(SortBy.DESC)}\r\n >\r\n
    \r\n {/* Hidden Status Dropdown */}\r\n this.saveStatusType(event.currentTarget.value)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {/* End Hidden Status Dropdown */}\r\n
    \r\n Job Status\r\n this.handleProjectStatusClick()}>\r\n
    \r\n
    \r\n Last Modified\r\n sortByLastModified(SortBy.ASC)}\r\n >\r\n sortByLastModified(SortBy.DESC)}\r\n >\r\n
    \r\n
    \r\n\r\n {getProjectRows()}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n {/* ===================== Units List ===================================== */}\r\n {this.props.reduxProjectManagement.selectedProject ? (\r\n
    \r\n
    \r\n
    \r\n
    {pj.selectedProject ? \"Job Name: \" + pj.selectedProject.projectName : \"\"}
    \r\n
    {pj.selectedProject?.jobStatus ? \"Job Status: \" + pj.selectedProject.jobStatus : \"\"}
    \r\n
    {pj.selectedProject ? \"Created \" + sqlToJsDate(pj.selectedProject.createDate) : \"\"}
    \r\n
    this.addNewUnitToJob()}>\r\n + Add New Unit\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Unit Tag
    \r\n
    Unit Model#
    \r\n
    List Price
    \r\n
    Unit Qty
    \r\n
    \r\n
    \r\n\r\n
    {this.getUnitRows()}
    \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals,\r\n reduxProjectManagement: state.reduxProjectManagement\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ProjectManagement);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, match } from 'react-router-dom'; //needed for 'location' object and 'match.params'\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { Link } from 'react-router-dom';\r\nimport '../../css/DesignSubMenu.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n location: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass SpecSubMenu extends React.Component {\r\n private createMenuLink(urlFragment: string, label: string) {\r\n //Make this the active(underlined) link if it matches the current route\r\n const isActive = this.isCurrentRoute(urlFragment);\r\n const baseUrl = this.getBaseUrl();\r\n return (\r\n \r\n
    {label}
    \r\n \r\n );\r\n }\r\n\r\n private isCurrentRoute(urlFragment: string) {\r\n return this.props.location.pathname.includes(urlFragment);\r\n }\r\n private getBaseUrl() {\r\n const routeParams = this.props.match.params;\r\n return '/pid/' + routeParams.projectId + '/uid/' + routeParams.unitId;\r\n }\r\n private getNextButton() {\r\n let destination = '';\r\n if (this.isCurrentRoute('/spec/controls')) {\r\n destination = '/spec/electrical';\r\n }\r\n if (this.isCurrentRoute('/spec/electrical')) {\r\n destination = '/spec/construction';\r\n }\r\n if (this.isCurrentRoute('/spec/construction')) {\r\n destination = '/spec/cabinet';\r\n }\r\n if (this.isCurrentRoute('/spec/cabinet')) {\r\n destination = '/spec/warranties';\r\n }\r\n if (this.isCurrentRoute('/spec/warranties')) {\r\n destination = '/spec/warranties';\r\n }\r\n const baseUrl = this.getBaseUrl();\r\n let nextBtnClass = this.isCurrentRoute('/spec/warranties') ? \"design-next-hide\" : \"design-next-btn\";\r\n return (\r\n \r\n
    Next >
    \r\n \r\n );\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n {this.createMenuLink('/spec/controls', 'Controls')}\r\n {this.createMenuLink('/spec/electrical', 'Electrical')}\r\n {this.createMenuLink('/spec/construction', 'Component Construction')}\r\n {this.createMenuLink('/spec/cabinet', 'Unit Cabinet')}\r\n {this.createMenuLink('/spec/warranties', 'Warranties')}\r\n {this.getNextButton()}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SpecSubMenu));\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport AccordionHeader from \"../Shared/AccordionHeader\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getBMSInputValues, updateInputField } from \"../../api-calls/readApiService\";\r\nimport {getValidationError, getChecked, getInputCSS, getFilteredValidationErrors, getNewValidationErrorsList} from \"../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../utilities/helpers\";\r\nimport \"../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n reduxMenus: any;\r\n updateRedux: any;\r\n }\r\n // local state\r\n interface IState {\r\n componentData: any;\r\n userInputs: any;\r\n bmsDisplayFields: any;\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n openPointsAccordion: boolean;\r\n }\r\n\r\nclass BMSSetPoints extends React.Component {\r\n public state: IState = {\r\n componentData: null,\r\n userInputs: null,\r\n bmsDisplayFields: null,\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n openPointsAccordion: false\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await getBMSInputValues(projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"bmsPointsInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetBMSInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (!isEmptyObject(result.uiDataContainer)) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.controlsInputs,\r\n bmsDisplayFields: result.uiDataContainer.bmsDisplayFields,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n\r\n }\r\n async componentDidUpdate(prevProps:any){\r\n //When an input on the controls page changes and it affects what is shown as far as setpoints and additional BMS points\r\n //we need to close the setpoints accordian so that when they re-open it, it can go to the database and refresh it's values\r\n //and display fields. closeSetPointsAccordian is set to true on the details and inclusion pages for any input that affects\r\n //set points and if it's true here, we close the accordian.\r\n if (prevProps.reduxMenus.closeSetPointsAccordian !== this.props.reduxMenus.closeSetPointsAccordian && this.props.reduxMenus.closeSetPointsAccordian === true && \r\n this.state.openPointsAccordion === true) {\r\n this.togglePointsPanel();\r\n this.props.updateRedux('UPDATE_MENUS', {closeSetPointsAccordian : false});\r\n console.log(\"Open Accordian\");\r\n }\r\n else if (prevProps.reduxMenus.closeSetPointsAccordian !== this.props.reduxMenus.closeSetPointsAccordian && this.props.reduxMenus.closeSetPointsAccordian === true) {\r\n this.props.updateRedux('UPDATE_MENUS', {closeSetPointsAccordian : false});\r\n }\r\n //The \"ProvidedByAndInstalledBy\" field is special because it toggles whether or not the setpoints accordian shows or not.\r\n //On the inclusion page for this control, if a user changes the value then we know that we need to save to the database\r\n //and get new values and display fields for setpoints. The display field \"show_any\" determines whether to show or hide\r\n //the setpoints accordian. \"Provided by Others and Installed by Others\" means we hide the setpoints accordian.\r\n if (prevProps.reduxMenus.providedAndInstalledByChanged !== this.props.reduxMenus.providedAndInstalledByChanged && \r\n this.props.reduxMenus.providedAndInstalledByChanged === true) {\r\n const { projectId, unitId } = this.props.match.params;\r\n //Get updated BMS values and display fields.\r\n const result = await getBMSInputValues(projectId, unitId);\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"BMSPointsInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetBMSInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n this.setState({\r\n userInputs: result.uiDataContainer.controlsInputs,\r\n bmsDisplayFields: result.uiDataContainer.bmsDisplayFields,\r\n validationErrors: result.validationErrors\r\n });\r\n this.props.updateRedux('UPDATE_MENUS', {providedAndInstalledByChanged : false}); \r\n }\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n \r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n \r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n //Store current value to compare to new value after update. \r\n\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateBMSControls\", projectId, unitId, fieldName, newValue, \"ControlsInputs\");\r\n \r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n \r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.controlsInputs,\r\n bmsDisplayFields: result.data.uiDataContainer.bmsDisplayFields\r\n });\r\n }\r\n }\r\n }\r\n \r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n \r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n \r\n public getValidationError(fieldName: string, isSetPoint: boolean) {\r\n //Call the validation method from pageUtils\r\n let validationClass = isSetPoint ? \"validation-err-bms\" : \"validation-err-right\";\r\n return getValidationError(this.state.validationErrors, fieldName, validationClass);\r\n }\r\n \r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n private async togglePointsPanel(){\r\n if (this.state.openPointsAccordion === false) {//If the panel was clicked and is about to open.\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await getBMSInputValues(projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n if (!isEmptyObject(result.uiDataContainer)) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.controlsInputs,\r\n bmsDisplayFields: result.uiDataContainer.bmsDisplayFields,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n this.setState({openPointsAccordion: !this.state.openPointsAccordion});\r\n \r\n }\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const bmsDisplayFields = this.state.bmsDisplayFields;\r\n const systemPointsActive = this.state.openPointsAccordion;\r\n const spReturnDehumControlDewDisplayName = bmsDisplayFields && bmsDisplayFields.isPoolUnit ? \"Dehumidification Set Point - Return Dew Point (°F)\" : \"Occupied Dehumidification Activation Set Point - Return Dew Point (°F)\";\r\n const spSpaceUnOccupiedDehumControlDisplayName= bmsDisplayFields && bmsDisplayFields.isPoolUnit ? \"Dehumidification Set Point - Space RH (%)\" : \"Occupied Dehumidification Activation Set Point - Space RH (%)\";\r\n\r\n if (!savedValues || !bmsDisplayFields || !bmsDisplayFields.show_Any) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.togglePointsPanel()}\r\n />\r\n
    \r\n
    \r\n
    \r\n \r\n
    Set Points
    \r\n \r\n
    \r\n\r\n {bmsDisplayFields.show_SpSupplyTemp ? (\r\n
    \r\n
    Occupied Supply Temp Set Point (°F)
    \r\n this.updateTextboxValue('spSupplyTemp', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSupplyTemp', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSupplyTemp', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccSupplyTemp ? (\r\n
    \r\n
    Unoccupied Supply Temp Set Point (°F)
    \r\n this.updateTextboxValue('spUnoccSupplyTemp', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spUnoccSupplyTemp', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccSupplyTemp', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpActiveReturnTempCooling ? (\r\n
    \r\n
    Occupied Return Temp Cooling Set Point (°F)
    \r\n this.updateTextboxValue('spActiveReturnTempCooling', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spActiveReturnTempCooling', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spActiveReturnTempCooling', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpActiveReturnTempHeating ? (\r\n
    \r\n
    Occupied Return Temp Heating Set Point (°F)
    \r\n this.updateTextboxValue('spActiveReturnTempHeating', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spActiveReturnTempHeating', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spActiveReturnTempHeating', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccupiedReturnTempCoolingF ? (\r\n
    \r\n
    Unoccupied Return Temp Cooling Set Point (°F)
    \r\n this.updateTextboxValue('spUnoccupiedReturnTempCoolingF', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spUnoccupiedReturnTempCoolingF', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccupiedReturnTempCoolingF', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccupiedReturnTempHeatingF ? (\r\n
    \r\n
    Unoccupied Return Temp Heating Set Point (°F)
    \r\n this.updateTextboxValue('spUnoccupiedReturnTempHeatingF', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spUnoccupiedReturnTempHeatingF', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccupiedReturnTempHeatingF', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpActiveSpaceTempCooling ? (\r\n
    \r\n
    Occupied Space Temp Cooling Set Point (°F)
    \r\n this.updateTextboxValue('spActiveSpaceTempCooling', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spActiveSpaceTempCooling', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spActiveSpaceTempCooling', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpActiveSpaceTempHeating ? (\r\n
    \r\n
    Occupied Space Temp Heating Set Point (°F)
    \r\n this.updateTextboxValue('spActiveSpaceTempHeating', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spActiveSpaceTempHeating', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spActiveSpaceTempHeating', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccCool ? (\r\n
    \r\n
    Unoccupied Space Temp Cooling Set Point (°F)
    \r\n this.updateTextboxValue('spUnoccCool', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spUnoccCool', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccCool', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccHeat ? (\r\n
    \r\n
    Unoccupied Space Temp Heating Set Point (°F)
    \r\n this.updateTextboxValue('spUnoccHeat', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spUnoccHeat', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccHeat', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpOutsideResetMinOat ? (\r\n
    \r\n
    Outside Air Reset Min OAT (°F)
    \r\n this.updateTextboxValue('spOutsideResetMinOat', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spOutsideResetMinOat', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spOutsideResetMinOat', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpOutsideResetMaxOat ? (\r\n
    \r\n
    Outside Air Reset Max OAT (°F)
    \r\n this.updateTextboxValue('spOutsideResetMaxOat', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spOutsideResetMaxOat', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spOutsideResetMaxOat', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpOutsideResetMinLat ? (\r\n
    \r\n
    Outside Air Reset Min LAT (°F)
    \r\n this.updateTextboxValue('spOutsideResetMinLat', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spOutsideResetMinLat', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spOutsideResetMinLat', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpOutsideResetMaxLat ? (\r\n
    \r\n
    Outside Air Reset Max LAT (°F)
    \r\n this.updateTextboxValue('spOutsideResetMaxLat', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spOutsideResetMaxLat', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spOutsideResetMaxLat', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpMaxSFTurndown ? (\r\n
    \r\n
    Min Supply Fan Airflow (%)
    \r\n this.updateTextboxValue('spMaxSFTurndown', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spMaxSFTurndown', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spMaxSFTurndown', true)}\r\n
    \r\n ) : null}\r\n\r\n\r\n {bmsDisplayFields.show_SpOccupiedSupplyFanSpeed ? (\r\n
    \r\n
    Occupied Supply Fan Speed (%)
    \r\n this.updateTextboxValue('spOccupiedSupplyFanSpeed', event.currentTarget.value)}\r\n //onBlur={(event) => this.saveTextboxValue('spOccupiedSupplyFanSpeed', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spOccupiedSupplyFanSpeed', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccupiedSupplyFanSpeed ? (\r\n
    \r\n
    Unoccupied Supply Fan Speed (%)
    \r\n this.updateTextboxValue('spUnoccupiedSupplyFanSpeed', event.currentTarget.value)}\r\n //onBlur={(event) => this.saveTextboxValue('spUnoccupiedSupplyFanSpeed', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccupiedSupplyFanSpeed', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpDehumCoilLeaving ? (\r\n
    \r\n
    Dehumidification Coil Leaving Set Point (°F)
    \r\n this.updateTextboxValue('spDehumCoilLeaving', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spDehumCoilLeaving', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spDehumCoilLeaving', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpHeatMin ? (\r\n
    \r\n
    Supply Min Heating Set Point (°F)
    \r\n this.updateTextboxValue('spHeatMin', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spHeatMin', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spHeatMin', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpHeatMax ? (\r\n
    \r\n
    Supply Max Heating Set Point (°F)
    \r\n this.updateTextboxValue('spHeatMax', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spHeatMax', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spHeatMax', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpCoolMin ? (\r\n
    \r\n
    Supply Min Cooling Set Point (°F)
    \r\n this.updateTextboxValue('spCoolMin', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spCoolMin', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spCoolMin', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpCoolMax ? (\r\n
    \r\n
    Supply Max Cooling Set Point (°F)
    \r\n this.updateTextboxValue('spCoolMax', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spCoolMax', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spCoolMax', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpDefrost ? (\r\n
    \r\n
    HX Defrost Set Point (°F)
    \r\n this.updateTextboxValue('spDefrost', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spDefrost', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spDefrost', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpEconomizerActivationDegree ? (\r\n
    \r\n
    Economizer Activation Set Point (°F)
    \r\n this.updateTextboxValue('spEconomizerActivationDegree', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spEconomizerActivationDegree', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spEconomizerActivationDegree', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpEconomizerActivationBtu ? (\r\n
    \r\n
    Economizer Activation Set Point (BTU/lb)
    \r\n this.updateTextboxValue('spEconomizerActivationBtu', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spEconomizerActivationBtu', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spEconomizerActivationBtu', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpPreheat ? (\r\n
    \r\n
    Preheating Set Point (°F)
    \r\n this.updateTextboxValue('spPreheat', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spPreheat', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spPreheat', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSupplyWheelDifferential ? (\r\n
    \r\n
    Wheel Differential Supply Pressure Set Point (\"W.C.)
    \r\n this.updateTextboxValue('spSupplyWheelDifferential', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSupplyWheelDifferential', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSupplyWheelDifferential', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpExhaustWheelDifferential ? (\r\n
    \r\n
    Wheel Differential Exhaust Pressure Set Point (\"W.C.)
    \r\n this.updateTextboxValue('spExhaustWheelDifferential', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spExhaustWheelDifferential', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spExhaustWheelDifferential', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpPreheatLockout ? (\r\n
    \r\n
    Preheating System Lockout OAT (°F)
    \r\n this.updateTextboxValue('spPreheatLockout', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spPreheatLockout', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spPreheatLockout', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpHeatingLockout ? (\r\n
    \r\n
    Heating System Lockout OAT (°F)
    \r\n this.updateTextboxValue('spHeatingLockout', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spHeatingLockout', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spHeatingLockout', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpCoolLockout ? (\r\n
    \r\n
    Cooling System Lockout OAT (°F)
    \r\n this.updateTextboxValue('spCoolLockout', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spCoolLockout', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spCoolLockout', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpReturnDehumControlDew ? (\r\n
    \r\n
    {spReturnDehumControlDewDisplayName}
    \r\n this.updateTextboxValue('spReturnDehumControlDew', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spReturnDehumControlDew', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spReturnDehumControlDew', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpReturnDehumControlHumidity ? (\r\n
    \r\n
    Occupied Dehumidification Activation Set Point - Return RH (%)
    \r\n this.updateTextboxValue('spReturnDehumControlHumidity', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spReturnDehumControlHumidity', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spReturnDehumControlHumidity', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpOutsideDehumControlDew ? (\r\n
    \r\n
    Occupied Dehumidification Activation Set Point - Outside Air Dew Point (°F)
    \r\n this.updateTextboxValue('spOutsideDehumControlDew', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spOutsideDehumControlDew', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spOutsideDehumControlDew', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSpaceDehumControlDew ? (\r\n
    \r\n
    Occupied Dehumidification Activation Set Point - Space Dew Point (°F)
    \r\n this.updateTextboxValue('spSpaceDehumControlDew', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSpaceDehumControlDew', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSpaceDehumControlDew', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSpaceUnoccupiedDehumControlHumidity ? (\r\n
    \r\n
    {spSpaceUnOccupiedDehumControlDisplayName}
    \r\n this.updateTextboxValue('spSpaceUnoccupiedDehumControlHumidity', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSpaceUnoccupiedDehumControlHumidity', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSpaceUnoccupiedDehumControlHumidity', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpDehumidCoilLeavingMinSetPt ? (\r\n
    \r\n
    Dehumidification Coil Leaving Minimum Set Point (°F)
    \r\n this.updateTextboxValue('spDehumidCoilLeavingMinSetPt', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spDehumidCoilLeavingMinSetPt', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spDehumidCoilLeavingMinSetPt', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpPoolSpaceStaticPressureVsAdjSpace ? (\r\n
    \r\n
    Pool Space Static Pressure vs Adjacent Space Set Point (\"W.C.)
    \r\n this.updateTextboxValue('spPoolSpaceStaticPressureVsAdjSpace', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spPoolSpaceStaticPressureVsAdjSpace', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spPoolSpaceStaticPressureVsAdjSpace', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpPoolSpaceStaticPressureVsOutdoor ? (\r\n
    \r\n
    Pool Space Static Pressure vs Outdoor Set Point (\"W.C.)
    \r\n this.updateTextboxValue('spPoolSpaceStaticPressureVsOutdoor', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spPoolSpaceStaticPressureVsOutdoor', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spPoolSpaceStaticPressureVsOutdoor', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpMinOaControlCfm ? (\r\n
    \r\n
    Minimum Outside Air Set Point (CFM)
    \r\n this.updateTextboxValue('spMinOaControlCfm', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spMinOaControlCfm', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spMinOaControlCfm', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpMaxOaControlCfm ? (\r\n
    \r\n
    Maximum Outside Air Set Point (CFM)
    \r\n \r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSupplyCfm ? (\r\n
    \r\n
    Supply Fan Air Flow Set Point(CFM)
    \r\n \r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpMinOaControlAirflow ? (\r\n
    \r\n
    Minimum Outside Air Set Point (%)
    \r\n this.updateTextboxValue('spMinOaControlAirflow', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spMinOaControlAirflow', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spMinOaControlAirflow', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSupplyFanControlCfm ? (\r\n
    \r\n
    Airflow Set Point - Supply Fan (CFM)
    \r\n this.updateTextboxValue('spSupplyFanControlCfm', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSupplyFanControlCfm', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSupplyFanControlCfm', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpExhaustReliefFanSpace ? (\r\n
    \r\n
    Space Static Pressure Set Point - Exhaust Fan (\"W.C.)
    \r\n this.updateTextboxValue('spExhaustReliefFanSpace', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spExhaustReliefFanSpace', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spExhaustReliefFanSpace', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpExhaustReliefFanCfm ? (\r\n
    \r\n
    Airflow Set Point - Exhaust Fan (CFM)
    \r\n this.updateTextboxValue('spExhaustReliefFanCfm', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spExhaustReliefFanCfm', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spExhaustReliefFanCfm', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpReturnReliefFanCfm ? (\r\n
    \r\n
    Airflow Set Point - Return Fan (CFM)
    \r\n this.updateTextboxValue('spReturnReliefFanCfm', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spReturnReliefFanCfm', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spReturnReliefFanCfm', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpTrackSupplyFanOffsetReturnFanCFM ? (\r\n
    \r\n
    Track Supply Fan Offset Set Point - Return Fan (CFM)
    \r\n this.updateTextboxValue('spTrackSupplyFanOffsetReturnFanCFM', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spTrackSupplyFanOffsetReturnFanCFM', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spTrackSupplyFanOffsetReturnFanCFM', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpTrackSupplyFanOffsetExhaustFanCfm ? (\r\n
    \r\n
    Track Supply Fan Offset Set Point - Exhaust Fan (CFM)
    \r\n this.updateTextboxValue('spTrackSupplyFanOffsetExhaustFanCfm', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spTrackSupplyFanOffsetExhaustFanCfm', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spTrackSupplyFanOffsetExhaustFanCfm', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpExhaustOaOffset ? (\r\n
    \r\n
    Exhaust/Outside Air Offset (CFM)
    \r\n this.updateTextboxValue('spExhaustOaOffset', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spExhaustOaOffset', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spExhaustOaOffset', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpCO2 ? (\r\n
    \r\n
    CO₂ Set Point (PPM)
    \r\n this.updateTextboxValue('spCO2', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spCO2', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spCO2', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpCo2oaAirflow ? (\r\n
    \r\n
    CO₂ OA Min Airflow (%)
    \r\n this.updateTextboxValue('spCo2oaAirflow', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spCo2oaAirflow', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spCo2oaAirflow', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpHighDuctNum ? (\r\n
    \r\n
    High Supply Duct Static Pressure (\"W.C.)
    \r\n this.updateTextboxValue('spHighDuctNum', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spHighDuctNum', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spHighDuctNum', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpLowDuctNum ? (\r\n
    \r\n
    Low Return Duct Static Pressure (\"W.C.)
    \r\n this.updateTextboxValue('spLowDuctNum', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spLowDuctNum', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spLowDuctNum', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSupplyFanControlDuct ? (\r\n
    \r\n
    Duct Static Pressure Set Point - Supply Fan (\"W.C.)
    \r\n this.updateTextboxValue('spSupplyFanControlDuct', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSupplyFanControlDuct', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSupplyFanControlDuct', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpReturnReliefFanDuct ? (\r\n
    \r\n
    Duct Static Pressure Set Point - Return Fan (\"W.C.)
    \r\n this.updateTextboxValue('spReturnReliefFanDuct', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spReturnReliefFanDuct', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spReturnReliefFanDuct', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpReturnReliefFanSpace ? (\r\n
    \r\n
    Space Static Pressure - Return Fan (\"W.C.)
    \r\n this.updateTextboxValue('spReturnReliefFanSpace', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spReturnReliefFanSpace', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spReturnReliefFanSpace', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpExhaustReliefFanDuct ? (\r\n
    \r\n
    Duct Static Pressure Set Point - Exhaust Fan (\"W.C.)
    \r\n this.updateTextboxValue('spExhaustReliefFanDuct', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spExhaustReliefFanDuct', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spExhaustReliefFanDuct', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpFreezestatNum ? (\r\n
    \r\n
    Freezestat Set Point (°F)
    \r\n this.updateTextboxValue('spFreezestatNum', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spFreezestatNum', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spFreezestatNum', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpHumidLockout ? (\r\n
    \r\n
    Humidification System Lockout OAT (°F)
    \r\n this.updateTextboxValue('spHumidLockout', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spHumidLockout', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spHumidLockout', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpHumid ? (\r\n
    \r\n
    Supply Humidification High Limit (%RH)
    \r\n this.updateTextboxValue('spHumid', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spHumid', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spHumid', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpReturnHumidRh ? (\r\n
    \r\n
    Return Humidification (%RH)
    \r\n this.updateTextboxValue('spReturnHumidRh', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spReturnHumidRh', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spReturnHumidRh', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpSpaceHumidRh ? (\r\n
    \r\n
    Space Humidification (%RH)
    \r\n this.updateTextboxValue('spSpaceHumidRh', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spSpaceHumidRh', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spSpaceHumidRh', true)}\r\n
    \r\n ) : null}\r\n\r\n {bmsDisplayFields.show_SpUnoccHumid ? (\r\n
    \r\n
    Unoccupied Space Temperature Humidification\t (%RH)
    \r\n this.updateTextboxValue('spUnoccHumid', event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue('spUnoccHumid', event.currentTarget.value)}\r\n />\r\n {this.getValidationError('spUnoccHumid', true)}\r\n
    \r\n ) : null}\r\n\r\n
    \r\n\r\n
    \r\n {/* Additional BMS Points */}\r\n
    Additional BMS Points
    \r\n
    \r\n\r\n {bmsDisplayFields.show_AddHardWiredInput ? (\r\n
    \r\n
    Hard Wired Occupancy Input
    \r\n
    \r\n this.saveInputValue('addHardWiredInput', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSupplyAirHumidity ? (\r\n
    \r\n
    Supply Air Humidity
    \r\n
    \r\n this.saveInputValue('addSupplyAirHumidity', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddOutsideAirHumidity ? (\r\n
    \r\n
    Outside Air Humidity
    \r\n
    \r\n this.saveInputValue('addOutsideAirHumidity', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddReturnAirTemp ? (\r\n
    \r\n
    Return Air Temperature
    \r\n
    \r\n this.saveInputValue('addReturnAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddReturnAirHumidity ? (\r\n
    \r\n
    Return Air Humidity
    \r\n
    \r\n this.saveInputValue('addReturnAirHumidity', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddExhaustAirTemp ? (\r\n
    \r\n
    Exhaust Air Temperature
    \r\n
    \r\n this.saveInputValue('addExhaustAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddExhaustAirHumidity ? (\r\n
    \r\n
    Exhaust Air Humidity
    \r\n
    \r\n this.saveInputValue('addExhaustAirHumidity', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSpaceAirTemp ? (\r\n
    \r\n
    Space Air Temperature
    \r\n
    \r\n this.saveInputValue('addSpaceAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSpaceAirHumidity ? (\r\n
    \r\n
    Space Air Humidity
    \r\n
    \r\n this.saveInputValue('addSpaceAirHumidity', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddMixedAirTemp ? (\r\n
    \r\n
    Mixed Air Temperature
    \r\n
    \r\n this.saveInputValue('addMixedAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddMixedAirHumidity ? (\r\n
    \r\n
    Mixed Air Humidity
    \r\n
    \r\n this.saveInputValue('addMixedAirHumidity', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddCoolingEnteringAirTemp ? (\r\n
    \r\n
    Cooling Coil Entering Air Temperature
    \r\n
    \r\n this.saveInputValue('addCoolingEnteringAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddCoolingLeavingAirTemp ? (\r\n
    \r\n
    Cooling Coil Leaving Air Temperature
    \r\n
    \r\n this.saveInputValue('addCoolingLeavingAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHeatingEnteringAirTemp ? (\r\n
    \r\n
    Heating Coil Entering Air Temperature
    \r\n
    \r\n this.saveInputValue('addHeatingEnteringAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHeatingLeavingAirTemp ? (\r\n
    \r\n
    Heating Coil Leaving Air Temperature
    \r\n
    \r\n this.saveInputValue('addHeatingLeavingAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddPreheatingEnteringAirTemp ? (\r\n
    \r\n
    Pre-Heating Coil Entering Air Temperature
    \r\n
    \r\n this.saveInputValue('addPreheatingEnteringAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSupplyCfm ? (\r\n
    \r\n
    Supply CFM
    \r\n
    \r\n this.saveInputValue('addSupplyCfm', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddExhaustCfm ? (\r\n
    \r\n
    Exhaust CFM
    \r\n
    \r\n this.saveInputValue('addExhaustCfm', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddReturnCfm ? (\r\n
    \r\n
    Return CFM
    \r\n
    \r\n this.saveInputValue('addReturnCfm', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddOutsideAirCfm ? (\r\n
    \r\n
    Outside Air CFM
    \r\n
    \r\n this.saveInputValue('addOutsideAirCfm', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHxenteringOutsideAirTemp ? (\r\n
    \r\n
    Entering Outside Air Temperature
    \r\n
    \r\n this.saveInputValue('addHxenteringOutsideAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHxleavingSupplyAirTemp ? (\r\n
    \r\n
    Leaving Supply Air Temperature
    \r\n
    \r\n this.saveInputValue('addHxleavingSupplyAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHxenteringExhaustAirTemp ? (\r\n
    \r\n
    Entering Exhaust Air Temperature
    \r\n
    \r\n this.saveInputValue('addHxenteringExhaustAirTemp', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHxsupplyDifferentialPressure ? (\r\n
    \r\n
    Supply Differential Pressure
    \r\n
    \r\n this.saveInputValue('addHxsupplyDifferentialPressure', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHxexhaustDifferentialPressure ? (\r\n
    \r\n
    Exhaust Differential Pressure
    \r\n
    \r\n this.saveInputValue('addHxexhaustDifferentialPressure', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSupplyDuctStaticPressure ? (\r\n
    \r\n
    Supply Duct Static Pressure
    \r\n
    \r\n this.saveInputValue('addSupplyDuctStaticPressure', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddReturnDuctStaticPressure ? (\r\n
    \r\n
    Return Duct Static Pressure
    \r\n
    \r\n this.saveInputValue('addReturnDuctStaticPressure', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddExhaustDuctStaticPressure ? (\r\n
    \r\n
    Exhaust Duct Static Pressure
    \r\n
    \r\n this.saveInputValue('addExhaustDuctStaticPressure', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSpaceStaticPressure ? (\r\n
    \r\n
    Space Static Pressure
    \r\n
    \r\n this.saveInputValue('addSpaceStaticPressure', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {/* {bmsDisplayFields.show_DirtyFilterSwitch ? (\r\n
    \r\n
    Dirty Filter Switch
    \r\n
    \r\n this.saveInputValue('dirtyFilterSwitch', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null } */}\r\n\r\n {bmsDisplayFields.show_AddFilterPressureAnalogInput ? (\r\n
    \r\n
    Dirty Filter Switch
    \r\n
    \r\n this.saveInputValue('addFilterPressureAnalogInput', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddFilterPressureTransducer ? (\r\n
    \r\n
    Filter Pressure Transducer
    \r\n
    \r\n this.saveInputValue('addFilterPressureTransducer', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddSpaceCo2 ? (\r\n
    \r\n
    Space CO₂
    \r\n
    \r\n this.saveInputValue('addSpaceCo2', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddReturnCo2 ? (\r\n
    \r\n
    Return CO₂
    \r\n
    \r\n this.saveInputValue('addReturnCo2', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddDrainCondensate ? (\r\n
    \r\n
    Drain Condensate
    \r\n
    \r\n this.saveInputValue('addDrainCondensate', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHeatWheelRotationDetection ? (\r\n
    \r\n
    Enthalpy Wheel Rotation Detection
    \r\n
    \r\n this.saveInputValue('addHeatWheelRotationDetection', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddFreezestat ? (\r\n
    \r\n
    Freezestat
    \r\n
    \r\n this.saveInputValue('addFreezestat', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddHighSupplyDuctStatic ? (\r\n
    \r\n
    High Supply Duct Static
    \r\n
    \r\n this.saveInputValue('addHighSupplyDuctStatic', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n {bmsDisplayFields.show_AddLowReturnDuctStatic ? (\r\n
    \r\n
    Low Return Duct Static
    \r\n
    \r\n this.saveInputValue('addLowReturnDuctStatic', event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null }\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(BMSSetPoints);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport AccordionHeader from \"../Shared/AccordionHeader\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getControlsInputValues, updateInputField } from \"../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport BMSPoints from \"./BMSPoints\";\r\nimport { isEmptyObject } from \"../../utilities/helpers\";\r\nimport \"../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n }\r\n // local state\r\n interface IState {\r\n componentData: any;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n oaDamperConstructionWarningShown:boolean;\r\n prevIncludeOutsideAirInletAirflowMonitoring:boolean;\r\n openSystemInputsAccordion: boolean;\r\n openSystemOptionsAccordion: boolean;\r\n }\r\n\r\nclass Controls extends React.Component {\r\n public state: IState = {\r\n componentData: null,//may not need.\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\",\r\n oaDamperConstructionWarningShown:false,\r\n prevIncludeOutsideAirInletAirflowMonitoring:false,\r\n openSystemInputsAccordion:true,\r\n openSystemOptionsAccordion:true,\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await getControlsInputValues(projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"controlsInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetControlsInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n \r\n if (!isEmptyObject(result.uiDataContainer)) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.controlsInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n componentWillUnmount() {\r\n removeNotification('outsideAirDamperConstruction');\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n \r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n \r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n this.props.updateRedux('UPDATE_MENUS', {closeSetPointsAccordian : true});\r\n //Store current value to compare to new value after update. \r\n this.setState({\"prevIncludeOutsideAirInletAirflowMonitoring\": this.state.userInputs.includeOutsideAirInletAirflowMonitoring});\r\n\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateControls\", projectId, unitId, fieldName, newValue, \"ControlsInputs\");\r\n \r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n \r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.controlsInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n //Notify the setpoints page that controlsInclusion has changed and that we'll need to either hide or show\r\n //the setpoints accordian.\r\n if (fieldName === 'controlsInclusion'){\r\n this.props.updateRedux('UPDATE_MENUS', {providedAndInstalledByChanged : true});\r\n }\r\n //Check the previous value of includeOutsideAirInletAirflowMonitoring to it's current value.\r\n //Show warning message if they're different.\r\n if (!this.state.oaDamperConstructionWarningShown && this.state.userInputs.includeOutsideAirInletAirflowMonitoring !== this.state.prevIncludeOutsideAirInletAirflowMonitoring){\r\n let warning =\r\n \"A change in airflow monitoring for OA Inlet will change the options for OA damper construction. Check the OA Damper construction for available options.\";\r\n const notification = {\r\n id: \"outsideAirDamperConstruction\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
    {warning}
    \r\n };\r\n addNotification(notification);\r\n this.setState({ oaDamperConstructionWarningShown: true });\r\n }\r\n }\r\n }\r\n \r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n \r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n \r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n \r\n public getValidationError(fieldName: string, isSetPoint: boolean) {\r\n //Call the validation method from pageUtils\r\n let validationClass = isSetPoint ? \"validation-err-bms\" : \"validation-err-right\";\r\n return getValidationError(this.state.validationErrors, fieldName, validationClass);\r\n }\r\n \r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n private toggleSystemInputPanel(){\r\n this.setState({ openSystemInputsAccordion: !this.state.openSystemInputsAccordion }); //toggle to opposite of current state\r\n }\r\n private toggleSystemOptionsPanel(){\r\n this.setState({ openSystemOptionsAccordion: !this.state.openSystemOptionsAccordion }); //toggle to opposite of current state\r\n }\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n const systemInputsActive = this.state.openSystemInputsAccordion;\r\n const systemOptionsActive = this.state.openSystemOptionsAccordion;\r\n //displayFields.DehumidificationControlDisabled is true only in case of pool unit\r\n \r\n const dehumidControlDisplayName = displayFields && displayFields.isPoolUnit ? \"Dehumidification Activation\" : \"Occupied Dehumidification Activation\";\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n this.toggleSystemInputPanel()}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Controls Provided By
    \r\n
    \r\n this.saveInputValue(\"controlsInclusion\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"controlsInclusionOptions\")}\r\n \r\n {this.getValidationError(\"controlsInclusion\", false)}\r\n
    \r\n\r\n
    \r\n
    Damper Actuators Provided By
    \r\n
    \r\n this.saveInputValue(\"damperActuatorsInclusion\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"damperActuatorsInclusionOptions\")}\r\n \r\n {this.getValidationError(\"damperActuatorsInclusion\", false)}\r\n
    \r\n
    \r\n\r\n {displayFields.showInterfaceCard ? (\r\n
    \r\n
    Interface Card
    \r\n
    \r\n this.saveInputValue(\"interfaceCard\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"interfaceCardOptions\")}\r\n \r\n {this.getValidationError(\"interfaceCard\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Airflow Arrangement
    \r\n
    {displayFields.airFlowArrangementLabel}
    \r\n
    \r\n\r\n
    \r\n
    VAV/Constant Volume
    \r\n
    {displayFields.vavOrConstantVolumeLabel}
    \r\n
    \r\n\r\n {displayFields.showSupplyFanControl ? (\r\n
    \r\n
    Supply Fan Control
    \r\n
    \r\n this.saveInputValue(\"supplyFanControl\", event.currentTarget.value)}\r\n disabled = {displayFields.supplyFanControlDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"supplyFanControlOptions\")}\r\n \r\n {this.getValidationError(\"supplyFanControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showExhaustFanControl ? (\r\n
    \r\n
    Exhaust Fan Control
    \r\n
    \r\n this.saveInputValue(\"exhaustFanControl\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"exhaustFanControlOptions\")}\r\n \r\n {this.getValidationError(\"exhaustFanControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showReturnFanControl ? (\r\n
    \r\n
    Return Fan Control
    \r\n
    \r\n this.saveInputValue(\"returnFanControl\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"returnFanControlOptions\")}\r\n \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showTemperatureControl ? (\r\n
    \r\n
    Temperature Control
    \r\n
    \r\n this.saveInputValue(\"temperatureControl\", event.currentTarget.value)}\r\n disabled={displayFields.temperatureControlDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"temperatureControlOptions\")}\r\n \r\n {this.getValidationError(\"temperatureControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showEconomizerInitiation ? (\r\n
    \r\n
    Economizer Initiation
    \r\n
    \r\n this.saveInputValue(\"economizerInitiation\", event.currentTarget.value)}\r\n disabled={displayFields.economizerInitiationDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"economizerInitiationOptions\")}\r\n \r\n {this.getValidationError(\"economizerInitiation\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showMinimumOutsideAirControl ? (\r\n
    \r\n
    Minimum OA Control
    \r\n
    \r\n this.saveInputValue(\"minimumOutsideAirControl\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"minimumOutsideAirControlOptions\")}\r\n \r\n {this.getValidationError(\"minimumOutsideAirControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showUnoccupiedModeControl ? (\r\n
    \r\n
    Unoccupied Mode Control
    \r\n
    \r\n this.saveInputValue(\"unoccupiedModeControl\", event.currentTarget.value)}\r\n disabled={displayFields.unoccupiedModeControlDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"unoccupiedModeControlOptions\")}\r\n \r\n {this.getValidationError(\"unoccupiedModeControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showDehumidificationControl ? (\r\n
    \r\n
    {dehumidControlDisplayName}
    \r\n
    \r\n this.saveInputValue(\"dehumidificationControl\", event.currentTarget.value)}\r\n disabled={displayFields.dehumidificationControlDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dehumidificationControlOptions\")}\r\n \r\n {this.getValidationError(\"dehumidificationControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showHumidificationControl ? (\r\n
    \r\n
    Humidification Control
    \r\n
    \r\n this.saveInputValue(\"humidificationControl\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"humidificationControlOptions\")}\r\n \r\n {this.getValidationError(\"humidificationControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showMasterSlaveMultiUnitControl ? (\r\n
    \r\n
    Master/Slave Multi-Unit Control
    \r\n
    \r\n this.saveInputValue(\"masterSlaveMultiUnitControl\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"masterSlaveMultiUnitControlOptions\")}\r\n \r\n {this.getValidationError(\"masterSlaveMultiUnitControl\", false)}\r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n {/* Controls Options */}\r\n
    \r\n this.toggleSystemOptionsPanel()}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n {displayFields.showIncludeUnoccupiedWarmUp ? (\r\n
    \r\n
    Unoccupied Warm Up
    \r\n
    \r\n this.saveInputValue(\"includeUnoccupiedWarmUp\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeUnoccupiedCoolDown ? (\r\n
    \r\n
    Unoccupied Cool Down
    \r\n
    \r\n this.saveInputValue(\"includeUnoccupiedCoolDown\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeHeatWheelRotationDetection ? (\r\n
    \r\n
    Heat Wheel Rotation Detection
    \r\n
    \r\n this.saveInputValue(\"includeHeatWheelRotationDetection\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeDemandControlVentilationCO2 ? (\r\n
    \r\n
    Demand Control Ventilation (CO2)
    \r\n
    \r\n this.saveInputValue(\"includeDemandControlVentilationCO2\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeDirtyFilterSwitches ? (\r\n
    \r\n
    Dirty Filter Switches
    \r\n
    \r\n this.saveInputValue(\"includeDirtyFilterSwitches\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeFilterPressureTransducers ? (\r\n
    \r\n
    Filter Pressure Transducers
    \r\n
    \r\n this.saveInputValue(\"includeFilterPressureTransducers\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeCondensateDrainPanOverflowSwitch ? (\r\n
    \r\n
    Condensate Drain Pan Overflow Switch
    \r\n
    \r\n this.saveInputValue(\"includeCondensateDrainPanOverflowSwitch\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeFreezestat ? (\r\n
    \r\n
    Freezestat
    \r\n
    \r\n this.saveInputValue(\"includeFreezestat\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeHighDuctStaticPressure ? (\r\n
    \r\n
    High Duct Static Pressure
    \r\n
    \r\n this.saveInputValue(\"includeHighDuctStaticPressure\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeLowDuctStaticPressure ? (\r\n
    \r\n
    Low Duct Static Pressure
    \r\n
    \r\n this.saveInputValue(\"includeLowDuctStaticPressure\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Damper at Connection
    \r\n
    \r\n this.saveInputValue(\"includeOutsideAirInletDamper\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n OA Inlet\r\n
    \r\n\r\n {displayFields.showIncludeReturnAirInletDamper ? (\r\n
    \r\n this.saveInputValue(\"includeReturnAirInletDamper\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n RA Inlet\r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIncludeExhaustAirOutletDamper ? (\r\n
    \r\n this.saveInputValue(\"includeExhaustAirOutletDamper\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n EA Outlet\r\n
    \r\n ) : null}\r\n
    \r\n\r\n
    \r\n
    Smoke Dampers
    \r\n {displayFields.showIncludeReturnAirInletSmokeDamper ? (\r\n
    \r\n this.saveInputValue(\"includeReturnAirInletSmokeDamper\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n RA Inlet\r\n
    \r\n ) : null}\r\n\r\n
    \r\n this.saveInputValue(\"includeSupplyAirOutletSmokeDamper\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n SA Outlet\r\n
    \r\n
    \r\n\r\n
    \r\n
    Airflow Monitoring
    \r\n\r\n
    \r\n this.saveInputValue(\"includeOutsideAirInletAirflowMonitoring\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n OA Inlet\r\n
    \r\n \r\n
    \r\n this.saveInputValue(\"includeSupplyFanAirflowMonitoring\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n SA Fan\r\n
    \r\n \r\n {displayFields.showExhaustFanAirFlowMonitoring ? (\r\n
    \r\n this.saveInputValue(\"includeExhaustFanAirflowMonitoring\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n EA Fan\r\n
    \r\n ) : null}\r\n\r\n {displayFields.showReturnFanAirFlowMonitoring ? (\r\n
    \r\n this.saveInputValue(\"includeReturnFanAirflowMonitoring\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n RA Fan\r\n
    \r\n ) : null}\r\n
    \r\n\r\n
    \r\n
    Magnehelic Gauges
    \r\n
    \r\n this.saveInputValue(\"includeMagnehelicGauges\", event.currentTarget.checked.toString())}\r\n />{\" \"}\r\n Filters\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {/* Set Points And Additional BMS Points */}\r\n {/* TODO: based on user role, set this class to display-none if user is a rep and controlsInclusion is not \"others\" */}\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Controls);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport {\r\n addNotification,\r\n clearAllPerformanceNotifications,\r\n getErrorNotifications,\r\n accordionHasError,\r\n removeNotification\r\n} from \"../../../api-utilities/notification-tools\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n componentData: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\nclass PrimaryPower extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.controlsInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n // async componentDidUpdate(prevProps: IProps) {\r\n // console.log(prevProps.heaterType + \":\" + this.props.heaterType);\r\n // if (prevProps.heaterType != this.props.heaterType) {\r\n // await this.getFilterData(this.props.heaterType);\r\n // }\r\n // }\r\n\r\n // private async getFilterData(heaterType: string) {\r\n // const { projectId, unitId } = this.props.match.params;\r\n // const result = await getFilterInputValues(projectId, unitId, heaterType);\r\n\r\n // if (result.uiDataContainer.filterInputs) {\r\n // this.setState({\r\n // userInputs: result.uiDataContainer.filterInputs,\r\n // displayFields: result.uiDataContainer.displayFields,\r\n // dropdownOptions: result.dropdownOptions,\r\n // validationErrors: result.validationErrors\r\n // });\r\n // }\r\n // }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateElectrical\", projectId, unitId, fieldName, newValue, \"ControlsInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.controlsInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n\r\n
    Primary Power Circuit - Disconnect
    \r\n\r\n
    \r\n
    Voltage
    \r\n
    {displayFields.voltageLabel}
    \r\n
    \r\n\r\n
    SCCR
    \r\n
    \r\n this.saveInputValue(\"shortCircuitCurrentRating\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"shortCircuitCurrentRatingOptions\")}\r\n \r\n {this.getValidationError(\"shortCircuitCurrentRating\")}\r\n
    \r\n\r\n
    \r\n
    Disconnect Fusing
    \r\n
    \r\n this.saveInputValue(\"hasDisconnectFusing\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n {/*
    {this.props.reduxElectrical.disconnectFusingDisabled}
    */}\r\n
    \r\n
    Phase/Voltage Protection
    \r\n
    \r\n this.saveInputValue(\"hasPhaseVoltageProtection\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {/*
    */}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PrimaryPower);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptionsSingle,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n title: string;\r\n fanData: any;\r\n targetVertex:string;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n fanInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n targetVertex: string;\r\n disableManualBypass:boolean;\r\n}\r\n\r\nclass FanVFDDisplayGroup extends React.Component {\r\n async componentDidMount() {\r\n const fanData = this.props.fanData;\r\n if (!isEmptyObject(fanData)) {\r\n if (this.props.title === \"Supply\"){\r\n this.setState({\r\n dropdownOptions: fanData.fanDropDownOptions.supplyFanDriveTypeOptions,\r\n displayFields: fanData.fanUIDataContainer.displayFields,\r\n disableManualBypass: fanData.fanUIDataContainer.displayFields.disableSupplyManualBypass,\r\n fanInputs: fanData.fanUIDataContainer.supplyFanInputs,\r\n validationErrors: fanData.validationErrors,\r\n targetVertex: this.props.targetVertex\r\n });\r\n }\r\n if (this.props.title === \"Exhaust\"){\r\n this.setState({\r\n dropdownOptions: fanData.fanDropDownOptions.exhaustFanDriveTypeOptions,\r\n displayFields: fanData.fanUIDataContainer.displayFields,\r\n disableManualBypass: fanData.fanUIDataContainer.displayFields.disableExhaustManualBypass,\r\n fanInputs: fanData.fanUIDataContainer.exhaustFanInputs,\r\n validationErrors: fanData.validationErrors,\r\n targetVertex: this.props.targetVertex\r\n });\r\n }\r\n if (this.props.title === \"Return\"){\r\n this.setState({\r\n dropdownOptions: fanData.fanDropDownOptions.returnFanDriveTypeOptions,\r\n displayFields: fanData.fanUIDataContainer.displayFields,\r\n disableManualBypass: fanData.fanUIDataContainer.displayFields.disableReturnManualBypass,\r\n fanInputs: fanData.fanUIDataContainer.returnFanInputs,\r\n validationErrors: fanData.validationErrors,\r\n targetVertex: this.props.targetVertex\r\n });\r\n }\r\n }\r\n }\r\n \r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n //this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateFan\", projectId, unitId, fieldName, newValue, this.state.targetVertex);\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n // if (result.data.validationErrors != null) {\r\n // this.addValidationErrors(result.data.validationErrors);\r\n // }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n // if (result.data.dropdownOptions != null) {\r\n // this.updateDropdowns(result.data.dropdownOptions);\r\n // }\r\n \r\n //if uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n var disableManualBypass;\r\n if (this.state.targetVertex === \"SupplyFanInputs\"){\r\n disableManualBypass = result.data.uiDataContainer.displayFields.disableSupplyManualBypass;\r\n }\r\n if (this.state.targetVertex === \"ExhaustFanInputs\"){\r\n disableManualBypass = result.data.uiDataContainer.displayFields.disableExhaustManualBypass;\r\n }\r\n if (this.state.targetVertex === \"ReturnFanInputs\"){\r\n disableManualBypass = result.data.uiDataContainer.displayFields.disableReturnManualBypass;\r\n }\r\n this.setState({\r\n fanInputs: result.data.uiDataContainer.fanInputs,\r\n displayFields: result.data.uiDataContainer.displayFields,\r\n disableManualBypass: disableManualBypass\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n if (isEmptyObject(this.state)) {\r\n return null;\r\n }\r\n const savedValues = this.state.fanInputs;\r\n const displayFields = this.state.displayFields;\r\n return (\r\n
    \r\n
    {this.props.title}
    \r\n {/* FanArrayVfdSharing */}\r\n
    \r\n \r\n
    \r\n\r\n {/* Allow Microdrives */}\r\n
    \r\n
    \r\n this.saveInputValue(\"allowMicrodrives\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n\r\n {/* Manual Bypass*/}\r\n
    \r\n
    \r\n this.saveInputValue(\"hasManualBypass\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FanVFDDisplayGroup);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {getValidationError, getSelectBoxOptions, getFilteredValidationErrors, getNewDropdownList, getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n componentData: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass FanVFDInstall extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.controlsInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateElectrical\", projectId, unitId, fieldName, newValue, \"ControlsInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.controlsInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    Provision/Installation
    \r\n
    \r\n this.saveInputValue(\"vfdProvisionInstallation\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"vfdProvisionInstallationOptions\")}\r\n \r\n {this.getValidationError(\"vfdProvisionInstallation\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FanVFDInstall);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport FanVFDDisplayGroup from \"./FanVFDDisplayGroup\";\r\nimport FanVFDInstall from \"./FanVFDInstall\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n componentData: any;\r\n}\r\n// local state\r\ninterface IState {\r\n componentData: any;\r\n displayFields: any;\r\n}\r\n\r\nclass FanVFD extends React.Component {\r\n componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n componentData: componentData,\r\n displayFields: componentData.fanUIDataContainer.displayFields,\r\n });\r\n }\r\n }\r\n private getFanDisplayGroups() {\r\n\r\n let panelArr: any = [];\r\n\r\n if (this.state.displayFields?.showSupplyFan) {\r\n panelArr.push();\r\n }\r\n if (this.state.displayFields?.showExhaustFan) {\r\n panelArr.push();\r\n }\r\n if (this.state.displayFields?.showReturnFan) {\r\n panelArr.push();\r\n }\r\n return panelArr;\r\n }\r\n\r\n public render() {\r\n \r\n if (isEmptyObject(this.state)) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n\r\n
    Fan VFDs
    \r\n \r\n
    \r\n
    \r\n
    Drive Type
    \r\n
    Allow Microdrives
    \r\n
    Manual Bypass
    \r\n
    \r\n\r\n {this.getFanDisplayGroups()}\r\n
    \r\n\r\n {/*
    */}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FanVFD);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n componentData: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\nclass Circuit120V extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.controlsInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateElectrical\", projectId, unitId, fieldName, newValue, \"ControlsInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.controlsInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-error1\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n \r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n\r\n
    120V Circuit - Lights and GFCI
    \r\n\r\n
    \r\n
    Light Inclusion
    \r\n
    \r\n this.saveInputValue(\"lightInclusion\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"lightInclusionOptions\")}\r\n \r\n {this.getValidationError(\"lightInclusion\")}\r\n
    \r\n
    \r\n\r\n
    Light Type
    \r\n
    {savedValues.lightInclusion === \"None\" ? \"None\" : \"LED Light Strip\"}
    \r\n
    \r\n\r\n
    GFCI Quantity
    \r\n
    \r\n this.updateTextboxValue(\"gfciQuantity\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"gfciQuantity\", event.currentTarget.value)}\r\n />\r\n {this.getValidationError(\"gfciQuantity\")}\r\n
    \r\n
    \r\n\r\n
    Circuit Power
    \r\n
    \r\n this.saveInputValue(\"singlePhaseCircuitPower\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"singlePhaseCircuitPowerOptions\")}\r\n \r\n {this.getValidationError(\"singlePhaseCircuitPower\")}\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxElectrical: state.reduxElectrical,\r\n reduxValidation: state.reduxValidation\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Circuit120V);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport {\r\n addNotification,\r\n clearAllPerformanceNotifications,\r\n getErrorNotifications,\r\n accordionHasError,\r\n removeNotification\r\n} from \"../../../api-utilities/notification-tools\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n match: match;\r\n updateRedux: any;\r\n componentData: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\nclass Circuit24V extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.controlsInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n // async componentDidUpdate(prevProps: IProps) {\r\n // console.log(prevProps.heaterType + \":\" + this.props.heaterType);\r\n // if (prevProps.heaterType != this.props.heaterType) {\r\n // await this.getFilterData(this.props.heaterType);\r\n // }\r\n // }\r\n\r\n // private async getFilterData(heaterType: string) {\r\n // const { projectId, unitId } = this.props.match.params;\r\n // const result = await getFilterInputValues(projectId, unitId, heaterType);\r\n\r\n // if (result.uiDataContainer.filterInputs) {\r\n // this.setState({\r\n // userInputs: result.uiDataContainer.filterInputs,\r\n // displayFields: result.uiDataContainer.displayFields,\r\n // dropdownOptions: result.dropdownOptions,\r\n // validationErrors: result.validationErrors\r\n // });\r\n // }\r\n // }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateElectrical\", projectId, unitId, fieldName, newValue, \"ControlsInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.controlsInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    24V Circuit
    \r\n\r\n
    \r\n
    Smoke Detectors
    \r\n
    \r\n this.saveInputValue(\"smokeDetectors\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"smokeDetectorsOptions\")}\r\n \r\n {this.getValidationError(\"smokeDetectors\")}\r\n
    \r\n
    \r\n
    \r\n {displayFields.showSmokeDetectorInclusion ? (\r\n
    \r\n
    Smoke Detector Inclusion
    \r\n
    \r\n this.saveInputValue(\"smokeDetectorInclusion\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"smokeDetectorInclusionOptions\")}\r\n \r\n {this.getValidationError(\"smokeDetectorInclusion\")}\r\n
    \r\n
    \r\n ) : null}\r\n {displayFields.showSmokeDetectorType ? (\r\n
    \r\n
    Smoke Detector Type
    \r\n
    \r\n this.saveInputValue(\"smokeDetectorType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"smokeDetectorTypeOptions\")}\r\n \r\n {this.getValidationError(\"smokeDetectorType\")}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Circuit24V);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getElectricalInputValues } from \"../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../utilities/helpers\";\r\nimport PrimaryPower from \"./Electrical/PrimaryPower\";\r\nimport FanVFD from \"./Electrical/FanVFD\";\r\nimport Circuit120V from \"./Electrical/Circuit120V\";\r\nimport Circuit24V from \"./Electrical/Circuit24V\";\r\nimport \"../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n componentData: any;\r\n}\r\n\r\nclass Electrical extends React.Component {\r\n public state: IState = {\r\n componentData: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await getElectricalInputValues(projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"electricalInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetElectricalInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (!isEmptyObject(result.uiDataContainer)) {\r\n this.setState({\r\n componentData: result\r\n });\r\n }\r\n }\r\n public render() {\r\n const componentData = this.state.componentData;\r\n if (isEmptyObject(componentData)) {\r\n return null;\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 \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Electrical);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport { getErrorNotifications, accordionHasError } from \"../../../../api-utilities/notification-tools\";\r\nimport { addNotification, removeNotification } from \"../../../../api-utilities/notification-tools\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n //componentData: any;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass EnthalpyWheel extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetHeatWheelInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n if (result.uiDataContainer.heatWheelInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.heatWheelInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateHeatWheel\", projectId, unitId, fieldName, newValue, \"HeatWheelInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.heatWheelInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    Spare Belts
    \r\n
    \r\n this.saveInputValue(\"spareBeltQuantity\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"spareBeltQuantityOptions\")}\r\n \r\n {this.getValidationError(\"spareBeltQuantity\")}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxHeatWheelPanel: state.reduxHeatWheelPanel\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(EnthalpyWheel);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport { updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n convertTubeWallThickness,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n convertFinThickness,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n title: string;\r\n //component: string;\r\n //actionType: string;\r\n //fanVfdItem: FanVfdItem;\r\n componentData: any;\r\n userInputs: any;\r\n targetVertex: string;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass CoilDisplayGroup extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n componentDidMount() {\r\n //this.checkVFDSharing();\r\n const componentData = this.props.componentData;\r\n\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: this.props.userInputs,\r\n displayFields: componentData.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n componentWillUnmount() {\r\n //Remove warning when navigating to another page.\r\n //removeNotification(\"fanArrayvfdsharing\");\r\n }\r\n componentDidUpdate(prevProps: any) {\r\n //showVFDSharingErrorMessage changed, see whether or not to show the notification.\r\n // if (prevProps.fanVfdItem.showVfdSharingErrorMessage !== this.props.fanVfdItem.showVfdSharingErrorMessage) {\r\n // this.checkVFDSharing();\r\n // }\r\n }\r\n private checkVFDSharing() {\r\n // if (this.props.fanVfdItem.showVfdSharingErrorMessage) {\r\n // const notification = {\r\n // id: \"fanArrayvfdsharing\",\r\n // notificationType: \"warning\",\r\n // title: \"Warning\",\r\n // content:
    {\"No VFD large enough for full array.\"}
    \r\n // };\r\n // addNotification(notification);\r\n // } else {\r\n // removeNotification(\"fanArrayvfdsharing\");\r\n // }\r\n }\r\n // async componentDidMount() {\r\n // await this.getFilterData(this.props.heaterType);\r\n // }\r\n\r\n // async componentDidUpdate(prevProps: IProps) {\r\n // console.log(prevProps.heaterType + \":\" + this.props.heaterType);\r\n // if (prevProps.heaterType != this.props.heaterType) {\r\n // await this.getFilterData(this.props.heaterType);\r\n // }\r\n // }\r\n\r\n // private async getFilterData(heaterType: string) {\r\n // const { projectId, unitId } = this.props.match.params;\r\n // const result = await getFilterInputValues(projectId, unitId, heaterType);\r\n\r\n // if (result.uiDataContainer.filterInputs) {\r\n // this.setState({\r\n // userInputs: result.uiDataContainer.filterInputs,\r\n // displayFields: result.uiDataContainer.displayFields,\r\n // dropdownOptions: result.dropdownOptions,\r\n // validationErrors: result.validationErrors\r\n // });\r\n // }\r\n // }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n\r\n let result = await updateInputField(\"updateCoil\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.coilInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n private getCoilCoatingOptionsName(title:string){\r\n //Steam, Chilled Water, Hot Water, Hot Water Preheat\r\n if (title === \"Steam\" || title === \"Hot Water\"){\r\n return \"heatingCoilCoatingOptions\";\r\n }\r\n if (title === \"Chilled Water\"){\r\n return \"chilledWaterCoilCoatingOptions\";\r\n }\r\n if (title === \"Hot Water Preheat\"){\r\n return \"preheatCoilCoatingOptions\";\r\n }\r\n if (title === \"Direct Expansion\"){\r\n return \"dxCoilCoatingOptions\";\r\n }\r\n if (title === \"Hot Gas Reheat\"){\r\n return \"hgrCoilCoatingOptions\";\r\n }\r\n return \"\";\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const coilCoatingOptionsName = this.getCoilCoatingOptionsName(this.props.title);\r\n if (isEmptyObject(savedValues)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n
    {this.props.title}
    \r\n {/* Casing Construction */}\r\n
    \r\n this.saveInputValue(\"casingConstruction\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"casingMaterialOptions\")}\r\n \r\n {this.getValidationError(\"casingConstruction\")}\r\n
    \r\n {/* Coating */}\r\n
    \r\n this.saveInputValue(\"coilCoating\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, coilCoatingOptionsName)}\r\n \r\n {this.getValidationError(\"coating\")}\r\n
    \r\n {/* Tube Thickness */}\r\n
    {convertTubeWallThickness(savedValues.tubeWallThickness)}
    \r\n {/* Fin Material */}\r\n
    {savedValues.finMaterial}
    \r\n {/* Fin Thickness */}\r\n
    {convertFinThickness(savedValues.finThickness)}
    \r\n {/* Include UV Lights */}\r\n {/* {coilPanelItem.componentName === \"Chilled Water Coil\" || coilPanelItem.componentName === \"DX Coil\" ? (\r\n
    \r\n this.inputBuilder.updateCheckbox('includeUVLights', event)}\r\n />\r\n
    \r\n ) : (\r\n
    \r\n )} */}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n //ownProps: Allows us to use this.props.component to decide which redux object to subscribe to\r\n // const coilPanelItem = (() => {\r\n // switch (ownProps.component) {\r\n // case 'reduxHotWaterCoilPanel':\r\n // return state.reduxHotWaterCoilPanel;\r\n // case 'reduxHotWaterPreheatPanel':\r\n // return state.reduxHotWaterPreheatPanel;\r\n // case 'reduxChilledWaterCoilPanel':\r\n // return state.reduxChilledWaterCoilPanel;\r\n // case 'reduxSteamCoilPanel':\r\n // return state.reduxSteamCoilPanel;\r\n // case 'reduxDXCoilPanel':\r\n // return state.reduxDXCoilPanel;\r\n // case 'reduxHGRHCoilPanel':\r\n // return state.reduxHGRHCoilPanel;\r\n // default:\r\n // return null;\r\n // }\r\n // })();\r\n // return {\r\n // coilPanelItem\r\n // };\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CoilDisplayGroup);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport { updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport { getSelectBoxOptions, getInputCSS, convertTubeWallThickness, convertFinThickness } from \"../../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n title: string;\r\n componentData: any;\r\n userInputs: any;\r\n targetVertex: string;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n}\r\n\r\nclass CoilDisplayGroupDX extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: []\r\n };\r\n componentDidMount() {\r\n //this.checkVFDSharing();\r\n const componentData = this.props.componentData;\r\n\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: this.props.userInputs,\r\n displayFields: componentData.displayFields,\r\n dropdownOptions: componentData.dropdownOptions\r\n });\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n\r\n if (result.success) {\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.refrigerationInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS([], fieldName, type);\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n //const coilPanelItem = this.props.coilPanelItem;\r\n const savedValues = this.state.userInputs;\r\n if (isEmptyObject(savedValues)) {\r\n return null;\r\n }\r\n console.log(this.state.dropdownOptions);\r\n return (\r\n
    \r\n
    {this.props.title}
    \r\n {/* Casing Construction */}\r\n
    \r\n this.saveInputValue(\"dxCasingConstruction\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"casingMaterialOptions\")}\r\n \r\n
    \r\n {/* Coating */}\r\n
    \r\n this.saveInputValue(\"dxCoilCoating\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"dxCoilCoatingOptions\")}\r\n \r\n
    \r\n {/* Tube Thickness */}\r\n
    {convertTubeWallThickness(savedValues.dxTubeWallThickness)}
    \r\n {/* Fin Material */}\r\n
    {savedValues.dxFinMaterial}
    \r\n {/* Fin Thickness */}\r\n
    {convertFinThickness(savedValues.dxFinThickness)}
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CoilDisplayGroupDX);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport { updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport { getSelectBoxOptions, getInputCSS, convertTubeWallThickness, convertFinThickness } from \"../../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n title: string;\r\n componentData: any;\r\n userInputs: any;\r\n targetVertex: string;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n}\r\n\r\nclass CoilDisplayGroupHGRH extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: []\r\n };\r\n componentDidMount() {\r\n //this.checkVFDSharing();\r\n const componentData = this.props.componentData;\r\n\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: this.props.userInputs,\r\n displayFields: componentData.displayFields,\r\n dropdownOptions: componentData.dropdownOptions\r\n });\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n\r\n if (result.success) {\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.refrigerationInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS([], fieldName, type);\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n //const coilPanelItem = this.props.coilPanelItem;\r\n const savedValues = this.state.userInputs;\r\n if (isEmptyObject(savedValues)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n
    {this.props.title}
    \r\n {/* Casing Construction */}\r\n
    \r\n this.saveInputValue(\"hgrhCasingConstruction\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"casingMaterialOptions\")}\r\n \r\n
    \r\n {/* Coating */}\r\n
    \r\n this.saveInputValue(\"hgrhCoilCoating\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"hgrCoilCoatingOptions\")}\r\n \r\n
    \r\n {/* Tube Thickness */}\r\n
    {convertTubeWallThickness(savedValues.hgrhTubeWallThickness)}
    \r\n {/* Fin Material */}\r\n
    {savedValues.hgrhFinMaterial}
    \r\n {/* Fin Thickness */}\r\n
    {convertFinThickness(savedValues.hgrhFinThickness)}
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CoilDisplayGroupHGRH);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport CoilDisplayGroup from \"./CoilDisplayGroup\";\r\nimport CoilDisplayGroupDX from \"./CoilDisplayGroupDX\";\r\nimport CoilDisplayGroupHGRH from \"./CoilDisplayGroupHGRH\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport { callGetEndpoint } from \"../../../../api-calls/readApiService\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n title: string;\r\n updateRedux: any;\r\n // reduxHotWaterCoilPanel: CoilPanelItem;\r\n // reduxHotWaterPreheatPanel: CoilPanelItem;\r\n // reduxChilledWaterCoilPanel: CoilPanelItem;\r\n // reduxSteamCoilPanel: CoilPanelItem;\r\n // reduxDXCoilPanel: CoilPanelItem;\r\n // reduxHGRHCoilPanel: CoilPanelItem;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n componentData: any;\r\n}\r\n\r\nclass Coils extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n componentData: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetAllCoilInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n if (!isEmptyObject(result)) {\r\n this.setState({\r\n componentData: result\r\n });\r\n }\r\n }\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const componentData = this.state.componentData;\r\n if (isEmptyObject(componentData)) {\r\n return null;\r\n }\r\n\r\n const displayFields = componentData.uiDataContainer.displayFields;\r\n \r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    Casing Construction
    \r\n
    Coating
    \r\n
    Tube Thickness
    \r\n
    Fin Material
    \r\n
    Fin Thickness
    \r\n {/*
    UV Lights
    */}\r\n
    \r\n {displayFields.showPreHeatHotWaterCoil ? (\r\n \r\n ) : null}\r\n {displayFields.showHotWaterCoil ? (\r\n \r\n ) : null}\r\n {displayFields.showChilledWaterCoil ? (\r\n \r\n ) : null}\r\n {displayFields.showSteamCoil ? (\r\n \r\n ) : null}\r\n {displayFields.showDxCoil ? (\r\n \r\n ) : null}\r\n {displayFields.showHotGasReheatCoil ? (\r\n \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Coils);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass IDF extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetIndirectFiredFurnaceInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n if (result.uiDataContainer.indirectFiredFurnaceInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.indirectFiredFurnaceInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateIndirectFiredFurnace\", projectId, unitId, fieldName, newValue, \"IndirectFiredFurnaceInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.indirectFiredFurnaceInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string, cssClass: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, cssClass);\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const savedValues = this.state.userInputs;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* Tube Material */}\r\n
    Tube Material
    \r\n
    \r\n this.saveInputValue(\"tubeMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"tubeMaterialOptions\")}\r\n \r\n
    \r\n {this.getValidationError(\"tubeMaterial\", \"spec-warning\")}\r\n
    \r\n\r\n {/* Fuel Type */}\r\n
    Fuel Type
    \r\n
    \r\n this.saveInputValue(\"fuelType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"fuelTypeOptions\")}\r\n \r\n {this.getValidationError(\"fuelType\", \"validation-err-right\")}\r\n
    \r\n\r\n
    \r\n {/* Min Total Turndown */}\r\n
    Min Total Turndown
    \r\n
    \r\n this.saveInputValue(\"minTotalTurndown\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"minTotalTurndownOptions\")}\r\n \r\n {this.getValidationError(\"minTotalTurndown\", \"validation-err-right\")}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(IDF);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport { addNotification } from \"../../../../api-utilities/notification-tools\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n // reduxAccuPanel: AccuPanel;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass Refrigeration extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetRefrigerationInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"refrigerationInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetRefrigerationInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n \r\n if (result.uiDataContainer && result.uiDataContainer.refrigerationInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.refrigerationInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.refrigerationInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* Condenser Coil Coating */}\r\n
    Condenser Coil Coating
    \r\n
    \r\n this.saveInputValue(\"condenserCoilCoating\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"condenserCoilCoatingOptions\")}\r\n \r\n {this.getValidationError(\"condenserCoilCoating\")}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n //reduxAccuPanel: state.reduxAccuPanel\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Refrigeration);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport { FilterPanelItem } from \"../../../../TypescriptClient\";\r\nimport { getSpareFilterQuantities } from \"../../../../utilities/spareFilterUtil\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n //title: string;\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n componentData: any;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\nclass FilterSpares extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n componentData: null,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n //==================================================================================================================\r\n //NOTE: It would be difficult to manage spare filter quantities on each filter vertex individually, and Dave just wants\r\n //to group them as Pleated and Cartridge spare filters. So we just have 2 spare filter fields in primaryInputs instead.\r\n //==================================================================================================================\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(`readapi/GetSpareFilterInputValues`, projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n if (!isEmptyObject(result)) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.primaryInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n\r\n //TODO: Get rid of all these comments. All this logic is handled in the ClientAPI now (FilterReadService, FilterWriteService)\r\n //async componentDidMount() {\r\n //GetAllFilters\r\n //Determine if any are pleated: showPleatedDropdown\r\n //Determine if any are cartridge: showCartridgeDropdown\r\n //When saved, distribute the pleated setting to all filter vertexes that have a \"pleated\" type\r\n //When saved, distribute the cartridge setting to all filter vertexes that have a \"cartridge\" type\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateSpareFilter\", projectId, unitId, fieldName, newValue, \"PrimaryInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.primaryInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (isEmptyObject(savedValues)) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Spare Filter Sets
    \r\n
    \r\n {/* -------------- Pleated Filters Dropdown ---------------------------- */}\r\n {displayFields.showPleatedFilterDropdown ? (\r\n
    \r\n
    Pleated Filter Qty
    \r\n
    \r\n this.saveInputValue(\"pleatedSpareFilterSetsQuantity\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"spareFilterSetsQuantityOptions\")}\r\n \r\n
    \r\n
    \r\n ) : null}\r\n {/* --------------- Cartridge Filters Dropdown -------------------------*/}\r\n {displayFields.showCartridgeFilterDropdown ? (\r\n
    \r\n
    Cartridge Filter Qty
    \r\n
    \r\n this.saveInputValue(\"cartridgeSpareFilterSetsQuantity\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"spareFilterSetsQuantityOptions\")}\r\n \r\n
    \r\n
    \r\n ) : null}\r\n {/* --------------- Aluminum Filters Dropdown -------------------------*/}\r\n {displayFields.showAluminumFilterDropdown ? (\r\n
    \r\n
    Aluminum Filter Qty
    \r\n
    \r\n this.saveInputValue(\"aluminumSpareFilterSetsQuantity\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"spareFilterSetsQuantityOptions\")}\r\n \r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    NOTE: Spare filter quantities reset to zero if any filter types are changed.
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n // reduxOAFilterPanel: state.reduxOAFilterPanel,\r\n // reduxHEFilterPanel: state.reduxHEFilterPanel,\r\n // reduxSAFilterPanel: state.reduxSAFilterPanel,\r\n // reduxRAFilterPanel: state.reduxRAFilterPanel\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FilterSpares);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport { updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport {getValidationError, getSelectBoxOptionsSingle, getInputCSS, getFilteredValidationErrors, getNewValidationErrorsList} from \"../../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n title: string;\r\n motorEnclosureOptions: any[];\r\n shaftGroundingOptions: any[];\r\n componentData: any;\r\n userInputs: any;\r\n targetVertex: string;\r\n match: match;\r\n showSafetyCage: boolean;\r\n refreshAllFanData: (allFansUIResponse: any) => void;\r\n}\r\n\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass FanDisplayGroup extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n componentDidMount() {\r\n const componentData = this.props.componentData;\r\n\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: this.props.userInputs,\r\n displayFields: componentData.displayFields,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //When calling saveInputValueAllFans, it returns an AllFansUIResponse containing updated data for all fans.\r\n //We send that response back to the parent Fans.tsx component, so it can refresh all the FanDisplayGroups.\r\n //That will cause this method to fire, so we can load the new values in state. But we need to check which\r\n //values have changed because this method can get fired a lot, and can cause an infinite loop.\r\n async componentDidUpdate(prevProps: IProps) {\r\n let prevInputs = prevProps.userInputs;\r\n let newInputs = this.props.userInputs;\r\n let update = false;\r\n //Check all the properties that update ALL FANS. If any of them have changed, reload state from props.\r\n if (this.valueHasChanged(prevInputs.motorEnclosureType, newInputs.motorEnclosureType)) {\r\n update = true;\r\n }\r\n if (this.valueHasChanged(prevInputs.hasInletGuard, newInputs.hasInletGuard)) {\r\n update = true;\r\n }\r\n if (this.valueHasChanged(prevInputs.includeDoorSafetyKillSwitch, newInputs.includeDoorSafetyKillSwitch)) {\r\n update = true;\r\n }\r\n if (this.valueHasChanged(prevInputs.hasOutletSafetyCage, newInputs.hasOutletSafetyCage)) {\r\n update = true;\r\n }\r\n if (update) {\r\n this.setState({\r\n userInputs: this.props.userInputs\r\n });\r\n }\r\n }\r\n valueHasChanged(prevValue: string, newValue: string) {\r\n return prevValue != newValue;\r\n }\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateFan\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fanInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //========= SPECIAL SAVE METHOD for properties requiring all fans to be updated at once ==============\r\n public async saveInputValueAllFans(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n \r\n let result = await updateInputField(\"updateAllFans\", projectId, unitId, fieldName, newValue, \"\");\r\n\r\n if (result.success) {\r\n //This method returns an AllFansUIResponse containing updated data for all fans except for dropdown options.\r\n //So we need to pass that back to the parent Fans.tsx component, so it can refresh all the FanDisplayGroups.\r\n this.props.refreshAllFanData(result);\r\n }\r\n }\r\n //=====================================================================================================\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n if (isEmptyObject(savedValues)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n
    {this.props.title}
    \r\n\r\n {/* Motor Enclosure */}\r\n
    \r\n this.saveInputValueAllFans(\"motorEnclosureType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptionsSingle(this.props.motorEnclosureOptions)}\r\n \r\n {this.getValidationError(\"motorEnclosureType\")}\r\n
    \r\n\r\n {/* Shaft Grounding */}\r\n
    \r\n this.saveInputValue(\"shaftGroundingType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptionsSingle(this.props.shaftGroundingOptions)}\r\n \r\n {this.getValidationError(\"shaftGroundingType\")}\r\n
    \r\n\r\n {/* Inlet Guard */}\r\n
    \r\n this.saveInputValueAllFans(\"hasInletGuard\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n\r\n {/* Door Safety Kill Switch */}\r\n
    \r\n this.saveInputValueAllFans(\"includeDoorSafetyKillSwitch\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n\r\n {/* Outlet Safety Cage (for APH fans)*/}\r\n {this.props.showSafetyCage ? (\r\n
    \r\n this.saveInputValueAllFans(\"hasOutletSafetyCage\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n ) : null}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FanDisplayGroup);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport FanDisplayGroup from \"./FanDisplayGroup\";\r\nimport { callGetEndpoint } from \"../../../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n componentData: any;\r\n supplyFanMotorEnclosureOptions:any[];\r\n exhaustFanMotorEnclosureOptions:any[];\r\n returnFanMotorEnclosureOptions:any[];\r\n supplyFanShaftGroundingOptions:any[];\r\n exhaustFanShaftGroundingOptions:any[];\r\n returnFanShaftGroundingOptions:any[];\r\n}\r\n\r\nclass Fans extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n componentData: null,\r\n supplyFanMotorEnclosureOptions: [],\r\n exhaustFanMotorEnclosureOptions: [],\r\n returnFanMotorEnclosureOptions: [],\r\n supplyFanShaftGroundingOptions: [],\r\n exhaustFanShaftGroundingOptions: [],\r\n returnFanShaftGroundingOptions: [],\r\n };\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n //Note: Dropdown options only need to be put in state at page load because the options will never change based on \r\n //inputs made on the fan construction page.\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetAllFanInputValues\", projectId, unitId);\r\n if (!isEmptyObject(result)) {\r\n this.setState({\r\n componentData: result,\r\n supplyFanMotorEnclosureOptions: result.dropdownOptions.supplyFanMotorEnclosureOptions,\r\n exhaustFanMotorEnclosureOptions: result.dropdownOptions.exhaustFanMotorEnclosureOptions,\r\n returnFanMotorEnclosureOptions: result.dropdownOptions.returnFanMotorEnclosureOptions,\r\n supplyFanShaftGroundingOptions: result.dropdownOptions.supplyFanShaftGroundingOptions,\r\n exhaustFanShaftGroundingOptions: result.dropdownOptions.exhaustFanShaftGroundingOptions,\r\n returnFanShaftGroundingOptions: result.dropdownOptions.returnFanShaftGroundingOptions,\r\n });\r\n }\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n }\r\n\r\n //This method gets passed to the FanDisplayGroups.\r\n //Whenever calling one of the \"updateAllFans\" methods, they need to pass all the updated\r\n //fan info back here so we can refresh all the FanDisplayGroups.\r\n public refreshAllFanData = (allFansUIResponse: any) => {\r\n this.setState({\r\n componentData: allFansUIResponse.data\r\n });\r\n };\r\n\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const componentData = this.state.componentData;\r\n if (isEmptyObject(componentData)) {\r\n return null;\r\n }\r\n const displayFields = componentData.uiDataContainer.displayFields;\r\n //Show or hide the Outlet Safety Cage Title.\r\n let outletSafetyCageClass = displayFields.showSupplyFanOutletSafetyCage || displayFields.showExhaustFanOutletSafetyCage ||\r\n displayFields.showReturnFanOutletSafetyCage ? \"\" : \"app-display-none\";\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    Motor Enclosure
    \r\n
    Shaft Grounding
    \r\n
    Inlet Guard
    \r\n
    Door Safety Kill Switch
    \r\n
    Outlet Safety Cage
    \r\n
    \r\n\r\n {displayFields.showSupplyFan ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showExhaustFan ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showReturnFan ? (\r\n \r\n ) : null}\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Fans);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport { updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptionsSingle,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n title: string;\r\n constructionOptions: any;\r\n componentData: any;\r\n userInputs: any;\r\n targetVertex: string;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass DamperDisplayGroup extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n componentDidMount() {\r\n const componentData = this.props.componentData;\r\n\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: this.props.userInputs,\r\n displayFields: componentData.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n \r\n let result = await updateInputField(\"updateDamper\", projectId, unitId, fieldName, newValue, this.props.targetVertex);\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.damperInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n //const damperPanelItem = this.props.damperPanelItem;\r\n const savedValues = this.state.userInputs;\r\n if (isEmptyObject(savedValues)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n
    {this.props.title}
    \r\n\r\n {this.props.targetVertex === \"ExhaustAirDamperInputs\" ? (\r\n
    \r\n this.saveInputValue(\"motorizedOrGravity\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"motorizedOrGravityOptions\")}\r\n \r\n {this.getValidationError(\"motorizedOrGravity\")}\r\n
    \r\n ) : (\r\n
    Motorized
    \r\n )}\r\n\r\n {savedValues.motorizedOrGravity === \"Gravity\" ? (\r\n
    {savedValues.damperConstruction}
    \r\n ) : (\r\n
    \r\n this.saveInputValue(\"damperConstruction\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptionsSingle(this.props.constructionOptions)}\r\n \r\n {this.getValidationError(\"damperConstruction\")}\r\n
    \r\n )}\r\n\r\n {/* Blade */}\r\n
    {savedValues.bladeType}
    \r\n\r\n {/* Actuator */}\r\n
    {savedValues.actuatorType === \"TwoPosition\" ? \"Two-Position\" : savedValues.actuatorType}
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(DamperDisplayGroup);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport DamperDisplayGroup from \"./DamperDisplayGroup\";\r\nimport { callGetEndpoint } from \"../../../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../../../utilities/helpers\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n componentData: any;\r\n}\r\n\r\nclass Dampers extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n componentData: null\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetAllDamperInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n if (!isEmptyObject(result)) {\r\n this.setState({\r\n componentData: result\r\n });\r\n }\r\n }\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const componentData = this.state.componentData;\r\n if (isEmptyObject(componentData)) {\r\n return null;\r\n }\r\n\r\n const displayFields = componentData.uiDataContainer.displayFields;\r\n\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    Motorized/Gravity
    \r\n
    Type and Construction
    \r\n
    Blade
    \r\n
    Actuator
    \r\n
    \r\n
    \r\n {displayFields.showOutsideAirDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showEconomizerDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showExhaustAirDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showReturnAirDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showSupplyAirDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showOutsideAirBypassDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showExhaustAirBypassDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showRecirculationDamper ? (\r\n \r\n ) : null}\r\n\r\n {displayFields.showFaceAndBypassDamper ? (\r\n \r\n ) : null}\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Dampers);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../../redux/actions\";\r\nimport AccordionHeader from \"../../../Shared/AccordionHeader\";\r\nimport { addNotification } from \"../../../../api-utilities/notification-tools\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../../utilities/pageUtils\";\r\nimport { callGetEndpoint, updateInputField } from \"../../../../api-calls/readApiService\";\r\nimport \"../../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n // reduxAccuPanel: AccuPanel;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n openAccordion: boolean;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass WaterSourceHeatPump extends React.Component {\r\n public state: IState = {\r\n openAccordion: false,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n private togglePanel() {\r\n this.setState({ openAccordion: !this.state.openAccordion }); //toggle to opposite of current state\r\n }\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await callGetEndpoint(\"readapi/GetRefrigerationInputValues\", projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"refrigerationInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetRefrigerationInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n \r\n if (result.uiDataContainer && result.uiDataContainer.refrigerationInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.refrigerationInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn't changed, don't call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateRefrigeration\", projectId, unitId, fieldName, newValue, \"RefrigerationInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.refrigerationInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const active = this.state.openAccordion;\r\n const savedValues = this.state.userInputs;\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.togglePanel()}\r\n />\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* Water Valve Type */}\r\n
    Water Valve Type
    \r\n
    \r\n this.saveInputValue(\"waterValveType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"waterValveTypeOptions\")}\r\n \r\n {this.getValidationError(\"waterValveType\")}\r\n
    \r\n\r\n
    \r\n\r\n {/* Vestibule Heater */}\r\n
    Vestibule Heater
    \r\n
    \r\n this.saveInputValue(\"vestibuleHeater\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"vestibuleHeaterOptions\")}\r\n \r\n {this.getValidationError(\"vestibuleHeater\")}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n //reduxAccuPanel: state.reduxAccuPanel\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(WaterSourceHeatPump);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport EnthalpyWheel from \"./Construction/Accordions/EnthalpyWheel\";\r\nimport Coils from \"./Construction/Accordions/Coils\";\r\nimport IDF from \"./Construction/Accordions/IDF\";\r\nimport Refrigeration from \"./Construction/Accordions/Refrigeration\";\r\nimport Filters from \"./Construction/Accordions/FiltersNotUsed\";\r\nimport FilterSpares from \"./Construction/Accordions/FilterSpares\";\r\nimport Fans from \"./Construction/Accordions/Fans\";\r\nimport Dampers from \"./Construction/Accordions/Dampers\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getComponentList } from \"../../api-calls/readApiService\";\r\nimport \"../../css/SpecItems.scss\";\r\nimport WaterSourceHeatPump from \"./Construction/Accordions/WaterSourceHeatPump\";\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxMenus: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n bodyContentClass: string;\r\n componentList: any;\r\n}\r\n\r\nclass Construction extends React.Component {\r\n public state: IState = {\r\n bodyContentClass: \"spec-body-content\",\r\n componentList: null\r\n };\r\n async componentDidMount() {\r\n //await getComponentConstruction(this.props.match.params);\r\n //need to wait for new data to determine accordian width.\r\n //this.adjustAccordianWidth();\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const result = await getComponentList(projectId, unitId);\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"componentsListError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetComponentsList {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result) {\r\n this.setState({ componentList: result });\r\n }\r\n }\r\n //Check all the coil objects on the Component Construction screen\r\n anyCoilsExist(componentList: any) {\r\n if (\r\n componentList.hasHotWaterCoil ||\r\n componentList.hasPreheatHotWaterCoil ||\r\n componentList.hasChilledWaterCoil ||\r\n componentList.hasSteamCoil ||\r\n componentList.hasPackagedRefrigeration || //this contains DX and HGRH coil inputs\r\n componentList.hasDxSplit ||\r\n componentList.hasWSHP\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n //Check all the filter objects on the Component Construction screen\r\n anyFiltersExist(componentList: any) {\r\n if (\r\n componentList.hasOutsideAirPrefilter ||\r\n componentList.hasReturnAirFilter ||\r\n componentList.hasSupplyAirFinalfilter ||\r\n componentList.hasOutsideAirHighEfficiencyFilter\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n //Check all the fan objects on the Component Construction screen\r\n anyFansExist(componentList: any) {\r\n if (componentList.hasSupplyFan || componentList.hasReturnFan || componentList.hasExhaustFan) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n public render() {\r\n const componentList = this.state.componentList;\r\n if (!componentList) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n {componentList.hasHeatWheel ? : null}\r\n {this.anyCoilsExist(componentList) ? : null}\r\n {componentList.hasIdf ? : null}\r\n {componentList.hasPackagedRefrigeration ? : null}\r\n {componentList.hasWSHP ? : null}\r\n {this.anyFiltersExist(componentList) ? : null}\r\n {this.anyFansExist(componentList) ? : null}\r\n {componentList.hasDampers ? : null}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Construction);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getWarrantyInputValues, updateInputField } from \"../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getSelectBoxOptions,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../utilities/pageUtils\";\r\nimport \"../../css/Warranty.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n location: any;\r\n match: match;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass Warranties extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await getWarrantyInputValues(projectId, unitId);\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"warrantyValuesError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetWarrantyInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.uiDataContainer.primaryInputs) {\r\n this.setState({\r\n userInputs: result.uiDataContainer.primaryInputs,\r\n displayFields: result.uiDataContainer.displayFields,\r\n dropdownOptions: result.dropdownOptions,\r\n validationErrors: result.validationErrors\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 5 } });\r\n }\r\n //Text box values for warranties only have one option, so just return the display value for the textbox.\r\n public getTextBoxValue(boxName: any) {\r\n const options = (this.state.dropdownOptions as any)[boxName];\r\n return options[0].displayValue;\r\n }\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateWarranties\", projectId, unitId, fieldName, newValue, \"PrimaryInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.primaryInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    Warranties
    \r\n
    \r\n
    \r\n
    Unit Parts Warranty
    \r\n
    \r\n this.saveInputValue(\"unitPartsWarranty\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"unitPartsWarrantyOptions\")}\r\n \r\n
    \r\n
    \r\n {displayFields.showCompressorWarranty ? (\r\n
    \r\n
    Compressor Warranty
    \r\n
    \r\n this.saveInputValue(\"compressorWarranty\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"compressorWarrantyOptions\")}\r\n \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showPlateHXWarranty ? (\r\n
    \r\n
    Plate Heat Exchanger Warranty
    \r\n
    \r\n \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {displayFields.showIDFWarranty ? (\r\n
    \r\n
    Indirect Fired Furnance Warranty
    \r\n
    \r\n \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Warranties);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n componentData: any;\r\n //reduxUnitCabinet: UnitCabinetUI;\r\n}\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass Exterior extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.fineTuneInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn\"t changed, don\"t call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateUnitCabinet\", projectId, unitId, fieldName, newValue, \"FineTuneInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n\r\n
    Exterior Cabinet Construction
    \r\n\r\n
    \r\n
    \r\n
    Exterior Material
    \r\n
    \r\n this.saveInputValue(\"exteriorMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"exteriorMaterialOptions\")}\r\n \r\n {this.getValidationError(\"exteriorMaterial\")}\r\n
    \r\n
    \r\n\r\n {displayFields.showExteriorMaterialPaintColor ? (\r\n
    \r\n
    Exterior Material Paint Color
    \r\n
    \r\n this.updateTextboxValue(\"exteriorMaterialPaintColor\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"exteriorMaterialPaintColor\", event.currentTarget.value)}\r\n />\r\n\r\n {this.getValidationError(\"exteriorMaterialPaintColor\")}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Mounting Type
    \r\n
    \r\n this.saveInputValue(\"mountingType\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"mountingTypeOptions\")}\r\n \r\n {this.getValidationError(\"mountingType\")}\r\n
    \r\n
    \r\n\r\n {displayFields.showCurbProvidecBy ? (\r\n
    \r\n
    Curb Provided By
    \r\n
    \r\n this.saveInputValue(\"curbProvidedBy\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"curbProvidedByOptions\")}\r\n \r\n {this.getValidationError(\"curbProvidedBy\")}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Casing Wall Thickness
    \r\n
    \r\n this.saveInputValue(\"casingWallThickness\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"casingWallThicknessOptions\")}\r\n \r\n {this.getValidationError(\"casingWallThickness\")}\r\n
    \r\n
    \r\n\r\n {displayFields.showCurbHeight ? (\r\n
    \r\n
    Curb Height
    \r\n
    \r\n this.updateTextboxValue(\"curbHeight\", event.currentTarget.value)}\r\n onBlur={(event) => this.saveTextboxValue(\"curbHeight\", event.currentTarget.value)}\r\n />\r\n
    \r\n
    {this.getValidationError(\"curbHeight\")}
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Shipping Shrink Wrap
    \r\n
    \r\n this.saveInputValue(\"shippingShrinkWrap\", event.currentTarget.checked.toString())}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n // reduxUnitCabinet: state.reduxUnitCabinet,\r\n // reduxValidation: state.reduxValidation\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Exterior);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n //reduxUnitCabinet: UnitCabinetUI;\r\n componentData: any;\r\n}\r\n\r\n// local state\r\ninterface IState {\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass Interior extends React.Component {\r\n public state: IState = {\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.fineTuneInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn\"t changed, don\"t call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateUnitCabinet\", projectId, unitId, fieldName, newValue, \"FineTuneInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n //const reduxUnitCabinet = this.props.reduxUnitCabinet;\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n //let toolTipDisplay = reduxUnitCabinet.coolingOptionSelected && reduxUnitCabinet.humidifierManifoldSharesDrainPanWithCooling ? \"\" : \"app-display-none\";\r\n let toolTipDisplay = displayFields.coolingOptionSelected && savedValues.humidifierManifoldSharesDrainPanWithCooling ? \"\" : \"app-display-none\";\r\n\r\n return (\r\n
    \r\n
    \r\n\r\n
    Interior Cabinet Construction
    \r\n\r\n
    \r\n {/* {savedValues.interiorMaterial != null ? ( */}\r\n
    \r\n
    Wall Interior Material
    \r\n
    \r\n this.saveInputValue(\"interiorMaterial\", event.currentTarget.value)}\r\n disabled={displayFields.interiorMaterialDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"interiorMaterialOptions\")}\r\n \r\n {this.getValidationError(\"interiorMaterial\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.perforatedLiner != null ? ( */}\r\n
    \r\n
    Perforated Liner
    \r\n
    \r\n this.saveInputValue(\"perforatedLiner\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"perforatedLinerOptions\")}\r\n \r\n {this.getValidationError(\"perforatedLiner\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.floorConstruction != null ? ( */}\r\n
    \r\n
    Floor Construction Type
    \r\n
    \r\n this.saveInputValue(\"floorConstruction\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"floorConstructionOptions\")}\r\n \r\n {this.getValidationError(\"floorConstruction\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.floorMaterial != null ? ( */}\r\n
    \r\n
    Floor Material
    \r\n
    \r\n this.saveInputValue(\"floorMaterial\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"floorMaterialOptions\")}\r\n \r\n {this.getValidationError(\"floorMaterial\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {displayFields.showSensiblePlateDrainPanMaterial ? (\r\n
    \r\n
    Sensible Plate Drain Pan Material
    \r\n
    \r\n this.saveInputValue(\"sensiblePlateDrainPanMaterial\", event.currentTarget.value)}\r\n disabled={displayFields.sensiblePlateDrainPanMaterialDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"sensiblePlateDrainPanMaterialOptions\")}\r\n \r\n {this.getValidationError(\"sensiblePlateDrainPanMaterial\")}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* {displayFields.coolingOptionSelected || displayFields.humidifierManifoldSharesDrainPanWithCooling ? ( */}\r\n {displayFields.showCoolingCoilDrainPanMaterial ? (\r\n
    \r\n
    Cooling Coil Drain Pan Material
    \r\n
    \r\n this.saveInputValue(\"coolingCoilDrainPanMaterial\", event.currentTarget.value)}\r\n disabled={displayFields.coolingCoilDrainPanMaterialDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"coolingCoilDrainPanMaterialOptions\")}\r\n \r\n {this.getValidationError(\"coolingCoilDrainPanMaterial\")}\r\n
    \r\n Humidifier Manifold and Cooling Coil share a drain pan\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {/* {displayFields.hasHumidifierManifold && !displayFields.humidifierManifoldSharesDrainPanWithCooling ? ( */}\r\n {displayFields.showHumidifierManifoldDrainPanMaterial ? (\r\n
    \r\n
    Humidifier Manifold Drain Pan Material
    \r\n
    \r\n this.saveInputValue(\"humidifierManifoldDrainPanMaterial\", event.currentTarget.value)}\r\n disabled={displayFields.humidifierManifoldDrainPanMaterialDisabled}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"humidifierManifoldDrainPanMaterialOptions\")}\r\n \r\n {this.getValidationError(\"humidifierManifoldDrainPanMaterial\")}\r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    Floor Drains
    \r\n
    \r\n this.saveInputValue(\"FloorDrainsInletAndMixingBoxSections\", event.currentTarget.checked.toString())}\r\n />\r\n
    Inlet/mixing box sections
    \r\n
    \r\n\r\n
    \r\n this.saveInputValue(\"FloorDrainsOutletSections\", event.currentTarget.checked.toString())}\r\n />\r\n
    Outlet sections
    \r\n
    \r\n \r\n {displayFields.showWSHPVestibuleSections ? \r\n
    \r\n this.saveInputValue(\"FloorDrainsWshpVestibuleSection\", event.currentTarget.checked.toString())}\r\n />\r\n
    WSHP Vestibule section
    \r\n
    \r\n : null}\r\n\r\n
    \r\n this.saveInputValue(\"FloorDrainsAllSections\", event.currentTarget.checked.toString())}\r\n />\r\n
    All sections
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxUnitCabinet: state.reduxUnitCabinet\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Interior);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../../redux/actions\";\r\nimport { updateInputField } from \"../../../api-calls/readApiService\";\r\nimport {\r\n getValidationError,\r\n getChecked,\r\n getSelectBoxOptions,\r\n getInputCSS,\r\n checkForErrors,\r\n getFilteredValidationErrors,\r\n getNewDropdownList,\r\n getNewValidationErrorsList\r\n} from \"../../../utilities/pageUtils\";\r\nimport { isEmptyObject } from \"../../../utilities/helpers\";\r\nimport \"../../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n //reduxUnitCabinet: UnitCabinetUI;\r\n componentData: any;\r\n}\r\n\r\n// local state\r\ninterface IState {\r\n doorLengthWarningShown: boolean;\r\n userInputs: any;\r\n displayFields: any;\r\n dropdownOptions: any[];\r\n validationErrors: any[];\r\n lastUpdatedTextbox: string;\r\n}\r\n\r\nclass Doors extends React.Component {\r\n public state: IState = {\r\n doorLengthWarningShown: false,\r\n userInputs: null,\r\n displayFields: null,\r\n dropdownOptions: [],\r\n validationErrors: [],\r\n lastUpdatedTextbox: \"\"\r\n };\r\n\r\n async componentDidMount() {\r\n const componentData = this.props.componentData;\r\n if (!isEmptyObject(componentData)) {\r\n this.setState({\r\n userInputs: componentData.uiDataContainer.fineTuneInputs,\r\n displayFields: componentData.uiDataContainer.displayFields,\r\n dropdownOptions: componentData.dropdownOptions,\r\n validationErrors: componentData.validationErrors\r\n });\r\n }\r\n }\r\n\r\n //componentDidMount() {\r\n //Show door length warning if applicable when page loads.\r\n // if (this.props.reduxUnitCabinet.doorLengthWarning){\r\n // this.showDoorLengthWarning(this.props.reduxUnitCabinet.doorLengthWarning);\r\n // this.setState({doorLengthWarningShown:true});\r\n // }\r\n //}\r\n componentDidUpdate(prevProps: any) {\r\n //If door length warning changed and a warning exists.\r\n // if (this.props.reduxUnitCabinet.doorLengthWarning !== prevProps.reduxUnitCabinet.doorLengthWarning &&\r\n // this.props.reduxUnitCabinet.doorLengthWarning) {\r\n // //If we haven\"t already shown the warning, then show it.\r\n // if (this.state.doorLengthWarningShown === false){\r\n // this.showDoorLengthWarning(this.props.reduxUnitCabinet.doorLengthWarning);\r\n // this.setState({doorLengthWarningShown:true});\r\n // }\r\n // }\r\n // //If we\"ve shown the warning already and the warning no longer exists, then remove the notification.\r\n // else if (this.state.doorLengthWarningShown == true && !this.props.reduxUnitCabinet.doorLengthWarning) {\r\n // removeNotification(\"unitCabinetDoorLength\");\r\n // this.setState({doorLengthWarningShown:false});\r\n // }\r\n }\r\n componentWillUnmount() {\r\n //removeNotification(\"unitCabinetDoorLength\");\r\n }\r\n\r\n //This function gets called on every keystroke in a textbox.\r\n public async updateTextboxValue(fieldName: string, newValue: string) {\r\n const newState = Object.assign({}, this.state.userInputs, { [fieldName]: newValue });\r\n this.setState({ userInputs: newState, lastUpdatedTextbox: fieldName });\r\n }\r\n\r\n //This gets called by textbox onBlur events\r\n public async saveTextboxValue(fieldName: string, newValue: string) {\r\n //If field value hasn\"t changed, don\"t call the server\r\n if (this.state.lastUpdatedTextbox !== fieldName) {\r\n return;\r\n }\r\n this.saveInputValue(fieldName, newValue);\r\n }\r\n\r\n //Save new value to redis and DB\r\n public async saveInputValue(fieldName: string, newValue: string) {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.removeValidationError(fieldName);\r\n let result = await updateInputField(\"updateUnitCabinet\", projectId, unitId, fieldName, newValue, \"FineTuneInputs\");\r\n\r\n if (result.success) {\r\n //If there are any errors in the response, add them to state\r\n if (result.data.validationErrors != null) {\r\n this.addValidationErrors(result.data.validationErrors);\r\n }\r\n\r\n //If there are any dropdownLists present in the response, then update those in state\r\n if (result.data.dropdownOptions != null) {\r\n this.updateDropdowns(result.data.dropdownOptions);\r\n }\r\n\r\n //If uiDataContainer was updated with new values, then update it in state\r\n if (result.data.uiDataContainer != null) {\r\n this.setState({\r\n userInputs: result.data.uiDataContainer.fineTuneInputs,\r\n displayFields: result.data.uiDataContainer.displayFields\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Check for errors on this textbox/selectbox, and return the appropriate CSS className\r\n public getCSS(fieldName: string, type: string) {\r\n return getInputCSS(this.state.validationErrors, fieldName, type);\r\n }\r\n\r\n //Update dropdowns with new options from the server\r\n public updateDropdowns(newDropdownOptions: any) {\r\n let newList = getNewDropdownList(this.state.dropdownOptions, newDropdownOptions);\r\n this.setState({ dropdownOptions: newList });\r\n }\r\n\r\n //Add any validation errors we got from the server to state\r\n public addValidationErrors(validationErrors: any[]) {\r\n let newList = getNewValidationErrorsList(this.state.validationErrors, validationErrors);\r\n this.setState({ validationErrors: newList });\r\n }\r\n\r\n public getValidationError(fieldName: string) {\r\n //Call the validation method from pageUtils\r\n return getValidationError(this.state.validationErrors, fieldName, \"validation-err-right\");\r\n }\r\n\r\n //Whenever we update a field, remove any previous error for that field\r\n //Also reset the lastUpdatedTextbox in state\r\n public removeValidationError(fieldName: string) {\r\n let newArray = getFilteredValidationErrors(this.state.validationErrors, fieldName);\r\n this.setState({ validationErrors: newArray, lastUpdatedTextbox: \"\" });\r\n }\r\n //------------------------------------------------------------------------------------------\r\n public render() {\r\n //const reduxUnitCabinet = this.props.reduxUnitCabinet;\r\n const savedValues = this.state.userInputs;\r\n const displayFields = this.state.displayFields;\r\n\r\n if (!savedValues) {\r\n return null;\r\n }\r\n\r\n //Window Type selection deactivated and grayed out if \"Window Inclusion\" is set to \"None\".\r\n const disableWindowSelection = savedValues.windowInclusion === \"0\" ? true : false;\r\n\r\n return (\r\n
    \r\n
    \r\n\r\n
    Doors
    \r\n\r\n
    \r\n {/* {reduxUnitCabinet.inwardSwinging ? (\r\n
    \r\n
    Inward Swinging
    \r\n
    \r\n this.saveSelectBoxInput(\"inwardSwinging\", event)}\r\n >\r\n {this.getSelectOptions(\"inwardSwinging\")}\r\n \r\n {this.getValidationErrors(\"inwardSwinging\")}\r\n
    \r\n
    \r\n ) : null} */}\r\n\r\n {/* {savedValues.thermalBreak != null ? ( */}\r\n
    \r\n
    Thermal Break
    \r\n
    \r\n this.saveInputValue(\"thermalBreak\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"thermalBreakOptions\")}\r\n \r\n {this.getValidationError(\"thermalBreak\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.windowInclusion != null ? ( */}\r\n
    \r\n
    Window Inclusion
    \r\n
    \r\n this.saveInputValue(\"windowInclusion\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"windowInclusionOptions\")}\r\n \r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.window != null ? ( */}\r\n
    \r\n
    Window Type
    \r\n
    \r\n this.saveInputValue(\"window\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"windowTypeOptions\")}\r\n \r\n {this.getValidationError(\"window\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.pressureReliefLatch != null ? ( */}\r\n
    \r\n
    Pressure Relief Latch
    \r\n
    \r\n this.saveInputValue(\"pressureReliefLatch\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"pressureReliefLatchOptions\")}\r\n \r\n {this.getValidationError(\"pressureReliefLatch\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.interiorHandles != null ? ( */}\r\n
    \r\n
    Interior Handles
    \r\n
    \r\n this.saveInputValue(\"interiorHandles\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"interiorHandlesOptions\")}\r\n \r\n {this.getValidationError(\"interiorHandles\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.tieBack != null ? ( */}\r\n
    \r\n
    Tie-Back
    \r\n
    \r\n this.saveInputValue(\"tieBack\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"tieBackOptions\")}\r\n \r\n {this.getValidationError(\"tieBack\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.lock != null ? ( */}\r\n
    \r\n
    Lock
    \r\n
    \r\n \r\n {this.getValidationError(\"lock\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.doorHandleInterlock != null ? ( */}\r\n
    \r\n
    Door Handle Interlock
    \r\n
    \r\n this.saveInputValue(\"doorHandleInterlock\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"doorHandleInterlockOptions\")}\r\n \r\n {this.getValidationError(\"doorHandleInterlock\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n\r\n {/* {savedValues.testPort != null ? ( */}\r\n
    \r\n
    Test Port
    \r\n
    \r\n this.saveInputValue(\"testPort\", event.currentTarget.value)}\r\n >\r\n {getSelectBoxOptions(this.state.dropdownOptions, \"testPortOptions\")}\r\n \r\n {this.getValidationError(\"testPort\")}\r\n
    \r\n
    \r\n {/* ) : null} */}\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n showDoorLengthWarning(warning: any) {\r\n const notification = {\r\n id: \"unitCabinetDoorLength\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
    {warning}
    \r\n };\r\n //addNotification(notification);\r\n }\r\n}\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxUnitCabinet: state.reduxUnitCabinet\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Doors);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { getUnitCabinetInputValues } from \"../../api-calls/readApiService\";\r\nimport { isEmptyObject } from \"../../utilities/helpers\";\r\nimport Exterior from \"./Cabinet/Exterior\";\r\nimport Interior from \"./Cabinet/Interior\";\r\nimport Doors from \"./Cabinet/Doors\";\r\nimport \"../../css/Accordions.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n componentData: any;\r\n}\r\n\r\nclass UnitCabinet extends React.Component {\r\n public state: IState = {\r\n componentData: null\r\n };\r\n\r\n //async componentDidMount() {\r\n //If both a cooling coil and humidifier manifold are selected, it's possible they could share a drain pan. If they do share a drain pan,\r\n //set humidifierManifoldDrainPanMaterial to 0 (none) because the cooling drain pan will be shared. There is no UI trigger for the calc to\r\n //determine drain pan sharing, so this workaround is put in place as we can't set it's default value in the backend using the \"BeforeModify\" framework.\r\n //If a change is made in which the calc determines that they no longer share a drain pan, then set the humidifierManifoldDrainPanMaterial\r\n //to it's default of 1 (201 Stainless steel)\r\n // await getUnitCabinet(this.props.match.params);\r\n // const { projectId, unitId } = this.props.match.params;\r\n // if (this.props.reduxUnitCabinet.humidifierManifoldSharesDrainPanWithCooling) {\r\n // const response = await modifyServerProperty(this.props.reduxUnitCabinet, \"humidifierManifoldDrainPanMaterial\", 0, projectId, unitId);\r\n // await getUnitCabinet(this.props.match.params);\r\n // }\r\n // if (\r\n // !this.props.reduxUnitCabinet.humidifierManifoldSharesDrainPanWithCooling &&\r\n // this.props.reduxUnitCabinet.humidifierManifoldDrainPanMaterial?.value === 0 &&\r\n // this.props.reduxUnitCabinet.hasHumidifierManifold\r\n // ) {\r\n // const response = await modifyServerProperty(this.props.reduxUnitCabinet, \"humidifierManifoldDrainPanMaterial\", 1, projectId, unitId);\r\n // await getUnitCabinet(this.props.match.params);\r\n // }\r\n //}\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const result = await getUnitCabinetInputValues(projectId, unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.hasError){\r\n const notification = {\r\n id: \"cabinetInputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetUnitCabinetInputValues {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (!isEmptyObject(result.uiDataContainer)) {\r\n this.setState({\r\n componentData: result\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n const componentData = this.state.componentData;\r\n\r\n if (isEmptyObject(componentData)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n {/*
    Copy Values From:
    */}\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UnitCabinet);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Route, match } from \"react-router-dom\";\r\nimport SpecSubMenu from \"./Menus/SpecSubMenu\";\r\nimport Controls from \"./SelectOptions/Controls\";\r\nimport Electrical from \"./SelectOptions/Electrical\";\r\nimport Construction from \"./SelectOptions/Construction\";\r\nimport Warranties from \"./SelectOptions/Warranties\";\r\nimport UnitCabinet from \"./SelectOptions/UnitCabinet\";\r\nimport { mapDispatchToProps } from \"../redux/actions\";\r\nimport { checkIsProEditMode } from \"../utilities/specmateProHelpers\";\r\nimport \"../css/UnitSelection.scss\";\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass SpecItems extends React.Component {\r\n componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 5 } });\r\n }\r\n\r\n async componentDidUpdate() {\r\n const { projectId, unitId } = this.props.match.params;\r\n let isProEditMode = await checkIsProEditMode(projectId, unitId);\r\n\r\n if (isProEditMode) {\r\n this.props.history.push(\"/project\"); //redirect to project page\r\n }\r\n }\r\n\r\n public render() {\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(SpecItems);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter, match } from \"react-router-dom\"; //needed for 'location' object and 'match.params'\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { Link } from \"react-router-dom\";\r\nimport \"../../css/DesignSubMenu.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n location: any;\r\n match: match;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass OutputsSubMenu extends React.Component {\r\n private createMenuLink(urlFragment: string, label: string) {\r\n //Make this the active(underlined) link if it matches the current route\r\n const isActive = this.isCurrentRoute(urlFragment);\r\n const baseUrl = this.getBaseUrl();\r\n return (\r\n \r\n
    {label}
    \r\n \r\n );\r\n }\r\n private isCurrentRoute(urlFragment: string) {\r\n return this.props.location.pathname.includes(urlFragment);\r\n }\r\n\r\n private getBaseUrl() {\r\n const routeParams = this.props.match.params;\r\n return \"/pid/\" + routeParams.projectId + \"/uid/\" + routeParams.unitId;\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n {this.createMenuLink(\"/outputs/pdfoutputs\", \"Output Documents\")}\r\n {this.createMenuLink(\"/outputs/cadoutputs\", \"CAD Files\")}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(OutputsSubMenu));\r\n","import { store } from '../redux/store';\r\nimport { displayError} from '../api-utilities/api-calls';\r\nimport {getAuthToken} from '../api-calls/projectDataService';\r\n//This file contains calls to the LOWRY Backend DataController\r\n\r\nexport async function generateSpecMateDocuments(projectId:number, unitIds:Array, submittalCoverSheet:boolean, \r\n performanceDataSummary:boolean, unitDrawing:boolean, salesGuidSpecification:boolean, salesScope:boolean, versionTemplate:string){\r\n\r\n const apibase = process.env.REACT_APP_CLIENT_API;\r\n const token = await getAuthToken();\r\n let response;\r\n const specMateDocumentsRequest = {\r\n ProjectID: projectId,\r\n UnitIDs: unitIds,\r\n SubmittalCoverSheet: submittalCoverSheet,\r\n PerformanceDataSummary: performanceDataSummary,\r\n UnitDrawing: unitDrawing,\r\n SalesGuidSpecification: salesGuidSpecification,\r\n SalesScope: salesScope,\r\n VersionTemplate: versionTemplate\r\n };\r\n try {\r\n const result = await fetch(apibase + '/dataapi/generatespecmatedocuments', {\r\n method: 'post',\r\n body: JSON.stringify(specMateDocumentsRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n response = {\r\n //Handles the call from pdf Service\r\n success: result.status === 200 ? true:false,\r\n data: result.status === 200 ? await result.blob() : await result.json()\r\n };\r\n \r\n //If not success then display error.\r\n if(!response.success){\r\n let errorObj = {\r\n status: result.status,\r\n message: response.data.pdfResponse.errorMessage\r\n }\r\n if (response.data.pdfResponse.errorMessage.includes(\"A task was canceled\")){\r\n //The ui will handle this response by popping up a toast notification.\r\n return response;\r\n }\r\n displayError(errorObj, \"generatespecmatedocuments\");\r\n return;\r\n }\r\n return response;\r\n }\r\n catch (error){\r\n //The ui will handle any caught error by popping up a toast notification.\r\n response = {\r\n success: false,\r\n data: \"show try again\"\r\n };\r\n return response;\r\n }\r\n}\r\n\r\n\r\nexport async function submitPdfProcessingRequest(pdfProcessingRequest:any){\r\n\r\n const apibase = process.env.REACT_APP_CLIENT_API;\r\n const token = await getAuthToken();\r\n let response;\r\n\r\n try {\r\n const result = await fetch(apibase + '/dataapi/addPdfProcessingRequest', {\r\n method: 'post',\r\n body: JSON.stringify(pdfProcessingRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n response = {\r\n //Handles the call from pdf Service\r\n success: result.status === 200 ? true:false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n \r\n //If not success then display error.\r\n if(!response.success){\r\n let errorObj = {\r\n status: result.status,\r\n message: response.data.errorMessage\r\n }\r\n displayError(errorObj, \"submitPdfProcessingRequest\");\r\n return;\r\n }\r\n return response;\r\n }\r\n catch (error){\r\n displayError(error, 'submitPdfProcessingRequest');\r\n }\r\n}\r\n\r\n\r\n\r\nexport async function getPdfProcessingRecords(projectId:any) {\r\n const apibase = process.env.REACT_APP_CLIENT_API;\r\n const auth = store.getState().reduxAuth;\r\n const token = await getAuthToken();\r\n let response;\r\n try {\r\n const result = await fetch(apibase + '/dataapi/getPdfProcessingRecords/' + projectId, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n response = {\r\n //Handles the call from pdf Service\r\n success: result.status === 200 ? true:false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n //If not success then display error.\r\n if(!response.success){\r\n let errorObj = {\r\n status: result.status,\r\n message: response.data.errorMessage\r\n }\r\n displayError(errorObj, \"getPdfProcessingRecords\");\r\n return;\r\n }\r\n return response;\r\n }\r\n catch (error){\r\n displayError(error, 'getPdfProcessingRecords');\r\n }\r\n }\r\n\r\n\r\n","import * as React from \"react\";\r\nimport { store } from \"../../redux/store\";\r\nimport { connect } from \"react-redux\";\r\nimport { match } from \"react-router-dom\"; //needed for 'location' object and 'match.params'\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { submitPdfProcessingRequest, getPdfProcessingRecords } from \"../../api-calls/pdfGeneratorService\";\r\nimport \"../../css/Output.scss\";\r\nimport { getOutputDocumentsData } from \"../../api-calls/projectDataService\";\r\nimport { isEmptyArray, sqlToJsDateTime } from \"../../utilities/helpers\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n location: any;\r\n match: match;\r\n reduxMenus: any;\r\n reduxTempsAndSystem: any;\r\n history: any;\r\n reduxOutputDocumentsInfo: any;\r\n reduxProjectManagement: any;\r\n}\r\n// local state\r\ninterface IState {\r\n unitDrawing: boolean;\r\n salesGuidSpecification: boolean;\r\n quote: boolean;\r\n salesScope: boolean;\r\n units: any;\r\n docSelectAll: boolean;\r\n unitSelectAll: boolean;\r\n versionTemplate: string;\r\n submittalCoverSheet: boolean;\r\n poolDesignSummary: boolean;\r\n performanceDataSummary: boolean;\r\n airflowSchematic: boolean;\r\n sensorSchematic: boolean;\r\n powerElectricalSchematic: boolean;\r\n waterPipingSchematic: boolean;\r\n drainTrapDetail: boolean;\r\n submittalScope: boolean;\r\n warranty: boolean;\r\n termsAndConditions: boolean;\r\n generateDocsClicked: boolean;\r\n unitSelected: any;\r\n selectedUnitId: any;\r\n sequenceGenerator: boolean;\r\n baseDetail: boolean;\r\n curbDetail: boolean;\r\n componentsInstalledByOthers: boolean;\r\n designRadioButton: boolean;\r\n quoteRadioButton: boolean;\r\n submittalRadioButton: boolean;\r\n hasPool: boolean;\r\n doesAnyUnitHaveWshp: boolean;\r\n}\r\n\r\nclass Outputs extends React.Component {\r\n timer: any; //define a timer variable for our SetTimeout\r\n\r\n public state: IState = {\r\n versionTemplate: \"Version-3-Template\",\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: false,\r\n unitDrawing: false,\r\n salesGuidSpecification: false,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: false,\r\n sensorSchematic: false,\r\n powerElectricalSchematic: false,\r\n waterPipingSchematic: false,\r\n drainTrapDetail: false,\r\n submittalScope: false,\r\n warranty: false,\r\n termsAndConditions: false,\r\n units: null,\r\n docSelectAll: false,\r\n unitSelectAll: false,\r\n generateDocsClicked: false,\r\n unitSelected: null,\r\n selectedUnitId: null,\r\n sequenceGenerator: false,\r\n baseDetail: false,\r\n curbDetail: false,\r\n componentsInstalledByOthers: false,\r\n designRadioButton: false,\r\n quoteRadioButton: false,\r\n submittalRadioButton: false,\r\n hasPool: false,\r\n doesAnyUnitHaveWshp: false\r\n };\r\n async componentDidMount() {\r\n // this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 6 } });\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n const response = await getOutputDocumentsData(`proj-${projectId}`);\r\n if (response.hasError) {\r\n const notification = {\r\n id: \"outputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetOutputDocumentsData {response.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n } else {\r\n let unitList = response.outputUnits;\r\n let hasPool = this.checkForPool(unitList);\r\n let doesAnyUnitHaveWshp = this.checkIfAnyUnitHasWshp(unitList);\r\n\r\n this.setState({ units: unitList, hasPool: hasPool, doesAnyUnitHaveWshp : doesAnyUnitHaveWshp });\r\n\r\n unitList = null;\r\n removeNotification(\"ataskwascancelled\");\r\n //TODO: somebody put a comment here to indicate why this is needed\r\n //await getTempsAndSystemInputs(true, this.props.match.params);\r\n\r\n //TODO: somebody put a comment here to indicate why this is needed\r\n //const result = await getConfigInputsAllValues(projectId, unitId);\r\n\r\n //TODO: somebody put a comment here to indicate why this is needed\r\n // this.checkForWinterDryBulbError(\r\n // result.unitBasicDetails.unitBasicDetailsDisplayFields,\r\n // result.unitBasicDetails.unitBasicDetailsDTO.energyRecoveryDeviceType\r\n // );\r\n\r\n let dtos = response.pdfProcessingRecords;\r\n let activeRecords = dtos.filter(\r\n (item: any) => item.processingStatusName.toLowerCase() !== \"completed\" && item.processingStatusName.toLowerCase() !== \"failed\"\r\n );\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", {\r\n pdfRecords: dtos,\r\n activeProcessingRecordsCount: activeRecords.length,\r\n pollForUpdates: activeRecords.length > 0 ? true : false\r\n });\r\n\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", { isOutputPage: true, showDocsReadyNotificationIcon: false });\r\n }\r\n }\r\n\r\n async componentDidUpdate(prevProps: any) {\r\n //If the user does a \"save\" on an unsaved unit when on the outputs screen, update the current unit so it can be selected for output docs.\r\n //Don't update units if generate docs has been clicked because that will remove the selections for the checkboxes for the units selected.\r\n if (\r\n prevProps.reduxMenus.enableSave !== this.props.reduxMenus.enableSave &&\r\n this.props.reduxMenus.enableSave === true &&\r\n this.state.generateDocsClicked === false\r\n ) {\r\n const { projectId, unitId } = this.props.match.params;\r\n const response = await getOutputDocumentsData(`proj-${projectId}`);\r\n if (response.hasError) {\r\n const notification = {\r\n id: \"outputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetOutputDocumentsData {response.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n } else {\r\n let unitList = response.outputUnits;\r\n this.setState({ units: unitList });\r\n unitList = null;\r\n }\r\n }\r\n }\r\n\r\n private checkForPool(unitList: any) {\r\n let pools = unitList.find((item: any) => item.unitType.toLowerCase() === \"pool\");\r\n if (pools) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private checkIfAnyUnitHasWshp(unitList: any){\r\n let unitsWithWSHP = unitList.find((item: any) => item.doesUnitHaveWshp === true);\r\n if (unitsWithWSHP) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //TODO: somebody put a comment here to indicate why this is needed on this page\r\n private checkForWinterDryBulbError(displayFields: any, energyRecoveryDeviceType: any) {\r\n //JIRA-7292\r\n //If Energy Recovery Device is set to Heat Wheel (input made on Configuration screen) and the entered value for the Winter Dry Bulb field within the Outside Air\r\n //Conditions section is below -20F, a warning shall be provided that says \"Preheat recommended to avoid wheel frosting.\"\r\n if (displayFields.showEnergyRecoveryDevice) {\r\n let winterDryBulb = this.props.reduxTempsAndSystem.outsideWinterDryBulb?.value;\r\n if (!winterDryBulb && winterDryBulb != 0) {\r\n return;\r\n }\r\n let message = \"\";\r\n if (energyRecoveryDeviceType === 1) {\r\n message = \"Preheat recommended to avoid plate frosting.\";\r\n } else if (energyRecoveryDeviceType === 2) {\r\n message = \"Preheat recommended to avoid wheel frosting.\";\r\n } else {\r\n message = \"Please select an energy recovery device.\";\r\n }\r\n if (this.props.reduxTempsAndSystem.preHeat?.value === 0 && winterDryBulb < -20) {\r\n const notification = {\r\n id: \"winterdrybulb\",\r\n notificationType: \"warning\",\r\n title: \"Warning\",\r\n content:
    {message}
    \r\n };\r\n addNotification(notification);\r\n } else {\r\n removeNotification(\"winterdrybulb\");\r\n }\r\n }\r\n }\r\n\r\n public render() {\r\n //let showTemplateChoice = !this.state.salesGuidSpecification ? 'app-display-none' : '';\r\n let Disabled = this.DisableGenerateButton() ? \"app-outputs-generate-disable\" : \"\";\r\n let docSelectText = this.state.docSelectAll ? \"Clear All\" : \"Select All\";\r\n let unitSelectText = this.state.unitSelectAll ? \"Clear All\" : \"Select All\";\r\n return (\r\n
    \r\n {/*
    Generate Output Documents
    */}\r\n\r\n
    \r\n {/*================================= Left Column ================================ */}\r\n
    \r\n
    Document Package Type
    \r\n
    \r\n
    Design
    \r\n this.DocumentPackageTypeRadioClick(\"design\")}\r\n onClick={() => this.DocumentPackageTypeRadioClick(\"design\")}\r\n />\r\n
    Quote
    \r\n this.DocumentPackageTypeRadioClick(\"quote\")}\r\n onClick={() => this.DocumentPackageTypeRadioClick(\"quote\")}\r\n />\r\n
    Submittal
    \r\n this.DocumentPackageTypeRadioClick(\"submittal\")}\r\n onClick={() => this.DocumentPackageTypeRadioClick(\"submittal\")}\r\n />\r\n
    \r\n
    Available Documents
    \r\n
    \r\n
    Document Selection
    \r\n this.SelectAllDocuments()}>\r\n {docSelectText}\r\n \r\n\r\n
    Quote
    \r\n this.setState({ quote: event.currentTarget.checked })} />\r\n\r\n
    Submittal Cover Sheet
    \r\n this.setState({ submittalCoverSheet: event.currentTarget.checked })}\r\n />\r\n\r\n {this.state.hasPool === true ? (\r\n <>\r\n
    Pool Design Summary
    \r\n this.setState({ poolDesignSummary: event.currentTarget.checked })}\r\n />\r\n \r\n ) : null}\r\n\r\n
    Performance Data Summary
    \r\n this.setState({ performanceDataSummary: event.currentTarget.checked })}\r\n />\r\n\r\n
    Unit Drawing
    \r\n this.setState({ unitDrawing: event.currentTarget.checked })} />\r\n
    Sales Guide Specification
    \r\n this.setState({ salesGuidSpecification: event.currentTarget.checked })}\r\n />\r\n\r\n {/*
    \r\n {\r\n this.setState({ versionTemplate: event.currentTarget.value });\r\n }}\r\n >\r\n \r\n \r\n \r\n
    */}\r\n\r\n
    Sales Scope
    \r\n this.setState({ salesScope: event.currentTarget.checked })} />\r\n\r\n
    Airflow Schematic
    \r\n this.setState({ airflowSchematic: event.currentTarget.checked })}\r\n />\r\n\r\n
    Drain Connection/Trap Detail
    \r\n this.setState({ drainTrapDetail: event.currentTarget.checked })} />\r\n\r\n
    Base Detail
    \r\n this.setState({ baseDetail: event.currentTarget.checked })} />\r\n\r\n
    Curb Detail
    \r\n this.setState({ curbDetail: event.currentTarget.checked })} />\r\n\r\n
    Sensor Schematic
    \r\n this.setState({ sensorSchematic: event.currentTarget.checked })} />\r\n\r\n
    Sequence of Operation
    \r\n this.setState({ sequenceGenerator: event.currentTarget.checked })}\r\n />\r\n\r\n
    Power Electrical Schematic
    \r\n this.setState({ powerElectricalSchematic: event.currentTarget.checked })}\r\n />\r\n {this.state.doesAnyUnitHaveWshp === true ? (\r\n <>\r\n
    Water Piping Schematic
    \r\n this.setState({ waterPipingSchematic: event.currentTarget.checked })}\r\n />\r\n \r\n ) : null}\r\n
    Scope
    \r\n this.setState({ submittalScope: event.currentTarget.checked })} />\r\n\r\n
    Components Shipped Loose
    \r\n this.setState({ componentsInstalledByOthers: event.currentTarget.checked })}\r\n />\r\n\r\n
    Innovent Standard Warranty
    \r\n this.setState({ warranty: event.currentTarget.checked })} />\r\n\r\n
    Terms and Conditions
    \r\n this.setState({ termsAndConditions: event.currentTarget.checked })}\r\n />\r\n\r\n
    \r\n
    Unit Selection
    \r\n
    \r\n\r\n
    Generate Docs For
    \r\n this.SelectAllUnits()}>\r\n {unitSelectText}\r\n \r\n {this.buildUnitCheckboxes()}\r\n\r\n
    \r\n
    this.SubmitProcessingRequest()}>Generate Document Package
    \r\n
    \r\n
    \r\n\r\n {/*====================================== Right Column ================================ */}\r\n
    \r\n
    \r\n
    this.getListOfPdfRecords()}>\r\n Output Documents\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Status
    \r\n {/*
    ProjectId
    */}\r\n
    UnitIds
    \r\n
    Unit Tags
    \r\n
    Doc Type
    \r\n
    Created
    \r\n
    Download
    \r\n
    \r\n\r\n {this.getPdfRows()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n //========================================= Methods for PDF Documents Table ============================================\r\n //======================================================================================================================\r\n\r\n //Build table rows from the project list in state\r\n private getPdfRows() {\r\n const list = this.props.reduxOutputDocumentsInfo.pdfRecords;\r\n\r\n if (!isEmptyArray(list)) {\r\n return list.map((item: any, index: number) => (\r\n
    \r\n
    {this.getPdfStatus(item.processingStatusName)}
    \r\n {/*
    {item.projectId}
    */}\r\n
    {item.unitIdListString}
    \r\n
    {item.unitTagsListString}
    \r\n
    {item.documentType}
    \r\n
    {sqlToJsDateTime(item.createDate)}
    \r\n
    {item.errorMessage == null ? this.getPdfLink(item) : this.getPdfError(item.errorMessage)}
    \r\n
    \r\n ));\r\n } else {\r\n return
    No Results
    ;\r\n }\r\n }\r\n\r\n private getRowClassName(statusName: string) {\r\n if (statusName == \"Completed\") {\r\n return \"proj-tr\";\r\n }\r\n if (statusName == \"Failed\") {\r\n return \"proj-tr\";\r\n }\r\n return \"proj-tr-running\";\r\n }\r\n\r\n private getPdfLink(item: any) {\r\n if (item.processingStatusName == \"Completed\") {\r\n let url = item.pdfUrl;\r\n return (\r\n \r\n
    \r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private getPdfError(message: string) {\r\n return \"error\";\r\n }\r\n\r\n private getPdfStatus(statusName: string) {\r\n if (statusName == \"Completed\") {\r\n return
    {statusName}
    ;\r\n }\r\n if (statusName == \"Failed\") {\r\n return
    {statusName}
    ;\r\n }\r\n //For all statuses aside from Completed and Failed, show the progress bar\r\n return (\r\n
    \r\n
    \r\n
    {statusName}
    \r\n
    \r\n );\r\n }\r\n\r\n private async getListOfPdfRecords() {\r\n const routeParams = this.props.match.params;\r\n const projectId = routeParams.projectId;\r\n\r\n //Check if the stored projectId that we were last polling matches the project we're currently on\r\n let pollingProjectMatches = this.props.reduxOutputDocumentsInfo.projectId == projectId ? true : false;\r\n\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", {\r\n projectId: projectId\r\n });\r\n\r\n //If we're not currently polling, or not polling for the project we're actually on, then get processing records from DB\r\n if (this.props.reduxOutputDocumentsInfo.pollForUpdates === false || !pollingProjectMatches) {\r\n //console.log('GettingData From outputs page projectDataAPI');\r\n let response: any = await getPdfProcessingRecords(projectId);\r\n //console.log(response);\r\n\r\n if (!response.data.hasError) {\r\n //Check if any records are actively running (status not equal to completed or failed)\r\n let dtos = response.data.pdfProcessingDTOs;\r\n let activeRecords = dtos.filter(\r\n (item: any) => item.processingStatusName.toLowerCase() !== \"completed\" && item.processingStatusName.toLowerCase() !== \"failed\"\r\n );\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", {\r\n pdfRecords: dtos,\r\n activeProcessingRecordsCount: activeRecords.length,\r\n pollForUpdates: activeRecords.length > 0 ? true : false\r\n });\r\n } else {\r\n const notification = {\r\n id: \"outputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    GetPDFProcessingRecords {response.data.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n }\r\n }\r\n\r\n private async SubmitProcessingRequest() {\r\n const { projectId, unitId } = this.props.match.params;\r\n //await this.checkSave();\r\n //console.log('Saving completed....process PDF');\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n\r\n const routeParams = this.props.match.params;\r\n const auth = store.getState().reduxAuth;\r\n\r\n let unitIds: any = [];\r\n let unitTags: any = [];\r\n this.state.units.forEach((unit: any) => {\r\n if (unit.checked == true) {\r\n unitIds.push(unit.id);\r\n unitTags.push(unit.unitTag);\r\n }\r\n });\r\n\r\n const pdfProcessingRequest = {\r\n ProjectId: `proj-${projectId}`,\r\n UnitIds: unitIds,\r\n SubmittalCoverSheet: this.state.submittalCoverSheet,\r\n PoolDesignSummary: this.state.poolDesignSummary,\r\n PerformanceDataSummary: this.state.performanceDataSummary,\r\n UnitDrawing: this.state.unitDrawing,\r\n SalesGuidSpecification: this.state.salesGuidSpecification,\r\n Quote: this.state.quote,\r\n SalesScope: this.state.salesScope,\r\n GuideSpecVersionTemplate: this.state.versionTemplate,\r\n AirflowSchematic: this.state.airflowSchematic,\r\n SensorSchematic: this.state.sensorSchematic,\r\n DrainTrapDetail: this.state.drainTrapDetail,\r\n PowerElectricalSchematic: this.state.powerElectricalSchematic,\r\n WaterPipingSchematic: this.state.waterPipingSchematic,\r\n SubmittalScope: this.state.submittalScope,\r\n InnoventStandardWarranty: this.state.warranty,\r\n TermsAndConditions: this.state.termsAndConditions,\r\n SequenceGenerator: this.state.sequenceGenerator,\r\n BaseDetail: this.state.baseDetail,\r\n CurbDetail: this.state.curbDetail,\r\n ComponentsInstalledByOthers: this.state.componentsInstalledByOthers,\r\n IsDesignDocumentType: this.state.designRadioButton,\r\n IsQuoteDocumentType: this.state.quoteRadioButton,\r\n IsSubmittalDocumentType: this.state.submittalRadioButton,\r\n UnitTags: unitTags,\r\n State: this.props.reduxProjectManagement.state,\r\n PostalCode: auth.postalCode\r\n };\r\n\r\n //IMPORTANT: Clear out the current selections, and gray out the submit button.\r\n //This is to prevent the user from doubleClicking or clicking twice, adding multiple records.\r\n\r\n //this.ClearAllDocuments();\r\n //this.ClearAllUnitCheckboxes();\r\n\r\n //Call PDFToolsAPI to publish a processing request to ServiceBus\r\n // this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n let response: any = await submitPdfProcessingRequest(pdfProcessingRequest);\r\n if (response.data.hasError) {\r\n const notification = {\r\n id: \"outputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content: (\r\n
    \r\n SubmitPDFProcessingRequest {response.data.errorMessage !== null && response.data.errorMessage !== \"\"} ? {response.data.errorMessage} :{\" \"}\r\n {response.data.individualErrors}\r\n
    \r\n )\r\n };\r\n addNotification(notification);\r\n } else {\r\n let unitList = response.data.outputUnits;\r\n this.setState({ units: unitList });\r\n unitList = null;\r\n\r\n let dtos = response.data.pdfProcessingRecords;\r\n //start polling for updates\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", {\r\n pdfRecords: dtos,\r\n projectId: `proj-${projectId}`,\r\n pollForUpdates: true\r\n });\r\n }\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.ClearAllDocuments();\r\n this.ClearAllUnitCheckboxes();\r\n //reset the Document Type Radio buttons\r\n this.setState({\r\n designRadioButton: false,\r\n quoteRadioButton: false,\r\n submittalRadioButton: false\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", {\r\n pollForUpdates: true,\r\n activeProcessingRecordsCount: 0,\r\n showDocsReadyNotificationIcon: false,\r\n isOutputPage: false\r\n });\r\n }\r\n\r\n // private async checkSave() {\r\n // //If a save is not already running then save the unit before generating output docs.\r\n // if (this.props.reduxMenus.enableSave) {\r\n // //Save unit design each time the drawing button is selected unless a save is already in progress.\r\n // //console.log('Saving unit');\r\n // await this.SaveUnits();\r\n // } else {\r\n // //console.log('No need to save this unit');\r\n // }\r\n // }\r\n //Update needsFullSave property on units that were just saved.\r\n private updateSavedUnits(newlySavedUnitIds: any) {\r\n let units = [...this.state.units];\r\n newlySavedUnitIds.forEach((savedUnitId: number) => {\r\n let unitToUpdate = units.find((x) => x.id == savedUnitId);\r\n if (unitToUpdate) {\r\n unitToUpdate.needsFullSave = false;\r\n }\r\n });\r\n this.setState({ units: units });\r\n }\r\n\r\n //Save currently selected unit and put currentlySelectedUniId into state.savedUnits\r\n // private async SaveUnits() {\r\n // //Try and get parameters from the url\r\n // const match = matchPath(this.props.history.location.pathname, {\r\n // path: '/pid/:projectId/uid/:unitId',\r\n // exact: false,\r\n // strict: false\r\n // });\r\n // if (match) {\r\n // const { projectId } = match.params as any;\r\n\r\n // let unitIds: any = [];\r\n // //Get units to save.\r\n // this.state.units.forEach((unit: any) => {\r\n // if (unit.checked == true && unit.needsFullSave == true) {\r\n // unitIds.push(unit.unitId);\r\n // }\r\n // });\r\n // //unitIds.push(this.state.selectedUnitId);radio button\r\n\r\n // this.updateSavedUnits(unitIds);\r\n\r\n // //Save units to database.\r\n // await UpdateMultipleUnits(projectId, unitIds);\r\n // }\r\n // }\r\n\r\n private DisableGenerateButton() {\r\n let docChecked =\r\n this.state.submittalCoverSheet === true ||\r\n this.state.poolDesignSummary === true ||\r\n this.state.performanceDataSummary === true ||\r\n this.state.unitDrawing === true ||\r\n this.state.salesGuidSpecification === true ||\r\n this.state.quote === true ||\r\n this.state.salesScope === true ||\r\n this.state.airflowSchematic === true ||\r\n this.state.sensorSchematic === true ||\r\n this.state.drainTrapDetail === true ||\r\n this.state.powerElectricalSchematic === true ||\r\n this.state.waterPipingSchematic === true ||\r\n this.state.submittalScope === true ||\r\n this.state.warranty === true ||\r\n this.state.termsAndConditions === true ||\r\n this.state.sequenceGenerator === true ||\r\n this.state.baseDetail === true ||\r\n this.state.curbDetail === true ||\r\n this.state.componentsInstalledByOthers === true;\r\n\r\n let unitChecked = false;\r\n //Use with checkboxes.\r\n if (this.state.units) {\r\n this.state.units.forEach((unit: any) => {\r\n if (unit.checked == true) {\r\n unitChecked = true;\r\n }\r\n });\r\n }\r\n //let unitChecked = this.state.selectedUnitId !== null ? true : false;\r\n return !docChecked || !unitChecked;\r\n }\r\n\r\n private SelectAllDocuments() {\r\n if (this.state.docSelectAll) {\r\n this.ClearAllDocuments();\r\n return;\r\n } else {\r\n this.setState({\r\n submittalCoverSheet: true,\r\n poolDesignSummary: true,\r\n performanceDataSummary: true,\r\n unitDrawing: true,\r\n salesGuidSpecification: true,\r\n quote: true,\r\n salesScope: true,\r\n airflowSchematic: true,\r\n sensorSchematic: true,\r\n drainTrapDetail: true,\r\n powerElectricalSchematic: true,\r\n waterPipingSchematic: true,\r\n submittalScope: true,\r\n docSelectAll: true,\r\n warranty: true,\r\n termsAndConditions: true,\r\n sequenceGenerator: true,\r\n baseDetail: true,\r\n curbDetail: true,\r\n componentsInstalledByOthers: true\r\n });\r\n }\r\n }\r\n\r\n private ClearAllDocuments() {\r\n this.setState({\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: false,\r\n unitDrawing: false,\r\n salesGuidSpecification: false,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: false,\r\n sensorSchematic: false,\r\n drainTrapDetail: false,\r\n powerElectricalSchematic: false,\r\n waterPipingSchematic: false,\r\n submittalScope: false,\r\n docSelectAll: false,\r\n warranty: false,\r\n termsAndConditions: false,\r\n sequenceGenerator: false,\r\n baseDetail: false,\r\n curbDetail: false,\r\n componentsInstalledByOthers: false\r\n });\r\n }\r\n // private ClearUnitSelection() { radio button\r\n // this.setState({ selectedUnitId: null });\r\n // }\r\n //Use with checkboxes.\r\n private SelectAllUnits() {\r\n if (this.state.unitSelectAll) {\r\n this.ClearAllUnitCheckboxes();\r\n return;\r\n } else {\r\n let copyUnits = [...this.state.units];\r\n copyUnits.forEach((unit) => {\r\n if (!unit.isProEditMode) {\r\n unit.checked = true;\r\n }\r\n });\r\n\r\n this.setState({ units: copyUnits, unitSelectAll: true });\r\n }\r\n }\r\n //Use with checkboxes.\r\n private ClearAllUnitCheckboxes() {\r\n let copyUnits = [...this.state.units];\r\n copyUnits.forEach((unit) => {\r\n unit.checked = false;\r\n });\r\n\r\n this.setState({ units: copyUnits, unitSelectAll: false });\r\n }\r\n //This is for use with checkboxes.\r\n private updateUnitSelected(unitId: any, checked: boolean) {\r\n let copyUnits = [...this.state.units];\r\n let unit = copyUnits.find((item: any) => item.id === unitId);\r\n unit.checked = checked;\r\n this.setState({ units: copyUnits });\r\n\r\n let checkedUnits = copyUnits.filter((x) => x.checked);\r\n //If all are checked, show \"clear all\" link\r\n if (checkedUnits && checkedUnits.length === copyUnits.length) {\r\n this.setState({ unitSelectAll: true });\r\n } else {\r\n //All are not checked, show \"select all\" link\r\n this.setState({ unitSelectAll: false });\r\n }\r\n }\r\n // private updateUnitSelected(id: any, checked: boolean) { radio button\r\n // this.setState({ selectedUnitId: id });\r\n // }\r\n private buildUnitCheckboxes() {\r\n if (!this.state.units) {\r\n return null;\r\n }\r\n return this.state.units.map((item: any, index: number) => (\r\n
    \r\n
    \r\n {\" \"}\r\n {item.unitTag + (item.isOversized ? \" (Oversized)\" : item.isProEditMode ? \"(Custom Build)\" : \"\")}\r\n
    \r\n this.updateUnitSelected(item.id, event.currentTarget.checked)}\r\n />\r\n
    \r\n ));\r\n }\r\n\r\n private DocumentPackageTypeRadioClick(radioName: any) {\r\n if (radioName === \"design\") {\r\n if (!this.state.designRadioButton) {\r\n //case : when the user selects the design radio button\r\n this.setState({\r\n designRadioButton: true,\r\n quoteRadioButton: false,\r\n submittalRadioButton: false,\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: true,\r\n unitDrawing: true,\r\n salesGuidSpecification: true,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: true,\r\n sensorSchematic: true,\r\n drainTrapDetail: true,\r\n powerElectricalSchematic: true,\r\n waterPipingSchematic: true,\r\n submittalScope: true,\r\n warranty: false,\r\n termsAndConditions: false,\r\n sequenceGenerator: true,\r\n baseDetail: true,\r\n curbDetail: true,\r\n componentsInstalledByOthers: false\r\n });\r\n } else if (this.state.designRadioButton) {\r\n //case : when the user de-selects the design radio button\r\n this.setState({\r\n designRadioButton: false,\r\n quoteRadioButton: false,\r\n submittalRadioButton: false,\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: false,\r\n unitDrawing: false,\r\n salesGuidSpecification: false,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: false,\r\n sensorSchematic: false,\r\n drainTrapDetail: false,\r\n powerElectricalSchematic: false,\r\n waterPipingSchematic: false,\r\n submittalScope: false,\r\n warranty: false,\r\n termsAndConditions: false,\r\n sequenceGenerator: false,\r\n baseDetail: false,\r\n curbDetail: false,\r\n componentsInstalledByOthers: false\r\n });\r\n }\r\n } else if (radioName === \"quote\") {\r\n if (!this.state.quoteRadioButton) {\r\n //case : when the user selects the quote radio button\r\n this.setState({\r\n quoteRadioButton: true,\r\n designRadioButton: false,\r\n submittalRadioButton: false,\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: false,\r\n unitDrawing: false,\r\n salesGuidSpecification: false,\r\n quote: true,\r\n salesScope: false,\r\n airflowSchematic: false,\r\n sensorSchematic: false,\r\n drainTrapDetail: false,\r\n powerElectricalSchematic: false,\r\n waterPipingSchematic: false,\r\n submittalScope: true,\r\n warranty: true,\r\n termsAndConditions: true,\r\n sequenceGenerator: false,\r\n baseDetail: false,\r\n curbDetail: false,\r\n componentsInstalledByOthers: false\r\n });\r\n } else if (this.state.quoteRadioButton) {\r\n //case : when the user de-selects the quote radio button\r\n this.setState({\r\n designRadioButton: false,\r\n quoteRadioButton: false,\r\n submittalRadioButton: false,\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: false,\r\n unitDrawing: false,\r\n salesGuidSpecification: false,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: false,\r\n sensorSchematic: false,\r\n drainTrapDetail: false,\r\n powerElectricalSchematic: false,\r\n waterPipingSchematic: false,\r\n submittalScope: false,\r\n warranty: false,\r\n termsAndConditions: false,\r\n sequenceGenerator: false,\r\n baseDetail: false,\r\n curbDetail: false,\r\n componentsInstalledByOthers: false\r\n });\r\n }\r\n } else {\r\n //This is for submittal package\r\n if (!this.state.submittalRadioButton) {\r\n //case : when the user selects the quote radio button\r\n this.setState({\r\n quoteRadioButton: false,\r\n designRadioButton: false,\r\n submittalRadioButton: true,\r\n submittalCoverSheet: true,\r\n poolDesignSummary: false,\r\n performanceDataSummary: true,\r\n unitDrawing: true,\r\n salesGuidSpecification: false,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: true,\r\n sensorSchematic: true,\r\n drainTrapDetail: true,\r\n powerElectricalSchematic: true,\r\n waterPipingSchematic: true,\r\n submittalScope: true,\r\n warranty: true,\r\n termsAndConditions: true,\r\n sequenceGenerator: true,\r\n baseDetail: true,\r\n curbDetail: true,\r\n componentsInstalledByOthers: true\r\n });\r\n } else if (this.state.submittalRadioButton) {\r\n //case : when the user de-selects the quote radio button\r\n this.setState({\r\n designRadioButton: false,\r\n quoteRadioButton: false,\r\n submittalRadioButton: false,\r\n submittalCoverSheet: false,\r\n poolDesignSummary: false,\r\n performanceDataSummary: false,\r\n unitDrawing: false,\r\n salesGuidSpecification: false,\r\n quote: false,\r\n salesScope: false,\r\n airflowSchematic: false,\r\n sensorSchematic: false,\r\n drainTrapDetail: false,\r\n powerElectricalSchematic: false,\r\n waterPipingSchematic: false,\r\n submittalScope: false,\r\n warranty: false,\r\n termsAndConditions: false,\r\n sequenceGenerator: false,\r\n baseDetail: false,\r\n curbDetail: false,\r\n componentsInstalledByOthers: false\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus,\r\n reduxTempsAndSystem: state.reduxTempsAndSystem,\r\n reduxOutputDocumentsInfo: state.reduxOutputDocumentsInfo,\r\n reduxProjectManagement: state.reduxProjectManagement\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Outputs);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Route, match, Link } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { callGetEndpoint, callGetEndpoint2, callPostEndpoint } from \"../../api-calls/readApiService\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { isEmptyArray, sqlToJsDateTime, isNullOrEmpty } from \"../../utilities/helpers\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {\r\n revit: boolean;\r\n units: any;\r\n dataRows: any[];\r\n unitSelectAll: boolean;\r\n}\r\n\r\nclass CadOutputs extends React.Component {\r\n public state: IState = {\r\n revit: true,\r\n units: null,\r\n dataRows: [],\r\n unitSelectAll: false\r\n };\r\n\r\n async componentDidMount() {\r\n this.getUnitList();\r\n this.getCadFiles();\r\n }\r\n\r\n private async getUnitList() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint2(\"dataapi/getUnits\", projectId);\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"cadUnitsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    Get Unit List Error {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.unitList) {\r\n this.setState({\r\n units: result.unitList\r\n });\r\n }\r\n }\r\n\r\n private async getCadFiles() {\r\n const { projectId, unitId } = this.props.match.params;\r\n const result = await callGetEndpoint(\"dataapi/getCadFilesForProject\", projectId, unitId);\r\n\r\n if (result.hasError) {\r\n const notification = {\r\n id: \"cadFilesError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content:
    Get CAD Files Error {result.errorMessage}
    \r\n };\r\n addNotification(notification);\r\n }\r\n\r\n if (result.cadFileProcessingDTOs) {\r\n this.setState({\r\n dataRows: result.cadFileProcessingDTOs\r\n });\r\n }\r\n }\r\n\r\n private buildUnitCheckboxes() {\r\n if (!this.state.units) {\r\n return null;\r\n }\r\n return this.state.units.map((item: any, index: number) => (\r\n
    \r\n
    \r\n {\" \"}\r\n {item.unitTag + (item.isOversized ? \" (Oversized)\" : item.isProEditMode ? \"(Custom Build)\" : \"\")}\r\n
    \r\n this.updateUnitSelected(item.id, event.currentTarget.checked)}\r\n />\r\n
    \r\n ));\r\n }\r\n //This is for use with checkboxes.\r\n private updateUnitSelected(unitId: any, checked: boolean) {\r\n let units = [...this.state.units];\r\n let unit = units.find((item: any) => item.id === unitId);\r\n unit.checked = checked;\r\n this.setState({ units: units });\r\n }\r\n private SelectAllUnits() {\r\n if (this.state.unitSelectAll) {\r\n this.ClearAllUnitCheckboxes();\r\n return;\r\n } else {\r\n let units = [...this.state.units];\r\n units.forEach((unit) => {\r\n unit.checked = true;\r\n });\r\n\r\n this.setState({ units: units, unitSelectAll: true });\r\n }\r\n }\r\n private ClearAllUnitCheckboxes() {\r\n let units = [...this.state.units];\r\n units.forEach((unit) => {\r\n unit.checked = false;\r\n });\r\n\r\n this.setState({ units: units, unitSelectAll: false });\r\n }\r\n private async SubmitProcessingRequest() {\r\n const { projectId, unitId } = this.props.match.params;\r\n\r\n let unitIds: any = [];\r\n let unitTags: any = [];\r\n this.state.units.forEach((unit: any) => {\r\n if (unit.checked == true) {\r\n unitIds.push(unit.id);\r\n unitTags.push(unit.unitTag);\r\n }\r\n });\r\n\r\n if (isEmptyArray(unitIds)) {\r\n return;\r\n }\r\n\r\n const processingRequest = {\r\n ProjectId: `proj-${projectId}`,\r\n UnitIds: unitIds,\r\n UnitTags: unitTags\r\n };\r\n\r\n //IMPORTANT: Clear out the current selections, and gray out the submit button.\r\n //This is to prevent the user from doubleClicking or clicking twice, adding multiple records.\r\n this.ClearAllUnitCheckboxes();\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n let result = await callPostEndpoint(\"dataapi/generateRevitFiles\", processingRequest);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n\r\n if (result.success) {\r\n if (result.data.hasError) {\r\n const notification = {\r\n id: \"outputsError\",\r\n notificationType: \"error\",\r\n title: \"Error\",\r\n content: (\r\n
    \r\n SubmitProcessingRequest {result.data.errorMessage !== null && result.data.errorMessage !== \"\"} ? {result.data.errorMessage} :{\" \"}\r\n {result.data.individualErrors}\r\n
    \r\n )\r\n };\r\n addNotification(notification);\r\n } else {\r\n this.getCadFiles();\r\n }\r\n }\r\n\r\n //this.ClearAllUnitCheckboxes();\r\n }\r\n\r\n //========================================= Methods for PDF Documents Table ============================================\r\n //======================================================================================================================\r\n\r\n //Build table rows from the project list in state\r\n private getPdfRows() {\r\n const list = this.state.dataRows;\r\n\r\n if (!isEmptyArray(list)) {\r\n return list.map((item: any, index: number) => (\r\n
    \r\n
    {this.getPdfStatus(item.processingStatusName)}
    \r\n {/*
    {item.projectId}
    */}\r\n
    {item.unitIdListString}
    \r\n
    {item.unitTagListString}
    \r\n
    {item.fileType}
    \r\n
    {sqlToJsDateTime(item.createDate)}
    \r\n
    {this.getPdfLink(item)}
    \r\n
    \r\n ));\r\n } else {\r\n return
    No Results
    ;\r\n }\r\n }\r\n\r\n private getRowClassName(statusName: string) {\r\n if (statusName == \"Completed\") {\r\n return \"proj-tr\";\r\n }\r\n if (statusName == \"Failed\") {\r\n return \"proj-tr\";\r\n }\r\n return \"proj-tr-running\";\r\n }\r\n private getPdfLink(item: any) {\r\n if (!isNullOrEmpty(item.errorMessage)) {\r\n return \"error\";\r\n }\r\n\r\n if (item.processingStatusName == \"Completed\") {\r\n let url = item.cadFileUrl;\r\n return (\r\n \r\n
    \r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private getPdfStatus(statusName: string) {\r\n if (statusName == \"Completed\") {\r\n return
    {statusName}
    ;\r\n }\r\n if (statusName == \"Failed\") {\r\n return
    {statusName}
    ;\r\n }\r\n //For all statuses aside from Completed and Failed, show the progress bar\r\n return (\r\n
    \r\n
    \r\n
    {statusName}
    \r\n
    \r\n );\r\n }\r\n\r\n public render() {\r\n //let showTemplateChoice = !this.state.salesGuidSpecification ? 'app-display-none' : '';\r\n // let Disabled = this.DisableGenerateButton() ? \"app-outputs-generate-disable\" : \"\";\r\n let disabled = false;\r\n // let docSelectText = this.state.docSelectAll ? \"Clear All\" : \"Select All\";\r\n let unitSelectText = this.state.unitSelectAll ? \"Clear All\" : \"Select All\";\r\n return (\r\n
    \r\n {/*
    Generate Output Documents
    */}\r\n\r\n
    \r\n {/*================================= Left Column ================================ */}\r\n
    \r\n
    Available Documents
    \r\n
    \r\n {/*
    Available Documents
    */}\r\n {/* this.SelectAllDocuments()}>\r\n {docSelectText}\r\n */}\r\n\r\n
    Revit
    \r\n this.setState({ revit: event.currentTarget.checked })} />\r\n\r\n
    \r\n
    Unit Selection
    \r\n
    \r\n\r\n
    Generate Files For
    \r\n this.SelectAllUnits()}>\r\n {unitSelectText}\r\n \r\n {this.buildUnitCheckboxes()}\r\n\r\n
    \r\n
    this.SubmitProcessingRequest()}>Generate Files
    \r\n
    \r\n
    \r\n\r\n {/*====================================== Right Column ================================ */}\r\n
    \r\n
    \r\n
    this.getCadFiles()}>\r\n CAD Files\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    Status
    \r\n {/*
    ProjectId
    */}\r\n
    UnitIds
    \r\n
    Unit Tags
    \r\n
    File Type
    \r\n
    Created
    \r\n
    Download
    \r\n
    \r\n\r\n {this.getPdfRows()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CadOutputs);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Route, match } from \"react-router-dom\";\r\nimport { mapDispatchToProps } from \"../redux/actions\";\r\nimport OutputsSubMenu from \"./Menus/OutputsSubMenu\";\r\nimport PdfOutputs from \"./Outputs/PdfOutputs\";\r\nimport CadOutputs from \"./Outputs/CadOutputs\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n match: match;\r\n reduxMenus: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass Outputs extends React.Component {\r\n componentDidMount() {\r\n this.props.updateRedux(\"UPDATE_MENUS\", { enableUnitIcons: true });\r\n this.props.updateRedux(\"UPDATE_MENUS\", { topMenu: { activeItem: 6 } });\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Outputs);\r\n","import * as React from 'react';\r\n\r\n//=========== React \"Context\" ==============\r\n//https://reactjs.org/docs/context.html\r\n\r\n//This gives us a way to create a \"singleton\" instance of the IdentityService class and\r\n//use it in any of our components. We don't want to create a new instance of the IdentityService \r\n//class in our components because it creates event listeners. We don't want multiple copies of those\r\n//event listeners running. \r\n\r\n//So we create one instance of the IdentityService class in App.tsx and add it to this global \"context\"\r\n//provided by React. This prevents us from having to pass it down manually at every level through props.\r\n\r\n//We can't use redux for this either because you can't store an instance of a class in redux. We'll store\r\n//the logged-in userId in redux, but thats about it. Anytime we want to use any of the methods in the\r\n//IdentityService class, we just use this singleton.\r\n\r\nconst IdentityContext = React.createContext({});\r\nexport default IdentityContext;\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport IdentityContext from '../../security/IdentityContext';\r\nimport '../../css/Login.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {\r\n username: string;\r\n password: string;\r\n error: string;\r\n}\r\n\r\nclass LoginStart extends React.Component {\r\n public state: IState = {\r\n username: '',\r\n password: '',\r\n error: ''\r\n };\r\n\r\n //Connect to global IdentityContext (https://reactjs.org/docs/context.html)\r\n static contextType = IdentityContext;\r\n private readonly identityService = this.context;\r\n\r\n async componentDidMount() {\r\n const loggedIn = await this.identityService.isLoggedIn();\r\n console.log(loggedIn);\r\n\r\n if (loggedIn) {\r\n // this.props.history.push('/project');\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n

    Homepage

    \r\n
    \r\n
    \r\n
    Please Log In
    \r\n
    \r\n\r\n
    this.identityService.login()}>\r\n Login\r\n
    \r\n
    \r\n
    \r\n
    \r\n {/*
    {process.env.REACT_APP_MSG}
    \r\n
    {process.env.REACT_APP_IDENTITY_AUTHORITY}
    \r\n
    {process.env.REACT_APP_IDENTITY_CLIENTID}
    \r\n
    {process.env.REACT_APP_IDENTITY_LOGINREDIRECT}
    \r\n
    {process.env.REACT_APP_IDENTITY_LOGOUTREDIRECT}
    \r\n
    {process.env.REACT_APP_IDENTITY_SILENT}
    */}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(LoginStart);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\n// import { IdentityService } from '../../security/IdentityService';\r\nimport IdentityContext from '../../security/IdentityContext';\r\nimport '../../css/Login.scss';\r\nimport { saveUserIdentity } from '../../api-calls/projectDataService';\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {\r\n success: boolean;\r\n}\r\n\r\nclass IdentityLogin extends React.Component {\r\n public state: IState = {\r\n success: true\r\n };\r\n\r\n //Connect to global IdentityContext (https://reactjs.org/docs/context.html)\r\n static contextType = IdentityContext;\r\n private readonly identityService = this.context;\r\n\r\n async componentDidMount() {\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: true });\r\n const user = await this.identityService.getUser();\r\n\r\n if (user == null) {\r\n const response = await this.identityService.completeLogin();\r\n if (response != null) {\r\n const user = await this.identityService.getUser();\r\n //Save user's profile info in sql.\r\n this.saveUserIdentity(user);\r\n \r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n this.props.history.push('/project'); //redirect to project page after successful login\r\n \r\n } else {\r\n this.setState({ success: false }); //show error if login unsuccessful\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n }\r\n } else {\r\n this.props.updateRedux('UPDATE_DISPLAY', { showLoader: false });\r\n this.props.history.push('/project'); //user already logged in. redirect to project page\r\n }\r\n \r\n }\r\n saveUserIdentity(user: any){\r\n const userIdentityRequest = {\r\n LoginId: user.profile.sub,\r\n FirstName: user.profile.FirstName,\r\n LastName: user.profile.LastName,\r\n Email: user.profile.Email,\r\n ProfileData: user.profile.profiledata\r\n };\r\n \r\n saveUserIdentity(userIdentityRequest);\r\n }\r\n public render() {\r\n return (\r\n
    \r\n {this.state.success === false ? (\r\n
    \r\n
    Login unsuccessful
    \r\n
    \r\n
    \r\n \r\n
    \r\n ) : null}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(IdentityLogin);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router-dom\"; //withRouter needed for location & history properties (see readMe)\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\n// import { IdentityService } from '../../security/IdentityService';\r\nimport IdentityContext from \"../../security/IdentityContext\";\r\nimport \"../../css/Login.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass IdentityLogout extends React.Component {\r\n //Connect to global IdentityContext (https://reactjs.org/docs/context.html)\r\n static contextType = IdentityContext;\r\n private readonly identityService = this.context;\r\n\r\n async componentDidMount() {\r\n //const finish = await this.identityService.silentRedirectCallback();\r\n const user = await this.identityService.completeLogout();\r\n console.log(user);\r\n if (user === null) {\r\n console.log(\"user is logged out\");\r\n this.props.history.push(\"/\");\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n You are now logged out.\r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {};\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(IdentityLogout));\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link, withRouter, matchPath } from \"react-router-dom\"; //withRouter needed for location & history properties (see readMe)\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { addNotification, removeNotification } from \"../../api-utilities/notification-tools\";\r\nimport { runFullUnitStructureRebuild, setReCalcLevel } from \"../../api-calls/readApiService\";\r\nimport IdentityContext from \"../../security/IdentityContext\";\r\nimport \"../../css/Menus.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxMenus: any;\r\n reduxAuth: any;\r\n history: any;\r\n location: any;\r\n reduxOutputDocumentsInfo: any;\r\n}\r\n// local state\r\ninterface IState {\r\n iconDesc: string;\r\n saveInProgress: boolean;\r\n hasRepRole: boolean;\r\n}\r\n\r\nclass TopRightMenu extends React.Component {\r\n //Connect to global IdentityContext (https://reactjs.org/docs/context.html)\r\n static contextType = IdentityContext;\r\n private readonly identityService = this.context;\r\n\r\n public state: IState = { iconDesc: \"\", saveInProgress: false, hasRepRole: false };\r\n\r\n async componentDidMount() {\r\n this.checkForRepRole();\r\n }\r\n\r\n async componentDidUpdate(prevProps: any) {\r\n if (prevProps.reduxAuth.userId != this.props.reduxAuth.userId) {\r\n //####### User has changed #########\r\n this.checkForRepRole();\r\n }\r\n }\r\n\r\n async checkForRepRole() {\r\n //Get roles from the user object, and check for the Rep role\r\n const user = await this.identityService.getUser();\r\n const rolesArray = await this.identityService.getUserRoles(user);\r\n let hasRepRole = rolesArray.includes(\"rep\");\r\n this.setState({ hasRepRole: hasRepRole });\r\n }\r\n\r\n private openModal(modalTitle: string) {\r\n const modalData = { title: modalTitle };\r\n this.props.updateRedux(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ModalPopup\",\r\n modalData: modalData,\r\n hideCancelBtn: false\r\n });\r\n }\r\n //Save in case we bring back dropdown menu\r\n // private showDropMenu(menu: number, state: boolean) {\r\n // if (menu === 1) {\r\n // this.props.updateRedux('UPDATE_MENUS', { showTopRightDropdown1: state });\r\n // } else {\r\n // this.props.updateRedux('UPDATE_MENUS', { showTopRightDropdown2: state });\r\n // }\r\n // }\r\n private async saveUnit() {\r\n const match = matchPath(this.props.history.location.pathname, {\r\n path: \"/pid/:projectId/uid/:unitId\",\r\n exact: false,\r\n strict: false\r\n });\r\n if (match) {\r\n const { projectId, unitId } = match.params as any;\r\n if (this.props.reduxMenus.enableSave) {\r\n this.setState({ saveInProgress: true });\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: true });\r\n await runFullUnitStructureRebuild(\"proj-\" + projectId, \"unit-\" + unitId);\r\n this.props.updateRedux(\"UPDATE_DISPLAY\", { showLoader: false });\r\n this.setState({ saveInProgress: false, iconDesc: \"\" });\r\n }\r\n }\r\n }\r\n // private pricingOutput() {\r\n // const match = matchPath(this.props.history.location.pathname, {\r\n // path: '/pid/:projectId/uid/:unitId',\r\n // exact: false,\r\n // strict: false\r\n // });\r\n // if (match) {\r\n // const { projectId, unitId } = match.params as any;\r\n // this.props.history.push('/pid/' + projectId + '/uid/' + unitId + '/pricing');\r\n // }\r\n // }\r\n // private printOutput() {\r\n // const match = matchPath(this.props.history.location.pathname, {\r\n // path: \"/pid/:projectId/uid/:unitId\",\r\n // exact: false,\r\n // strict: false\r\n // });\r\n // if (match) {\r\n // const { projectId, unitId } = match.params as any;\r\n // this.props.history.push(\"/pid/\" + projectId + \"/uid/\" + unitId + \"/outputs/pdfoutputs\");\r\n // }\r\n // }\r\n showIconDesc(text: string) {\r\n this.setState({ iconDesc: text });\r\n }\r\n showSaveIconDesc(text: string) {\r\n if (this.props.reduxMenus.enableSave) {\r\n this.setState({ iconDesc: text });\r\n }\r\n }\r\n private openContactUsModal() {\r\n this.props.updateRedux(\"UPDATE_MODALS\", {\r\n showModal: true,\r\n modalType: \"ContactUsModal\",\r\n modalData: null,\r\n hideCancelBtn: false\r\n });\r\n }\r\n\r\n public render() {\r\n //const reduxMenus = this.props.reduxMenus;\r\n const route = this.props.location.pathname;\r\n const displayMenu = route.includes(\"/auth/login\") || route.includes(\"/loginstart\") ? false : true;\r\n //let pricingClass = this.props.reduxMenus.enableUnitIcons ? 'menu-dd5' : 'menu-dd5-disabled';\r\n let saveClass = this.props.reduxMenus.enableUnitIcons ? \"menu-dd2\" : \"menu-dd2-disabled\";\r\n let printClass = this.props.reduxMenus.enableUnitIcons\r\n ? this.props.reduxOutputDocumentsInfo.showDocsReadyNotificationIcon\r\n ? \"menu-dd4-checkmark\"\r\n : \"menu-dd4\"\r\n : \"menu-dd4-disabled\";\r\n return (\r\n
    \r\n {displayMenu ? (\r\n <>\r\n {/*NOTE:SAVE IN CASE WE GO BACK TO SMALL LOADER ON TOP OF ICON {this.state.saveInProgress ? (\r\n
    \r\n ) : ( */}\r\n this.showSaveIconDesc(\"Save unit design\")}\r\n onMouseLeave={() => this.showIconDesc(\"\")}\r\n onClick={() => this.saveUnit()}\r\n >
    \r\n {/* )} */}\r\n\r\n {/* this.showIconDesc(\"Outputs\")}\r\n onMouseLeave={() => this.showIconDesc(\"\")}\r\n onClick={() => this.printOutput()}\r\n >
    */}\r\n\r\n {/* this.showIconDesc('Pricing')}\r\n onMouseLeave={() => this.showIconDesc('')}\r\n onClick={() => this.pricingOutput()}\r\n >
    */}\r\n\r\n this.showIconDesc(\"Logout\")}\r\n onMouseLeave={() => this.showIconDesc(\"\")}\r\n onClick={() => this.identityService.logout()}\r\n >
    \r\n\r\n this.showIconDesc(\"Help\")}\r\n onMouseLeave={() => this.showIconDesc(\"\")}\r\n onClick={() => this.openContactUsModal()}\r\n >
    \r\n
    \r\n
    {this.state.iconDesc}
    \r\n\r\n {/* \r\n ====================================================================================================\r\n NOTE: leaving this here in case the business decides to bring back the dropdown menus for any reason\r\n ====================================================================================================\r\n this.showDropMenu(1, true)}\r\n onMouseLeave={() => this.showDropMenu(1, false)}\r\n >\r\n
    \r\n Job Mgmt \r\n
    \r\n this.showDropMenu(1, true)}\r\n onMouseLeave={() => this.showDropMenu(1, false)}\r\n >\r\n {displayHomeSave ? (\r\n <>\r\n
    \r\n \r\n
    Project Management
    \r\n \r\n
    \r\n\r\n
    this.openModal('Save Project')}>\r\n
    Save Project
    \r\n
    \r\n \r\n ) : null}\r\n
    this.openModal('Copy Unit')}>\r\n
    Copy Unit
    \r\n
    \r\n\r\n
    this.openModal('Document Generation')}>\r\n
    Document Generation
    \r\n
    \r\n\r\n
    this.openModal('Edit Properties')}>\r\n
    Edit Properties
    \r\n
    \r\n\r\n {loggingRoutePath ? (\r\n \r\n
    \r\n
    Logging
    \r\n
    \r\n \r\n ) : (\r\n
    alert('Must open a unit first')}>\r\n
    Logging
    \r\n
    \r\n )}\r\n\r\n
    this.identityService.login()}>\r\n
    Login
    \r\n
    \r\n
    this.identityService.logout()}>\r\n
    LogOut
    \r\n
    \r\n
    \r\n */}\r\n\r\n {/*
    \r\n \r\n
    \r\n
    this.saveUnit()}>Save
    \r\n
    \r\n */}\r\n \r\n ) : null}\r\n \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxMenus: state.reduxMenus,\r\n reduxAuth: state.reduxAuth,\r\n reduxOutputDocumentsInfo: state.reduxOutputDocumentsInfo\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(TopRightMenu));\r\n","import { store } from '../redux/store';\r\nimport { displayError, displayErrorString} from '../api-utilities/api-calls';\r\nimport { IdentityService } from '../security/IdentityService';\r\nimport { IUserInfo } from '../interfaces/interfaces';\r\nimport { getStringId } from '../api-utilities/formatting';\r\n//This file contains calls to the Lowry backend, which gets results from the PricingDataAPI\r\n\r\nconst apibase = process.env.REACT_APP_CLIENT_API;\r\n\r\nexport async function getAuthToken() {\r\n const auth = store.getState().reduxAuth;\r\n let token = '';\r\n //Check to see if reduxAuth contains the access_token. \r\n //Using access_token from Redux prevents a bunch of calls to identityserver,\r\n //but on page reload, sometimes redux doesn't get populated fast enough, and the page tries\r\n //to call the server with no token, and fails. So in that case we should get it from IdentityServer.\r\n if(auth.access_token !== ''){\r\n token = auth.access_token;\r\n }\r\n else{\r\n const identityService = new IdentityService();\r\n const user = await identityService.getUser();\r\n if(user != null){\r\n token = user.access_token;\r\n }\r\n }\r\n return token;\r\n}\r\n\r\nexport async function getPriceAndRecalcLevel(projectId: any, unitId: any){\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const result = await fetch(apibase + `/dataapi/getPriceAndRecalcLevel/${projIdStr}/${unitIdStr}`, {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n const response = {\r\n success: result.status === 200 ? true : false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n return response;\r\n}\r\nexport async function updateUnitPrice(projectId: any, unitId: any) {\r\n const auth = store.getState().reduxAuth;\r\n const projectManagment = store.getState().reduxProjectManagement;\r\n const token = await getAuthToken();\r\n let projIdStr = getStringId('project', projectId);\r\n let unitIdStr = getStringId('unit', unitId);\r\n\r\n const graphUnitPricingRequest = {\r\n projectId: projIdStr,\r\n unitId: unitIdStr,\r\n saveToDatabase: true\r\n };\r\n\r\n try {\r\n const result = await fetch(apibase + '/dataapi/updateGraphUnitPrice', {\r\n method: 'post',\r\n body: JSON.stringify(graphUnitPricingRequest),\r\n headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }\r\n });\r\n if (result.status === 200) {\r\n return await result.json();\r\n }\r\n else{\r\n let error = {\r\n hasError: true, errorMessage: \"Request failed\"\r\n }\r\n return error;\r\n }\r\n } catch (error) {\r\n let err = {\r\n hasError: true, errorMessage: error\r\n }\r\n return err;\r\n }\r\n}\r\n\r\n\r\nexport async function generateUnitPriceSummary(projectId:any, unitId:any, ){\r\n const apibase = process.env.REACT_APP_CLIENT_API;\r\n const token = await getAuthToken();\r\n let response;\r\n\r\n const unitPriceRequest = {\r\n projectId: projectId,\r\n unitId: unitId,\r\n saveToDatabase: true\r\n };\r\n \r\n const result = await fetch(apibase + '/dataapi/generateUnitPriceSummary', {\r\n method: 'post',\r\n body: JSON.stringify(unitPriceRequest),\r\n headers: { 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}` }\r\n });\r\n response = {\r\n //Handles the call from pdf Service\r\n success: result.status === 200 ? true:false,\r\n data: result.status === 200 ? await result.json() : await result.text()\r\n };\r\n //If not success then display error.\r\n if(!response.success){\r\n let errorObj = {\r\n status: result.status,\r\n message: response.data.errorMessage\r\n }\r\n displayError(errorObj, \"GenerateUnitPriceSummary\");\r\n return;\r\n }\r\n return response;\r\n}","import * as React from \"react\";\r\nimport { store } from \"../../redux/store\";\r\nimport { match } from \"react-router-dom\";\r\nimport { updateReduxAction } from \"../../redux/actions\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link, withRouter, matchPath } from \"react-router-dom\"; //withRouter needed for location & history properties (see readMe)\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { getPriceAndRecalcLevel, updateUnitPrice } from \"../../api-calls/pricingDataService\";\r\nimport IdentityContext from \"../../security/IdentityContext\";\r\nimport { formatNumber } from \"../../api-utilities/formatting\";\r\nimport { isEmptyArray } from \"../../utilities/helpers\";\r\nimport \"../../css/Menus.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n history: any;\r\n location: any;\r\n reduxPricing: any;\r\n updateRedux: any;\r\n match: match;\r\n}\r\n// local state\r\ninterface IState {\r\n totalPrice: string;\r\n listPrice: string;\r\n updateInProgress: boolean;\r\n hasErrors: boolean;\r\n errorMessages: string[];\r\n showErrorModal: boolean;\r\n}\r\n\r\nclass TopRightPricing extends React.Component {\r\n //Connect to global IdentityContext (https://reactjs.org/docs/context.html)\r\n static contextType = IdentityContext;\r\n private readonly identityService = this.context;\r\n\r\n public state: IState = {\r\n totalPrice: \"0\",\r\n listPrice: \"0\",\r\n updateInProgress: false,\r\n hasErrors: false,\r\n errorMessages: [],\r\n showErrorModal: false\r\n };\r\n\r\n async componentDidMount() {\r\n const { projectId, unitId } = this.props.match.params;\r\n let priceResponse = await getPriceAndRecalcLevel(projectId, unitId);\r\n if (priceResponse.success === true){\r\n let needsUpdate = priceResponse.data.recalcLevel === \"None\" ? false : true;\r\n this.props.updateRedux(\"UPDATE_PRICING\", { priceNeedsUpdate: needsUpdate });\r\n let price = priceResponse.data.unitTotalListPrice !== null ? formatNumber(priceResponse.data.unitTotalListPrice, 0).toString() : \"0\";\r\n this.setState({listPrice: price});\r\n //If there's an overall error message, show that instead\r\n if (priceResponse.data.hasError) {\r\n let errorArray: string[] = [priceResponse.data.errorMessage];\r\n this.setState({ hasErrors: true, errorMessages: errorArray, showErrorModal: true });\r\n return;\r\n }\r\n }\r\n }\r\n componentDidUpdate(prevProps: any) {\r\n if (this.props.reduxPricing.runPricing === true) {\r\n this.updatePrice();\r\n this.props.updateRedux(\"UPDATE_PRICING\", { runPricing: false, priceNeedsUpdate: false });\r\n }\r\n }\r\n public render() {\r\n // const route = this.props.location.pathname;\r\n // const displayPricing = route.includes('/pid/:projectId/uid/:unitId') ? true : false;\r\n // console.log(route);\r\n // console.log(route.includes('/pid/:projectId/uid/:unitId'));\r\n\r\n let priceClass = this.props.reduxPricing.priceNeedsUpdate ? \"top-pricing pricing-disabled\" : \"top-pricing\";\r\n let priceBtnClass = this.props.reduxPricing.priceNeedsUpdate ? \"top-pricing-btn\" : \"top-pricing-btn pricing-btn-disabled\";\r\n\r\n // if (displayPricing == false) {\r\n // return null;\r\n // }\r\n\r\n return (\r\n
    \r\n
    \r\n {this.state.hasErrors ? (\r\n
    \r\n
    this.togglePriceErrorModal()}>\r\n Price Unavailable\r\n
    \r\n
    \r\n ) : (\r\n
    \r\n
    ${this.state.listPrice}
    \r\n
    \r\n )}\r\n\r\n
    \r\n {this.state.updateInProgress ? (\r\n
    \r\n
    \r\n
    Updating
    \r\n
    \r\n ) : (\r\n
    this.updatePrice()}>\r\n Update Price\r\n
    \r\n )}\r\n
    \r\n
    \r\n\r\n {this.state.showErrorModal ? (\r\n
    \r\n
    this.closeErrorModal()}>\r\n X\r\n
    \r\n
    Pricing cannot be calculated until errors are resolved
    \r\n
    {this.getErrorMessages()}
    \r\n
    \r\n ) : null}\r\n
    \r\n );\r\n }\r\n\r\n private async updatePrice() {\r\n const { projectId, unitId } = this.props.match.params;\r\n //If price doesn't need updating, don't execute the call\r\n if (!this.props.reduxPricing.priceNeedsUpdate) {\r\n return;\r\n }\r\n\r\n // const match = matchPath(this.props.history.location.pathname, {\r\n // path: '/pid/:projectId/uid/:unitId',\r\n // exact: false,\r\n // strict: false\r\n // });\r\n\r\n //if (match) {\r\n //const { projectId, unitId } = match.params as any;\r\n\r\n this.setState({ updateInProgress: true, hasErrors: false, errorMessages: [], showErrorModal: false });\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: true }));\r\n let priceResponse = await updateUnitPrice(projectId, unitId);\r\n store.dispatch(updateReduxAction(\"UPDATE_DISPLAY\", { showLoader: false }));\r\n //If there's a collection of component-level errors, show those\r\n if (!isEmptyArray(priceResponse.errorMessages)) {\r\n this.setState({ updateInProgress: false, hasErrors: true, errorMessages: priceResponse.errorMessages, showErrorModal: true });\r\n return;\r\n }\r\n //If there's an overall error message, show that instead\r\n if (priceResponse.hasError) {\r\n let errorArray: string[] = [priceResponse.errorMessage];\r\n this.setState({ updateInProgress: false, hasErrors: true, errorMessages: errorArray, showErrorModal: true });\r\n return;\r\n }\r\n //If no errors\r\n this.setState({\r\n updateInProgress: false,\r\n hasErrors: false,\r\n totalPrice: formatNumber(priceResponse.totalPrice, 0).toString(),\r\n listPrice: formatNumber(priceResponse.listPrice, 0).toString()\r\n });\r\n this.props.updateRedux(\"UPDATE_PRICING\", { priceNeedsUpdate: false });\r\n // }\r\n }\r\n\r\n private getErrorMessages() {\r\n let errors = this.state.errorMessages;\r\n\r\n return errors.map((item: any, index: number) => (\r\n
  • \r\n {item}\r\n
  • \r\n ));\r\n }\r\n private togglePriceErrorModal() {\r\n this.setState({ showErrorModal: !this.state.showErrorModal });\r\n }\r\n private closeErrorModal() {\r\n this.setState({ showErrorModal: false });\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxPricing: state.reduxPricing,\r\n reduxProjectManagement: state.reduxProjectManagement\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(TopRightPricing));\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { store } from \"../../redux/store\";\r\nimport { updateReduxAction } from \"../../redux/actions\";\r\nimport { withRouter, matchPath } from \"react-router-dom\"; //withRouter needed for location property (see readMe)\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { getProjectAndUnitName } from \"../../api-calls/projectDataService\";\r\nimport { isNullOrEmpty } from \"../../utilities/helpers\";\r\nimport { getStringId } from \"../../api-utilities/formatting\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n location: any;\r\n history: any;\r\n //match: match;\r\n reduxAppVersion: any;\r\n reduxDisplay: any;\r\n}\r\n// local state\r\ninterface IState {\r\n projectId: any;\r\n unitId: any;\r\n headerTitle: string;\r\n}\r\n\r\nclass ProjectHeader extends React.Component {\r\n public state: IState = { projectId: null, unitId: null, headerTitle: \"\" };\r\n\r\n async componentDidMount() {\r\n //Try and get projectId and unitId from the URL\r\n const match = matchPath(this.props.history.location.pathname, {\r\n path: \"/pid/:projectId/uid/:unitId\",\r\n exact: false,\r\n strict: false\r\n });\r\n if (match) {\r\n const { projectId, unitId } = match.params as any;\r\n let projIdStr = getStringId(\"project\", projectId);\r\n let unitIdStr = getStringId(\"unit\", unitId);\r\n await this.getHeaderData(projIdStr, unitIdStr);\r\n }\r\n }\r\n\r\n async componentDidUpdate(prevProps: IProps, prevState: IState) {\r\n let newParams = { projectId: null, unitId: null };\r\n //Try and get projectId and unitId from the URL\r\n const match = matchPath(this.props.history.location.pathname, {\r\n path: \"/pid/:projectId/uid/:unitId\",\r\n exact: false,\r\n strict: false\r\n });\r\n if (match) {\r\n const { projectId, unitId } = match.params as any;\r\n newParams.projectId = projectId;\r\n newParams.unitId = unitId;\r\n //Header Title has changed. Get and update UI. \r\n if (this.props.reduxDisplay.headerTitleChanged === true && prevProps.reduxDisplay.headerTitleChanged === false){\r\n let projIdStr = getStringId(\"project\", newParams.projectId!);\r\n let unitIdStr = getStringId(\"unit\", newParams.unitId!);\r\n await this.getHeaderData(projIdStr, unitIdStr);\r\n this.props.updateRedux('UPDATE_DISPLAY', { headerTitleChanged: false });\r\n }\r\n }\r\n \r\n //If projectId or unitId have changed in the URL, we need to update the title in the header\r\n if (newParams.projectId !== this.state.projectId || newParams.unitId !== this.state.unitId) {\r\n //set these values in state, so we can compare them each time componentDidUpdate fires (prevProps doesn't work for this)\r\n this.setState({ projectId: newParams.projectId, unitId: newParams.unitId });\r\n\r\n let projIdStr = getStringId(\"project\", newParams.projectId!);\r\n let unitIdStr = getStringId(\"unit\", newParams.unitId!);\r\n await this.getHeaderData(projIdStr, unitIdStr);\r\n }\r\n }\r\n\r\n async getHeaderData(projectId: any, unitId: any) {\r\n if (projectId == \"proj-null\" || unitId == \"unit-null\") {\r\n return;\r\n }\r\n\r\n if (projectId && unitId) {\r\n let appVersion = isNullOrEmpty(this.props.reduxAppVersion.appVersion) ? 0 : this.props.reduxAppVersion.appVersion;\r\n\r\n let response = await getProjectAndUnitName(projectId, unitId, appVersion);\r\n if (response) {\r\n let projectName = isNullOrEmpty(response.projectName) ? \"\" : response.projectName;\r\n let unitTag = isNullOrEmpty(response.unitTag) ? \"\" : response.unitTag;\r\n this.setState({ headerTitle: `${projectName} - ${unitTag}` });\r\n return; //exit\r\n }\r\n }\r\n //if anything failed, just reset\r\n this.setState({ headerTitle: \"\" });\r\n }\r\n\r\n getTitle() {\r\n return this.state.headerTitle;\r\n }\r\n\r\n public render() {\r\n const route = this.props.location.pathname;\r\n\r\n const displayHeading =\r\n route.includes(\"/auth/login\") || route.includes(\"/loginstart\") || route.includes(\"/project\") || route.includes(\"/pid/:projectId/uid/:unitId/project\")\r\n ? null\r\n : this.getTitle();\r\n\r\n return
    {displayHeading}
    ;\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxDisplay: state.reduxDisplay,\r\n reduxAppVersion: state.reduxAppVersion\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ProjectHeader));\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { mapDispatchToProps } from \"../../redux/actions\";\r\nimport { Link } from \"react-router-dom\";\r\nimport \"../../css/TopMenu.scss\";\r\n\r\n// expected props\r\ninterface IProps {}\r\n// local state\r\ninterface IState {}\r\n\r\n//This is a specific header for the project management page, that doesn't have all the chevron options.\r\nclass ProjectManagementHeader extends React.Component {\r\n public render() {\r\n return (\r\n
    \r\n
    Job Files
    \r\n
    \r\n
    \r\n\r\n //
    \r\n //
    \r\n //
    \r\n // \r\n // \r\n // Job Files\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//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n // reduxMenus: state.reduxMenus\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ProjectManagementHeader);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { Link, withRouter } from 'react-router-dom'; //withRouter needed for location & history properties (see readMe)\r\nimport '../../css/ServerError.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n reduxServerErrors: any;\r\n updateRedux: any;\r\n history: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass ServerError extends React.Component {\r\n private clearAuthData() {\r\n this.props.updateRedux('UPDATE_SERVER_ERROR', {\r\n showError: false,\r\n errorType: null,\r\n errorSource: '',\r\n errorMessage: ''\r\n });\r\n //clearLocalStorageKey('reduxAuth');\r\n }\r\n private closeError() {\r\n this.props.updateRedux('UPDATE_SERVER_ERROR', {\r\n showError: false,\r\n errorType: null,\r\n errorSource: '',\r\n errorMessage: ''\r\n });\r\n }\r\n\r\n public render() {\r\n const error = this.props.reduxServerErrors;\r\n const modalCSS = error.showError ? 's-error-container' : 'app-display-none';\r\n\r\n return (\r\n
    \r\n
    \r\n
    X
    \r\n
    \r\n {error.errorType === 401 ? (\r\n <>\r\n
    Error: Authentication Failed. Your session may have timed out.
    \r\n
    \r\n You may want to try logging in again. \r\n this.clearAuthData()}>\r\n Go to Login\r\n \r\n
    \r\n \r\n ) : (\r\n error.errorMessage\r\n )}\r\n
    \r\n
    this.closeError()}>\r\n X\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxServerErrors: state.reduxServerErrors\r\n };\r\n}\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ServerError));\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport { removeNotification } from '../../api-utilities/notification-tools';\r\nimport { INotification } from '../../interfaces/interfaces';\r\nimport '../../css/Notifications.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n notificationData: INotification;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass Notification extends React.Component {\r\n public render() {\r\n const data = this.props.notificationData;\r\n const type = this.props.notificationData.notificationType; //success,info,warning,error\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {data.title}\r\n
    removeNotification(data.id)}>\r\n x\r\n
    \r\n
    \r\n
    {data.content}
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxModals: state.reduxModals\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Notification);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport Notification from './Notification';\r\nimport { INotification } from '../../interfaces/interfaces';\r\nimport '../../css/Notifications.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n reduxNotifications: any;\r\n updateRedux: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\n//This component appears at the bottom of the screen and shows warnings, errors, etc.\r\nclass ModalNotifications extends React.Component {\r\n private getNotifications() {\r\n if (this.props.reduxNotifications.notifications.length > 0) {\r\n return this.props.reduxNotifications.notifications.map((item: INotification, index: number) => (\r\n \r\n ));\r\n }\r\n return null;\r\n }\r\n\r\n public render() {\r\n return
    {this.getNotifications()}
    ;\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxNotifications: state.reduxNotifications\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ModalNotifications);\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { mapDispatchToProps } from '../../redux/actions';\r\nimport '../../css/App.scss';\r\n\r\n// expected props\r\ninterface IProps {\r\n reduxDisplay: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass Loading extends React.Component {\r\n public render() {\r\n const loadingCSS = this.props.reduxDisplay.showLoader ? 'app-loading' : 'app-display-none';\r\n const mainCSS = this.props.reduxDisplay.showLoader ? 'app-loading-blocker' : 'app-display-none';\r\n return
    \r\n
    \r\n
    ;\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxDisplay: state.reduxDisplay\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Loading);\r\n","import React from \"react\";\r\nimport IdentityContext from \"../security/IdentityContext\";\r\nimport { Redirect, Route } from \"react-router-dom\";\r\n\r\n// expected props\r\ninterface IProps {\r\n component: any;\r\n path: any;\r\n}\r\n// local state\r\ninterface IState {\r\n isLoggedIn: boolean | null;\r\n}\r\n\r\nclass PrivateRoute extends React.Component {\r\n public state: IState = { isLoggedIn: null };\r\n\r\n //Connect to global IdentityContext (https://reactjs.org/docs/context.html)\r\n static contextType = IdentityContext;\r\n private readonly identityService = this.context;\r\n\r\n //This is just a private variable we use to hold the promise object for the call to identityService.isLoggedIn\r\n _asyncRequest: any;\r\n\r\n async componentDidMount() {\r\n //This is an odd solution for an odd use case. The render method needs to know if the user is logged in, but that\r\n //depends on an Async call to identityService.isLoggedIn(), and a render method in React can't be async. So we have\r\n //to use this.state.\r\n\r\n //But since this is a routing component, it can get loaded/unloaded multiple times and the combination of\r\n //async promise objects, state, and routing/redirects here can cause an infinite loop. So we have to use the\r\n //variable \"_asyncRequest\" to hold the promise, and have the ability to cancel it in the componentWillUnmount method.\r\n //The example comes from here:\r\n //https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html\r\n\r\n this._asyncRequest = this.identityService.isLoggedIn();\r\n const loggedIn = await this._asyncRequest;\r\n this._asyncRequest = null;\r\n this.setState({ isLoggedIn: loggedIn });\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._asyncRequest) {\r\n this._asyncRequest.cancel();\r\n }\r\n }\r\n\r\n public render() {\r\n const isLoggedIn = this.state.isLoggedIn;\r\n\r\n //If the async call to identityService.isLoggedIn() hasn't finished yet, don't try to load a route. Just return a div.\r\n if (isLoggedIn == null) {\r\n return
    loading.........
    ;\r\n }\r\n\r\n //This copies all the properties from \"this.props\" but it renames \"this.props.component\" to \"Component\" so we can refer\r\n //to it that way below. The \"...rest\" means just copy the rest of the properties as-is.\r\n const { component: Component, ...rest } = this.props;\r\n\r\n //This is hard to read, but what its doing is:\r\n //1. Rendering a and passing all props through to it.\r\n //2. If user is logged in, it returns whatever \"Component\" was passed in.\r\n //3. If not, it redirects to login page.\r\n return (\r\n //TODONEW: Put this back once identityservice is working\r\n (isLoggedIn ? : )}\r\n />\r\n\r\n // } />\r\n );\r\n }\r\n}\r\n\r\nexport default PrivateRoute;\r\n","//This file contains calls to the System Data Service API\r\nimport { displayError, displayErrorString} from '../api-utilities/api-calls';\r\nimport {getAuthToken} from './projectDataService';\r\nimport { IdentityService } from '../security/IdentityService';\r\n\r\nexport async function getAppVersionNumber() {\r\n const apibase = process.env.REACT_APP_CLIENT_API;\r\n const token = await getAuthToken();\r\n\r\n //if(token != ''){\r\n try {\r\n const result = await fetch(apibase + '/dataapi/getLowryProgramVersion', {\r\n method: 'get',\r\n headers: { Authorization: `Bearer ${token}` }\r\n });\r\n\r\n if (result.status === 200) {\r\n const data = await result.json();\r\n if (data.hasError){\r\n displayErrorString(data.errorMessage, \"getLowryProgramVersion\");\r\n }\r\n return data;\r\n }\r\n else{\r\n //Sometimes this call fails because the auth token is invalid but it doesn't log the user out.\r\n //Auto-logout in that case.\r\n //const identityService = new IdentityService();\r\n //const user = await identityService.logout();\r\n displayErrorString(\"Error communicating with server. Try logging out and back in.\", \"getLowryProgramVersion\");\r\n }\r\n }\r\n catch{\r\n displayErrorString(\"Unable to retrieve data from server\", \"getLowryProgramVersion\");\r\n return { hasError: true};\r\n }\r\n // }\r\n // else{\r\n // return {hasError:true, errorMessage: \"Request failed: Invalid access_token.\"};\r\n // }\r\n}","import React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { BrowserRouter, Route, Switch } from \"react-router-dom\";\r\nimport imgLogo from \"../images/specmatelogo.png\";\r\nimport ModalContainer from \"./Modals/ModalContainer\";\r\nimport TopMenu from \"./Menus/TopMenu\";\r\nimport UnitDesign from \"./UnitDesign\";\r\nimport Drawings from \"./Drawings\";\r\nimport UnitLayout from \"./UnitLayout\";\r\nimport ProjectManagement from \"./Project/ProjectManagement\";\r\nimport SpecItems from \"./SpecItems\";\r\nimport Outputs from \"./Outputs\";\r\nimport Pricing from \"./Pricing\";\r\nimport LoginStart from \"./Auth/LoginStart\";\r\nimport IdentityLogin from \"./Auth/IdentityLogin\";\r\nimport IdentityLogout from \"./Auth/IdentityLogout\";\r\nimport TopRightMenu from \"./Menus/TopRightMenu\";\r\nimport TopRightPricing from \"./Menus/TopRightPricing\";\r\nimport ProjectHeader from \"./Menus/ProjectHeader\";\r\nimport ProjectManagementHeader from \"./Menus/ProjectManagementHeader\";\r\nimport ServerError from \"./Modals/ServerError\";\r\nimport ModalNotifications from \"./Modals/ModalNotifications\";\r\nimport Loading from \"./Shared/Loading\";\r\nimport { mapDispatchToProps } from \"../redux/actions\";\r\nimport { IdentityService } from \"../security/IdentityService\";\r\nimport IdentityContext from \"../security/IdentityContext\";\r\nimport PrivateRoute from \"./PrivateRoute\";\r\nimport { getAppVersionNumber } from \"../api-calls/systemDataService\";\r\nimport { getPdfProcessingRecords } from \"../api-calls/pdfGeneratorService\";\r\nimport \"../css/App.scss\";\r\nimport \"../css/TopMenu2.scss\";\r\n\r\n// expected props\r\ninterface IProps {\r\n updateRedux: any;\r\n reduxAppVersion: any;\r\n reduxOutputDocumentsInfo: any;\r\n}\r\n// local state\r\ninterface IState {}\r\n\r\nclass App extends React.Component {\r\n timer: any; //define a timer variable for our SetTimeout\r\n private readonly identityService = new IdentityService();\r\n\r\n async componentDidMount() {\r\n //Check if there's a user id_token in localstorage. If so, extract all the info from it and load back into reduxAuth.\r\n //This needs to be done to reload the userId, access_token, etc. back into redux if the site reloads.\r\n const user = await this.identityService.getUser();\r\n //console.log(user);\r\n\r\n if (user && user.profile) {\r\n await this.identityService.loadUserInfoToRedux(user);\r\n }\r\n\r\n //Get app version number\r\n let response = await getAppVersionNumber();\r\n if (response && !response.hasError) {\r\n let version = response.appVersion;\r\n if (version != null) {\r\n this.props.updateRedux(\"UPDATE_APP_VERSION\", { appVersion: version });\r\n }\r\n }\r\n }\r\n\r\n async componentDidUpdate(prevProps: any) {\r\n if (prevProps.reduxOutputDocumentsInfo.projectId !== this.props.reduxOutputDocumentsInfo.projectId) {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n if (\r\n this.props.reduxOutputDocumentsInfo.projectId !== null &&\r\n prevProps.reduxOutputDocumentsInfo.pollForUpdates === false &&\r\n this.props.reduxOutputDocumentsInfo.pollForUpdates === true\r\n ) {\r\n await this.getPDFRecordsAndConfigurePolling();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n private async getPDFRecordsAndConfigurePolling() {\r\n //console.log('GettingData From App page projectDataAPI');\r\n const previousActiveRecordsCount = this.props.reduxOutputDocumentsInfo.activeProcessingRecordsCount;\r\n const previousShowDocsReadyNotificationIcon = this.props.reduxOutputDocumentsInfo.showDocsReadyNotificationIcon;\r\n const isOnOutputPage = this.props.reduxOutputDocumentsInfo.isOutputPage;\r\n const response = await getPdfProcessingRecords(this.props.reduxOutputDocumentsInfo.projectId);\r\n if (!response?.data.hasError) {\r\n //Check if any records are actively running (status not equal to completed or failed)\r\n let dtos = response?.data.pdfProcessingDTOs;\r\n let activeRecords = dtos.filter(\r\n (item: any) => item.processingStatusName.toLowerCase() !== \"completed\" && item.processingStatusName.toLowerCase() !== \"failed\"\r\n );\r\n this.props.updateRedux(\"UPDATE_ACTIVEOUTPUTDOCUMENTS\", {\r\n pdfRecords: dtos,\r\n activeProcessingRecordsCount: activeRecords.length,\r\n pollForUpdates: activeRecords.length > 0 ? true : false,\r\n showDocsReadyNotificationIcon:\r\n (previousShowDocsReadyNotificationIcon || activeRecords.length < previousActiveRecordsCount) && !isOnOutputPage ? true : false\r\n });\r\n //console.log(this.props.reduxOutputDocumentsInfo.showDocsReadyNotificationIcon);\r\n await this.PollForStatusUpdates();\r\n }\r\n }\r\n\r\n private async PollForStatusUpdates() {\r\n if (this.props.reduxOutputDocumentsInfo.pollForUpdates == true) {\r\n clearTimeout(this.timer);\r\n //poll for updates recursively\r\n this.timer = setTimeout(() => this.getPDFRecordsAndConfigurePolling(), 5000);\r\n } else {\r\n clearTimeout(this.timer);\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n {/* This line loads the IdentityService instance into React \"Context\" object and wraps\r\n the whole app in that context. Every component will have access to the context. */}\r\n \r\n
    \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n \"logo\"\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {/** Pricing only appears for pages that contain /pid in the route **/}\r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n {/** Chevron TopMenu bar only appears for pages that contain /pid in the route **/}\r\n \r\n\r\n {/** Special header for Project Management page with all inactive chevron links **/}\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 {/* Routes the user cannot get to unless they're logged in. */}\r\n {/* NOTE: PrivateRoute.tsx is a custom component we built to handle these routes */}\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
    Version {this.props.reduxAppVersion.appVersion}
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n//------------------ Redux ----------------------------\r\nfunction mapStateToProps(state: any) {\r\n return {\r\n reduxAppVersion: state.reduxAppVersion,\r\n reduxOutputDocumentsInfo: state.reduxOutputDocumentsInfo\r\n };\r\n}\r\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './components/App';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport { Provider } from 'react-redux';\r\nimport { store } from './redux/store';\r\nimport './css/Index.scss';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}