{"version":3,"sources":["components/global-loader/GlobalLoader.js","components/global-overlay/GlobalOverlay.js","components/modal/Modal.js","utils/helpers.js","components/radio-object-group/RadioObjectGroup.js","data/commercial/get-board-type-option-labels.js","data/commercial/get-breaker-type-option-labels.js","utils/apiCallsCommercial.js","data/residential/get-board-type-option-labels.js","data/residential/get-breaker-type-option-labels.js","utils/apiCallsResidential.js","services/CommonFunctionsService.js","components/header-logo/HeaderLogo.js","components/header-brand-commercial/HeaderBrandCommercial.js","components/header-brand-residential/HeaderBrandResidential.js","utils/apiCalls.js","components/header/Header.js","services/AnalyticsDataLayer.js","pages/projects/Projects.js","components/config-chassis/commercial/ChassisOptionsForm.js","pages/project-details/BoardDetailsFormBusinessLogic.js","pages/project-details/commercial/BoardDetails.js","pages/project-details/commercial/BoardTile.js","pages/project-details/commercial/BoardList.js","pages/project-details/commercial/ProjectDetails.js","services/BoardService.js","services/BusbarService.js","pages/project-details/residential/BoardDetails.js","pages/project-details/residential/BoardTile.js","pages/project-details/residential/BoardList.js","pages/project-details/residential/ProjectDetailsResidential.js","components/datepicker/Datepicker.js","pages/quote/Quote.js","pages/quote/QuoteResidential.js","pages/technical-information/TechnicalInformation.js","components/svg/SvgFlexSelectLogo.js","components/svg/SvgLifeIsOnSchneiderElectric.js","components/svg/SvgChevronLeft.js","components/svg/SvgChevronRight.js","components/registerSide/RegisterSide.js","data/userTypes.js","pages/home/Home.js","components/portal/Portal.js","components/svg/SvgLocation.js","components/inputwholesalersLookUp/InputwholesalersLookUp.js","pages/registration/Registration.js","components/config-chassis/commercial/BreakerDetailsFormContainer.js","components/config-chassis/commercial/ChassisBreaker.js","components/config-chassis/commercial/ChassisEmptyPole.js","components/config-chassis/commercial/ChassisSelection.js","components/config-chassis/commercial/ChassisBoard.js","components/config-chassis/commercial/Breaker.js","components/config-chassis/commercial/LooseItems.js","pages/config-chassis/ConfigChassis.js","components/config-chassis/residential/BreakerDetailsFormContainerResidential.js","components/config-chassis/residential/AdditionalItemsFormContainer.js","components/config-chassis/residential/BusBarFormContainer.js","components/config-chassis/residential/ChassisBreaker.js","components/config-chassis/residential/ChassisContactor.js","components/config-chassis/residential/ChassisFittedOption.js","components/config-chassis/residential/BoardEmptyPole.js","components/config-chassis/residential/BoardMainSwitch.js","components/config-chassis/residential/WiserEnergyGateway.js","components/config-chassis/residential/BoardSurgeProtection.js","components/config-chassis/residential/ChassisBoardResidential.js","components/config-chassis/residential/Breaker.js","components/config-chassis/residential/Contactor.js","components/config-chassis/residential/FittedOption.js","pages/config-chassis/ConfigChassisResidential.js","pages/user-profile/UserProfile.js","App.js","reportWebVitals.js","components/cookie-settings/cookieSetting.js","index.js","CONST.js"],"names":["GlobalLoader","Component","GlobalOverlay","onOverlayClick","undefined","props","dismissOnClick","jQuery","removeClass","addClass","id","onClick","this","children","Modal","renderModalHeader","modalTitle","className","type","aria-label","closeModal","callback","modalID","modalClassName","ProgressBar","require","getUrlParameter","name","replace","results","RegExp","exec","window","location","search","parseInt","decodeURIComponent","isNullOrUndefined","value","rejectBlankString","isOdd","num","toggleArrayItem","valueArray","returnArray","cloneDeep","i","indexOf","push","splice","drawPercentProgressBars","fillQuoteRequirementError","each","index","element","$progressBarElement","percentage","dataset","empty","progressBarConfiguration","strokeWidth","trailColor","trailWidth","text","step","state","circle","path","setAttribute","Math","round","setText","color","Circle","progressCircles","animate","getNumberOfRowsFromPolesString","polesString","getNumberOfPolesFromStringExpression","numberOfPolesStringExpression","indexOfPlusSign","firstNumber","substr","secondNumber","getPolesCountFromPolesString","canAddDeviceToBoardPosition","speceUsed","rowIndex","poleIndex","returnErrorMessage","board","boardDetails","boardOptionData","isMainSwitch","breakerItemID","boardContactorId","boardFittedOptionId","isWiserEnergyGateWay","ignoreBusbarChecks","rowPoles","PolesNeeded","poleIndexesToUse","speceUsedInteger","anyIssues","errorMessage","rowBusbar","ProjectBoardBusbarCollection","find","busbar","Row","poleIndexesUnderTheBusbar","StartPosition","BusBarLength","ExtraPoles","breakersUnderBusbar","ProjectBoardBreakerCollection","filter","breaker","RowIndex","PoleIndex","max","map","SurgeProtection","mainSwitchDetails","MainSwitches","mainSwitch","ItemID","MainSwitchID","positionsOccupiedBySurgeProtection","SpaceUsed","intersectionWith","isEqual","length","mainSwitchPosition","MainSwitchPosition","positionsOccupiedByMainSwitch","forEach","positionsOccupiedByExistingDevice","spaceUsedByExistingDevice","BreakerTypeReadOnly","intersectingElements","ProjectBoardContractorCollection","contactor","ContractorReadOnly","ProjectBoardFittedOptionCollection","fittedOption","FittedOptionReadOnly","console","log","RadioObjectGroup","item","isEnabled","selectedValue","selecteCallback","enabled","enabledOptions","anyEnabledFields","anySelectedFields","options","isItemEnabled","selected","layout","boardClassName","title","selectorFriendlyName","split","join","toLowerCase","Fragment","checked","onChange","selectCall","bind","htmlFor","displayGlobalWarnings","React","defaultProps","apiUrlGetBoardOptionLabels","apiUrlGetBreakerOptionLabels","CONST","apiUrlGetDocument","API_PATH","apiUrlGetLayoutDiagrams","apiUrlWholesalerSearch","apiUrlArchiveDeleteProject","apiUrlCopyProject","apiUrlActivityCount","apiUrlUserSettings","apiUrlAllProjects","apiUrlGetProject","apiUrlGetBoardOptions","apiUrlGetBreakerOptions","apiUrlDeleteBoard","apiUrlCopyBoard","apiUrlSaveBoard","apiUrlGetBoardMiscParts","apiUrlGenerateQuote","apiUrlSaveProject","apiUrlSendOrder","apiUrlApplyPromoCode","apiUrlGetBoard","apiUrlSaveBoardBreakerToolbox","apiUrlSaveFavBreaker","apiUrlSaveBreakerToChassis","apiUrlSaveBoardChassisOptions","apiUrlSaveBoardMiscParts","apiUrlAttachPo","apiUrlEmailQuote","apiURLGetAllParts","apiURLGetParentChild","apiUrlXmasMsg","LEGACY_API_PATH","apiWholesalerSearch","requestObj","processRequest","Axios","post","promiseRequest","actionName","dataName","Promise","resolve","reject","then","response","data","Success","Error","Message","catch","error","status","localStorage","removeItem","href","PAGES","HOME","apiCallsCommercial","documentID","get","projectId","Date","getTime","boardId","boardID","requestURL","breakerTypeId","parentBreakerTypeId","parentBoardBreakerItemId","chassisIndex","positionIndex","boardBreakerId","isDeleted","notes","selectedOptionIds","selectedPartIds","boardData","toolboxBreakerId","userId","favBreakerId","updatedProject","wholesalerBranchID","companyName","custName","custAddress","custPhone","custEmail","custQuoteRef","custMarkup","quoteData","saveProjectRequestObj","applyPromoCodeRequestObj","quoteCents","discountedQuoteCents","file64String","email","WholesalerIds","requestObject","API_PATH_RESIDENTIAL","apiUrlGetContactorsOptions","apiUrlGetUserFavouriteBreakers","apiUrlSaveBoardContactorToolbox","apiUrlSaveBoardFittedOptionToolbox","apiUrlSaveContactorToChassis","apiUrlSaveFittedOptionToChassis","apiUrlGetBusBars","apiUrlSaveBusBar","apiCallsResidential","topPowerTag","bottomPowerTag","contactorId","contactorID","toolboxContactorId","fittedOptionID","toolboxFittedOptionId","itemID","busBarItemID","row","extraPoles","startPosition","busbarLength","commonFunctionsService","scrollToTop","document","getElementsByClassName","scrollTop","closeModals","HeaderLogo","to","width","height","viewBox","fill","xmlns","clipPath","d","HeaderBrandCommercial","patternContentUnits","xlinkHref","transform","HeaderBrandResidential","SSS_SERVER","API_PATH_SSO_LOCALHOST","hostname","origin","apiGetLoginSsoUrl","apiPostLoginSsoCallbackUrl","apiGetLogoutSsoUrl","apiRegister","updateProfile","apiGetLogoutSSO","headers","SSO_API_KEY","success","errors","responseMessage","HeaderProjectDashboard","logout","event","preventDefault","logoutURL","alert","isCommercial","TECHNICAL_INFORMATION","withRouter","analyticsDataLayer","project","dataLayer","ecommerce","ctaName","cta_name","funnelStep","funnelTotalSteps","loginDetails","Projects","createNewProject","setState","hasSubmittedNewProject","nameNewProject","newProjectApiErrorMessage","isLoadingNewProject","apiCall","selectedProjectTypeForCreation","apiGetProject","projectData","Title","apiSetProjectTitle","hasCreatedNewProject","GA4DataLayerForProject","setTimeout","openProject","startCreatingNewProject","currentFlexType","isCreatingNewProject","stopCreatingNewProject","handelChange","startProjectDeletion","projectID","confirmingProjectDeletion","projectToDelete","stopProjectDeletion","deleteProject","getProject","isDeletingProject","IsFinalised","deletingProjectTitle","deletedProjectMessage","apiArchiveDeleteProject","serverResponse","hasDeletedProject","updateOrders","updateProjectStats","pageError","message","orders","flexType","updatedOrders","order","concat","setSorting","duplicateProject","isDuplicatingProject","apiCopyProject","hasDuplicatedProject","duplicatedProject","calculateAnyFilteringResults","anySearchResults","some","filterProjectTypeValue","searchValue","handleChange","target","filterProjectType","projectType","compareByProperty","a","b","propertyName","reverse","compareByDate","aV","bV","sorthingType","sortingOrder","sortingDirection","ascendingSorting","sort","closest","history","PROJECT_DETAILS","PROJECT_DETAILS_RESIDENTIAL","hideLandingPage","setItem","isLandingPage","hidePopup","landingPopupMessage","openHowItWorksModal","howItWorksModal","dataLayerObject","toString","createProject","isLoading","apiError","apiMessage","toBeApprovedCountCommercial","incompleteCountCommercial","completeCountCommercial","toBeApprovedCountResidential","incompleteCountResidential","completeCountResidential","isConsultant","isLoadingOrders","isSwitchBoardManufacturer","seenPopupKey","sessionStorage","getItem","getFullYear","apiUserSettings","IsConsultant","UserType","getOrdersData","commercialStats","apiActivityCount","residentialStats","allSettled","OrderCount","ProjectCount","ToBeApprovedCount","IsArchived","IsDeleted","commercialProjects","apiAllProjects","residentialProjects","onSubmit","required","maxLength","autoFocus","disabled","src","frameBorder","allow","allowFullScreen","Header","e","action","placeholder","stroke","style","display","justifyContent","gap","cx","cy","r","IsToBeApproved","ProjectNumberReadOnly","ItemModifiedWhen","ChassisOptionsForm","updateCall","initStates","propsData","selectedOptions","updateCallback","isDisabled","newSelectedOptions","isOptionDisabled","includes","isPole2Filled","opt","isSelected","isValueSelected","toggleSelectedValue","DisplayTitle","DisplayDescription","BoardDetailsFormBusinessLogic","setAndClearRelatedFields","filteredData","canEnableNext","property","hasOwnProperty","checkOptions","filterItem","Chassis1PowerMeterAmperes","ChassisCount","optionName","hasEnabled","Name","ChassisType","meteringData","Metering","uniquePowerCodes","el","PowerMeter1Code","isCodePresent","fullCode","currentData","availableOptions","key","BoardDetails","canGoNextStep","currentStep","BoardColour","RatingAmperes","MeterType","Chassis1PoleCount27mm","Chassis1PoleCount","Chassis2PoleCount","finalSelections","finalFilteredBoardData","logic","availabilityValidationMessages","availablityMessages","IsolatorSize","mainSwitchParentItem","parentChildData","ParentItemReference","mainSwitchChildItemReference","ChildItemReference","mainSwitchAvailability","commercialAllPartsAvailable","ItemCode","IsLowStock","Description","IsInStock","EnclosureReference","enclosureParentItem","enclosureChildItemReference","enclosureAvailability","meterParentItem","meterChildItemReference","meterAvailability","PowerMeter2Code","ChassisReference","chassisParentItem","chassisChildItemReference","chassisAvailability","progress","isExistingBoard","isNotAllowedToGoStep2","isNotAllowedToGoStep3","isNotAllowedToGoStep4","goStep","renderModalFooter","goStepBack","goNextStep","updateBoard","canAddOptionalExtras","hasUsedBackButton","existingBoard","currentStepStatus","addBoard","projectName","createBoardCall","stepNumber","closeCallback","selectChassisOptionalExtras","chassisOptions","optionItemID","optionData","BOMElement","BOMReference","BOMElementAvailability","selectedChassisOptions","boardOptions","apiGetBoardMiscParts","miscData","FittedOptions","apiGetParentChild","apiGetAllParts","allPartsData","nextProps","powerMeterCode","existingPowerMeterCode","useSetState","BoardTypeID","updatedState","IPRating","MainSwitchType","BreakingCapacity","getBoardMeterTypeValue","1","2","3","4","5","updatedBoard","checkIfFilterDataAreTheSame","finalBoard","ProjectID","apiSaveBoard","validationMessage","filterData","allTheSame","checkFields","field","onUpdateCallback","updateSelectedChassisOptions","ctaButtonClick","cta_link","cta_location","updateBoardCall","redirectToChassis","newDataArray","FittedOptionItemID","apiSaveBoardChassisOptions","CONFIGURE_CHASSIS","getCurrentBoardData","largePoleCount","dataItem","BreakerTypeItemID","warn","ChassisPositionIndex","PoleCount","optionSelectedCall","OptionsIPRating","getEnableOptions","OptionsBoardColour","OptionsMainSwitchType","OptionsRatingAmperes","OptionsChassisCount","OptionsChassisType","OptionsBreakingCapacity","OptionsMetering","OptionsMeterType","OptionsChassis1PoleCount27mm","OptionsChassis1PoleCount","OptionsChassis2PoleCount","getSelectedChassisOptionArray","checkIfIndex2IsFilled","dangerouslySetInnerHTML","__html","BoardTile","renderProjectBoardModals","boardDescription","Quantity","editCall","showBoardDetails","copyCall","deleteCall","isValid","editCallback","showBoardDetailsCallback","boardBreakers","maxBoardLimitReached","copyCallback","deleteCallback","drawPercent","chassis1percent","chassis2percent","configureChassisCallback","data-index","data-value","drawingGuid","downloadURL","token","fetch","blob","url","URL","createObjectURL","contentDisposition","filename","matches","createElement","download","click","revokeObjectURL","renderPercent","isFinalised","configureBoard","downloadDrawing","downloadLayout","loadingDrawings","BoardList","boards","drawingG","drawingObj","boardDrawings","drawItem","ProjectBoardID","ItemGUID","BoardBOMComponents","desc","DrawingDesc","StockAvailability","Chassis1PercentComplete","BoardTypeReadOnly","Chassis2PercentComplete","ProjectDetails","startConfiguringBoard","hasMaxBoardLimitBeenReached","isConfiguringBoard","currentBoard","boardToEdit","ProjectBoards","stopConfiguringBoard","indexOfExistingBoard","findIndex","projectBoard","forceUpdate","copyBoard","isDuplicatingBoard","apiCopyBoard","hasDuplicatedBoard","toDeleteBoard","isDeletingBoard","toDeleteBoardId","startChangingProjectTitle","isChangingProjectTitle","stopChangingProjectTitle","stopDeletingBoard","changeProjectTitle","newProjectTitle","changingTitleApiErrorMessage","isRequestingNewProjectTitleChange","hasSubmittedNewProjectTitle","configureChassis","selectedBoardDescription","hideBoardDetails","userData","fillQuoteRequirement","orderSummaryId","apiErrorMessage","initialize","FilledQuoteRequirement","apiGetLayoutDiagrams","orderSummaryArray","ProjectFileCollection","x","drawingsArray","apiGetBoardOption","tempBoardOptionData","apiGetBoardOptionLabels","boardOptionLabels","chassis1PoleCount","chassis2PoleCount","check","label","PreferredWholesaler1ItemID","isRequestingBoardDeletion","apiDeleteBoard","boardLimit","MaxBoardLimit","noEnoughFilled","isEnoughFilledToGenerateQuote","AssemblyPowerLossCheckSuccess","Chassis1PowerLossCheckSuccess","Chassis2PowerLossCheckSuccess","LoadFactorStatusColour","UserIsContractor","pageLink","QUOTE","viewQuote","deleteBoardRequest","boardService","getDetails","EnclosureID","SPDID","MetalBlackPlateID","enclosureDetails","getBoardComponentDetails","metalBlackPlateDetails","SDPDetails","EnclosureType","MetalBlackPlate","IncomerPhase","SwitchType","CircuitBreaker","Rating","MainSwitchRating","CurrentRating","SurgeProtectionDetails","MaxDischargeCapacity","componentsType","boardOption","getBoardCompletionDetails","totalNumberOfBoardPoles","totalNumberOfOccupiedPoles","numberOfDevicesToAllowSeeingTheQuote","additionalPolesOccupied","getMainSwitchIncomingPhasesPoles","spaceUsed","HasWiserEnergyGateway","totalPoles","totalPolesConfigured","totalPolesRemaining","completionPercentage","isEnoughCompletedToSeeTheQuote","incomerPhaseName","incomerPhase","maxDischargeCapacity","MCBReference","busbarService","mountingPosition","isRowWithMainSwitch","neutralTerminalBlock","firstConnectableBreaker","busbarStartIndex","lowerCasedMountingPosition","busbarPoles","lastConnectableBreakerPositionIndex","lastConnectableBreakerSpaceUsed","lastConnectableBreakerPosition","busBarPoles","rowLength","firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice","willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock","busbarRequiredLengthToCoverAllDevices","getBusbarMinimumLengthToCoverAllRowDevices","maximumPolesConsideringLengthOfTheBusbar","maximumPolesConsideringLengthOfTheRowAndBusbarSize","maximumPolesConsideringIncompatibleDeviceOnRightSide","BoardDetailsResidential","checkIfInStock","availabilityItem","outOfStock","isFormValid","enclousureReference","Enclosures","Reference","availabilityEnclousureReference","residentialAllPartsAvailable","part","metalBlackPlateID","currentSelectionRows","NumberOfRows","availabilityMetalBlackPlate","mainSwitchReference","availability","SPDDetails","getSPDDetails","saveBoard","getCircuitBreakerEnabledOptions","getMetalBlackPlateEnabledOptions","getMainSwitchRatingEnabledOptions","getSurgeProtectionEnabledOptions","getMaxDischargeCapacityEnabledOptions","updatedBoardDetails","BoardService","hasSurgeProtectionMandatoryMCB","getSurgeProtectionRequiredMCBReference","existingSPDDetails","SDPs","info","orderedBreakers","orderBy","requiredMCBReference","deleteBreakerFromBoard","currentMainSwitch","spacesToMove","busbarsWithNeutralBlock","BusbarService","getBusbarsWithNeutralTerminalBlockReferences","firstRowBusbar","BusBarReadOnly","MountingPosition","WiserEnergyGatewayPosition","WiserEnergyGatewayRow","requiredSurgeProtectionMCBReference","isCorrectMCBPresentAtRequiredPosition","boardBreaker","isDifferentDevicePresentAtRequiredPosition","isCorrectDevicePresentAtRequiredPosition","canAddDeviceToPosition","foundBreakerData","breakerOptionData","breakerOption","apiSaveBreakerToChassis","polesNeededEnabled","polesNeededSelected","quantityServerUpdate","debounce","updateBoardQuantityCallback","quantity","updatedQuantity","updatedQuantityAsNumber","isUpdatingBoardQuantity","precentComplete","decreaseQuantity","changeQuantity","readOnly","increaseQuantity","completionDetails","ProjectDetailsResidential","updateProjectBoardCompletions","updateBoardQuantity","newQuantity","isApiCall","indexOfTheCurrentProjectBoard","CONFIGURE_CHASSIS_RESIDENTIAL","areEnoughBoardsToGenerateQuote","totalUserBoardsQuantity","MINIMUM_RESIDENTIAL_BOARD_QUANTITY","apiGetBreakerOptions","breakerTypeData","allParts","updatedProjectBoards","boardCompletionDetails","selectedBoard","selectedBoardBreaker","updatedBreakers","areAllProjectBoardsEnoughFilled","QUOTE_RESIDENTIAL","Datepicker","prototype","addDays","date","valueOf","setDate","getDate","getDay","minDate","self","Pikaday","ReactDOM","findDOMNode","refs","pikaday","format","firstDay","yearRange","disableWeekends","onSelect","handleDate","datepickerID","labelText","ref","placeholderText","defaultValue","defaultDate","Quote","getDisplayQuoteValues","displayQuote","orgExGST","incGST","exGST","GST","QuoteCentsExGST","QuoteDiscountedCentsExGST","QuoteDiscountedCentsIncGST","QuoteDiscountCentsGST","QuoteCentsIncGST","QuoteCentsGST","getCustomerDisplayQuoteValues","getNumericAttr","CustomerQuoteCentsExGST","CustomerDiscountedQuoteCentsIncGST","CustomerDiscountedQuoteCentsExGST","CustomerDiscountedQuoteCentsGST","CustomerQuoteCentsIncGST","CustomerQuoteCentsGST","hideLeadTimes","showBreakdown","hideEmailCustomerQuote","showEmailCustomerQuoteModal","renderCurrency","cents","toLocaleString","currency","minimumFractionDigits","maximumFractionDigits","boardItem","boardItemObj","boardDescriptionObj","applyPromoCode","promoCode","validation","promoCodeInput","promoCodeApi","quote","apiApplyPromoCode","attachedPO","POIsValid","showPromoCodeInput","pageInfo","handlePromoCode","handlePOUpload","attachingPO","reader","FileReader","fileInput","quoteObj","onloadend","apiAttachPo","result","POFileName","readAsDataURL","files","validateForm","showConfirmationModal","saveProject","placeOrderApi","QuoteCustomerMarkupPercent","purchaseNumber","selectedWholesalerIDForProduction","apiSave","submitOrder","sendEmailCustomerQuote","emailQuote","apiGenerateQuote","preferredWholesalerID","QuoteCompanyName","QuoteCustomerName","QuoteCustomerEmail","QuoteCustomerQuoteRef","apiEmailQuote","quote_id","quote_name","total_amount","markup_percentage","requestWholesalersQuote","hideConfirmationModal","showEmailCustomerQuote","isError","disclaimerCheckbox","app","drawing","updateDetails","drawings","contractorRequestAgain","wholesalerToSendQuote","QuoteCustomerAddress","QuoteCustomerPhone","orderPlacementCondition1Accepted","orderPlacementCondition2Accepted","orderPlacementCondition3Accepted","orderPlacementCondition4Accepted","orderPlacementCondition5Accepted","preferredWholesaler","userDataObj","EndCustomerMarkupFactor","existingQuote","WholesalerBranchIDOrderedThrough","PurchaseNumber","QuotePromoCode","getDrawingsFromServer","generateQuote","quoteCompanyName","quoteCustName","quoteAddress","quotePhone","quoteEmail","quoteRef","quoteMarkup","obj","attribute","itemData","Category","Price","viewItemList","drawingsDownloaded","numberOfDrawings","downloadNext","apiSendOrder","projectBoards","newProjectBoardDetails","baseEventDetails","item_board_name","item_board_id","configuration_name","configuration_id","purchase","addToCart","hasRequestedEmailQuote","increase","markup","quoteValue100","isSwitchManOrLargeContractor","changeWholesalerMarkup","boardValues","showLeadTimes","UserTypeString","quoteValue","renderMarkup","rel","downloadDrawings","renderOrderItemTable","hidden","PreferredWholesalers","wholesaler","WholesalerBranchID","WholesalerBranchName","purchaseOrderNumber","boardItemDescriptionsToAdd","itemDescription","boardItemObject","BOMComponent","setDispatchDate","PreferredDispatchDate","noPurchaseNumber","noAttachedPO","wholesalersToSendQuote","ResidentialEndCustomerMarkupFactor","anyBoardMissingGeneratedComponents","indexOfAlreadySelectedWholeseler","wholesalersArray","margin","changeWholesalerMargin","handleWholsalerSendQuoteChange","FAQs","question","answer","RESIDENTIALFAQS","TechnicalInformation","faq","alt","SvgFlexSelectLogo","SvgLifeIsOnSchneiderElectric","SvgChevronLeft","SvgChevronRight","RegisterSide","findOutMore","handleNextSlide","prevState","currentSlide","handlePrevSlide","totalSlides","slide","visibility","userTypes","icon","isEnable","Home","onLoginButtonClick","startRegistrationEvent","userType","registrationStep","ssoLoginURL","URLSearchParams","replaceState","pathname","SSO_CURRENT_SITE","flatMap","Portal","createPortal","body","SvgLocation","InputwholesalersLookUp","toggleFlyout","isOpen","handleSearch","term","getElementById","latitude","longitude","isPending","SearchText","Latitude","Longitude","list","finally","isDirty","handleGeoSearch","navigator","geolocation","getCurrentPosition","position","coords","fetchWholesalers","existingWholesalerData","selectedBranchName","selectedWholesalerBranchID","WholesalerBranchAddress","WholesalerBranchSuburb","WholesalerBranchPostcode","WholesalerBranchState","SECTIONS","recaptchaRef","createRef","recaptchaRefElectrician","Registration","formId","form","submitIntent","formElements","elements","formIsValid","nodeName","elementId","elementLabel","querySelector","textContent","elementValue","elementError","trim","validateEmail","postal","validatePostalCode","validatePhone","test","phone","postalCode","submitProfileForm","queryParams","isFinalStep","currentSection","submitBusinessForm","recaptchaValue","current","getValue","registerUser","submitWholesalersForm","registerRequest","firstName","lastName","phoneNumber","businessName","businessPhoneNumber","businessWebsite","accountId","businessPostalAddress","businessPostalPostCode","businessPostalCity","businessPostalState","branchId","preferredWholesaler1Id","preferredWholesaler2Id","preferredWholesaler3Id","userSubscriptionIndustryNews","businessAbnacnnumber","isBusinessABNACNMatchingWholesaler","acceptedTermsAndConditions","registrationComplete","urlParams","entries","data-submit-intent","noValidate","onBlur","data-error-for","pattern","autoComplete","data-postal","fontSize","sitekey","RECAPTCH_SITE_KEY","BreakerDetailsFormContainer","BreakerDetailsFormBusinessLogic","breakerOptions","breakerDetails","isHybridBoard","breakingCapacity","existingBreaker","existingBreakerPitch","breakerTypeCode","TypeCode","breakerCurrentRating","parentBreaker","ParentBreakerTypeItemID","PitchPoleSize","isOutOfStock","finalFilteredBreakerData","finalBreaker","breakerObj","breakCode","startsWith","createCallback","updatebreaker","availabilityDataForSelectedBreaker","BreakerReference","OptionsTypeCode","OptionsPoleCount","OptionsPitchPoleSize","OptionsCurrentRating","trimData","tempData","tempItem","ChassisBreaker","editClickCall","updateBrekerChassisNoteCall","showEditOptions","isDeleting","BreakerCircuitLabelInput","deletedCallback","chassisPosIndex","itemId","updateBrekerChassisNote","poles","code","ChassisEmptyPole","isActive","canDrop","isOver","isDraggingItem","connectDropTarget","DropTarget","drop","connect","monitor","dropTarget","ChassisSelection","selectedIndex","selectedCallback","chassis1filled","chassis2filled","filled","renderTab","ChassisBoard","notesOpen","clickedCallback","note","noteInput","updateNotesCallback","togglelNotesCall","rowCounts","floor","rows","indexOffset","rightIndex","rightPoleDisabled","disabledIndex2","hybridPoleCount","isLarge","leftBoardBreaker","breakers","rightBoardBreaker","renderBreakers","disabledIndex2ComponentName","noteItem","stopPropagation","BreakerCircuitLabel","updateNotesCall","renderEmptySlot","breakerData","displayCode","ParentBreakerCurrentRating","configured","remaining","powerLossCheckSuccess","powerLossPercentage","toFixed","renderRows","Breaker","opacity","isDragging","handleDeletingBreaker","handleToggleBreakerFavourite","handleBreakerAutoAdd","connectDragSource","usedCount","poleCount","drawingDesc","isBreakerFavourite","isDragAndDropEnabled","handleUpdateQuantity","DragSource","beginDrag","endDrag","dropResult","getDropResult","addBreakerToBoard","canDrag","dragSource","selectedParts","closePanel","checkPart","LooseSupplyItemItemID","totalSelectedQuantity","partsList","getPartSelectedQty","mod","updatedParts","partInfo","foundPart","removeIndex","QtyLimit","removeFromCart","getTotalSelectedQuantity","selectedQty","marginBottom","updateSelectedPart","SAMPLE_BREAKER","ConfigChassis","isNew","displayMaxBoardLimitReached","boardToConfigure","shouldRedirectToBoard","addBreaker","selectChassis","updateSelectedMiscParts","miscParts","favBreakers","isBreakerModalOpen","activeBreakersTab","editedBreaker","idInCollection","isFav","shouldDisplayLooseOptionPlinthMessage","isSavingLooseItems","selectedChassisIndex","isAddingBreaker","hasAlreadyShownEnoughQuoteInfo","totalLooseItems","showDragNDropTutorial","apiGetBoard","tempBreakerTypeData","apiGetBreakerOptionLabels","breakerTypeLabelsData","breakerCurrentRatings","LooseSupplyItems","getTotalLooseItems","checkLooseOptionPlinthPopup","UserID","FavouriteBreakers","ProjectBoardBreakerToolboxCollection","breakerID","apiSaveBoardBreakerToolbox","toolboxBreaker","closeBreakerModal","getBreaker","deleteFavBreaker","deleteBreaker","deletedBreaker","favouriteBreaker","getBreakerFavourite","favouriteBreakerItemID","toggleBreakerFavourite","favouriteItemID","apiSaveFavBreaker","userID","favBreaker","removeFromFavourites","breakerItem","res","addToFavourites","ChassisIndex","BreakerIsParent","checkOption","TypeDescription","count","checkIfIndex2IsDisabled","total","notRoundedValue","getConfiguredPoleCount","flooredValue","ceil","breakerObject","parentBreakCode","breakerId","isAutoAdding","useBreaker","getBreakerDataForPlacing","polesNeeded","chassisPoles","getChassisBoardBreakers","breakerSize","checkStartIndex","checkMaxPoles","fitIndex","getTriggerIndexForPolesFitAtIndex","maxPoles","startedIndex","backStep","finalIndex","hasBreakerAtIndex","colBreakers","getBreakerDataObj","foundBreaker","startIndex","endIndex","selectedBreakerData","selectedBreaker","sampleBreaker","ParentBoardBreakerItemID","existingTemporaryBreakerIndex","toolboxItem","noteBoardBreaker","realPoleIndex","displayError","newTotalSelectedParts","isLooseItemsPanelOpen","ProjectBoardLooseSupplyItemCollection","selectedItem","apiSaveBoardMiscParts","projectAssemblyCheck","checkProjectAssemblyPerformanceChecks","anyPlinthLooseOptionsSelected","LooseSupplyItemReadOnly","checks","getLooseItemSelectedQty","qty","editingFav","assemblyPowerLossePercentage","MaxAssemblyPowerLoss","TotalAssemblyPowerLoss","assemblyCurrentPercentage","MaxCurrent","TotalCurrent","autoplay","getEditingBreaker","editFavBreaker","editBreaker","addNewBoard","startAddingBreaker","overflow","clear","getUsedCount","isBreakerDisabled","autoAddbreaker","handleBreakerDrop","MaxThermalLossesDescription","LoadFactorDescription","ChassisNotes","getDisabledIndex2ComponentName","updateChassisNotesOnBoard","getChassisPercentComplete","getRemainingPoleCount","PowerLossChassis2","MaxChassisPowerLoss","PowerLossChassis1","updatedBoardData","BreakerDetailsFormContainerResidential","TypeOfDevice","NumberOfPoles","availableValues","getNumberOfPolesEnabledOptions","typeOfDevice","getTypeOfDeviceEnabledOptions","getCurrentRatingEnabledOptions","createCall","AdditionalItemsFormContainer","contactors","selectedContactor","selectedFittedOption","saveContactor","saveFittedOption","contactorOptions","fittedOptions","onSelectCell","BusBarFormContainer","compatibleBusbarDevices","updateFittedOptionPosition","updateBreakerPosition","updateContactorPosition","updateMainSwitchPosition","errorInfo","isAllowedToProceed","boardRows","boardRowPoles","RowSelection","BusBarPhases","BusBarPoles","BusBarExtraPoles","selectedBusBarData","isExtraPolesFieldEnabled","skipChecks","mainSwitchID","firstConnectableDeviceIndex","lastConnectableDeviceIndex","findLastIndex","slice","returnErrors","getMainSwitchDetails","selectedRowIndex","existingRowBreakers","breakersAttachedToTheBoard","connectableDevices","getBusbarConnectableDevices","any3PNRCBO","any36MM1PNRCBO","ignorePolesSelection","busbarsData","possibleBusbars","getPossibleBusbars","shouldHaveNeutralTerminalBlock","rowDevices","poleIndexOfFirstConnectableDevice","lastConnectableBreaker","getBusbarStartIndex","anyAvailableOptionsBeforeCheckingBusbarLength","option","optionAsInteger","resetAvailabilityValidation","selectedRowNumber","existingRowContactors","contactorsAttachedToTheBoard","existingContactor","firstLastCompatibleBreakersRange","incompatibleBreakers","getIncompatibleBusbarBreakers","incompatibleContactors","firstBreaker","first","lastBreaker","last","existingBusbars","existingBusbar","availabilityDataForSelectedBusbar","canProceed","getMaximumExtraPoles","changeExtraPolesQuantity","orderedRowDevices","incompatibleDevicesOnRightSideOfLastCompatibleDevice","isPositionBeforeMainSwitchOccupied","canDevicesBeMovedToMakeSpaceForNeutralTerminalBlock","busbarMaximumExtraPoles","getMaximumAllowedExtraPoles","maximumExtraPoles","existingRowFittedOptions","fittedOptionsAttachedToTheBoard","device","existingRowDevices","lastDeviceOnRow","lastDeviceType","canMoveBrekerByOnePole","existingRowOrderedBreakers","existingRowOrderedFittedOptions","existingRowOrderedContactors","breakersOnRightOfTheMainSwitch","fittedOptionsOnRightOfTheMainSwitch","contactorsOnRightOfTheMainSwitch","Note","busbarErrorMessage","isAutomaticallyUpdatingDevices","automaticallyMoveRowDevicesToMakeSpaceForNeutralTerminalBlock","busbarStartPosition","addBusBarToBoard","getEnabledPolesOptions","getEnabledPhasesOptions","setMountingPosition","getEnabledRowSelections","setRowSelection","handlePolesSelection","saveBusbar","labelInput","focus","startNumber","displayNumbers","displayNumber","addPowerTag","togglePowerTagCallback","uniqueIndex","isMandatoryMCB","BottomPowerTag","TopPowerTag","togglePowerTag","generateBrekerPositions","currentRating","isAllowedToDragNDropPole","ChassisContactor","updateContactorChassisNoteCall","customLabel","updateContactorChassisNote","generateDevicePositions","ChassisFittedOption","updateFittedOptionChassisNoteCall","updateFittedOptionChassisNote","BoardEmptyPole","poleDisplayIndex","BoardMainSwitch","rating","WiserEnergyGateway","updateWiserEnergyGatewayPosition","BoardSurgeProtection","polesUsed","ChassisBoardResidential","togglePowerTags","updatePowerTagsEditing","isEditingPowerTags","deleteContactorCall","deleteFittedOptionCall","isUpdatingDevice","percentageConfigured","deleteContactorCallback","deleteFittedOptionCallback","rowArrayIndex","busbars","BusBarItemID","removeBusbar","rowsCount","columnsCount","rowTopBusbar","getRowBusbar","rowBottomBusbar","renderPoles","isRowWithSurgeProtection","surgeProtection","poleArrayIndexOfMandatorySurgeProtectionMCB","surgeProtectionDetails","currentBusbar","poleArrayIndex","shouldDisplayNeutralBlock","shouldDisplayWiserEnergyGateway","hasWiserEnergyGateway","wiserEnergyGatewayRow","wiserEnergyGatewayPosition","mainSwtchIncomingPhases","mainSwitchRating","boardName","openBusbarModalCallback","description","Contactor","handleDeletingContactor","handleContactorAutoAdd","handleContactorUpdateQuantity","ContactorItemID","addContactorToBoard","FittedOption","handleDeletingFittedOption","handleFittedOptionAutoAdd","handleFittedOptionUpdateQuantity","addFittedOptionToBoard","SAMPLE_CONTRACTOR","SAMPLE_FITTED_OPTION","ConfigChassisResidential","deleteContactorFromBoard","deleteFittedOptionFromBoard","onScroll","scrollRef","isAdditionalItemsModalOpen","isBusbarModalOpen","boardPolesTotal","boardPolesConfigured","boardPolesRemaining","boardCompletionPercentage","isAddingDevice","isAddingBusBar","hasMixedDifferentProductRanges","checkForDifferentProductRanges","filteredFittedOptions","apiGetBusBars","apiGetContactorsOptions","contactorsOptionData","apiGetUserFavouriteBreakers","favouriteBreakers","contactorItemId","ProjectBoardContactorToolboxCollection","fittedOptionItemId","ProjectBoardFittedOptionToolboxCollection","apiSaveBoardContactorToolbox","toolboxContactor","updatedContactors","displayTutorial","closeAddingAdditionalItemsModal","apiSaveBoardFittedOptionToolbox","toolboxFittedOption","updatedFittedOptions","getContactor","deleteContactor","getFittedOption","deleteFittedOption","has6kABreakers","has45kABreakers","contactorObject","ContractorItemID","fittedOptionObject","numberOfRows","numberOfPoles","positionFound","foundPositionAndAddingBreaker","selectedDevice","foundPositionAndAddingDevice","ContactorReadOnly","fittedOptionId","canAddMessage","selectedBoardContactor","boardContactor","apiSaveContactorToChassis","selectedBoardFittedOption","apiSaveFittedOptionToChassis","handleWiserEnergyGatewayDisplay","powerTagType","numberOfPowertags","numberOfPowertagControls","findAvailablePositionForDevice","boardRequest","powertagCheck","canAddPowertag","updateBreakerState","boardBreakerData","indexOfTheUpdatedBreaker","updatedFittedOptios","boardFittedOption","apiSaveBusBar","updatedBusbars","contactorData","selectedContactorData","sampleContactors","existingTemporaryContactorIndex","fittedOptionData","selectedFittedOptionData","sampleFittedOption","updatedFittedOption","existingTemporaryFittedOptionIndex","totalComponent","stopCreatingBusbar","startAddingAdditionalItems","getValidationMessage","contactorObj","getUsedContactorCount","autoAddContactor","handleContactorDrop","fittedOptionObj","getUsedFittedOptionCount","autoAddFittedOption","handleFittedOptionDrop","startCreatingBusbar","UserProfile","getExistingWholesalerData","wholesalerID","userSettings","updateUser","userFirstName","userLastName","userEmail","userMobile","userPostalAddress","userPostcode","userCity","userState","UserWholesalerBranchID","preferredWholesaler1Input","preferredWholesaler2Input","preferredWholesaler3Input","put","apiUpdateProfile","hasUpdatedUserProfile","hasCompletedLoading","preferredWholesalerData","class","UserEmail","for","UserFirstName","UserLastName","UserMobile","UserPostalAddress","UserPostcode","UserCity","UserState","PreferredWholesaler2ItemID","PreferredWholesaler3ItemID","0","App","isAuthenticating","tokenParam","apiPostLoginSSOCallback","setAxiosAuthorizationHeader","arrayToken","JSON","parse","atob","login","federatedId","ailApplications","isFederatedId","companyId","customerClassificationCategory","customerClassificationSubCategory","stringify","defaults","common","axios","surveyFederatedId","UserGuid","surveyLastName","surveyFirstName","surveyEmailId","surveyPhoneNumber","UserPhone","listen","userTypeName","processDataLayerPageView","isOnProjectPage","queryString","params","callDataLayer","pageView","process","getTopCategory","QuoteResidential","REGISTER","PROFILE","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","CookieSetting","bottom","baseUrl","getElementsByTagName","getAttribute","rootElement","render","DndProvider","backend","HTML5Backend","basename","StrictMode","exports","LOGIN","UPDATE_PROFILE_INFO"],"mappings":"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","file":"static/js/main.8f1f93e3.chunk.js","sourcesContent":["import React, { Component } from 'react'\r\n\r\nexport default class GlobalLoader extends Component {\r\n render () {\r\n return (\r\n
\r\n )\r\n }\r\n}","import React, { Component } from 'react'\r\nimport jQuery from \"jquery\"\r\n\r\nexport default class GlobalOverlay extends Component {\r\n componentDidMount() {\r\n jQuery('body').addClass('overlay-is-open')\r\n }\r\n\r\n onOverlayClick = () => {\r\n if (this.props.dismissOnClick !== undefined && this.props.dismissOnClick) {\r\n jQuery('body').removeClass('overlay-is-open')\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n jQuery('body').removeClass('overlay-is-open')\r\n }\r\n\r\n render () {\r\n return (\r\n
{ this.props.children }
\r\n )\r\n }\r\n}","import React, { Component } from 'react'\r\nimport jQuery from \"jquery\"\r\n\r\nexport default class Modal extends Component {\r\n componentDidMount() {\r\n jQuery('body').addClass('modal-is-open')\r\n }\r\n\r\n renderModalHeader = () => {\r\n if (this.props.modalTitle) {\r\n return (\r\n
\r\n \r\n {\r\n this.props.modalTitle !== undefined && this.props.modalTitle !== '' &&\r\n

{this.props.modalTitle}

\r\n }\r\n
\r\n )\r\n }\r\n }\r\n\r\n closeModal = () => {\r\n if (this.props.callback !== undefined) {\r\n this.props.callback()\r\n }\r\n\r\n jQuery('body').removeClass('modal-is-open')\r\n }\r\n\r\n\r\n render() {\r\n return (\r\n
\r\n
\r\n { this.renderModalHeader() }\r\n\r\n
\r\n \r\n { this.props.children }\r\n
\r\n
\r\n \r\n
\r\n )\r\n }\r\n}","import { cloneDeep, intersectionWith, isEqual } from 'lodash'\r\nimport jQuery from 'jquery'\r\n\r\nconst ProgressBar = require('progressbar.js')\r\n\r\n// This function will attach the keypress of \"enter\" to trigger the element's click event\r\n// This function is only needed on 'non-native' clickable elements like div / span ....\r\n// Things like \r\n
\r\n
  • \r\n My Account\r\n
  • \r\n
  • \r\n this.logout(event)}>Sign out\r\n
  • \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n Help\r\n \r\n \r\n \r\n \r\n\r\n { this.props.children }\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(HeaderProjectDashboard)","export class AnalyticsDataLayer {\r\n createProject(project) {\r\n window.dataLayer.push({\r\n event: 'create_project',\r\n ...project\r\n })\r\n }\r\n\r\n deleteProject(project) {\r\n window.dataLayer.push({\r\n event: 'delete_project',\r\n ...project\r\n })\r\n }\r\n\r\n duplicateProject(project) {\r\n window.dataLayer.push({\r\n event: 'duplicate_project',\r\n ...project\r\n })\r\n }\r\n\r\n addBoard(board) {\r\n window.dataLayer.push({\r\n event: 'add_board',\r\n ...board\r\n })\r\n }\r\n\r\n addBreaker(breaker) {\r\n window.dataLayer.push({\r\n event: 'add_breaker',\r\n ...breaker\r\n })\r\n }\r\n\r\n addToFavourites(project) {\r\n window.dataLayer.push({\r\n event: 'add_to_wishlist',\r\n ecommerce: {\r\n ...project\r\n }\r\n })\r\n }\r\n\r\n removeFromFavourites(project) {\r\n window.dataLayer.push({\r\n event: 'remove_from_favorites',\r\n ...project\r\n\r\n })\r\n }\r\n\r\n viewItemList(project) {\r\n window.dataLayer.push({\r\n event: 'view_item_list',\r\n ecommerce: {\r\n ...project\r\n }\r\n })\r\n }\r\n\r\n addToCart(project, ctaName = 'quantity increase') {\r\n window.dataLayer.push({\r\n event: 'add_to_cart',\r\n cta_name: ctaName,\r\n ecommerce: {\r\n ...project\r\n }\r\n })\r\n }\r\n\r\n removeFromCart(project) {\r\n window.dataLayer.push({\r\n event: 'remove_from_cart',\r\n ecommerce: {\r\n ...project\r\n }\r\n })\r\n }\r\n\r\n purchase(project) {\r\n window.dataLayer.push({\r\n event: 'purchase',\r\n ecommerce: {\r\n ...project\r\n }\r\n })\r\n }\r\n\r\n ctaButtonClick(project) {\r\n window.dataLayer.push({\r\n event: 'cta_click',\r\n ...project\r\n })\r\n }\r\n\r\n viewQuote(project) {\r\n window.dataLayer.push({\r\n event: 'quote_creation',\r\n ...project\r\n })\r\n }\r\n\r\n emailQuote(project) {\r\n window.dataLayer.push({\r\n event: 'quote_interaction',\r\n ...project\r\n })\r\n }\r\n\r\n downloadLayout(project) {\r\n window.dataLayer.push({\r\n event: 'download',\r\n ...project\r\n })\r\n }\r\n\r\n registrationStep(funnelStep, funnelTotalSteps) {\r\n window.dataLayer.push({\r\n 'event': 'registration_start',\r\n 'funnel_step': funnelStep,\r\n 'funnel_total_steps': funnelTotalSteps\r\n })\r\n }\r\n\r\n registrationComplete() {\r\n window.dataLayer.push({\r\n 'event': 'registration_complete'\r\n })\r\n }\r\n\r\n login(loginDetails) {\r\n window.dataLayer.push({\r\n 'event': 'login',\r\n ...loginDetails\r\n })\r\n }\r\n\r\n pageView(data) {\r\n window.dataLayer.push({\r\n 'event': 'page_view',\r\n ...data\r\n })\r\n }\r\n}\r\n\r\nconst analyticsDataLayer = new AnalyticsDataLayer()\r\nexport default analyticsDataLayer\r\n","import React from 'react'\r\nimport { withRouter } from 'react-router-dom'\r\nimport GlobalLoader from './../../components/global-loader/GlobalLoader'\r\nimport GlobalOverlay from './../../components/global-overlay/GlobalOverlay'\r\nimport Modal from './../../components/modal/Modal'\r\nimport RadioObjectGroup from './../../components/radio-object-group/RadioObjectGroup'\r\nimport { apiCallsCommercial } from './../../utils/apiCallsCommercial'\r\nimport { apiCallsResidential } from './../../utils/apiCallsResidential'\r\nimport commonFunctionsService from './../../services/CommonFunctionsService'\r\nimport Header from '../../components/header/Header'\r\nimport jQuery from 'jquery'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport { GA4DataLayer, getUrlParameter } from '../../utils/helpers'\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\n\r\nconst { CONST } = require('../../CONST')\r\n\r\nclass Projects extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n isLoading: true,\r\n apiError: false,\r\n apiMessage: 'Loading user details',\r\n toBeApprovedCountCommercial: null,\r\n incompleteCountCommercial: null,\r\n completeCountCommercial: null,\r\n toBeApprovedCountResidential: null,\r\n incompleteCountResidential: null,\r\n completeCountResidential: null,\r\n isConsultant: false,\r\n landingPopupMessage: '',\r\n isCreatingNewProject: false,\r\n isLoadingNewProject: false,\r\n hasSubmittedNewProject: false,\r\n newProjectApiErrorMessage: '',\r\n hasCreatedNewProject: false,\r\n nameNewProject: '',\r\n searchValue: '',\r\n filterProjectTypeValue: 'all',\r\n sorthingType: '',\r\n ascendingSorting: false,\r\n anySearchResults: true,\r\n isLoadingOrders: true,\r\n isLandingPage: false,\r\n howItWorksModal: false,\r\n orders: [],\r\n isDuplicatingProject: false,\r\n confirmingProjectDeletion: false,\r\n projectToDelete: 0,\r\n isDeletingProject: false,\r\n hasDeletedProject: false,\r\n deletingProjectTitle: '',\r\n deletedProjectMessage: '',\r\n isCommercial: true,\r\n currentFlexType: 'Commercial',\r\n selectedProjectTypeForCreation: 'Commercial',\r\n isSwitchBoardManufacturer: false\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n // Stop displaying the message in 2025\r\n const seenPopupKey = 'christmas-message'\r\n if (!sessionStorage.getItem(seenPopupKey) && new Date().getFullYear() === 2024) {\r\n this.setState({ landingPopupMessage: 'Please note that any orders placed from 6/12/2024 onwards may not be guaranteed to be shipped by the end of this year. This is primarily due to the upcoming holidays. We kindly request your understanding and patience during this time.' })\r\n\r\n sessionStorage.setItem(seenPopupKey, 'seen')\r\n }\r\n\r\n apiCallsCommercial.apiUserSettings()\r\n .then(response => {\r\n this.setState({\r\n isConsultant: response.IsConsultant,\r\n // Back-end uses constand to identify user roles, so this should be a reliable way to identifiy the role\r\n isSwitchBoardManufacturer: response.UserType === 1\r\n })\r\n })\r\n\r\n this.updateProjectStats()\r\n this.getOrdersData()\r\n\r\n if (getUrlParameter('showResidential') === true) {\r\n this.setState({ isCommercial: false, currentFlexType: 'Residential' })\r\n }\r\n }\r\n\r\n updateProjectStats() {\r\n const commercialStats = apiCallsCommercial.apiActivityCount()\r\n const residentialStats = apiCallsResidential.apiActivityCount()\r\n\r\n Promise.allSettled([commercialStats, residentialStats])\r\n .then((results) => {\r\n this.setState({\r\n isLoading: false,\r\n completeCountCommercial: results[0].value.OrderCount,\r\n incompleteCountCommercial: results[0].value.ProjectCount,\r\n toBeApprovedCountCommercial: results[0].value.ToBeApprovedCount,\r\n completeCountResidential: results[1].value.OrderCount,\r\n incompleteCountResidential: results[1].value.ProjectCount,\r\n toBeApprovedCountResidential: results[1].value.ToBeApprovedCount\r\n })\r\n })\r\n }\r\n\r\n getOrdersData() {\r\n this.setState({ isLoadingOrders: true })\r\n\r\n // Different flags for project API\r\n const requestObject = {\r\n IsArchived: false,\r\n IsDeleted: false,\r\n // IsFinalised: true\r\n // IsToBeApproved: true\r\n }\r\n\r\n let isLandingPage = window.localStorage.getItem('isLandingPage')\r\n\r\n const commercialProjects = apiCallsCommercial.apiAllProjects(requestObject)\r\n const residentialProjects = apiCallsResidential.apiAllProjects(requestObject)\r\n\r\n Promise.allSettled([commercialProjects, residentialProjects])\r\n .then((results) => {\r\n // We know that we have only 2 results and that they are returned in order\r\n let orders = []\r\n if (results[0].status === 'fulfilled') {\r\n let commercialProjects = results[0].value.Projects\r\n commercialProjects.forEach((project) => {\r\n project.isCommercial = true\r\n })\r\n\r\n orders = commercialProjects\r\n } else {\r\n alert('There was an issue loading commercial projects')\r\n }\r\n\r\n if (results[1].status === 'fulfilled') {\r\n let residentialProjects = results[1].value.Projects\r\n residentialProjects.forEach((project) => {\r\n project.isCommercial = false\r\n })\r\n\r\n orders = orders.concat(residentialProjects)\r\n } else {\r\n alert('There was an issue loading residential projects')\r\n }\r\n\r\n this.setState({\r\n isLoadingOrders: false,\r\n isLandingPage: (orders.length === 0 && isLandingPage == null) ? true : false,\r\n orders: orders\r\n }, () => {\r\n this.setSorting('ItemModifiedWhen', false)\r\n })\r\n })\r\n }\r\n\r\n createNewProject = (event) => {\r\n event.preventDefault()\r\n\r\n this.setState({ hasSubmittedNewProject: true })\r\n\r\n if (this.state.nameNewProject !== '') {\r\n this.setState({\r\n newProjectApiErrorMessage: '',\r\n isLoadingNewProject: true\r\n })\r\n\r\n let apiCall = apiCallsCommercial\r\n if (this.state.selectedProjectTypeForCreation === 'Residential') apiCall = apiCallsResidential\r\n\r\n // Seems like we need to call API to get a project with ID 0 to retrieve the response to pass to \"Save project\" API with new title\r\n // After that we will have a new project with real ID\r\n apiCall.apiGetProject(this.props.projectId)\r\n .then(projectData => {\r\n projectData.Title = this.state.nameNewProject\r\n\r\n apiCall.apiSetProjectTitle(projectData)\r\n .then(response => {\r\n // At this point we can read ItemGUID from the response and redirect user to that page\r\n this.setState({\r\n hasCreatedNewProject: true\r\n }, () => {\r\n commonFunctionsService.closeModals()\r\n this.GA4DataLayerForProject('create project', response)\r\n\r\n window.setTimeout(() => {\r\n // After a small timout which will display a custom full screen message, redirect the user to the project details\r\n this.openProject(response.ItemID, this.state.selectedProjectTypeForCreation === 'Commercial')\r\n }, 2500)\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({\r\n newProjectApiErrorMessage: error,\r\n isLoadingNewProject: false\r\n })\r\n })\r\n })\r\n\r\n }\r\n }\r\n\r\n startCreatingNewProject = () => {\r\n this.setState({ selectedProjectTypeForCreation: this.state.currentFlexType, isCreatingNewProject: true })\r\n }\r\n\r\n stopCreatingNewProject = () => {\r\n this.setState({ isCreatingNewProject: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n handelChange = (name, value) => {\r\n this.setState({ ['' + name]: value })\r\n }\r\n\r\n startProjectDeletion = (projectID) => {\r\n this.setState({\r\n confirmingProjectDeletion: true,\r\n projectToDelete: projectID\r\n })\r\n }\r\n\r\n stopProjectDeletion = () => {\r\n this.setState({\r\n confirmingProjectDeletion: false,\r\n projectToDelete: 0\r\n })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n deleteProject = () => {\r\n const project = this.getProject(this.state.projectToDelete)\r\n this.setState({ isDeletingProject: true })\r\n\r\n let requestObj = {\r\n 'IsArchived': false,\r\n 'IsDeleted': false,\r\n 'ProjectID': this.state.projectToDelete\r\n }\r\n\r\n if (project.IsFinalised) { // 'complete'\r\n requestObj = {\r\n ...requestObj,\r\n 'IsDeleted': true\r\n }\r\n } else {\r\n requestObj = {\r\n ...requestObj,\r\n 'IsArchived': true\r\n }\r\n }\r\n\r\n this.GA4DataLayerForProject('delete project', project)\r\n\r\n this.setState({\r\n deletingProjectTitle: 'Deleting project',\r\n deletedProjectMessage: 'Project successfully deleted'\r\n })\r\n\r\n this.stopProjectDeletion()\r\n\r\n let apiCall = apiCallsCommercial\r\n if (this.state.currentFlexType === 'Residential') apiCall = apiCallsResidential\r\n\r\n apiCall.apiArchiveDeleteProject(requestObj)\r\n .then((serverResponse) => {\r\n\r\n this.setState({\r\n isDeletingProject: false,\r\n hasDeletedProject: true,\r\n projectToDelete: 0\r\n }, () => {\r\n this.updateOrders(serverResponse.Projects, this.state.currentFlexType)\r\n this.updateProjectStats()\r\n })\r\n\r\n setTimeout(() => this.setState({ hasDeletedProject: false }), 3000)\r\n })\r\n .catch(error => {\r\n this.setState({\r\n isDeletingProject: false,\r\n pageError: `Something went wrong: ${error.message}`\r\n })\r\n })\r\n }\r\n\r\n updateOrders = (orders, flexType) => {\r\n let updatedOrders = cloneDeep(this.state.orders)\r\n updatedOrders = updatedOrders.filter((order) => {\r\n return (order.isCommercial && flexType === 'Residential') || (!order.isCommercial && flexType === 'Commercial')\r\n })\r\n\r\n // At this point we have orders only from other type to which we are going to add updated orders of the type of interest\r\n orders.forEach(order => order.isCommercial = flexType === 'Commercial') // Update the project type\r\n updatedOrders = updatedOrders.concat(orders)\r\n this.setState({ orders: updatedOrders }, () => this.setSorting('ItemModifiedWhen', false))\r\n }\r\n\r\n getProject = (projectID) => {\r\n return this.state.orders.find((order) => order.ItemID === projectID)\r\n }\r\n\r\n duplicateProject = projectID => {\r\n const project = this.getProject(projectID)\r\n this.setState({ isDuplicatingProject: true })\r\n\r\n let requestObj = { \"ProjectID\": projectID }\r\n\r\n if (project.IsFinalised) { // 'complete'\r\n requestObj = {\r\n ...requestObj,\r\n \"IsArchived\": true\r\n }\r\n }\r\n\r\n let apiCall = apiCallsCommercial\r\n if (this.state.currentFlexType === 'Residential') apiCall = apiCallsResidential\r\n\r\n apiCall.apiCopyProject(requestObj)\r\n .then(serverResponse => {\r\n this.setState({\r\n isDuplicatingProject: false,\r\n hasDuplicatedProject: true\r\n }, () => {\r\n this.updateOrders(serverResponse.Projects, this.state.currentFlexType)\r\n this.updateProjectStats()\r\n })\r\n const duplicatedProject = serverResponse.Projects[serverResponse.Projects.length - 1]\r\n this.GA4DataLayerForProject(\"duplicate project\", duplicatedProject)\r\n setTimeout(() => this.setState({ hasDuplicatedProject: false }), 3000)\r\n })\r\n .catch(error => {\r\n this.setState({\r\n isDuplicatingProject: false,\r\n pageError: `Something went wrong: ${error.message}`\r\n })\r\n })\r\n }\r\n\r\n calculateAnyFilteringResults = () => {\r\n var anySearchResults = true\r\n const anyProjectsOfCurrentType = this.state.orders.some(order => {\r\n return (this.state.isCommercial && order.isCommercial) || (!this.state.isCommercial && !order.isCommercial)\r\n })\r\n\r\n if (!anyProjectsOfCurrentType) {\r\n anySearchResults = false\r\n } else {\r\n anySearchResults = this.state.orders.some(order => {\r\n if (this.state.filterProjectTypeValue !== 'all') {\r\n if (this.state.filterProjectTypeValue === 'incomplete') {\r\n if (this.state.searchValue !== '') {\r\n return !order.IsFinalised && order.Title.toLowerCase().indexOf(this.state.searchValue.toLowerCase()) > -1 && ((this.state.isCommercial && order.isCommercial) || (!this.state.isCommercial && !order.isCommercial))\r\n } else {\r\n return !order.IsFinalised\r\n }\r\n }\r\n\r\n if (this.state.filterProjectTypeValue === 'complete') {\r\n if (this.state.searchValue !== '') {\r\n return order.IsFinalised && order.Title.toLowerCase().indexOf(this.state.searchValue.toLowerCase()) > -1 && ((this.state.isCommercial && order.isCommercial) || (!this.state.isCommercial && !order.isCommercial))\r\n } else {\r\n return order.IsFinalised\r\n }\r\n }\r\n } else if (this.state.searchValue !== '') {\r\n return order.Title.toLowerCase().indexOf(this.state.searchValue.toLowerCase()) > -1 && ((this.state.isCommercial && order.isCommercial) || (!this.state.isCommercial && !order.isCommercial))\r\n }\r\n\r\n return true\r\n })\r\n }\r\n\r\n this.setState({ anySearchResults: anySearchResults })\r\n }\r\n\r\n handleChange = (event) => {\r\n this.setState({\r\n searchValue: event.target.value\r\n }, () => {\r\n this.calculateAnyFilteringResults()\r\n })\r\n }\r\n\r\n filterProjectType = (projectType) => {\r\n this.setState({\r\n filterProjectTypeValue: projectType\r\n }, () => {\r\n this.calculateAnyFilteringResults()\r\n })\r\n }\r\n\r\n compareByProperty = (a, b, propertyName, reverse) => {\r\n if (reverse) {\r\n if (a[propertyName] < b[propertyName]) return -1\r\n if (a[propertyName] > b[propertyName]) return 1\r\n } else {\r\n if (a[propertyName] > b[propertyName]) return -1\r\n if (a[propertyName] < b[propertyName]) return 1\r\n }\r\n\r\n return 0\r\n }\r\n\r\n compareByDate = (a, b, propertyName, reverse) => {\r\n var aV = a[propertyName].split('/').reverse().join('/')\r\n var bV = b[propertyName].split('/').reverse().join('/')\r\n\r\n if (reverse) {\r\n if (aV < bV) return -1\r\n if (aV > bV) return 1\r\n } else {\r\n if (aV > bV) return -1\r\n if (aV < bV) return 1\r\n }\r\n }\r\n\r\n setSorting = (sorthingType, sortingOrder) => {\r\n var sortingDirection = ''\r\n if (sortingOrder !== undefined) {\r\n sortingDirection = sortingOrder\r\n } else {\r\n sortingDirection = !this.state.ascendingSorting\r\n }\r\n\r\n this.setState({\r\n sorthingType: sorthingType,\r\n ascendingSorting: sortingDirection\r\n })\r\n\r\n if (this.state.ascendingSorting) {\r\n if (sorthingType === 'ItemModifiedWhen') {\r\n this.state.orders.sort((a, b) => this.compareByDate(a, b, sorthingType, true))\r\n } else {\r\n this.state.orders.sort((a, b) => this.compareByProperty(a, b, sorthingType, true))\r\n }\r\n } else {\r\n if (sorthingType === 'ItemModifiedWhen') {\r\n this.state.orders.sort((a, b) => this.compareByDate(a, b, sorthingType, false))\r\n } else {\r\n this.state.orders.sort((a, b) => this.compareByProperty(a, b, sorthingType, false))\r\n }\r\n }\r\n }\r\n\r\n openProject = (projectID, isCommercial, event) => {\r\n // Open the project only if the user is not clicking on the duplicate or delete button\r\n if (event !== undefined &&\r\n jQuery(event.target).closest('button.duplicate').length === 0 &&\r\n jQuery(event.target).closest('button.delete').length === 0) {\r\n\r\n if (isCommercial) {\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS + '?orderID=' + projectID)\r\n } else {\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS_RESIDENTIAL + '?orderID=' + projectID)\r\n }\r\n } else if (event === undefined) {\r\n if (isCommercial) {\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS + '?orderID=' + projectID)\r\n } else {\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS_RESIDENTIAL + '?orderID=' + projectID)\r\n }\r\n }\r\n }\r\n\r\n hideLandingPage = () => {\r\n window.localStorage.setItem('isLandingPage', false)\r\n\r\n this.setState({\r\n isLandingPage: false\r\n })\r\n }\r\n\r\n hidePopup = () => {\r\n this.setState({ landingPopupMessage: ''})\r\n }\r\n\r\n openHowItWorksModal = () => {\r\n this.setState({\r\n howItWorksModal: !this.state.howItWorksModal\r\n })\r\n }\r\n\r\n GA4DataLayerForProject = (type, project) => {\r\n const isCommercial = this.state.currentFlexType === 'Commercial'\r\n const dataLayerObject = {\r\n \"project_type\": isCommercial ? 'Commercial' : 'Residential',\r\n \"project_name\": project.Title,\r\n \"project_id\": project.ItemID.toString() \r\n }\r\n if (type === 'create project') {\r\n analyticsDataLayer.createProject(dataLayerObject)\r\n } else if (type === 'duplicate project') {\r\n analyticsDataLayer.duplicateProject(dataLayerObject)\r\n } else if (type === 'delete project') {\r\n analyticsDataLayer.deleteProject(dataLayerObject)\r\n }\r\n }\r\n\r\n render() {\r\n if (this.state.isLoading) {\r\n return \r\n } else {\r\n return (\r\n
    \r\n {\r\n this.state.landingPopupMessage !== '' &&\r\n \r\n\r\n
    {this.state.landingPopupMessage}
    \r\n\r\n \r\n }\r\n\r\n {\r\n this.state.isCreatingNewProject &&\r\n \r\n\r\n
    \r\n
    \r\n \r\n this.handelChange(event.target.name, event.target.value)} required maxLength=\"128\" autoFocus>\r\n
    \r\n {\r\n !this.state.isSwitchBoardManufacturer &&\r\n
    \r\n
    \r\n this.setState({ selectedProjectTypeForCreation: value })}\r\n />\r\n
    \r\n
    \r\n }\r\n {/* Generic API error */}\r\n {\r\n this.state.newProjectApiErrorMessage &&\r\n
    {this.state.newProjectApiErrorMessage}
    \r\n }\r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n }\r\n\r\n\r\n {\r\n this.state.confirmingProjectDeletion &&\r\n \r\n\r\n

    Are you sure you want to delete this project?

    \r\n\r\n
    \r\n \r\n \r\n
    \r\n \r\n }\r\n\r\n {this.state.howItWorksModal &&\r\n \r\n {this.state.isCommercial ?\r\n \r\n :\r\n \r\n }\r\n \r\n }\r\n\r\n {\r\n this.state.hasCreatedNewProject &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Project Created\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isDuplicatingProject &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Duplicating Project\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.hasDuplicatedProject &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Project successfully copied\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isDeletingProject &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n {this.state.deletingProjectTitle}\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.hasDeletedProject &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n {this.state.deletedProjectMessage}\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n
    \r\n

    \r\n \r\n My {this.state.isCommercial && !this.state.isSwitchBoardManufacturer && Commercial}{!this.state.isCommercial && Residential} Projects\r\n \r\n {\r\n !this.state.isSwitchBoardManufacturer &&\r\n \r\n }\r\n

    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    { this.filterProjectType('all') }}>\r\n
    {this.state['incompleteCount' + this.state.currentFlexType] + this.state['completeCount' + this.state.currentFlexType] + this.state['toBeApprovedCount' + this.state.currentFlexType]}
    \r\n
    All Projects
    \r\n
    \r\n
    { this.filterProjectType('incomplete') }}>\r\n
    {this.state['incompleteCount' + this.state.currentFlexType] + this.state['toBeApprovedCount' + this.state.currentFlexType]}
    \r\n
    In Progress
    \r\n
    \r\n
    { this.filterProjectType('complete') }}>\r\n
    {this.state['completeCount' + this.state.currentFlexType]}
    \r\n
    Completed Orders
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n {\r\n (!this.state.isLoadingOrders && this.state.orders.length === 0 && !this.state.isLandingPage ||\r\n (!this.state.isLandingPage && this.state['incompleteCount' + this.state.currentFlexType] === 0 &&\r\n this.state['toBeApprovedCount' + this.state.currentFlexType] === 0)) &&\r\n this.state.filterProjectTypeValue !== 'complete' &&\r\n
    \r\n \r\n \r\n \r\n

    \r\n You don’t have any {this.state.isCommercial && Commercial}{!this.state.isCommercial && Residential} projects yet.\r\n

    \r\n

    \r\n Add your first project above\r\n

    \r\n
    \r\n }\r\n\r\n {this.state.isLandingPage &&\r\n <>\r\n
    \r\n
    \r\n Welcome to FlexSelect\r\n
    \r\n\r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    this.openHowItWorksModal()}>\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n See how it works\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n Start with a project\r\n
    \r\n
    \r\n Creating a project allows you to configure your board(s)\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n Add a board and components\r\n
    \r\n
    \r\n Create a board for your project and configure the components you need\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n Get your boards\r\n
    \r\n
    \r\n Once your board is configured you are ready to get a quote, place the order and receive the board.\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n }\r\n\r\n {\r\n this.state.orders.length > 0 && !this.state.anySearchResults && this.state.searchValue !== '' &&\r\n
    \r\n \r\n \r\n \r\n

    \r\n No projects found\r\n

    \r\n
    \r\n }\r\n\r\n {\r\n !this.state.isLoadingOrders && this.state.orders.length > 0 && !this.state.isLandingPage &&\r\n
    \r\n {\r\n (\r\n (this.state.anySearchResults && this.state.filterProjectTypeValue !== 'complete') ||\r\n (\r\n this.state.anySearchResults &&\r\n this.state.filterProjectTypeValue === 'complete' &&\r\n this.state['completeCount' + this.state.currentFlexType] > 0\r\n )\r\n ) &&\r\n (\r\n this.state['incompleteCount' + this.state.currentFlexType] > 0 ||\r\n this.state['toBeApprovedCount' + this.state.currentFlexType] > 0\r\n ) &&\r\n
    \r\n
    \r\n
    { this.setSorting('Title') }}>\r\n Project Name\r\n \r\n
    \r\n
    { this.setSorting('ProjectNumberReadOnly') }}>\r\n Job Number\r\n \r\n
    \r\n
    { this.setSorting('ItemModifiedWhen') }}>\r\n Last Edited\r\n \r\n
    \r\n
    { this.setSorting('IsFinalised') }}>\r\n Status\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n {\r\n !this.state.isLoadingOrders && this.state['completeCount' + this.state.currentFlexType] === 0 && this.state.filterProjectTypeValue === 'complete' &&\r\n
    \r\n \r\n \r\n \r\n

    \r\n You don’t have any completed {this.state.isCommercial && Commercial}{!this.state.isCommercial && Residential} projects yet.\r\n

    \r\n
    \r\n }\r\n\r\n {\r\n this.state.orders.map((order, index) => {\r\n if ((this.state.searchValue !== '' && order.Title.toLowerCase().indexOf(this.state.searchValue.toLowerCase()) === -1) || (this.state.isCommercial && !order.isCommercial) || (!this.state.isCommercial && order.isCommercial)) {\r\n return ''\r\n } else {\r\n return (\r\n \r\n {\r\n (\r\n (this.state.filterProjectTypeValue === 'all') ||\r\n (this.state.filterProjectTypeValue === 'incomplete' && !order.IsFinalised) ||\r\n (this.state.filterProjectTypeValue === 'complete' && order.IsFinalised)\r\n )\r\n &&\r\n
    { this.openProject(order.ItemID, order.isCommercial, event) }}>\r\n
    {order.Title}
    \r\n
    {order.ProjectNumberReadOnly}
    \r\n
    {order.ItemModifiedWhen}
    \r\n
    \r\n \r\n {order.IsToBeApproved && 'Available'}\r\n {!order.IsFinalised && 'In Progress'}\r\n {order.IsFinalised && 'Order Completed'}\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n )\r\n }\r\n })\r\n }\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default withRouter(Projects)\r\n","import React from 'react'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport { toggleArrayItem } from '../../../utils/helpers'\r\n\r\nexport default class ChassisOptionsForm extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.updateCall = this.updateCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about\r\n // holds info on the selection options\r\n this.initStates(this.props)\r\n }\r\n\r\n initStates(propsData) {\r\n this.state = {\r\n selectedOptions: cloneDeep(propsData.selected),\r\n }\r\n this.props.selecteCallback(cloneDeep(propsData.selected))\r\n }\r\n\r\n updateCall() {\r\n // Calls create / update callback based on is new breaker flag\r\n this.props.updateCallback(this.state.selectedOptions)\r\n }\r\n\r\n // Update the selected option value in local state\r\n toggleSelectedValue(value, isDisabled) {\r\n if (isDisabled) { return }\r\n\r\n var newSelectedOptions = toggleArrayItem(this.state.selectedOptions, value)\r\n this.setState({\r\n selectedOptions: newSelectedOptions\r\n }, () => {\r\n this.props.selecteCallback(this.state.selectedOptions)\r\n })\r\n }\r\n\r\n // Renders the loader / update breaker / add breaker button based on props passed in\r\n renderControl() {\r\n if (this.props.isLoading) {\r\n return (\r\n
    \r\n Loading...\r\n
    \r\n )\r\n } else {\r\n return (\r\n
    \r\n
    Add to board
    \r\n
    \r\n )\r\n }\r\n }\r\n\r\n isValueSelected(value) {\r\n if (this.isOptionDisabled(value)) { return }\r\n\r\n return this.state.selectedOptions && this.state.selectedOptions.includes(value)\r\n }\r\n\r\n isOptionDisabled(value) {\r\n if (!this.props.isPole2Filled){ return false }\r\n\r\n // If pole 2 is filled, then we disable option 2 and 3\r\n return (value === 2 || value === 3)\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n

    Select extras

    \r\n\r\n
    \r\n {this.props.options.map(opt => {\r\n const isSelected = this.isValueSelected(opt.ItemID)\r\n const isDisabled = this.isOptionDisabled(opt.ItemID)\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","import { isNullOrUndefined } from './../../utils/helpers'\r\nimport { filter, cloneDeep } from 'lodash'\r\n\r\nexport default class BoardDetailsFormBusinessLogic {\r\n // The logic is constructed with all the available options and all the type combination data\r\n // options - contains display values\r\n // data - array of all possible boards\r\n // selectedOptions - what the user selected so far\r\n constructor(options, data, selectedOptions) {\r\n this.options = options\r\n this.data = data\r\n this.setAndClearRelatedFields(selectedOptions)\r\n }\r\n\r\n // ------------------------------\r\n // Logic to handle auto selecting and clearing of data when an option is selected\r\n // ------------------------------\r\n setAndClearRelatedFields(selectedOptions) {\r\n // This function should check the remaining valid board type selections and\r\n // auto select the options that is the only available option left\r\n let filteredData = cloneDeep(this.data)\r\n let canEnableNext = true\r\n\r\n // Walk through the selectedOptions in order, from top down for each of the selectOption (top down in order)...\r\n for (let property in selectedOptions) {\r\n if (selectedOptions.hasOwnProperty(property) && property !== 'Name') {\r\n // check which option should be enabled\r\n canEnableNext = this.checkOptions(property, canEnableNext, selectedOptions, filteredData)\r\n\r\n // Filter down the filtered board type data with this option selection\r\n if (property === 'Metering') {\r\n filteredData = filteredData.filter(filterItem =>\r\n selectedOptions[property]\r\n ? filterItem.Chassis1PowerMeterAmperes > 0\r\n : filterItem.Chassis1PowerMeterAmperes === 0\r\n )\r\n } else if (property === 'MeterType') {\r\n if (selectedOptions[property] !== null) {\r\n filteredData = filteredData.filter((filterItem) => {\r\n // E.g. Full code: EM-100A-C1, but the value we select is just the prefix EM, DM, or PM\r\n // So we filter boards with codes that start with the select value\r\n var codePrefix = filterItem['PowerMeter' + filterItem.ChassisCount + 'Code'].substr(0, 2)\r\n\r\n return codePrefix === selectedOptions[property]\r\n })\r\n }\r\n\r\n } else {\r\n filteredData = filteredData.filter(\r\n filterItem =>\r\n isNullOrUndefined(selectedOptions[property]) ||\r\n isNullOrUndefined(filterItem[property]) ||\r\n selectedOptions[property] === filterItem[property]\r\n )\r\n }\r\n }\r\n }\r\n\r\n // Return the list of filtered Data - it can be used to retrieve BoardTypeID\r\n return filteredData\r\n }\r\n\r\n // Check if the options under a specific config (optionName) can be enabled or not\r\n // While performing the check, the function may auto select options if it is the last option available\r\n // This will also auto de-select options if the selected value is not in the available options list\r\n checkOptions(optionName, canEnableNext, selectedOptions, filteredData) {\r\n if (!this.options[`Options${optionName}`]) {\r\n return\r\n }\r\n\r\n // Has enabled options under this config\r\n let hasEnabled = false\r\n\r\n // Loop through the options of the specified config - enable the config's options based on a number of logic checks\r\n this.options[`Options${optionName}`].forEach(item => {\r\n if (isNullOrUndefined(selectedOptions.Name, true) || !canEnableNext) {\r\n // Disable all options under the config if board name is blank\r\n item.enabled = false\r\n } else if (optionName === 'BreakingCapacity') {\r\n if (selectedOptions.ChassisType === 'Hybrid') {\r\n // Hybrid board only allow 10kA\r\n item.enabled = item.value === 10\r\n } else {\r\n // All non-hybrid board option types are available in all breaking capcities\r\n item.enabled = true\r\n }\r\n } else if (optionName === 'Metering') {\r\n // Metering data filters are different to others, it works off the \"Chassis1PowerMeterAmperes\" value\r\n const meteringData = filteredData.filter(filterItem =>\r\n item.value\r\n ? filterItem.Chassis1PowerMeterAmperes > 0\r\n : filterItem.Chassis1PowerMeterAmperes === 0\r\n )\r\n\r\n // All checks passed, enable the option\r\n item.enabled = !!meteringData.length\r\n } else if (optionName === 'MeterType') {\r\n // This step will be triggered once all previous options were selected. We enable MeterType:\r\n // 1. If the previous \"Metering\" is true (Add Metering = Yes)\r\n // 2. Enable only options that we can find in already filtered data\r\n\r\n if (selectedOptions.Metering === true) {\r\n var uniquePowerCodes = []\r\n\r\n filteredData.forEach((el) => {\r\n if (el.PowerMeter1Code !== '') {\r\n if (uniquePowerCodes.indexOf(el['PowerMeter' + el.ChassisCount + 'Code']) === -1) {\r\n uniquePowerCodes.push(el['PowerMeter' + el.ChassisCount + 'Code'])\r\n }\r\n }\r\n })\r\n\r\n const isCodePresent = uniquePowerCodes.some(fullCode => fullCode.substr(0, 2) === item.value)\r\n if (isCodePresent) {\r\n // Leave comments for debugging\r\n // console.warn('Enabling ' + item.label + ' metering type option, because at least one board from already filtered (remaining/available) boards has that metering type present. Also because previous \"Add metering\" was selected as \"Yes\".')\r\n // console.log(filteredData)\r\n // console.table(filteredData, ['ItemID', 'ChassisCount', 'ChassisType', 'ChassisReference', 'EnclosureReference', 'IPRating', 'IsolatorSize', 'MainSwitchType', 'PowerMeter1Code', 'PowerMeter2Code', 'RatingAmpers'])\r\n item.enabled = true\r\n } else {\r\n // console.warn('Metering option ' + item.label + ' was not enabled, because there are no available boards with that code. Available boards (filtered by previous selections): ')\r\n // console.log(filteredData)\r\n // console.table(filteredData, ['ItemID', 'ChassisCount', 'ChassisType', 'ChassisReference', 'EnclosureReference', 'IPRating', 'IsolatorSize', 'MainSwitchType', 'PowerMeter1Code', 'PowerMeter2Code', 'RatingAmpers'])\r\n item.enabled = false\r\n }\r\n } else {\r\n item.enabled = false\r\n }\r\n } else {\r\n // Check the filtered data, check if there is any board type still available under the current option\r\n const currentData = filteredData.filter(filterItem => filterItem[optionName] === item.value)\r\n\r\n // All checks passed, enable the option\r\n item.enabled = !!currentData.length\r\n }\r\n\r\n // Set the has enabled flag if the config's option item has been enabled after the checks\r\n if (item.enabled) {\r\n hasEnabled = true\r\n }\r\n })\r\n\r\n\r\n // Now we check the selected option (if any), we need to de-select it if it is not one of the available options\r\n // This rule should only fire if the board name is filled in\r\n if (!isNullOrUndefined(selectedOptions[optionName]) && !isNullOrUndefined(selectedOptions.Name, true)) {\r\n const selectedValidOptions = this.options[`Options${optionName}`].filter(\r\n item => item.enabled && item.value === selectedOptions[optionName]\r\n )\r\n if (!selectedValidOptions.length) {\r\n selectedOptions[optionName] = null\r\n }\r\n }\r\n\r\n // Time to check the current config's options, if only one available option is left, then we need to set that option as the\r\n // selected option and also disable that option's selection (so the user dont get a choice on it)\r\n const availableOptions = this.options[`Options${optionName}`].filter(item => item.enabled)\r\n if (availableOptions.length === 1) {\r\n availableOptions[0].enabled = false\r\n selectedOptions[optionName] = availableOptions[0].value\r\n hasEnabled = false\r\n }\r\n\r\n // Return if the next config can be selected or not, it can be if this item it self can be enabled\r\n // AND it either has already got a option selection or none of the options are valid\r\n return canEnableNext && (!isNullOrUndefined(selectedOptions[optionName]) || !hasEnabled)\r\n }\r\n\r\n // ------------------------------\r\n // Logic to check if a radio group can be enabled or not\r\n //\r\n // Generally the fields before a radio group must have a value to enable the next lot\r\n // ------------------------------\r\n getEnableOptions(key) {\r\n let returnValue = this.options[`Options${key}`]\r\n ? this.options[`Options${key}`].map(item => (item.enabled ? item.value : null))\r\n : []\r\n\r\n return returnValue\r\n }\r\n}","import React, { Component } from 'react'\r\nimport jQuery from \"jquery\"\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport RadioObjectGroup from './../../../components/radio-object-group/RadioObjectGroup'\r\nimport { apiCallsCommercial } from '../../../utils/apiCallsCommercial'\r\nimport ChassisOptionsForm from '../../../components/config-chassis/commercial/ChassisOptionsForm'\r\nimport GlobalOverlay from '../../../components/global-overlay/GlobalOverlay'\r\nimport { CONST } from '../../../CONST'\r\nimport BoardDetailsFormBusinessLogic from './../BoardDetailsFormBusinessLogic'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\n\r\nexport default class BoardDetails extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n // Internal states that no one else needs to know about holds info on the selection options\r\n this.initStates(this.props)\r\n\r\n // Setup the business logic\r\n this.logic = new BoardDetailsFormBusinessLogic(\r\n props.boardOptions,\r\n props.boardOptionData,\r\n this.state.boardDetails\r\n )\r\n }\r\n\r\n componentDidMount() {\r\n jQuery('body').addClass('modal-is-open')\r\n\r\n let boardID = null\r\n if (!!this.props.board) {\r\n boardID = this.props.board.ItemID\r\n }\r\n\r\n apiCallsCommercial.apiGetBoardMiscParts(boardID).then((miscData) => {\r\n this.setState({ chassisOptions: miscData.FittedOptions })\r\n })\r\n\r\n apiCallsCommercial.apiGetParentChild().then((parentChildData) => {\r\n this.setState({ parentChildData: parentChildData })\r\n })\r\n\r\n apiCallsCommercial.apiGetAllParts().then((allPartsData) => {\r\n this.setState({ commercialAllPartsAvailable: allPartsData })\r\n })\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (!this.props.board && !nextProps.board) {\r\n return\r\n }\r\n\r\n if (!this.props.board || !nextProps.board || this.props.board.ItemID !== nextProps.board.ItemID) {\r\n this.initStates(nextProps, true)\r\n }\r\n }\r\n\r\n getBoardMeterTypeValue(board) {\r\n let powerMeterCode = null\r\n let existingPowerMeterCode = board['PowerMeter' + board.ChassisCount + 'Code']\r\n\r\n if (existingPowerMeterCode !== '' && existingPowerMeterCode !== null) {\r\n powerMeterCode = existingPowerMeterCode.substr(0, 2)\r\n }\r\n\r\n return powerMeterCode\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n // The board data on a saved board is split in both the project board and the board type data, so we need to get it from both\r\n const existingBoard = propsData.board\r\n ? propsData.boardOptionData.find(item => item.ItemID === propsData.board.BoardTypeID)\r\n : null\r\n const updatedState = {\r\n boardDetails: {\r\n Name: propsData.board ? propsData.board.Name : '',\r\n IPRating: existingBoard ? existingBoard.IPRating : null,\r\n BoardColour: existingBoard ? existingBoard.BoardColour : null,\r\n MainSwitchType: existingBoard ? existingBoard.MainSwitchType : null,\r\n RatingAmperes: existingBoard ? existingBoard.RatingAmperes : null,\r\n ChassisCount: existingBoard ? existingBoard.ChassisCount : null,\r\n ChassisType: existingBoard ? existingBoard.ChassisType : null,\r\n BreakingCapacity: existingBoard ? propsData.board.BreakingCapacity : null,\r\n Metering: existingBoard ? existingBoard.Chassis1PowerMeterAmperes > 0 : null,\r\n MeterType: existingBoard ? this.getBoardMeterTypeValue(existingBoard) : null,\r\n Chassis1PoleCount27mm: existingBoard ? existingBoard.Chassis1PoleCount27mm : null,\r\n Chassis1PoleCount: existingBoard ? existingBoard.Chassis1PoleCount : null,\r\n Chassis2PoleCount: existingBoard ? existingBoard.Chassis2PoleCount : null\r\n },\r\n board: existingBoard ? propsData.board : null,\r\n isExistingBoard: existingBoard ? true : false,\r\n currentStep: 1, // Used to indicate the step the design is divided\r\n currentStepStatus: {\r\n 1: false,\r\n 2: false,\r\n 3: false,\r\n 4: false,\r\n 5: false\r\n },\r\n canGoNextStep: false,\r\n canAddOptionalExtras: true,\r\n hasUsedBackButton: false,\r\n chassisOptions: [],\r\n parentChildData: [],\r\n commercialAllPartsAvailable: [],\r\n selectedChassisOptions: [],\r\n availabilityValidationMessages: [],\r\n isLoading: false,\r\n existingBoard: false\r\n }\r\n\r\n // If it is an existing board, then we allow the user to skip between the step as if he used a back button\r\n if (updatedState.isExistingBoard) {\r\n updatedState.hasUsedBackButton = true\r\n }\r\n\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n getCurrentBoardData() {\r\n return this.props.boardOptionData.find(item => item.ItemID === this.state.board.BoardTypeID)\r\n }\r\n\r\n // Update the selected option value in local state\r\n optionSelectedCall(value, key) {\r\n const updatedBoard = cloneDeep(this.state.boardDetails)\r\n updatedBoard[key] = value\r\n\r\n // Update values on the affected related fields\r\n // When users select ChassisCount or Chassis1PoleCount this affects other fields.\r\n this.logic.setAndClearRelatedFields(updatedBoard)\r\n\r\n this.setState({ boardDetails: updatedBoard }, () => {\r\n // If the user has used the back button, the don't automatically skip the steps, we will show \r\n if (this.canGoNextStep()) {\r\n // If the current step is a step 4 and it is a new board, then we need to save it first\r\n // if (this.state.currentStep === 4 && !this.state.isExistingBoard) {\r\n // this.createBoardCall()\r\n // } else { \r\n // Temporary comment autoskipping to the next step\r\n // if (!this.state.hasUsedBackButton) {\r\n // // Add one second delay to improve user perception of the selected values\r\n // window.setTimeout(() => { \r\n // this.goNextStep()\r\n // }, 1000)\r\n // } else {\r\n this.setState({ canGoNextStep: true })\r\n // }\r\n // }\r\n } else {\r\n this.setState({ canGoNextStep: false })\r\n }\r\n })\r\n }\r\n\r\n createBoardCall() {\r\n const finalSelections = cloneDeep(this.state.boardDetails)\r\n const finalFilteredBoardData = this.logic.setAndClearRelatedFields(finalSelections)\r\n\r\n // Assumption that the board type options from the server will always have distinct setup\r\n if (finalFilteredBoardData.length !== 1 && !this.checkIfFilterDataAreTheSame(finalFilteredBoardData)) {\r\n this.setState({ validationMessage: 'Please make sure all fields are filled in' })\r\n return\r\n }\r\n\r\n // Create the final board object to be passed to the server\r\n let finalBoard = {\r\n BoardTypeID: finalFilteredBoardData[0].ItemID,\r\n Name: finalSelections.Name,\r\n BreakingCapacity: finalSelections.BreakingCapacity\r\n }\r\n\r\n finalBoard.ProjectID = this.props.projectID\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsCommercial.apiSaveBoard(finalBoard)\r\n .then(boardData => {\r\n this.setState({\r\n existingBoard: true,\r\n board: boardData\r\n })\r\n\r\n if (!this.state.currentStepStatus[4]) {\r\n analyticsDataLayer.addBoard({\r\n \"item_board_name\": boardData.Name,\r\n \"item_board_id\": boardData.ItemID.toString(),\r\n \"configuration_name\": boardData.Name,\r\n \"configuration_id\": boardData.ItemID.toString(), \r\n \"project_name\": this.props.projectName,\r\n \"project_id\": this.props.projectID.toString(),\r\n \"project_type\": \"Commercial\",\r\n \"funnel_step\": '4',\r\n \"funnel_total_steps\": '5'\r\n })\r\n }\r\n this.setState({\r\n currentStepStatus: {\r\n ...this.state.currentStepStatus,\r\n 4: true\r\n }\r\n })\r\n\r\n return apiCallsCommercial.apiGetBoardMiscParts(boardData.ItemID)\r\n })\r\n .then(miscData => {\r\n this.setState({ chassisOptions: miscData.FittedOptions })\r\n })\r\n .catch(error => {\r\n window.alert(`There was an error creating the board: ${error.message}`)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: false, currentStep: this.state.currentStep + 1 })\r\n })\r\n }\r\n\r\n checkIfFilterDataAreTheSame(filterData) {\r\n let allTheSame = true\r\n const checkFields = [\r\n 'ChassisCount',\r\n 'ChassisType',\r\n 'Chassis1PoleCount',\r\n 'Chassis1PowerMeterAmperes',\r\n 'Chassis2PoleCount',\r\n 'Chassis1PoleCount27mm',\r\n 'RatingAmperes',\r\n 'MainSwitchType',\r\n 'BoardColour',\r\n 'IPRating'\r\n ]\r\n\r\n filterData.forEach(item => {\r\n checkFields.forEach(field => {\r\n if (filterData[0][field] !== item[field]) {\r\n allTheSame = false\r\n }\r\n })\r\n })\r\n\r\n return allTheSame\r\n }\r\n\r\n updateBoardCall() {\r\n const finalSelections = cloneDeep(this.state.boardDetails)\r\n const finalFilteredBoardData = this.logic.setAndClearRelatedFields(finalSelections)\r\n\r\n // Assumption that the board type options from the server will always have distinct setup\r\n if (finalFilteredBoardData.length !== 1 && !this.checkIfFilterDataAreTheSame(finalFilteredBoardData)) {\r\n this.setState({ validationMessage: 'Please make sure all fields are filled in' })\r\n alert('Please make sure all fields are filled in')\r\n return\r\n }\r\n\r\n // Create the final board object to be passed to the server\r\n let finalBoard = {\r\n BoardTypeID: finalFilteredBoardData[0].ItemID,\r\n Name: finalSelections.Name,\r\n BreakingCapacity: finalSelections.BreakingCapacity\r\n }\r\n\r\n finalBoard.ProjectID = this.props.projectID\r\n finalBoard.ItemID = this.state.board.ItemID\r\n\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsCommercial.apiSaveBoard(finalBoard)\r\n .then(boardData => {\r\n this.setState({\r\n existingBoard: true,\r\n board: boardData\r\n })\r\n\r\n if (this.props.onUpdateCallback !== undefined) {\r\n this.props.onUpdateCallback(boardData)\r\n }\r\n\r\n if (!this.state.isExistingBoard) {\r\n analyticsDataLayer.addBoard({\r\n \"item_board_name\": boardData.Name,\r\n \"item_board_id\": boardData.ItemID.toString(),\r\n \"configuration_name\": boardData.Name,\r\n \"configuration_id\": boardData.ItemID.toString(), \r\n \"project_name\": this.props.projectName,\r\n \"project_id\": this.props.projectID.toString(),\r\n \"project_type\": \"Commercial\",\r\n \"funnel_step\": '5',\r\n \"funnel_total_steps\": '5'\r\n })\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ isLoading: false })\r\n window.alert(`There was an error creating the board: ${error.message}`)\r\n })\r\n .then(() => {\r\n this.updateSelectedChassisOptions(this.state.selectedChassisOptions, this.state.existingBoard)\r\n })\r\n }\r\n\r\n updateBoard() {\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Add Board',\r\n cta_link: window.location.href,\r\n cta_location: 'board details page'\r\n })\r\n this.updateBoardCall()\r\n }\r\n\r\n updateSelectedChassisOptions(selectedOptions, redirectToChassis) {\r\n this.setState({ isLoading: true })\r\n\r\n // The options data needs to keep the exisitng options and set the isDeleted flag if it has been unchecked\r\n const newDataArray = this.state.board.ProjectBoardFittedOptionCollection.map(item => {\r\n return {\r\n FittedOptionItemID: item.FittedOptionItemID,\r\n ItemID: item.ItemID,\r\n IsDeleted: !selectedOptions.includes(item.FittedOptionItemID)\r\n }\r\n })\r\n\r\n selectedOptions.forEach(value => {\r\n // Add in new option id if its not in the existing board option collections\r\n const existingOption = newDataArray.find(item => item.FittedOptionItemID === value)\r\n if (!existingOption) {\r\n newDataArray.push({ FittedOptionItemID: value })\r\n }\r\n })\r\n\r\n apiCallsCommercial.apiSaveBoardChassisOptions(this.props.projectID, this.state.board.ItemID, newDataArray)\r\n .then(boardData => {\r\n this.setState({ board: boardData }, () => {\r\n if (redirectToChassis !== undefined && window.location.href.indexOf(CONST.PAGES.CONFIGURE_CHASSIS) === -1) {\r\n this.props.redirectToChassis(this.props.projectID, this.state.board.ItemID)\r\n }\r\n\r\n if (this.props.onUpdateCallback !== undefined) {\r\n this.props.onUpdateCallback(boardData)\r\n }\r\n })\r\n })\r\n .catch(error => {\r\n alert(error)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: false })\r\n this.closeModal()\r\n })\r\n }\r\n\r\n // Handle switching of the steps in the UI, this is a very specific manual division\r\n canGoNextStep = () => {\r\n let canGoNextStep = false\r\n if (this.state.currentStep === 1 && this.state.boardDetails.BoardColour !== null) {\r\n canGoNextStep = true\r\n } else if (this.state.currentStep === 2 && this.state.boardDetails.RatingAmperes !== null) {\r\n canGoNextStep = true\r\n } else if (this.state.currentStep === 3) {\r\n // In this case the last input will be disabled, so if Chassis isn't Hybrid then Matering is our last field in the form\r\n if (this.state.boardDetails.Metering !== null && this.state.boardDetails.ChassisType !== 'Hybrid') {\r\n if (this.state.boardDetails.Metering === false || this.state.boardDetails.MeterType !== null) {\r\n canGoNextStep = true\r\n }\r\n } else if (this.state.boardDetails.Chassis1PoleCount27mm !== null) {\r\n canGoNextStep = true\r\n }\r\n } else if (this.state.currentStep === 4) {\r\n if ((this.state.boardDetails.ChassisCount === 1 && this.state.boardDetails.Chassis1PoleCount !== null) ||\r\n (this.state.boardDetails.ChassisCount === 2 && this.state.boardDetails.Chassis2PoleCount !== null)\r\n ) {\r\n canGoNextStep = true\r\n\r\n // Here we finally know what is the final board configuration, so we can check the board components selections\r\n // and if they are low stock or out of stock, if any of the components is out of stock, then we can't go to the next step\r\n const finalSelections = cloneDeep(this.state.boardDetails)\r\n const finalFilteredBoardData = this.logic.setAndClearRelatedFields(finalSelections)\r\n\r\n // Reset availability messages\r\n this.setState({ availabilityValidationMessages: [] })\r\n\r\n /*\r\n At this stage we know these components that were selected for the final board, e.g.:\r\n\r\n Isolator/Main Switch\r\n\r\n \"IsolatorSize\": \"CVS 100A MAIN SWITCH\"\r\n\r\n Enclosure & Power Meter\r\n\r\n \"EnclosureReference\": \"MB200CBOX_LDB\"\r\n \"PowerMeter1Code\": \"DM-ISO-100A-C1\"\r\n \"PowerMeter2Code\": \"\"\r\n\r\n Chassis\r\n\r\n \"ChassisReference\": \"CHASSIS 1 ISOBAR 18P\"\r\n\r\n We can't directly check those values against the reference inside commercialAllPartsAvailable, first we need to find them\r\n inside the parentChildData and find the child component reference\r\n */\r\n\r\n // TODO: this isn't really DRY, will need to refactor \r\n const availablityMessages = []\r\n console.log('Final board data:', finalFilteredBoardData[0])\r\n if (!!finalFilteredBoardData[0].IsolatorSize) {\r\n const mainSwitchParentItem = this.state.parentChildData.find(item => item.ParentItemReference === finalFilteredBoardData[0].IsolatorSize)\r\n if (mainSwitchParentItem !== undefined) {\r\n const mainSwitchChildItemReference = mainSwitchParentItem.ChildItemReference\r\n const mainSwitchAvailability = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === mainSwitchChildItemReference)\r\n\r\n if (mainSwitchAvailability !== undefined) {\r\n if (mainSwitchAvailability.IsLowStock) {\r\n availablityMessages.push(`Isolator ${mainSwitchAvailability.Description} Low stock, longer lead times may apply`)\r\n } else if (!mainSwitchAvailability.IsInStock) {\r\n availablityMessages.push(`Isolator ${mainSwitchAvailability.Description} is out of stock. Please, contact au.estimating@se.com`)\r\n\r\n canGoNextStep = false\r\n }\r\n }\r\n }\r\n }\r\n \r\n if (!!finalFilteredBoardData[0].EnclosureReference) {\r\n const enclosureParentItem = this.state.parentChildData.find(item => item.ParentItemReference === finalFilteredBoardData[0].EnclosureReference)\r\n if (enclosureParentItem !== undefined) {\r\n const enclosureChildItemReference = enclosureParentItem.ChildItemReference\r\n const enclosureAvailability = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === enclosureChildItemReference)\r\n\r\n if (enclosureAvailability !== undefined) {\r\n if (enclosureAvailability.IsLowStock) {\r\n availablityMessages.push(`Enclosure ${enclosureAvailability.Description} Low stock, longer lead times may apply`)\r\n } else if (!enclosureAvailability.IsInStock) {\r\n availablityMessages.push(`Enclosure ${enclosureAvailability.Description} is out of stock. Please, contact au.estimating@se.com`)\r\n\r\n canGoNextStep = false\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!!finalFilteredBoardData[0].PowerMeter1Code) {\r\n const meterParentItem = this.state.parentChildData.find(item => item.ParentItemReference === finalFilteredBoardData[0].PowerMeter1Code)\r\n if (meterParentItem !== undefined) {\r\n const meterChildItemReference = meterParentItem.ChildItemReference\r\n const meterAvailability = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === meterChildItemReference)\r\n\r\n if (meterAvailability !== undefined) {\r\n if (meterAvailability.IsLowStock) {\r\n availablityMessages.push(`Power Meter ${meterAvailability.Description} Low stock, longer lead times may apply`)\r\n } else if (!meterAvailability.IsInStock) {\r\n availablityMessages.push(`Power Meter ${meterAvailability.Description} is out of stock. Please, contact au.estimating@se.com`)\r\n\r\n canGoNextStep = false\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!!finalFilteredBoardData[0].PowerMeter2Code) {\r\n const meterParentItem = this.state.parentChildData.find(item => item.ParentItemReference === finalFilteredBoardData[0].PowerMeter2Code)\r\n if (meterParentItem !== undefined) {\r\n const meterChildItemReference = meterParentItem.ChildItemReference\r\n const meterAvailability = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === meterChildItemReference)\r\n\r\n if (meterAvailability !== undefined) {\r\n if (meterAvailability.IsLowStock) {\r\n availablityMessages.push(`Power Meter ${meterAvailability.Description} Low stock, longer lead times may apply`)\r\n } else if (!meterAvailability.IsInStock) {\r\n availablityMessages.push(`Power Meter ${meterAvailability.Description} is out of stock. Please, contact au.estimating@se.com`)\r\n\r\n canGoNextStep = false\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!!finalFilteredBoardData[0].ChassisReference) {\r\n const chassisParentItem = this.state.parentChildData.find(item => item.ParentItemReference === finalFilteredBoardData[0].ChassisReference)\r\n if (chassisParentItem !== undefined) {\r\n const chassisChildItemReference = chassisParentItem.ChildItemReference\r\n const chassisAvailability = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === chassisChildItemReference)\r\n if (chassisAvailability !== undefined) {\r\n if (chassisAvailability.IsLowStock) {\r\n availablityMessages.push(`Chassis ${chassisAvailability.Description} Low stock, longer lead times may apply`)\r\n } else if (!chassisAvailability.IsInStock) {\r\n availablityMessages.push(`Chassis ${chassisAvailability.Description} is out of stock. Please, contact au.estimating@se.com`)\r\n\r\n canGoNextStep = false\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.setState({ availabilityValidationMessages: availablityMessages })\r\n }\r\n\r\n }\r\n\r\n return canGoNextStep\r\n }\r\n\r\n renderModalHeader = () => {\r\n let progress = this.state.currentStep * 20\r\n if (this.state.isExistingBoard) {\r\n progress = 100\r\n }\r\n\r\n const isNotAllowedToGoStep2 = (this.state.currentStep === 1 && !this.state.isExistingBoard && !this.state.canGoNextStep)\r\n const isNotAllowedToGoStep3 = (this.state.currentStep === 2 && !this.state.canGoNextStep) || (this.state.currentStep < 2 && !this.state.isExistingBoard)\r\n const isNotAllowedToGoStep4 = (this.state.currentStep === 3 && !this.state.canGoNextStep) || (this.state.currentStep < 3 && !this.state.isExistingBoard)\r\n\r\n return (\r\n
    \r\n \r\n

    \r\n {this.state.isExistingBoard && Edit board}\r\n {!this.state.isExistingBoard && Add a board}\r\n

    \r\n
    \r\n
    { this.goStep(1) }}>\r\n 1\r\n Set-Up\r\n
    \r\n
    2 || this.state.isExistingBoard ? ' is-done' : '') +\r\n (isNotAllowedToGoStep2 ? ' not-allowed' : '')\r\n } onClick={() => { if (!isNotAllowedToGoStep2) this.goStep(2) }}>\r\n 2\r\n Main Switch\r\n
    \r\n
    3 || this.state.isExistingBoard ? ' is-done' : '') +\r\n (isNotAllowedToGoStep3 ? ' not-allowed' : '')\r\n } onClick={() => { if (!isNotAllowedToGoStep3) this.goStep(3) }}>\r\n 3\r\n Chassis\r\n
    \r\n
    4 || this.state.isExistingBoard ? ' is-done' : '') +\r\n (isNotAllowedToGoStep4 ? ' not-allowed' : '')\r\n } onClick={() => { if (!isNotAllowedToGoStep4) this.goStep(4) }}>\r\n 4\r\n Size\r\n
    \r\n
    { this.goStep(5) }}>\r\n 5\r\n Optional Extras\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n renderModalFooter = () => {\r\n return (\r\n
    \r\n {\r\n this.state.currentStep > 1 &&\r\n \r\n }\r\n {\r\n // ((this.state.hasUsedBackButton && this.state.canGoNextStep) || (this.state.isExistingBoard && this.state.currentStep !== 5)) &&\r\n (!this.state.isExistingBoard && this.state.currentStep !== 5) &&\r\n \r\n }\r\n\r\n {\r\n (this.state.isExistingBoard && this.state.currentStep !== 5) &&\r\n \r\n }\r\n\r\n {\r\n (this.state.isExistingBoard && this.state.currentStep < 5) &&\r\n \r\n }\r\n\r\n {/* This is only showing on last step */}\r\n {\r\n this.state.currentStep === 5 &&\r\n \r\n }\r\n
    \r\n )\r\n }\r\n\r\n goStepBack = () => {\r\n this.setState({\r\n currentStep: this.state.currentStep - 1,\r\n hasUsedBackButton: true\r\n }, () => this.setState({ canGoNextStep: this.canGoNextStep() }))\r\n }\r\n\r\n goNextStep = () => {\r\n if (this.state.currentStep === 4 && !this.state.isExistingBoard && !this.state.existingBoard) {\r\n this.createBoardCall()\r\n } else {\r\n this.setState({\r\n currentStep: this.state.currentStep + 1\r\n }, () => this.setState({ canGoNextStep: this.canGoNextStep() }))\r\n \r\n if (!this.state.currentStepStatus[this.state.currentStep]) {\r\n analyticsDataLayer.addBoard({\r\n \"item_board_name\": '',\r\n \"item_board_id\": '',\r\n \"configuration_name\": '',\r\n \"configuration_id\": '', \r\n \"project_name\": this.props.projectName,\r\n \"project_id\": this.props.projectID.toString(),\r\n \"project_type\": 'Commercial',\r\n \"funnel_step\": this.state.currentStep,\r\n \"funnel_total_steps\": '5'\r\n })\r\n }\r\n\r\n this.setState({\r\n currentStepStatus: {\r\n ...this.state.currentStepStatus,\r\n [this.state.currentStep]: true\r\n }\r\n })\r\n\r\n }\r\n }\r\n\r\n goStep = (stepNumber) => {\r\n if (this.state.isExistingBoard || (!this.state.isExistingBoard && stepNumber !== 5)) {\r\n this.setState({\r\n currentStep: stepNumber\r\n }, () => this.setState({ canGoNextStep: this.canGoNextStep() }))\r\n }\r\n }\r\n\r\n closeModal = () => {\r\n jQuery('body').removeClass('modal-is-open')\r\n\r\n if (this.props.closeCallback !== undefined) {\r\n this.props.closeCallback(this.state.board)\r\n }\r\n }\r\n\r\n // This function returns the array of Board Option IDs of the options applied to the current board\r\n getSelectedChassisOptionArray() {\r\n if (!this.state.board.ProjectBoardFittedOptionCollection || !this.state.board.ProjectBoardFittedOptionCollection.length) {\r\n return []\r\n }\r\n\r\n // Loop throught the collection of option object and return an array of the selected options ID\r\n const selected = this.state.board.ProjectBoardFittedOptionCollection.map(item => {\r\n return item.FittedOptionItemID\r\n })\r\n\r\n return selected\r\n }\r\n\r\n // Check if there is a breaker covering chassis position index 2\r\n checkIfIndex2IsFilled() {\r\n if (!this.state.board.ProjectBoardBreakerCollection || !this.state.board.ProjectBoardBreakerCollection.length) {\r\n return false\r\n }\r\n\r\n const boardData = this.getCurrentBoardData()\r\n const largePoleCount = boardData.ChassisType === 'Hybrid' ? boardData.Chassis1PoleCount27mm : 0\r\n const checkOptions = this.state.board.ProjectBoardBreakerCollection.filter(item => {\r\n // We don't use this way of searching for breker data anymore. Leave it anyway so we can see a console log and find during client testing\r\n // if we missed anything, this can be very helpfull in debugging and hard to find again if we remove it\r\n // If you still see this code after June 2021, then please remove it\r\n const breakerObj = this.props.boardOptionData.find(dataItem => dataItem.ItemID === item.BreakerTypeItemID)\r\n if (breakerObj === undefined) {\r\n console.warn('Couldn\\'t find corresponding board option data for the breaker object')\r\n }\r\n\r\n return (item.ChassisPositionIndex === (2 + largePoleCount) || (item.ChassisPositionIndex === (4 + largePoleCount) && item.BreakerTypeReadOnly.PoleCount >= 3))\r\n })\r\n\r\n return (checkOptions.length > 0)\r\n }\r\n\r\n selectChassisOptionalExtras = (selectedOptions) => {\r\n let canAddOptionalExtras = true\r\n const availablityMessages = []\r\n if (this.state.chassisOptions.length > 0) { \r\n selectedOptions.forEach(optionItemID => {\r\n const optionData = this.state.chassisOptions.find(item => item.ItemID === optionItemID)\r\n \r\n // The optionData.BOMReference in the case of optional extras is the Parent Item Reference inside \r\n // the Parent-Child List, so we can find the Child Item Reference and check the availability\r\n const BOMElement = this.state.parentChildData.find(item => item.ParentItemReference === optionData.BOMReference)\r\n if (BOMElement !== undefined) {\r\n const BOMElementAvailability = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === BOMElement.ChildItemReference)\r\n \r\n if (BOMElementAvailability.IsLowStock) {\r\n availablityMessages.push(`${BOMElementAvailability.Description} Low stock, longer lead times may apply`)\r\n } else if (!BOMElementAvailability.IsInStock) {\r\n availablityMessages.push(`${BOMElementAvailability.Description} is out of stock. Please, contact au.estimating@se.com`)\r\n \r\n canAddOptionalExtras = false\r\n }\r\n }\r\n })\r\n }\r\n\r\n this.setState({ \r\n selectedChassisOptions: selectedOptions,\r\n availabilityValidationMessages: availablityMessages,\r\n canAddOptionalExtras: canAddOptionalExtras\r\n })\r\n }\r\n\r\n render() {\r\n const boardOptions = this.props.boardOptions\r\n const boardDetails = this.state.boardDetails\r\n\r\n return (\r\n
    \r\n {\r\n this.state.isLoading &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n {\r\n this.state.isExistingBoard ?\r\n Updating\r\n :\r\n \r\n {this.state.currentStep === 5 ? 'Adding board' : 'Saving'}\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n {this.renderModalHeader()}\r\n\r\n
    \r\n {/* Step 1 */}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n this.optionSelectedCall(event.target.value, 'Name')\r\n }}\r\n maxLength=\"128\"\r\n value={boardDetails.Name}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'IPRating')}\r\n enabledOptions={this.logic.getEnableOptions('IPRating')}\r\n />\r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'BoardColour')}\r\n enabledOptions={this.logic.getEnableOptions('BoardColour')}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {/* Step 2 */}\r\n
    \r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'MainSwitchType')}\r\n enabledOptions={this.logic.getEnableOptions('MainSwitchType')}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'RatingAmperes')}\r\n enabledOptions={this.logic.getEnableOptions('RatingAmperes')}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {/* Step 3 */}\r\n
    \r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'ChassisCount')}\r\n enabledOptions={this.logic.getEnableOptions('ChassisCount')}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'ChassisType')}\r\n enabledOptions={this.logic.getEnableOptions('ChassisType')}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {\r\n boardDetails.ChassisCount === 1 && boardDetails.Metering === true && boardDetails.MeterType === 'DM' &&\r\n

    \r\n \r\n \r\n \r\n \r\n The meter may be supplied as single or dual CT depending on the stocks availability\r\n \r\n

    \r\n }\r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'BreakingCapacity')}\r\n enabledOptions={this.logic.getEnableOptions('BreakingCapacity')}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'Metering')}\r\n enabledOptions={this.logic.getEnableOptions('Metering')}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'MeterType')}\r\n enabledOptions={this.logic.getEnableOptions('MeterType')}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'Chassis1PoleCount27mm')}\r\n enabledOptions={this.logic.getEnableOptions('Chassis1PoleCount27mm')}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {/* Step 4 */}\r\n
    \r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'Chassis1PoleCount')}\r\n boardClassName=\"board-chassis-options\"\r\n enabledOptions={this.logic.getEnableOptions('Chassis1PoleCount')}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'Chassis2PoleCount')}\r\n boardClassName=\"board-chassis-options\"\r\n enabledOptions={this.logic.getEnableOptions('Chassis2PoleCount')}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {/* Step 5 */}\r\n
    \r\n {\r\n this.state.board !== null &&\r\n \r\n }\r\n \r\n
    \r\n\r\n { this.state.availabilityValidationMessages.length > 0 &&\r\n
    \r\n {\r\n this.state.availabilityValidationMessages.map((message, index) => {\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 {this.renderModalFooter()}\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\n\r\n","import React from 'react'\r\nimport { isNullOrUndefined, drawPercentProgressBars } from '../../../utils/helpers'\r\nimport { apiUrlGetDocument } from '../../../utils/apiCallsCommercial'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\nexport default class BoardTile extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.editCall = this.editCall.bind(this)\r\n this.showBoardDetails = this.showBoardDetails.bind(this)\r\n this.copyCall = this.copyCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n\r\n this.state = {\r\n isLoading: false\r\n }\r\n }\r\n\r\n editCall() {\r\n if (this.props.isValid) {\r\n this.props.editCallback(this.props.id)\r\n }\r\n }\r\n\r\n showBoardDetails() {\r\n this.props.showBoardDetailsCallback(this.props.boardBreakers)\r\n }\r\n\r\n copyCall() {\r\n if (!this.props.maxBoardLimitReached && this.props.isValid) {\r\n this.props.copyCallback(this.props.id)\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.props.deleteCallback(this.props.id)\r\n }\r\n\r\n componentDidMount() {\r\n this.drawPercent()\r\n }\r\n\r\n shouldComponentUpdate(nextProps) {\r\n if (this.props.chassis1percent !== nextProps.chassis1percent ||\r\n this.props.chassis2percent !== nextProps.chassis2percent ||\r\n this.props.maxBoardLimitReached !== nextProps.maxBoardLimitReached ||\r\n isNullOrUndefined(this.props.chassis2percent) !== isNullOrUndefined(nextProps.chassis2percent)) {\r\n\r\n this.drawPercent()\r\n }\r\n\r\n return true\r\n }\r\n\r\n configureBoard(projectID, boardID) {\r\n this.props.configureChassisCallback(projectID, boardID)\r\n }\r\n\r\n drawPercent() {\r\n drawPercentProgressBars()\r\n }\r\n\r\n renderPercent(title, value, index) {\r\n if (isNullOrUndefined(value)) {\r\n return ''\r\n } else {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    \r\n { title }\r\n

    \r\n
    \r\n
    \r\n )\r\n }\r\n }\r\n\r\n renderProjectBoardModals = (boardDescription = []) => {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n {boardDescription.map((boardDescription, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
    QtyItem
    {boardDescription.Quantity} {boardDescription.Description}
    \r\n
    \r\n )\r\n }\r\n\r\n async downloadDrawing(drawingGuid) {\r\n const downloadURL = `${apiUrlGetDocument}/${drawingGuid}`\r\n const token = localStorage.getItem('token')\r\n const response = await fetch(downloadURL, {\r\n headers: {\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n })\r\n const blob = await response.blob()\r\n const url = window.URL.createObjectURL(blob)\r\n\r\n let contentDisposition = response.headers.get('Content-Disposition')\r\n // Remove all quotes \" from the contentDisposition, as some .NET behaviour adds them \r\n // it's because of the special characters \"(\" and \")\" in case of the project names with brackets\r\n contentDisposition = contentDisposition.replace(/\"/g, '')\r\n let filename = 'download.pdf'\r\n if (contentDisposition && contentDisposition.includes('attachment')) {\r\n const matches = /filename=([^;]+)/.exec(contentDisposition)\r\n if (matches && matches[1]) {\r\n filename = matches[1]\r\n }\r\n }\r\n\r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = filename\r\n a.click()\r\n window.URL.revokeObjectURL(url)\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n {/* Add .is-error to put it in an error state */}\r\n
    \r\n

    \r\n { !this.props.isValid && '[DATA CORRUPTED] - ' } { this.props.name }\r\n

    \r\n
    \r\n {this.renderPercent('Chassis 1', this.props.isValid ? this.props.chassis1percent : null, 1)}\r\n {this.renderPercent('Chassis 2', this.props.isValid ? this.props.chassis2percent : null, 2)}\r\n
    \r\n \r\n
    \r\n { !this.props.isFinalised &&\r\n \r\n {\r\n !this.props.maxBoardLimitReached &&\r\n \r\n }\r\n \r\n \r\n }\r\n
    \r\n
    \r\n { !this.props.isFinalised &&\r\n \r\n \r\n \r\n \r\n }\r\n\r\n { this.props.isFinalised &&\r\n \r\n \r\n\r\n {\r\n this.props.drawingGuid ?\r\n \r\n :\r\n \r\n }\r\n \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n )\r\n\r\n }\r\n}\r\n","import React from 'react'\r\nimport BoardTile from './BoardTile'\r\nimport { isNullOrUndefined } from '../../../utils/helpers'\r\n\r\nexport default class BoardList extends React.Component {\r\n constructor(props) { \r\n super(props)\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n
    \r\n { this.props.boards.map(item => {\r\n let drawingG = null;\r\n if (this.props.isFinalised && !this.props.loadingDrawings) {\r\n const drawingObj = this.props.boardDrawings.find(drawItem => drawItem.ProjectBoardID === item.ItemID);\r\n if (drawingObj) {\r\n drawingG = drawingObj.ItemGUID;\r\n }\r\n }\r\n // Create the list of breaker details\r\n let boardDescription = [];\r\n if (!item.hasOwnProperty('BoardBOMComponents') || !item.BoardBOMComponents.length) {\r\n item.ProjectBoardBreakerCollection.forEach(item => {\r\n const desc = item.BreakerTypeReadOnly.DrawingDesc;\r\n const inArray = boardDescription.find(item => item.Description === desc);\r\n if (inArray) {\r\n boardDescription = boardDescription.map(item => {\r\n if (item.Description === desc) {\r\n item.Quantity = item.Quantity + 1;\r\n }\r\n return item;\r\n });\r\n } else {\r\n boardDescription.push({\r\n Quantity: 1,\r\n Description: desc,\r\n StockAvailability: 'N/A'\r\n });\r\n }\r\n });\r\n } else {\r\n boardDescription = [...item.BoardBOMComponents];\r\n }\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
    \r\n );\r\n }\r\n}\r\n","import React from 'react'\r\nimport { Link, withRouter } from 'react-router-dom'\r\nimport Header from './../../../components/header/Header'\r\nimport GlobalOverlay from './../../../components/global-overlay/GlobalOverlay'\r\nimport { apiCallsCommercial } from './../../../utils/apiCallsCommercial'\r\nimport { getUrlParameter, isNullOrUndefined } from './../../../utils/helpers'\r\nimport commonFunctionsService from './../../../services/CommonFunctionsService'\r\nimport Modal from './../../../components/modal/Modal'\r\nimport BoardDetails from './BoardDetails'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport BoardList from './BoardList'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\n\r\nconst { CONST } = require('./../../../CONST')\r\n\r\nclass ProjectDetails extends React.Component {\r\n constructor (props) {\r\n super(props)\r\n\r\n this.state = {\r\n projectID: '',\r\n project: {},\r\n userData: {},\r\n fillQuoteRequirement: 10,\r\n loadingDrawings: false,\r\n orderSummaryId: null,\r\n currentBoard: null,\r\n boardDrawings: [],\r\n boardOptionData: [],\r\n boardOptions: {},\r\n apiErrorMessage: '',\r\n isLoading: true,\r\n apiError: false,\r\n apiMessage: 'Loading page',\r\n isChangingProjectTitle: false,\r\n hasSubmittedNewProjectTitle: false,\r\n newProjectTitle: '',\r\n isRequestingNewProjectTitleChange: false,\r\n changingTitleApiErrorMessage: false,\r\n isConfiguringBoard: false,\r\n isDuplicatingBoard: false,\r\n hasDuplicatedBoard: false,\r\n isDeletingBoard: false,\r\n toDeleteBoardId: null,\r\n pageError: '',\r\n wholesalerBranchID: 0,\r\n showBoardDetails: false,\r\n selectedBoardDescription: []\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({ projectID: getUrlParameter('orderID') }, () => {\r\n this.initialize()\r\n })\r\n }\r\n\r\n initialize() {\r\n apiCallsCommercial.apiGetProject(this.state.projectID)\r\n .then(projectData => {\r\n this.setState({\r\n project: projectData,\r\n newProjectTitle: projectData.Title,\r\n fillQuoteRequirement: projectData.FilledQuoteRequirement ? projectData.FilledQuoteRequirement : 10\r\n })\r\n\r\n // On a finalised project we need to get drawing links and order summary info\r\n if (projectData.IsFinalised) {\r\n this.setState({ loadingDrawings: true })\r\n\r\n apiCallsCommercial.apiGetLayoutDiagrams(this.state.projectID)\r\n .then(response => {\r\n // Split the response into distinct results\r\n const orderSummaryArray = response.ProjectFileCollection.filter(x => x.ProjectBoardID === -1)\r\n const drawingsArray = response.ProjectFileCollection.filter(x => x.ProjectBoardID !== -1)\r\n\r\n if (orderSummaryArray.length > 0) {\r\n this.setState({ orderSummaryId: orderSummaryArray[0].ItemGUID })\r\n }\r\n\r\n this.setState({\r\n boardDrawings: drawingsArray,\r\n loadingDrawings: false\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({\r\n apiErrorMessage: error.message,\r\n loadingDrawings: false\r\n })\r\n })\r\n }\r\n\r\n // Load the board options after the project has been loaded\r\n return apiCallsCommercial.apiGetBoardOption()\r\n })\r\n .then(boardOptionData => {\r\n this.tempBoardOptionData = boardOptionData\r\n this.setState({\r\n boardOptionData: boardOptionData\r\n })\r\n\r\n return apiCallsCommercial.apiGetBoardOptionLabels()\r\n })\r\n .then(boardOptionLabels => {\r\n // Once we get the board option labels, we need to alter it, as the chassis 1 / 2 pole counts needs to be\r\n // dynamically driven via the boardOptionData\r\n const chassis1PoleCount = []\r\n const chassis2PoleCount = []\r\n\r\n this.tempBoardOptionData.forEach(board => {\r\n const check1Data = chassis1PoleCount.find(check => check.value === board.Chassis1PoleCount)\r\n if (!check1Data && board.Chassis1PoleCount) {\r\n chassis1PoleCount.push({\r\n value: board.Chassis1PoleCount,\r\n label: `${board.Chassis1PoleCount}`\r\n })\r\n }\r\n\r\n const check2Data = chassis2PoleCount.find(check => check.value === board.Chassis2PoleCount)\r\n if (!check2Data && board.Chassis2PoleCount) {\r\n chassis2PoleCount.push({\r\n value: board.Chassis2PoleCount,\r\n label: `${board.Chassis2PoleCount}`\r\n })\r\n }\r\n })\r\n\r\n boardOptionLabels.OptionsChassis1PoleCount = chassis1PoleCount.sort((a,b) => {return (a.value > b.value) ? 1 : -1 })\r\n boardOptionLabels.OptionsChassis2PoleCount = chassis2PoleCount.sort((a,b) => {return (a.value > b.value) ? 1 : -1 })\r\n\r\n // All done, set it to state\r\n this.setState({\r\n boardOptions: boardOptionLabels\r\n })\r\n\r\n // If the user opens a project and there are no boards, then open the modal\r\n if (this.state.project.ProjectBoards.length === 0) {\r\n // Add some visual deleay to improve UX, without it it's just too fast and confusing\r\n window.setTimeout(() => {\r\n this.startConfiguringBoard()\r\n }, 500)\r\n }\r\n\r\n return apiCallsCommercial.apiUserSettings()\r\n })\r\n .then(userData => {\r\n this.setState({\r\n userData: userData,\r\n isLoading: false,\r\n wholesalerBranchID: userData.PreferredWholesaler1ItemID\r\n }, () => {\r\n let shouldTriggerNewBoardCreation = getUrlParameter('newBoard')\r\n if (shouldTriggerNewBoardCreation !== '') {\r\n this.startConfiguringBoard()\r\n }\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiErrorMessage: error.message })\r\n })\r\n }\r\n\r\n startConfiguringBoard = (boardID) => {\r\n if (boardID === undefined) {\r\n if (this.hasMaxBoardLimitBeenReached()) {\r\n this.setState({ pageError: 'You have reached the maximum number of boards per project and cannot ADD or COPY anymore.' })\r\n } else if (this.state.project.IsFinalised) {\r\n this.setState({ pageError: 'The order has alredy been sent and the project can no longer be modified.' })\r\n } else {\r\n this.setState({ isConfiguringBoard: true, currentBoard: null })\r\n }\r\n\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n } else {\r\n const boardToEdit = this.state.project.ProjectBoards.find(board => board.ItemID === boardID)\r\n this.setState({ isConfiguringBoard: true, currentBoard: boardToEdit })\r\n }\r\n }\r\n\r\n stopConfiguringBoard = (board) => {\r\n this.setState({ isConfiguringBoard: false, currentBoard: null })\r\n \r\n if (!isNullOrUndefined(board)) {\r\n // Modal sucessfually create or updated a board, add it to the project states or update existing one\r\n const indexOfExistingBoard = this.state.project.ProjectBoards.findIndex(projectBoard => projectBoard.ItemGUID === board.ItemGUID)\r\n\r\n if (indexOfExistingBoard > -1) {\r\n this.state.project.ProjectBoards[indexOfExistingBoard] = board\r\n } else {\r\n this.state.project.ProjectBoards.push(board)\r\n }\r\n\r\n this.forceUpdate()\r\n }\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n copyBoard = (boardId) => {\r\n this.setState({ isDuplicatingBoard: true })\r\n\r\n apiCallsCommercial.apiCopyBoard(this.state.project.ItemID, boardId)\r\n .then(projectData => {\r\n this.setState({\r\n project: projectData\r\n })\r\n\r\n this.setState({ isDuplicatingBoard: false, hasDuplicatedBoard: true })\r\n window.setTimeout(() => { this.setState({ hasDuplicatedBoard: false }) }, 1500)\r\n })\r\n .catch(error => {\r\n this.setState({ isDuplicatingBoard: false })\r\n alert(`There was an error copying the board: ${error.message}`)\r\n })\r\n }\r\n\r\n toDeleteBoard = (boardId) => {\r\n this.setState({ isDeletingBoard: true, toDeleteBoardId: boardId })\r\n }\r\n\r\n deleteBoardRequest() {\r\n this.setState({ isRequestingBoardDeletion: true })\r\n\r\n this.stopDeletingBoard()\r\n\r\n apiCallsCommercial.apiDeleteBoard(this.state.projectID, this.state.toDeleteBoardId)\r\n .then(updatedProject => {\r\n this.setState({\r\n project: updatedProject,\r\n toDeleteBoardId: null,\r\n isRequestingBoardDeletion: false\r\n }) \r\n })\r\n .catch(error => alert(error.message))\r\n }\r\n \r\n startChangingProjectTitle = () => {\r\n this.setState({ isChangingProjectTitle: true })\r\n }\r\n\r\n stopChangingProjectTitle = () => {\r\n this.setState({ isChangingProjectTitle: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n stopDeletingBoard = () => {\r\n this.setState({ isDeletingBoard: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n changeProjectTitle = () => {\r\n this.setState({ hasSubmittedNewProject: true })\r\n\r\n if (this.state.newProjectTitle !== '') {\r\n this.setState({\r\n changingTitleApiErrorMessage: '',\r\n isRequestingNewProjectTitleChange: true\r\n })\r\n\r\n let projectData = cloneDeep(this.state.project)\r\n projectData.Title = this.state.newProjectTitle\r\n\r\n apiCallsCommercial.apiSetProjectTitle(projectData)\r\n .then(response => {\r\n // At this point we can read ItemGUID from the response and redirect user to that page\r\n this.setState({\r\n hasSubmittedNewProjectTitle: true,\r\n isRequestingNewProjectTitleChange: false,\r\n project: response\r\n }, () => {\r\n this.stopChangingProjectTitle()\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({\r\n changingTitleApiErrorMessage: error,\r\n isRequestingNewProjectTitleChange: false\r\n })\r\n })\r\n\r\n }\r\n }\r\n\r\n handelChange = (name, value) => {\r\n this.setState({ ['' + name]: value })\r\n }\r\n\r\n hasMaxBoardLimitBeenReached() {\r\n // Function to check if the user has reached max board limit or not\r\n // App should not let user copy or add boards if they are at the limit.\r\n // Hardcode the max board limit if its not returned from the API\r\n const boardLimit = this.state.project.MaxBoardLimit ? this.state.project.MaxBoardLimit : 8\r\n return (this.state.project.ProjectBoards.length >= boardLimit)\r\n }\r\n\r\n configureChassis = (projectID, boardID) => {\r\n this.props.history.push(CONST.PAGES.CONFIGURE_CHASSIS + '?projectID=' + projectID + '&boardID=' + boardID)\r\n }\r\n\r\n isEnoughFilledToGenerateQuote() {\r\n let noEnoughFilled = false\r\n this.state.project.ProjectBoards.map(board => {\r\n if (board.Chassis1PercentComplete < this.state.fillQuoteRequirement || ((board.BoardTypeReadOnly && board.BoardTypeReadOnly.ChassisCount === 2) && board.Chassis2PercentComplete < this.state.fillQuoteRequirement)) {\r\n noEnoughFilled = true\r\n return\r\n }\r\n })\r\n\r\n if (this.state.project.ProjectBoards.length === 0) {\r\n noEnoughFilled = true\r\n }\r\n\r\n return !noEnoughFilled\r\n }\r\n\r\n viewQuote() {\r\n // If you don't have any boards...\r\n if (!this.state.project.ProjectBoards || !this.state.project.ProjectBoards.length) {\r\n this.setState({ \r\n pageError: 'Your project needs at least one board filled greater than ' + this.state.fillQuoteRequirement + '% to generate a quote.',\r\n fillQuoteRequirementError: true\r\n })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n\r\n return false\r\n }\r\n\r\n // You've got boards but not all of them are filled out to minimum levels...\r\n let noEnoughFilled = !this.isEnoughFilledToGenerateQuote()\r\n if (noEnoughFilled) {\r\n this.setState({ \r\n pageError: 'Your project needs all boards filled greater than ' + this.state.fillQuoteRequirement + '% to generate a quote.',\r\n fillQuoteRequirementError: true\r\n })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n\r\n return false\r\n }\r\n\r\n // Check if all project boards meet the assembly performance checks, display error only for the first one encountered \r\n for (let index = 0; index < this.state.project.ProjectBoards.length; index++) {\r\n const projectBoard = this.state.project.ProjectBoards[index]\r\n \r\n if (!projectBoard.AssemblyPowerLossCheckSuccess || !projectBoard.Chassis1PowerLossCheckSuccess || !projectBoard.Chassis2PowerLossCheckSuccess || projectBoard.LoadFactorStatusColour === 'red') {\r\n this.setState({ \r\n pageError: 'Can\\'t generate quote. Please check error message on \"' + projectBoard.Name + '\" board.',\r\n fillQuoteRequirementError: true\r\n })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n \r\n return false\r\n }\r\n }\r\n\r\n // If you're a contractor you need a selected wholesaler\r\n if (this.state.userData.UserIsContractor && (this.state.wholesalerBranchID === 0 || this.state.wholesalerBranchID === -1)) {\r\n this.setState({ pageError: 'Current user doesn\\'t have a preferred wholesalers configured.' })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // Finally made it through all the hoops, go to the Quote page.\r\n let pageLink = \"\"\r\n if (this.state.userData.UserIsContractor) {\r\n pageLink = CONST.PAGES.QUOTE + '?projectID=' + this.state.projectID + '&wholesalerBranchID=' + this.state.wholesalerBranchID\r\n this.props.history.push(pageLink)\r\n } else {\r\n pageLink = CONST.PAGES.QUOTE + '?projectID=' + this.state.projectID\r\n this.props.history.push(pageLink)\r\n }\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: \"View Quote\",\r\n cta_link: window.location.hostname + pageLink,\r\n cta_location: \"Project details\",\r\n })\r\n }\r\n\r\n renderProjectBoardModals = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { this.state.selectedBoardDescription.map((boardDescription, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
    QuantityItem
    { boardDescription.Quantity }{ boardDescription.Description }
    \r\n )\r\n }\r\n\r\n showBoardDetails = boardDescription => {\r\n this.setState({ selectedBoardDescription: boardDescription, showBoardDetails: true })\r\n }\r\n\r\n hideBoardDetails = () => {\r\n this.setState({ showBoardDetails: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n {\r\n this.state.isLoading &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Loading\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isDuplicatingBoard &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Duplicating Board\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.hasDuplicatedBoard &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Board copied successfully\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isRequestingBoardDeletion &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Deleting Board\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n My Commercial Projects\r\n { this.state.project.Title }\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n { this.state.project.Title }\r\n

    \r\n \r\n \r\n\r\n { this.state.project.IsToBeApproved && 'Available' }\r\n { !this.state.project.IsFinalised && 'In Progress' }\r\n { this.state.project.IsFinalised && 'Order Completed' }\r\n \r\n
    \r\n\r\n { !this.state.isLoading && \r\n
    \r\n \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n {\r\n this.state.project.ProjectBoards !== undefined &&\r\n
    \r\n {\r\n this.state.pageError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n { this.state.pageError }\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.project.ProjectBoards.length > 4 &&\r\n

    \r\n \r\n \r\n \r\n \r\n Maximum boards per project is 8. The first four boards will be dispatched in five business days as per standard.

    Extra boards will be dispatched over the following two weeks depending on FlexSelect load. If you have any questions about lead times, please email the FlexSelect team at au.estimating@se.com\r\n
    \r\n

    \r\n }\r\n\r\n {\r\n this.state.project.ProjectBoards.length === 0 &&\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n

    \r\n You don’t have any board yet in your project.\r\n

    \r\n

    \r\n Add your first board above\r\n

    \r\n
    \r\n }\r\n\r\n {\r\n this.state.project.ProjectBoards.length > 0 &&\r\n \r\n }\r\n \r\n
    \r\n }\r\n
    \r\n\r\n {\r\n this.state.project.ItemID !== undefined &&\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Project Created\r\n \r\n
    \r\n\r\n
    0 ? ' is-done' : '') }>\r\n \r\n \r\n \r\n \r\n Board Added\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n All Boards Configured (Min { this.state.fillQuoteRequirement }%)\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Quote Generated\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Order to Complete\r\n \r\n
    \r\n\r\n
    \r\n
    \r\n }\r\n\r\n { this.state.isChangingProjectTitle &&\r\n \r\n\r\n
    \r\n
    \r\n \r\n this.handelChange(event.target.name, event.target.value)} required maxLength=\"128\" autoFocus>\r\n\r\n {/*
    This field is required
    */}\r\n
    \r\n\r\n {/* Generic API error */}\r\n {\r\n this.state.changingTitleApiErrorMessage &&\r\n
    { this.state.changingTitleApiErrorMessage }
    \r\n }\r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n }\r\n\r\n { this.state.isDeletingBoard &&\r\n \r\n\r\n
    \r\n

    Are you sure you want to delete this board?

    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n }\r\n\r\n {/* Board details */}\r\n {\r\n this.state.showBoardDetails &&\r\n \r\n { this.renderProjectBoardModals() }\r\n \r\n }\r\n\r\n {\r\n this.state.isConfiguringBoard && \r\n \r\n }\r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(ProjectDetails)","import { getNumberOfRowsFromPolesString, getPolesCountFromPolesString } from './../utils/helpers'\r\n\r\nclass BoardService {\r\n getDetails = (boardOptionData, EnclosureID, MainSwitchID, SPDID, MetalBlackPlateID) => {\r\n const enclosureDetails = this.getBoardComponentDetails(boardOptionData, EnclosureID, 'Enclosures')\r\n const metalBlackPlateDetails = this.getBoardComponentDetails(boardOptionData, MetalBlackPlateID, 'Enclosures')\r\n const mainSwitchDetails = this.getBoardComponentDetails(boardOptionData, MainSwitchID, 'MainSwitches')\r\n const SDPDetails = this.getBoardComponentDetails(boardOptionData, SPDID, 'SDPs')\r\n\r\n const boardDetails = {\r\n EnclosureType: enclosureDetails.EnclosureType,\r\n PolesNeeded: enclosureDetails.PolesNeeded,\r\n MetalBlackPlate: metalBlackPlateDetails !== undefined ? true : null, \r\n IncomerPhase: mainSwitchDetails.IncomerPhase,\r\n MainSwitchType: mainSwitchDetails.SwitchType,\r\n CircuitBreaker: mainSwitchDetails.Rating,\r\n MainSwitchRating: mainSwitchDetails.CurrentRating,\r\n SurgeProtection: SDPDetails !== undefined ? true : false,\r\n SurgeProtectionDetails: SDPDetails !== undefined ? SDPDetails : null,\r\n MaxDischargeCapacity: SDPDetails !== undefined ? SDPDetails.MaxDischargeCapacity : ''\r\n }\r\n return boardDetails\r\n }\r\n\r\n getBoardComponentDetails = (boardOptionData, itemID, componentsType) => {\r\n return boardOptionData[componentsType].find(boardOption => boardOption.ItemID === itemID)\r\n }\r\n\r\n getBoardCompletionDetails = (boardData, boardDetails) => {\r\n const numberOfRows = getNumberOfRowsFromPolesString(boardDetails.PolesNeeded)\r\n const numberOfPoles = getPolesCountFromPolesString(boardDetails.PolesNeeded)\r\n const totalNumberOfBoardPoles = numberOfRows * numberOfPoles\r\n let totalNumberOfOccupiedPoles = 0\r\n let completionPercentage = 0\r\n // User needs at least 4 breakers to see a quote, previously the board needed to be filled at least to 30%\r\n // Not all devices count towards the completion of the board\r\n // Initialize at 1 as we always have the main switch and it always count toward the completion \r\n let numberOfDevicesToAllowSeeingTheQuote = 1 \r\n let additionalPolesOccupied = this.getMainSwitchIncomingPhasesPoles(boardDetails.IncomerPhase) // there is always a main switch\r\n if (boardData.SPDID !== null && boardData.SPDID !== 0) {\r\n additionalPolesOccupied = additionalPolesOccupied + 1\r\n numberOfDevicesToAllowSeeingTheQuote += 1\r\n }\r\n\r\n // Consider breakers\r\n boardData.ProjectBoardBreakerCollection.forEach(breaker => {\r\n const spaceUsed = parseInt(breaker.BreakerTypeReadOnly.SpaceUsed, 10)\r\n totalNumberOfOccupiedPoles = totalNumberOfOccupiedPoles + spaceUsed\r\n numberOfDevicesToAllowSeeingTheQuote += 1\r\n })\r\n\r\n // Consider contactors\r\n boardData.ProjectBoardContractorCollection.forEach(contactor => {\r\n const spaceUsed = parseInt(contactor.ContractorReadOnly.SpaceUsed, 10)\r\n totalNumberOfOccupiedPoles = totalNumberOfOccupiedPoles + spaceUsed\r\n numberOfDevicesToAllowSeeingTheQuote += 1\r\n })\r\n\r\n // Consider fitted options\r\n boardData.ProjectBoardFittedOptionCollection.forEach(contactor => {\r\n const spaceUsed = parseInt(contactor.FittedOptionReadOnly.SpaceUsed, 10)\r\n totalNumberOfOccupiedPoles = totalNumberOfOccupiedPoles + spaceUsed\r\n numberOfDevicesToAllowSeeingTheQuote += 1\r\n })\r\n\r\n // Consider the Wiser Energy Gateway\r\n if (boardData.HasWiserEnergyGateway) {\r\n totalNumberOfOccupiedPoles = totalNumberOfOccupiedPoles + 3\r\n numberOfDevicesToAllowSeeingTheQuote += 1\r\n }\r\n\r\n totalNumberOfOccupiedPoles = totalNumberOfOccupiedPoles + additionalPolesOccupied\r\n completionPercentage = totalNumberOfOccupiedPoles * 100 / totalNumberOfBoardPoles\r\n\r\n return {\r\n totalPoles: totalNumberOfBoardPoles,\r\n totalPolesConfigured: totalNumberOfOccupiedPoles,\r\n totalPolesRemaining: totalNumberOfBoardPoles - totalNumberOfOccupiedPoles,\r\n completionPercentage: completionPercentage,\r\n isEnoughCompletedToSeeTheQuote: numberOfDevicesToAllowSeeingTheQuote >= 4\r\n }\r\n }\r\n\r\n // Given a string value of the incoming phases for the main switch return number of poles that it occupies on the board\r\n getMainSwitchIncomingPhasesPoles(incomerPhaseName) {\r\n if (incomerPhaseName === 'Single Phase') return 1\r\n else if (incomerPhaseName === '2 Phase') return 2\r\n else if (incomerPhaseName === '3 Phase') return 3\r\n }\r\n\r\n // In case of 1 phase incomer and 20kA Max discharge capacity: None MCB is required as Schneirder doesn’t publish anything in their instructions\r\n getSurgeProtectionRequiredMCBReference(incomerPhase, maxDischargeCapacity) {\r\n let MCBReference = null\r\n\r\n if (incomerPhase === 'Single Phase' && maxDischargeCapacity === '40kA') MCBReference = 'MX9MC140'\r\n if (incomerPhase === '3 Phase' && maxDischargeCapacity === '40kA') MCBReference = 'MX9MC340'\r\n\r\n return MCBReference\r\n }\r\n}\r\n\r\nconst boardService = new BoardService()\r\nexport default boardService\r\n ","class BusbarService {\r\n getBusbarStartIndex(mountingPosition, isRowWithMainSwitch, mainSwitchPosition, neutralTerminalBlock, firstConnectableBreaker) {\r\n\r\n // Determinate starting position for the busbar, so if it's not the row with the main switch, then start at the beggining of the row\r\n let busbarStartIndex = 0\r\n let lowerCasedMountingPosition = mountingPosition.toLowerCase()\r\n\r\n if (isRowWithMainSwitch) {\r\n if (lowerCasedMountingPosition === 'top') {\r\n // Busbar initial position will cover the main switch\r\n busbarStartIndex = mainSwitchPosition\r\n\r\n if (neutralTerminalBlock) {\r\n // Here we know that the busbar should have a Neutral Terminal block before, so the initial position of the \r\n // busbar should also cover this device\r\n busbarStartIndex = mainSwitchPosition - 1\r\n } \r\n } else if (lowerCasedMountingPosition === 'bottom') {\r\n // Bottom busbar can't cover the main switch\r\n // If we have busbar on bottom of the first row where the main switch is present, then the busbar will start\r\n // on the position of the first connectable breaker device\r\n busbarStartIndex = firstConnectableBreaker\r\n }\r\n } else {\r\n busbarStartIndex = firstConnectableBreaker\r\n }\r\n\r\n return busbarStartIndex\r\n }\r\n\r\n getBusbarEndIndex(startPosition, busbarPoles, extraPoles) {\r\n return startPosition + (busbarPoles + extraPoles -1) // -1 to return array based result\r\n }\r\n\r\n getBusbarMinimumLengthToCoverAllRowDevices(busbarStartIndex, lastConnectableBreakerPositionIndex, lastConnectableBreakerSpaceUsed) {\r\n return (lastConnectableBreakerPositionIndex - busbarStartIndex) + lastConnectableBreakerSpaceUsed\r\n }\r\n\r\n getMaximumAllowedExtraPoles(busbarStartIndex, lastConnectableBreakerPosition, lastConnectableBreakerSpaceUsed, busBarPoles, rowLength, firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice, willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock = false) {\r\n // If the busbar will be having the neutral terminal block that means that the main switch will need to be potentially moved\r\n // automatically by one space to the right to automatically insert it, which means that all breakers to the right will be shifted by one space\r\n // And this needs to be considered when calculating the maximum allowed extra poles, the easiest way to do so seems to be by moving the last braker\r\n // position by the space occupied by the neutral terminal block, which is one space\r\n if (willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock) {\r\n lastConnectableBreakerPosition += 1\r\n }\r\n \r\n let busbarRequiredLengthToCoverAllDevices = this.getBusbarMinimumLengthToCoverAllRowDevices(busbarStartIndex, lastConnectableBreakerPosition, lastConnectableBreakerSpaceUsed)\r\n let maximumPolesConsideringLengthOfTheBusbar = busBarPoles - busbarRequiredLengthToCoverAllDevices\r\n let maximumPolesConsideringLengthOfTheRowAndBusbarSize = rowLength - (lastConnectableBreakerPosition + lastConnectableBreakerSpaceUsed)\r\n let maximumPolesConsideringIncompatibleDeviceOnRightSide = null\r\n\r\n if (firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice !== null) {\r\n if (willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock) firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice += 1\r\n maximumPolesConsideringIncompatibleDeviceOnRightSide = firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice - (lastConnectableBreakerPosition + lastConnectableBreakerSpaceUsed)\r\n }\r\n\r\n if (maximumPolesConsideringLengthOfTheBusbar > maximumPolesConsideringLengthOfTheRowAndBusbarSize) {\r\n if (maximumPolesConsideringIncompatibleDeviceOnRightSide !== null && maximumPolesConsideringIncompatibleDeviceOnRightSide < maximumPolesConsideringLengthOfTheRowAndBusbarSize) {\r\n return maximumPolesConsideringIncompatibleDeviceOnRightSide\r\n } else {\r\n return maximumPolesConsideringLengthOfTheRowAndBusbarSize\r\n }\r\n } else {\r\n if (maximumPolesConsideringIncompatibleDeviceOnRightSide !== null && maximumPolesConsideringIncompatibleDeviceOnRightSide < maximumPolesConsideringLengthOfTheBusbar) {\r\n return maximumPolesConsideringIncompatibleDeviceOnRightSide\r\n } else {\r\n return maximumPolesConsideringLengthOfTheBusbar\r\n }\r\n }\r\n }\r\n\r\n getBusbarsWithNeutralTerminalBlockReferences() {\r\n return ['MX9B112N', 'MX9B115N', 'MX9B121N', 'MX9B315N', 'MX9B321N']\r\n }\r\n}\r\n\r\nconst busbarService = new BusbarService()\r\nexport default busbarService\r\n ","import React, { Component } from 'react'\r\nimport jQuery from 'jquery'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport RadioObjectGroup from '../../../components/radio-object-group/RadioObjectGroup'\r\nimport GlobalOverlay from '../../../components/global-overlay/GlobalOverlay'\r\nimport { getNumberOfRowsFromPolesString, getNumberOfPolesFromStringExpression } from './../../../utils/helpers'\r\nimport BoardService from './../../../services/BoardService'\r\nimport { apiCallsResidential } from '../../../utils/apiCallsResidential'\r\nimport { canAddDeviceToBoardPosition } from './../../../utils/helpers'\r\nimport { orderBy } from 'lodash'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\nimport BusbarService from '../../../services/BusbarService'\r\n\r\nexport default class BoardDetailsResidential extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n // Internal states that no one else needs to know about holds info on the selection options\r\n this.initStates(this.props)\r\n }\r\n\r\n componentDidMount() {\r\n jQuery('body').addClass('modal-is-open')\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (!this.props.board && !nextProps.board) {\r\n return\r\n }\r\n\r\n if (!this.props.board || !nextProps.board || this.props.board.ItemID !== nextProps.board.ItemID) {\r\n this.initStates(nextProps, true)\r\n }\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n // Default values\r\n let boardDetails = {\r\n Name: '',\r\n EnclosureType: '',\r\n PolesNeeded: '',\r\n MetalBlackPlate: null,\r\n IncomerPhase: '',\r\n MainSwitchType: '',\r\n CircuitBreaker: '',\r\n MainSwitchRating: '',\r\n SurgeProtection: '',\r\n MaxDischargeCapacity: ''\r\n }\r\n\r\n if (propsData.board) {\r\n const updatedBoardDetails = BoardService.getDetails(this.props.boardOptionData,\r\n propsData.board.EnclosureID, propsData.board.MainSwitchID, propsData.board.SPDID, propsData.board.MetalBlackPlateID)\r\n\r\n boardDetails = {\r\n Name: propsData.board.Name,\r\n MainSwitchPosition: propsData.board.MainSwitchPosition,\r\n ...updatedBoardDetails\r\n }\r\n }\r\n\r\n const updatedState = {\r\n boardDetails: boardDetails,\r\n board: propsData.board ? propsData.board : null,\r\n isExistingBoard: propsData.board ? true : false,\r\n currentStep: 1, // Used to indicate the step the design is divided\r\n currentStepStatus: {\r\n 1: false,\r\n 2: false,\r\n 3: false\r\n },\r\n canGoNextStep: false,\r\n hasUsedBackButton: false,\r\n isLoading: false,\r\n validationMessage: '',\r\n outOfStock: false\r\n }\r\n\r\n // If it is an existing board, then we allow the user to skip between the step as if he used a back button\r\n // Also remember if it had a Surge Protection with a mandatory MCB, so when he decides to remove the Surge\r\n // Protection we will also remove the mandatory MCB it comes attached with\r\n if (updatedState.isExistingBoard) {\r\n updatedState.hasUsedBackButton = true\r\n updatedState.hasSurgeProtectionMandatoryMCB = false\r\n\r\n const SPDDetails = this.getSPDDetails(boardDetails.MaxDischargeCapacity, boardDetails.IncomerPhase)\r\n if (SPDDetails !== null && BoardService.getSurgeProtectionRequiredMCBReference(boardDetails.IncomerPhase, boardDetails.MaxDischargeCapacity) !== null) {\r\n updatedState.hasSurgeProtectionMandatoryMCB = true\r\n updatedState.existingSPDDetails = SPDDetails\r\n }\r\n }\r\n\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n // Update the selected option value in local state\r\n optionSelectedCall(value, key) {\r\n // If user selects anything reset availability message check as it has probably changed\r\n this.setState({\r\n validationMessage: '',\r\n outOfStock: false\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.boardDetails)\r\n updatedBoard[key] = value\r\n\r\n if (key === 'EnclosureType' && value === 'Surface Mount') {\r\n updatedBoard.MetalBlackPlate = null\r\n }\r\n\r\n if (key === 'IncomerPhase' || key === 'MainSwitchType') {\r\n updatedBoard.MainSwitchRating = ''\r\n updatedBoard.CircuitBreaker = ''\r\n }\r\n\r\n if (key === 'SurgeProtection' && value === false) {\r\n updatedBoard.MaxDischargeCapacity = ''\r\n }\r\n\r\n // In this unique case, user can't have a surge protection, so we select it as No and disable Yes option\r\n if (updatedBoard.IncomerPhase === '2 Phase') {\r\n updatedBoard.SurgeProtection = false\r\n updatedBoard.MaxDischargeCapacity = null\r\n }\r\n\r\n this.setState({ boardDetails: updatedBoard }, () => {\r\n // Check if we need to reset the value for the metal black plate\r\n const metalBlackPlateEnabledOptions = this.getMetalBlackPlateEnabledOptions()\r\n if (metalBlackPlateEnabledOptions.indexOf(updatedBoard.MetalBlackPlate) === -1) {\r\n updatedBoard.MetalBlackPlate = null\r\n }\r\n\r\n // Check if we need to reset the value for the metal black plate\r\n const surgeProtectionEnabledOptions = this.getSurgeProtectionEnabledOptions()\r\n if (surgeProtectionEnabledOptions.indexOf(updatedBoard.SurgeProtection) === -1) {\r\n updatedBoard.SurgeProtection = null\r\n updatedBoard.MaxDischargeCapacity = null\r\n }\r\n\r\n this.setState({ boardDetails: updatedBoard })\r\n\r\n if (this.state.currentStep === 1 && this.canGoNextStep()) {\r\n\r\n }\r\n\r\n // If the user has used the back button, the don't automatically skip the steps, we will show \r\n if (this.canGoNextStep()) {\r\n this.setState({ canGoNextStep: true })\r\n } else {\r\n this.setState({ canGoNextStep: false })\r\n }\r\n })\r\n }\r\n\r\n getSPDDetails(maxDischargeCapacity, incomerPhase) {\r\n let SPDDetails = null\r\n this.props.boardOptionData.SDPs.forEach(boardOption => {\r\n if (maxDischargeCapacity !== '') {\r\n if (boardOption.MaxDischargeCapacity === maxDischargeCapacity &&\r\n boardOption.IncomerPhase === incomerPhase) {\r\n SPDDetails = boardOption\r\n }\r\n }\r\n })\r\n\r\n return SPDDetails\r\n }\r\n\r\n saveBoard() {\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Add Board',\r\n cta_link: window.location.href,\r\n cta_location: 'board details page'\r\n })\r\n\r\n const finalSelections = cloneDeep(this.state.boardDetails)\r\n\r\n console.info('finalSelections', this.props.boardOptionData)\r\n\r\n // Get enclousure reference\r\n let enclousureReference = null\r\n this.props.boardOptionData.Enclosures.forEach(boardOption => {\r\n if (boardOption.EnclosureType === finalSelections.EnclosureType && boardOption.PolesNeeded === finalSelections.PolesNeeded) {\r\n enclousureReference = boardOption.ItemID\r\n }\r\n })\r\n\r\n if (enclousureReference === null) {\r\n window.alert('Could not find Enclosure reference, please assure all options were selected.')\r\n return\r\n }\r\n\r\n let metalBlackPlateID = null\r\n if (finalSelections.MetalBlackPlate === true) {\r\n this.props.boardOptionData.Enclosures.forEach(boardOption => {\r\n const currentSelectionRows = getNumberOfRowsFromPolesString(finalSelections.PolesNeeded)\r\n if (boardOption.EnclosureType === 'Flush Mount Enclosure - Metal back plate' && boardOption.NumberOfRows === currentSelectionRows) {\r\n metalBlackPlateID = boardOption.ItemID\r\n }\r\n })\r\n\r\n if (metalBlackPlateID === null) {\r\n window.alert('Could not find reference number for the selected metal black plate, please assure all options were selected.')\r\n return\r\n }\r\n }\r\n\r\n // Get main Switch reference\r\n let mainSwitchReference = null\r\n for (let index = 0; index < this.props.boardOptionData.MainSwitches.length; index++) {\r\n const boardOption = this.props.boardOptionData.MainSwitches[index];\r\n if (boardOption.CurrentRating === finalSelections.MainSwitchRating &&\r\n boardOption.IncomerPhase === finalSelections.IncomerPhase &&\r\n boardOption.SwitchType === finalSelections.MainSwitchType) {\r\n if (!!finalSelections.CircuitBreaker) {\r\n if (boardOption.Rating === finalSelections.CircuitBreaker) {\r\n mainSwitchReference = boardOption.ItemID\r\n break\r\n }\r\n } else {\r\n mainSwitchReference = boardOption.ItemID\r\n break\r\n }\r\n }\r\n }\r\n\r\n if (mainSwitchReference === null) {\r\n window.alert('Could not find Main Switch reference, please assure all options were selected.')\r\n return\r\n }\r\n\r\n const SPDDetails = this.getSPDDetails(finalSelections.MaxDischargeCapacity, finalSelections.IncomerPhase)\r\n\r\n // Determinate main switch Position\r\n let mainSwitchPosition = 0\r\n if (SPDDetails !== null) {\r\n mainSwitchPosition = SPDDetails.SpaceUsed\r\n }\r\n\r\n // When editing the board remember previous main switch position\r\n if (this.props.board !== null) {\r\n mainSwitchPosition = parseInt(this.props.board.MainSwitchPosition, 10)\r\n\r\n // But assure it's not conflicting with Surge Protection if that was added\r\n if (SPDDetails !== null && mainSwitchPosition === 0) {\r\n // This potentially can cause some problems if the user edits the board and adds a surge protection\r\n // on a board where there was already a device on the right side of the main switch \r\n mainSwitchPosition = SPDDetails.SpaceUsed\r\n }\r\n\r\n // And if the user has decided to not have a Surge Protection and had a mandatory MCB attached to it,\r\n // then we go and remove that breaker\r\n if ((SPDDetails === null && this.state.hasSurgeProtectionMandatoryMCB) ||\r\n // If the user decided to have a different main incomer, but still have a surge protection, then still delete the mandatory MCB as\r\n // further checks will recognise it's not there and add a new one\r\n (SPDDetails !== null && this.state.existingSPDDetails !== undefined && this.state.existingSPDDetails.ItemID !== SPDDetails.ItemID)) {\r\n // Since Surge Protection is always the first element on the first row and the mandatory MCB\r\n // is always attached to it on the right, then we know it's the first breaker in the collection with the lowest index\r\n // Yet we still double check it by reference code just in case the MCB wasn't added in case of any issues\r\n const orderedBreakers = orderBy(this.state.board.ProjectBoardBreakerCollection, ['RowIndex', 'PoleIndex'])\r\n const requiredMCBReference = BoardService.getSurgeProtectionRequiredMCBReference(this.state.existingSPDDetails.IncomerPhase, this.state.existingSPDDetails.MaxDischargeCapacity)\r\n\r\n if (orderedBreakers.length > 0 && orderedBreakers[0].BreakerTypeReadOnly.Reference === requiredMCBReference) {\r\n this.props.deleteBreakerFromBoard(orderedBreakers[0].RowIndex, orderedBreakers[0].PoleIndex, orderedBreakers[0].ItemID, this.props.board.ItemID)\r\n }\r\n }\r\n\r\n // Make sure the main switch won't go over any existing breakers or devices, it can happen if we have a phase main incomer\r\n // and a breaker on the right side of the main switch and the user decides to change the size of the main incomer\r\n const canChangeMainSwitchSize = canAddDeviceToBoardPosition(BoardService.getMainSwitchIncomingPhasesPoles(finalSelections.IncomerPhase), 0, mainSwitchPosition, false, this.state.board, this.state.boardDetails, this.props.boardOptionData, true, null, null, null, false, true)\r\n\r\n if (!canChangeMainSwitchSize) {\r\n // Get current main switch by MainSwitchID\r\n const currentMainSwitch = this.props.boardOptionData.MainSwitches.find(mainSwitch => mainSwitch.ItemID === this.props.board.MainSwitchID)\r\n const spacesToMove = BoardService.getMainSwitchIncomingPhasesPoles(finalSelections.IncomerPhase) - BoardService.getMainSwitchIncomingPhasesPoles(currentMainSwitch.IncomerPhase)\r\n window.alert(`Could not change the size of the main incomer, it would overlap an existing device, please adjust your board and assure there is the correct amount of space available. You will need to free up ${spacesToMove} space${spacesToMove > 1 ? 's' : ''} on the right side of the main incomer.`)\r\n return\r\n }\r\n\r\n // Also we need to put a check for the Neutra Terminal Block, if it's present, then we need to ask user to make adjustments\r\n if (SPDDetails !== null) {\r\n const busbarsWithNeutralBlock = BusbarService.getBusbarsWithNeutralTerminalBlockReferences()\r\n const firstRowBusbar = this.state.board.ProjectBoardBusbarCollection.find(busbar => busbar.Row === 1 && busbar.BusBarReadOnly.MountingPosition === 'Top')\r\n\r\n if (firstRowBusbar !== undefined && busbarsWithNeutralBlock.includes(firstRowBusbar.BusBarReadOnly.Reference)) {\r\n window.alert('The board contains a Neutral Terminal Block in the position of the Surge Protection. Please make necessary adjustments to the board to assure the Surge Protection can be added.')\r\n return\r\n }\r\n }\r\n }\r\n\r\n // If the main switch is already on position N (just after the surge protection), but an MCB is required on the right, the move\r\n // the main switch by N positions (depending on the size of the surge protection and MCB)\r\n if (SPDDetails !== null && mainSwitchPosition === SPDDetails.SpaceUsed && BoardService.getSurgeProtectionRequiredMCBReference(finalSelections.IncomerPhase, finalSelections.MaxDischargeCapacity) !== null) {\r\n // We also need to consider if that mandatory MCB is just 1 or 3 poles, based on the main incomer phases\r\n if (finalSelections.IncomerPhase === 'Single Phase') {\r\n mainSwitchPosition = SPDDetails.SpaceUsed + 1\r\n } else if (finalSelections.IncomerPhase === '3 Phase') {\r\n mainSwitchPosition = SPDDetails.SpaceUsed + 3\r\n }\r\n }\r\n\r\n // Create the final board object to be passed to the server\r\n let finalBoard = {\r\n Name: finalSelections.Name, // or boardName?\r\n ProjectID: this.props.projectID, // Current Project ID to make association\r\n EnclosureID: enclousureReference,\r\n MainSwitchID: mainSwitchReference,\r\n SPDID: SPDDetails !== null ? SPDDetails.ItemID : null,\r\n MetalBlackPlateID: metalBlackPlateID, // Metal Black plate can be null if it wasn't selected as an option\r\n Quantity: 30, // Default quantity\r\n MainSwitchPosition: mainSwitchPosition\r\n }\r\n\r\n if (this.state.isExistingBoard) {\r\n finalBoard.ItemID = this.state.board.ItemID\r\n finalBoard.HasWiserEnergyGateway = this.props.board.HasWiserEnergyGateway\r\n finalBoard.WiserEnergyGatewayPosition = this.props.board.WiserEnergyGatewayPosition\r\n finalBoard.WiserEnergyGatewayRow = this.props.board.WiserEnergyGatewayRow\r\n }\r\n\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoard(finalBoard)\r\n .then(boardData => {\r\n this.setState({ board: boardData }, () => {\r\n // If a surge protection is required and it's a new board, then add the mandatory MCB breaker\r\n const requiredSurgeProtectionMCBReference = BoardService.getSurgeProtectionRequiredMCBReference(finalSelections.IncomerPhase, finalSelections.MaxDischargeCapacity)\r\n console.log('requiredSurgeProtectionMCBReference', requiredSurgeProtectionMCBReference)\r\n\r\n if (requiredSurgeProtectionMCBReference !== null) {\r\n console.log('This board requires a mandatory MCB: ' + requiredSurgeProtectionMCBReference + ', checking if it is added on the right side of the Surge Protection...')\r\n\r\n const isCorrectMCBPresentAtRequiredPosition = this.state.board.ProjectBoardBreakerCollection.some(boardBreaker => {\r\n return boardBreaker.RowIndex === 0 && boardBreaker.PoleIndex === SPDDetails.SpaceUsed && boardBreaker.BreakerTypeReadOnly.Reference === requiredSurgeProtectionMCBReference\r\n })\r\n\r\n // Probably we can refactor to use canAddDeviceToPosition function to better check if the MCB can be added here \r\n let isDifferentDevicePresentAtRequiredPosition = false\r\n let isCorrectDevicePresentAtRequiredPosition = false\r\n let canAddDeviceToPosition = false\r\n if (mainSwitchPosition === SPDDetails.SpaceUsed) {\r\n isDifferentDevicePresentAtRequiredPosition = true\r\n } else {\r\n isDifferentDevicePresentAtRequiredPosition = this.state.board.ProjectBoardBreakerCollection.some(boardBreaker => {\r\n return boardBreaker.RowIndex === 0 && boardBreaker.PoleIndex === SPDDetails.SpaceUsed && boardBreaker.BreakerTypeReadOnly.Reference !== requiredSurgeProtectionMCBReference\r\n })\r\n\r\n isCorrectDevicePresentAtRequiredPosition = this.state.board.ProjectBoardBreakerCollection.some(boardBreaker => {\r\n return boardBreaker.RowIndex === 0 && boardBreaker.PoleIndex === SPDDetails.SpaceUsed && boardBreaker.BreakerTypeReadOnly.Reference === requiredSurgeProtectionMCBReference\r\n })\r\n\r\n if (!isDifferentDevicePresentAtRequiredPosition && !isCorrectDevicePresentAtRequiredPosition) {\r\n canAddDeviceToPosition = canAddDeviceToBoardPosition(SPDDetails.SpaceUsed, 0, SPDDetails.SpaceUsed, false, this.state.board, this.state.boardDetails, this.props.boardOptionData, false, null, null, null, false, true)\r\n console.log('canAddDeviceToPosition', canAddDeviceToPosition)\r\n }\r\n }\r\n\r\n console.log('isCorrectMCBPresentAtRequiredPosition', isCorrectMCBPresentAtRequiredPosition)\r\n console.log('isDifferentDevicePresentAtRequiredPosition', isDifferentDevicePresentAtRequiredPosition)\r\n\r\n if (!isCorrectMCBPresentAtRequiredPosition) {\r\n if (isDifferentDevicePresentAtRequiredPosition) {\r\n // This is probably the case when the mandatory MCB was removed and another breaker was added or\r\n // The board was edited to add surge protection and another breaker was already there\r\n // This could be handled in many different ways, will this occur often? It's hard to say, so as for now let's handle\r\n // it with a nice alert, not our error message for now due to importance of the issue and action required from the user \r\n window.alert('The board requires a mandatory MCB with reference ' + requiredSurgeProtectionMCBReference + ' on the right side of the Surge protection, but another device was found. Please remove existing device on the right side of the Surge protection and save the board again to fix this issue.')\r\n\r\n this.setState({ isLoading: false, isExistingBoard: true })\r\n this.closeModal()\r\n } else {\r\n // Here we know that we need a specific MCB on the right of the surge protection and that the space is empty\r\n // So let's add that breaker to that specific position\r\n\r\n if (!canAddDeviceToPosition) {\r\n window.alert('The board requires a mandatory MCB with reference ' + requiredSurgeProtectionMCBReference + ' on the right side of the Surge protection, but not enough space was found to place it. Please remove or move any existing devices on the right side of the Surge protection and save the board again to fix this issue.')\r\n\r\n this.setState({ isLoading: false, isExistingBoard: true })\r\n this.closeModal()\r\n } else {\r\n // 1. Find breaker by it's reference\r\n const foundBreakerData = this.props.breakerOptionData.find(breakerOption => breakerOption.Reference === requiredSurgeProtectionMCBReference)\r\n console.log('We found the data of the breaker to add', foundBreakerData)\r\n\r\n // 2. Save breaker directly to the board, as for not don't add it to the library\r\n apiCallsResidential.apiSaveBreakerToChassis(this.props.projectID, this.state.board.ItemID, 0, foundBreakerData.ItemID, 0, SPDDetails.SpaceUsed)\r\n .then(() => {\r\n this.setState({ isLoading: false, isExistingBoard: true })\r\n this.closeModal()\r\n })\r\n .catch(error => {\r\n this.setState({ isLoading: false })\r\n window.alert(`There was an error saving the board: ${error.message}`)\r\n })\r\n }\r\n }\r\n } else {\r\n this.setState({ isLoading: false, isExistingBoard: true })\r\n this.closeModal()\r\n }\r\n } else {\r\n this.setState({ isLoading: false, isExistingBoard: true })\r\n this.closeModal()\r\n }\r\n\r\n if (!this.state.isExistingBoard) {\r\n analyticsDataLayer.addBoard({\r\n \"item_board_name\": boardData.Name,\r\n \"item_board_id\": boardData.ItemID.toString(),\r\n \"configuration_name\": boardData.Name,\r\n \"configuration_id\": boardData.ItemID.toString(), \r\n \"project_name\": this.props.projectName,\r\n \"project_id\": this.props.projectID.toString(),\r\n \"project_type\": 'Residential',\r\n \"funnel_step\": '3',\r\n \"funnel_total_steps\": '3'\r\n })\r\n }\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ isLoading: false })\r\n window.alert(`There was an error saving the board: ${error.message}`)\r\n })\r\n }\r\n\r\n checkIfInStock = (availabilityItem) => {\r\n if (!availabilityItem?.IsInStock) {\r\n this.setState({\r\n validationMessage: `${availabilityItem.Description} is out of stock. Please, contact au.estimating@se.com`,\r\n outOfStock: true\r\n })\r\n return false\r\n } else if (availabilityItem?.IsLowStock) {\r\n this.setState({\r\n validationMessage: `Low stock, longer lead times may apply`,\r\n outOfStock: false\r\n })\r\n return true\r\n } else {\r\n this.setState({\r\n validationMessage: '',\r\n outOfStock: false\r\n })\r\n return true\r\n }\r\n }\r\n\r\n // Handle switching of the steps in the UI, this is a very specific manual division\r\n canGoNextStep = () => {\r\n let canGoNextStep = false\r\n\r\n if (this.state.currentStep === 1) {\r\n if ((this.state.boardDetails.EnclosureType === 'Surface Mount' && this.state.boardDetails.PolesNeeded !== '') ||\r\n (this.state.boardDetails.EnclosureType === 'Flush Mount' && this.state.boardDetails.PolesNeeded !== '' && this.state.boardDetails.MetalBlackPlate !== null)\r\n ) {\r\n let isFormValid = true\r\n let enclousureReference = null\r\n this.props.boardOptionData.Enclosures.forEach(boardOption => {\r\n if (boardOption.EnclosureType === this.state.boardDetails.EnclosureType && boardOption.PolesNeeded === this.state.boardDetails.PolesNeeded) {\r\n console.log('enclousureReference boardOption', boardOption)\r\n enclousureReference = boardOption.Reference\r\n }\r\n })\r\n let availabilityEnclousureReference = this.props.residentialAllPartsAvailable.find(part => part.ItemCode === enclousureReference)\r\n isFormValid = this.checkIfInStock(availabilityEnclousureReference)\r\n\r\n let metalBlackPlateID = null\r\n if (this.state.boardDetails.MetalBlackPlate === true) {\r\n this.props.boardOptionData.Enclosures.forEach(boardOption => {\r\n const currentSelectionRows = getNumberOfRowsFromPolesString(this.state.boardDetails.PolesNeeded)\r\n if (boardOption.EnclosureType === 'Flush Mount Enclosure - Metal back plate' && boardOption.NumberOfRows === currentSelectionRows) {\r\n console.log('Black metal boardOption', boardOption)\r\n metalBlackPlateID = boardOption.Reference\r\n }\r\n })\r\n if (metalBlackPlateID === null) {\r\n window.alert('Could not find reference number for the selected metal black plate, please assure all options were selected.')\r\n return\r\n }\r\n }\r\n\r\n if (metalBlackPlateID) {\r\n let availabilityMetalBlackPlate = this.props.residentialAllPartsAvailable.find(part => part.ItemCode === metalBlackPlateID)\r\n isFormValid = this.checkIfInStock(availabilityMetalBlackPlate)\r\n }\r\n\r\n canGoNextStep = isFormValid\r\n }\r\n } else if (this.state.currentStep === 2) {\r\n if (this.state.boardDetails.MainSwitchRating !== '') {\r\n\r\n // Get main Switch reference\r\n let mainSwitchReference = null\r\n for (let index = 0; index < this.props.boardOptionData.MainSwitches.length; index++) {\r\n const boardOption = this.props.boardOptionData.MainSwitches[index];\r\n if (boardOption.CurrentRating === this.state.boardDetails.MainSwitchRating &&\r\n boardOption.IncomerPhase === this.state.boardDetails.IncomerPhase &&\r\n boardOption.SwitchType === this.state.boardDetails.MainSwitchType) {\r\n if (!!this.state.boardDetails.CircuitBreaker) {\r\n if (boardOption.Rating === this.state.boardDetails.CircuitBreaker) {\r\n mainSwitchReference = boardOption.Reference\r\n break\r\n }\r\n } else {\r\n mainSwitchReference = boardOption.Reference\r\n break\r\n }\r\n }\r\n }\r\n let availability = this.props.residentialAllPartsAvailable.find(part => part.ItemCode === mainSwitchReference)\r\n let isFormValid = this.checkIfInStock(availability)\r\n\r\n canGoNextStep = isFormValid\r\n }\r\n } else if (this.state.currentStep === 3) {\r\n if (this.state.boardDetails.SurgeProtection === false ||\r\n (this.state.boardDetails.SurgeProtection === true && this.state.boardDetails.MaxDischargeCapacity !== '') ||\r\n (this.state.boardDetails.SurgeProtection === true && this.state.boardDetails.IncomerPhase === '2 Phase')) {\r\n\r\n const SPDDetails = this.getSPDDetails(this.state.boardDetails.MaxDischargeCapacity, this.state.boardDetails.IncomerPhase)\r\n let isFormValid = true\r\n if (SPDDetails?.Reference) {\r\n let availability = this.props.residentialAllPartsAvailable.find(part => part.ItemCode === SPDDetails?.Reference)\r\n if (availability) {\r\n isFormValid = this.checkIfInStock(availability)\r\n }\r\n }\r\n\r\n canGoNextStep = isFormValid\r\n }\r\n }\r\n\r\n return canGoNextStep\r\n }\r\n\r\n renderModalHeader = () => {\r\n let progress = this.state.currentStep * 33.33\r\n if (this.state.isExistingBoard) {\r\n progress = 100\r\n }\r\n\r\n const isNotAllowedToGoStep2 = (this.state.currentStep === 1 && !this.state.isExistingBoard && !this.state.canGoNextStep)\r\n const isNotAllowedToGoStep3 = (this.state.currentStep === 2 && !this.state.canGoNextStep) || (this.state.currentStep < 2 && !this.state.isExistingBoard)\r\n\r\n return (\r\n
    \r\n \r\n

    \r\n {this.state.isExistingBoard && Edit board}\r\n {!this.state.isExistingBoard && Add a board}\r\n

    \r\n
    \r\n
    { this.goStep(1) }}>\r\n 1\r\n Set-Up\r\n
    \r\n
    2 || this.state.isExistingBoard ? ' is-done' : '') +\r\n (isNotAllowedToGoStep2 ? ' not-allowed' : '')\r\n } onClick={() => { if (!isNotAllowedToGoStep2) this.goStep(2) }}>\r\n 2\r\n Main Incomer\r\n
    \r\n
    3 || this.state.isExistingBoard ? ' is-done' : '') +\r\n (isNotAllowedToGoStep3 ? ' not-allowed' : '')\r\n } onClick={() => { if (!isNotAllowedToGoStep3) this.goStep(3) }}>\r\n 3\r\n Extras\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n renderModalFooter = () => {\r\n return (\r\n
    \r\n {\r\n this.state.currentStep > 1 &&\r\n \r\n }\r\n\r\n {\r\n (!this.state.isExistingBoard && this.state.currentStep === 1) &&\r\n \r\n }\r\n\r\n {\r\n !this.state.isExistingBoard && this.state.currentStep !== 3 && this.state.currentStep !== 1 &&\r\n \r\n }\r\n\r\n {\r\n this.state.isExistingBoard && this.state.currentStep !== 3 &&\r\n \r\n }\r\n\r\n {\r\n this.state.isExistingBoard && this.state.currentStep < 3 &&\r\n \r\n }\r\n\r\n {/* This is only showing on last step */}\r\n {\r\n this.state.currentStep === 3 &&\r\n \r\n }\r\n
    \r\n )\r\n }\r\n\r\n goStepBack = () => {\r\n this.setState({\r\n currentStep: this.state.currentStep - 1,\r\n hasUsedBackButton: true\r\n }, () => this.setState({ canGoNextStep: this.canGoNextStep() }))\r\n }\r\n\r\n goNextStep = () => {\r\n this.setState({\r\n currentStep: this.state.currentStep + 1,\r\n validationMessage: ''\r\n }, () => this.setState({ canGoNextStep: this.canGoNextStep() }))\r\n\r\n if (!this.state.currentStepStatus[this.state.currentStep]) {\r\n analyticsDataLayer.addBoard({\r\n \"item_board_name\": '',\r\n \"item_board_id\": '',\r\n \"configuration_name\": '',\r\n \"configuration_id\": '', \r\n \"project_name\": this.props.projectName,\r\n \"project_id\": this.props.projectID.toString(),\r\n \"project_type\": 'Residential',\r\n \"funnel_step\": this.state.currentStep,\r\n \"funnel_total_steps\": '3'\r\n })\r\n }\r\n\r\n this.setState({\r\n currentStepStatus: {\r\n ...this.state.currentStepStatus,\r\n [this.state.currentStep]: true\r\n }\r\n })\r\n }\r\n\r\n goStep = (stepNumber) => {\r\n if (this.state.isExistingBoard || (!this.state.isExistingBoard && stepNumber !== 3)) {\r\n this.setState({\r\n currentStep: stepNumber\r\n }, () => this.setState({ canGoNextStep: this.canGoNextStep() }))\r\n }\r\n }\r\n\r\n closeModal = () => {\r\n jQuery('body').removeClass('modal-is-open')\r\n\r\n if (this.props.closeCallback !== undefined) {\r\n this.props.closeCallback(this.state.board)\r\n }\r\n }\r\n\r\n getCircuitBreakerEnabledOptions = () => {\r\n if (this.state.boardDetails.IncomerPhase === 'Single Phase') {\r\n return ['4.5kA', '6kA']\r\n } else {\r\n return ['6kA']\r\n }\r\n }\r\n\r\n getMetalBlackPlateEnabledOptions = () => {\r\n const polesSelected = getNumberOfPolesFromStringExpression(this.state.boardDetails.PolesNeeded)\r\n if (polesSelected === 15) {\r\n return [true, false]\r\n } else {\r\n return [false]\r\n }\r\n }\r\n\r\n getMainSwitchRatingEnabledOptions = () => {\r\n if (this.state.boardDetails.MainSwitchType === 'Circuit breaker') {\r\n return ['40A', '50A', '63A']\r\n } else if (this.state.boardDetails.MainSwitchType === 'Switch Isolator') {\r\n if (this.state.boardDetails.IncomerPhase === 'Single Phase') {\r\n return ['80A', '100A']\r\n } else {\r\n return ['100A']\r\n }\r\n }\r\n }\r\n\r\n getSurgeProtectionEnabledOptions = () => {\r\n if (this.state.boardDetails.IncomerPhase === '2 Phase') {\r\n // You can't select a surge protection for 2 Phases\r\n return [false]\r\n } else {\r\n return [true, false]\r\n }\r\n }\r\n\r\n getMaxDischargeCapacityEnabledOptions = () => {\r\n if (this.state.boardDetails.IncomerPhase === 'Single Phase') {\r\n return ['20kA', '40kA']\r\n } else if (this.state.boardDetails.IncomerPhase === '3 Phase') {\r\n return ['40kA']\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n render() {\r\n const boardOptions = this.props.boardOptions\r\n const boardDetails = this.state.boardDetails\r\n console.warn(boardDetails)\r\n const polesNeededEnabled = boardDetails.EnclosureType !== ''\r\n const polesNeededSelected = boardDetails.PolesNeeded !== ''\r\n\r\n return (\r\n
    \r\n {\r\n this.state.isLoading &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n {\r\n this.state.isExistingBoard ?\r\n Updating\r\n :\r\n \r\n {this.state.currentStep === 5 ? 'Adding board' : 'Saving'}\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n {this.renderModalHeader()}\r\n\r\n
    \r\n {/* Step 1 */}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n this.optionSelectedCall(event.target.value, 'Name')\r\n }}\r\n maxLength=\"128\"\r\n placeholder=\"Type the board name\"\r\n value={boardDetails.Name}\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n this.optionSelectedCall(value, 'EnclosureType')\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* This is a very unique design, so we are not making it as a reusable component */}\r\n
    \r\n

    \r\n
    \r\n \r\n
    \r\n Poles Needed\r\n

    \r\n
    \r\n

    \r\n 1 row\r\n

    \r\n
    \r\n
    \r\n { this.optionSelectedCall('8', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '8'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('11', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '11'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('12', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '12'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('15', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '15'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('17', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '17'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('18', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '18'} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n 2 rows\r\n

    \r\n
    \r\n
    \r\n { this.optionSelectedCall('12x2', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '12x2'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('15x2', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '15x2'} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n 3 rows\r\n

    \r\n
    \r\n
    \r\n { this.optionSelectedCall('12x3', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '12x3'} />\r\n \r\n
    \r\n
    \r\n { this.optionSelectedCall('15x3', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '15x3'} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n 4 rows\r\n

    \r\n
    \r\n
    \r\n { this.optionSelectedCall('15x4', 'PolesNeeded') }} checked={boardDetails.PolesNeeded === '15x4'} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n {\r\n this.optionSelectedCall(value, 'MetalBlackPlate')\r\n }}\r\n enabledOptions={this.getMetalBlackPlateEnabledOptions()}\r\n />\r\n
    \r\n
    \r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n
    \r\n {/* END Step 1 */}\r\n\r\n {/* Step 2 */}\r\n
    \r\n
    \r\n
    \r\n {\r\n this.optionSelectedCall(value, 'IncomerPhase')\r\n }}\r\n />\r\n
    \r\n
    \r\n {\r\n this.optionSelectedCall(value, 'MainSwitchType')\r\n }}\r\n />\r\n
    \r\n\r\n
    \r\n {\r\n this.optionSelectedCall(value, 'CircuitBreaker')\r\n }}\r\n enabledOptions={this.getCircuitBreakerEnabledOptions()}\r\n />\r\n
    \r\n\r\n
    \r\n {\r\n this.optionSelectedCall(value, 'MainSwitchRating')\r\n }}\r\n enabledOptions={this.getMainSwitchRatingEnabledOptions()}\r\n />\r\n
    \r\n
    \r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n
    \r\n {/* END Step 2 */}\r\n\r\n {/* Step 3 */}\r\n
    \r\n
    \r\n
    \r\n {\r\n this.optionSelectedCall(value, 'SurgeProtection')\r\n }}\r\n enabledOptions={this.getSurgeProtectionEnabledOptions()}\r\n />\r\n
    \r\n\r\n
    \r\n {\r\n this.optionSelectedCall(value, 'MaxDischargeCapacity')\r\n }}\r\n enabledOptions={this.getMaxDischargeCapacityEnabledOptions()}\r\n />\r\n
    \r\n
    \r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n
    \r\n {/* END Step 3 */}\r\n
    \r\n\r\n {this.renderModalFooter()}\r\n
    \r\n
    \r\n )\r\n }\r\n}","import React from 'react'\r\nimport { isNullOrUndefined, drawPercentProgressBars } from './../../../utils/helpers'\r\nimport { apiUrlGetDocument } from './../../../utils/apiCallsResidential'\r\nimport { debounce } from 'lodash'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\n\r\nexport default class BoardTile extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.editCall = this.editCall.bind(this)\r\n this.showBoardDetails = this.showBoardDetails.bind(this)\r\n this.copyCall = this.copyCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n\r\n this.state = {\r\n isLoading: false,\r\n quantity: this.props.quantity\r\n }\r\n }\r\n\r\n editCall() {\r\n if (this.props.isValid) {\r\n this.props.editCallback(this.props.id)\r\n }\r\n }\r\n\r\n showBoardDetails() {\r\n this.props.showBoardDetailsCallback(this.props.boardBreakers)\r\n }\r\n\r\n copyCall() {\r\n if (!this.props.maxBoardLimitReached && this.props.isValid) {\r\n this.props.copyCallback(this.props.id)\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.props.deleteCallback(this.props.id)\r\n }\r\n\r\n componentDidMount() {\r\n window.setTimeout(() => {\r\n this.drawPercent()\r\n }, 1000)\r\n }\r\n\r\n configureBoard(projectID, boardID) {\r\n this.props.configureChassisCallback(projectID, boardID)\r\n }\r\n\r\n drawPercent() {\r\n drawPercentProgressBars()\r\n }\r\n\r\n changeQuantity(updatedQuantity) {\r\n /* \r\n There is no specific limit for the amount of boards that can be ordered, but ordering more than 999 doesn't seem realistic for residential boards\r\n Let's put some limit to prevent user specifying ridiculously high numbers. Ordering mora than 999 residential boards would mean\r\n that someone is trying to buy boards for a reasonable big neighborhood, honestly in that case they would probably not use this online tool\r\n It's good to have a limit instead of solving bugs where user tries to order a milion of residential boards and QA reporting isses\r\n We also limit it to 999 so we don't break existing UI, where you can't see more than 3 digits.\r\n Anyway, future developer don't get frustrated I left you enough comments everywhere and this projects had really good documentation\r\n Have a great day and stay positive! \r\n */\r\n const updatedQuantityAsNumber = parseInt(updatedQuantity, 10)\r\n if (updatedQuantityAsNumber > 0 && !this.props.isUpdatingBoardQuantity) {\r\n if (updatedQuantityAsNumber < 999) {\r\n if (!this.props.isUpdatingBoardQuantity) {\r\n this.setState({ quantity: updatedQuantityAsNumber }, () => this.quantityServerUpdate())\r\n this.props.updateBoardQuantityCallback(this.props.id, updatedQuantityAsNumber, false)\r\n }\r\n } else {\r\n this.setState({ quantity: 999 }, () => this.quantityServerUpdate())\r\n this.props.updateBoardQuantityCallback(this.props.id, 999, false)\r\n }\r\n }\r\n }\r\n\r\n decreaseQuantity() {\r\n if (this.state.quantity > 1) {\r\n if (!this.props.isUpdatingBoardQuantity) {\r\n this.setState({ quantity: this.state.quantity - 1 }, () => this.quantityServerUpdate())\r\n this.props.updateBoardQuantityCallback(this.props.id, this.state.quantity - 1, false)\r\n }\r\n }\r\n }\r\n\r\n increaseQuantity() {\r\n if (!this.props.isUpdatingBoardQuantity) {\r\n if (this.state.quantity < 999) {\r\n this.setState({ quantity: this.state.quantity + 1 })\r\n this.props.updateBoardQuantityCallback(this.props.id, this.state.quantity + 1, false)\r\n this.quantityServerUpdate()\r\n }\r\n }\r\n }\r\n\r\n quantityServerUpdate = debounce(() => {\r\n this.props.updateBoardQuantityCallback(this.props.id, this.state.quantity, true)\r\n console.log('Debounced quantity, should save new quantity: ' + this.state.quantity)\r\n }, 2000)\r\n\r\n renderPercent(title, value, index) {\r\n if (isNullOrUndefined(value)) {\r\n return ''\r\n } else {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    \r\n {title}\r\n

    \r\n
    \r\n
    \r\n )\r\n }\r\n }\r\n\r\n renderProjectBoardModals = (boardDescription = []) => {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n {boardDescription.map((boardDescription, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
    QtyItem
    {boardDescription.Quantity} {boardDescription.Description}
    \r\n
    \r\n )\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (this.props.precentComplete !== nextProps.precentComplete) {\r\n window.setTimeout(() => {\r\n this.drawPercent()\r\n }, 1000)\r\n }\r\n }\r\n\r\n async downloadDrawing(drawingGuid) {\r\n const downloadURL = `${apiUrlGetDocument}/${drawingGuid}`\r\n const token = localStorage.getItem('token')\r\n const response = await fetch(downloadURL, {\r\n headers: {\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n })\r\n const blob = await response.blob()\r\n const url = window.URL.createObjectURL(blob)\r\n\r\n let contentDisposition = response.headers.get('Content-Disposition')\r\n // Remove all quotes \" from the contentDisposition, as some .NET behaviour adds them \r\n // it's because of the special characters \"(\" and \")\" in case of the project names with brackets\r\n contentDisposition = contentDisposition.replace(/\"/g, '')\r\n let filename = 'download.pdf'\r\n if (contentDisposition && contentDisposition.includes('attachment')) {\r\n const matches = /filename=([^;]+)/.exec(contentDisposition)\r\n if (matches && matches[1]) {\r\n filename = matches[1]\r\n }\r\n }\r\n\r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = filename\r\n a.click()\r\n window.URL.revokeObjectURL(url)\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n {/* Add .is-error to put it in an error state */}\r\n
    \r\n

    \r\n {!this.props.isValid && '[DATA CORRUPTED] - '} {this.props.name}\r\n

    \r\n
    \r\n {this.renderPercent('Quantity', this.props.isValid ? this.props.precentComplete : null, 1)}\r\n
    \r\n\r\n
    \r\n {\r\n !this.props.isFinalised &&\r\n \r\n }\r\n\r\n
    \r\n
    \r\n { this.changeQuantity(event.target.value) }}\r\n className=\"form__input input\" type=\"number\" disabled={this.props.isUpdatingBoardQuantity} readOnly={this.props.isFinalised} />\r\n
    \r\n
    \r\n\r\n {\r\n !this.props.isFinalised &&\r\n \r\n }\r\n
    \r\n\r\n
    \r\n {!this.props.isFinalised &&\r\n \r\n {\r\n !this.props.maxBoardLimitReached &&\r\n \r\n }\r\n \r\n \r\n }\r\n
    \r\n
    \r\n {!this.props.isFinalised &&\r\n \r\n \r\n \r\n \r\n }\r\n\r\n {this.props.isFinalised &&\r\n \r\n \r\n\r\n {\r\n this.props.drawingGuid ?\r\n \r\n :\r\n \r\n }\r\n \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n )\r\n\r\n }\r\n}\r\n","import React from 'react'\r\nimport BoardTile from './BoardTile'\r\nimport { isNullOrUndefined } from './../../../utils/helpers'\r\n\r\nexport default class BoardList extends React.Component {\r\n constructor(props) { \r\n super(props)\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n { this.props.boards.map(item => {\r\n let drawingG = null;\r\n if (this.props.isFinalised && !this.props.loadingDrawings) {\r\n const drawingObj = this.props.boardDrawings.find(drawItem => drawItem.ProjectBoardID === item.ItemID);\r\n if (drawingObj) {\r\n drawingG = drawingObj.ItemGUID;\r\n }\r\n }\r\n // Create the list of breaker details\r\n let boardDescription = [];\r\n if (!item.hasOwnProperty('BoardBOMComponents') || !item.BoardBOMComponents.length) {\r\n item.ProjectBoardBreakerCollection.forEach(item => {\r\n const desc = item.BreakerTypeReadOnly.DrawingDesc;\r\n const inArray = boardDescription.find(item => item.Description === desc);\r\n if (inArray) {\r\n boardDescription = boardDescription.map(item => {\r\n if (item.Description === desc) {\r\n item.Quantity = item.Quantity + 1;\r\n }\r\n return item;\r\n });\r\n } else {\r\n boardDescription.push({\r\n Quantity: 1,\r\n Description: desc,\r\n StockAvailability: 'N/A'\r\n });\r\n }\r\n });\r\n } else {\r\n boardDescription = [...item.BoardBOMComponents];\r\n }\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
    \r\n );\r\n }\r\n}\r\n","import React from 'react'\r\nimport { Link, withRouter } from 'react-router-dom'\r\nimport Header from '../../../components/header/Header'\r\nimport { getUrlParameter, isNullOrUndefined } from '../../../utils/helpers'\r\nimport GlobalOverlay from '../../../components/global-overlay/GlobalOverlay'\r\nimport commonFunctionsService from '../../../services/CommonFunctionsService'\r\nimport Modal from '../../../components/modal/Modal'\r\nimport BoardDetailsResidential from './BoardDetails'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport BoardList from './BoardList'\r\nimport { apiCallsCommercial } from '../../../utils/apiCallsCommercial'\r\nimport { apiCallsResidential } from '../../../utils/apiCallsResidential'\r\nimport BoardService from '../../../services/BoardService'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\n\r\nconst { CONST } = require('./../../../CONST')\r\n\r\nclass ProjectDetailsResidential extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.deleteBreakerFromBoard = this.deleteBreakerFromBoard.bind(this)\r\n\r\n this.state = {\r\n projectID: '',\r\n project: {},\r\n userData: {},\r\n loadingDrawings: false,\r\n orderSummaryId: null,\r\n currentBoard: null,\r\n boardDrawings: [],\r\n boardOptionData: null,\r\n breakerOptionData: [],\r\n boardOptions: {},\r\n apiErrorMessage: '',\r\n isLoading: true,\r\n apiError: false,\r\n apiMessage: 'Loading page',\r\n isChangingProjectTitle: false,\r\n hasSubmittedNewProjectTitle: false,\r\n newProjectTitle: '',\r\n isRequestingNewProjectTitleChange: false,\r\n changingTitleApiErrorMessage: false,\r\n isConfiguringBoard: false,\r\n isDuplicatingBoard: false,\r\n hasDuplicatedBoard: false,\r\n isDeletingBoard: false,\r\n toDeleteBoardId: null,\r\n pageError: '',\r\n wholesalerBranchID: 0,\r\n showBoardDetails: false,\r\n selectedBoardDescription: [],\r\n isCommercial: false,\r\n isUpdatingBoardQuantity: false,\r\n residentialAllPartsAvailable: []\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({ projectID: getUrlParameter('orderID') }, () => {\r\n this.initialize()\r\n })\r\n }\r\n\r\n initialize() {\r\n apiCallsResidential.apiGetProject(this.state.projectID)\r\n .then(projectData => {\r\n this.setState({\r\n project: projectData,\r\n newProjectTitle: projectData.Title\r\n })\r\n\r\n // On a finalised project we need to get drawing links and order summary info\r\n if (projectData.IsFinalised) {\r\n this.setState({ loadingDrawings: true })\r\n\r\n apiCallsResidential.apiGetLayoutDiagrams(this.state.projectID)\r\n .then(response => {\r\n // Split the response into distinct results\r\n const orderSummaryArray = response.ProjectFileCollection.filter(x => x.ProjectBoardID === -1)\r\n const drawingsArray = response.ProjectFileCollection.filter(x => x.ProjectBoardID !== -1)\r\n\r\n if (orderSummaryArray.length > 0) {\r\n this.setState({ orderSummaryId: orderSummaryArray[0].ItemGUID })\r\n }\r\n\r\n this.setState({\r\n boardDrawings: drawingsArray,\r\n loadingDrawings: false\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({\r\n apiErrorMessage: error.message,\r\n loadingDrawings: false\r\n })\r\n })\r\n }\r\n\r\n return apiCallsResidential.apiGetBreakerOptions()\r\n })\r\n .then(breakerTypeData => {\r\n this.setState({ breakerOptionData: breakerTypeData })\r\n\r\n // Load the board options after the project has been loaded\r\n return apiCallsResidential.apiGetBoardOption()\r\n })\r\n .then(boardOptionData => {\r\n this.setState({ boardOptionData: boardOptionData }, () => this.updateProjectBoardCompletions())\r\n\r\n return apiCallsResidential.apiGetBoardOptionLabels()\r\n })\r\n .then(boardOptionLabels => {\r\n this.setState({ boardOptions: boardOptionLabels })\r\n\r\n // If the user opens a project and there are no boards, then open the modal\r\n if (this.state.project.ProjectBoards.length === 0) {\r\n // Add some visual deleay to improve UX, without it it's just too fast and confusing\r\n window.setTimeout(() => {\r\n this.startConfiguringBoard()\r\n }, 500)\r\n }\r\n\r\n return apiCallsCommercial.apiUserSettings()\r\n })\r\n .then(userData => {\r\n\r\n this.setState({\r\n userData: userData,\r\n wholesalerBranchID: userData.PreferredWholesaler1ItemID\r\n }, () => {\r\n let shouldTriggerNewBoardCreation = getUrlParameter('newBoard')\r\n if (shouldTriggerNewBoardCreation !== '') {\r\n this.startConfiguringBoard()\r\n }\r\n })\r\n return apiCallsResidential.apiGetAllParts()\r\n })\r\n .then(allParts => {\r\n this.setState({\r\n residentialAllPartsAvailable: allParts,\r\n isLoading: false\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiErrorMessage: error.message })\r\n })\r\n }\r\n\r\n updateProjectBoardCompletions() {\r\n const updatedProjectBoards = this.state.project.ProjectBoards.map(board => {\r\n const boardDetails = BoardService.getDetails(this.state.boardOptionData, board.EnclosureID, board.MainSwitchID, board.SPDID, board.MetalBlackPlateID)\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(board, boardDetails)\r\n\r\n board.completionDetails = boardCompletionDetails\r\n\r\n return board\r\n })\r\n\r\n const updatedProject = cloneDeep(this.state.project)\r\n updatedProject.ProjectBoards = updatedProjectBoards\r\n\r\n this.setState({ project: updatedProject })\r\n }\r\n\r\n startConfiguringBoard = (boardID) => {\r\n if (boardID === undefined) {\r\n if (this.hasMaxBoardLimitBeenReached()) {\r\n this.setState({ pageError: 'You have reached the maximum number of boards per project and cannot ADD or COPY anymore.' })\r\n } else if (this.state.project.IsFinalised) {\r\n this.setState({ pageError: 'The order has alredy been sent and the project can no longer be modified.' })\r\n } else {\r\n this.setState({ isConfiguringBoard: true, currentBoard: null })\r\n }\r\n\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n } else {\r\n const boardToEdit = this.state.project.ProjectBoards.find(board => board.ItemID === boardID)\r\n this.setState({ isConfiguringBoard: true, currentBoard: boardToEdit })\r\n }\r\n }\r\n\r\n stopConfiguringBoard = (board) => {\r\n this.setState({ isConfiguringBoard: false, currentBoard: null })\r\n\r\n if (!isNullOrUndefined(board)) {\r\n // Modal sucessfually create or updated a board, add it to the project states or update existing one\r\n const indexOfExistingBoard = this.state.project.ProjectBoards.findIndex(projectBoard => projectBoard.ItemGUID === board.ItemGUID)\r\n\r\n if (indexOfExistingBoard > -1) {\r\n this.state.project.ProjectBoards[indexOfExistingBoard] = board\r\n } else {\r\n this.state.project.ProjectBoards.push(board)\r\n }\r\n\r\n this.updateProjectBoardCompletions()\r\n this.forceUpdate()\r\n }\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n copyBoard = (boardId) => {\r\n this.setState({ isDuplicatingBoard: true })\r\n\r\n apiCallsResidential.apiCopyBoard(this.state.project.ItemID, boardId)\r\n .then(projectData => {\r\n this.setState({\r\n project: projectData\r\n })\r\n\r\n this.setState({ isDuplicatingBoard: false, hasDuplicatedBoard: true })\r\n window.setTimeout(() => { this.setState({ hasDuplicatedBoard: false }) }, 1500)\r\n })\r\n .catch(error => {\r\n this.setState({ isDuplicatingBoard: false })\r\n alert(`There was an error copying the board: ${error.message}`)\r\n })\r\n }\r\n\r\n updateBoardQuantity = (boardId, newQuantity, isApiCall) => {\r\n const updatedBoard = this.state.project.ProjectBoards.find(board => board.ItemID === boardId)\r\n updatedBoard.Quantity = newQuantity\r\n\r\n const updatedProject = cloneDeep(this.state.project)\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex(board => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n if (isApiCall) {\r\n this.setState({ isUpdatingBoardQuantity: true })\r\n\r\n apiCallsResidential.apiSaveBoard(updatedBoard).then(() => {\r\n this.setState({ project: updatedProject })\r\n this.setState({ isUpdatingBoardQuantity: false })\r\n })\r\n } else {\r\n this.setState({ project: updatedProject })\r\n }\r\n }\r\n\r\n toDeleteBoard = (boardId) => {\r\n this.setState({ isDeletingBoard: true, toDeleteBoardId: boardId })\r\n }\r\n\r\n deleteBoardRequest() {\r\n this.setState({ isRequestingBoardDeletion: true })\r\n\r\n this.stopDeletingBoard()\r\n\r\n apiCallsResidential.apiDeleteBoard(this.state.projectID, this.state.toDeleteBoardId)\r\n .then(updatedProject => {\r\n this.setState({\r\n project: updatedProject,\r\n toDeleteBoardId: null,\r\n isRequestingBoardDeletion: false\r\n }, () => this.updateProjectBoardCompletions())\r\n })\r\n .catch(error => alert(error.message))\r\n }\r\n\r\n startChangingProjectTitle = () => {\r\n this.setState({ isChangingProjectTitle: true })\r\n }\r\n\r\n stopChangingProjectTitle = () => {\r\n this.setState({ isChangingProjectTitle: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n stopDeletingBoard = () => {\r\n this.setState({ isDeletingBoard: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n changeProjectTitle = () => {\r\n this.setState({ hasSubmittedNewProject: true })\r\n\r\n if (this.state.newProjectTitle !== '') {\r\n this.setState({\r\n changingTitleApiErrorMessage: '',\r\n isRequestingNewProjectTitleChange: true\r\n })\r\n\r\n let projectData = cloneDeep(this.state.project)\r\n projectData.Title = this.state.newProjectTitle\r\n\r\n apiCallsResidential.apiSetProjectTitle(projectData)\r\n .then(response => {\r\n // At this point we can read ItemGUID from the response and redirect user to that page\r\n this.setState({\r\n hasSubmittedNewProjectTitle: true,\r\n isRequestingNewProjectTitleChange: false,\r\n project: response\r\n }, () => {\r\n this.stopChangingProjectTitle()\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({\r\n changingTitleApiErrorMessage: error,\r\n isRequestingNewProjectTitleChange: false\r\n })\r\n })\r\n\r\n }\r\n }\r\n\r\n deleteBreakerFromBoard(rowIndex, poleIndex, boardBreakerId, boardID) {\r\n const indexOfTheCurrentProjectBoard = this.state.project.ProjectBoards.findIndex(board => board.ItemID === boardID)\r\n const selectedBoard = this.state.project.ProjectBoards[indexOfTheCurrentProjectBoard]\r\n const selectedBoardBreaker = selectedBoard.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === boardBreakerId)\r\n\r\n apiCallsResidential.apiSaveBreakerToChassis(this.state.projectID, boardID, boardBreakerId, selectedBoardBreaker.BreakerTypeItemID, rowIndex, poleIndex, true)\r\n .then(() => {\r\n const updatedBreakers = selectedBoard.ProjectBoardBreakerCollection.filter(item => item.ItemID !== boardBreakerId)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(selectedBoard)\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject })\r\n })\r\n }\r\n\r\n handelChange = (name, value) => {\r\n this.setState({ ['' + name]: value })\r\n }\r\n\r\n hasMaxBoardLimitBeenReached() {\r\n // Function to check if the user has reached max board limit or not\r\n // App should not let user copy or add boards if they are at the limit.\r\n // Hardcode the max board limit if its not returned from the API\r\n const boardLimit = this.state.project.MaxBoardLimit ? this.state.project.MaxBoardLimit : 8\r\n return (this.state.project.ProjectBoards.length >= boardLimit)\r\n }\r\n\r\n configureChassis = (projectID, boardID) => {\r\n this.props.history.push(CONST.PAGES.CONFIGURE_CHASSIS_RESIDENTIAL + '?projectID=' + projectID + '&boardID=' + boardID)\r\n }\r\n\r\n areEnoughBoardsToGenerateQuote = () => {\r\n let totalUserBoardsQuantity = 0\r\n this.state.project.ProjectBoards.map(board => {\r\n totalUserBoardsQuantity = totalUserBoardsQuantity + board.Quantity\r\n })\r\n\r\n return totalUserBoardsQuantity >= CONST.MINIMUM_RESIDENTIAL_BOARD_QUANTITY ? true : false\r\n }\r\n\r\n isEnoughFilledToGenerateQuote() {\r\n // Let's work with assumption all boards are all enough filled and invalidate this indicator as soon as any board is not enough filled\r\n let areAllProjectBoardsEnoughFilled = true\r\n\r\n if (this.state.boardOptionData !== null) {\r\n this.state.project.ProjectBoards.map(board => {\r\n const boardDetails = BoardService.getDetails(this.state.boardOptionData, board.EnclosureID, board.MainSwitchID, board.SPDID, board.MetalBlackPlateID)\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(board, boardDetails)\r\n\r\n if (!boardCompletionDetails.isEnoughCompletedToSeeTheQuote) areAllProjectBoardsEnoughFilled = false\r\n })\r\n } else {\r\n areAllProjectBoardsEnoughFilled = false\r\n }\r\n\r\n return areAllProjectBoardsEnoughFilled\r\n }\r\n\r\n viewQuote() {\r\n if (this.state.isUpdatingBoardQuantity) return false\r\n // If you don't have any boards...\r\n if (!this.state.project.ProjectBoards || !this.state.project.ProjectBoards.length) {\r\n this.setState({\r\n pageError: 'Your project needs at least one board filled with 4 breakers to generate a quote.',\r\n fillQuoteRequirementError: true\r\n })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n\r\n return false\r\n }\r\n\r\n let areEnoughBoardsToGenerateQuote = this.areEnoughBoardsToGenerateQuote()\r\n if (!areEnoughBoardsToGenerateQuote) {\r\n this.setState({\r\n pageError: 'Board quantity is not enough to generate a quote.',\r\n fillQuoteRequirementError: true\r\n })\r\n return false\r\n }\r\n\r\n // You've got boards but not all of them are filled out to minimum levels...\r\n let noEnoughFilled = !this.isEnoughFilledToGenerateQuote()\r\n if (noEnoughFilled) {\r\n this.setState({\r\n pageError: 'Your project needs all boards filled with at least 4 breakers to generate a quote.',\r\n fillQuoteRequirementError: true\r\n })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n\r\n return false\r\n }\r\n\r\n // If you're a contractor you need a selected wholesaler\r\n if (this.state.userData.UserIsContractor && (this.state.wholesalerBranchID === 0 || this.state.wholesalerBranchID === -1)) {\r\n this.setState({ pageError: 'Current user doesn\\'t have a preferred wholesalers configured.' })\r\n window.setTimeout(() => this.setState({ pageError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // Finally made it through all the hoops, go to the Quote page.\r\n let pageLink = ''\r\n if (this.state.userData.UserIsContractor) {\r\n pageLink += CONST.PAGES.QUOTE_RESIDENTIAL + '?projectID=' + this.state.projectID + '&wholesalerBranchID=' + this.state.wholesalerBranchID\r\n this.props.history.push(pageLink)\r\n } else {\r\n pageLink += CONST.PAGES.QUOTE_RESIDENTIAL + '?projectID=' + this.state.projectID\r\n this.props.history.push(pageLink)\r\n }\r\n\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'View Quote',\r\n cta_link: window.location.hostname + pageLink,\r\n cta_location: 'Project details'\r\n })\r\n }\r\n\r\n renderProjectBoardModals = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.state.selectedBoardDescription.map((boardDescription, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
    QuantityItem
    {boardDescription.Quantity}{boardDescription.Description}
    \r\n )\r\n }\r\n\r\n showBoardDetails = boardDescription => {\r\n this.setState({ selectedBoardDescription: boardDescription, showBoardDetails: true })\r\n }\r\n\r\n hideBoardDetails = () => {\r\n this.setState({ showBoardDetails: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n {\r\n this.state.isLoading &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Loading\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isDuplicatingBoard &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Duplicating Board\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.hasDuplicatedBoard &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Board copied successfully\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isRequestingBoardDeletion &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Deleting Board\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n My Residential Projects\r\n {this.state.project.Title}\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {this.state.project.Title}\r\n

    \r\n \r\n \r\n\r\n {this.state.project.IsToBeApproved && 'Available'}\r\n {!this.state.project.IsFinalised && 'In Progress'}\r\n {this.state.project.IsFinalised && 'Order Completed'}\r\n \r\n
    \r\n\r\n {!this.state.isLoading && !this.state.project.IsFinalised &&\r\n
    \r\n \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n {\r\n this.state.project.ProjectBoards !== undefined &&\r\n
    \r\n {\r\n this.state.pageError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.pageError}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.project.ProjectBoards.length === 0 &&\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n

    \r\n You don’t have any board yet in your project.\r\n

    \r\n

    \r\n Add your first board above\r\n

    \r\n
    \r\n }\r\n\r\n {\r\n this.state.project.ProjectBoards.length > 0 &&\r\n \r\n }\r\n
    \r\n }\r\n
    \r\n\r\n {\r\n this.state.project.ItemID !== undefined &&\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Project Created\r\n \r\n
    \r\n\r\n
    0 ? ' is-done' : '')}>\r\n \r\n \r\n \r\n \r\n Board Added\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Board Quantity (Min {'30'} boards)\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n All Boards Configured (Min 4 breakers per board)\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Quote Generated\r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n Order to Complete\r\n \r\n
    \r\n\r\n
    \r\n
    \r\n }\r\n\r\n {this.state.isChangingProjectTitle &&\r\n \r\n\r\n
    \r\n
    \r\n \r\n this.handelChange(event.target.name, event.target.value)} required maxLength=\"128\" autoFocus>\r\n\r\n
    \r\n\r\n {\r\n this.state.changingTitleApiErrorMessage &&\r\n
    {this.state.changingTitleApiErrorMessage}
    \r\n }\r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n }\r\n\r\n {this.state.isDeletingBoard &&\r\n \r\n\r\n
    \r\n

    Are you sure you want to delete this board?

    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n }\r\n\r\n {\r\n this.state.showBoardDetails &&\r\n \r\n {this.renderProjectBoardModals()}\r\n \r\n }\r\n\r\n {\r\n this.state.isConfiguringBoard &&\r\n \r\n }\r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(ProjectDetailsResidential)","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport Pikaday from 'pikaday'\r\n\r\nclass Datepicker extends React.Component {\r\n componentDidMount() {\r\n // set min date to pick 4 days from now\r\n // http://stackoverflow.com/questions/563406/add-days-to-datetime\r\n Date.prototype.addDays = function(){\r\n const date = new Date(this.valueOf())\r\n const numDays = 4\r\n date.setDate(date.getDate() + numDays)\r\n\r\n // avoid weekends\r\n switch (date.getDay()) {\r\n case 0: // sunday\r\n date.setDate(date.getDate() + 1)\r\n break\r\n case 6: // saturday\r\n date.setDate(date.getDate() + 2)\r\n break\r\n }\r\n\r\n return date\r\n }\r\n\r\n const today = new Date()\r\n const minDate = today.addDays()\r\n const self = this\r\n\r\n new Pikaday({\r\n field: ReactDOM.findDOMNode(self.refs.pikaday),\r\n format: 'DD/MM/YYYY',\r\n firstDay: 1,\r\n minDate: minDate,\r\n yearRange: [2020, 2060],\r\n disableWeekends: true,\r\n onSelect: function() {\r\n self.props.handleDate(this.toString('DD/MM/YYYY'))\r\n }\r\n })\r\n }\r\n\r\n 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\nexport default Datepicker\r\n","import React, { Component } from 'react'\r\nimport { withRouter, Link } from 'react-router-dom'\r\nimport Header from '../../components/header/Header'\r\nimport { getUrlParameter } from '../../utils/helpers'\r\nimport GlobalOverlay from '../../components/global-overlay/GlobalOverlay'\r\nimport Modal from '../../components/modal/Modal'\r\nimport Datepicker from '../../components/datepicker/Datepicker'\r\nimport commonFunctionsService from '../../services/CommonFunctionsService'\r\nimport { apiCallsCommercial, apiUrlGetDocument } from '../../utils/apiCallsCommercial'\r\nimport { CONST } from '../../CONST'\r\nimport cloneDeep from 'lodash'\r\nimport jQuery from \"jquery\"\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\n\r\n\r\nclass Quote extends Component {\r\n constructor() {\r\n super()\r\n\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.saveProject = this.saveProject.bind(this)\r\n this.sendEmailCustomerQuote = this.sendEmailCustomerQuote.bind(this)\r\n this.requestWholesalersQuote = this.requestWholesalersQuote.bind(this)\r\n this.hideConfirmationModal = this.hideConfirmationModal.bind(this)\r\n this.showEmailCustomerQuote = this.showEmailCustomerQuote.bind(this)\r\n // this.handleCustomerDetailChange = this.handleCustomerDetailChange.bind(this)\r\n\r\n // Init states\r\n this.state = {\r\n apiError: '',\r\n pageInfo: '',\r\n promoCode: '',\r\n purchaseNumber: '',\r\n attachedPO: '',\r\n userData: {},\r\n showBreakdown: false,\r\n showPromoCodeInput: false,\r\n validation: {\r\n message: '',\r\n isError: false,\r\n disclaimerCheckbox: false,\r\n promoCodeInput: false,\r\n // purchaseOrderNumber: false,\r\n // noAttachedPO: false\r\n },\r\n isLoading: {\r\n app: true,\r\n promoCodeApi: false,\r\n placeOrderApi: false,\r\n drawing: false,\r\n attachingPO: false,\r\n emailQuote: false,\r\n updateDetails: false\r\n },\r\n drawings: [],\r\n showConfirmationModal: false,\r\n projectID: getUrlParameter('projectID'),\r\n contractorRequestAgain: false,\r\n preferredWholesalerID: getUrlParameter('wholesalerBranchID'),\r\n wholesalerToSendQuote: getUrlParameter('wholesalerBranchID'),\r\n selectedWholesalerIDForProduction: '',\r\n showEmailCustomerQuoteModal: false,\r\n QuoteCustomerQuoteRef: '',\r\n QuoteCompanyName: '',\r\n QuoteCustomerName: '',\r\n QuoteCustomerAddress: '',\r\n QuoteCustomerPhone: '',\r\n QuoteCustomerEmail: '',\r\n QuoteCustomerMarkupPercent: 125,\r\n orderPlacementCondition1Accepted: false,\r\n orderPlacementCondition2Accepted: false,\r\n orderPlacementCondition3Accepted: false,\r\n orderPlacementCondition4Accepted: false,\r\n orderPlacementCondition5Accepted: false\r\n }\r\n\r\n // Temp user data\r\n this.userData = {}\r\n }\r\n\r\n componentDidMount() {\r\n let isConsultant = false\r\n let preferredWholesaler = this.state.preferredWholesalerID\r\n if (preferredWholesaler === '') {\r\n preferredWholesaler = -1 // default value for API\r\n }\r\n\r\n // Load the API data after mounting so the spinner gets rendered first\r\n apiCallsCommercial.apiUserSettings()\r\n .then(userDataObj => {\r\n isConsultant = userDataObj.IsConsultant\r\n this.userData = userDataObj\r\n this.setState({\r\n userData: userDataObj,\r\n QuoteCustomerMarkupPercent: userDataObj.EndCustomerMarkupFactor !== null ? userDataObj.EndCustomerMarkupFactor * 100 : 125,\r\n })\r\n\r\n return apiCallsCommercial.apiGetProject(this.state.projectID)\r\n })\r\n .then(projectData => {\r\n // If its a consultant, we display this page with just the project data\r\n // OR Check if the project data already comes with quote info, also need to make sure the wholesaler order through has not changed\r\n const existingQuote = (projectData.QuoteCentsIncGST &&\r\n (projectData.WholesalerBranchIDOrderedThrough === 0\r\n || projectData.WholesalerBranchIDOrderedThrough === this.state.preferredWholesalerID))\r\n if (isConsultant || existingQuote) {\r\n this.setState({\r\n quote: projectData,\r\n purchaseNumber: projectData.PurchaseNumber,\r\n attachedPO: projectData.POIsValid ? 'already attached' : null,\r\n promoCode: projectData.QuotePromoCode ? projectData.QuotePromoCode : '',\r\n isLoading: { ...this.state.isLoading, app: false }\r\n })\r\n\r\n // Previousely it used to download drawings only for the consultant, but we want all users to see drawing\r\n // E.g. Contractor previously needed to place an order before downloading drawings, now he can download them even before placing an order\r\n this.getDrawingsFromServer()\r\n } else {\r\n this.setState({\r\n quote: projectData\r\n }, () => {\r\n this.generateQuote().then(() => {\r\n // Very first time we need to generate the quote at least once before we can call the drawings API\r\n this.getDrawingsFromServer()\r\n }).catch(error => {\r\n window.alert(error)\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS + '?orderID=' + this.state.projectID)\r\n })\r\n })\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n getDrawingsFromServer() {\r\n this.setState({ isLoading: { ...this.state.isLoading, drawing: true } })\r\n\r\n apiCallsCommercial.apiGetLayoutDiagrams(this.state.projectID)\r\n .then(response => {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, drawing: false },\r\n drawings: response.ProjectFileCollection.filter(x => x.ProjectBoardID !== -1)\r\n })\r\n })\r\n .catch((error) => {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, drawing: false },\r\n apiError: error.message\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n generateQuote() {\r\n return new Promise((resolve, reject) => {\r\n // Since the quote company name is required, so we check the fields against that in the project data item\r\n // if its not already filled in, we will default the values to the values in user setting\r\n const quoteCompanyName = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCompanyName : null\r\n const quoteCustName = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerName : null\r\n const quoteAddress = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerAddress : null\r\n const quotePhone = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerPhone : null\r\n const quoteEmail = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerEmail : null\r\n const quoteRef = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerQuoteRef : null\r\n const quoteMarkup = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerMarkupPercent : 125\r\n\r\n apiCallsCommercial.apiGenerateQuote(this.state.projectID, this.state.preferredWholesalerID, quoteCompanyName, quoteCustName, quoteAddress, quotePhone, quoteEmail, quoteRef, quoteMarkup)\r\n .then(quoteData => {\r\n this.setState({\r\n quote: quoteData,\r\n isLoading: { ...this.state.isLoading, app: false }\r\n })\r\n\r\n analyticsDataLayer.viewQuote({\r\n \"quote_id\": `${this.state.projectID}`,\r\n \"quote_name\": \"View quote\"\r\n })\r\n\r\n resolve(true)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n reject(error.message)\r\n })\r\n })\r\n }\r\n\r\n getDisplayQuoteValues = quoteData => {\r\n const displayQuote = {\r\n orgExGST: 0,\r\n incGST: 0,\r\n exGST: 0,\r\n GST: 0\r\n }\r\n\r\n displayQuote.orgExGST = quoteData.QuoteCentsExGST\r\n\r\n if (quoteData.QuoteDiscountedCentsExGST) {\r\n displayQuote.incGST = quoteData.QuoteDiscountedCentsIncGST\r\n displayQuote.exGST = quoteData.QuoteDiscountedCentsExGST\r\n displayQuote.GST = quoteData.QuoteDiscountCentsGST\r\n } else {\r\n displayQuote.incGST = quoteData.QuoteCentsIncGST\r\n displayQuote.exGST = quoteData.QuoteCentsExGST\r\n displayQuote.GST = quoteData.QuoteCentsGST\r\n }\r\n\r\n return displayQuote\r\n }\r\n\r\n getCustomerDisplayQuoteValues = quoteData => {\r\n const displayQuote = {\r\n orgExGST: 0,\r\n incGST: 0,\r\n exGST: 0,\r\n GST: 0\r\n }\r\n\r\n displayQuote.orgExGST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsExGST') ? quoteData.CustomerQuoteCentsExGST : quoteData.QuoteCentsExGST\r\n\r\n if (quoteData.QuoteDiscountedCentsExGST) {\r\n displayQuote.incGST = this.getNumericAttr(quoteData, 'CustomerDiscountedQuoteCentsIncGST') ? quoteData.CustomerDiscountedQuoteCentsIncGST : quoteData.QuoteDiscountedCentsIncGST\r\n displayQuote.exGST = this.getNumericAttr(quoteData, 'CustomerDiscountedQuoteCentsExGST') ? quoteData.CustomerDiscountedQuoteCentsExGST : quoteData.QuoteDiscountedCentsExGST\r\n displayQuote.GST = this.getNumericAttr(quoteData, 'CustomerDiscountedQuoteCentsGST') ? quoteData.CustomerDiscountedQuoteCentsGST : quoteData.QuoteDiscountCentsGST\r\n } else {\r\n displayQuote.incGST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsIncGST') ? quoteData.CustomerQuoteCentsIncGST : quoteData.QuoteCentsIncGST\r\n displayQuote.exGST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsExGST') ? quoteData.CustomerQuoteCentsExGST : quoteData.QuoteCentsExGST\r\n displayQuote.GST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsGST') ? quoteData.CustomerQuoteCentsGST : quoteData.QuoteCentsGST\r\n }\r\n\r\n return displayQuote\r\n }\r\n\r\n getNumericAttr(obj, attribute) {\r\n return obj.hasOwnProperty(attribute) ? obj[attribute] : 0\r\n }\r\n\r\n showLeadTimes(board) {\r\n this.setState({ selectedBoard: board, showBreakdown: true })\r\n let itemData = []\r\n board.BoardBOMComponents.forEach(item => {\r\n itemData.push({\r\n \"item_name\": item.Description,\r\n \"item_id\": item.ItemCode,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": item.Category,\r\n \"item_variant\": '',\r\n \"price\": item.Price,\r\n \"quantity\": item.Quantity\r\n })\r\n })\r\n analyticsDataLayer.viewItemList({\r\n \"currency\": 'AUD',\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.state.quote.Title,\r\n \"item_board_name\": board.Name,\r\n \"item_board_id\": board.ItemID.toString(),\r\n \"configuration_name\": board.Name,\r\n \"configuration_id\": board.ItemID.toString(), \r\n \"project_id\": this.state.quote.ItemID.toString(),\r\n \"items\": itemData\r\n })\r\n }\r\n\r\n hideLeadTimes = () => {\r\n this.setState({ showBreakdown: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n showEmailCustomerQuote() {\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: \"Email Customer Quote\",\r\n cta_link: window.location.href,\r\n cta_location: \"quote page\",\r\n })\r\n this.setState({ showEmailCustomerQuoteModal: true })\r\n }\r\n\r\n hideEmailCustomerQuote = () => {\r\n this.setState({ showEmailCustomerQuoteModal: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n renderCurrency = cents => {\r\n const dollars = cents / 100\r\n\r\n return dollars.toLocaleString('en-AU', {\r\n style: 'currency',\r\n currency: 'AUD',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2\r\n })\r\n }\r\n\r\n renderProjectBoardModals = board => {\r\n let boardDescription = []\r\n if (!board.BoardBOMComponents.length) {\r\n board.ProjectBoardBreakerCollection.forEach(item => {\r\n const desc = item.BreakerTypeReadOnly.DrawingDesc\r\n const inArray = boardDescription.find(boardItem => boardItem.Description === desc)\r\n if (inArray) {\r\n boardDescription = boardDescription.map(boardItemObj => {\r\n if (boardItemObj.Description === desc) {\r\n boardItemObj.Quantity = boardItemObj.Quantity + 1\r\n }\r\n return boardItemObj\r\n })\r\n } else {\r\n boardDescription.push({\r\n Quantity: 1,\r\n Description: desc,\r\n StockAvailability: 'N/A'\r\n })\r\n }\r\n })\r\n } else {\r\n boardDescription = [...board.BoardBOMComponents]\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {boardDescription.map((boardDescriptionObj, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
    QuantityItemsStock
    {boardDescriptionObj.Quantity} {boardDescriptionObj.Description}{boardDescriptionObj.StockAvailability ? boardDescriptionObj.StockAvailability : 'Available'}
    \r\n )\r\n }\r\n\r\n applyPromoCode = () => {\r\n if (this.state.promoCode.length === 0) {\r\n this.setState({ validation: { ...this.state.validation, promoCodeInput: true } })\r\n } else {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, promoCodeApi: true },\r\n validation: { ...this.state.validation, promoCodeInput: false }\r\n })\r\n\r\n const applyPromoCodeRequestObj = {\r\n 'ProjectID': this.state.quote.ItemID,\r\n 'PromoCode': this.state.promoCode\r\n }\r\n\r\n apiCallsCommercial.apiApplyPromoCode(applyPromoCodeRequestObj)\r\n .then(quoteData => {\r\n this.setState({\r\n quote: quoteData,\r\n attachedPO: quoteData.POIsValid ? '' : null,\r\n isLoading: { ...this.state.isLoading, promoCodeApi: false },\r\n promoCode: '',\r\n showPromoCodeInput: false,\r\n pageInfo: 'Promo code applied successfully! Note: Promo code has to be valid at the time of placing order.'\r\n })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({\r\n apiError: error.message,\r\n isLoading: { ...this.state.isLoading, promoCodeApi: false }\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n\r\n }\r\n }\r\n\r\n handlePromoCode = event => {\r\n this.setState({ promoCode: event.target.value })\r\n }\r\n\r\n handlePOUpload = e => {\r\n e.preventDefault()\r\n\r\n this.setState({ isLoading: { attachingPO: true } })\r\n\r\n // inspiration taken from http://www.hartzis.me/react-image-upload/\r\n // and https://www.html5rocks.com/en/tutorials/file/dndfiles/\r\n // should be everything the BEDs need to get the file.\r\n\r\n const reader = new FileReader()\r\n const fileInput = e.target\r\n const quoteObj = this.state.quote\r\n\r\n reader.onloadend = () => {\r\n apiCallsCommercial.apiAttachPo(quoteObj.ItemID, quoteObj.QuoteCentsIncGST, quoteObj.QuoteDiscountedCentsIncGST, reader.result)\r\n .then(response => {\r\n this.setState({\r\n attachedPO: response.POFileName === null ? 'this should be set to the return value' : response.POFileName,\r\n isLoading: { attachingPO: false },\r\n pageInfo: 'PO successfully attached to the project.'\r\n })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n fileInput.value = ''\r\n this.setState({\r\n apiError: error.message,\r\n isLoading: { attachingPO: false }\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n reader.readAsDataURL(fileInput.files[0])\r\n }\r\n\r\n // handleCustomerDetailChange = stateObject => {\r\n // this.setState({ isLoading: {...this.state.isLoading, updateDetails: true} });\r\n // const projectId = this.getUrlParameter('projectID');\r\n // let preferredWholesaler = this.getUrlParameter('wholesalerBranchID');\r\n // if ( preferredWholesaler === '' ) {\r\n // preferredWholesaler = -1; // default value for API\r\n // }\r\n\r\n // apiCallsCommercial.apiGenerateQuote(projectId, preferredWholesaler, stateObject.QuoteCompanyName, stateObject.QuoteCustomerName,\r\n // stateObject.QuoteCustomerAddress, stateObject.QuoteCustomerPhone, stateObject.QuoteCustomerEmail, stateObject.QuoteCustomerQuoteRef, stateObject.QuoteCustomerMarkupPercent)\r\n // .then(quoteData => {\r\n // this.setValidationMsg('Customer details updated successfully.', false);\r\n // this.setState({ quote: quoteData });\r\n // })\r\n // .catch(error => {\r\n // this.setValidationMsg(error.message, true);\r\n // })\r\n // .then(() => {\r\n // this.setState({ isLoading: {...this.state.isLoading, updateDetails: false} });\r\n // // $.magnificPopup.close();\r\n // });\r\n // }\r\n\r\n // setDispatchDate = date => {\r\n // this.setState({\r\n // quote: {\r\n // ...this.state.quote,\r\n // PreferredDispatchDate: date\r\n // }\r\n // })\r\n // }\r\n\r\n validateForm = (event) => {\r\n event.preventDefault()\r\n\r\n // const noPurchaseNumber = this.state.purchaseNumber.length === 0 ? true : false\r\n // const noAttachedPO = this.state.attachedPO.length === 0 ? true : false\r\n\r\n // Tempoarary disable order requirment\r\n if (!this.state.userData.UserIsContractor && false) {\r\n // if (!this.state.userData.UserIsContractor && (noPurchaseNumber || noAttachedPO)) {\r\n this.setState({\r\n validation: {\r\n ...this.state.validation\r\n // ,\r\n // purchaseOrderNumber: noPurchaseNumber,\r\n // noAttachedPO: noAttachedPO\r\n }\r\n })\r\n } else {\r\n this.setState({\r\n showConfirmationModal: true,\r\n validation: {\r\n ...this.state.validation\r\n // ,\r\n // purchaseOrderNumber: false\r\n }\r\n })\r\n }\r\n }\r\n\r\n hideConfirmationModal() {\r\n this.setState({ showConfirmationModal: false }, () => jQuery('.app__body-content').animate({ scrollTop: 0 }, 'fast'))\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n async downloadDrawings() {\r\n let drawingsDownloaded = 0\r\n const numberOfDrawings = this.state.drawings.length\r\n const token = localStorage.getItem('token')\r\n \r\n const downloadDrawing = async (drawing) => {\r\n const downloadURL = `${apiUrlGetDocument}/${drawing.ItemGUID}`\r\n const response = await fetch(downloadURL, {\r\n headers: {\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n })\r\n const blob = await response.blob()\r\n const url = window.URL.createObjectURL(blob)\r\n \r\n let contentDisposition = response.headers.get('Content-Disposition')\r\n // Remove all quotes \" from the contentDisposition, as some .NET behaviour adds them \r\n // it's because of the special characters \"(\" and \")\" in case of the project names with brackets\r\n contentDisposition = contentDisposition.replace(/\"/g, '')\r\n let filename = 'download.pdf'\r\n if (contentDisposition && contentDisposition.includes('attachment')) {\r\n const matches = /filename=([^;]+)/.exec(contentDisposition)\r\n if (matches && matches[1]) {\r\n filename = matches[1]\r\n }\r\n }\r\n \r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = filename\r\n a.click()\r\n window.URL.revokeObjectURL(url)\r\n \r\n analyticsDataLayer.downloadLayout({\r\n \"document_id\": drawing.ItemGUID,\r\n \"document_name\": \"Download Drawings\",\r\n \"document_type\": \"pdf\"\r\n })\r\n }\r\n \r\n const downloadNext = async () => {\r\n if (drawingsDownloaded < numberOfDrawings) {\r\n await downloadDrawing(this.state.drawings[drawingsDownloaded])\r\n drawingsDownloaded++\r\n setTimeout(downloadNext, 500)\r\n }\r\n }\r\n \r\n downloadNext()\r\n }\r\n\r\n saveProject = (event) => {\r\n event.preventDefault()\r\n\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, placeOrderApi: true },\r\n quote: { ...this.state.quote, QuoteCustomerMarkupPercent: this.state.QuoteCustomerMarkupPercent } // Save eventually changed mark-up on the front-end\r\n }, () => {\r\n const saveProjectRequestObj = {\r\n ...cloneDeep(this.state.quote).value()\r\n }\r\n\r\n saveProjectRequestObj['PurchaseNumber'] = this.state.purchaseNumber\r\n saveProjectRequestObj['DontResetQuote'] = true\r\n\r\n if (this.state.userData.UserIsContractor) {\r\n saveProjectRequestObj['WholesalerBranchIDOrderedThrough'] = parseInt(this.state.selectedWholesalerIDForProduction, 10)\r\n }\r\n\r\n apiCallsCommercial.apiSave(saveProjectRequestObj)\r\n .then(() => {\r\n // Once we save the project we submit the order for the contractor\r\n this.submitOrder()\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n })\r\n }\r\n\r\n sendEmailCustomerQuote = (event) => {\r\n event.preventDefault()\r\n\r\n this.setState({ isLoading: { ...this.state.isLoading, emailQuote: true } })\r\n\r\n // Before we send an email we need to save provided customer data by calling Project quote API\r\n apiCallsCommercial.apiGenerateQuote(this.state.projectID, this.state.preferredWholesalerID,\r\n this.state.QuoteCompanyName,\r\n this.state.QuoteCustomerName,\r\n '',\r\n '',\r\n this.state.QuoteCustomerEmail,\r\n this.state.QuoteCustomerQuoteRef,\r\n this.state.QuoteCustomerMarkupPercent)\r\n .then(quoteData => {\r\n this.setState({\r\n quote: quoteData\r\n })\r\n\r\n apiCallsCommercial.apiEmailQuote(this.state.quote.ItemID, true)\r\n .then(() => {\r\n this.setState({ pageInfo: 'Quote email sent successfully.' })\r\n\r\n analyticsDataLayer.emailQuote({\r\n quote_id: `${this.state.projectID}`,\r\n quote_name: \"Send Quote\",\r\n currency: \"AUD\",\r\n total_amount: quoteData.CustomerQuoteCentsIncGST / 100,\r\n markup_percentage: `${this.state.QuoteCustomerMarkupPercent - 100}%`\r\n })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: { ...this.state.isLoading, emailQuote: false } })\r\n this.hideEmailCustomerQuote()\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n submitOrder() {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, placeOrderApi: true }\r\n })\r\n\r\n apiCallsCommercial.apiSendOrder(this.state.projectID)\r\n .then(() => {\r\n this.hideConfirmationModal()\r\n\r\n let projectBoards = []\r\n let newProjectBoardDetails = []\r\n this.state.quote.ProjectBoards.forEach(board => {\r\n board.BoardBOMComponents.forEach(item => {\r\n const baseEventDetails = {\r\n 'item_id': item.ItemCode,\r\n 'item_name': item.Description,\r\n 'item_brand': 'FlexSelect',\r\n 'item_category': item.Category,\r\n 'item_variant': '',\r\n 'price': item.Price,\r\n 'quantity': item.Quantity\r\n }\r\n\r\n // Old event details we still need to keep\r\n projectBoards.push({\r\n ...baseEventDetails,\r\n item_board_name: board.Name,\r\n item_board_id: board.ItemID.toString()\r\n })\r\n\r\n // New event details with new parameters configuration_name and configuration_id\r\n newProjectBoardDetails.push({\r\n ...baseEventDetails,\r\n configuration_name: board.Name,\r\n configuration_id: board.ItemID.toString()\r\n })\r\n })\r\n })\r\n\r\n // As part of new requirments we trigger the purchase event and also add to cart event at the same time\r\n // So this is intentional and not a mistake\r\n analyticsDataLayer.purchase({\r\n 'currency': 'AUD',\r\n 'transaction_id': this.state.quote.ProjectNumberReadOnly,\r\n 'value': this.state.quote.QuoteCentsIncGST / 100,\r\n 'project_type': 'Commercial',\r\n 'project_name': this.state.quote.Title,\r\n 'project_id': this.state.quote.ItemID.toString(),\r\n 'tax': this.state.quote.QuoteCentsGST ? this.state.quote.QuoteCentsGST / 100 : 0,\r\n 'order_number': this.state.purchaseNumber,\r\n 'items': projectBoards\r\n })\r\n\r\n analyticsDataLayer.addToCart({\r\n 'currency': 'AUD',\r\n 'value': this.state.quote.QuoteCentsIncGST / 100,\r\n 'project_type': 'Commercial',\r\n 'project_name': this.state.quote.Title,\r\n 'project_id': this.state.quote.ItemID.toString(),\r\n 'order_number': this.state.purchaseNumber,\r\n 'items': newProjectBoardDetails\r\n }, 'place order')\r\n\r\n // After the order is placed we redirect the user back to the project details, that page at this stage should indicate completly different state\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS + '?orderID=' + this.state.projectID)\r\n })\r\n .catch(error => {\r\n this.hideConfirmationModal()\r\n\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, placeOrderApi: false },\r\n apiError: error.message\r\n })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n // Send email to each wholesaler selected\r\n requestWholesalersQuote() {\r\n this.setState({ apiError: '' })\r\n\r\n if (this.state.wholesalerToSendQuote === '') {\r\n this.setState({ apiError: 'You need to select a wholesaler to request a quote' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n } else {\r\n this.setState({ isLoading: { ... this.state.isLoading, emailQuote: true } })\r\n\r\n apiCallsCommercial.apiEmailQuote(this.state.quote.ItemID, false, [this.state.wholesalerToSendQuote])\r\n .then(() => {\r\n // After sending a quote to one or multiple wholselers we need to display a message and show \"Proceed with production\" section\r\n this.setState({ hasRequestedEmailQuote: true, contractorRequestAgain: true })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: { ... this.state.isLoading, emailQuote: false } })\r\n window.setTimeout(() => this.setState({ hasRequestedEmailQuote: false }), 2500)\r\n })\r\n }\r\n }\r\n\r\n changeWholesalerMarkup(increase) {\r\n let markup = 0\r\n if (increase) {\r\n markup = this.state.QuoteCustomerMarkupPercent + 1\r\n } else {\r\n markup = this.state.QuoteCustomerMarkupPercent - 1\r\n }\r\n\r\n this.setState({ QuoteCustomerMarkupPercent: markup })\r\n }\r\n\r\n renderOrderItemTable(quote, quoteValue100, isSwitchManOrLargeContractor) {\r\n console.log('quote', quote, quoteValue100)\r\n return !this.state.userData.UserIsContractor &&\r\n
    \r\n
    \r\n
    \r\n {isSwitchManOrLargeContractor ?\r\n
    \r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n \r\n
    :\r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n }\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    Sell price
    \r\n : null\r\n }\r\n
    \r\n
    \r\n Boards\r\n
    \r\n
    \r\n Price (Ex GST)\r\n
    \r\n
    \r\n GST\r\n
    \r\n
    \r\n Total Price (Inc. GST)\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    \r\n Mark-up\r\n
    \r\n \r\n\r\n
    \r\n \r\n {this.state.QuoteCustomerMarkupPercent - 100}%\r\n \r\n
    \r\n\r\n \r\n
    \r\n
    : null\r\n }\r\n
    \r\n\r\n {quote?.ProjectBoards?.map(board => {\r\n const boardValues = this.getDisplayQuoteValues(board)\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {board.Name}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n {board.QuoteDiscountedCentsExGST ? (\r\n \r\n {this.renderCurrency(boardValues.exGST)}\r\n Was {this.renderCurrency(boardValues.orgExGST)}\r\n \r\n ) : (\r\n this.renderCurrency(boardValues.exGST)\r\n )}\r\n
    \r\n
    \r\n {this.renderCurrency(boardValues.GST)}\r\n
    \r\n
    \r\n {this.renderCurrency(boardValues.incGST)}\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    \r\n {this.renderCurrency(boardValues.exGST * this.state.QuoteCustomerMarkupPercent / 100)} + GST\r\n \r\n {this.renderCurrency((boardValues.exGST * this.state.QuoteCustomerMarkupPercent / 100) - boardValues.exGST)} (Mark-up)\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 Total\r\n \r\n \r\n \r\n\r\n
    \r\n \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {this.renderCurrency(quoteValue100.exGST)}\r\n
    \r\n
    \r\n {this.renderCurrency(quoteValue100.GST)}\r\n
    \r\n
    \r\n {this.renderCurrency(quoteValue100.incGST)}\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    \r\n {this.renderCurrency(quoteValue100.exGST * this.state.QuoteCustomerMarkupPercent / 100)} + GST\r\n \r\n {this.renderCurrency((quoteValue100.exGST * this.state.QuoteCustomerMarkupPercent / 100) - quoteValue100.exGST)} (Mark-up)\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 renderMarkup(isSwitchManOrLargeContractor) {\r\n if (!isSwitchManOrLargeContractor) {\r\n return ` (${this.state.QuoteCustomerMarkupPercent - 100}% Mark-up)`\r\n }\r\n return null\r\n }\r\n\r\n\r\n render() {\r\n const isSwitchManOrLargeContractor = ['SwitchboardManufacturer', 'LargeContractor'].includes(this.state.userData.UserTypeString)\r\n if (this.state.isLoading.app) {\r\n return (\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n Generating Quote\r\n
    \r\n
    \r\n
    )\r\n } else {\r\n const quote = this.state.quote\r\n const quoteValue = this.getCustomerDisplayQuoteValues(quote)\r\n const quoteValue100 = this.getDisplayQuoteValues(quote)\r\n\r\n return (\r\n \r\n
    \r\n\r\n {\r\n this.state.isLoading.placeOrderApi &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Placing Order\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isLoading.emailQuote &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Sending Quote\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.hasRequestedEmailQuote &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Quote sent\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {/* Email Quote */}\r\n {this.state.showEmailCustomerQuoteModal &&\r\n \r\n
    \r\n
    \r\n
    \r\n

    \r\n For the amount of \r\n {this.renderCurrency(quoteValue100.exGST * (isSwitchManOrLargeContractor ? 100 : this.state.QuoteCustomerMarkupPercent) / 100)} + GST\r\n {this.renderMarkup(isSwitchManOrLargeContractor)}\r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.setState({ QuoteCustomerName: event.target.value })} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.setState({ QuoteCompanyName: event.target.value })} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.setState({ QuoteCustomerEmail: event.target.value })} />\r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n }\r\n\r\n {/* Confirm Order */}\r\n {\r\n this.state.showConfirmationModal &&\r\n \r\n
    \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition1Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition2Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition3Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition4Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition5Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n }\r\n\r\n {/* Item Breakdown */}\r\n {\r\n this.state.showBreakdown &&\r\n \r\n {this.renderProjectBoardModals(this.state.selectedBoard)}\r\n\r\n

    \r\n *Longer lead times may apply\r\n

    \r\n \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n My Commercial Projects\r\n \r\n \r\n \r\n \r\n \r\n {this.state.pageInfo}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.apiError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.apiError}\r\n \r\n

    \r\n }\r\n
    \r\n\r\n {this.state.userData.IsConsultant &&\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n Boards\r\n
    \r\n
    \r\n\r\n {quote.ProjectBoards.map(board => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {board.Name}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n })}\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n\r\n {/* All cases that are not consultants */}\r\n {!this.state.userData.IsConsultant &&\r\n
    \r\n\r\n {/* Table view for contractors */}\r\n {\r\n this.state.userData.UserIsContractor &&\r\n
    \r\n
    \r\n
    \r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n\r\n

    Retail Pricing

    \r\n

    Please note this is RRP, please request a quote from your wholesaler to confirm the cost

    \r\n\r\n
    \r\n
    \r\n
    \r\n Boards\r\n
    \r\n\r\n
    \r\n RRP (Excl. GST)\r\n
    \r\n
    \r\n\r\n {quote.ProjectBoards.map(board => {\r\n const boardValues = this.getCustomerDisplayQuoteValues(board)\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {board.Name}\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {this.renderCurrency(boardValues.exGST)}\r\n
    \r\n
    \r\n )\r\n })}\r\n\r\n
    \r\n
    \r\n
    \r\n \r\n Total\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {this.renderCurrency(quoteValue.exGST)}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {/* Table view for Wholeselers and Switch Board Manufacturers and hide the Sell price option for SwitchMan and LargeContractor */}\r\n {this.renderOrderItemTable(quote, quoteValue100, isSwitchManOrLargeContractor)}\r\n\r\n
    \r\n
    \r\n

    Review

    \r\n\r\n \r\n\r\n {\r\n this.state.userData.UserIsContractor &&\r\n
    \r\n {\r\n !this.state.contractorRequestAgain &&\r\n
    \r\n

    \r\n Request Quote\r\n\r\n \r\n

    \r\n\r\n

    \r\n Select the wholesalers to request a quote\r\n

    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.contractorRequestAgain &&\r\n
    \r\n\r\n

    \r\n \r\n
    \r\n \r\n
    \r\n \r\n Quotes requested\r\n \r\n
    \r\n \r\n

    \r\n

    \r\n Proceed with production\r\n

    \r\n

    \r\n Once you have an agreed price set with your Wholesaler\r\n

    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n\r\n \r\n
    \r\n
    \r\n\r\n \r\n\r\n
    \r\n
    \r\n }\r\n
    \r\n }\r\n\r\n {\r\n !this.state.userData.UserIsContractor &&\r\n \r\n

    Proceed with production

    \r\n

    \r\n Lead times are 5 business days to dispatch for most selections\r\n

    \r\n\r\n
    \r\n {/* Requirments keep changing, if this won't be needed once deployed to production, then please remove this and all references */}\r\n {/* */}\r\n\r\n
    \r\n \r\n this.setState({ purchaseNumber: event.target.value })} />\r\n Please enter a Purchase Order Number\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\r\n this.state.attachedPO === '' ?\r\n Upload Purchase Order\r\n :\r\n File attached\r\n }\r\n \r\n
    \r\n\r\n Please upload a Purchase Order\r\n
    \r\n\r\n

    \r\n For the amount of \r\n {this.renderCurrency(quoteValue100.exGST)} + GST\r\n \r\n

    \r\n\r\n \r\n \r\n
    \r\n }\r\n
    \r\n\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default withRouter(Quote)","import React, { Component } from 'react'\r\nimport { withRouter, Link } from 'react-router-dom'\r\nimport Header from '../../components/header/Header'\r\nimport { getUrlParameter } from '../../utils/helpers'\r\nimport GlobalOverlay from '../../components/global-overlay/GlobalOverlay'\r\nimport Modal from '../../components/modal/Modal'\r\nimport Datepicker from '../../components/datepicker/Datepicker'\r\nimport commonFunctionsService from '../../services/CommonFunctionsService'\r\nimport { apiCallsCommercial } from '../../utils/apiCallsCommercial'\r\nimport { apiCallsResidential, apiUrlGetDocument } from './../../utils/apiCallsResidential'\r\nimport { CONST } from '../../CONST'\r\nimport cloneDeep from 'lodash'\r\nimport jQuery from \"jquery\"\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\n\r\n\r\nclass Quote extends Component {\r\n constructor() {\r\n super()\r\n\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.saveProject = this.saveProject.bind(this)\r\n this.sendEmailCustomerQuote = this.sendEmailCustomerQuote.bind(this)\r\n this.requestWholesalersQuote = this.requestWholesalersQuote.bind(this)\r\n this.hideConfirmationModal = this.hideConfirmationModal.bind(this)\r\n this.showEmailCustomerQuote = this.showEmailCustomerQuote.bind(this)\r\n // this.handleCustomerDetailChange = this.handleCustomerDetailChange.bind(this)\r\n\r\n // Init states\r\n this.state = {\r\n apiError: '',\r\n pageInfo: '',\r\n promoCode: '',\r\n purchaseNumber: '',\r\n attachedPO: '',\r\n userData: {},\r\n showBreakdown: false,\r\n showPromoCodeInput: false,\r\n validation: {\r\n message: '',\r\n isError: false,\r\n disclaimerCheckbox: false,\r\n promoCodeInput: false,\r\n purchaseOrderNumber: false,\r\n noAttachedPO: false\r\n },\r\n isLoading: {\r\n app: true,\r\n promoCodeApi: false,\r\n placeOrderApi: false,\r\n drawing: false,\r\n attachingPO: false,\r\n emailQuote: false,\r\n updateDetails: false\r\n },\r\n drawings: [],\r\n showConfirmationModal: false,\r\n projectID: getUrlParameter('projectID'),\r\n contractorRequestAgain: false,\r\n preferredWholesalerID: getUrlParameter('wholesalerBranchID'),\r\n wholesalersToSendQuote: [\r\n getUrlParameter('wholesalerBranchID')\r\n ],\r\n selectedWholesalerIDForProduction: '',\r\n showEmailCustomerQuoteModal: false,\r\n QuoteCompanyName: '',\r\n QuoteCustomerName: '',\r\n QuoteCustomerAddress: '',\r\n QuoteCustomerPhone: '',\r\n QuoteCustomerEmail: '',\r\n QuoteCustomerMarkupPercent: 125,\r\n orderPlacementCondition1Accepted: false,\r\n orderPlacementCondition2Accepted: false,\r\n orderPlacementCondition3Accepted: false,\r\n orderPlacementCondition4Accepted: false,\r\n orderPlacementCondition5Accepted: false\r\n // ,orderPlacementCondition6Accepted: false\r\n }\r\n\r\n // Temp user data\r\n this.userData = {}\r\n }\r\n\r\n componentDidMount() {\r\n let isConsultant = false\r\n let preferredWholesaler = this.state.preferredWholesalerID\r\n if (preferredWholesaler === '') {\r\n preferredWholesaler = -1 // default value for API\r\n }\r\n\r\n // Load the API data after mounting so the spinner gets rendered first\r\n apiCallsCommercial.apiUserSettings()\r\n .then(userDataObj => {\r\n isConsultant = userDataObj.IsConsultant\r\n this.userData = userDataObj\r\n this.setState({\r\n userData: userDataObj,\r\n QuoteCustomerMarkupPercent: userDataObj.ResidentialEndCustomerMarkupFactor !== null ? userDataObj.ResidentialEndCustomerMarkupFactor * 100 : 125,\r\n })\r\n\r\n return apiCallsResidential.apiGetProject(this.state.projectID)\r\n })\r\n .then(projectData => {\r\n // If its a consultant, we display this page with just the project data\r\n // OR Check if the project data already comes with quote info, also need to make sure the wholesaler order through has not changed\r\n const existingQuote = projectData.WholesalerBranchIDOrderedThrough === 0 || projectData.WholesalerBranchIDOrderedThrough === this.state.preferredWholesalerID\r\n\r\n const anyBoardMissingGeneratedComponents = projectData.ProjectBoards.some(board => board.BoardBOMComponents.length === 0)\r\n if (isConsultant || (existingQuote && !anyBoardMissingGeneratedComponents)) {\r\n this.setState({\r\n quote: projectData,\r\n purchaseNumber: projectData.PurchaseNumber,\r\n attachedPO: projectData.POIsValid ? 'already attached' : null,\r\n promoCode: projectData.QuotePromoCode ? projectData.QuotePromoCode : '',\r\n isLoading: { ...this.state.isLoading, app: false }\r\n })\r\n\r\n // Previousely it used to download drawings only for the consultant, but we want all users to see drawing\r\n // E.g. Contractor previously needed to place an order before downloading drawings, now he can download them even before placing an order\r\n this.getDrawingsFromServer()\r\n } else {\r\n this.setState({\r\n quote: projectData\r\n }, () => {\r\n this.generateQuote().then(() => {\r\n apiCallsResidential.apiGetProject(this.state.projectID).then(projectData => {\r\n this.setState({\r\n quote: projectData,\r\n purchaseNumber: projectData.PurchaseNumber,\r\n attachedPO: projectData.POIsValid ? 'already attached' : null,\r\n promoCode: projectData.QuotePromoCode ? projectData.QuotePromoCode : '',\r\n isLoading: { ...this.state.isLoading, app: false }\r\n })\r\n\r\n // Very first time we need to generate the quote at least once before we can call the drawings API\r\n this.getDrawingsFromServer()\r\n })\r\n })\r\n })\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n getDrawingsFromServer() {\r\n this.setState({ isLoading: { ...this.state.isLoading, drawing: true } })\r\n\r\n apiCallsResidential.apiGetLayoutDiagrams(this.state.projectID)\r\n .then(response => {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, drawing: false },\r\n drawings: response.ProjectFileCollection.filter(x => x.ProjectBoardID !== -1)\r\n })\r\n })\r\n .catch((error) => {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, drawing: false },\r\n apiError: error.message\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n generateQuote() {\r\n return new Promise((resolve, reject) => {\r\n // Since the quote company name is required, so we check the fields against that in the project data item\r\n // if its not already filled in, we will default the values to the values in user setting\r\n const quoteCompanyName = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCompanyName : null\r\n const quoteCustName = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerName : null\r\n const quoteAddress = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerAddress : null\r\n const quotePhone = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerPhone : null\r\n const quoteEmail = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerEmail : null\r\n const quoteMarkup = this.state.quote.QuoteCompanyName ? this.state.quote.QuoteCustomerMarkupPercent : 125\r\n\r\n apiCallsResidential.apiGenerateQuote(this.state.projectID, this.state.preferredWholesalerID, quoteCompanyName, quoteCustName, quoteAddress, quotePhone, quoteEmail, '', quoteMarkup)\r\n .then(quoteData => {\r\n this.setState({\r\n quote: quoteData,\r\n isLoading: { ...this.state.isLoading, app: false }\r\n })\r\n\r\n analyticsDataLayer.viewQuote({\r\n \"quote_id\": `${this.state.projectID}`,\r\n \"quote_name\": \"View quote\"\r\n })\r\n\r\n resolve(true)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n reject(error.message)\r\n })\r\n })\r\n }\r\n\r\n getDisplayQuoteValues = quoteData => {\r\n const displayQuote = {\r\n orgExGST: 0,\r\n incGST: 0,\r\n exGST: 0,\r\n GST: 0\r\n }\r\n\r\n displayQuote.orgExGST = quoteData.QuoteCentsExGST\r\n\r\n if (quoteData.QuoteDiscountedCentsExGST) {\r\n displayQuote.incGST = quoteData.QuoteDiscountedCentsIncGST\r\n displayQuote.exGST = quoteData.QuoteDiscountedCentsExGST\r\n displayQuote.GST = quoteData.QuoteDiscountCentsGST\r\n } else {\r\n displayQuote.incGST = quoteData.QuoteCentsIncGST\r\n displayQuote.exGST = quoteData.QuoteCentsExGST\r\n displayQuote.GST = quoteData.QuoteCentsGST\r\n }\r\n\r\n return displayQuote\r\n }\r\n\r\n getCustomerDisplayQuoteValues = quoteData => {\r\n const displayQuote = {\r\n orgExGST: 0,\r\n incGST: 0,\r\n exGST: 0,\r\n GST: 0\r\n }\r\n\r\n displayQuote.orgExGST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsExGST') ? quoteData.CustomerQuoteCentsExGST : quoteData.QuoteCentsExGST\r\n\r\n if (quoteData.QuoteDiscountedCentsExGST) {\r\n displayQuote.incGST = this.getNumericAttr(quoteData, 'CustomerDiscountedQuoteCentsIncGST') ? quoteData.CustomerDiscountedQuoteCentsIncGST : quoteData.QuoteDiscountedCentsIncGST\r\n displayQuote.exGST = this.getNumericAttr(quoteData, 'CustomerDiscountedQuoteCentsExGST') ? quoteData.CustomerDiscountedQuoteCentsExGST : quoteData.QuoteDiscountedCentsExGST\r\n displayQuote.GST = this.getNumericAttr(quoteData, 'CustomerDiscountedQuoteCentsGST') ? quoteData.CustomerDiscountedQuoteCentsGST : quoteData.QuoteDiscountCentsGST\r\n } else {\r\n displayQuote.incGST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsIncGST') ? quoteData.CustomerQuoteCentsIncGST : quoteData.QuoteCentsIncGST\r\n displayQuote.exGST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsExGST') ? quoteData.CustomerQuoteCentsExGST : quoteData.QuoteCentsExGST\r\n displayQuote.GST = this.getNumericAttr(quoteData, 'CustomerQuoteCentsGST') ? quoteData.CustomerQuoteCentsGST : quoteData.QuoteCentsGST\r\n }\r\n\r\n return displayQuote\r\n }\r\n\r\n getNumericAttr(obj, attribute) {\r\n return obj.hasOwnProperty(attribute) ? obj[attribute] : 0\r\n }\r\n\r\n showLeadTimes(board) {\r\n this.setState({ selectedBoard: board, showBreakdown: true })\r\n let itemData = []\r\n board.BoardBOMComponents.forEach(item => {\r\n itemData.push({\r\n \"item_name\": item.Description,\r\n \"item_id\": item.ItemCode,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": item.Category,\r\n \"item_variant\": '',\r\n \"price\": item.Price,\r\n \"quantity\": item.Quantity\r\n })\r\n })\r\n analyticsDataLayer.viewItemList({\r\n \"currency\": 'AUD',\r\n \"project_type\": 'Residential',\r\n \"project_name\": this.state.quote.Title,\r\n \"item_board_name\": board.Name,\r\n \"item_board_id\": board.ItemID.toString(),\r\n \"configuration_name\": board.Name,\r\n \"configuration_id\": board.ItemID.toString(), \r\n \"project_id\": this.state.quote.ItemID.toString(),\r\n \"items\": itemData\r\n })\r\n }\r\n\r\n hideLeadTimes = () => {\r\n this.setState({ showBreakdown: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n showEmailCustomerQuote() {\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: \"Email Customer Quote\",\r\n cta_link: window.location.href,\r\n cta_location: \"quote page\",\r\n })\r\n this.setState({ showEmailCustomerQuoteModal: true })\r\n }\r\n\r\n hideEmailCustomerQuote = () => {\r\n this.setState({ showEmailCustomerQuoteModal: false })\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n renderCurrency = cents => {\r\n const dollars = cents / 100\r\n\r\n return dollars.toLocaleString('en-AU', {\r\n style: 'currency',\r\n currency: 'AUD',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2\r\n })\r\n }\r\n\r\n renderProjectBoardModals = board => {\r\n let boardDescription = []\r\n let boardItemDescriptionsToAdd = []\r\n // It looks like for some users (at least consultant) the API doesn't return BoardBOMComponents and elements\r\n // In the original Commercial Flex were returned by reading board's included components\r\n if (!board.BoardBOMComponents.length) {\r\n board.ProjectBoardBreakerCollection.forEach(item => { boardItemDescriptionsToAdd.push(item.BreakerTypeReadOnly.Description) })\r\n board.ProjectBoardContractorCollection.forEach(item => { boardItemDescriptionsToAdd.push(item.ContractorReadOnly.Description) })\r\n board.ProjectBoardFittedOptionCollection.forEach(item => { boardItemDescriptionsToAdd.push(item.FittedOptionReadOnly.Description) })\r\n board.ProjectBoardBusbarCollection.forEach(item => { boardItemDescriptionsToAdd.push(item.BusBarReadOnly.Description) })\r\n\r\n boardItemDescriptionsToAdd.forEach(itemDescription => {\r\n const inArray = boardDescription.find(boardItem => boardItem.Description === itemDescription)\r\n if (inArray) {\r\n boardDescription = boardDescription.map(boardItemObject => {\r\n if (boardItemObject.Description === itemDescription) {\r\n boardItemObject.Quantity = boardItemObject.Quantity + 1\r\n }\r\n return boardItemObject\r\n })\r\n } else {\r\n boardDescription.push({\r\n Quantity: 1,\r\n Description: itemDescription\r\n })\r\n }\r\n })\r\n } else {\r\n boardDescription = [...board.BoardBOMComponents]\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {boardDescription.some(item => item.ItemCode) && }\r\n \r\n \r\n \r\n \r\n \r\n {boardDescription.map((BOMComponent, index) => {\r\n return (\r\n \r\n {BOMComponent.ItemCode && }\r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
    ReferenceQuantityItems
    {BOMComponent.ItemCode}{BOMComponent.Quantity}{BOMComponent.Description}
    \r\n )\r\n }\r\n\r\n applyPromoCode = () => {\r\n if (this.state.promoCode.length === 0) {\r\n this.setState({ validation: { ...this.state.validation, promoCodeInput: true } })\r\n } else {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, promoCodeApi: true },\r\n validation: { ...this.state.validation, promoCodeInput: false }\r\n })\r\n\r\n const applyPromoCodeRequestObj = {\r\n 'ProjectID': this.state.quote.ItemID,\r\n 'PromoCode': this.state.promoCode\r\n }\r\n\r\n apiCallsResidential.apiApplyPromoCode(applyPromoCodeRequestObj)\r\n .then(quoteData => {\r\n this.setState({\r\n quote: quoteData,\r\n attachedPO: quoteData.POIsValid ? '' : null,\r\n isLoading: { ...this.state.isLoading, promoCodeApi: false },\r\n promoCode: '',\r\n showPromoCodeInput: false,\r\n pageInfo: 'Promo code applied successfully! Note: Promo code has to be valid at the time of placing order.'\r\n })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({\r\n apiError: error.message,\r\n isLoading: { ...this.state.isLoading, promoCodeApi: false }\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n\r\n }\r\n }\r\n\r\n handlePromoCode = event => {\r\n this.setState({ promoCode: event.target.value })\r\n }\r\n\r\n handlePOUpload = e => {\r\n e.preventDefault()\r\n\r\n this.setState({ isLoading: { attachingPO: true } })\r\n\r\n // inspiration taken from http://www.hartzis.me/react-image-upload/\r\n // and https://www.html5rocks.com/en/tutorials/file/dndfiles/\r\n // should be everything the BEDs need to get the file.\r\n\r\n const reader = new FileReader()\r\n const fileInput = e.target\r\n const quoteObj = this.state.quote\r\n\r\n reader.onloadend = () => {\r\n apiCallsResidential.apiAttachPo(quoteObj.ItemID, quoteObj.QuoteCentsIncGST, quoteObj.QuoteDiscountedCentsIncGST, reader.result)\r\n .then(response => {\r\n this.setState({\r\n attachedPO: response.POFileName === null ? 'this should be set to the return value' : response.POFileName,\r\n isLoading: { attachingPO: false },\r\n pageInfo: 'PO successfully attached to the project.'\r\n })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n fileInput.value = ''\r\n this.setState({\r\n apiError: error.message,\r\n isLoading: { attachingPO: false }\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n reader.readAsDataURL(fileInput.files[0])\r\n }\r\n\r\n // handleCustomerDetailChange = stateObject => {\r\n // this.setState({ isLoading: {...this.state.isLoading, updateDetails: true} });\r\n // const projectId = this.getUrlParameter('projectID');\r\n // let preferredWholesaler = this.getUrlParameter('wholesalerBranchID');\r\n // if ( preferredWholesaler === '' ) {\r\n // preferredWholesaler = -1; // default value for API\r\n // }\r\n\r\n // apiCallsResidential.apiGenerateQuote(projectId, preferredWholesaler, stateObject.QuoteCompanyName, stateObject.QuoteCustomerName,\r\n // stateObject.QuoteCustomerAddress, stateObject.QuoteCustomerPhone, stateObject.QuoteCustomerEmail, stateObject.QuoteCustomerQuoteRef, stateObject.QuoteCustomerMarkupPercent)\r\n // .then(quoteData => {\r\n // this.setValidationMsg('Customer details updated successfully.', false);\r\n // this.setState({ quote: quoteData });\r\n // })\r\n // .catch(error => {\r\n // this.setValidationMsg(error.message, true);\r\n // })\r\n // .then(() => {\r\n // this.setState({ isLoading: {...this.state.isLoading, updateDetails: false} });\r\n // // $.magnificPopup.close();\r\n // });\r\n // }\r\n\r\n setDispatchDate = date => {\r\n this.setState({\r\n quote: {\r\n ...this.state.quote,\r\n PreferredDispatchDate: date\r\n }\r\n })\r\n }\r\n\r\n validateForm = (event) => {\r\n event.preventDefault()\r\n\r\n const noPurchaseNumber = this.state.purchaseNumber.length === 0 ? true : false\r\n const noAttachedPO = this.state.attachedPO.length === 0 ? true : false\r\n\r\n if (!this.state.userData.UserIsContractor && (noPurchaseNumber || noAttachedPO)) {\r\n this.setState({\r\n validation: {\r\n ...this.state.validation,\r\n purchaseOrderNumber: noPurchaseNumber,\r\n noAttachedPO: noAttachedPO\r\n }\r\n })\r\n } else {\r\n this.setState({\r\n showConfirmationModal: true,\r\n validation: {\r\n ...this.state.validation,\r\n purchaseOrderNumber: false\r\n }\r\n })\r\n }\r\n }\r\n\r\n hideConfirmationModal() {\r\n this.setState({ showConfirmationModal: false }, () => jQuery('.app__body-content').animate({ scrollTop: 0 }, 'fast'))\r\n\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n async downloadDrawings() {\r\n let drawingsDownloaded = 0\r\n const numberOfDrawings = this.state.drawings.length\r\n const token = localStorage.getItem('token')\r\n \r\n const downloadDrawing = async (drawing) => {\r\n const downloadURL = `${apiUrlGetDocument}/${drawing.ItemGUID}`\r\n const response = await fetch(downloadURL, {\r\n headers: {\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n })\r\n const blob = await response.blob()\r\n const url = window.URL.createObjectURL(blob)\r\n \r\n let contentDisposition = response.headers.get('Content-Disposition')\r\n // Remove all quotes \" from the contentDisposition, as some .NET behaviour adds them \r\n // it's because of the special characters \"(\" and \")\" in case of the project names with brackets\r\n contentDisposition = contentDisposition.replace(/\"/g, '')\r\n let filename = 'download.pdf'\r\n if (contentDisposition && contentDisposition.includes('attachment')) {\r\n const matches = /filename=([^;]+)/.exec(contentDisposition)\r\n if (matches && matches[1]) {\r\n filename = matches[1]\r\n }\r\n }\r\n \r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = filename\r\n a.click()\r\n window.URL.revokeObjectURL(url)\r\n \r\n analyticsDataLayer.downloadLayout({\r\n \"document_id\": drawing.ItemGUID,\r\n \"document_name\": \"Download Drawings\",\r\n \"document_type\": \"pdf\"\r\n })\r\n }\r\n \r\n const downloadNext = async () => {\r\n if (drawingsDownloaded < numberOfDrawings) {\r\n await downloadDrawing(this.state.drawings[drawingsDownloaded])\r\n drawingsDownloaded++\r\n setTimeout(downloadNext, 500)\r\n }\r\n }\r\n \r\n downloadNext()\r\n }\r\n\r\n handleWholsalerSendQuoteChange(wholesalerBranchID) {\r\n const indexOfAlreadySelectedWholeseler = this.state.wholesalersToSendQuote.indexOf(wholesalerBranchID)\r\n let wholesalersArray = this.state.wholesalersToSendQuote\r\n\r\n if (indexOfAlreadySelectedWholeseler > -1) {\r\n wholesalersArray.splice(indexOfAlreadySelectedWholeseler, 1)\r\n } else {\r\n wholesalersArray.push(wholesalerBranchID)\r\n }\r\n\r\n this.setState({ wholesalersToSendQuote: wholesalersArray })\r\n }\r\n\r\n saveProject = (event) => {\r\n event.preventDefault()\r\n\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, placeOrderApi: true },\r\n quote: { ...this.state.quote, QuoteCustomerMarkupPercent: this.state.QuoteCustomerMarkupPercent } // Save eventually changed margin on the front-end\r\n }, () => {\r\n const saveProjectRequestObj = cloneDeep(this.state.quote)\r\n saveProjectRequestObj['PurchaseNumber'] = this.state.purchaseNumber\r\n saveProjectRequestObj['DontResetQuote'] = true\r\n\r\n apiCallsResidential.apiSave(saveProjectRequestObj)\r\n .then(() => {\r\n // Once we save the project we submit the order for the contractor\r\n this.submitOrder()\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n })\r\n }\r\n\r\n sendEmailCustomerQuote = (event) => {\r\n event.preventDefault()\r\n\r\n this.setState({ isLoading: { ...this.state.isLoading, emailQuote: true } })\r\n\r\n // Before we send an email we need to save provided customer data by calling Project quote API\r\n apiCallsResidential.apiGenerateQuote(this.state.projectID, this.state.preferredWholesalerID,\r\n this.state.QuoteCompanyName,\r\n this.state.QuoteCustomerName,\r\n '',\r\n '',\r\n this.state.QuoteCustomerEmail,\r\n '',\r\n this.state.QuoteCustomerMarkupPercent)\r\n .then(quoteData => {\r\n this.setState({\r\n quote: quoteData\r\n })\r\n\r\n apiCallsResidential.apiEmailQuote(this.state.quote.ItemID, true)\r\n .then(() => {\r\n this.setState({ pageInfo: 'Quote email sent successfully.' })\r\n\r\n analyticsDataLayer.emailQuote({\r\n quote_id: `${this.state.projectID}`,\r\n quote_name: \"Send Quote\",\r\n currency: \"AUD\",\r\n total_amount: quoteData.CustomerQuoteCentsIncGST / 100,\r\n markup_percentage: `${this.state.QuoteCustomerMarkupPercent - 100}%`\r\n })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: { ...this.state.isLoading, emailQuote: false } })\r\n this.hideEmailCustomerQuote()\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n submitOrder() {\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, placeOrderApi: true }\r\n })\r\n\r\n apiCallsResidential.apiSendOrder(this.state.projectID)\r\n .then(() => {\r\n this.hideConfirmationModal()\r\n\r\n\r\n // Please refer to the corresponding code in the commercial FlexSelect\r\n // To better understand why these events are passed in the way they are\r\n let projectBoards = []\r\n let newProjectBoardDetails = []\r\n this.state.quote.ProjectBoards.forEach(board => {\r\n board.BoardBOMComponents.forEach(item => {\r\n const baseEventDetails = {\r\n 'item_id': item.ItemCode,\r\n 'item_name': item.Description,\r\n 'item_brand': 'FlexSelect',\r\n 'item_category': item.Category,\r\n 'item_variant': '',\r\n 'price': item.Price,\r\n 'quantity': item.Quantity\r\n }\r\n\r\n projectBoards.push({\r\n ...baseEventDetails,\r\n item_board_name: board.Name,\r\n item_board_id: board.ItemID.toString()\r\n })\r\n\r\n newProjectBoardDetails.push({\r\n ...baseEventDetails,\r\n configuration_name: board.Name,\r\n configuration_id: board.ItemID.toString()\r\n })\r\n })\r\n })\r\n\r\n analyticsDataLayer.purchase({\r\n 'currency': 'AUD',\r\n 'transaction_id': this.state.quote.ProjectNumberReadOnly,\r\n 'value': this.state.quote.QuoteCentsIncGST / 100,\r\n 'project_type': 'Residential',\r\n 'project_name': this.state.quote.Title,\r\n 'project_id': this.state.quote.ItemID.toString(),\r\n 'tax': this.state.quote.QuoteCentsGST ? this.state.quote.QuoteCentsGST / 100 : 0,\r\n 'order_number': this.state.purchaseNumber,\r\n 'items': projectBoards\r\n })\r\n\r\n analyticsDataLayer.addToCart({\r\n 'currency': 'AUD',\r\n 'value': this.state.quote.QuoteCentsIncGST / 100,\r\n 'project_type': 'Residential',\r\n 'project_name': this.state.quote.Title,\r\n 'project_id': this.state.quote.ItemID.toString(),\r\n 'order_number': this.state.purchaseNumber,\r\n 'items': newProjectBoardDetails\r\n }, 'place order')\r\n\r\n // After the order is placed we redirect the user back to the project details, that page at this stage should indicate completly \r\n // different state\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS_RESIDENTIAL + '?orderID=' + this.state.projectID)\r\n })\r\n .catch(error => {\r\n this.hideConfirmationModal()\r\n\r\n this.setState({\r\n isLoading: { ...this.state.isLoading, placeOrderApi: false },\r\n apiError: error.message\r\n })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n // Send email to each wholesaler selected\r\n requestWholesalersQuote() {\r\n this.setState({ apiError: '' })\r\n\r\n if (this.state.wholesalersToSendQuote.length === 0) {\r\n this.setState({ apiError: 'You need to select at least one wholesaler to request a quote' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n } else {\r\n this.setState({ isLoading: { ... this.state.isLoading, emailQuote: true } })\r\n\r\n apiCallsResidential.apiEmailQuote(this.state.quote.ItemID, false, this.state.wholesalersToSendQuote)\r\n .then(() => {\r\n // After sending a quote to one or multiple wholselers we need to display a message and show \"Proceed with production\" section\r\n this.setState({ hasRequestedEmailQuote: true, contractorRequestAgain: true })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: { ... this.state.isLoading, emailQuote: false } })\r\n window.setTimeout(() => this.setState({ hasRequestedEmailQuote: false }), 2500)\r\n })\r\n }\r\n }\r\n\r\n changeWholesalerMargin(increase) {\r\n let margin = 0\r\n if (increase) {\r\n margin = this.state.QuoteCustomerMarkupPercent + 1\r\n } else {\r\n margin = this.state.QuoteCustomerMarkupPercent - 1\r\n }\r\n\r\n this.setState({ QuoteCustomerMarkupPercent: margin })\r\n }\r\n\r\n renderOrderItemTable(quote, quoteValue100, isSwitchManOrLargeContractor) {\r\n return !this.state.userData.UserIsContractor &&\r\n
    \r\n
    \r\n
    \r\n {isSwitchManOrLargeContractor ?\r\n
    \r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n \r\n
    :\r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n }\r\n
    \r\n
    \r\n
    \r\n Boards\r\n
    \r\n
    \r\n Price (Ex GST)\r\n
    \r\n
    \r\n GST\r\n
    \r\n
    \r\n Total Cost (Inc. GST)\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    \r\n Margin\r\n
    \r\n \r\n\r\n {/* TODO@Adam : add logic here also when user clicks on 'margin-control__amount' add 'is-active' and also focus input when user clicks out remove 'is-active' */}\r\n
    \r\n \r\n {this.state.QuoteCustomerMarkupPercent - 100}%\r\n \r\n {/*
    \r\n \r\n
    */}\r\n
    \r\n\r\n \r\n
    \r\n
    : null}\r\n
    \r\n\r\n {quote.ProjectBoards.map(board => {\r\n const boardValues = this.getDisplayQuoteValues(board)\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {board.Name}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n {board.QuoteDiscountedCentsExGST ? (\r\n \r\n {this.renderCurrency(boardValues.exGST)}\r\n Was {this.renderCurrency(boardValues.orgExGST)}\r\n \r\n ) : (\r\n this.renderCurrency(boardValues.exGST)\r\n )}\r\n
    \r\n
    \r\n {this.renderCurrency(boardValues.GST)}\r\n
    \r\n
    \r\n {this.renderCurrency(boardValues.incGST)}\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    \r\n {this.renderCurrency(boardValues.incGST * this.state.QuoteCustomerMarkupPercent / 100)}\r\n \r\n {this.renderCurrency((boardValues.incGST * this.state.QuoteCustomerMarkupPercent / 100) - boardValues.incGST)} (Margin)\r\n \r\n
    : null}\r\n
    \r\n )\r\n })}\r\n\r\n
    \r\n
    \r\n
    \r\n \r\n Total\r\n \r\n \r\n \r\n\r\n
    \r\n \r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {this.renderCurrency(quoteValue100.exGST)}\r\n
    \r\n
    \r\n {this.renderCurrency(quoteValue100.GST)}\r\n
    \r\n
    \r\n {this.renderCurrency(quoteValue100.incGST)}\r\n
    \r\n {!isSwitchManOrLargeContractor ?\r\n
    \r\n {this.renderCurrency(quoteValue100.incGST * this.state.QuoteCustomerMarkupPercent / 100)}\r\n \r\n {this.renderCurrency((quoteValue100.incGST * this.state.QuoteCustomerMarkupPercent / 100) - quoteValue100.incGST)} (Margin)\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 renderMarkup(isSwitchManOrLargeContractor) {\r\n if (!isSwitchManOrLargeContractor) {\r\n return ` (${this.state.QuoteCustomerMarkupPercent - 100}% Mark-up)`;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n render() {\r\n if (this.state.isLoading.app) {\r\n return (\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n Generating Quote\r\n
    \r\n
    \r\n
    )\r\n } else {\r\n\r\n const isSwitchManOrLargeContractor = ['SwitchboardManufacturer', 'LargeContractor'].includes(this.state.userData.UserTypeString)\r\n const quote = this.state.quote\r\n const quoteValue = this.getCustomerDisplayQuoteValues(quote)\r\n const quoteValue100 = this.getDisplayQuoteValues(quote)\r\n\r\n return (\r\n \r\n
    \r\n\r\n {\r\n this.state.isLoading.placeOrderApi &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Placing Order\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.isLoading.emailQuote &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Sending Quote\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.hasRequestedEmailQuote &&\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Quote sent\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {/* Email Quote */}\r\n {this.state.showEmailCustomerQuoteModal &&\r\n \r\n
    \r\n
    \r\n
    \r\n

    \r\n For the amount of \r\n {this.renderCurrency(quoteValue100.incGST * (isSwitchManOrLargeContractor ? this.state.QuoteCustomerMarkupPercent : 100) / 100)}\r\n {this.renderMarkup(isSwitchManOrLargeContractor)}\r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.setState({ QuoteCustomerName: event.target.value })} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.setState({ QuoteCompanyName: event.target.value })} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.setState({ QuoteCustomerEmail: event.target.value })} />\r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n }\r\n\r\n {/* Confirm Order */}\r\n {\r\n this.state.showConfirmationModal &&\r\n \r\n
    \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition1Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition2Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition3Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition4Accepted: event.target.checked })} />\r\n \r\n
    \r\n
    \r\n this.setState({ orderPlacementCondition5Accepted: event.target.checked })} />\r\n \r\n
    \r\n {/*
    \r\n this.setState({ orderPlacementCondition6Accepted: event.target.checked }) } />\r\n \r\n
    */}\r\n
    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n }\r\n\r\n {/* Item Breakdown */}\r\n {\r\n this.state.showBreakdown &&\r\n \r\n {this.renderProjectBoardModals(this.state.selectedBoard)}\r\n\r\n

    \r\n *5 days standard lead time\r\n

    \r\n \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n My Residential Projects\r\n \r\n \r\n \r\n \r\n \r\n {this.state.pageInfo}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.apiError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.apiError}\r\n \r\n

    \r\n }\r\n
    \r\n\r\n {this.state.userData.IsConsultant &&\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n Boards\r\n
    \r\n
    \r\n\r\n {quote.ProjectBoards.map(board => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {board.Name}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n })}\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n\r\n {/* All cases that are not consultants */}\r\n {!this.state.userData.IsConsultant &&\r\n
    \r\n\r\n {/* Table view for contractors */}\r\n {\r\n this.state.userData.UserIsContractor &&\r\n
    \r\n
    \r\n
    \r\n

    \r\n \r\n {quote.Title}\r\n \r\n \r\n {quote.ProjectNumberReadOnly}\r\n \r\n

    \r\n\r\n

    Retail Pricing

    \r\n

    Please note this is RRP, please request a quote from your wholesaler to confirm the cost

    \r\n\r\n
    \r\n
    \r\n
    \r\n Boards\r\n
    \r\n\r\n
    \r\n RRP (Inc. GST)\r\n
    \r\n
    \r\n\r\n {quote.ProjectBoards.map(board => {\r\n const boardValues = this.getCustomerDisplayQuoteValues(board)\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {board.Name}\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {this.renderCurrency(boardValues.incGST)}\r\n
    \r\n
    \r\n )\r\n })}\r\n\r\n
    \r\n
    \r\n
    \r\n \r\n Total\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n {this.renderCurrency(quoteValue.incGST)}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n {/* Table view for Wholeselers and Switch Board Manufacturers and hide the Sell price option for SwitchMan and LargeContractor */}\r\n {this.renderOrderItemTable(quote, quoteValue100, isSwitchManOrLargeContractor)}\r\n\r\n
    \r\n
    \r\n

    Review

    \r\n\r\n \r\n\r\n {\r\n this.state.userData.UserIsContractor &&\r\n
    \r\n {\r\n !this.state.contractorRequestAgain &&\r\n
    \r\n

    \r\n Request Quote\r\n\r\n \r\n

    \r\n\r\n

    \r\n Select the wholesalers to request a quote\r\n

    \r\n\r\n
    \r\n
    \r\n {\r\n this.state.userData.PreferredWholesalers.map(wholesaler => {\r\n return (\r\n
    \r\n -1}\r\n onChange={() => { this.handleWholsalerSendQuoteChange(wholesaler.WholesalerBranchID) }} />\r\n\r\n \r\n
    \r\n )\r\n })\r\n }\r\n
    \r\n\r\n \r\n
    \r\n
    \r\n }\r\n\r\n {\r\n this.state.contractorRequestAgain &&\r\n
    \r\n\r\n

    \r\n \r\n
    \r\n \r\n
    \r\n \r\n Quotes requested\r\n \r\n
    \r\n \r\n

    \r\n

    \r\n Proceed with production\r\n

    \r\n

    \r\n Once you have an agreed price set with your Wholesaler\r\n

    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n\r\n \r\n
    \r\n
    \r\n\r\n \r\n\r\n
    \r\n
    \r\n }\r\n
    \r\n }\r\n\r\n {\r\n !this.state.userData.UserIsContractor &&\r\n \r\n

    Proceed with production

    \r\n

    \r\n Lead times are 5 days to dispatch for most selections\r\n

    \r\n\r\n
    \r\n \r\n\r\n
    \r\n \r\n this.setState({ purchaseNumber: event.target.value })} />\r\n Please enter a Purchase Order Number\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\r\n this.state.attachedPO === '' ?\r\n Upload Purchase Order\r\n :\r\n File attached\r\n }\r\n \r\n
    \r\n\r\n Please upload a Purchase Order\r\n
    \r\n\r\n

    \r\n For the amount of \r\n {this.renderCurrency(quoteValue100.incGST * this.state.QuoteCustomerMarkupPercent / 100)}\r\n \r\n

    \r\n\r\n \r\n \r\n
    \r\n }\r\n
    \r\n\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default withRouter(Quote)","import React, { Component } from 'react'\r\nimport HeaderLogo from '../../components/header-logo/HeaderLogo'\r\nimport Header from '../../components/header/Header'\r\n\r\nconst FAQs = [\r\n {\r\n question: 'Can we meet customers DB ‘smoke seal’ requirements with Flexselect?',\r\n answer: 'AS/NZS3000 has a requirement of IP5X against the spread of smoke from a switchboard. Flexselect boards come in IP42 and IP66, the IP66 board would meet this requirement.'\r\n },\r\n {\r\n question: 'Are we able to offer a DB locking solution for Schools, Mines, and PWD locks with Flexselect?',\r\n answer: 'IP66 boards have an option of a ‘padlockable handle’ this way customers can use their own padlocks in the above situations.'\r\n }, {\r\n question: 'Do Flexselect boards offer a separate BMS section which does not require moving the escutcheon?',\r\n answer: 'Flexselect offer a polycarbonate enclosure on the side of the board for easy access. Board is predrilled but enclosure is supplied loose to avoid damage in transit.'\r\n }, {\r\n question: 'CanFlexselect boards be offered with NMI meters?',\r\n answer: 'Flexselect has 3 metering options, Dual meter, power meter (PM3255) and NMI certified meter (EM3255-NMI)'\r\n }, {\r\n question: 'Does Flexselect come in marine grade stainless steel?',\r\n answer: 'The standard rangeof Flexselect are offered in mild steelbut we also offer Flexselect in 316 Stainless Steel with a slightly longer lead time.'\r\n }, {\r\n question: 'Are Flexselect boards offered as61439.2 compliant?',\r\n answer: 'The Flexselect tool calculates watts loses and Ina as you load the board with breakers, this is only a small part of 61439.2 complianceso a certificate of compliance is supplied with the final drawings.'\r\n }, {\r\n question: 'Can Flexselect boards be offered with both 18mm and 27mm pitch breakers?',\r\n answer: 'Hybrid chassis (fits both 18mm and 27mm pitchbreakers) are an option in Flexselect.'\r\n }, {\r\n question: 'I need aboard on site next week, is this possible with Flexselect?',\r\n answer: 'The standard dispatch time for Flexselect boards is 5 days dependent on sheet metal and component availability.'\r\n }, {\r\n question: 'Are Isobar chassis and option in Flexselect?',\r\n answer: 'Schneider’s isolation chassis is available in Flexselect.'\r\n }, {\r\n question: 'I need 3x boards on site every week for the next 4 weeks for a total of 12x boards, is this order suitable for Flexselect?',\r\n answer: 'With Flexselect up to 20x boards can be ordered at a time. The first 4x boards will be dispatched in 5 days with the remainder of 8x boards dispatching over the following 3 weeks.Depending on stock availability.'\r\n }, {\r\n question: 'Do my Flexselect boards come with the standard 1 year Schneider warranty?',\r\n answer: 'As per Schneiders standard terms and conditions Flexselect boards come with1 year warranty.'\r\n }, {\r\n question: 'Is my Flexselect board supplied with a test report and certificate of compliance to 61439.2?',\r\n answer: 'All Flexselect boards are issued with a QR code on the outside of the door. Once the customer has scanned this code and request transfer of the digital asset,they will have access to the drawings, test repots, 61439.2 documentation and data sheets for all components supplied in the board.'\r\n }\r\n]\r\n\r\nconst RESIDENTIALFAQS = [\r\n {\r\n question: 'What are the benefits of using FlexSelect for loaded boards?',\r\n answer: ``\r\n },\r\n {\r\n question: 'Are the FlexSelect loaded boards supplied with complete wiring done?',\r\n answer: 'Clipsal by Schneider Electric only loads the breakers in the boards and connects the busbar to them as per the user’s selection. It is the responsibility of Licensed electrician to make sure that the products selected are suitable for their applications. Before powering up the board, a licensed electrician must also check all the busbar connections to make sure the connection hasn’t come loose during transportation and handling.'\r\n }, {\r\n question: 'What are recommended applications for FlexSelect residential?',\r\n answer: 'FlexSelect loaded boards under ‘Residential’ category are more suitable for applications where electrician needs multiple plastic enclosure with similar configuration. An example of that could be a big apartment building where the user might only have single digit variations of plastic enclosures.'\r\n }, {\r\n question: 'Is there any minimum order qty for ordering load centres using FlexSelect?',\r\n answer: 'Minimum order quantity of 30 boards only applies to the total number of boards in a project. Without a minimum qty of 30 boards in one project (hence in 1 order) the user can’t proceed to view the quote or place an order using FlexSelect residential. User might have different type of board configurations in a project but the total of these various configurations in a project must be equal to or more than 30.'\r\n }, {\r\n question: 'Are the circuit ID labels attached to the front cover of enclosure?',\r\n answer: 'No the circuit ID labels are not attached to the front cover of enclosure. If there are circuit ID labels inside the board commercial reference, then the same circuit ID labels are repacked inside the load centres. In some cases, the user might need to order extra circuit ID labels through their wholesaler or e-commerce partner.'\r\n }, {\r\n question: 'How do I know if the product that I am selecting is a Resi MAX or MAX9 product? ',\r\n answer: 'You can work this out by looking at the kA rating of the breakers when you click on ‘Add Breaker’ option. Resi MAX products are 4.5kA rated and MAX9 products are 6kA rated (see below image)'\r\n }, {\r\n question: 'What are the busbar options available for Clipsal RCBOs',\r\n answer: ''\r\n }, {\r\n question: 'What is the recommended product selection procedure/sequence for loaded boards in FlexSelect?',\r\n answer: ''\r\n }, {\r\n question: 'Is neutral terminal block added with top feeding busbar switching neutral?',\r\n answer: 'Yes, the neutral terminal block is added automatically to the product layout as soon as you choose top mounted busbar option for a row with main incomer switch. Please note that this neutral terminal block is a solid neutral link and doesn’t switch the neutral.'\r\n }, {\r\n question: 'What are the benefits of selecting extra poles when selecting busbars?',\r\n answer: 'When you are making your selections for busbars by clicking on ‘Busbar’ button, you will notice that there is an option of extra poles. By selecting the number of extra poles that you need, you can request a longer length of busbar that will overhang the unoccupied poles in that row of the board. This helps you to make your board future ready….if you need to add more RCBO’s in future then you can just remove the tooth cover and add the device.'\r\n }\r\n]\r\nexport class TechnicalInformation extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n isCommercial: true,\r\n selectedProjectTypeForCreation: 'commercial'\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n\r\n
    \r\n
    \r\n

    \r\n Technical Information\r\n \r\n

    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n\r\n {this.state.isCommercial &&\r\n
    \r\n
    \r\n

    \r\n MAIN SWITCH\r\n

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

    \r\n Switch disconnector CVS250NA
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n

    \r\n NSX100F TM-D (36kA at 415V) molded case circuit breaker
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n

    \r\n NSX160F TM-D (36kA at 415V) molded case circuit breaker
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n

    \r\n NSX250F TM-D (36kA at 415V) molded case circuit breaker
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n POWER METERS\r\n

    \r\n
    \r\n

    A9MEM3255-NMI

    \r\n

    \r\n Electrical Parameters (kWh (4Q), kVArh, I, U, F, P, Q, S, PF)
    \r\n kWh Accuracy Class 0.5S
    \r\n Modbus RS485 communication
    \r\n 1 DI, 1 DO - Over Load alarm or Energy pulsing
    \r\n Multi-tariff (max 4 tariffs)
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n

    METSEEMD461R

    \r\n

    \r\n Dual load multifunction energy meter
    \r\n Quick-connect CTs
    \r\n Electrical Parameters (kWh, kVArh, I, U, F, P, Q, S, PF)
    \r\n kWh Accuracy Class 1
    \r\n Modbus RS485 communication
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n

    METSEPM3255

    \r\n

    \r\n 3-phase PM3200 DIN-mount Power meter (5A external CTs)
    \r\n kWh (4Q), kVArh, I, U, F, P, Q, S, PF, P&I demand, THD V&I
    \r\n Class 0.5S
    \r\n Modbus RS485 communication
    \r\n

    \r\n Technical Data Sheets\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n

    \r\n RESIDUAL CIRCUIT DEVICES (RCBOS) – 30mA, 6kA or 10kA, C CURVE\r\n

    \r\n

    \r\n The single-phase iC60N (6kA) and iC60H (10kA) RCBO’s self-contained residual current device provides protection of final circuits:
    \r\n\r\n

    \r\n\r\n

    \r\n protection against short circuits and cable overloads
    \r\n protection against electrocution by direct contact.
    \r\n

    \r\n\r\n

    \r\n The neutral is not interrupted when the device is tripped. Conforms to AS/NZS 61009.1
    \r\n

    \r\n Product range\r\n \r\n
    \r\n\r\n
    \r\n

    \r\n MINIATURE CIRCUIT BREAKERS (MCBS) – 6kA or 10kA, C CURVE\r\n

    \r\n

    \r\n iC60N (6kA) and iC60H (10kA) circuit breakers are multi-standard circuit breakers which combine the following functions:
    \r\n

    \r\n

    \r\n circuit protection against short circuit currents
    \r\n circuit protection against overload currents
    \r\n suitable for industrial isolation according to IEC/EN 60947-2
    \r\n fault tripping indication by a red mechanical indicator in circuit breaker front face.
    \r\n

    \r\n\r\n Product range\r\n \r\n
    \r\n
    \r\n\r\n }\r\n\r\n {!this.state.isCommercial &&\r\n
    \r\n
    \r\n

    \r\n MAX9â„¢ - The Ultimate residential solution with MAX performance.\r\n

    \r\n

    \r\n This optimum range covers wide range of circuit protection needs for both single phase and multi phase installations. It provides SLIM RCBOs with earth leakage sensitivity of 30mA and 10mA, Super Immune RCBOs, Main switches, Miniature circuit breakers (MCBs), Surge Protection Devices (SPD), Contactors, Energy Management by Wiser solution, Premium plastic enclosures with robust construction and generous wiring space and accessories to cover all your needs. Circuit breakers and RCBOs in this range are rated at short circuit breaking capacity of 6kA.\r\n

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

    \r\n Resi MAXâ„¢ - Everyday essential needs for residential circuit protection.\r\n

    \r\n

    \r\n The Clipsal Resi MAXâ„¢ range offers a variety of consumer switchboards, SLIM RCBOs, miniature circuit breakers (MCB), Surge protection device (SPD), safety switches (RCD), comb busbars and accessories. SLIM RCBOs and MCBs have short circuit breaking capacity rating of 4.5kA, it achieves a 6kA rating when combined with the HRC service fuse of up to 100A rating.\r\n

    \r\n\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n\r\n {this.state.isCommercial &&\r\n
    \r\n
    \r\n

    \r\n Frequently Asked questions\r\n

    \r\n
    \r\n
    \r\n
    Learn how to configure and order your distribution boards
    \r\n \r\n
    \r\n
    \r\n {FAQs.map((faq, index) => {\r\n return (\r\n
    \r\n
    \r\n {faq.question}\r\n
    \r\n
    \r\n {faq.answer}\r\n
    \r\n
    \r\n )\r\n })\r\n }\r\n
    \r\n
    \r\n }\r\n\r\n {!this.state.isCommercial &&\r\n
    \r\n
    \r\n

    \r\n Frequently Asked questions\r\n

    \r\n
    \r\n
    \r\n
    Learn how to configure and order your distribution boards
    \r\n \r\n
    \r\n
    \r\n {RESIDENTIALFAQS.map((faq, index) => {\r\n if (index === 0) {\r\n return (\r\n
    \r\n
    \r\n {faq.question}\r\n
    \r\n
    \r\n
    \r\n

    Some of the key benefits of using FlexSelect for loaded boards are:

    \r\n
      \r\n
    • Flexibility of customizing the layout of devices in a board as per your preference
    • \r\n
    • Manage both chassis boards and loaded boards using FlexSelect gives the user the option of managing the complete project in one location
    • \r\n
    • Faster installation on site as the boards come loaded with breakers and busbars based on your selection
    • \r\n
    • Less packaging waste on-site to dispose of
    • \r\n
    • Faster turnaround on quotes for projects and delivery times of loaded boards
    • \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n } else if (index === 5) {\r\n return (\r\n
    \r\n
    \r\n {faq.question}\r\n
    \r\n
    \r\n
    \r\n

    You can work this out by looking at the kA rating of the breakers when you click on ‘Add Breaker’ option. Resi MAX products are 4.5kA rated and MAX9 products are 6kA rated (see below image)

    \r\n
    \r\n \"\"\r\n
    \r\n

    In case of selecting surge protection, Resi MAX SPD 20kA maximum discharge capacity and MAX9 SPDs have 40kA maximum discharge capacity.

    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n } else if (index === 6) {\r\n return (\r\n
    \r\n
    \r\n {faq.question}\r\n
    \r\n
    \r\n
    \r\n

    There are 2 options for busbar selections for RCBOs:

    \r\n
      \r\n
    • Top mounted busbar – This is MAX9 MAXBAR and it connects to all type of Clipsal RCBOs, it distributes both active & neutral to all RCBOs (no need for terminating flying neutral leads) and it can connect directly to the main incomer.
    • \r\n
    • Bottom mounted busbar – These are Resi MAX SLIM comb busbars and can only connect SLIM RCBOs together…doesn’t connect to other type of RCBOs. This busbar also distributes both active & neutral to the SLIM RCBOs but doesn’t connect to main switch. You will need to bring in the active and neutral feed to these busbars using right size cables and connectors.
    • \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n } else if (index === 7) {\r\n return (\r\n
    \r\n
    \r\n {faq.question}\r\n
    \r\n
    \r\n
    \r\n

    Ideally, we would recommend the below sequence for selecting products using FlexSelect for loaded boards:

    \r\n
      \r\n
    • Choose the type (Surface/Flush) & size of your enclosure
    • \r\n
    • Select the main incomer type (Isolator switch or MCB), number of poles, and the ratings of the main incomer suitable for your application
    • \r\n
    • Decide if you need an SPD or not in your board
    • \r\n
    • Add breakers (MCB, RCD, RCBO, AFDD, etc.) to your board in your preferred location
    • \r\n
    • Add busbars (top or bottom connection) to all the rows of boards that you would like to connect to
    • \r\n
    • Add any ‘Additional items’ like contactors & DIN mounted socket outlets
    • \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n } else {\r\n return (\r\n
    \r\n
    \r\n {faq.question}\r\n
    \r\n
    \r\n {faq.answer}\r\n
    \r\n
    \r\n )\r\n }\r\n })}\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\n\r\nexport class SvgFlexSelectLogo extends Component {\r\n 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 }\r\n}\r\n","import React, { Component } from 'react'\r\n\r\nexport class SvgLifeIsOnSchneiderElectric extends Component {\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\n\r\nexport class SvgChevronLeft extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n\r\n","import React, { Component } from 'react'\r\n\r\nexport class SvgChevronRight extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { SvgFlexSelectLogo } from '../svg/SvgFlexSelectLogo'\r\nimport { SvgLifeIsOnSchneiderElectric } from '../svg/SvgLifeIsOnSchneiderElectric'\r\nimport { SvgChevronLeft } from '../svg/SvgChevronLeft'\r\nimport { SvgChevronRight } from '../svg/SvgChevronRight'\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\n\r\nexport class RegisterSide extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n totalSlides: 3,\r\n currentSlide: 0\r\n }\r\n }\r\n\r\n findOutMore = () => {\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Find out more',\r\n cta_link: '',\r\n cta_location: 'Registration'\r\n })\r\n\r\n this.handleNextSlide()\r\n }\r\n\r\n handleNextSlide = () => {\r\n this.setState(prevState => ({\r\n currentSlide: prevState.currentSlide + 1\r\n }))\r\n }\r\n\r\n handlePrevSlide = () => {\r\n this.setState(prevState => ({\r\n currentSlide: prevState.currentSlide - 1\r\n }))\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","export const userTypes = [\r\n {\r\n name: 'Wholesaler',\r\n type: 'Wholesaler',\r\n icon: 'i-wholesaler',\r\n isEnable: true\r\n },\r\n {\r\n name: 'Switchboard Manufacturer',\r\n type: 'SwitchboardManufacturer',\r\n icon: 'i-switchboard-m',\r\n isEnable: true\r\n },\r\n {\r\n name: 'Contractor',\r\n type: 'Electrician',\r\n icon: 'i-contractor',\r\n isEnable: true\r\n },\r\n {\r\n name: 'Consultant',\r\n type: 'Consultant',\r\n icon: 'i-consultant',\r\n isEnable: true\r\n },\r\n {\r\n name: 'LargeContractor',\r\n type: 'LargeContractor',\r\n icon: 'i-contractor',\r\n isEnable: false\r\n }\r\n]","import React, { Component } from 'react'\r\nimport { Link } from 'react-router-dom'\r\nimport { RegisterSide } from '../../components/registerSide/RegisterSide'\r\nimport { apiGetLoginSSO } from '../../utils/apiCalls'\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\nimport { userTypes } from '../../data/userTypes'\r\nexport class Home extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n ssoLoginURL: '',\r\n pageError: ''\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const urlParams = new URLSearchParams(window.location.search)\r\n const error = urlParams.get('error')\r\n \r\n if (error) {\r\n this.setState({\r\n pageError: error\r\n })\r\n\r\n // Remove the error from the URL\r\n window.history.replaceState({}, document.title, window.location.pathname)\r\n }\r\n\r\n apiGetLoginSSO()\r\n .then((url) => {\r\n this.setState({\r\n ssoLoginURL: url\r\n })\r\n })\r\n }\r\n\r\n onLoginButtonClick = (event) => {\r\n // Keep values the same as existing solution where cta_link is hardcoded\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Login',\r\n cta_link: 'https://secureidentity.schneider-electric.com/identity/setup/secur/RemoteAccessAuthorizationPage.apexp',\r\n cta_location: 'Registration'\r\n })\r\n }\r\n\r\n startRegistrationEvent = (userType) => {\r\n // Only Electrician (ex contractor has 3 steps in the registration form)\r\n if (userType === 'Electrician') {\r\n analyticsDataLayer.registrationStep(1, 3)\r\n } else {\r\n analyticsDataLayer.registrationStep(1, 2)\r\n }\r\n }\r\n\r\n 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 Register \r\n

    \r\n
    \r\n \r\n Already have a FlexSelect account?\r\n \r\n this.onLoginButtonClick(e)}>\r\n Login\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {\r\n this.state.pageError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.pageError}\r\n \r\n

    \r\n }\r\n\r\n
    \r\n\r\n
    \r\n \r\n
    \r\n\r\n {/* */}\r\n
    \r\n {userTypes.flatMap((userType, index) => {\r\n if (!userType.isEnable) return []\r\n return [(\r\n this.startRegistrationEvent(userType.type)}>\r\n \r\n \r\n \r\n \r\n {userType.name}\r\n \r\n \r\n \r\n \r\n \r\n )]}\r\n )}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { createPortal } from 'react-dom'\r\n\r\nexport class Portal extends Component {\r\n render() {\r\n const { children } = this.props;\r\n return createPortal(<>{children}, document.body);\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\n\r\nexport class SvgLocation extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Portal } from '../portal/Portal'\r\nimport { SvgLocation } from '../svg/SvgLocation'\r\nimport { apiWholesalerSearch } from '../../utils/apiCallsCommercial'\r\nimport { debounce } from 'lodash'\r\nexport class InputwholesalersLookUp extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n if (!!props.existingWholesalerData) {\r\n console.log(props.existingWholesalerData)\r\n this.state = {\r\n isOpen: false,\r\n isDirty: false,\r\n list: [],\r\n selectedBranchName: props.existingWholesalerData.WholesalerBranchName,\r\n selectedWholesalerBranchID: props.existingWholesalerData.WholesalerBranchID,\r\n latitude: null,\r\n longitude: null,\r\n isPending: false\r\n }\r\n } else {\r\n this.state = {\r\n isOpen: false,\r\n isDirty: false,\r\n list: [],\r\n selectedBranchName: '',\r\n selectedWholesalerBranchID: null,\r\n latitude: null,\r\n longitude: null,\r\n isPending: false\r\n }\r\n }\r\n }\r\n\r\n toggleFlyout = () => {\r\n this.setState({ isOpen: !this.state.isOpen })\r\n }\r\n\r\n handleSearch = () => {\r\n const term = document.getElementById('search-wholesalers-input').value\r\n const { latitude, longitude } = this.state\r\n this.setState({ isPending: true })\r\n\r\n apiWholesalerSearch({\r\n SearchText: term,\r\n Latitude: latitude,\r\n Longitude: longitude\r\n })\r\n .then(response => {\r\n this.setState({ list: response })\r\n })\r\n .catch(error => {\r\n window.alert(`Failed to fetch wholesalers: ${error.message}`)\r\n })\r\n .finally(() => {\r\n this.setState({ isDirty: true })\r\n this.setState({ isPending: false })\r\n })\r\n }\r\n\r\n handleGeoSearch = (e) => {\r\n if (!navigator.geolocation || (this.state.latitude != null && !this.state.longitude != null)) {\r\n this.handleSearch()\r\n return\r\n }\r\n\r\n navigator.geolocation.getCurrentPosition(position => {\r\n this.setState({ latitude: position.coords.latitude })\r\n this.setState({ longitude: position.coords.longitude })\r\n this.handleSearch()\r\n })\r\n }\r\n\r\n fetchWholesalers = debounce(this.handleSearch, 2000)\r\n\r\n render() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n\r\n {this.state.isOpen && (\r\n
    \r\n
    \r\n
    \r\n

    Search Wholesalers

    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n\r\n {this.state.isDirty && this.state.list.length === 0 && (\r\n
    \r\n

    No wholesalers match your search. Please try again.

    \r\n
    \r\n )}\r\n\r\n {this.state.list.length > 0 && (\r\n
    \r\n {this.state.list.map((item) => (\r\n \r\n ))}\r\n
    \r\n )}\r\n
    \r\n
    \r\n
    \r\n
    )}\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Link } from 'react-router-dom'\r\nimport { RegisterSide } from '../../components/registerSide/RegisterSide'\r\nimport { InputwholesalersLookUp } from '../../components/inputwholesalersLookUp/InputwholesalersLookUp'\r\nimport { apiRegisterUser } from '../../utils/apiCalls'\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\nimport ReCAPTCHA from 'react-google-recaptcha'\r\n\r\nconst { CONST } = require('../../CONST')\r\n\r\nconst SECTIONS = {\r\n profileSection: 0,\r\n businessSection: 1,\r\n wholesalersSection: 2,\r\n thankYouSection: 3\r\n}\r\n\r\nconst recaptchaRef = React.createRef()\r\nconst recaptchaRefElectrician = React.createRef()\r\n\r\nexport class Registration extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n queryParams: {},\r\n isLoading: false,\r\n isFinalStep: false,\r\n currentSection: SECTIONS.profileSection\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const urlParams = new URLSearchParams(window.location.search)\r\n const queryParams = {}\r\n for (const [key, value] of urlParams.entries()) {\r\n queryParams[key] = value\r\n }\r\n this.setState({ queryParams })\r\n }\r\n\r\n validateForm = (formId) => {\r\n const form = document.getElementById(formId)\r\n if (form.dataset.submitIntent === 'false') return false\r\n\r\n const formElements = form.elements\r\n let formIsValid = true\r\n\r\n for (let i = 0; i < formElements.length; i++) {\r\n const element = formElements[i]\r\n if (![\"INPUT\", \"SELECT\"].includes(element.nodeName)) continue\r\n\r\n const elementId = element.id\r\n const elementLabel = document.querySelector(`label[for=\"${elementId}\"]`)?.textContent || 'Field'\r\n const elementValue = element.value\r\n const elementError = document.querySelector(`[data-error-for=\"${elementId}\"]`)\r\n\r\n if (element.type === 'checkbox') {\r\n if (element.required && !element.checked) {\r\n formIsValid = false\r\n elementError.style.display = 'block'\r\n } else {\r\n elementError.style.display = 'none'\r\n }\r\n } else {\r\n if (element.required && elementValue.trim() === '') {\r\n elementError.textContent = elementLabel + ' is required'\r\n formIsValid = false\r\n } else if (element.type === 'email' && !this.validateEmail(elementValue)) {\r\n elementError.textContent = 'Please enter a valid email address'\r\n formIsValid = false\r\n } else if (element.type === 'tel' && element.dataset?.postal === 'true' && !this.validatePostalCode(elementValue)) {\r\n elementError.textContent = 'Please enter a valid postal code'\r\n formIsValid = false\r\n } else if (element.type === 'tel' && ! element.dataset?.postal && !this.validatePhone(elementValue)) {\r\n elementError.textContent = 'Please enter a valid phone number'\r\n formIsValid = false\r\n } else {\r\n elementError.textContent = ''\r\n }\r\n\r\n elementError.style.display = !formIsValid ? 'block' : 'none'\r\n }\r\n }\r\n\r\n return formIsValid\r\n }\r\n\r\n validateEmail = (email) => {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\r\n return emailRegex.test(email)\r\n }\r\n\r\n validatePhone = (phone) => {\r\n const phoneRegex = /^\\d{7,20}$/\r\n return phoneRegex.test(phone)\r\n }\r\n\r\n validatePostalCode = (postalCode) => {\r\n const postalCodeRegex = /^\\d{2,4}$/\r\n return postalCodeRegex.test(postalCode)\r\n }\r\n \r\n submitProfileForm = (event) => {\r\n event.preventDefault()\r\n event.target.dataset.submitIntent = 'true'\r\n const isValid = this.validateForm('profileForm')\r\n\r\n if (!isValid) return\r\n\r\n if (this.state.queryParams?.type !== 'Electrician') {\r\n this.setState({ isFinalStep: true })\r\n }\r\n\r\n if (this.state.queryParams?.type === 'Electrician') {\r\n analyticsDataLayer.registrationStep(2, 3)\r\n } else {\r\n analyticsDataLayer.registrationStep(2, 2)\r\n }\r\n \r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Next Step',\r\n cta_link: '',\r\n cta_location: 'Registration'\r\n })\r\n\r\n this.setState({ currentSection: SECTIONS.businessSection })\r\n }\r\n \r\n submitBusinessForm = (event) => {\r\n event.preventDefault()\r\n event.target.dataset.submitIntent = 'true'\r\n const isValid = this.validateForm('businessForm')\r\n\r\n if (!isValid) return\r\n\r\n if (this.state.queryParams?.type === 'Electrician') {\r\n analyticsDataLayer.registrationStep(3, 3)\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Next Step',\r\n cta_link: '',\r\n cta_location: 'Registration'\r\n })\r\n\r\n this.setState({ currentSection: SECTIONS.wholesalersSection })\r\n } else {\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'Register',\r\n cta_link: '',\r\n cta_location: 'Registration'\r\n })\r\n\r\n const recaptchaValue = recaptchaRef.current.getValue()\r\n if (!recaptchaValue) {\r\n window.alert('Please complete the reCAPTCHA challenge')\r\n return\r\n }\r\n\r\n this.registerUser(recaptchaValue)\r\n }\r\n }\r\n \r\n submitWholesalersForm = (event) => {\r\n event.preventDefault()\r\n event.target.dataset.submitIntent = 'true'\r\n const isValid = this.validateForm('wholesalersForm')\r\n\r\n if (!isValid) return\r\n\r\n const recaptchaValue = recaptchaRefElectrician.current.getValue()\r\n if (!recaptchaValue) {\r\n window.alert('Please complete the reCAPTCHA challenge')\r\n return\r\n }\r\n\r\n this.registerUser(recaptchaValue)\r\n }\r\n\r\n registerUser = (recaptchaValue) => {\r\n this.setState({ isLoading: true })\r\n let registerRequest = {\r\n \"firstName\": '',\r\n \"lastName\": '',\r\n \"email\": '',\r\n \"phoneNumber\": '',\r\n \"businessName\": '',\r\n \"businessPhoneNumber\": '',\r\n \"businessWebsite\": '',\r\n \"accountId\": '',\r\n \"businessPostalAddress\": '',\r\n \"businessPostalPostCode\": '',\r\n \"businessPostalCity\": '',\r\n \"businessPostalState\": '',\r\n \"userType\": '',\r\n \"branchId\": 0,\r\n \"preferredWholesaler1Id\": 0,\r\n \"preferredWholesaler2Id\": 0,\r\n \"preferredWholesaler3Id\": 0,\r\n \"userSubscriptionIndustryNews\": false,\r\n \"businessAbnacnnumber\": '',\r\n \"isBusinessABNACNMatchingWholesaler\": false,\r\n \"acceptedTermsAndConditions\": false,\r\n \"UseRecaptchaResponse\": recaptchaValue\r\n }\r\n\r\n // Read data from the form and populate the registerRequest object\r\n registerRequest.firstName = document.getElementById('register-first-name').value\r\n registerRequest.lastName = document.getElementById('register-last-name').value\r\n registerRequest.email = document.getElementById('register-email').value\r\n registerRequest.phoneNumber = document.getElementById('register-phone').value\r\n registerRequest.businessName = document.getElementById('register-business-name').value\r\n registerRequest.businessPhoneNumber = document.getElementById('register-business-phone').value\r\n registerRequest.businessWebsite = document.getElementById('register-business-website').value\r\n registerRequest.accountId = document.getElementById('register-business-account-number')?.value || ''\r\n registerRequest.businessPostalAddress = document.getElementById('register-business-address').value\r\n registerRequest.businessPostalPostCode = document.getElementById('register-business-postal-code').value\r\n registerRequest.businessPostalCity = document.getElementById('register-business-suburb').value\r\n registerRequest.businessPostalState = document.getElementById('register-business-state').value\r\n registerRequest.userType = this.state.queryParams?.type\r\n registerRequest.branchId = 0\r\n\r\n const preferredWholesaler1Id = document.getElementById('register-wholesaler-1').value\r\n const preferredWholesaler2Id = document.getElementById('register-wholesaler-2').value\r\n const preferredWholesaler3Id = document.getElementById('register-wholesaler-3').value\r\n\r\n if (preferredWholesaler1Id) registerRequest.preferredWholesaler1Id = parseInt(preferredWholesaler1Id)\r\n if (preferredWholesaler2Id) registerRequest.preferredWholesaler2Id = parseInt(preferredWholesaler2Id)\r\n if (preferredWholesaler3Id) registerRequest.preferredWholesaler3Id = parseInt(preferredWholesaler3Id)\r\n\r\n registerRequest.userSubscriptionIndustryNews = document.getElementById('keep-up-to-date').checked\r\n registerRequest.businessAbnacnnumber = document.getElementById('register-business-ABN-ACN')?.value || ''\r\n registerRequest.isBusinessABNACNMatchingWholesaler = false\r\n registerRequest.acceptedTermsAndConditions = document.getElementById('register-terms').checked\r\n\r\n apiRegisterUser(registerRequest)\r\n .then(() => {\r\n analyticsDataLayer.registrationComplete()\r\n this.setState({ currentSection: SECTIONS.thankYouSection })\r\n })\r\n .catch(error => {\r\n window.alert(`Registration failed: ${typeof error === 'object' ? error.message : error}`)\r\n })\r\n .finally(() => {\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n 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\r\n {/* */}\r\n \r\n\r\n {/* */}\r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import React from 'react'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport RadioObjectGroup from '../../radio-object-group/RadioObjectGroup'\r\nimport { isNullOrUndefined } from '../../../utils/helpers'\r\n\r\nexport default class BreakerDetailsFormContainer extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.updateCall = this.updateCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.optionSelectedCall = this.optionSelectedCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about\r\n // holds info on the selection options\r\n this.initStates(this.props)\r\n\r\n // Setup the business logic\r\n this.logic = new BreakerDetailsFormBusinessLogic(props.breakerOptions, props.breakerOptionData, this.state.breakerDetails, this.props.isHybridBoard, this.props.breakingCapacity)\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (!this.props.breaker && !nextProps.breaker) {\r\n return\r\n }\r\n if (!this.props.breaker || !nextProps.breaker || this.props.breaker.ItemID !== nextProps.breaker.ItemID) {\r\n this.initStates(nextProps, true)\r\n }\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n const existingBreaker = propsData.breaker ? propsData.breakerOptionData.find(item => item.ItemID === propsData.breaker.BreakerTypeItemID) : null\r\n const existingBreakerPitch = (existingBreaker && existingBreaker.CurrentRating >= 80) ? 27 : 18\r\n const breakerTypeCode = existingBreaker ? existingBreaker.TypeCode : null\r\n let breakerCurrentRating = existingBreaker ? existingBreaker.CurrentRating : null\r\n\r\n // If we have a VIGI breaker, then we need to get its current rating from the parent breaker\r\n if (breakerTypeCode === '3PH-VIGI') {\r\n const parentBreaker = propsData.breakerOptionData.find(item => item.ItemID === propsData.breaker.ParentBreakerTypeItemID)\r\n breakerCurrentRating = parentBreaker.CurrentRating\r\n }\r\n\r\n const updatedState = {\r\n breakerDetails: {\r\n TypeCode: breakerTypeCode,\r\n PoleCount: existingBreaker ? existingBreaker.PoleCount : null,\r\n PitchPoleSize: existingBreaker ? existingBreakerPitch : (this.props.isHybridBoard ? null : 18),\r\n CurrentRating: breakerCurrentRating\r\n },\r\n commercialAllPartsAvailable: propsData.commercialAllPartsAvailable,\r\n validationMessage: '',\r\n isOutOfStock: false\r\n }\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.props.deleteCallback(this.props.breaker.BreakerTypeItemID, this.props.breaker.ParentBreakerTypeItemID)\r\n }\r\n\r\n checkIfFilterDataAreTheSame(filterData) {\r\n let allTheSame = true\r\n const checkFields = ['PoleCount', 'TypeCode', 'CurrentRating', 'PitchPoleSize']\r\n filterData.forEach(item => {\r\n checkFields.forEach(field => {\r\n if (filterData[0][field] !== item[field]) {\r\n allTheSame = false\r\n }\r\n })\r\n })\r\n return allTheSame\r\n }\r\n\r\n updateCall() {\r\n const finalSelections = cloneDeep(this.state.breakerDetails)\r\n const finalFilteredBreakerData = this.logic.setAndClearRelatedFields(finalSelections)\r\n\r\n // Assumption that the Breaker type options from the server will always have distinct setup\r\n if (finalFilteredBreakerData.length !== 1 && !this.checkIfFilterDataAreTheSame(finalFilteredBreakerData)) {\r\n this.setState({\r\n validationMessage: 'Please make sure all fields are filled in'\r\n })\r\n return\r\n }\r\n\r\n // Create the final Breaker object to be passed to the server\r\n const finalBreaker = finalFilteredBreakerData[0]\r\n\r\n if (finalBreaker.TypeCode === '3PH-VIGI') {\r\n // IF we are dealing with a VIGI breaker....\r\n // We need to find the matching 3P breaker and send that breaker's type ID as this breaker's parent ID\r\n const parentBreaker = this.props.breakerOptionData.find(breakerObj => {\r\n if (breakerObj.PoleCount === 3 && breakerObj.CurrentRating === finalSelections['CurrentRating']) {\r\n // Also need the parent breaker to be of the correct breaking capacity as the board\r\n const breakCode = breakerObj.TypeCode.split('-')\r\n if (breakCode.length < 2) {\r\n // not the right breaker if it's got a weird typecode that doesnt follow the pattern....\r\n return false\r\n }\r\n if (breakCode[1].startsWith(`${this.props.breakingCapacity}`)) {\r\n // Get the breaker with the code that starts with the correct breaking capacity\r\n return true\r\n }\r\n }\r\n return false\r\n })\r\n // Calls create / update callback based on is new Breaker flag\r\n if (this.props.breaker) {\r\n this.props.updateCallback(finalBreaker.ItemID, parentBreaker.ItemID)\r\n } else {\r\n this.props.createCallback(finalBreaker.ItemID, parentBreaker.ItemID)\r\n }\r\n } else {\r\n // Normal breakers...\r\n // Calls create / update callback based on is new Breaker flag\r\n if (this.props.breaker) {\r\n this.props.updateCallback(finalBreaker.ItemID, null)\r\n } else {\r\n this.props.createCallback(finalBreaker.ItemID, null)\r\n }\r\n }\r\n }\r\n\r\n // Update the selected option value in local state\r\n optionSelectedCall(value, key) {\r\n const updatebreaker = cloneDeep(this.state.breakerDetails)\r\n updatebreaker[key] = value\r\n\r\n // Update values on the affected related fields\r\n // When users select ChassisCount or Chassis1PoleCount this affects other fields.\r\n this.logic.setAndClearRelatedFields(updatebreaker)\r\n this.setState({\r\n breakerDetails: updatebreaker\r\n }, () => {\r\n if (this.state.breakerDetails.CurrentRating !== null) {\r\n const finalSelections = cloneDeep(this.state.breakerDetails)\r\n const finalFilteredBreakerData = this.logic.setAndClearRelatedFields(finalSelections)\r\n\r\n if (finalFilteredBreakerData.length !== 1 && !this.checkIfFilterDataAreTheSame(finalFilteredBreakerData)) {\r\n this.setState({\r\n validationMessage: 'Please make sure all fields are filled in'\r\n })\r\n return\r\n }\r\n\r\n const finalBreaker = finalFilteredBreakerData[0]\r\n const availabilityDataForSelectedBreaker = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === finalBreaker.BreakerReference)\r\n console.log('availabilityDataForSelectedBreaker', availabilityDataForSelectedBreaker)\r\n console.log('finalBreaker', finalBreaker)\r\n if (!availabilityDataForSelectedBreaker.IsInStock) {\r\n this.setState({\r\n validationMessage: `${finalBreaker.DrawingDesc} is out of stock. Please, contact au.estimating@se.com`,\r\n isOutOfStock: true\r\n })\r\n } else if (availabilityDataForSelectedBreaker.IsLowStock) {\r\n this.setState({\r\n validationMessage: 'Low stock, longer lead times may apply',\r\n isOutOfStock: false\r\n })\r\n } else {\r\n this.setState({ validationMessage: '', isOutOfStock: false })\r\n }\r\n }\r\n })\r\n }\r\n\r\n\r\n render() {\r\n // Setup the business logic\r\n this.logic = new BreakerDetailsFormBusinessLogic(this.props.breakerOptions, this.props.breakerOptionData, this.state.breakerDetails, this.props.isHybridBoard, this.props.breakingCapacity)\r\n\r\n const breakerOptions = this.props.breakerOptions\r\n const breakerDetails = this.state.breakerDetails\r\n const breakingCapacity = this.props.breakingCapacity\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n item.breakingCapacity.includes(breakingCapacity))}\r\n selectedValue={breakerDetails.TypeCode}\r\n selecteCallback={value => { this.optionSelectedCall(value, 'TypeCode') }}\r\n enabledOptions={this.logic.getEnableOptions('TypeCode')} />\r\n
    \r\n\r\n
    \r\n { this.optionSelectedCall(value, 'PoleCount') }}\r\n enabledOptions={this.logic.getEnableOptions('PoleCount')} />\r\n
    \r\n\r\n
    \r\n { this.optionSelectedCall(value, 'PitchPoleSize') }}\r\n enabledOptions={this.logic.getEnableOptions('PitchPoleSize')} />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n { this.optionSelectedCall(value, 'CurrentRating') }}\r\n layout={'radio-button-row'}\r\n enabledOptions={this.logic.getEnableOptions('CurrentRating')} />\r\n
    \r\n
    \r\n
    \r\n\r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n\r\n
    \r\n {/* If the user specified Current Rating which is the very last input to choose, then enable Save/Edit button */}\r\n { this.updateCall() }}\r\n disabled={(this.state.breakerDetails.CurrentRating === null && this.state.validationMessage !== '') || this.state.isOutOfStock}\r\n >\r\n \r\n {!this.props.breaker && Add Breaker}\r\n {this.props.breaker && Edit Breaker}\r\n \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport class BreakerDetailsFormBusinessLogic {\r\n\r\n // The logic is constructed with all the available options and all the type combination data\r\n constructor(options, data, selectedOptions, isHybridBoard, breakingCapacity) {\r\n this.options = options\r\n this.data = this.trimData(data, breakingCapacity)\r\n this.isHybridBoard = isHybridBoard\r\n this.setAndClearRelatedFields(selectedOptions)\r\n }\r\n\r\n trimData(data, breakingCapacity) {\r\n data = data.filter(item => {\r\n // VIGI breakers dont have a breaking capacity on it, it is based off its parent breaker\r\n if (item.TypeCode === '3PH-VIGI') {\r\n return true\r\n }\r\n\r\n // Filter out the breakers of the wrong breaking capacity\r\n const breakCode = item.TypeCode.split('-')\r\n if (breakCode.length < 2) {\r\n // not the right breaker if it's got a weird typecode that doesnt follow the pattern....\r\n return false\r\n }\r\n if (breakCode[1].startsWith(`${breakingCapacity}`)) {\r\n // Get the breaker with the code that starts with the correct breaking capacity\r\n return true\r\n }\r\n\r\n return false\r\n })\r\n return data\r\n }\r\n\r\n // ------------------------------\r\n // Logic to handle auto selecting and clearing of data when an option is selected\r\n // ------------------------------\r\n\r\n setAndClearRelatedFields(selectedOptions) {\r\n // This function should check the remaining valid board type selections and\r\n // auto select the options that is the only avialable option left\r\n let filteredData = cloneDeep(this.data)\r\n let canEnableNext = true\r\n\r\n // walk through the selectedOptions in order, from top down\r\n // for each of the selectOption (top down in order)...\r\n for (var property in selectedOptions) {\r\n if (selectedOptions.hasOwnProperty(property)) {\r\n // check which option should be enabled\r\n canEnableNext = this.checkOptions(property, canEnableNext, selectedOptions, filteredData)\r\n\r\n // Filter down the filtered board type data with this option selection\r\n if (property === 'CurrentRating' && selectedOptions['TypeCode'] === '3PH-VIGI') {\r\n // The VIGI breakers are spacial case....\r\n // In the data, the VIGI breaker's current rating is 0 .... and there should be only 1 VIGI breaker data\r\n // And due to the special cases surrounding the VIGI breaker, our code will allow user to select all available 3P current ratings...\r\n filteredData = filteredData.filter(filterItem => filterItem[property] === 0)\r\n } else {\r\n filteredData = filteredData.filter(filterItem => isNullOrUndefined(selectedOptions[property]) || isNullOrUndefined(filterItem[property]) || selectedOptions[property] === filterItem[property])\r\n }\r\n }\r\n }\r\n\r\n // Return the list of filtered Data - it can be used to retrieve BoardTypeID\r\n return filteredData\r\n }\r\n\r\n // Check if the options under a specific config (optionName) can be enabled or not\r\n // While performing the check, the function may auto select options if it is the last option available\r\n // This will also auto de-select options if the selected value is not in the available options list\r\n checkOptions(optionName, canEnableNext, selectedOptions, filteredData) {\r\n if (!this.options[`Options${optionName}`]) { return }\r\n\r\n // Has enabled options under this config\r\n let hasEnabled = false\r\n\r\n\r\n // Loop through the options of the specified config - enable the config's options based on a number of logic checks\r\n this.options[`Options${optionName}`].forEach((item, index) => {\r\n if (!canEnableNext) {\r\n // Disable all options under the config if board name is blank\r\n item['enabled'] = false\r\n } else if (optionName === 'PitchPoleSize') {\r\n // PitchPoleSize data filters are based on isHybridBoard setting\r\n if (this.isHybridBoard) {\r\n // 27 mm pitch size is only available on hybrid board and its not available for a VIGI breaker\r\n if (selectedOptions['TypeCode'] === '3PH-VIGI') {\r\n item['enabled'] = (index === 0)\r\n } else {\r\n // Check the filtered data, check if there is any board type still available under the current option\r\n const currentData = filteredData.filter(filterItem => filterItem[optionName] === item.value)\r\n\r\n // All checks passed, enable the option\r\n item['enabled'] = currentData.length ? true : false\r\n }\r\n } else {\r\n // for non-hybrid board we only enable the first option\r\n item['enabled'] = (index === 0)\r\n }\r\n } else if (optionName === 'CurrentRating' && selectedOptions['TypeCode'] === '3PH-VIGI') {\r\n // The VIGI breakers are spacial case....\r\n // If the user selected the MCB(3P) + RCD(3P+N) pole type then its a VIGI breaker, and we need to enable all the current rating selection that\r\n // is available to a normal 3P breaker\r\n\r\n // Check if we can find a normal 3P breaker with this option's current rating - if so, enable it\r\n let tempData = cloneDeep(this.data)\r\n tempData = tempData.filter(tempItem => (tempItem['CurrentRating'] === item.value && tempItem['PoleCount'] === 3 && tempItem['PitchPoleSize'] === selectedOptions['PitchPoleSize']))\r\n item['enabled'] = tempData.length ? true : false\r\n } else {\r\n // Check the filtered data, check if there is any board type still available under the current option\r\n const currentData = filteredData.filter(filterItem => filterItem[optionName] === item.value)\r\n\r\n // All checks passed, enable the option\r\n item['enabled'] = currentData.length ? true : false\r\n }\r\n\r\n // Set the has enabled flag if the config's option item has been enabled after the checks\r\n if (item['enabled']) {\r\n hasEnabled = true\r\n }\r\n })\r\n\r\n\r\n // Now we check the selected option (if any), we need to de-select it if it is not one of the available options\r\n if (!isNullOrUndefined(selectedOptions[optionName])) {\r\n const selectedValidOptions = this.options[`Options${optionName}`].filter(item => (item.enabled && item.value === selectedOptions[optionName]))\r\n if (!selectedValidOptions.length) {\r\n selectedOptions[optionName] = null\r\n }\r\n }\r\n\r\n // Time to check the current config's options, if only one available option is left, then we need to set that option as the\r\n // selected option and also disable that option's selection (so the user dont get a choice on it)\r\n const availableOptions = this.options[`Options${optionName}`].filter(item => item.enabled)\r\n if (availableOptions.length === 1) {\r\n availableOptions[0].enabled = false\r\n selectedOptions[optionName] = availableOptions[0].value\r\n hasEnabled = false\r\n }\r\n\r\n // Return if the next config can be selected or not, it can be if this item it self can be enabled\r\n // AND it either has already got a option selection or none of the options are valid\r\n return canEnableNext && (!isNullOrUndefined(selectedOptions[optionName]) || !hasEnabled)\r\n }\r\n\r\n // ------------------------------\r\n // Logic to get the enabled options for a specific radion group\r\n // ------------------------------\r\n getEnableOptions(key) {\r\n return this.options[`Options${key}`] ? this.options[`Options${key}`].map(item => item.enabled ? item.value : null) : []\r\n }\r\n}\r\n","import React from 'react'\r\nimport { isOdd } from '../../../utils/helpers'\r\n\r\nexport default class ChassisBreaker extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.editClickCall = this.editClickCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.updateBrekerChassisNoteCall = this.updateBrekerChassisNoteCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about holds info on the selection options\r\n this.state = {\r\n showEditOptions: false,\r\n isDeleting: false,\r\n BreakerCircuitLabelInput: this.props.BreakerCircuitLabelInput\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.setState({ isDeleting: true })\r\n this.props.deletedCallback(this.props.chassisPosIndex, this.props.itemId)\r\n }\r\n\r\n editClickCall() {\r\n this.setState({ showEditOptions: !this.state.showEditOptions })\r\n }\r\n\r\n updateBrekerChassisNoteCall() {\r\n this.props.updateBrekerChassisNote(this.props.chassisPosIndex, this.state.BreakerCircuitLabelInput)\r\n this.setState({ showEditOptions: false })\r\n }\r\n\r\n render() {\r\n return (\r\n
    { event.preventDefault(); this.updateBrekerChassisNoteCall(); }}>\r\n\r\n
    \r\n
    \r\n { this.props.poles === 1 ? this.props.chassisPosIndex : this.props.chassisPosIndex - 2 }\r\n
    \r\n
    \r\n { this.props.chassisPosIndex }\r\n
    \r\n
    \r\n { this.props.chassisPosIndex + 2 }\r\n
    \r\n
    \r\n { this.props.chassisPosIndex + 4 }\r\n
    \r\n
    \r\n { this.props.chassisPosIndex + 6 }\r\n
    \r\n
    \r\n { this.props.chassisPosIndex + 8 }\r\n
    \r\n
    \r\n \r\n
    \r\n this.setState({ BreakerCircuitLabelInput: event.target.value }) } maxLength=\"30\" />\r\n\r\n {\r\n this.state.BreakerCircuitLabelInput !== '' && !this.state.showEditOptions &&\r\n
    \r\n { this.state.BreakerCircuitLabelInput }\r\n
    \r\n }\r\n\r\n \r\n { this.props.code }\r\n \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import React from 'react'\r\nimport { DropTarget } from 'react-dnd'\r\n\r\nexport class ChassisEmptyPole extends React.Component {\r\n constructor (props) {\r\n super(props)\r\n }\r\n\r\n render () {\r\n const isActive = this.props.canDrop && this.props.isOver\r\n\r\n return (\r\n // Add .is-disabled to visually indicate that the pole is locked\r\n
    \r\n { this.props.rowIndex }\r\n\r\n
    \r\n \r\n {\r\n isActive ?\r\n Release to drop\r\n :\r\n Slot Available\r\n }\r\n \r\n \r\n Drag and drop a breaker from your library\r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DropTarget('ChassisPole',\r\n {\r\n drop: (props) => ({ \r\n poleIndex: props.rowIndex\r\n })\r\n },\r\n (connect, monitor) => ({\r\n connectDropTarget: connect.dropTarget(),\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n isDraggingItem: monitor.getItem() !== null\r\n })\r\n)(ChassisEmptyPole)","import React from 'react'\r\nimport { isNullOrUndefined, drawPercentProgressBars } from '../../../utils/helpers'\r\n\r\nexport default class ChassisSelection extends React.Component {\r\n componentDidMount() {\r\n this.drawPercent()\r\n }\r\n\r\n selectCall(index) {\r\n if (index !== this.props.selectedIndex) {\r\n this.props.selectedCallback(index)\r\n } \r\n }\r\n\r\n shouldComponentUpdate(nextProps) {\r\n if (this.props.chassis1filled !== nextProps.chassis1filled ||\r\n this.props.chassis1filled !== nextProps.chassis1filled ||\r\n isNullOrUndefined(this.props.chassis1filled) !== isNullOrUndefined(nextProps.chassis1filled) ||\r\n \r\n this.props.chassis2filled !== nextProps.chassis2filled ||\r\n this.props.chassis2filled !== nextProps.chassis2filled ||\r\n isNullOrUndefined(this.props.chassis2filled) !== isNullOrUndefined(nextProps.chassis2filled)) {\r\n\r\n // Put a small delay to wait for the tab to render and attach correct data-value in the dom element for the jQuery plugin\r\n window.setTimeout(() => { this.drawPercent() }, 500)\r\n }\r\n\r\n return true\r\n }\r\n\r\n drawPercent() {\r\n drawPercentProgressBars()\r\n }\r\n\r\n renderTab(index, filled) {\r\n if (isNullOrUndefined(filled)) { return null }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n Chassis { index }\r\n \r\n
    \r\n )\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n { this.renderTab(1, this.props.chassis1filled) }\r\n { this.renderTab(2, this.props.chassis2filled) }\r\n
    \r\n )\r\n }\r\n}\r\n","import React from 'react'\r\nimport {isOdd, toggleArrayItem} from '../../../utils/helpers'\r\nimport ChassisBreaker from './ChassisBreaker'\r\nimport ChassisEmptyPole from './ChassisEmptyPole'\r\nimport ChassisSelection from './ChassisSelection'\r\n\r\nexport default class ChassisBoard extends React.Component {\r\n\r\n constructor() {\r\n super()\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.updateBrekerChassisNote = this.updateBrekerChassisNote.bind(this)\r\n\r\n // Internal states to track what mode the selections are\r\n this.state = {\r\n notesOpen: []\r\n }\r\n }\r\n\r\n clickCall(index) {\r\n this.props.clickedCallback(index)\r\n }\r\n\r\n deleteCall(chassisIndex, itemId) {\r\n this.props.deleteCallback(chassisIndex, itemId)\r\n }\r\n\r\n updateBrekerChassisNote(positionIndex, note) {\r\n this.props.updateBrekerChassisNote(positionIndex, note)\r\n }\r\n\r\n updateNotesCall(positionIndex) {\r\n const noteInput = this.refs['inputNotes-' + positionIndex].value\r\n this.props.updateNotesCallback(positionIndex, noteInput)\r\n this.togglelNotesCall(positionIndex)\r\n }\r\n\r\n togglelNotesCall(positionIndex) {\r\n this.setState({\r\n notesOpen: toggleArrayItem(this.state.notesOpen, positionIndex)\r\n })\r\n }\r\n\r\n renderRows() {\r\n const rowCounts = Math.floor(this.props.poles / 2)\r\n const rows = []\r\n for (let i = 0; i < rowCounts; i++) {\r\n // Find the row color based on the passed in prop\r\n const rowIndex = (i * 2 + 1) + this.props.indexOffset\r\n const rightIndex = rowIndex + 1\r\n const rightPoleDisabled = (this.props.disabledIndex2 && rightIndex === (this.props.hybridPoleCount + 2))\r\n const isLarge = this.props.hybridPoleCount ? (rightIndex <= this.props.hybridPoleCount) : false\r\n\r\n // Check if there is a breaker that is positioned on this index\r\n const leftBoardBreaker = this.props.breakers.find(item => item.ChassisPositionIndex === rowIndex)\r\n const rightBoardBreaker = this.props.breakers.find(item => item.ChassisPositionIndex === rightIndex)\r\n\r\n // Pushes in a row into the array to be rendered out\r\n rows.push(\r\n \r\n { !leftBoardBreaker ?\r\n \r\n :\r\n
    \r\n { rowIndex }\r\n \r\n { this.renderBreakers(rowIndex, isLarge) }\r\n
    \r\n }\r\n\r\n { !rightBoardBreaker && !rightPoleDisabled ?\r\n \r\n :\r\n \r\n {\r\n rightPoleDisabled ?\r\n
    \r\n { rightIndex }\r\n
    \r\n \r\n { this.props.disabledIndex2ComponentName }\r\n \r\n
    \r\n
    \r\n :\r\n
    \r\n { rightIndex }\r\n \r\n { this.renderBreakers(rightIndex, isLarge) }\r\n
    \r\n }\r\n
    \r\n }\r\n
    \r\n )\r\n }\r\n\r\n return rows\r\n }\r\n\r\n renderNote(index) {\r\n const noteItem = this.props.breakers.find(item => item.ChassisPositionIndex === index)\r\n if (!noteItem) {\r\n return\r\n }\r\n\r\n const isOpen = this.state.notesOpen.includes(index)\r\n return (\r\n
    \r\n {isOpen &&\r\n
    e.stopPropagation()}>\r\n \r\n
    \r\n Cross Icon\r\n
    \r\n
    \r\n Tick Icon\r\n
    \r\n
    \r\n }\r\n {!isOpen && !noteItem.BreakerCircuitLabel &&\r\n
    \r\n Plus Icon\r\n
    \r\n }\r\n {!isOpen && noteItem.BreakerCircuitLabel &&\r\n
    \r\n Pen Icon\r\n
    \r\n }\r\n
    \r\n )\r\n }\r\n\r\n renderEmptySlot() {\r\n return (\r\n
    \r\n \r\n Slot Available\r\n \r\n \r\n Drag and drop a breaker from your library\r\n \r\n
    \r\n )\r\n }\r\n\r\n renderBreakers(index, isLarge = false) {\r\n if (!this.props.breakers || !this.props.breakers.length) { \r\n return this.renderEmptySlot()\r\n }\r\n\r\n // Check if there is a breaker that is positioned on this index\r\n const boardBreaker = this.props.breakers.find(item => item.ChassisPositionIndex === index)\r\n if (!boardBreaker) { \r\n return this.renderEmptySlot()\r\n }\r\n const breakerObj = this.props.breakerData.find(dataItem => dataItem.ItemID === boardBreaker.BreakerTypeItemID)\r\n const displayCode = boardBreaker.ParentBreakerCurrentRating ? `${breakerObj.DrawingDesc}-${boardBreaker.ParentBreakerCurrentRating}A` : breakerObj.DrawingDesc\r\n // Render the breaker if we found one in this index position\r\n\r\n return (\r\n \r\n )\r\n }\r\n\r\n render() { \r\n return (\r\n
    \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n { this.props.configured } Poles Configured\r\n
    \r\n
    \r\n { this.props.remaining } Remaining\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n { this.props.powerLossPercentage.toFixed(2) }% Component Thermal Losses \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n {/* */}\r\n
    \r\n { this.renderRows() }\r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import { DragSource } from 'react-dnd'\r\nimport React from 'react'\r\n\r\nexport class Breaker extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n var opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n this.state = {\r\n isDragging: opacity\r\n }\r\n }\r\n\r\n handleDeletingBreaker (itemID) {\r\n this.props.handleDeletingBreaker(itemID)\r\n }\r\n\r\n handleToggleBreakerFavourite (itemID, ParentBreakerTypeItemID) {\r\n this.props.handleToggleBreakerFavourite(itemID, ParentBreakerTypeItemID)\r\n }\r\n\r\n handleBreakerAutoAdd (itemID) {\r\n this.props.handleBreakerAutoAdd(itemID, this.props.quantity)\r\n }\r\n\r\n render() {\r\n const opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n return (\r\n
    \r\n { this.props.usedCount }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { this.props.drawingDesc }\r\n\r\n {\r\n this.props.isDisabled &&\r\n
    Cannot be fitted on to this board
    \r\n }\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n this.handleToggleBreakerFavourite(this.props.ItemID, this.props.ParentBreakerTypeItemID) } />\r\n\r\n \r\n
    \r\n {!this.props.isDragAndDropEnabled && !this.props.isDisabled &&\r\n
    \r\n this.props.handleUpdateQuantity(e.target.value, this.props.ItemID)} />\r\n
    \r\n }\r\n\r\n { !this.props.isDisabled && \r\n \r\n }\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return { \r\n ItemID: props.ItemID,\r\n BreakerTypeItemID: props.BreakerTypeItemID,\r\n poleCount: props.poleCount,\r\n ParentBreakerTypeItemID: props.ParentBreakerTypeItemID ?? 0\r\n }\r\n },\r\n endDrag(props, monitor) {\r\n const item = monitor.getItem()\r\n const dropResult = monitor.getDropResult() \r\n if (dropResult) {\r\n // The previous existing system was UI depended and was passing +2 pole index for each element with pole count > 0\r\n // So, if you were passing a breaker on position 3, it will save it to the API at position 5 and visually with CSS shift it by negative -1 to the top\r\n // We keep this existing logic here to not need to refactor back end APIs\r\n\r\n let poleIndex = dropResult.poleIndex\r\n if (item.poleCount > 1) {\r\n poleIndex = poleIndex + 2\r\n }\r\n\r\n props.addBreakerToBoard(poleIndex, item.ItemID, item.BreakerTypeItemID, item.ParentBreakerTypeItemID)\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isDragAndDropEnabled && !props.isDisabled\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(Breaker)\r\n","import React from 'react'\r\nimport jQuery from 'jquery'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport analyticsDataLayer from '../../../services/AnalyticsDataLayer'\r\n\r\nexport default class ChassisBoard extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.updateCall = this.updateCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about. Holds info on the selection options.\r\n this.initStates(this.props)\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n const updatedState = {\r\n selectedParts: cloneDeep(propsData.selected)\r\n }\r\n\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n this.initStates(nextProps, true)\r\n\r\n if (nextProps.isOpen) {\r\n jQuery('body').addClass('loose-items-is-open')\r\n } else {\r\n this.closePanel()\r\n }\r\n }\r\n\r\n closePanel() {\r\n jQuery('body').removeClass('loose-items-is-open')\r\n }\r\n\r\n updateCall() {\r\n // We actually don't need to show any loading indicator that we are saving those loose items, we just close the modal\r\n this.closePanel()\r\n\r\n // Calls create / update callback based on is new breaker flag\r\n this.props.updateCallback(this.state.selectedParts)\r\n\r\n }\r\n\r\n getPartSelectedQty(id) {\r\n if (!this.state.selectedParts || !this.state.selectedParts.length) { return 0 }\r\n\r\n const checkPart = this.state.selectedParts.find(item => item.LooseSupplyItemItemID === id)\r\n if (!checkPart) { return 0 }\r\n\r\n return checkPart.Quantity\r\n }\r\n\r\n getTotalSelectedQuantity() {\r\n let totalSelectedQuantity = 0\r\n this.props.partsList.forEach(opt => {\r\n totalSelectedQuantity = totalSelectedQuantity + this.getPartSelectedQty(opt.ItemID)\r\n })\r\n\r\n return totalSelectedQuantity\r\n }\r\n\r\n // Update the selected option value in local state\r\n updateSelectedPart(id, mod, type) {\r\n // If the part is already in the selected list, changes its quantity\r\n const updatedParts = this.state.selectedParts.length ? cloneDeep(this.state.selectedParts) : []\r\n const partInfo = this.props.partsList.find(item => item.ItemID === id)\r\n let foundPart = false\r\n let removeIndex = -1\r\n if (updatedParts.length) {\r\n updatedParts.map((item, index) => {\r\n if (item.LooseSupplyItemItemID === id) {\r\n item.Quantity = item.Quantity + mod\r\n foundPart = true\r\n // If the updated qty is 0, we need to later remove this item\r\n if (item.Quantity <= 0) {\r\n removeIndex = index\r\n }\r\n\r\n // If the updated qty exceeds the qty limit, set it to the limit\r\n if (item.Quantity > partInfo.QtyLimit) {\r\n item.Quantity = partInfo.QtyLimit\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (removeIndex !== -1) {\r\n updatedParts.splice(removeIndex, 1)\r\n }\r\n\r\n // If the part is not, and the mod is positive, then we need to add it in\r\n if (!foundPart && mod > 0) {\r\n updatedParts.push({\r\n LooseSupplyItemItemID: id,\r\n Quantity: 1\r\n })\r\n }\r\n\r\n this.setState({\r\n selectedParts: updatedParts\r\n })\r\n\r\n if (type === 'add') {\r\n analyticsDataLayer.addToCart({\r\n \"currency\": 'AUD',\r\n \"value\": partInfo.Price,\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.props.project.Title,\r\n \"project_id\": this.props.project.ItemID.toString(),\r\n \"item_board_name\": this.props.board.Name,\r\n \"item_board_id\": this.props.board.ItemID.toString(),\r\n \"configuration_name\": this.props.board.Name,\r\n \"configuration_id\": this.props.board.ItemID.toString(), \r\n \"items\": [\r\n {\r\n \"item_id\": partInfo.BOMReference,\r\n \"item_name\": partInfo.Description,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": partInfo.Category,\r\n \"item_variant\": '',\r\n \"price\": partInfo.Price,\r\n \"quantity\": 1\r\n }\r\n ]\r\n })\r\n } else {\r\n analyticsDataLayer.removeFromCart({\r\n \"currency\": 'AUD',\r\n \"value\": partInfo.Price,\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.props.project.Title,\r\n \"project_id\": this.props.project.ItemID.toString(),\r\n \"item_board_name\": this.props.board.Name,\r\n \"item_board_id\": this.props.board.ItemID.toString(),\r\n \"configuration_name\": this.props.board.Name,\r\n \"configuration_id\": this.props.board.ItemID.toString(), \r\n \"items\": [\r\n {\r\n \"item_id\": partInfo.BOMReference,\r\n \"item_name\": partInfo.Description,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": partInfo.Category,\r\n \"item_variant\": '',\r\n \"price\": partInfo.Price,\r\n \"quantity\": 1\r\n }\r\n ]\r\n })\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    Loose Items {this.getTotalSelectedQuantity()}

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

    Please note: Loose items will be delivered with the board, However they won’t come fitted/mounted to the board.

    \r\n
    \r\n\r\n {this.props.partsList.map(opt => {\r\n const selectedQty = this.getPartSelectedQty(opt.ItemID)\r\n\r\n const availabilityDataForSelectedBreaker = this.props.commercialAllPartsAvailable.find(item => item.ItemCode === opt.BOMReference)\r\n let validationMessage = ''\r\n if (!availabilityDataForSelectedBreaker?.IsInStock) {\r\n validationMessage = `${opt.Description} is out of stock. Please, contact au.estimating@se.com`\r\n } else if (availabilityDataForSelectedBreaker?.IsLowStock) {\r\n validationMessage = 'Low stock, longer lead times may apply'\r\n console.log('availabilityDataForSelectedBreaker', availabilityDataForSelectedBreaker)\r\n } else {\r\n validationMessage = ''\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n (opt.BOMReference === 'LBASE2GALBK' || opt.BOMReference === 'LBASE3GALIP66') && selectedQty > 0 &&\r\n

    \r\n \r\n \r\n \r\n \r\n Bottom gland plate will be fitted inside the board and not removable\r\n \r\n

    \r\n }\r\n\r\n
    \r\n \r\n {opt.Description}\r\n \r\n
    \r\n \r\n \r\n {selectedQty}\r\n \r\n\r\n \r\n
    \r\n
    \r\n {validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n
    \r\n )\r\n })}\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { withRouter, Link } from 'react-router-dom'\r\nimport { apiCallsCommercial } from '../../utils/apiCallsCommercial'\r\nimport { getUrlParameter, isOdd } from '../../utils/helpers'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport Modal from '../../components/modal/Modal'\r\nimport GlobalOverlay from '../../components/global-overlay/GlobalOverlay'\r\nimport BreakerDetailsFormContainer from '../../components/config-chassis/commercial/BreakerDetailsFormContainer'\r\nimport commonFunctionsService from '../../services/CommonFunctionsService'\r\nimport ChassisBoard from '../../components/config-chassis/commercial/ChassisBoard'\r\nimport Breaker from '../../components/config-chassis/commercial/Breaker'\r\nimport LooseItems from '../../components/config-chassis/commercial/LooseItems'\r\nimport BoardDetails from '../project-details/commercial/BoardDetails'\r\nimport HeaderLogo from '../../components/header-logo/HeaderLogo'\r\nimport HeaderBrandCommercial from '../../components/header-brand-commercial/HeaderBrandCommercial'\r\nimport HeaderBrandResidential from '../../components/header-brand-residential/HeaderBrandResidential'\r\nimport { Player } from '@lottiefiles/react-lottie-player'\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\n\r\nconst { CONST } = require('../../CONST')\r\n\r\nconst SAMPLE_BREAKER = {\r\n \"ProjectBoardID\": 0,\r\n \"BreakerTypeItemID\": 0,\r\n \"ChassisIndex\": 0,\r\n \"ChassisPositionIndex\": 0,\r\n \"BreakerCircuitLabel\": \"\",\r\n \"Chassis1PercentComplete\": 0,\r\n \"Chassis2PercentComplete\": 0,\r\n \"BreakerTypeReadOnly\": {\r\n \"ItemID\": 0,\r\n \"TypeCode\": \"0\",\r\n \"TypeCodeLabel\": null,\r\n \"BreakerReference\": \"0\",\r\n \"BreakerReferenceLabel\": null,\r\n \"DrawingDesc\": \"0\",\r\n \"DrawingDescLabel\": null,\r\n \"PoleCount\": 0,\r\n \"PoleCountLabel\": \"\",\r\n \"CurrentRating\": 0,\r\n \"CurrentRatingLabel\": null,\r\n \"PitchPoleSize\": 0\r\n },\r\n \"ParentBreakerTypeItemID\": 0,\r\n \"ParentBreakerCurrentRating\": 0,\r\n \"ParentBoardBreakerItemID\": 0,\r\n \"BreakerIsParent\": false,\r\n \"ItemID\": 0,\r\n \"ItemGUID\": \"\",\r\n \"IsDeleted\": false\r\n}\r\n\r\nclass ConfigChassis extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.addBreaker = this.addBreaker.bind(this)\r\n this.selectChassis = this.selectChassis.bind(this)\r\n this.updateSelectedMiscParts = this.updateSelectedMiscParts.bind(this)\r\n this.deleteBreakerFromBoard = this.deleteBreakerFromBoard.bind(this)\r\n this.updateBrekerChassisNote = this.updateBrekerChassisNote.bind(this)\r\n\r\n this.state = {\r\n projectID: '',\r\n boardID: '',\r\n board: {},\r\n boardToConfigure: {},\r\n shouldRedirectToBoard: false,\r\n project: {},\r\n boardOptionData: [],\r\n boardOptions: {},\r\n miscParts: [],\r\n chassisOptions: [],\r\n breakerOptionData: [],\r\n commercialAllPartsAvailable: [],\r\n breakerOptions: [],\r\n userId: 0,\r\n userData: {},\r\n favBreakers: [],\r\n isLoading: true,\r\n apiError: '',\r\n isBreakerModalOpen: false,\r\n activeBreakersTab: 'all', // all, favourites, boardonly (boardonly indicates all breakers added to the board minus favourites)\r\n isDragAndDropEnabled: true,\r\n editedBreaker: {\r\n idInCollection: null,\r\n isFav: false\r\n },\r\n pageInfo: '',\r\n displayMaxBoardLimitReached: '',\r\n shouldDisplayLooseOptionPlinthMessage: false,\r\n isConfiguringBoard: false,\r\n isSavingLooseItems: false,\r\n selectedChassisIndex: 1,\r\n isAddingBreaker: [],\r\n fillQuoteRequirement: 10,\r\n hasAlreadyShownEnoughQuoteInfo: false,\r\n totalLooseItems: 0,\r\n showDragNDropTutorial: false\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n projectID: getUrlParameter('projectID'),\r\n boardID: getUrlParameter('boardID')\r\n }, () => {\r\n this.initialize()\r\n })\r\n }\r\n\r\n initialize() {\r\n // Load the API data after mounting so the spinner gets rendered first\r\n apiCallsCommercial.apiGetProject(this.state.projectID)\r\n .then(projectData => {\r\n this.setState({\r\n project: projectData,\r\n fillQuoteRequirement: projectData.FilledQuoteRequirement ? projectData.FilledQuoteRequirement : 10\r\n })\r\n\r\n return apiCallsCommercial.apiGetBoard(this.state.projectID, this.state.boardID)\r\n })\r\n .then(boardData => {\r\n this.setState({ board: boardData })\r\n\r\n // Load the breaker options\r\n return apiCallsCommercial.apiGetBoardOption()\r\n })\r\n .then(boardOptionData => {\r\n this.tempBoardOptionData = boardOptionData\r\n this.setState({\r\n boardOptionData: boardOptionData\r\n })\r\n\r\n return apiCallsCommercial.apiGetBoardOptionLabels()\r\n })\r\n .then(boardOptionLabels => {\r\n // Once we get the board option labels, we need to alter it, as the chassis 1 / 2 pole counts needs to be dynamically driven via the boardOptionData\r\n const chassis1PoleCount = []\r\n const chassis2PoleCount = []\r\n\r\n this.tempBoardOptionData.forEach(board => {\r\n const check1Data = chassis1PoleCount.find(check => check.value === board.Chassis1PoleCount)\r\n if (!check1Data && board.Chassis1PoleCount) {\r\n chassis1PoleCount.push({\r\n value: board.Chassis1PoleCount,\r\n label: `${board.Chassis1PoleCount}`\r\n })\r\n }\r\n\r\n const check2Data = chassis2PoleCount.find(check => check.value === board.Chassis2PoleCount)\r\n if (!check2Data && board.Chassis2PoleCount) {\r\n chassis2PoleCount.push({\r\n value: board.Chassis2PoleCount,\r\n label: `${board.Chassis2PoleCount}`\r\n })\r\n }\r\n })\r\n\r\n boardOptionLabels.OptionsChassis1PoleCount = chassis1PoleCount.sort((a, b) => { return (a.value > b.value) ? 1 : -1 })\r\n boardOptionLabels.OptionsChassis2PoleCount = chassis2PoleCount.sort((a, b) => { return (a.value > b.value) ? 1 : -1 })\r\n\r\n // All done, set it to state\r\n this.setState({\r\n boardOptions: boardOptionLabels\r\n })\r\n\r\n return apiCallsCommercial.apiGetBreakerOptions()\r\n })\r\n .then(breakerTypeData => {\r\n this.tempBreakerTypeData = breakerTypeData\r\n this.setState({\r\n breakerOptionData: breakerTypeData\r\n })\r\n\r\n // Load the board misc parts after the project has been loaded\r\n return apiCallsCommercial.apiGetBreakerOptionLabels()\r\n })\r\n .then(breakerTypeLabelsData => {\r\n // Once we get the breaker option labels, we need to alter it, as the chassis 1 / 2 pole counts needs to be\r\n // dynamically driven via the breakerOptionData\r\n const breakerCurrentRatings = []\r\n this.tempBreakerTypeData.forEach(breaker => {\r\n const check1Data = breakerCurrentRatings.find(check => check.value === breaker.CurrentRating)\r\n if (!check1Data && breaker.CurrentRating) {\r\n breakerCurrentRatings.push({\r\n value: breaker.CurrentRating,\r\n label: `${breaker.CurrentRating}A`\r\n })\r\n }\r\n })\r\n\r\n breakerTypeLabelsData.OptionsCurrentRating = breakerCurrentRatings.sort((a, b) => { return (a.value > b.value) ? 1 : -1 })\r\n\r\n this.setState({\r\n breakerOptions: breakerTypeLabelsData\r\n })\r\n\r\n // Load the board misc parts after the project has been loaded\r\n return apiCallsCommercial.apiGetBoardMiscParts()\r\n })\r\n .then(miscData => {\r\n this.setState({\r\n chassisOptions: miscData.FittedOptions,\r\n miscParts: miscData.LooseSupplyItems\r\n }, () => {\r\n this.setState({ totalLooseItems: this.getTotalLooseItems() })\r\n this.checkLooseOptionPlinthPopup()\r\n })\r\n\r\n // Load the user settings\r\n return apiCallsCommercial.apiUserSettings()\r\n })\r\n .then(userData => {\r\n this.setState({\r\n userData: userData,\r\n userId: userData.UserID,\r\n wholesalerBranchID: userData.PreferredWholesaler1ItemID,\r\n favBreakers: userData.FavouriteBreakers\r\n })\r\n\r\n return apiCallsCommercial.apiGetAllParts()\r\n })\r\n .then(allParts => {\r\n this.setState({\r\n commercialAllPartsAvailable: allParts,\r\n isLoading: false\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n startAddingBreaker() {\r\n this.setState({\r\n isBreakerModalOpen: true,\r\n editedBreaker: {\r\n idInCollection: null,\r\n isFav: false\r\n }\r\n })\r\n }\r\n\r\n closeBreakerModal() {\r\n this.setState({ isBreakerModalOpen: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n // Get the currently editing breaker\r\n getEditingBreaker() {\r\n if (!this.state.breakerOptionData || !this.state.editedBreaker.idInCollection) { return null }\r\n\r\n if (this.state.editedBreaker.isFav) {\r\n return this.state.favBreakers.find(item => item.ItemID === this.state.editedBreaker.idInCollection)\r\n } else {\r\n return this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === this.state.editedBreaker.idInCollection)\r\n }\r\n }\r\n\r\n getBreaker(breakerID) {\r\n return this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === breakerID)\r\n }\r\n\r\n isBreakerFavourite(BreakerTypeItemID, ParentBreakerTypeItemID) {\r\n if (ParentBreakerTypeItemID) {\r\n return this.state.favBreakers.find(item => item.BreakerTypeItemID === BreakerTypeItemID && item.ParentBreakerTypeItemID === ParentBreakerTypeItemID) !== undefined\r\n } else {\r\n return this.state.favBreakers.find(item => item.BreakerTypeItemID === BreakerTypeItemID) !== undefined\r\n }\r\n\r\n }\r\n\r\n getBreakerFavourite(BreakerTypeItemID, ParentBreakerTypeItemID) {\r\n if (ParentBreakerTypeItemID) {\r\n return this.state.favBreakers.find(item => item.BreakerTypeItemID === BreakerTypeItemID && item.ParentBreakerTypeItemID === ParentBreakerTypeItemID)\r\n } else {\r\n return this.state.favBreakers.find(item => item.BreakerTypeItemID === BreakerTypeItemID)\r\n }\r\n }\r\n\r\n addBreaker(breakerTypeId, parentBreakerTypeId = 0) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsCommercial.apiSaveBoardBreakerToolbox(this.state.boardID, breakerTypeId, parentBreakerTypeId)\r\n .then(toolboxBreaker => {\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerToolboxCollection)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedBreakers.push(toolboxBreaker)\r\n updatedBoard.ProjectBoardBreakerToolboxCollection = updatedBreakers\r\n\r\n // Show tutorial once 1 breaker is added and only if Drag and Drop is enabled. And remember it, so we don't display it again to the user.\r\n if (window.localStorage.getItem('hasSeenTutorial') === null && updatedBreakers.length === 1 && this.state.isDragAndDropEnabled) {\r\n this.setState({ showDragNDropTutorial: true })\r\n window.setTimeout(() => this.setState({ showDragNDropTutorial: false }), 6000)\r\n window.localStorage.setItem('hasSeenTutorial', 'true')\r\n }\r\n\r\n this.setState({ board: updatedBoard }, () => {\r\n analyticsDataLayer.addBreaker({\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(), \r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"project_type\": 'Commercial',\r\n \"funnel_step\": '1',\r\n \"funnel_total_steps\": '1'\r\n })\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.closeBreakerModal()\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n handleDeletingBreaker(breakerID) {\r\n const breaker = this.getBreaker(breakerID)\r\n const isBreakerFavourite = this.isBreakerFavourite(breakerID)\r\n\r\n if (isBreakerFavourite) {\r\n this.deleteFavBreaker(breakerID, breaker.BreakerTypeItemID, breaker.ParentBreakerTypeItemID)\r\n } else {\r\n this.deleteBreaker(breakerID, breaker.BreakerTypeItemID, breaker.ParentBreakerTypeItemID)\r\n }\r\n }\r\n\r\n deleteBreaker(breakerID, breakerTypeId, parentBreakerTypeId = 0) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsCommercial.apiSaveBoardBreakerToolbox(this.state.boardID, breakerTypeId, parentBreakerTypeId, breakerID, true)\r\n .then((deletedBreaker) => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerToolboxCollection.filter(item => item.ItemID !== breakerID)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerToolboxCollection = updatedBreakers\r\n\r\n this.setState({\r\n board: updatedBoard,\r\n editedBreaker: {\r\n idInCollection: null,\r\n isFav: false\r\n }\r\n }, () => {\r\n analyticsDataLayer.removeFromCart({\r\n \"currency\": 'AUD',\r\n \"value\": deletedBreaker.Price,\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(), \r\n \"items\": [\r\n {\r\n \"item_id\": deletedBreaker.BreakerTypeReadOnly.BreakerReference,\r\n \"item_name\": deletedBreaker.BreakerTypeReadOnly.DrawingDesc, // MCB-10kA-1P-16A\r\n \"quantity\": deletedBreaker?.BreakerTypeReadOnly?.PoleCount ? parseInt(deletedBreaker.BreakerTypeReadOnly.PoleCount) : 0,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": deletedBreaker.Category,\r\n \"item_variant\": '',\r\n \"price\": deletedBreaker.Price\r\n }\r\n ]\r\n })\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => this.setState({ isLoading: false }))\r\n }\r\n\r\n handleToggleBreakerFavourite(breakerID, ParentBreakerTypeItemID) {\r\n const breaker = this.getBreaker(breakerID)\r\n const favouriteBreaker = this.getBreakerFavourite(breaker.BreakerTypeItemID, ParentBreakerTypeItemID)\r\n const isBreakerFavourite = this.isBreakerFavourite(breaker.BreakerTypeItemID, ParentBreakerTypeItemID)\r\n\r\n var favouriteBreakerItemID = 0\r\n if (isBreakerFavourite) {\r\n favouriteBreakerItemID = favouriteBreaker.ItemID\r\n }\r\n\r\n this.toggleBreakerFavourite(favouriteBreakerItemID, breaker.BreakerTypeItemID, breaker.ParentBreakerTypeItemID, isBreakerFavourite)\r\n }\r\n\r\n toggleBreakerFavourite(ItemID, breakerTypeId, parentBreakerTypeId = 0, isBreakerFavourite) {\r\n this.setState({ isLoading: true })\r\n\r\n var favouriteItemID = 0\r\n if (isBreakerFavourite) {\r\n favouriteItemID = ItemID\r\n }\r\n\r\n apiCallsCommercial.apiSaveFavBreaker(this.state.userID, breakerTypeId, parentBreakerTypeId, favouriteItemID, isBreakerFavourite)\r\n .then(favBreaker => {\r\n let updatedBreakers = []\r\n if (isBreakerFavourite) {\r\n updatedBreakers = this.state.favBreakers.filter(item => item.ItemID !== ItemID)\r\n } else {\r\n updatedBreakers = cloneDeep(this.state.favBreakers)\r\n updatedBreakers.push(favBreaker)\r\n }\r\n\r\n this.setState({ favBreakers: updatedBreakers })\r\n\r\n if (!isBreakerFavourite) {\r\n let breakerItem = this.state.board.ProjectBoardBreakerToolboxCollection.find(res => res.BreakerTypeItemID === breakerTypeId)\r\n analyticsDataLayer.addToFavourites({\r\n \"currency\": 'AUD',\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(), \r\n \"value\": breakerItem.Price,\r\n \"items\": [{\r\n \"item_id\": breakerItem.BreakerTypeReadOnly.BreakerReference,\r\n \"item_name\": breakerItem.BreakerTypeReadOnly.DrawingDesc,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": breakerItem.Category,\r\n \"item_variant\": '',\r\n \"price\": breakerItem.Price,\r\n \"quantity\": 1\r\n }]\r\n })\r\n } else {\r\n analyticsDataLayer.removeFromFavourites({\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID,\r\n })\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => this.setState({ isLoading: false }))\r\n }\r\n\r\n getCurrentBoardData() {\r\n return this.state.boardOptionData.find(item => item.ItemID === this.state.board.BoardTypeID)\r\n }\r\n\r\n // ------------------------------\r\n // Chassis board functions\r\n // ------------------------------\r\n\r\n // Get the breakers placed on the currently focused chassis\r\n getChassisBoardBreakers(chassisIndex = this.state.selectedChassisIndex) {\r\n if (!this.state.board.ProjectBoardBreakerCollection || !this.state.board.ProjectBoardBreakerCollection.length) { return []; }\r\n\r\n return this.state.board.ProjectBoardBreakerCollection.filter(boardBreaker => {\r\n const breakerObj = this.state.breakerOptionData.find(dataItem => dataItem.ItemID === boardBreaker.BreakerTypeItemID);\r\n return (breakerObj && boardBreaker.ChassisIndex === chassisIndex && !boardBreaker.BreakerIsParent);\r\n });\r\n }\r\n\r\n // Checks if chassis position 2 should be disabled or not\r\n checkIfIndex2IsDisabled() {\r\n if (!this.state.board.ProjectBoardFittedOptionCollection || !this.state.board.ProjectBoardFittedOptionCollection.length) {\r\n return false\r\n }\r\n\r\n // If Board option 2 or 3 is applied, then then we need to disable board index 2\r\n const checkOption = this.state.board.ProjectBoardFittedOptionCollection.find(item => item.FittedOptionItemID === 2 || item.FittedOptionItemID === 3)\r\n return checkOption ? true : false\r\n }\r\n\r\n getDisabledIndex2ComponentName() {\r\n if (!this.state.board.ProjectBoardFittedOptionCollection || !this.state.board.ProjectBoardFittedOptionCollection.length) {\r\n return ''\r\n }\r\n\r\n const checkOption = this.state.board.ProjectBoardFittedOptionCollection.find(item => item.FittedOptionItemID === 2 || item.FittedOptionItemID === 3)\r\n\r\n if (checkOption === undefined) {\r\n return ''\r\n } else {\r\n return checkOption.FittedOptionReadOnly.TypeDescription\r\n }\r\n }\r\n\r\n // Get the number of poles already used up by breakers in a specific chassis\r\n getConfiguredPoleCount(chassisIndex) {\r\n let count = 0\r\n this.state.board.ProjectBoardBreakerCollection.forEach(boardBreaker => {\r\n const breakerObj = this.state.breakerOptionData.find(dataItem => dataItem.ItemID === boardBreaker.BreakerTypeItemID)\r\n if (breakerObj && boardBreaker.ChassisIndex === chassisIndex && !boardBreaker.BreakerIsParent) {\r\n count += breakerObj.PoleCount\r\n }\r\n })\r\n\r\n // For first chassis we need to check if position 2 is filled with emergency lighting\r\n if (chassisIndex === 1 && this.checkIfIndex2IsDisabled()) {\r\n count++\r\n }\r\n\r\n return count\r\n }\r\n\r\n getChassisPercentComplete(chassisIndex) {\r\n const boardData = this.getCurrentBoardData()\r\n const total = boardData[`Chassis${chassisIndex}PoleCount`]\r\n let doneCount = this.getConfiguredPoleCount(chassisIndex)\r\n let notRoundedValue = doneCount / total * 100\r\n let flooredValue = Math.floor(notRoundedValue)\r\n\r\n if (notRoundedValue - flooredValue > 0.5) {\r\n return Math.ceil(notRoundedValue)\r\n } else {\r\n return flooredValue\r\n }\r\n\r\n }\r\n\r\n selectChassis(index) {\r\n this.setState({ selectedChassisIndex: index })\r\n }\r\n\r\n getUsedCount(breakerObject, parentBreakerTypeId) {\r\n if (!this.state.board.ProjectBoardBreakerCollection) { return 0 }\r\n\r\n return this.state.board.ProjectBoardBreakerCollection.filter(item => {\r\n if (parentBreakerTypeId) {\r\n return item.ParentBreakerTypeItemID === parentBreakerTypeId\r\n } else {\r\n return item.BreakerTypeItemID === breakerObject.ItemID\r\n }\r\n }).length\r\n }\r\n\r\n isBreakerDisabled(breakerObject, parentBreakerTypeId) {\r\n const boardData = this.getCurrentBoardData()\r\n\r\n // Disable the breaker if this is a large breaker and we are looking at a standard board\r\n if (boardData.ChassisType !== 'Hybrid' && breakerObject.CurrentRating >= 80) {\r\n return true;\r\n }\r\n\r\n // Disable the breaker if the board's breaking capacity does not match the breaker's\r\n const breakCode = breakerObject.TypeCode.split('-');\r\n if (breakCode.length < 2) {\r\n // Disable the breaker if it's got a weird typecode that doesnt follow the pattern....\r\n return true;\r\n }\r\n if (breakerObject.TypeCode !== '3PH-VIGI' && !breakCode[1].startsWith(`${this.state.board.BreakingCapacity}`)) {\r\n // For non-VIGI breakers, if the code does not start with the board's breaking capactity, then it should be disabled\r\n return true;\r\n }\r\n\r\n // If the breaker is a VIGI breaker, we need to check the breacking capacity of its parent\r\n if (breakerObject.TypeCode === '3PH-VIGI') {\r\n const parentBreaker = this.state.breakerOptionData.find(item => item.ItemID === parentBreakerTypeId);\r\n const parentBreakCode = parentBreaker.TypeCode.split('-');\r\n if (parentBreakCode.length < 2) {\r\n // Disable the breaker if it's got a weird typecode that doesnt follow the pattern....\r\n return true;\r\n }\r\n if (!parentBreakCode[1].startsWith(`${this.state.board.BreakingCapacity}`)) {\r\n // For non-VIGI breakers, if the code does not start with the board's breaking capactity, then it should be disabled\r\n return true;\r\n }\r\n }\r\n\r\n // All passed, not disabled\r\n return false;\r\n }\r\n\r\n // Work out the first available board slot to add the specific breaker and then add the breaker to the board if\r\n // such a slot is found - this function is triggered when a breaker is triggered to be auto added\r\n autoAddbreaker(breakerId, BreakerTypeItemID) {\r\n if (!breakerId || this.state.isAutoAdding) { return; }\r\n\r\n const useBreaker = this.getBreakerDataForPlacing(breakerId, BreakerTypeItemID)\r\n const boardData = this.getCurrentBoardData()\r\n const polesNeeded = useBreaker.PoleCount\r\n const chassisPoles = this.state.selectedChassisIndex === 2 ? boardData.Chassis2PoleCount : boardData.Chassis1PoleCount\r\n const breakers = this.getChassisBoardBreakers()\r\n const indexOffset = this.state.selectedChassisIndex === 2 ? boardData.Chassis1PoleCount : 0\r\n\r\n // Work out the check start / max index based on if the breaker is a 27mm pitch breaker or not - return empty array is the wrong breaker is used on the wrong board\r\n const breakerSize = useBreaker.CurrentRating >= 80 ? 27 : 18\r\n const largePoleCount = boardData.ChassisType === 'Hybrid' ? boardData.Chassis1PoleCount27mm : 0\r\n if (breakerSize === 27 && !largePoleCount) { return }\r\n\r\n const checkStartIndex = (breakerSize === 27 ? 1 : (largePoleCount + 1 + indexOffset))\r\n const checkMaxPoles = breakerSize === 27 ? largePoleCount : (chassisPoles + indexOffset)\r\n\r\n // Add the breaker to the first index it can be fitted in\r\n for (let i = checkStartIndex; i <= checkMaxPoles; i++) {\r\n let fitIndex = this.getTriggerIndexForPolesFitAtIndex(polesNeeded, i, breakers, checkMaxPoles, checkStartIndex, largePoleCount)\r\n if (fitIndex !== -1) {\r\n this.addBreakerToBoard(fitIndex, useBreaker)\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // This function works out the \"trigger index\" - this is the chassis position index number to give to\r\n // the breaker if the breaker is inserted at the specific slot.\r\n //\r\n // For instance, if there are 4 slots free on the board, and we try to insert a breaker that takes up 3\r\n // poles in the last free slot, then the trigger index will not be on the last free slot, but rather, be\r\n // the index of the previous slot where the breaker can actually fit.\r\n getTriggerIndexForPolesFitAtIndex(poles, index, breakers, maxPoles, startedIndex, largePoleCount, backStep = 0) {\r\n // Fail the check if the index value is not valid or if the method has been stepped back more than its pole counts\r\n if (index < startedIndex || backStep >= poles) { return -1 }\r\n\r\n const finalIndex = index + ((poles - 1) * 2)\r\n\r\n // Check if the final index exceeds the edge of the board\r\n if (finalIndex > maxPoles) {\r\n return this.getTriggerIndexForPolesFitAtIndex(poles, index - 2, breakers, maxPoles, startedIndex, largePoleCount, backStep + 1)\r\n }\r\n\r\n // Check if all pole spots required is free of breakers\r\n for (let i = index; i <= finalIndex; i = i + 2) {\r\n if (this.hasBreakerAtIndex(i, breakers, largePoleCount)) {\r\n // The current checking slot is covered by another breaker, check if we can fit the breaker a bit higher up\r\n return this.getTriggerIndexForPolesFitAtIndex(poles, index - 2, breakers, maxPoles, startedIndex, largePoleCount, backStep + 1)\r\n }\r\n }\r\n\r\n // All check passed, return true\r\n // OMFG - if the breaker has 3 or more poles, than its display index on the board is actually offset by 2 .... WHY! GOD! WHY!\r\n return poles >= 3 ? index + 2 : index\r\n }\r\n\r\n // This function checks if there is a breaker covering the specific chassis position index\r\n hasBreakerAtIndex(index, breakers, largePoleCount) {\r\n // If index is 2 and we looking at chassis 1 then check if the slot is blocked by a fitted option\r\n if (index === (2 + largePoleCount) && this.state.selectedChassisIndex === 1 && this.checkIfIndex2IsDisabled()) {\r\n return true\r\n }\r\n\r\n // No breaker collection, no breaker at index\r\n if (!breakers.length) {\r\n return false\r\n }\r\n\r\n // Check if there is already a breaker on the index\r\n const check = breakers.find(item => item.ChassisPositionIndex === index && item.ChassisIndex === this.state.selectedChassisIndex)\r\n if (check) { return true }\r\n\r\n // Check if the index is covered by larger breakers\r\n const colBreakers = breakers.filter(item => {\r\n const breakerObj = this.getBreakerDataObj(item.BreakerTypeItemID)\r\n return (isOdd(item.ChassisPositionIndex) === isOdd(index) && breakerObj.PoleCount >= 3)\r\n })\r\n\r\n if (!colBreakers.length) { return false }\r\n\r\n let foundBreaker = false\r\n colBreakers.forEach(item => {\r\n // OMFG - if the breaker has 3 or more poles, than its display index on the board is actually offset by 2 .... WHY! GOD! WHY!\r\n const breakerObj = this.getBreakerDataObj(item.BreakerTypeItemID);\r\n const startIndex = item.ChassisPositionIndex - 2;\r\n const endIndex = startIndex + ((breakerObj.PoleCount - 1) * 2);\r\n\r\n // Check if the index is covered by a big breaker\r\n if (startIndex <= index && endIndex >= index) {\r\n foundBreaker = true\r\n }\r\n })\r\n\r\n // Still here... that means no breaker at index\r\n return foundBreaker\r\n }\r\n\r\n // Get the breaker data from the breaker type id\r\n getBreakerDataObj(breakerTypeId) {\r\n return this.state.breakerOptionData.find(item => item.ItemID === breakerTypeId)\r\n }\r\n\r\n addBreakerToBoard(positionIndex, breakerData = null) {\r\n // Ignore the request if we are already adding breaker in this position\r\n if (this.state.isAddingBreaker.indexOf(positionIndex) !== -1) {\r\n return\r\n }\r\n\r\n // Update the state with the breakers position we are adding\r\n this.setState({\r\n isAddingBreaker: this.state.isAddingBreaker.concat([positionIndex])\r\n })\r\n\r\n const selectedBreakerData = breakerData ? breakerData : this.state.selectedBreaker.data\r\n\r\n // Here we are to improve the front-end performance when adding breakers. We don't want to display a loader each time and wait for a second or two\r\n // What we are going to do is to display a loader only when adding the very first breaker, once we have at least one breaker\r\n // We can use that as a sample object, reset it wrapping properties and add it immediatly locally, so it can be displayed on the board\r\n // Once the server response is ready we will override it or remove it if there were any errors\r\n\r\n let sampleBreaker = cloneDeep(SAMPLE_BREAKER)\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n sampleBreaker.BreakerTypeReadOnly = selectedBreakerData\r\n // Reset Item ID, so we can use it as an indicator to disable delete button/drag&drop until the response from the server \r\n // And to avoid some issues when user tries to do operations on this breakers before it's properly saved\r\n sampleBreaker.BreakerTypeItemID = selectedBreakerData.ItemID\r\n sampleBreaker.ItemID = 0\r\n sampleBreaker.ChassisIndex = this.state.selectedChassisIndex\r\n sampleBreaker.ChassisPositionIndex = positionIndex\r\n\r\n updatedBreakers.push(sampleBreaker)\r\n\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n\r\n apiCallsCommercial.apiSaveBreakerToChassis(this.state.boardID, selectedBreakerData.BreakerTypeItemID, selectedBreakerData.ParentBreakerTypeItemID, selectedBreakerData.ParentBoardBreakerItemID, this.state.selectedChassisIndex, positionIndex)\r\n .then(boardBreaker => {\r\n const existingTemporaryBreakerIndex = this.state.board.ProjectBoardBreakerCollection.findIndex(item => item.ChassisPositionIndex === boardBreaker.ChassisPositionIndex && item.ChassisIndex === this.state.selectedChassisIndex)\r\n\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedBreakers[existingTemporaryBreakerIndex] = boardBreaker\r\n\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n // Server will return the percentages of the board completion even if it is just a breaker return data\r\n updatedBoard.Chassis1PercentComplete = boardBreaker.Chassis1PercentComplete\r\n updatedBoard.Chassis2PercentComplete = boardBreaker.Chassis2PercentComplete\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n apiCallsCommercial.apiGetBoard(this.state.projectID, this.state.boardID)\r\n .then(boardData => {\r\n // Update the board breakers quantity with the existing breakers quantity\r\n if (this.state.board.ProjectBoardBreakerToolboxCollection?.length > 0 && boardData.ProjectBoardBreakerToolboxCollection?.length > 0) {\r\n boardData.ProjectBoardBreakerToolboxCollection.forEach((item) => {\r\n let toolboxBreaker = this.state.board.ProjectBoardBreakerToolboxCollection.find(toolboxItem => toolboxItem.ItemID === item.ItemID)\r\n item.quantity = toolboxBreaker.quantity ? toolboxBreaker.quantity : 1\r\n })\r\n }\r\n this.setState({ board: boardData })\r\n })\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard }, () => {\r\n if (this.isEnoughFilledToGenerateQuote() && !this.state.hasAlreadyShownEnoughQuoteInfo) {\r\n this.setState({ pageInfo: 'You can now view a quote for this project!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n }\r\n })\r\n\r\n analyticsDataLayer.addToCart({\r\n \"currency\": 'AUD',\r\n \"value\": boardBreaker.Price,\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.board.ItemID.toString(),\r\n \"items\": [\r\n {\r\n \"item_id\": boardBreaker.BreakerTypeReadOnly.BreakerReference,\r\n \"item_name\": boardBreaker.BreakerTypeReadOnly.DrawingDesc, //MCB-10kA-1P-16A\r\n \"quantity\": boardBreaker.BreakerTypeReadOnly.PoleCount,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": boardBreaker.Category,\r\n \"item_variant\": '',\r\n \"price\": boardBreaker.Price\r\n }\r\n ]\r\n })\r\n\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n // Remove the breaker from the board if there was an error\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers.filter(item => item.ItemID !== 0)\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingBreaker: this.state.isAddingBreaker.filter(item => item !== positionIndex) })\r\n })\r\n }\r\n\r\n deleteBreakerFromBoard(positionIndex, boardBreakerId) {\r\n const selectedBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === boardBreakerId)\r\n\r\n apiCallsCommercial.apiSaveBreakerToChassis(this.state.boardID, selectedBoardBreaker.BreakerTypeItemID, selectedBoardBreaker.ParentBreakerTypeItemID, selectedBoardBreaker.ParentBoardBreakerItemID, this.state.selectedChassisIndex, positionIndex, boardBreakerId, true)\r\n .then((boardBreaker) => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerCollection.filter(item => item.ItemID !== boardBreakerId)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n // Server will return the percentages of the board completion even if it is just a breaker return data\r\n updatedBoard.Chassis1PercentComplete = boardBreaker.Chassis1PercentComplete\r\n updatedBoard.Chassis2PercentComplete = boardBreaker.Chassis2PercentComplete\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard, pageInfo: 'Breaker deleted' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n\r\n analyticsDataLayer.removeFromCart({\r\n \"currency\": 'AUD',\r\n \"value\": selectedBoardBreaker.Price,\r\n \"project_type\": 'Commercial',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(),\r\n \"items\": [\r\n {\r\n \"item_id\": selectedBoardBreaker.BreakerTypeReadOnly.BreakerReference,\r\n \"item_name\": selectedBoardBreaker.BreakerTypeReadOnly.DrawingDesc, // MCB-10kA-1P-16A\r\n \"quantity\": selectedBoardBreaker?.BreakerTypeReadOnly?.PoleCount ? parseInt(selectedBoardBreaker.BreakerTypeReadOnly.PoleCount) : 0,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": selectedBoardBreaker.Category,\r\n \"item_variant\": '',\r\n \"price\": selectedBoardBreaker.Price\r\n }\r\n ]\r\n })\r\n\r\n apiCallsCommercial.apiGetBoard(this.state.projectID, this.state.boardID)\r\n .then(boardData => {\r\n // Update the board breakers quantity with the existing breakers quantity\r\n if (this.state.board.ProjectBoardBreakerToolboxCollection?.length > 0 && boardData.ProjectBoardBreakerToolboxCollection?.length > 0) {\r\n boardData.ProjectBoardBreakerToolboxCollection.forEach((item) => {\r\n let toolboxBreaker = this.state.board.ProjectBoardBreakerToolboxCollection.find(toolboxItem => toolboxItem.ItemID === item.ItemID)\r\n item.quantity = toolboxBreaker.quantity ? toolboxBreaker.quantity : 1\r\n })\r\n }\r\n this.setState({ board: boardData })\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n updateBrekerChassisNote(positionIndex, note) {\r\n const noteBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ChassisPositionIndex === positionIndex && boardBreaker.ChassisIndex === this.state.selectedChassisIndex && !boardBreaker.BreakerIsParent)\r\n\r\n apiCallsCommercial.apiSaveBreakerToChassis(this.state.boardID, noteBoardBreaker.BreakerTypeItemID, noteBoardBreaker.ParentBreakerTypeItemID, noteBoardBreaker.ParentBoardBreakerItemID, this.state.selectedChassisIndex, noteBoardBreaker.ChassisPositionIndex, noteBoardBreaker.ItemID, false, note)\r\n .then(boardBreaker => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerCollection.map(item => {\r\n if (item.ItemID === boardBreaker.ItemID) {\r\n return boardBreaker\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n this.setState({\r\n board: updatedBoard,\r\n pageInfo: 'Breaker notes saved'\r\n })\r\n\r\n window.setTimeout(() => {\r\n this.setState({ pageInfo: '' })\r\n }, 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n displayError(message) {\r\n this.setState({ apiError: message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n }\r\n\r\n handleBreakerDrop(poleIndex, ItemID, BreakerTypeItemID, ParentBreakerTypeItemID) {\r\n const useBreaker = this.getBreakerDataForPlacing(ItemID, BreakerTypeItemID, ParentBreakerTypeItemID)\r\n const boardData = this.getCurrentBoardData()\r\n const polesNeeded = useBreaker.PoleCount\r\n const chassisPoles = this.state.selectedChassisIndex === 2 ? boardData.Chassis2PoleCount : boardData.Chassis1PoleCount\r\n const breakers = this.getChassisBoardBreakers()\r\n const indexOffset = this.state.selectedChassisIndex === 2 ? boardData.Chassis1PoleCount : 0\r\n\r\n // Work out the check start / max index based on if the breaker is a 27mm pitch breaker or not - return empty array is the wrong breaker is used on the wrong board\r\n const breakerSize = useBreaker.CurrentRating >= 80 ? 27 : 18\r\n const largePoleCount = boardData.ChassisType === 'Hybrid' ? boardData.Chassis1PoleCount27mm : 0\r\n if (breakerSize === 27 && !largePoleCount) { return }\r\n\r\n const checkStartIndex = (breakerSize === 27 ? 1 : (largePoleCount + 1 + indexOffset))\r\n const checkMaxPoles = breakerSize === 27 ? largePoleCount : (chassisPoles + indexOffset)\r\n\r\n // Find the first index the current breaker can be fitted in, and if the dropped index is lower then the first position available\r\n // it means that it's not allowed to add it there. We do it for drag-n-drop functionality to pass through the same pre existing complex checks\r\n let fitIndex = null\r\n for (let i = checkStartIndex; i <= checkMaxPoles; i++) {\r\n fitIndex = this.getTriggerIndexForPolesFitAtIndex(polesNeeded, i, breakers, checkMaxPoles, checkStartIndex, largePoleCount)\r\n if (fitIndex !== null && fitIndex !== -1) {\r\n break\r\n }\r\n }\r\n\r\n if (fitIndex !== -1) {\r\n // As we now BE operates on weird shifting index e.g. position 8 for 2+ pole breakers is saved by passing position = 10 to the server\r\n // We need real pole index to perform some checks here\r\n let realPoleIndex = poleIndex\r\n if (useBreaker.PoleCount > 1) realPoleIndex = realPoleIndex - 2\r\n\r\n // If the breaker size is 18 and wanted position is minor than the first available fit position and the wanted position is\r\n // inside large pole count (27), then trigger an error, otherwise proceed\r\n if (breakerSize === 18 && (poleIndex < fitIndex || realPoleIndex <= largePoleCount)) {\r\n this.displayError('This 18mm pitch breaker can not be added to this position!')\r\n return\r\n }\r\n\r\n // If it's a larger breaker and we try to position it outside of the large pole count or inside large pole count, but\r\n // the size will go over not allowed size then trrigger an error\r\n if (breakerSize === 27 && (realPoleIndex > largePoleCount || realPoleIndex + polesNeeded > largePoleCount)) {\r\n this.displayError('This 27mm pitch breaker can not be added to this position!')\r\n return\r\n }\r\n\r\n // If nothing went wrong, then save the breaker to the board\r\n this.addBreakerToBoard(poleIndex, useBreaker)\r\n\r\n } else {\r\n this.displayError('This circuit breaker can not be added!')\r\n }\r\n }\r\n\r\n // select the breaker from the toolbox / fav collection\r\n getBreakerDataForPlacing(breakerId, BreakerTypeItemID, ParentBreakerTypeItemID) {\r\n let selectedBreaker = null\r\n if (this.isBreakerFavourite(BreakerTypeItemID, ParentBreakerTypeItemID)) {\r\n selectedBreaker = this.getBreakerFavourite(BreakerTypeItemID, ParentBreakerTypeItemID)\r\n } else {\r\n selectedBreaker = this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === breakerId)\r\n }\r\n\r\n const useBreaker = this.state.breakerOptionData.find(item => selectedBreaker ? item.ItemID === selectedBreaker.BreakerTypeItemID : false)\r\n\r\n if (useBreaker) {\r\n useBreaker['BreakerTypeItemID'] = selectedBreaker.BreakerTypeItemID;\r\n useBreaker['ParentBreakerTypeItemID'] = selectedBreaker.ParentBreakerTypeItemID;\r\n useBreaker['ParentBoardBreakerItemID'] = selectedBreaker.ParentBoardBreakerItemID;\r\n }\r\n\r\n return useBreaker\r\n }\r\n\r\n // Calculate the remaining poles on a chassis\r\n getRemainingPoleCount(chassisIndex) {\r\n const configured = this.getConfiguredPoleCount(chassisIndex)\r\n const boardData = this.getCurrentBoardData()\r\n\r\n return boardData['Chassis' + chassisIndex + 'PoleCount'] - configured\r\n }\r\n\r\n updateSelectedMiscParts(selectedParts) {\r\n let newTotalSelectedParts = 0\r\n\r\n this.setState({ isSavingLooseItems: true, isLooseItemsPanelOpen: false })\r\n\r\n // The options data needs to keep the exisitng options and set the isdeleted flag if it has been unchecked\r\n const newDataArray = this.state.board.ProjectBoardLooseSupplyItemCollection.map(item => {\r\n const selectedItem = selectedParts.find(part => part.LooseSupplyItemItemID === item.LooseSupplyItemItemID)\r\n\r\n return {\r\n LooseSupplyItemItemID: item.LooseSupplyItemItemID,\r\n ItemID: item.ItemID,\r\n Quantity: selectedItem ? selectedItem.Quantity : 0,\r\n IsDeleted: (!selectedItem || selectedItem.Quantity === 0)\r\n }\r\n })\r\n\r\n selectedParts.forEach(value => {\r\n // Add in new option id if its not in the existing board option collections\r\n const existingOption = newDataArray.find(item => item.LooseSupplyItemItemID === value.LooseSupplyItemItemID)\r\n if (!existingOption) {\r\n newDataArray.push({ LooseSupplyItemItemID: value.LooseSupplyItemItemID, Quantity: value.Quantity })\r\n }\r\n })\r\n\r\n newDataArray.forEach(value => {\r\n if (!value.IsDeleted) {\r\n newTotalSelectedParts += value.Quantity\r\n }\r\n })\r\n\r\n this.setState({ totalLooseItems: newTotalSelectedParts })\r\n\r\n apiCallsCommercial.apiSaveBoardMiscParts(this.state.projectID, this.state.boardID, newDataArray)\r\n .then(boardData => {\r\n this.setState({ board: boardData }, () => this.checkLooseOptionPlinthPopup())\r\n })\r\n .catch(error => alert(error.message))\r\n .then(() => this.setState({ isSavingLooseItems: false }))\r\n }\r\n\r\n hasMaxBoardLimitBeenReached() {\r\n // Function to check if the user has reached max board limit or not\r\n // App should not let user copy or add boards if they are at the limit.\r\n // Hardcode the max board limit if its not returned from the API\r\n const boardLimit = this.state.project.MaxBoardLimit ? this.state.project.MaxBoardLimit : 8\r\n return (this.state.project.ProjectBoards.length >= boardLimit)\r\n }\r\n\r\n addNewBoard() {\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS + '?orderID=' + this.state.projectID + '&newBoard=true')\r\n }\r\n\r\n startConfiguringBoard = (isNew) => {\r\n if (isNew !== undefined && isNew) {\r\n if (this.hasMaxBoardLimitBeenReached()) {\r\n this.setState({ displayMaxBoardLimitReached: true })\r\n } else {\r\n this.setState({ isConfiguringBoard: true, boardToConfigure: null, shouldRedirectToBoard: true })\r\n }\r\n } else {\r\n this.setState({ isConfiguringBoard: true, boardToConfigure: this.state.board })\r\n }\r\n }\r\n\r\n stopConfiguringBoard = (board) => {\r\n // TODO: complete redirecting to the new board after it was created, it needs proper debugging\r\n // if (this.state.shouldRedirectToBoard) {\r\n // this.props.history.push(CONST.PAGES.CONFIGURE_CHASSIS + '?projectID=' + this.state.projectID + '&boardID=' + board.ItemID)\r\n\r\n // this.setState({\r\n // projectID: getUrlParameter('projectID'),\r\n // boardID: getUrlParameter('boardID')\r\n // }, () => {\r\n // this.initialize()\r\n // })\r\n // } else {\r\n this.setState({ isConfiguringBoard: false, boardToConfigure: null })\r\n commonFunctionsService.closeModals()\r\n // }\r\n }\r\n\r\n viewQuote() {\r\n // If you don't have any boards...\r\n if (!this.state.project.ProjectBoards || !this.state.project.ProjectBoards.length) {\r\n this.setState({ apiError: 'Your project needs at least one board filled greater than ' + this.state.fillQuoteRequirement + '% to generate a quote.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // You've got boards but not all of them are filled out to minimum levels...\r\n let noEnoughFilled = !this.isEnoughFilledToGenerateQuote()\r\n if (noEnoughFilled) {\r\n this.setState({ apiError: 'Your project needs all boards filled greater than ' + this.state.fillQuoteRequirement + '% to generate a quote.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // Check if all project boards meet the assembly performance checks, display error only for the first one encountered \r\n let projectAssemblyCheck = this.checkProjectAssemblyPerformanceChecks()\r\n if (projectAssemblyCheck !== true) {\r\n this.setState({\r\n apiError: 'Can\\'t generate quote. Please check error message on \"' + projectAssemblyCheck + '\" board.'\r\n })\r\n\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n\r\n\r\n // If you're a contractor you need a selected wholesaler\r\n if (this.state.userData.UserIsContractor && (this.state.wholesalerBranchID === 0 || this.state.wholesalerBranchID === -1)) {\r\n this.setState({ apiError: 'Current user doesn\\'t have a preferred wholesalers configured.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // Finally made it through all the hoops, go to the Quote page.\r\n let pageLink = \"\"\r\n if (this.state.userData.UserIsContractor) {\r\n pageLink += CONST.PAGES.QUOTE + '?projectID=' + this.state.projectID + '&wholesalerBranchID=' + this.state.wholesalerBranchID\r\n this.props.history.push(pageLink)\r\n } else {\r\n pageLink += CONST.PAGES.QUOTE + '?projectID=' + this.state.projectID\r\n this.props.history.push(CONST.PAGES.QUOTE + '?projectID=' + this.state.projectID)\r\n }\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: \"View Quote\",\r\n cta_link: window.location.hostname + pageLink,\r\n cta_location: \"Config board\"\r\n })\r\n }\r\n\r\n isEnoughFilledToGenerateQuote() {\r\n let noEnoughFilled = false\r\n this.state.project.ProjectBoards.map(board => {\r\n if (board.Chassis1PercentComplete < this.state.fillQuoteRequirement ||\r\n ((board.BoardTypeReadOnly && board.BoardTypeReadOnly.ChassisCount === 2) && board.Chassis2PercentComplete < this.state.fillQuoteRequirement)) {\r\n noEnoughFilled = true\r\n return\r\n }\r\n })\r\n\r\n return !noEnoughFilled\r\n }\r\n\r\n checkLooseOptionPlinthPopup() {\r\n let anyPlinthLooseOptionsSelected = false\r\n\r\n this.state.board.ProjectBoardLooseSupplyItemCollection.map(item => {\r\n if (item.IsDeleted === false &&\r\n (item.LooseSupplyItemReadOnly.BOMReference === 'LBASE2GALBK' || item.LooseSupplyItemReadOnly.BOMReference === 'LBASE3GALIP66')) {\r\n anyPlinthLooseOptionsSelected = true\r\n }\r\n })\r\n\r\n this.setState({ shouldDisplayLooseOptionPlinthMessage: anyPlinthLooseOptionsSelected })\r\n }\r\n\r\n // Checks if the project meet assably performance requirements. Will return true if valid, otherwise the name of the first board that has an issue\r\n checkProjectAssemblyPerformanceChecks() {\r\n let checks = true\r\n\r\n for (let index = 0; index < this.state.project.ProjectBoards.length; index++) {\r\n let projectBoard = this.state.project.ProjectBoards[index]\r\n\r\n // Assure we get updated data for currently opened board\r\n if (projectBoard.ItemID === this.state.board.ItemID) {\r\n projectBoard = this.state.board\r\n }\r\n\r\n if (!projectBoard.AssemblyPowerLossCheckSuccess || !projectBoard.Chassis1PowerLossCheckSuccess || !projectBoard.Chassis2PowerLossCheckSuccess || projectBoard.LoadFactorStatusColour === 'red') {\r\n checks = projectBoard.Name\r\n break\r\n }\r\n }\r\n\r\n return checks\r\n }\r\n\r\n getLooseItemSelectedQty(id) {\r\n if (!this.state.board.ProjectBoardLooseSupplyItemCollection || !this.state.board.ProjectBoardLooseSupplyItemCollection.length) { return 0 }\r\n\r\n const checkPart = this.state.board.ProjectBoardLooseSupplyItemCollection.find(item => item.LooseSupplyItemItemID === id)\r\n if (!checkPart) { return 0 }\r\n\r\n return checkPart.Quantity\r\n }\r\n\r\n getTotalLooseItems() {\r\n let totalSelectedQuantity = 0\r\n this.state.miscParts.forEach(opt => {\r\n totalSelectedQuantity = totalSelectedQuantity + this.getLooseItemSelectedQty(opt.ItemID)\r\n })\r\n\r\n return totalSelectedQuantity\r\n }\r\n\r\n handleUpdateQuantity(qty, id) {\r\n const updatedBoard = this.state.board\r\n updatedBoard.ProjectBoardBreakerToolboxCollection = updatedBoard.ProjectBoardBreakerToolboxCollection.map(item => {\r\n if (item.ItemID === id) {\r\n item.quantity = qty\r\n }\r\n return item\r\n })\r\n\r\n this.setState({ board: updatedBoard })\r\n }\r\n\r\n render() {\r\n const breaker = this.state.board.ProjectBoardBreakerCollection?.filter(item => item.ItemID).length\r\n\r\n if (this.state.isLoading) {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Loading\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n // Display loading only when adding the first breaker\r\n if (this.state.isAddingBreaker.length > 0 && breaker === 0) {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Adding Breaker\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n const boardData = this.getCurrentBoardData()\r\n const editingFav = this.state.editedBreaker.isFav\r\n const assemblyPowerLossePercentage = this.state.board.MaxAssemblyPowerLoss > 0 ? (this.state.board.TotalAssemblyPowerLoss * 100 / this.state.board.MaxAssemblyPowerLoss) : 0\r\n const assemblyCurrentPercentage = this.state.board.MaxCurrent > 0 ? (this.state.board.TotalCurrent * 100 / this.state.board.MaxCurrent) : 0\r\n\r\n return (\r\n
    \r\n {\r\n this.state.showDragNDropTutorial &&\r\n \r\n \r\n \r\n }\r\n\r\n {\r\n this.state.isBreakerModalOpen &&\r\n this.closeBreakerModal()}>\r\n\r\n \r\n \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n {this.props.isCommercial ? : }\r\n
    \r\n

    Chassis Configuration

    \r\n

    {this.state.board.Name}

    \r\n\r\n \r\n
    \r\n\r\n
    \r\n \r\n\r\n \r\n\r\n this.setState({ activeBreakersTab: 'all' })}>\r\n
    \r\n All\r\n
    \r\n
    \r\n
    this.setState({ activeBreakersTab: 'favourites' })}>\r\n \r\n
    \r\n Favourites\r\n
    \r\n
    \r\n
    this.setState({ activeBreakersTab: 'boardonly' })}>\r\n \r\n
    \r\n This board only\r\n
    \r\n
    \r\n
    \r\n\r\n {/* */}\r\n
    \r\n {this.state.board.ProjectBoardBreakerToolboxCollection.length === 0 &&\r\n
    \r\n \r\n \r\n \r\n

    \r\n You don’t have any breakers in your library yet.\r\n

    \r\n

    \r\n Add your first breaker above\r\n

    \r\n
    \r\n }\r\n\r\n {/* Render Breakers */}\r\n {this.state.board.ProjectBoardBreakerToolboxCollection.length > 0 &&\r\n
    \r\n {this.state.board.ProjectBoardBreakerToolboxCollection.map((toolboxItem, index) => {\r\n toolboxItem.quantity = toolboxItem.quantity === undefined ? 1 : toolboxItem.quantity\r\n if (this.state.activeBreakersTab === 'all' ||\r\n (this.state.activeBreakersTab === 'favourites' && this.isBreakerFavourite(toolboxItem.BreakerTypeItemID, toolboxItem.ParentBreakerTypeItemID)) ||\r\n (this.state.activeBreakersTab === 'boardonly' && !this.isBreakerFavourite(toolboxItem.BreakerTypeItemID))) {\r\n\r\n const breakerObj = this.state.breakerOptionData.find(dataItem => dataItem.ItemID === toolboxItem.BreakerTypeItemID)\r\n const displayCode = toolboxItem.ParentBreakerCurrentRating ? `${breakerObj.DrawingDesc}-${toolboxItem.ParentBreakerCurrentRating}A` : breakerObj.DrawingDesc\r\n\r\n const availabilityDataForSelectedBreaker = this.state.commercialAllPartsAvailable.find(item => item.ItemCode === breakerObj.BreakerReference)\r\n let validationMessage = ''\r\n if (!availabilityDataForSelectedBreaker.IsInStock) {\r\n validationMessage = `${breakerObj.DrawingDesc} is out of stock. Please, contact au.estimating@se.com`\r\n } else if (availabilityDataForSelectedBreaker.IsLowStock) {\r\n validationMessage = 'Low stock, longer lead times may apply'\r\n } else {\r\n validationMessage = ''\r\n }\r\n\r\n return (\r\n <>\r\n { this.handleDeletingBreaker(itemID) }}\r\n isBreakerFavourite={this.isBreakerFavourite(toolboxItem.BreakerTypeItemID, toolboxItem.ParentBreakerTypeItemID)}\r\n quantity={toolboxItem.quantity}\r\n handleToggleBreakerFavourite={(itemID, ParentBreakerTypeItemID) => { this.handleToggleBreakerFavourite(itemID, ParentBreakerTypeItemID) }}\r\n usedCount={this.getUsedCount(breakerObj, toolboxItem.ParentBreakerTypeItemID)}\r\n isDisabled={this.isBreakerDisabled(breakerObj, toolboxItem.ParentBreakerTypeItemID)}\r\n handleBreakerAutoAdd={(itemID, quantity) => { \r\n quantity = parseInt(quantity)\r\n for (let i = 0; i < quantity; i++) {\r\n setTimeout(() => {\r\n this.autoAddbreaker(itemID, toolboxItem.BreakerTypeItemID) \r\n }, 0)\r\n }\r\n }}\r\n addBreakerToBoard={(poleIndex, ItemID, BreakerTypeItemID, ParentBreakerTypeItemID) => {\r\n this.handleBreakerDrop(poleIndex, ItemID, BreakerTypeItemID, ParentBreakerTypeItemID)\r\n }}\r\n handleUpdateQuantity={(quantity, itemID) => { this.handleUpdateQuantity(quantity, itemID) }}\r\n />\r\n {validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n \r\n )\r\n } else {\r\n return ''\r\n }\r\n })}\r\n
    \r\n }\r\n\r\n
    \r\n\r\n {/* */}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n Loose Items\r\n {this.state.totalLooseItems}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    0 ? ' is-recalculating' : '')}>\r\n

    Assembly Performance

    \r\n
    \r\n
    100 ? ' is-error' : '')}>\r\n
    \r\n \r\n {assemblyPowerLossePercentage.toFixed(2)}% Max. Thermal Losses\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    100 ? ' is-error' : '')}>\r\n
    \r\n \r\n {assemblyCurrentPercentage.toFixed(2)}% Max. Current\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n {\r\n this.state.board.MaxThermalLossesDescription !== null &&\r\n
    {this.state.board.MaxThermalLossesDescription}
    \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n Based on maximum loading at the tee-offs\r\n
    \r\n
    \r\n\r\n
    \r\n {\r\n this.state.board.LoadFactorDescription !== '' && this.state.board.LoadFactorStatusColour === \"red\" &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.board.LoadFactorDescription}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.board.LoadFactorDescription !== '' && this.state.board.LoadFactorStatusColour === \"orange\" &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.board.LoadFactorDescription}\r\n \r\n

    \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n {\r\n this.state.pageInfo !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.pageInfo}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.apiError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.apiError}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.displayMaxBoardLimitReached &&\r\n

    \r\n \r\n \r\n \r\n \r\n You have reached the maximum number of boards per project and cannot ADD or COPY anymore.\r\n \r\n

    \r\n }\r\n\r\n {/* {\r\n this.state.shouldDisplayLooseOptionPlinthMessage &&\r\n

    \r\n \r\n \r\n \r\n \r\n Bottom gland plate will be fitted inside the board and not removable.\r\n \r\n

    \r\n } */}\r\n
    \r\n\r\n
    \r\n
    \r\n\r\n 0 && this.state.board.MaxChassisPowerLoss > 0 ?\r\n ((this.state.board.PowerLossChassis2 / this.state.board.MaxChassisPowerLoss) * 100) : 0\r\n )\r\n :\r\n (this.state.board.PowerLossChassis1 > 0 && this.state.board.MaxChassisPowerLoss > 0 ?\r\n ((this.state.board.PowerLossChassis1 / this.state.board.MaxChassisPowerLoss) * 100) : 0\r\n )\r\n }\r\n powerLossCheckSuccess={this.state.selectedChassisIndex === 2 ? this.state.board.Chassis2PowerLossCheckSuccess : this.state.board.Chassis1PowerLossCheckSuccess}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n\r\n {\r\n this.state.isConfiguringBoard &&\r\n {\r\n this.setState({ board: updatedBoardData })\r\n }}\r\n projectID={this.state.projectID}\r\n />\r\n }\r\n \r\n\r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(ConfigChassis)","import React from 'react'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport RadioObjectGroup from '../../radio-object-group/RadioObjectGroup'\r\n\r\nexport default class BreakerDetailsFormContainerResidential extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n // Internal states that no one else needs to know about, holds info on the selection options\r\n this.initStates(this.props)\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (!this.props.breaker && !nextProps.breaker) {\r\n return\r\n }\r\n\r\n if (!this.props.breaker || !nextProps.breaker || this.props.breaker.ItemID !== nextProps.breaker.ItemID) {\r\n this.initStates(nextProps, true)\r\n }\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n // const existingBreaker = propsData.breaker ? propsData.breakerOptionData.find(item => item.ItemID === propsData.breaker.BreakerTypeItemID) : null\r\n const updatedState = {\r\n breakerDetails: {\r\n TypeOfDevice: null,\r\n NumberOfPoles: null,\r\n CurrentRating: null\r\n },\r\n validationMessage: '',\r\n residentialAllPartsAvailable: propsData.residentialAllPartsAvailable,\r\n }\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n createCall() {\r\n const finalSelections = cloneDeep(this.state.breakerDetails)\r\n const selectedBreaker = this.props.breakerOptionData.find(breaker => {\r\n return breaker.TypeOfDevice === finalSelections.TypeOfDevice &&\r\n breaker.NumberOfPoles === finalSelections.NumberOfPoles &&\r\n breaker.CurrentRating === finalSelections.CurrentRating\r\n })\r\n\r\n if (selectedBreaker === undefined) {\r\n this.setState({ validationMessage: 'There was an error finding a breaker, please contact the administrator of the website.' })\r\n return\r\n }\r\n\r\n this.props.createCallback(selectedBreaker.ItemID)\r\n }\r\n\r\n // Update the selected option value in local state\r\n optionSelectedCall(value, key) {\r\n const updatebreaker = cloneDeep(this.state.breakerDetails)\r\n updatebreaker[key] = value\r\n\r\n if (key === 'PoleType') updatebreaker['CurrentRating'] = null\r\n if (key === 'TypeOfDevice') {\r\n updatebreaker['CurrentRating'] = null\r\n updatebreaker['NumberOfPoles'] = null\r\n\r\n // Some devices have only one option for NumberOfPoles, in that case we select it by default\r\n const availableValues = this.getNumberOfPolesEnabledOptions(value)\r\n if (availableValues.length === 1) {\r\n updatebreaker['NumberOfPoles'] = availableValues[0]\r\n }\r\n }\r\n\r\n this.setState({ breakerDetails: updatebreaker }, () => {\r\n if (this.state.breakerDetails.CurrentRating !== null) {\r\n const finalSelections = cloneDeep(this.state.breakerDetails)\r\n const selectedBreaker = this.props.breakerOptionData.find(breaker => {\r\n return breaker.TypeOfDevice === finalSelections.TypeOfDevice &&\r\n breaker.NumberOfPoles === finalSelections.NumberOfPoles &&\r\n breaker.CurrentRating === finalSelections.CurrentRating\r\n })\r\n\r\n const availabilityDataForSelectedBreaker = this.state.residentialAllPartsAvailable.find(item => item.ItemCode === selectedBreaker.Reference)\r\n if (!availabilityDataForSelectedBreaker.IsInStock) {\r\n this.setState({\r\n validationMessage: `${selectedBreaker.Description} is out of stock. Please, contact au.estimating@se.com`,\r\n isOutOfStock: true\r\n })\r\n } else if (availabilityDataForSelectedBreaker.IsLowStock) {\r\n this.setState({\r\n validationMessage: 'Low stock, longer lead times may apply',\r\n isOutOfStock: false\r\n })\r\n } else {\r\n this.setState({ validationMessage: '', isOutOfStock: false })\r\n }\r\n }\r\n })\r\n }\r\n\r\n getTypeOfDeviceEnabledOptions() {\r\n // this.props.incomerPhase // Single Phase, 2 Phase, 3 Phase\r\n let availableValues = []\r\n\r\n // TODO: this is based on the data provided from a spread sheet and how we store it in the DB, it works, but will be good to make it\r\n // better in the database, so we can perform more secure, not string based, checks\r\n // NOTE: this is not DRY, but very easy to read with very good debug feedback, it's prefered to leave it like this to now make a future \r\n // developer loose time trying to understand the logic, but feel free if you think it can ba slightly writte in a more elegant way\r\n console.warn('Explanation of why type of the breakers where enabled')\r\n this.props.breakerOptionData.forEach(breakerOption => {\r\n if (this.props.incomerPhase === 'Single Phase' && breakerOption.IncomerPhase === 'Single, 2 or 3 phase') {\r\n if (availableValues.indexOf(breakerOption.TypeOfDevice) === -1) {\r\n availableValues.push(breakerOption.TypeOfDevice)\r\n console.log('The incomer phase of the board is \"Single Phase\", enabling breaker type: \"' + breakerOption.TypeOfDevice + '\", because its IncomerPhase is: \"' + breakerOption.IncomerPhase + '\" and skipping further checks if that type of device should be enabled. If this breaker type should not be enabled, then please review the data coming from the spreadsheet provided and database values imported from that spreadsheet.')\r\n console.log(breakerOption)\r\n }\r\n }\r\n\r\n if (this.props.incomerPhase === '2 Phase' && breakerOption.IncomerPhase.indexOf('2 or 3 phase') > -1) {\r\n if (availableValues.indexOf(breakerOption.TypeOfDevice) === -1) {\r\n availableValues.push(breakerOption.TypeOfDevice)\r\n console.log('The incomer phase of the board is \"2 Phase\", enabling breaker type: \"' + breakerOption.TypeOfDevice + '\", because its IncomerPhase is: \"' + breakerOption.IncomerPhase + '\" and skipping further checks if that type of device should be enabled. If this breaker type should not be enabled, then please review the data coming from the spreadsheet provided and database values imported from that spreadsheet.')\r\n console.log(breakerOption)\r\n }\r\n }\r\n\r\n if (this.props.incomerPhase === '3 Phase' && (breakerOption.IncomerPhase.indexOf('2 or 3 phase') > -1 || breakerOption.IncomerPhase === '3 phase')) {\r\n if (availableValues.indexOf(breakerOption.TypeOfDevice) === -1) {\r\n availableValues.push(breakerOption.TypeOfDevice)\r\n console.log('The incomer phase of the board is \"3 Phase\", enabling breaker type: \"' + breakerOption.TypeOfDevice + '\", because its IncomerPhase is: \"' + breakerOption.IncomerPhase + '\" and skipping further checks if that type of device should be enabled. If this breaker type should not be enabled, then please review the data coming from the spreadsheet provided and database values imported from that spreadsheet.')\r\n console.log(breakerOption)\r\n }\r\n }\r\n })\r\n\r\n return availableValues\r\n }\r\n\r\n getNumberOfPolesEnabledOptions(typeOfDevice) {\r\n let availableValues = []\r\n\r\n this.props.breakerOptionData.forEach(breakerOption => {\r\n if (breakerOption.TypeOfDevice === typeOfDevice) {\r\n if (availableValues.indexOf(breakerOption.NumberOfPoles) === -1) {\r\n availableValues.push(breakerOption.NumberOfPoles)\r\n }\r\n }\r\n })\r\n\r\n return availableValues\r\n }\r\n\r\n getCurrentRatingEnabledOptions() {\r\n let availableValues = []\r\n\r\n this.props.breakerOptionData.forEach(breakerOption => {\r\n if (breakerOption.TypeOfDevice === this.state.breakerDetails.TypeOfDevice &&\r\n breakerOption.NumberOfPoles === this.state.breakerDetails.NumberOfPoles) {\r\n if (availableValues.indexOf(breakerOption.CurrentRating) === -1) {\r\n availableValues.push(breakerOption.CurrentRating)\r\n }\r\n }\r\n })\r\n\r\n return availableValues\r\n }\r\n\r\n render() {\r\n const breakerOptions = this.props.breakerOptions\r\n const breakerDetails = this.state.breakerDetails\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'TypeOfDevice')}\r\n layout={\"layout-50 radio-button-row\"}\r\n enabledOptions={this.getTypeOfDeviceEnabledOptions()}\r\n />\r\n
    \r\n\r\n
    \r\n this.optionSelectedCall(value, 'NumberOfPoles')}\r\n layout={\"layout-auto radio-button-row\"}\r\n enabledOptions={this.getNumberOfPolesEnabledOptions(this.state.breakerDetails.TypeOfDevice)}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.optionSelectedCall(value, 'CurrentRating')}\r\n layout={\"radio-button-row\"}\r\n enabledOptions={this.getCurrentRatingEnabledOptions()}\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n\r\n
    \r\n {/* If the user specified Current Rating which is the very last input to choose, then enable Save/Edit button */}\r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}","import React from 'react'\r\nimport cloneDeep from 'lodash.clonedeep'\r\nimport RadioObjectGroup from '../../radio-object-group/RadioObjectGroup'\r\n\r\nexport default class AdditionalItemsFormContainer extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n // Internal states that no one else needs to know about, holds info on the selection options\r\n this.initStates(this.props)\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (!this.props.contactors && !nextProps.contactors) return\r\n\r\n // if (!this.props.contactors || !nextProps.contactors) {\r\n // this.initStates(nextProps, true)\r\n // }\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n const updatedState = {\r\n selectedContactor: '',\r\n selectedFittedOption: '',\r\n validationMessage: '',\r\n outOfStock: false\r\n }\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n createCall() {\r\n if (this.state.selectedContactor !== '') {\r\n this.props.saveContactor(this.state.selectedContactor)\r\n } else if (this.state.selectedFittedOption !== '') {\r\n this.props.saveFittedOption(this.state.selectedFittedOption)\r\n }\r\n }\r\n\r\n render() {\r\n const contactorOptions = this.props.contactors.map(contactor => {\r\n return {\r\n value: contactor.ItemID,\r\n label: contactor.Description\r\n }\r\n })\r\n\r\n const fittedOptions = this.props.fittedOptions.map(fittedOption => {\r\n return {\r\n value: fittedOption.ItemID,\r\n label: fittedOption.Description\r\n }\r\n })\r\n\r\n const checkIfInStock = (availabilityItem) => {\r\n if (!availabilityItem?.IsInStock) {\r\n this.setState({\r\n validationMessage: `${availabilityItem.Description} is out of stock. Please, contact au.estimating@se.com`,\r\n outOfStock: true\r\n })\r\n } else if (availabilityItem?.IsLowStock) {\r\n this.setState({\r\n validationMessage: `Low stock, longer lead times may apply`,\r\n outOfStock: false\r\n })\r\n } else {\r\n this.setState({\r\n validationMessage: '',\r\n outOfStock: false\r\n })\r\n }\r\n }\r\n\r\n const onSelectCell = (type, value) => {\r\n if (type === 'contactor') {\r\n let selectedItem = this.props.contactors.find(contactor => contactor.ItemID === value)\r\n let availabilityItem = this.props.residentialAllPartsAvailable.find(part => part.ItemCode === selectedItem.Rating)\r\n checkIfInStock(availabilityItem)\r\n this.setState({ selectedContactor: value, selectedFittedOption: '' })\r\n } else {\r\n let selectedItem = this.props.fittedOptions.find(fittedOption => fittedOption.ItemID === value)\r\n let availabilityItem = this.props.residentialAllPartsAvailable.find(part => part.ItemCode === selectedItem.Reference)\r\n checkIfInStock(availabilityItem)\r\n this.setState({ selectedFittedOption: value, selectedContactor: '' })\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n { onSelectCell('contactor', value) }}\r\n layout={\"layout-33 radio-button-row\"}\r\n // enabledOptions={ this.getTypeOfDeviceEnabledOptions() }\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n { onSelectCell('fittedOption', value) }}\r\n layout={\"layout-33 radio-button-row\"}\r\n // enabledOptions={ this.getTypeOfDeviceEnabledOptions() }\r\n />\r\n
    \r\n
    \r\n
    \r\n\r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}","import React from 'react'\r\nimport RadioObjectGroup from '../../radio-object-group/RadioObjectGroup'\r\nimport { getNumberOfRowsFromPolesString, getPolesCountFromPolesString, getNumberOfPolesFromStringExpression, canAddDeviceToBoardPosition } from '../../../utils/helpers'\r\nimport { intersectionWith, isEqual, last, first, orderBy } from 'lodash'\r\nimport BusbarService from '../../../services/BusbarService'\r\n\r\n// Some useful facts\r\n// - Circuit breakers are always MCBs. They can’t be anything else (e.g. RCBOs can never be main switches).\r\n\r\nexport default class BusBarFormContainer extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.updateFittedOptionPosition = this.updateFittedOptionPosition.bind(this)\r\n this.updateBreakerPosition = this.updateBreakerPosition.bind(this)\r\n this.updateContactorPosition = this.updateContactorPosition.bind(this)\r\n this.updateMainSwitchPosition = this.updateMainSwitchPosition.bind(this)\r\n\r\n // Internal states that no one else needs to know about, holds info on the selection options\r\n this.initStates(this.props)\r\n }\r\n\r\n initStates(propsData, useSetState = false) {\r\n const updatedState = {\r\n errorInfo: '',\r\n isAllowedToProceed: true,\r\n\r\n // Props data\r\n boardRows: getNumberOfRowsFromPolesString(propsData.polesNeeded),\r\n boardRowPoles: getPolesCountFromPolesString(propsData.polesNeeded),\r\n\r\n // User selection\r\n MountingPosition: '',\r\n RowSelection: '',\r\n BusBarPhases: '',\r\n BusBarPoles: '',\r\n BusBarExtraPoles: 0,\r\n\r\n // Computed, helpers\r\n selectedBusBarData: null, // Will select a busbar data as soon as it's possible to determinate exact busbar based on user selections\r\n isExtraPolesFieldEnabled: false\r\n }\r\n\r\n if (useSetState) {\r\n this.setState(updatedState)\r\n } else {\r\n this.state = updatedState\r\n }\r\n }\r\n\r\n updateBreakerPosition(itemId, rowIndex, poleIndex, note, skipChecks) {\r\n this.props.updateBreakerPosition(itemId, rowIndex, poleIndex, note, skipChecks)\r\n }\r\n\r\n updateContactorPosition(itemId, rowIndex, poleIndex, note, skipChecks) {\r\n this.props.updateContactorPosition(itemId, rowIndex, poleIndex, note, skipChecks)\r\n }\r\n\r\n updateFittedOptionPosition(itemId, rowIndex, poleIndex, note, skipChecks) {\r\n this.props.updateFittedOptionPosition(itemId, rowIndex, poleIndex, note, skipChecks)\r\n }\r\n\r\n updateMainSwitchPosition(updateMainSwitchPosition, skipChecks) {\r\n this.props.updateMainSwitchPosition(updateMainSwitchPosition, skipChecks)\r\n }\r\n\r\n getMainSwitchDetails() {\r\n return this.props.boardOptionData.MainSwitches.find(mainSwitch => mainSwitch.ItemID === this.props.mainSwitchID)\r\n }\r\n\r\n getEnabledRowSelections() {\r\n let enabledOptions = []\r\n\r\n // Not DRY, but very easy to read instead of some fancy loop\r\n if (this.state.boardRows === 1) enabledOptions = ['1']\r\n if (this.state.boardRows === 2) enabledOptions = ['1', '2']\r\n if (this.state.boardRows === 3) enabledOptions = ['1', '2', '3']\r\n if (this.state.boardRows === 4) enabledOptions = ['1', '2', '3', '4']\r\n\r\n return enabledOptions\r\n }\r\n\r\n compatibleBusbarDevices = {\r\n 'top': ['SLIM 1P+N', '36 mm 1P+N', '3P+N'],\r\n 'bottom': ['SLIM 1P+N']\r\n }\r\n // This function accepts the array of all breakers and the mounting position in a row and returns all breakers between\r\n // first and last connectable devices (including them too)\r\n getBusbarConnectableDevices(breakers, mountingPosition) {\r\n if (!breakers || breakers.length === 0 || !mountingPosition) return []\r\n\r\n const position = mountingPosition.toLowerCase()\r\n const orderedBreakers = orderBy(breakers, ['PoleIndex'])\r\n const firstConnectableDeviceIndex = orderedBreakers.findIndex(breaker => \r\n this.compatibleBusbarDevices[position].indexOf(breaker.BreakerTypeReadOnly.NumberOfPoles) > -1)\r\n const lastConnectableDeviceIndex = orderedBreakers.findLastIndex(breaker => \r\n this.compatibleBusbarDevices[position].indexOf(breaker.BreakerTypeReadOnly.NumberOfPoles) > -1)\r\n const connectableDevices = orderedBreakers.slice(firstConnectableDeviceIndex, lastConnectableDeviceIndex + 1)\r\n\r\n return connectableDevices\r\n }\r\n\r\n // Given an array of breakers and a mounting position it will return an array of all incompatible devices for provided mounting position\r\n getIncompatibleBusbarBreakers(breakers, mountingPosition) {\r\n if (!breakers || breakers.length === 0 || !mountingPosition) return []\r\n\r\n const position = mountingPosition.toLowerCase()\r\n\r\n return breakers.filter(breaker => this.compatibleBusbarDevices[position].indexOf(breaker.BreakerTypeReadOnly.NumberOfPoles) === -1)\r\n }\r\n \r\n getEnabledPhasesOptions(returnErrors) {\r\n let enabledOptions = []\r\n let errors = []\r\n\r\n // When a single phase main incomer (switch or MCB) is selected then the options available for busbar should be Single phase only\r\n const mainSwitchDetails = this.getMainSwitchDetails()\r\n const selectedRowIndex = parseInt(this.state.RowSelection, 10) - 1\r\n const existingRowBreakers = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n const connectableDevices = this.getBusbarConnectableDevices(existingRowBreakers, this.state.MountingPosition)\r\n const any3PNRCBO = connectableDevices.some(breaker => breaker.BreakerTypeReadOnly.NumberOfPoles === '3P+N')\r\n const any36MM1PNRCBO = connectableDevices.some(breaker => breaker.BreakerTypeReadOnly.NumberOfPoles === '36 mm 1P+N')\r\n\r\n // First row is the row with the main switch in the current project, this can be different in the future\r\n if (this.state.RowSelection === '1') {\r\n // In case of bottom mounted busbar, customer can have a single or 3 phase busbar irrespective of the size of main incomer.\r\n if (this.state.MountingPosition === 'Bottom') {\r\n // From the client: \"36mm 1P+N RCBOs are not compatible with bottom mounting busbar in any row.\"\r\n if (any36MM1PNRCBO) {\r\n enabledOptions = []\r\n let error = '36mm 1P+N RCBOs are not compatible with bottom mounting busbar in any row.'\r\n errors.push(error)\r\n } else {\r\n if (mainSwitchDetails.IncomerPhase === 'Single Phase') {\r\n enabledOptions = ['Single Phase']\r\n } else {\r\n // If the main incomer is 3 phase then the user can add 3P+N RCBO. Also, in case of bottom mounted busbar the user will have the \r\n // option of either adding a 1 phase or 3 phase busbar in the top row with main switch. So we need to put in specific condition \r\n // in this case that if a row has 3P+N RCBO then user can’t add single phase busbar.\r\n // + as mentioned by the client on CLIP-332, on first row: \"if the user adds 3 phase RCBO in first row with main switch then the \r\n // user must not be allowed to add 3 phase busbar in the first row since 3 phase bottom connecting busbar is not compatible with 3 phase RCBO\"\r\n if (any3PNRCBO) {\r\n enabledOptions = []\r\n let error = '3P+N RCBOs are not compatible with bottom mounting busbar for a 3 phase main incomer.'\r\n errors.push(error)\r\n } else {\r\n enabledOptions = ['Single Phase', '3 Phase']\r\n }\r\n }\r\n }\r\n } else if (this.state.MountingPosition === 'Top') {\r\n if (mainSwitchDetails.IncomerPhase === 'Single Phase') {\r\n enabledOptions = ['Single Phase']\r\n } else if (mainSwitchDetails.IncomerPhase === '3 Phase') {\r\n enabledOptions = ['3 Phase']\r\n } else {\r\n enabledOptions = []\r\n let error = 'No available busbar options for the 2 phase main incomer'\r\n errors.push(error)\r\n }\r\n }\r\n } else {\r\n // Block for all other rows\r\n if (this.state.MountingPosition === 'Bottom') {\r\n // From the client: \"36mm 1P+N RCBOs are not compatible with bottom mounting busbar in any row.\"\r\n if (any36MM1PNRCBO) {\r\n enabledOptions = []\r\n let error = '36mm 1P+N RCBOs are not compatible with bottom mounting busbar in any row.'\r\n errors.push(error)\r\n } else {\r\n /* \r\n It was mentioned that: \"In case of bottom mounted busbar, customer can have a single or 3 phase busbar in any row irrespective \r\n of the size of main incomer.\", but also: \"... a 3 phase bottom mounted busbar (because bottom mounted busbars only connect to SLIM RCBOs) will not connect to 3P+N RCBO.\", so in this case of Bottom mounting position we are going to enable both Single and 3 phase, until there is a 3P+N\r\n RCBO device, otherwise user can't select a busbar.\r\n\r\n Also CLIP-344 for the comment above: \"This comment was for 3 phase incomer and if there are compatible products in that row.\"\r\n */\r\n if (any3PNRCBO) {\r\n enabledOptions = []\r\n let error = '3P+N RCBOs are not compatible with bottom mounting busbar for a 3 phase main incomer.'\r\n errors.push(error)\r\n } else {\r\n // CLIP-344 - From my understanding of your last comment, if we have a single phase incomer in the first row, \r\n // all other rows can’t have a 3 phase busbar at all? - True\r\n if (mainSwitchDetails.IncomerPhase === 'Single Phase') {\r\n enabledOptions = ['Single Phase']\r\n } else {\r\n enabledOptions = ['Single Phase', '3 Phase']\r\n }\r\n }\r\n }\r\n } else if (this.state.MountingPosition === 'Top') {\r\n if (any3PNRCBO) {\r\n enabledOptions = ['3 Phase']\r\n } else {\r\n // CLIP-344 - Please see above\r\n if (mainSwitchDetails.IncomerPhase === 'Single Phase') {\r\n enabledOptions = ['Single Phase']\r\n } else {\r\n enabledOptions = ['Single Phase', '3 Phase']\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (returnErrors !== undefined) {\r\n return errors\r\n } else {\r\n return enabledOptions\r\n }\r\n }\r\n\r\n // This function return array of possible busbars based on current user selections\r\n getPossibleBusbars(ignorePolesSelection) {\r\n return this.props.busbarsData.filter(busbar => {\r\n // Filter busbars that have the same positions\r\n if (this.state.MountingPosition === '') {\r\n return true\r\n } else if (busbar.MountingPosition === this.state.MountingPosition) {\r\n // Filter busbars so we get only those that are allowed to be on selected user row\r\n if (busbar.RowSelection === '') {\r\n return true\r\n } else if (busbar.RowSelection === 'Any row' || (\r\n (this.state.RowSelection === '1' && busbar.RowSelection === 'First Row') ||\r\n (this.state.RowSelection !== '1' && busbar.RowSelection === 'Second/Third/Fourth Row')\r\n )) {\r\n // Filter busbars that match user selected Incomer Phase\r\n if (this.state.BusBarPhases === '') {\r\n return true\r\n } else if (\r\n (this.state.BusBarPhases === 'Single Phase' && busbar.IncomerPhase === 'Single Phase') ||\r\n (this.state.BusBarPhases === '3 Phase' && busbar.IncomerPhase === '3 Phase')\r\n ) {\r\n if (this.state.BusBarPoles === '' || !!ignorePolesSelection) {\r\n return true\r\n } else if (parseInt(this.state.BusBarPoles, 10) === getNumberOfPolesFromStringExpression(busbar.NumberOfPoles)) {\r\n return true\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If the busbar doesn't match any conditions, then return false to indicate it doesn't match filter criterias\r\n return false\r\n })\r\n }\r\n\r\n getEnabledPolesOptions(returnErrors) {\r\n const possibleBusbars = this.getPossibleBusbars(true)\r\n\r\n let enabledOptions = []\r\n let errors = []\r\n // First add all available options from all possible busbar combinations left\r\n possibleBusbars.forEach(busbar => {\r\n const busbarPoles = getNumberOfPolesFromStringExpression(busbar.NumberOfPoles)\r\n if (enabledOptions.indexOf(busbarPoles) === -1) enabledOptions.push('' + busbarPoles)\r\n })\r\n\r\n if (this.state.BusBarPhases !== '') {\r\n console.log('Enabled options before performing further checks: ', enabledOptions)\r\n \r\n // Check if busbar length would even fit\r\n const isRowWithMainSwitch = this.state.RowSelection === '1'\r\n const mainSwitchPosition = parseInt(this.props.board.MainSwitchPosition, 10)\r\n const selectedRowIndex = parseInt(this.state.RowSelection, 10) - 1\r\n let shouldHaveNeutralTerminalBlock = false\r\n let rowDevices = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n let connectableDevices = this.getBusbarConnectableDevices(rowDevices, this.state.MountingPosition)\r\n\r\n if (isRowWithMainSwitch) {\r\n // Don't consider breakers on the left of the main switch\r\n connectableDevices = connectableDevices.filter(breaker => {\r\n return breaker.PoleIndex > mainSwitchPosition\r\n })\r\n\r\n if (this.state.MountingPosition === 'Top') {\r\n shouldHaveNeutralTerminalBlock = true\r\n }\r\n }\r\n \r\n let poleIndexOfFirstConnectableDevice = 0\r\n let isIncompatibleResimaxWithCurrentEnclousure = (this.props.polesNeeded === '12x2' || this.props.polesNeeded === '12x3') && this.state.BusBarPhases === '3 Phase'\r\n if (isIncompatibleResimaxWithCurrentEnclousure) {\r\n enabledOptions = []\r\n let error = '3 phase busbar along with the connectors will not fit easily into enclosures with sizes 12x2 and 12x3. Please select a different enclosure size for 3 phase busbar.'\r\n errors.push(error)\r\n } else if ((\r\n (connectableDevices.length >= 2 && this.state.MountingPosition === 'Bottom') ||\r\n (connectableDevices.length >= 1 && this.state.MountingPosition === 'Top') \r\n )\r\n && connectableDevices[0].PoleIndex !== undefined) {\r\n poleIndexOfFirstConnectableDevice = connectableDevices[0].PoleIndex\r\n\r\n let lastConnectableBreaker = connectableDevices[connectableDevices.length - 1]\r\n let busbarStartIndex = BusbarService.getBusbarStartIndex(this.state.MountingPosition, isRowWithMainSwitch, mainSwitchPosition, shouldHaveNeutralTerminalBlock, poleIndexOfFirstConnectableDevice)\r\n let busbarRequiredLengthToCoverAllDevices = BusbarService.getBusbarMinimumLengthToCoverAllRowDevices(busbarStartIndex, lastConnectableBreaker.PoleIndex, parseInt(lastConnectableBreaker.BreakerTypeReadOnly.SpaceUsed, 10))\r\n\r\n console.log('Based on the selections the row will require a busbar with minimum length of ' + busbarRequiredLengthToCoverAllDevices + ' poles.')\r\n\r\n let anyAvailableOptionsBeforeCheckingBusbarLength = enabledOptions.length > 0\r\n enabledOptions = enabledOptions.filter(option => {\r\n const optionAsInteger = parseInt(option, 10)\r\n // We don't disable longer busbars anymore, because even long busbars can fit on the board, they will be just cut to fit to the\r\n // last connectable RCBO and the remaining busbar poles will determinate how many extra poles the user can select\r\n // Now we check if the length of the busbar will be able to cover all connectable devices on the row, if not then it's too short\r\n // and we will disable it\r\n if (optionAsInteger >= busbarRequiredLengthToCoverAllDevices) {\r\n return true\r\n } else {\r\n let error = 'Disabled ' + optionAsInteger + ' poles busbar option, because ' + optionAsInteger + ' would be to short to cover all connectable devices on the selected row.'\r\n console.log(error)\r\n // errors.push(error)\r\n return false\r\n }\r\n })\r\n\r\n if (anyAvailableOptionsBeforeCheckingBusbarLength && enabledOptions.length === 0) {\r\n let error = 'No busbar possible options to select, because no options would fit on the row at the starting position ' + (busbarStartIndex + 1) + ', consider moving your main switch to the left or change the position of the breakers.'\r\n console.log(error)\r\n errors.push(error)\r\n }\r\n } else if (connectableDevices.length === 1 && this.state.MountingPosition === 'Bottom') {\r\n enabledOptions = []\r\n let error = 'You need to have at least two connectable device in order to proceed.'\r\n errors.push(error)\r\n } else if (connectableDevices.length === 0) {\r\n enabledOptions = []\r\n let error = 'No connectable devices were found on the selected row, you need to have at least two connectable device in order to proceed.'\r\n errors.push(error)\r\n }\r\n }\r\n\r\n if (returnErrors !== undefined) {\r\n return errors\r\n } else {\r\n return enabledOptions\r\n }\r\n }\r\n\r\n resetAvailabilityValidation() {\r\n this.setState({ validationMessage: '', isOutOfStock: false })\r\n }\r\n\r\n setMountingPosition(value) {\r\n\r\n this.resetAvailabilityValidation()\r\n\r\n // If selecting Mounting position, reset all values after that\r\n this.setState({ \r\n isAllowedToProceed: true, \r\n errorInfo: '', \r\n MountingPosition: value, \r\n RowSelection: '', \r\n BusBarPhases: '', \r\n BusBarPoles: '',\r\n BusBarExtraPoles: 0,\r\n selectedBusBarData: null,\r\n isExtraPolesFieldEnabled: false\r\n })\r\n }\r\n\r\n setRowSelection(value) {\r\n this.resetAvailabilityValidation()\r\n\r\n // We need to reset some values in case user select different row, we reset the values that were selected after\r\n this.setState({ \r\n isAllowedToProceed: true, \r\n errorInfo: '', \r\n BusBarPhases: '', \r\n BusBarPoles: '', \r\n BusBarExtraPoles: 0, \r\n selectedBusBarData: null, \r\n isExtraPolesFieldEnabled: false \r\n })\r\n\r\n // We need to determinate if the row selected in that mounting position has RDC-4.5kA or RCD-6kA or MCB only or 2 phases\r\n // In that case the busbar is disabled for those devices and we need to display a message to the user and prevent going forward\r\n const selectedRowNumber = parseInt(value, 10)\r\n const selectedRowIndex = selectedRowNumber - 1 // Value selected by the user is not array based index which we need in this case\r\n const existingRowBreakers = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n const existingRowContactors = this.props.contactorsAttachedToTheBoard.filter(existingContactor => existingContactor.RowIndex === selectedRowIndex)\r\n\r\n // We find all breakers from first and last connectable devices\r\n const firstLastCompatibleBreakersRange = this.getBusbarConnectableDevices(existingRowBreakers, this.state.MountingPosition)\r\n const incompatibleBreakers = this.getIncompatibleBusbarBreakers(firstLastCompatibleBreakersRange, this.state.MountingPosition)\r\n\r\n let incompatibleContactors = [] \r\n\r\n // We need to check that there are at least 2 compatible devices on the row to proceed\r\n if (firstLastCompatibleBreakersRange.length < 2) {\r\n this.setState({ errorInfo: 'You need to have at least two connectable devices in order to proceed.', isAllowedToProceed: false })\r\n } else {\r\n // Find if there are any contactors in between all compatible devices, the position of the contactor is greater\r\n // than the position of the first compatible breaker and less than the position of the last compatible breaker\r\n incompatibleContactors = existingRowContactors.filter(contactor => {\r\n const firstBreaker = first(firstLastCompatibleBreakersRange)\r\n const lastBreaker = last(firstLastCompatibleBreakersRange)\r\n return contactor.PoleIndex > firstBreaker.PoleIndex && contactor.PoleIndex < lastBreaker.PoleIndex\r\n })\r\n }\r\n\r\n // We throw an error if there are any incompatible devices in between\r\n if (incompatibleBreakers.length > 0) {\r\n this.setState({ errorInfo: `We have found an incompatible breaker \"${incompatibleBreakers[0].BreakerTypeReadOnly.TypeOfDevice}\" in between connectable busbar devices on postion ${incompatibleBreakers[0].PoleIndex + 1}, please remove it before proceeding.`, isAllowedToProceed: false })\r\n }\r\n\r\n if (incompatibleContactors.length > 0) {\r\n this.setState({ errorInfo: `We have found an incompatible contactor \"${incompatibleContactors[0].ContractorReadOnly.Description}\" in between connectable busbar devices on postion ${incompatibleContactors[0].PoleIndex + 1}, please remove it before proceeding.`, isAllowedToProceed: false })\r\n }\r\n\r\n firstLastCompatibleBreakersRange.forEach(breaker => {\r\n if (breaker[this.state.MountingPosition + 'PowerTag'] === true) {\r\n // Check if there are any breakers that have a power tag in that mounting position in that row\r\n this.setState({ errorInfo: 'Row already contains a breaker with a power tag in the selected mounting position, can not add a busbar, please remove any existing power tags.', isAllowedToProceed: false })\r\n } \r\n })\r\n\r\n // Check if the row already contains a busbar in that position\r\n this.props.existingBusbars.forEach(existingBusbar => {\r\n if (existingBusbar.Row === selectedRowNumber) {\r\n this.setState({ errorInfo: 'There is already a busbar on that row.', isAllowedToProceed: false })\r\n }\r\n })\r\n\r\n this.setState({ RowSelection: value })\r\n }\r\n\r\n // Once poles number is select we can determinate which busbar data it refers to, we store it to perform some extra checks and for easier reference\r\n handlePolesSelection(value) {\r\n this.resetAvailabilityValidation()\r\n\r\n // Also whenever different poles quantity is selected we need to restart extra poles value\r\n this.setState({ BusBarPoles: value, BusBarExtraPoles: 0, selectedBusBarData: null, isExtraPolesFieldEnabled: false }, () => {\r\n const possibleBusbars = this.getPossibleBusbars() // This should return only one value\r\n if (possibleBusbars.length > 1) {\r\n window.alert('Could not determinate a unique busbar selection, please contact administrator.')\r\n } else {\r\n const availabilityDataForSelectedBusbar = this.props.residentialAllPartsAvailable.find(item => item.ItemCode === possibleBusbars[0].Reference)\r\n let canProceed = false\r\n if (!availabilityDataForSelectedBusbar.IsInStock) {\r\n this.setState({\r\n validationMessage: `${possibleBusbars[0].Description} is out of stock. Please, contact au.estimating@se.com`,\r\n isOutOfStock: true\r\n })\r\n } else if (availabilityDataForSelectedBusbar.IsLowStock) {\r\n canProceed = true\r\n this.setState({\r\n validationMessage: 'Low stock, longer lead times may apply',\r\n isOutOfStock: false\r\n })\r\n } else {\r\n canProceed = true\r\n this.resetAvailabilityValidation()\r\n }\r\n\r\n if (!canProceed) return\r\n\r\n this.setState({ selectedBusBarData: possibleBusbars[0] }, () => {\r\n // We also need to determinate if any extra poles can be selected\r\n this.setState({ isExtraPolesFieldEnabled: this.getMaximumExtraPoles() > 0 }, () => {\r\n // What we want to do here is that instead of having 0 extra poles after selecting a busbar length\r\n // we want to defaul to the maximum number of extra poles allowed, so the user doesn't have to click\r\n // This is because with 0 extra poles behaviour in real life scenario the busbars would be cut to the\r\n // last connectable device, which caused issues as not expected behaviour in initial lunch of the platform\r\n this.changeExtraPolesQuantity(this.getMaximumExtraPoles()) \r\n })\r\n })\r\n\r\n }\r\n })\r\n }\r\n\r\n getMaximumExtraPoles() {\r\n // We already should have checks at this stage where it will be determinated if the busbar length is possible to fit on the row\r\n // Now we just check how many extra poles are left on the row\r\n const isRowWithMainSwitch = this.state.RowSelection === '1'\r\n const mainSwitchPosition = parseInt(this.props.board.MainSwitchPosition, 10)\r\n const selectedRowIndex = parseInt(this.state.RowSelection, 10) - 1\r\n let shouldHaveNeutralTerminalBlock = false\r\n let rowDevices = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n let orderedRowDevices = orderBy(rowDevices, ['PoleIndex'])\r\n let connectableDevices = this.getBusbarConnectableDevices(orderedRowDevices, this.state.MountingPosition)\r\n let incompatibleDevicesOnRightSideOfLastCompatibleDevice = orderedRowDevices.filter(breaker => breaker.PoleIndex > connectableDevices[connectableDevices.length -1].PoleIndex)\r\n let firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice = null\r\n if (incompatibleDevicesOnRightSideOfLastCompatibleDevice.length > 0) {\r\n firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice = parseInt(incompatibleDevicesOnRightSideOfLastCompatibleDevice[0].PoleIndex, 10)\r\n }\r\n\r\n if (isRowWithMainSwitch) {\r\n // Don't consider breakers on the left of the main switch\r\n connectableDevices = connectableDevices.filter(breaker => {\r\n return breaker.PoleIndex > mainSwitchPosition\r\n })\r\n\r\n if (isRowWithMainSwitch && this.state.MountingPosition === 'Top') {\r\n shouldHaveNeutralTerminalBlock = true\r\n }\r\n }\r\n\r\n // So we know if the row should have the neutral terminal block, but check as well if we will be actually moving automatically the devices\r\n // so we can better determine the maximum extra poles\r\n let willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock = false\r\n if (shouldHaveNeutralTerminalBlock) {\r\n const selectedRowNumber = parseInt(this.state.RowSelection, 10)\r\n const selectedRowIndex = selectedRowNumber - 1 // Value selected by the user is not array based index which we need in this case\r\n const existingRowBreakers = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n let isPositionBeforeMainSwitchOccupied = false\r\n isPositionBeforeMainSwitchOccupied = existingRowBreakers.some(breaker => {\r\n let positionsOccupiedByExistingDevice = []\r\n const spaceUsedByExistingDevice = parseInt(breaker.BreakerTypeReadOnly.SpaceUsed, 10)\r\n for (let index = breaker.PoleIndex; index < breaker.PoleIndex + spaceUsedByExistingDevice; index++) {\r\n positionsOccupiedByExistingDevice.push(index) \r\n }\r\n\r\n let intersectingElements = intersectionWith([mainSwitchPosition - 1], positionsOccupiedByExistingDevice, isEqual)\r\n \r\n return intersectingElements.length > 0\r\n })\r\n\r\n // We need to check the case of surge protection\r\n if (mainSwitchPosition === 1 && this.props.board.SPDID !== null && this.props.board.SPDID !== 0) {\r\n isPositionBeforeMainSwitchOccupied = true\r\n }\r\n\r\n if (mainSwitchPosition === 0 || isPositionBeforeMainSwitchOccupied) {\r\n if (this.canDevicesBeMovedToMakeSpaceForNeutralTerminalBlock()) {\r\n willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock = true\r\n }\r\n }\r\n }\r\n\r\n console.warn('willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock', willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock)\r\n\r\n let poleIndexOfFirstConnectableDevice = 0\r\n if (connectableDevices.length > 0 && connectableDevices[0].PoleIndex !== undefined) {\r\n poleIndexOfFirstConnectableDevice = connectableDevices[0].PoleIndex\r\n }\r\n let lastConnectableBreaker = connectableDevices[connectableDevices.length - 1]\r\n let busbarStartIndex = BusbarService.getBusbarStartIndex(this.state.MountingPosition, isRowWithMainSwitch, mainSwitchPosition, shouldHaveNeutralTerminalBlock, poleIndexOfFirstConnectableDevice)\r\n let busbarMaximumExtraPoles = BusbarService.getMaximumAllowedExtraPoles(busbarStartIndex, lastConnectableBreaker.PoleIndex, parseInt(lastConnectableBreaker.BreakerTypeReadOnly.SpaceUsed, 10), parseInt(this.state.BusBarPoles, 10), this.state.boardRowPoles, firstIncompatibleDevicePoleIndexOnRightSideOfLastCompatibleDevice, willBeMovingDevicesToMakeSpaceForNeutralTerminalBlock)\r\n \r\n console.log('Maximum number of Extra Poles allowed', busbarMaximumExtraPoles)\r\n\r\n return busbarMaximumExtraPoles\r\n }\r\n\r\n changeExtraPolesQuantity(updatedQuantity) {\r\n let maximumExtraPoles = this.getMaximumExtraPoles()\r\n\r\n const updatedQuantityAsNumber = parseInt(updatedQuantity, 10)\r\n if (updatedQuantityAsNumber > 0) {\r\n if (updatedQuantityAsNumber < maximumExtraPoles) {\r\n this.setState({ BusBarExtraPoles: updatedQuantityAsNumber })\r\n } else {\r\n this.setState({ BusBarExtraPoles: maximumExtraPoles })\r\n }\r\n } else {\r\n this.setState({ BusBarExtraPoles: 0 })\r\n }\r\n }\r\n \r\n\r\n decreaseQuantity() {\r\n if (this.state.BusBarExtraPoles > 0) this.setState({ BusBarExtraPoles: this.state.BusBarExtraPoles - 1 })\r\n }\r\n\r\n increaseQuantity() {\r\n let maximumExtraPoles = this.getMaximumExtraPoles()\r\n if (this.state.BusBarExtraPoles < maximumExtraPoles) this.setState({ BusBarExtraPoles: this.state.BusBarExtraPoles + 1 })\r\n }\r\n\r\n canDevicesBeMovedToMakeSpaceForNeutralTerminalBlock() {\r\n // Get the list of all compatible busbar devices on the row (breakers & fitted options)\r\n const existingRowBreakers = this.props.breakersAttachedToTheBoard.filter(breaker => breaker.RowIndex === parseInt(this.state.RowSelection, 10) - 1)\r\n const existingRowFittedOptions = this.props.fittedOptionsAttachedToTheBoard.filter(device => device.RowIndex === parseInt(this.state.RowSelection, 10) - 1)\r\n const existingRowContactors = this.props.contactorsAttachedToTheBoard.filter(contactor => contactor.RowIndex === parseInt(this.state.RowSelection, 10) - 1)\r\n const existingRowDevices = [...existingRowBreakers, ...existingRowFittedOptions, ...existingRowContactors]\r\n const orderedRowDevices = orderBy(existingRowDevices, ['PoleIndex'])\r\n\r\n // Note: NTB is always 1 pole, so we always will need to move breakers only by 1 pole\r\n\r\n // Get the last device on the row (breaker, contactor, etc.) and see if it can be moved by one pole, because if we can then all devices between the last one and the main switch can be moved\r\n const lastDeviceOnRow = orderedRowDevices[orderedRowDevices.length - 1]\r\n\r\n let lastDeviceType = 'BreakerTypeReadOnly'\r\n if (lastDeviceOnRow.FittedOptionReadOnly !== undefined) {\r\n lastDeviceType = 'FittedOptionReadOnly'\r\n } else if (lastDeviceOnRow.ContractorReadOnly !== undefined) {\r\n lastDeviceType = 'ContractorReadOnly'\r\n }\r\n\r\n let canMoveBrekerByOnePole = false\r\n if (lastDeviceType === 'BreakerTypeReadOnly') {\r\n canMoveBrekerByOnePole = canAddDeviceToBoardPosition(lastDeviceOnRow[lastDeviceType].SpaceUsed, lastDeviceOnRow.RowIndex, lastDeviceOnRow.PoleIndex + 1, false, this.props.board, this.props.boardDetails, this.props.boardOptionData, false, lastDeviceOnRow.ItemID)\r\n } else if (lastDeviceType === 'FittedOptionReadOnly') {\r\n canMoveBrekerByOnePole = canAddDeviceToBoardPosition(lastDeviceOnRow[lastDeviceType].SpaceUsed, lastDeviceOnRow.RowIndex, lastDeviceOnRow.PoleIndex + 1, false, this.props.board, this.props.boardDetails, this.props.boardOptionData, false, null, null, lastDeviceOnRow.ItemID)\r\n } else if (lastDeviceType === 'ContractorReadOnly') {\r\n canMoveBrekerByOnePole = canAddDeviceToBoardPosition(lastDeviceOnRow[lastDeviceType].SpaceUsed, lastDeviceOnRow.RowIndex, lastDeviceOnRow.PoleIndex + 1, false, this.props.board, this.props.boardDetails, this.props.boardOptionData, false, null, lastDeviceOnRow.ItemID)\r\n }\r\n \r\n\r\n console.log('Can automatically move devices on the row to make space for NTB?', canMoveBrekerByOnePole)\r\n return canMoveBrekerByOnePole\r\n }\r\n\r\n automaticallyMoveRowDevicesToMakeSpaceForNeutralTerminalBlock() {\r\n const existingRowOrderedBreakers = orderBy(this.props.breakersAttachedToTheBoard.filter(breaker => breaker.RowIndex === parseInt(this.state.RowSelection, 10) - 1), ['PoleIndex'])\r\n const existingRowOrderedFittedOptions = orderBy(this.props.fittedOptionsAttachedToTheBoard.filter(fittedOption => fittedOption.RowIndex === parseInt(this.state.RowSelection, 10) - 1), ['PoleIndex']) \r\n const existingRowOrderedContactors = orderBy(this.props.contactorsAttachedToTheBoard.filter(contactor => contactor.RowIndex === parseInt(this.state.RowSelection, 10) - 1), ['PoleIndex'])\r\n const breakersOnRightOfTheMainSwitch = existingRowOrderedBreakers.filter(breaker => breaker.PoleIndex > parseInt(this.props.board.MainSwitchPosition, 10))\r\n const fittedOptionsOnRightOfTheMainSwitch = existingRowOrderedFittedOptions.filter(fittedOption => fittedOption.PoleIndex > parseInt(this.props.board.MainSwitchPosition, 10))\r\n const contactorsOnRightOfTheMainSwitch = existingRowOrderedContactors.filter(contactor => contactor.PoleIndex > parseInt(this.props.board.MainSwitchPosition, 10))\r\n \r\n console.log('breakersOnRightOfTheMainSwitch', breakersOnRightOfTheMainSwitch)\r\n breakersOnRightOfTheMainSwitch.forEach(breaker => {\r\n this.updateBreakerPosition(breaker.ItemID, breaker.RowIndex, breaker.PoleIndex + 1, breaker.Note, true)\r\n })\r\n console.log('fittedOptionsOnRightOfTheMainSwitch', fittedOptionsOnRightOfTheMainSwitch)\r\n fittedOptionsOnRightOfTheMainSwitch.forEach(fittedOption => {\r\n this.updateFittedOptionPosition(fittedOption.ItemID, fittedOption.RowIndex, fittedOption.PoleIndex + 1, fittedOption.Note, true)\r\n })\r\n\r\n console.log('contactorsOnRightOfTheMainSwitch', contactorsOnRightOfTheMainSwitch)\r\n contactorsOnRightOfTheMainSwitch.forEach(contactor => {\r\n this.updateContactorPosition(contactor.ItemID, contactor.RowIndex, contactor.PoleIndex + 1, contactor.Note, true)\r\n })\r\n\r\n this.updateMainSwitchPosition(parseInt(this.props.board.MainSwitchPosition, 10) + 1)\r\n }\r\n\r\n saveBusbar() {\r\n // Before we allow adding a busbar we need to check if there is a space for neutral block, if there isn't then we need to ask\r\n // user to make a space on indicated position, we don't support switching elements for the user at this stage\r\n const busbarsWithNeutralBlock = BusbarService.getBusbarsWithNeutralTerminalBlockReferences()\r\n const busbarErrorMessage = 'This Busbar requires a Neutral Terminal Block to be inserted on left side of the main switch. Please make space available.'\r\n const mainSwitchPosition = parseInt(this.props.board.MainSwitchPosition, 10)\r\n let isPositionBeforeMainSwitchOccupied = false\r\n let isAutomaticallyUpdatingDevices = false\r\n if (busbarsWithNeutralBlock.indexOf(this.state.selectedBusBarData.Reference) > -1) {\r\n if (mainSwitchPosition === 0) {\r\n // Here we know that we need a NTB before the main switch, but if the main switch is on the very first position then we check if we can move it and we move it\r\n // before doing other checks etc., otherwise we just throw an error for user to take manual action\r\n if (this.canDevicesBeMovedToMakeSpaceForNeutralTerminalBlock()) {\r\n // We need to move the main switch by one pole to the right\r\n console.warn('Automatically moving devices on the row to make space for NTB')\r\n this.automaticallyMoveRowDevicesToMakeSpaceForNeutralTerminalBlock()\r\n isAutomaticallyUpdatingDevices = true\r\n } else { \r\n this.setState({ errorInfo: busbarErrorMessage })\r\n return false\r\n }\r\n }\r\n\r\n // Here we know busbar requires a neutral block which needs to go on first row, first position and occupies 1 space\r\n const selectedRowNumber = parseInt(this.state.RowSelection, 10)\r\n const selectedRowIndex = selectedRowNumber - 1 // Value selected by the user is not array based index which we need in this case\r\n const existingRowBreakers = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n isPositionBeforeMainSwitchOccupied = existingRowBreakers.some(breaker => {\r\n let positionsOccupiedByExistingDevice = []\r\n const spaceUsedByExistingDevice = parseInt(breaker.BreakerTypeReadOnly.SpaceUsed, 10)\r\n for (let index = breaker.PoleIndex; index < breaker.PoleIndex + spaceUsedByExistingDevice; index++) {\r\n positionsOccupiedByExistingDevice.push(index) \r\n }\r\n\r\n let intersectingElements = intersectionWith([mainSwitchPosition - 1], positionsOccupiedByExistingDevice, isEqual)\r\n \r\n return intersectingElements.length > 0\r\n })\r\n\r\n // We need to check the case of surge protection\r\n if (mainSwitchPosition === 1 && this.props.board.SPDID !== null && this.props.board.SPDID !== 0) {\r\n isPositionBeforeMainSwitchOccupied = true\r\n }\r\n\r\n if (isPositionBeforeMainSwitchOccupied) {\r\n if (this.canDevicesBeMovedToMakeSpaceForNeutralTerminalBlock()) {\r\n console.warn('Automatically moving devices on the row to make space for NTB')\r\n this.automaticallyMoveRowDevicesToMakeSpaceForNeutralTerminalBlock()\r\n isAutomaticallyUpdatingDevices = true\r\n } else { \r\n this.setState({ errorInfo: busbarErrorMessage })\r\n return false\r\n }\r\n }\r\n }\r\n\r\n let busbarStartPosition = 0\r\n let busbarLength = 0\r\n\r\n const isRowWithMainSwitch = this.state.RowSelection === '1'\r\n const selectedRowIndex = parseInt(this.state.RowSelection, 10) - 1\r\n let shouldHaveNeutralTerminalBlock = false\r\n let rowDevices = this.props.breakersAttachedToTheBoard.filter(existingBreaker => existingBreaker.RowIndex === selectedRowIndex)\r\n let connectableDevices = this.getBusbarConnectableDevices(rowDevices, this.state.MountingPosition)\r\n\r\n if (isRowWithMainSwitch && this.state.MountingPosition === 'Top') {\r\n shouldHaveNeutralTerminalBlock = true\r\n }\r\n\r\n let poleIndexOfFirstConnectableDevice = 0\r\n if (connectableDevices.length > 0 && connectableDevices[0].PoleIndex !== undefined) {\r\n poleIndexOfFirstConnectableDevice = connectableDevices[0].PoleIndex\r\n }\r\n\r\n let lastConnectableBreaker = connectableDevices[connectableDevices.length - 1]\r\n let busbarStartIndex = BusbarService.getBusbarStartIndex(this.state.MountingPosition, isRowWithMainSwitch, mainSwitchPosition, shouldHaveNeutralTerminalBlock, poleIndexOfFirstConnectableDevice)\r\n busbarStartPosition = busbarStartIndex + 1\r\n\r\n // If we are moving the devices then save starting position of busbar as one pole to the right\r\n if (isAutomaticallyUpdatingDevices) {\r\n busbarStartPosition = busbarStartPosition + 1\r\n }\r\n\r\n let busbarRequiredLengthToCoverAllDevices = BusbarService.getBusbarMinimumLengthToCoverAllRowDevices(busbarStartIndex, lastConnectableBreaker.PoleIndex, parseInt(lastConnectableBreaker.BreakerTypeReadOnly.SpaceUsed, 10))\r\n busbarLength = busbarRequiredLengthToCoverAllDevices\r\n\r\n this.props.addBusBarToBoard(this.state.selectedBusBarData.ItemID, parseInt(this.state.RowSelection, 10), this.state.BusBarExtraPoles, busbarStartPosition, busbarLength)\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n

    \r\n \r\n \r\n \r\n \r\n Please complete adding all needed RCBOs in the board before adding a Busbar.\r\n \r\n

    \r\n\r\n {\r\n this.state.errorInfo !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n { this.state.errorInfo }\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.BusBarPhases !== '' && this.getEnabledPolesOptions(true).length > 0 &&\r\n

    \r\n \r\n \r\n \r\n \r\n { \r\n this.getEnabledPolesOptions(true).map(error => {\r\n return { error }\r\n })\r\n }\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.RowSelection !== '' && this.getEnabledPhasesOptions(true).length > 0 &&\r\n

    \r\n \r\n \r\n \r\n \r\n { \r\n this.getEnabledPhasesOptions(true).map(error => {\r\n return { error }\r\n })\r\n }\r\n \r\n

    \r\n }\r\n\r\n
    \r\n
    \r\n this.setMountingPosition(value) }\r\n />\r\n
    \r\n
    \r\n this.setRowSelection(value)}\r\n />\r\n
    \r\n
    \r\n this.setState({ BusBarPhases: value }) }\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.handlePolesSelection(value) }\r\n />\r\n
    \r\n
    \r\n
    0 ? ' is-done' : '')}>\r\n

    \r\n
    \r\n \r\n
    \r\n Extra Poles\r\n

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { this.changeExtraPolesQuantity(event.target.value)}}\r\n className={'form__input input' + (!this.state.isExtraPolesFieldEnabled ? ' is-disabled' : '')} />\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {\r\n this.state.validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n\r\n
    \r\n \r\n
    \r\n\r\n
    \r\n )\r\n }\r\n}","import React from 'react'\r\nimport { DragSource } from 'react-dnd'\r\n\r\nexport class ChassisBreaker extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.editClickCall = this.editClickCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.updateBrekerChassisNoteCall = this.updateBrekerChassisNoteCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about holds info on the selection options\r\n this.state = {\r\n showEditOptions: false,\r\n isDeleting: false,\r\n BreakerCircuitLabelInput: this.props.BreakerCircuitLabelInput\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.setState({ isDeleting: true })\r\n this.props.deletedCallback(this.props.RowIndex, this.props.PoleIndex, this.props.itemId)\r\n }\r\n\r\n editClickCall() {\r\n this.setState({ showEditOptions: !this.state.showEditOptions }, () => {\r\n if (this.state.showEditOptions) this.refs.labelInput.focus()\r\n })\r\n }\r\n\r\n updateBrekerChassisNoteCall() {\r\n this.props.updateBrekerChassisNote(this.props.itemId, this.props.RowIndex, this.props.PoleIndex, this.state.BreakerCircuitLabelInput)\r\n this.setState({ showEditOptions: false })\r\n }\r\n\r\n generateBrekerPositions(startNumber) {\r\n const spaceUsed = parseInt(this.props.poles, 10)\r\n const displayNumbers = []\r\n\r\n for (let i = 0; i < spaceUsed; i++) {\r\n let displayNumber = startNumber + i\r\n if (displayNumber < 10) displayNumber = '0' + displayNumber\r\n\r\n displayNumbers.push(\r\n
    \r\n
    { displayNumber }
    \r\n
    \r\n )\r\n }\r\n\r\n return displayNumbers\r\n }\r\n\r\n togglePowerTag(addPowerTag, position) {\r\n this.props.togglePowerTagCallback(this.props.RowIndex, this.props.PoleIndex, this.props.itemId, position, addPowerTag)\r\n }\r\n\r\n render() {\r\n const uniqueIndex = 'p-tag-row' + this.props.RowIndex + '-' + this.props.PoleIndex\r\n\r\n if (this.props.isDragging) {\r\n return
    \r\n }\r\n \r\n return (\r\n
    \r\n { this.props.PoleIndex + 1 }\r\n
    { event.preventDefault(); this.updateBrekerChassisNoteCall(); }}>\r\n {\r\n !this.props.BottomPowerTag && \r\n
    \r\n
    \r\n this.togglePowerTag(event.target.checked, 'top') } />\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n { this.generateBrekerPositions(this.props.PoleIndex + 1) }\r\n
    \r\n
    \r\n this.setState({ BreakerCircuitLabelInput: event.target.value }) } />\r\n \r\n { this.props.currentRating }

    \r\n { this.props.code }\r\n
    \r\n\r\n {\r\n this.state.BreakerCircuitLabelInput !== '' && !this.state.showEditOptions &&\r\n
    \r\n { this.state.BreakerCircuitLabelInput }\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n {\r\n !this.props.TopPowerTag &&\r\n
    \r\n
    \r\n this.togglePowerTag(event.target.checked, 'bottom') } />\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: () => {\r\n return {}\r\n },\r\n endDrag(props, monitor) {\r\n const dropResult = monitor.getDropResult() \r\n \r\n if (dropResult) {\r\n let poleIndex = dropResult.poleIndex\r\n let rowIndex = dropResult.rowIndex\r\n\r\n const canAddDeviceToPosition = props.canAddDeviceToPosition(props.poles, rowIndex, poleIndex, false, props.itemId)\r\n if (canAddDeviceToPosition) {\r\n props.updateBreakerPosition(props.itemId, dropResult.rowIndex, dropResult.poleIndex, props.BreakerCircuitLabelInput)\r\n }\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isAllowedToDragNDropPole && !props.isMandatoryMCB\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(ChassisBreaker)\r\n","import React from 'react'\r\nimport { DragSource } from 'react-dnd'\r\n\r\nexport class ChassisContactor extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.editClickCall = this.editClickCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.updateContactorChassisNoteCall = this.updateContactorChassisNoteCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about holds info on the selection options\r\n this.state = {\r\n showEditOptions: false,\r\n isDeleting: false,\r\n customLabel: this.props.customLabel\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.setState({ isDeleting: true })\r\n this.props.deletedCallback(this.props.RowIndex, this.props.PoleIndex, this.props.itemId)\r\n }\r\n\r\n editClickCall() {\r\n this.setState({ showEditOptions: !this.state.showEditOptions }, () => {\r\n if (this.state.showEditOptions) this.refs.labelInput.focus()\r\n })\r\n }\r\n\r\n updateContactorChassisNoteCall() {\r\n this.props.updateContactorChassisNote(this.props.itemId, this.props.RowIndex, this.props.PoleIndex, this.state.customLabel)\r\n this.setState({ showEditOptions: false })\r\n }\r\n\r\n generateDevicePositions(startNumber) {\r\n const spaceUsed = parseInt(this.props.poles, 10)\r\n const displayNumbers = []\r\n\r\n for (let i = 0; i < spaceUsed; i++) {\r\n let displayNumber = startNumber + i\r\n if (displayNumber < 10) displayNumber = '0' + displayNumber\r\n\r\n displayNumbers.push(\r\n
    \r\n
    { displayNumber }
    \r\n
    \r\n )\r\n }\r\n\r\n return displayNumbers\r\n }\r\n\r\n render() {\r\n const uniqueIndex = 'p-tag-row' + this.props.RowIndex + '-' + this.props.PoleIndex\r\n\r\n if (this.props.isDragging) {\r\n return
    \r\n }\r\n \r\n return (\r\n
    \r\n { this.props.PoleIndex + 1 }\r\n
    { event.preventDefault(); this.updateContactorChassisNoteCall(); }}>\r\n
    \r\n { this.generateDevicePositions(this.props.PoleIndex + 1) }\r\n
    \r\n
    \r\n this.setState({ customLabel: event.target.value }) } />\r\n \r\n { this.props.currentRating }

    \r\n Contactor { this.props.code }\r\n
    \r\n\r\n {\r\n this.state.customLabel !== '' && !this.state.showEditOptions &&\r\n
    \r\n { this.state.customLabel }\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return {}\r\n },\r\n endDrag(props, monitor) {\r\n const dropResult = monitor.getDropResult() \r\n \r\n if (dropResult) {\r\n props.updateContactorPosition(props.itemId, dropResult.rowIndex, dropResult.poleIndex, props.customLabel)\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isAllowedToDragNDropPole\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(ChassisContactor)\r\n","import React from 'react'\r\nimport { DragSource } from 'react-dnd'\r\n\r\nexport class ChassisFittedOption extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.editClickCall = this.editClickCall.bind(this)\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.updateFittedOptionChassisNoteCall = this.updateFittedOptionChassisNoteCall.bind(this)\r\n\r\n // Internal states that no one else needs to know about holds info on the selection options\r\n this.state = {\r\n showEditOptions: false,\r\n isDeleting: false,\r\n customLabel: this.props.customLabel\r\n }\r\n }\r\n\r\n deleteCall() {\r\n this.setState({ isDeleting: true })\r\n this.props.deletedCallback(this.props.RowIndex, this.props.PoleIndex, this.props.itemId)\r\n }\r\n\r\n editClickCall() {\r\n this.setState({ showEditOptions: !this.state.showEditOptions }, () => {\r\n if (this.state.showEditOptions) this.refs.labelInput.focus()\r\n })\r\n }\r\n\r\n updateFittedOptionChassisNoteCall() {\r\n this.props.updateFittedOptionChassisNote(this.props.itemId, this.props.RowIndex, this.props.PoleIndex, this.state.customLabel)\r\n this.setState({ showEditOptions: false })\r\n }\r\n\r\n generateDevicePositions(startNumber) {\r\n const spaceUsed = parseInt(this.props.poles, 10)\r\n const displayNumbers = []\r\n\r\n for (let i = 0; i < spaceUsed; i++) {\r\n let displayNumber = startNumber + i\r\n if (displayNumber < 10) displayNumber = '0' + displayNumber\r\n\r\n displayNumbers.push(\r\n
    \r\n
    { displayNumber }
    \r\n
    \r\n )\r\n }\r\n\r\n return displayNumbers\r\n }\r\n\r\n render() {\r\n const uniqueIndex = 'p-tag-row' + this.props.RowIndex + '-' + this.props.PoleIndex\r\n\r\n if (this.props.isDragging) {\r\n return
    \r\n }\r\n \r\n return (\r\n
    \r\n { this.props.PoleIndex + 1 }\r\n
    { event.preventDefault(); this.updateFittedOptionChassisNoteCall(); }}>\r\n
    \r\n { this.generateDevicePositions(this.props.PoleIndex + 1) }\r\n
    \r\n
    \r\n this.setState({ customLabel: event.target.value }) } />\r\n \r\n { this.props.currentRating }

    \r\n { this.props.code }\r\n
    \r\n\r\n {\r\n this.state.customLabel !== '' && !this.state.showEditOptions &&\r\n
    \r\n { this.state.customLabel }\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return {}\r\n },\r\n endDrag(props, monitor) {\r\n const dropResult = monitor.getDropResult() \r\n \r\n if (dropResult) {\r\n props.updateFittedOptionPosition(props.itemId, dropResult.rowIndex, dropResult.poleIndex, props.customLabel)\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isAllowedToDragNDropPole\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(ChassisFittedOption)\r\n","import { property } from 'lodash'\r\nimport React from 'react'\r\nimport { DropTarget } from 'react-dnd'\r\n\r\nexport class BoardEmptyPole extends React.Component {\r\n constructor (props) {\r\n super(props)\r\n }\r\n\r\n render () {\r\n const isActive = this.props.canDrop && this.props.isOver\r\n\r\n return (\r\n
    \r\n { this.props.poleDisplayIndex }\r\n
    \r\n \r\n {\r\n isActive ?\r\n \r\n {\r\n this.props.isAllowedToDragNDropPole ?\r\n Release to drop\r\n :\r\n Busbar present

    Not allowed
    \r\n }\r\n
    \r\n :\r\n Space
    Avl.
    \r\n }\r\n
    \r\n \r\n {/* Need to fix */}\r\n {/* Drag and drop a breaker from your library */}\r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DropTarget('ResidentialChassisPole',\r\n {\r\n drop: (props) => ({ \r\n rowIndex: props.rowIndex,\r\n poleIndex: props.poleIndex,\r\n isAllowedToDragNDropPole: props.isAllowedToDragNDropPole\r\n })\r\n },\r\n (connect, monitor) => ({ \r\n connectDropTarget: connect.dropTarget(),\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n isDraggingItem: monitor.getItem() !== null\r\n })\r\n)(BoardEmptyPole)","import React from 'react'\r\nimport { DragSource } from 'react-dnd'\r\n\r\nexport class BoardMainSwitch extends React.Component {\r\n constructor (props) {\r\n super(props)\r\n }\r\n\r\n generateDevicePositions(startNumber) {\r\n const spaceUsed = parseInt(this.props.poles, 10)\r\n const displayNumbers = []\r\n\r\n for (let i = 0; i < spaceUsed; i++) {\r\n let displayNumber = startNumber + i\r\n if (displayNumber < 10) displayNumber = '0' + displayNumber\r\n\r\n displayNumbers.push(\r\n
    \r\n
    { displayNumber }
    \r\n
    \r\n )\r\n }\r\n\r\n return displayNumbers\r\n }\r\n\r\n render () {\r\n if (this.props.isDragging) {\r\n return
    \r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n {/* { this.props.poleDisplayIndex } */}\r\n
    \r\n { this.generateDevicePositions(this.props.poleIndex + 1) }\r\n
    \r\n
    \r\n Main switch

    { this.props.rating }\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return {}\r\n },\r\n endDrag(props, monitor) {\r\n const item = monitor.getItem()\r\n const dropResult = monitor.getDropResult() \r\n\r\n if (dropResult) {\r\n let poleIndex = dropResult.poleIndex\r\n let rowIndex = dropResult.rowIndex\r\n\r\n if (rowIndex > 0) {\r\n window.alert('Main switch can not be placed in different row.')\r\n } else { \r\n // Since main switch can occupy 1, 2, or 3 positions, we need to check if it can be places there\r\n if (props.canAddDeviceToPosition(props.poles, rowIndex, poleIndex, true)) {\r\n props.updateMainSwitchPosition(poleIndex)\r\n }\r\n }\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isAllowedToDragNDropPole\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(BoardMainSwitch)\r\n","import React from 'react'\r\nimport { DragSource } from 'react-dnd'\r\n\r\nexport class WiserEnergyGateway extends React.Component {\r\n constructor (props) {\r\n super(props)\r\n }\r\n\r\n generateDevicePositions(startNumber) {\r\n const spaceUsed = parseInt(this.props.poles, 10)\r\n const displayNumbers = []\r\n\r\n for (let i = 0; i < spaceUsed; i++) {\r\n let displayNumber = startNumber + i\r\n if (displayNumber < 10) displayNumber = '0' + displayNumber\r\n\r\n displayNumbers.push(\r\n
    \r\n
    { displayNumber }
    \r\n
    \r\n )\r\n }\r\n\r\n return displayNumbers\r\n }\r\n\r\n render () {\r\n if (this.props.isDragging) {\r\n return
    \r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n { this.generateDevicePositions(this.props.poleIndex + 1) }\r\n
    \r\n
    \r\n Wiser Energy Gateway\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return {}\r\n },\r\n endDrag(props, monitor) {\r\n const dropResult = monitor.getDropResult() \r\n\r\n if (dropResult) {\r\n let poleIndex = dropResult.poleIndex\r\n let rowIndex = dropResult.rowIndex\r\n\r\n if (props.canAddDeviceToPosition(props.poles, rowIndex, poleIndex)) {\r\n props.updateWiserEnergyGatewayPosition(rowIndex, poleIndex)\r\n }\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isAllowedToDragNDropPole\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(WiserEnergyGateway)\r\n","import React from 'react'\r\n\r\nexport class BoardSurgeProtection extends React.Component {\r\n constructor (props) {\r\n super(props)\r\n }\r\n\r\n generateDevicePositions(startNumber, polesUsed) {\r\n const spaceUsed = parseInt(polesUsed, 10)\r\n const displayNumbers = []\r\n\r\n for (let i = 0; i < spaceUsed; i++) {\r\n let displayNumber = startNumber + i\r\n if (displayNumber < 10) displayNumber = '0' + displayNumber\r\n\r\n displayNumbers.push(\r\n
    \r\n
    { displayNumber }
    \r\n
    \r\n )\r\n }\r\n\r\n return displayNumbers\r\n }\r\n\r\n render () {\r\n return (\r\n
    \r\n
    \r\n
    \r\n { this.generateDevicePositions(this.props.poleIndex + 1, this.props.spaceUsed) }\r\n
    \r\n {/* { this.props.poleDisplayIndex } */}\r\n
    \r\n Surge Protection\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default BoardSurgeProtection","import React from 'react'\r\nimport { drawPercentProgressBars, getNumberOfRowsFromPolesString, getPolesCountFromPolesString, getNumberOfPolesFromStringExpression } from './../../../utils/helpers'\r\nimport ChassisBreaker from './ChassisBreaker'\r\nimport ChassisContactor from './ChassisContactor'\r\nimport ChassisFittedOption from './ChassisFittedOption'\r\nimport BoardEmptyPole from './BoardEmptyPole'\r\nimport BoardMainSwitch from './BoardMainSwitch'\r\nimport WiserEnergyGateway from './WiserEnergyGateway'\r\nimport BoardSurgeProtection from './BoardSurgeProtection'\r\nimport BusbarService from './../../../services/BusbarService'\r\n\r\nexport default class ChassisBoardResidential extends React.Component {\r\n\r\n constructor() {\r\n super()\r\n // Bind this to element function calls for better performance / practise\r\n // - ref: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md\r\n this.deleteCall = this.deleteCall.bind(this)\r\n this.deleteContactorCall = this.deleteContactorCall.bind(this)\r\n this.deleteFittedOptionCall = this.deleteFittedOptionCall.bind(this)\r\n this.togglePowerTag = this.togglePowerTag.bind(this)\r\n this.updateBrekerChassisNote = this.updateBrekerChassisNote.bind(this)\r\n this.updateContactorChassisNote = this.updateContactorChassisNote.bind(this)\r\n this.updateFittedOptionChassisNote = this.updateFittedOptionChassisNote.bind(this)\r\n this.updateFittedOptionPosition = this.updateFittedOptionPosition.bind(this)\r\n this.updateBreakerPosition = this.updateBreakerPosition.bind(this)\r\n this.updateContactorPosition = this.updateContactorPosition.bind(this)\r\n this.updateMainSwitchPosition = this.updateMainSwitchPosition.bind(this)\r\n this.updateWiserEnergyGatewayPosition = this.updateWiserEnergyGatewayPosition.bind(this)\r\n\r\n // Internal states to track what mode the selections are\r\n this.state = {\r\n isUpdatingDevice: false,\r\n notesOpen: []\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n drawPercentProgressBars()\r\n }\r\n \r\n shouldComponentUpdate(nextProps) {\r\n // Probably will need to update the progress, but leave it commened for now.\r\n // drawPercentProgressBars()\r\n\r\n if (this.props.percentageConfigured !== nextProps.percentageConfigured) {\r\n console.warn('Should redraw percentages')\r\n window.setTimeout(() => {\r\n drawPercentProgressBars()\r\n }, 1000)\r\n }\r\n\r\n if (this.props.isUpdatingDevice !== nextProps.isUpdatingDevice) {\r\n this.setState({ isUpdatingDevice: nextProps.isUpdatingDevice })\r\n }\r\n\r\n return true\r\n }\r\n\r\n togglePowerTags = () => {\r\n this.props.updatePowerTagsEditing(!this.props.isEditingPowerTags)\r\n }\r\n\r\n deleteCall(rowIndex, poleIndex, itemId) {\r\n this.props.deleteCallback(rowIndex, poleIndex, itemId)\r\n }\r\n\r\n deleteContactorCall(rowIndex, poleIndex, itemId) {\r\n this.props.deleteContactorCallback(rowIndex, poleIndex, itemId)\r\n }\r\n\r\n deleteFittedOptionCall(rowIndex, poleIndex, itemId) {\r\n this.props.deleteFittedOptionCallback(rowIndex, poleIndex, itemId)\r\n }\r\n\r\n togglePowerTag(rowIndex, poleIndex, itemId, position, addPowerTag) {\r\n this.props.togglePowerTagCallback(rowIndex, poleIndex, itemId, position, addPowerTag)\r\n }\r\n\r\n updateBrekerChassisNote(itemId, rowIndex, poleIndex, note) {\r\n this.props.updateBrekerChassisNote(itemId, rowIndex, poleIndex, note)\r\n }\r\n \r\n updateContactorChassisNote(itemId, rowIndex, poleIndex, note) {\r\n this.props.updateContactorChassisNote(itemId, rowIndex, poleIndex, note)\r\n }\r\n\r\n updateFittedOptionChassisNote(itemId, rowIndex, poleIndex, note) {\r\n this.props.updateFittedOptionChassisNote(itemId, rowIndex, poleIndex, note)\r\n }\r\n\r\n updateBreakerPosition(itemId, rowIndex, poleIndex, note) {\r\n this.props.updateBreakerPosition(itemId, rowIndex, poleIndex, note)\r\n }\r\n\r\n updateContactorPosition(itemId, rowIndex, poleIndex, note) {\r\n this.props.updateContactorPosition(itemId, rowIndex, poleIndex, note)\r\n }\r\n\r\n updateFittedOptionPosition(itemId, rowIndex, poleIndex, note) {\r\n this.props.updateFittedOptionPosition(itemId, rowIndex, poleIndex, note)\r\n }\r\n\r\n updateMainSwitchPosition(updateMainSwitchPosition) {\r\n this.props.updateMainSwitchPosition(updateMainSwitchPosition)\r\n }\r\n\r\n updateWiserEnergyGatewayPosition(rowIndex, poleIndex) {\r\n this.props.updateWiserEnergyGatewayPosition(rowIndex, poleIndex)\r\n }\r\n\r\n getRowBusbar(rowArrayIndex, position) {\r\n return this.props.busbars.find(busbar => {\r\n return busbar.Row === rowArrayIndex + 1 && busbar.BusBarReadOnly.MountingPosition === position\r\n })\r\n }\r\n\r\n removeBusbar(ItemID, BusBarItemID) {\r\n this.props.removeBusbar(ItemID, BusBarItemID)\r\n }\r\n\r\n renderRows() {\r\n const rows = []\r\n const rowsCount = getNumberOfRowsFromPolesString(this.props.polesNeeded)\r\n const columnsCount = getPolesCountFromPolesString(this.props.polesNeeded)\r\n\r\n for (let rowArrayIndex = 0; rowArrayIndex < rowsCount; rowArrayIndex++) {\r\n const rowTopBusbar = this.getRowBusbar(rowArrayIndex, 'Top')\r\n const rowBottomBusbar = this.getRowBusbar(rowArrayIndex, 'Bottom')\r\n const isAllowedToDragNDropPole = rowTopBusbar === undefined && rowBottomBusbar === undefined\r\n\r\n rows.push(\r\n
    \r\n
    \r\n

    \r\n { rowArrayIndex === 0 ? 'First' : ''} { rowArrayIndex === 1 ? 'Second' : ''} { rowArrayIndex === 2 ? 'Third' : ''} { rowArrayIndex === 3 ? 'Fourth' : ''} row\r\n

    \r\n\r\n {/* Top slots */}\r\n
    \r\n {\r\n !this.props.isEditingPowerTags && \r\n Space Available - Busbar\r\n // Space Available - Busbar or PowerTags\r\n }\r\n\r\n {\r\n rowTopBusbar !== undefined &&\r\n
    \r\n Busbar { rowTopBusbar.BusBarReadOnly.NumberOfPoles }\r\n Extra Poles     { rowTopBusbar.ExtraPoles }\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n\r\n {/* Device columns */}\r\n
    \r\n { this.renderPoles(rowArrayIndex, isAllowedToDragNDropPole) }\r\n
    \r\n\r\n {/* Bottom slots */}\r\n
    \r\n {\r\n !this.props.isEditingPowerTags && \r\n Space Available - Busbar\r\n // Space Available - Busbar or PowerTags\r\n }\r\n\r\n {/* Manipulate is-position-1 class to indicate where busbar starts */}\r\n {\r\n rowBottomBusbar !== undefined &&\r\n
    \r\n Busbar { rowBottomBusbar.BusBarReadOnly.NumberOfPoles }\r\n Extra Poles     { rowBottomBusbar.ExtraPoles }\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n return rows\r\n }\r\n\r\n renderPoles(rowArrayIndex, isAllowedToDragNDropPole) {\r\n const poles = []\r\n const columnsCount = getPolesCountFromPolesString(this.props.polesNeeded)\r\n const rowTopBusbar = this.getRowBusbar(rowArrayIndex, 'Top')\r\n const rowBottomBusbar = this.getRowBusbar(rowArrayIndex, 'Bottom')\r\n const busbarsWithNeutralBlock = BusbarService.getBusbarsWithNeutralTerminalBlockReferences()\r\n const isRowWithSurgeProtection = rowArrayIndex === 0 && this.props.surgeProtection\r\n\r\n let poleArrayIndexOfMandatorySurgeProtectionMCB = null\r\n if (isRowWithSurgeProtection) {\r\n poleArrayIndexOfMandatorySurgeProtectionMCB = this.props.surgeProtectionDetails.SpaceUsed\r\n }\r\n\r\n let currentBusbar = rowTopBusbar\r\n if (rowBottomBusbar !== undefined) currentBusbar = rowBottomBusbar\r\n \r\n for (let poleArrayIndex = 0; poleArrayIndex < columnsCount; poleArrayIndex++) {\r\n let poleDisplayIndex = poleArrayIndex + 1\r\n if (poleDisplayIndex < 10) poleDisplayIndex = '0' + poleDisplayIndex\r\n \r\n let shouldDisplayNeutralBlock = false\r\n if (currentBusbar !== undefined) {\r\n if (busbarsWithNeutralBlock.indexOf(currentBusbar.BusBarReadOnly.Reference) > -1 && (this.props.mainSwitchPosition - 1) === poleArrayIndex) { \r\n shouldDisplayNeutralBlock = true\r\n }\r\n }\r\n\r\n const breaker = this.props.breakers.find(breaker => breaker.RowIndex === rowArrayIndex && breaker.PoleIndex === poleArrayIndex)\r\n const contactor = this.props.contactors.find(contactor => contactor.RowIndex === rowArrayIndex && contactor.PoleIndex === poleArrayIndex)\r\n const fittedOption = this.props.fittedOptions.find(fittedOption => fittedOption.RowIndex === rowArrayIndex && fittedOption.PoleIndex === poleArrayIndex)\r\n\r\n let shouldDisplayWiserEnergyGateway = false\r\n if (this.props.hasWiserEnergyGateway && this.props.wiserEnergyGatewayRow === rowArrayIndex && this.props.wiserEnergyGatewayPosition === poleArrayIndex) {\r\n shouldDisplayWiserEnergyGateway = true\r\n }\r\n\r\n // If board has a surge protection selected, then display it as first item in the first row\r\n if (rowArrayIndex === 0 && poleArrayIndex === 0 && this.props.surgeProtection) {\r\n poles.push(\r\n \r\n \r\n )\r\n\r\n // Checks for the main switch\r\n } else if (rowArrayIndex === 0 && poleArrayIndex === this.props.mainSwitchPosition) { \r\n poles.push(\r\n \r\n \r\n this.props.canAddDeviceToPosition(speceUsed, rowIndex, poleIndex, isMainSwitch)}\r\n />\r\n )\r\n } else if (breaker !== undefined) {\r\n poles.push(\r\n \r\n \r\n this.props.canAddDeviceToPosition(speceUsed, rowIndex, poleIndex, isMainSwitch, breakerItemID)}\r\n />\r\n )\r\n } else if (contactor !== undefined) {\r\n poles.push(\r\n \r\n \r\n )\r\n } else if (fittedOption !== undefined) {\r\n poles.push(\r\n \r\n \r\n )\r\n } else if (shouldDisplayNeutralBlock) {\r\n poles.push(\r\n \r\n
    \r\n
    \r\n { poleDisplayIndex }\r\n
    \r\n Neutral terminal block\r\n
    \r\n
    \r\n
    \r\n
    )\r\n } else if (shouldDisplayWiserEnergyGateway) {\r\n poles.push(\r\n \r\n \r\n this.props.canAddDeviceToPosition(speceUsed, rowIndex, poleIndex)}\r\n />\r\n )\r\n } else {\r\n poles.push(\r\n \r\n \r\n )\r\n }\r\n }\r\n\r\n return poles\r\n }\r\n\r\n render() { \r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n { this.props.boardName }\r\n
    \r\n
    \r\n \r\n {/* */}\r\n
    \r\n
    \r\n
    \r\n
    \r\n { this.props.configured } Pole Configured\r\n { this.props.remaining } of { this.props.total } poles Remaining\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n { this.renderRows() }\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n","import { DragSource } from 'react-dnd'\r\nimport React from 'react'\r\n\r\nexport class Breaker extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n var opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n this.state = {\r\n isDragging: opacity\r\n }\r\n }\r\n\r\n handleDeletingBreaker (itemID) {\r\n this.props.handleDeletingBreaker(itemID)\r\n }\r\n\r\n handleToggleBreakerFavourite (itemID) {\r\n this.props.handleToggleBreakerFavourite(itemID)\r\n }\r\n\r\n handleBreakerAutoAdd (itemID) {\r\n this.props.handleBreakerAutoAdd(itemID, this.props.quantity)\r\n }\r\n\r\n render() {\r\n const opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n return (\r\n
    \r\n { this.props.usedCount }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { this.props.description }\r\n\r\n {\r\n this.props.isDisabled &&\r\n
    Cannot be fitted on to this board
    \r\n }\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n this.handleToggleBreakerFavourite(this.props.ItemID) } />\r\n\r\n \r\n
    \r\n\r\n {!this.props.isDragAndDropEnabled && !this.props.isDisabled &&\r\n
    \r\n this.props.handleUpdateQuantity(e.target.value, this.props.ItemID)} />\r\n
    \r\n }\r\n\r\n { !this.props.isDisabled && \r\n \r\n }\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return { \r\n ItemID: props.ItemID,\r\n BreakerTypeItemID: props.BreakerTypeItemID,\r\n poleCount: props.poleCount\r\n }\r\n },\r\n endDrag(props, monitor) {\r\n const item = monitor.getItem()\r\n const dropResult = monitor.getDropResult() \r\n\r\n if (dropResult !== null && (props.isAllowedToDragNDropPole === true || props.isAllowedToDragNDropPole === undefined)) {\r\n props.addBreakerToBoard(dropResult.rowIndex, dropResult.poleIndex, item.ItemID, item.BreakerTypeItemID)\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isDragAndDropEnabled\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(Breaker)\r\n","import { DragSource } from 'react-dnd'\r\nimport React from 'react'\r\n\r\nexport class Contactor extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n var opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n this.state = {\r\n isDragging: opacity\r\n }\r\n }\r\n\r\n handleDeletingContactor (itemID) {\r\n this.props.handleDeletingContactor(itemID)\r\n }\r\n\r\n handleContactorAutoAdd (itemID) {\r\n this.props.handleContactorAutoAdd(itemID, this.props.quantity)\r\n }\r\n\r\n render() {\r\n const opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n return (\r\n
    \r\n { this.props.usedCount }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Contactor: { this.props.description }\r\n\r\n {\r\n this.props.isDisabled &&\r\n
    Cannot be fitted on to this board
    \r\n }\r\n
    \r\n
    \r\n \r\n\r\n {!this.props.isDragAndDropEnabled && !this.props.isDisabled &&\r\n
    \r\n this.props.handleContactorUpdateQuantity(e.target.value, this.props.ItemID)} />\r\n
    \r\n }\r\n\r\n { !this.props.isDisabled && \r\n \r\n }\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return { \r\n ItemID: props.ItemID,\r\n ContactorItemID: props.ContactorItemID,\r\n poleCount: props.poleCount\r\n }\r\n },\r\n endDrag(props, monitor) {\r\n const item = monitor.getItem()\r\n const dropResult = monitor.getDropResult() \r\n\r\n if (dropResult !== null && (props.isAllowedToDragNDropPole === true || props.isAllowedToDragNDropPole === undefined)) {\r\n props.addContactorToBoard(dropResult.rowIndex, dropResult.poleIndex, item.ItemID, item.ContactorItemID)\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isDragAndDropEnabled\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(Contactor)\r\n","import { DragSource } from 'react-dnd'\r\nimport React from 'react'\r\n\r\nexport class FittedOption extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n var opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n this.state = {\r\n isDragging: opacity\r\n }\r\n }\r\n\r\n handleDeletingFittedOption (itemID) {\r\n this.props.handleDeletingFittedOption(itemID)\r\n }\r\n\r\n handleFittedOptionAutoAdd (itemID) {\r\n this.props.handleFittedOptionAutoAdd(itemID, this.props.quantity)\r\n }\r\n\r\n render() {\r\n const opacity = this.props.isDragging ? 0.4 : 1\r\n\r\n return (\r\n
    \r\n { this.props.usedCount }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { this.props.description }\r\n\r\n {\r\n this.props.isDisabled &&\r\n
    Cannot be fitted on to this board
    \r\n }\r\n
    \r\n
    \r\n \r\n\r\n {!this.props.isDragAndDropEnabled && !this.props.isDisabled &&\r\n
    \r\n this.props.handleFittedOptionUpdateQuantity(e.target.value, this.props.ItemID)} />\r\n
    \r\n }\r\n\r\n { !this.props.isDisabled && \r\n \r\n }\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default DragSource('ResidentialChassisPole', \r\n {\r\n beginDrag: (props) => {\r\n return { \r\n ItemID: props.ItemID,\r\n FittedOptionItemID: props.FittedOptionItemID,\r\n poleCount: props.poleCount\r\n }\r\n },\r\n endDrag(props, monitor) {\r\n const item = monitor.getItem()\r\n const dropResult = monitor.getDropResult() \r\n\r\n if (dropResult !== null && (props.isAllowedToDragNDropPole === true || props.isAllowedToDragNDropPole === undefined)) {\r\n props.addFittedOptionToBoard(dropResult.rowIndex, dropResult.poleIndex, item.ItemID, item.FittedOptionItemID)\r\n }\r\n },\r\n canDrag(props) {\r\n return props.isDragAndDropEnabled\r\n }\r\n }, \r\n (connect, monitor) => {\r\n return {\r\n connectDragSource: connect.dragSource(),\r\n isDragging: monitor.isDragging()\r\n }\r\n }\r\n)(FittedOption)\r\n","import React, { Component } from 'react'\r\nimport { withRouter, Link } from 'react-router-dom'\r\nimport { apiCallsCommercial } from '../../utils/apiCallsCommercial'\r\nimport { getUrlParameter } from '../../utils/helpers'\r\nimport { cloneDeep } from 'lodash'\r\nimport Modal from '../../components/modal/Modal'\r\nimport GlobalOverlay from '../../components/global-overlay/GlobalOverlay'\r\nimport BreakerDetailsFormContainerResidential from '../../components/config-chassis/residential/BreakerDetailsFormContainerResidential'\r\nimport AdditionalItemsFormContainer from '../../components/config-chassis/residential/AdditionalItemsFormContainer'\r\nimport BusBarFormContainer from '../../components/config-chassis/residential/BusBarFormContainer'\r\nimport commonFunctionsService from '../../services/CommonFunctionsService'\r\nimport ChassisBoardResidential from '../../components/config-chassis/residential/ChassisBoardResidential'\r\nimport Breaker from '../../components/config-chassis/residential/Breaker'\r\nimport Contactor from '../../components/config-chassis/residential/Contactor'\r\nimport FittedOption from '../../components/config-chassis/residential/FittedOption'\r\nimport BoardDetailsResidential from '../project-details/residential/BoardDetails'\r\nimport HeaderLogo from '../../components/header-logo/HeaderLogo'\r\nimport HeaderBrandCommercial from '../../components/header-brand-commercial/HeaderBrandCommercial'\r\nimport HeaderBrandResidential from '../../components/header-brand-residential/HeaderBrandResidential'\r\nimport { Player } from '@lottiefiles/react-lottie-player'\r\nimport { apiCallsResidential } from '../../utils/apiCallsResidential'\r\nimport BoardService from './../../services/BoardService'\r\nimport { getNumberOfRowsFromPolesString, getPolesCountFromPolesString, canAddDeviceToBoardPosition } from './../../utils/helpers'\r\nimport analyticsDataLayer from '../../services/AnalyticsDataLayer'\r\n\r\nconst { CONST } = require('../../CONST')\r\n\r\nconst SAMPLE_BREAKER = {\r\n \"ProjectBoardID\": 0,\r\n \"BreakerTypeItemID\": 0,\r\n \"ChassisIndex\": 0,\r\n \"ChassisPositionIndex\": 0,\r\n \"BreakerCircuitLabel\": \"\",\r\n \"Chassis1PercentComplete\": 0,\r\n \"Chassis2PercentComplete\": 0,\r\n \"BreakerTypeReadOnly\": {\r\n \"ItemID\": 0,\r\n \"TypeCode\": \"0\",\r\n \"TypeCodeLabel\": null,\r\n \"BreakerReference\": \"0\",\r\n \"BreakerReferenceLabel\": null,\r\n \"DrawingDesc\": \"0\",\r\n \"DrawingDescLabel\": null,\r\n \"PoleCount\": 0,\r\n \"PoleCountLabel\": \"\",\r\n \"CurrentRating\": 0,\r\n \"CurrentRatingLabel\": null,\r\n \"PitchPoleSize\": 0\r\n },\r\n \"ParentBreakerTypeItemID\": 0,\r\n \"ParentBreakerCurrentRating\": 0,\r\n \"ParentBoardBreakerItemID\": 0,\r\n \"BreakerIsParent\": false,\r\n \"ItemID\": 0,\r\n \"ItemGUID\": \"\",\r\n \"IsDeleted\": false\r\n}\r\n\r\nconst SAMPLE_CONTRACTOR = {\r\n \"ProjectBoardID\": 0,\r\n \"ContractorItemID\": 0,\r\n \"ProjectID\": 0,\r\n \"RowIndex\": 0,\r\n \"PoleIndex\": 0,\r\n \"BreakerCircuitLabel\": \"\",\r\n \"ContractorReadOnly\": {\r\n \"ItemID\": 0,\r\n \"TypeOfDevice\": \"\",\r\n \"CurrentRating\": \"\",\r\n \"Description\": \"\",\r\n \"Rating\": \"\",\r\n \"SpaceUsed\": 0,\r\n \"Image\": \"\"\r\n },\r\n \"ItemID\": 0,\r\n \"ItemGUID\": \"\",\r\n \"IsDeleted\": false\r\n}\r\n\r\nconst SAMPLE_FITTED_OPTION = {\r\n \"ProjectBoardID\": 0,\r\n \"ProjectID\": 0,\r\n \"FittedOptionItemID\": 0,\r\n \"RowIndex\": 0,\r\n \"PoleIndex\": 0,\r\n \"BreakerCircuitLabel\": \"\",\r\n \"FittedOptionReadOnly\": {\r\n \"TypeOfDevice\": \"\",\r\n \"Rating\": \"\",\r\n \"Reference\": \"\",\r\n \"Description\": \"\",\r\n \"SpaceUsed\": \"\",\r\n \"ItemID\": 0,\r\n \"ItemGUID\": \"\",\r\n \"IsDeleted\": false\r\n },\r\n \"ItemID\": 0,\r\n \"ItemGUID\": \"\",\r\n \"IsDeleted\": false\r\n}\r\n\r\n\r\nclass ConfigChassisResidential extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.addBreaker = this.addBreaker.bind(this)\r\n this.saveContactor = this.saveContactor.bind(this)\r\n this.saveFittedOption = this.saveFittedOption.bind(this)\r\n this.deleteBreakerFromBoard = this.deleteBreakerFromBoard.bind(this)\r\n this.deleteContactorFromBoard = this.deleteContactorFromBoard.bind(this)\r\n this.deleteFittedOptionFromBoard = this.deleteFittedOptionFromBoard.bind(this)\r\n this.togglePowerTag = this.togglePowerTag.bind(this)\r\n this.updateBrekerChassisNote = this.updateBrekerChassisNote.bind(this)\r\n this.updateContactorChassisNote = this.updateContactorChassisNote.bind(this)\r\n this.updateFittedOptionChassisNote = this.updateFittedOptionChassisNote.bind(this)\r\n this.updateBreakerPosition = this.updateBreakerPosition.bind(this)\r\n this.updateContactorPosition = this.updateContactorPosition.bind(this)\r\n this.updateFittedOptionPosition = this.updateFittedOptionPosition.bind(this)\r\n this.updateMainSwitchPosition = this.updateMainSwitchPosition.bind(this)\r\n this.updateWiserEnergyGatewayPosition = this.updateWiserEnergyGatewayPosition.bind(this)\r\n this.removeBusbar = this.removeBusbar.bind(this)\r\n this.onScroll = this.onScroll.bind(this)\r\n this.scrollRef = React.createRef()\r\n\r\n this.state = {\r\n projectID: '',\r\n boardID: '',\r\n board: {},\r\n boardDetails: {}, // Contains more details (from boardOptionData) based on user selections\r\n boardOptions: {},\r\n boardOptionData: [],\r\n boardToConfigure: {},\r\n shouldRedirectToBoard: false,\r\n project: {},\r\n miscParts: [],\r\n fittedOptions: [],\r\n breakerOptionData: [],\r\n residentialAllPartsAvailable: [],\r\n breakerOptions: [],\r\n userId: 0,\r\n userData: {},\r\n favBreakers: [],\r\n isLoading: true,\r\n apiError: '',\r\n isBreakerModalOpen: false,\r\n isAdditionalItemsModalOpen: false,\r\n isBusbarModalOpen: false,\r\n activeBreakersTab: 'all', // all, favourites, boardonly (boardonly indicates all breakers added to the board minus favourites)\r\n isDragAndDropEnabled: true,\r\n editedBreaker: {\r\n idInCollection: null,\r\n isFav: false\r\n },\r\n boardPolesTotal: 0,\r\n boardPolesConfigured: 0,\r\n boardPolesRemaining: 0,\r\n boardCompletionPercentage: 0,\r\n pageInfo: '',\r\n displayMaxBoardLimitReached: '',\r\n isConfiguringBoard: false,\r\n isAddingDevice: [],\r\n isUpdatingDevice: false,\r\n isAddingBusBar: false,\r\n hasAlreadyShownEnoughQuoteInfo: false,\r\n showDragNDropTutorial: false,\r\n scrollTop: 0,\r\n isEditingPowerTags: false,\r\n hasMixedDifferentProductRanges: false\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n projectID: getUrlParameter('projectID'),\r\n boardID: getUrlParameter('boardID')\r\n }, () => {\r\n this.initialize()\r\n })\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.scrollRef.current !== null) {\r\n this.scrollRef.current.scrollTop = this.state.scrollTop\r\n }\r\n }\r\n\r\n initialize() {\r\n // Load the API data after mounting so the spinner gets rendered first\r\n apiCallsResidential.apiGetProject(this.state.projectID)\r\n .then(projectData => {\r\n this.setState({ project: projectData })\r\n\r\n return apiCallsResidential.apiGetBoard(this.state.projectID, this.state.boardID)\r\n })\r\n .then(boardData => {\r\n this.setState({ board: boardData }, () => this.checkForDifferentProductRanges())\r\n\r\n return apiCallsResidential.apiGetBoardOption() // Load the breaker options\r\n })\r\n .then(boardOptionData => {\r\n const boardDetails = BoardService.getDetails(boardOptionData,\r\n this.state.board.EnclosureID, this.state.board.MainSwitchID, this.state.board.SPDID, this.state.board.MetalBlackPlateID)\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(this.state.board, boardDetails)\r\n this.setState({\r\n boardOptionData: boardOptionData,\r\n boardDetails: boardDetails,\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage\r\n })\r\n\r\n return apiCallsResidential.apiGetBoardOptionLabels()\r\n })\r\n .then(boardOptionLabels => {\r\n this.setState({ boardOptions: boardOptionLabels })\r\n\r\n return apiCallsResidential.apiGetBreakerOptions()\r\n })\r\n .then(breakerTypeData => {\r\n this.setState({ breakerOptionData: breakerTypeData })\r\n\r\n // Load the board misc parts after the project has been loaded\r\n return apiCallsResidential.apiGetBreakerOptionLabels()\r\n })\r\n .then(breakerTypeLabelsData => {\r\n this.setState({ breakerOptions: breakerTypeLabelsData })\r\n\r\n // Load the board misc parts after the project has been loaded\r\n return apiCallsResidential.apiGetBoardMiscParts()\r\n })\r\n .then(miscData => {\r\n // As for now we are disabling powertags, so we need to filter all fitted options of TypeOfDevice: 'Powertag control' from the miscDat.FittedOptions\r\n const filteredFittedOptions = miscData.FittedOptions.filter(item => item.TypeOfDevice !== 'Powertag control')\r\n\r\n this.setState({\r\n fittedOptions: filteredFittedOptions,\r\n miscParts: miscData.LooseSupplyItems\r\n }, () => console.log('fittedOptions', this.state.fittedOptions))\r\n\r\n return apiCallsResidential.apiGetBusBars()\r\n })\r\n .then(busbars => {\r\n this.setState({ busbarsData: busbars })\r\n\r\n return apiCallsResidential.apiGetContactorsOptions()\r\n })\r\n .then(contactors => {\r\n this.setState({ contactorsOptionData: contactors }, () => console.log('contactorsOptionData', this.state.contactorsOptionData))\r\n\r\n // Load the user settings\r\n return apiCallsCommercial.apiUserSettings()\r\n })\r\n .then(userData => {\r\n this.setState({\r\n userData: userData,\r\n userId: userData.UserID,\r\n wholesalerBranchID: userData.PreferredWholesaler1ItemID\r\n })\r\n\r\n // Load user favourite breakers\r\n return apiCallsResidential.apiGetUserFavouriteBreakers()\r\n })\r\n .then(favouriteBreakers => {\r\n this.setState({ favBreakers: favouriteBreakers })\r\n console.log('favouriteBreakers', favouriteBreakers)\r\n\r\n return apiCallsResidential.apiGetAllParts()\r\n })\r\n .then(allParts => {\r\n this.setState({\r\n residentialAllPartsAvailable: allParts,\r\n isLoading: false\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n // If there is an error during the loading state, then for now display it as an alert and redirect the user back to the project details\r\n if (this.state.isLoading) {\r\n window.alert(error.message)\r\n window.setTimeout(() => this.props.history.push(CONST.PAGES.PROJECT_DETAILS_RESIDENTIAL + '?orderID=' + this.state.projectID), 1000)\r\n }\r\n })\r\n }\r\n\r\n onScroll() {\r\n this.setState({ scrollTop: this.scrollRef.current.scrollTop })\r\n }\r\n\r\n startAddingBreaker() {\r\n this.setState({\r\n isBreakerModalOpen: true,\r\n editedBreaker: {\r\n idInCollection: null,\r\n isFav: false\r\n }\r\n })\r\n }\r\n\r\n startAddingAdditionalItems() {\r\n this.setState({ isAdditionalItemsModalOpen: true })\r\n }\r\n\r\n closeBreakerModal() {\r\n this.setState({ isBreakerModalOpen: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n closeAddingAdditionalItemsModal() {\r\n this.setState({ isAdditionalItemsModalOpen: false })\r\n }\r\n\r\n startCreatingBusbar() {\r\n this.setState({ isBusbarModalOpen: true })\r\n }\r\n\r\n stopCreatingBusbar() {\r\n this.setState({ isBusbarModalOpen: false })\r\n commonFunctionsService.closeModals()\r\n }\r\n\r\n // Get the currently editing breaker\r\n getEditingBreaker() {\r\n if (!this.state.breakerOptionData || !this.state.editedBreaker.idInCollection) { return null }\r\n\r\n if (this.state.editedBreaker.isFav) {\r\n return this.state.favBreakers.find(item => item.ItemID === this.state.editedBreaker.idInCollection)\r\n } else {\r\n return this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === this.state.editedBreaker.idInCollection)\r\n }\r\n }\r\n\r\n getBreaker(breakerID) {\r\n return this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === breakerID)\r\n }\r\n\r\n getContactor(contactorItemId) {\r\n return this.state.board.ProjectBoardContactorToolboxCollection.find(item => item.ItemID === contactorItemId)\r\n }\r\n\r\n getFittedOption(fittedOptionItemId) {\r\n return this.state.board.ProjectBoardFittedOptionToolboxCollection.find(item => item.ItemID === fittedOptionItemId)\r\n }\r\n\r\n isBreakerFavourite(BreakerTypeItemID) {\r\n return this.state.favBreakers.find(item => item.BreakerTypeItemID === BreakerTypeItemID) !== undefined\r\n }\r\n\r\n getBreakerFavourite(BreakerTypeItemID) {\r\n return this.state.favBreakers.find(item => item.BreakerTypeItemID === BreakerTypeItemID)\r\n }\r\n\r\n addBreaker(breakerTypeId) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoardBreakerToolbox(this.state.projectID, this.state.boardID, breakerTypeId)\r\n .then(toolboxBreaker => {\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerToolboxCollection)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedBreakers.push(toolboxBreaker)\r\n updatedBoard.ProjectBoardBreakerToolboxCollection = updatedBreakers\r\n\r\n // Show tutorial once 1 breaker is added and only if Drag and Drop is enabled. And remember it, so we don't display it again to the user.\r\n if (window.localStorage.getItem('hasSeenTutorial') === null && updatedBreakers.length === 1 && this.state.isDragAndDropEnabled) {\r\n this.setState({ showDragNDropTutorial: true })\r\n window.setTimeout(() => this.setState({ showDragNDropTutorial: false }), 6000)\r\n window.localStorage.setItem('hasSeenTutorial', 'true')\r\n }\r\n\r\n this.setState({ board: updatedBoard }, () => {\r\n analyticsDataLayer.addBreaker({\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(),\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"project_type\": 'Residential',\r\n \"funnel_step\": '1',\r\n \"funnel_total_steps\": '1'\r\n })\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.closeBreakerModal()\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n saveContactor(itemID) {\r\n console.log('Should save saveContactor, item ID: ' + itemID)\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoardContactorToolbox(this.state.projectID, this.state.boardID, itemID)\r\n .then(toolboxContactor => {\r\n const updatedContactors = cloneDeep(this.state.board.ProjectBoardContactorToolboxCollection)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedContactors.push(toolboxContactor)\r\n updatedBoard.ProjectBoardContactorToolboxCollection = updatedContactors\r\n\r\n if (updatedContactors.length === 1) this.displayTutorial()\r\n\r\n this.setState({ board: updatedBoard })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.closeAddingAdditionalItemsModal()\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n saveFittedOption(itemID) {\r\n console.log('Should save saveFittedOption, item ID: ' + itemID)\r\n\r\n apiCallsResidential.apiSaveBoardFittedOptionToolbox(this.state.projectID, this.state.boardID, itemID)\r\n .then(toolboxFittedOption => {\r\n const updatedFittedOptions = cloneDeep(this.state.board.ProjectBoardFittedOptionToolboxCollection)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedFittedOptions.push(toolboxFittedOption)\r\n updatedBoard.ProjectBoardFittedOptionToolboxCollection = updatedFittedOptions\r\n\r\n if (updatedFittedOptions.length === 1) this.displayTutorial()\r\n\r\n this.setState({ board: updatedBoard })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.closeAddingAdditionalItemsModal()\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n displayTutorial() {\r\n // Show tutorial once 1 device is added and only if Drag and Drop is enabled. And remember it, so we don't display it again to the user.\r\n if (window.localStorage.getItem('hasSeenTutorial') === null && this.state.isDragAndDropEnabled) {\r\n this.setState({ showDragNDropTutorial: true })\r\n window.setTimeout(() => this.setState({ showDragNDropTutorial: false }), 6000)\r\n window.localStorage.setItem('hasSeenTutorial', 'true')\r\n }\r\n }\r\n\r\n handleDeletingBreaker(breakerID) {\r\n const breaker = this.getBreaker(breakerID)\r\n\r\n this.deleteBreaker(breakerID, breaker.BreakerTypeItemID)\r\n }\r\n\r\n deleteBreaker(breakerID, breakerTypeId) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoardBreakerToolbox(this.state.projectID, this.state.boardID, breakerTypeId, breakerID, true)\r\n .then((deletedBreaker) => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerToolboxCollection.filter(item => item.ItemID !== breakerID)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerToolboxCollection = updatedBreakers\r\n\r\n this.setState({\r\n board: updatedBoard,\r\n editedBreaker: {\r\n idInCollection: null,\r\n isFav: false\r\n }\r\n })\r\n\r\n analyticsDataLayer.removeFromCart({\r\n \"currency\": 'AUD',\r\n \"value\": deletedBreaker.Price,\r\n \"project_type\": 'Residential',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(), \r\n \"items\": [\r\n {\r\n \"item_id\": deletedBreaker.BreakerTypeReadOnly.Reference,\r\n \"item_name\": deletedBreaker.BreakerTypeReadOnly.Description, // MCB-10kA-1P-16A\r\n \"quantity\": deletedBreaker?.BreakerTypeReadOnly?.SpaceUsed ? parseInt(deletedBreaker.BreakerTypeReadOnly.SpaceUsed) : 1,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": deletedBreaker.Category,\r\n \"item_variant\": '',\r\n \"price\": deletedBreaker.Price\r\n }\r\n ]\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => this.setState({ isLoading: false }))\r\n }\r\n\r\n handleDeletingContactor(contactorID) {\r\n const contactor = this.getContactor(contactorID)\r\n\r\n this.deleteContactor(contactorID, contactor.ContactorItemID)\r\n }\r\n\r\n handleDeletingFittedOption(fittedOptionID) {\r\n const fittedOption = this.getFittedOption(fittedOptionID)\r\n\r\n this.deleteFittedOption(fittedOptionID, fittedOption.FittedOptionItemID)\r\n }\r\n\r\n deleteContactor(contactorID, contactorItemId) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoardContactorToolbox(this.state.projectID, this.state.boardID, contactorItemId, contactorID, true)\r\n .then(() => {\r\n const updatedContactors = this.state.board.ProjectBoardContactorToolboxCollection.filter(item => item.ItemID !== contactorID)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardContactorToolboxCollection = updatedContactors\r\n\r\n this.setState({ board: updatedBoard })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => this.setState({ isLoading: false }))\r\n }\r\n\r\n deleteFittedOption(fittedOptionID, fittedOptionItemId) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoardFittedOptionToolbox(this.state.projectID, this.state.boardID, fittedOptionItemId, fittedOptionID, true)\r\n .then(() => {\r\n const updatedFittedOptions = this.state.board.ProjectBoardFittedOptionToolboxCollection.filter(item => item.ItemID !== fittedOptionID)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardFittedOptionToolboxCollection = updatedFittedOptions\r\n\r\n this.setState({ board: updatedBoard })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => this.setState({ isLoading: false }))\r\n }\r\n\r\n handleToggleBreakerFavourite(breakerID) {\r\n const breaker = this.getBreaker(breakerID)\r\n const favouriteBreaker = this.getBreakerFavourite(breaker.BreakerTypeItemID)\r\n const isBreakerFavourite = this.isBreakerFavourite(breaker.BreakerTypeItemID)\r\n\r\n var favouriteBreakerItemID = 0\r\n if (isBreakerFavourite) {\r\n favouriteBreakerItemID = favouriteBreaker.ItemID\r\n }\r\n\r\n this.toggleBreakerFavourite(favouriteBreakerItemID, breaker.BreakerTypeItemID, isBreakerFavourite)\r\n }\r\n\r\n toggleBreakerFavourite(ItemID, breakerTypeId, isBreakerFavourite) {\r\n this.setState({ isLoading: true })\r\n\r\n var favouriteItemID = 0\r\n if (isBreakerFavourite) favouriteItemID = ItemID\r\n\r\n apiCallsResidential.apiSaveFavBreaker(this.state.userId, breakerTypeId, favouriteItemID, isBreakerFavourite)\r\n .then(favBreaker => {\r\n let updatedBreakers = []\r\n if (isBreakerFavourite) {\r\n updatedBreakers = this.state.favBreakers.filter(item => item.ItemID !== ItemID)\r\n } else {\r\n updatedBreakers = cloneDeep(this.state.favBreakers)\r\n updatedBreakers.push(favBreaker)\r\n }\r\n\r\n this.setState({ favBreakers: updatedBreakers })\r\n if (!isBreakerFavourite) {\r\n let breakerItem = this.state.board.ProjectBoardBreakerToolboxCollection.find(res => res.BreakerTypeItemID === breakerTypeId)\r\n analyticsDataLayer.addToFavourites({\r\n \"currency\": 'AUD',\r\n \"project_type\": 'Residential',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(), \r\n \"value\": breakerItem.Price,\r\n \"items\": [{\r\n \"item_id\": breakerItem.BreakerTypeReadOnly.Reference,\r\n \"item_name\": breakerItem.BreakerTypeReadOnly.Description,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": breakerItem.Category,\r\n \"item_variant\": '',\r\n \"price\": breakerItem.Price,\r\n \"quantity\": 1\r\n }]\r\n })\r\n } else {\r\n analyticsDataLayer.removeFromFavourites({\r\n \"project_type\": 'Residential',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID\r\n })\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => this.setState({ isLoading: false }))\r\n }\r\n\r\n checkForDifferentProductRanges() {\r\n let has6kABreakers = false\r\n let has45kABreakers = false\r\n let hasMixedDifferentProductRanges = this.state.board.ProjectBoardBreakerCollection.some(breaker => {\r\n if (breaker.BreakerTypeReadOnly.TypeOfDevice.indexOf('4.5kA') > -1) has45kABreakers = true\r\n if (breaker.BreakerTypeReadOnly.TypeOfDevice.indexOf('6kA') > -1) has6kABreakers = true\r\n\r\n return has6kABreakers && has45kABreakers\r\n })\r\n\r\n this.setState({ hasMixedDifferentProductRanges: hasMixedDifferentProductRanges })\r\n }\r\n\r\n // ------------------------------\r\n // Chassis board functions\r\n // ------------------------------\r\n\r\n getChassisBoardBreakers() {\r\n if (!this.state.board.ProjectBoardBreakerCollection || !this.state.board.ProjectBoardBreakerCollection.length) { return [] }\r\n\r\n return this.state.board.ProjectBoardBreakerCollection.filter(boardBreaker => {\r\n const breakerObj = this.state.breakerOptionData.find(dataItem => dataItem.ItemID === boardBreaker.BreakerTypeItemID);\r\n return breakerObj\r\n });\r\n }\r\n\r\n // getDisabledIndex2ComponentName() {\r\n // if (!this.state.board.ProjectBoardFittedOptionCollection || !this.state.board.ProjectBoardFittedOptionCollection.length) {\r\n // return ''\r\n // }\r\n\r\n // const checkOption = this.state.board.ProjectBoardFittedOptionCollection.find(item => item.FittedOptionItemID === 2 || item.FittedOptionItemID === 3)\r\n\r\n // if (checkOption === undefined) {\r\n // return ''\r\n // } else {\r\n // return checkOption.FittedOptionReadOnly.TypeDescription\r\n // }\r\n // }\r\n\r\n // Get the number of poles already used up by breakers in a specific chassis\r\n getConfiguredPoleCount(chassisIndex) {\r\n let count = 0\r\n this.state.board.ProjectBoardBreakerCollection.forEach(boardBreaker => {\r\n const breakerObj = this.state.breakerOptionData.find(dataItem => dataItem.ItemID === boardBreaker.BreakerTypeItemID)\r\n if (breakerObj && boardBreaker.ChassisIndex === chassisIndex && !boardBreaker.BreakerIsParent) {\r\n count += breakerObj.PoleCount\r\n }\r\n })\r\n\r\n // For first chassis we need to check if position 2 is filled with emergency lighting\r\n if (chassisIndex === 1 && this.checkIfIndex2IsDisabled()) {\r\n count++\r\n }\r\n\r\n return count\r\n }\r\n\r\n // TODO: need to complete\r\n getChassisPercentComplete(chassisIndex) {\r\n // const boardData = this.getCurrentBoardData()\r\n // const total = boardData[`Chassis${chassisIndex}PoleCount`]\r\n // let doneCount = this.getConfiguredPoleCount(chassisIndex)\r\n // let notRoundedValue = doneCount / total * 100\r\n // let flooredValue = Math.floor(notRoundedValue)\r\n\r\n // if (notRoundedValue - flooredValue > 0.5) {\r\n // return Math.ceil(notRoundedValue)\r\n // } else {\r\n // return flooredValue\r\n // }\r\n\r\n return 0\r\n }\r\n\r\n getUsedCount(breakerObject) {\r\n if (!this.state.board.ProjectBoardBreakerCollection) { return 0 }\r\n\r\n return this.state.board.ProjectBoardBreakerCollection.filter(item => {\r\n return item.BreakerTypeItemID === breakerObject.ItemID\r\n }).length\r\n }\r\n\r\n getUsedContactorCount(contactorObject) {\r\n if (!this.state.board.ProjectBoardContractorCollection) { return 0 }\r\n\r\n return this.state.board.ProjectBoardContractorCollection.filter(item => {\r\n return item.ContractorItemID === contactorObject.ItemID\r\n }).length\r\n }\r\n\r\n getUsedFittedOptionCount(fittedOptionObject) {\r\n if (!this.state.board.ProjectBoardFittedOptionCollection) { return 0 }\r\n\r\n return this.state.board.ProjectBoardFittedOptionCollection.filter(item => {\r\n return item.FittedOptionItemID === fittedOptionObject.ItemID\r\n }).length\r\n }\r\n\r\n // Given the size of a device return the first row and pole index where it can be inserted on the board\r\n // If passed reverse parameter, then find the first position starting from the last row and last position\r\n findAvailablePositionForDevice(spaceUsed, reverse = false) {\r\n const numberOfRows = getNumberOfRowsFromPolesString(this.state.boardDetails.PolesNeeded)\r\n const numberOfPoles = getPolesCountFromPolesString(this.state.boardDetails.PolesNeeded)\r\n let positionFound = null\r\n\r\n // Start checking each row and position to see if we can add the breaker to it\r\n if (reverse) {\r\n for (let rowIndex = numberOfRows - 1; rowIndex >= 0; rowIndex--) {\r\n for (let poleIndex = numberOfPoles - 1; poleIndex > 0; poleIndex--) {\r\n if (this.canAddDeviceToPosition(parseInt(spaceUsed, 10), rowIndex, poleIndex, false, false, undefined, undefined, undefined, true)) {\r\n positionFound = {\r\n rowIndex: rowIndex,\r\n poleIndex: poleIndex\r\n }\r\n break\r\n }\r\n }\r\n\r\n if (positionFound !== null) break\r\n }\r\n } else {\r\n for (let rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {\r\n for (let poleIndex = 0; poleIndex < numberOfPoles; poleIndex++) {\r\n if (this.canAddDeviceToPosition(parseInt(spaceUsed, 10), rowIndex, poleIndex)) {\r\n positionFound = {\r\n rowIndex: rowIndex,\r\n poleIndex: poleIndex\r\n }\r\n break\r\n }\r\n }\r\n\r\n if (positionFound !== null) break\r\n }\r\n }\r\n\r\n return positionFound\r\n }\r\n\r\n // Work out the first available board slot to add the specific breaker and then add the breaker to the board if\r\n // such a slot is found - this function is triggered when a breaker is triggered to be auto added\r\n autoAddbreaker(breakerId) {\r\n if (!breakerId || this.state.isAutoAdding) { return; }\r\n\r\n let selectedBreaker = this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === breakerId)\r\n const numberOfRows = getNumberOfRowsFromPolesString(this.state.boardDetails.PolesNeeded)\r\n const numberOfPoles = getPolesCountFromPolesString(this.state.boardDetails.PolesNeeded)\r\n\r\n // Start checking each row and position to see if we can add the breaker to it\r\n let foundPositionAndAddingBreaker = false\r\n for (let rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {\r\n for (let poleIndex = 0; poleIndex < numberOfPoles; poleIndex++) {\r\n if (this.canAddDeviceToPosition(parseInt(selectedBreaker.BreakerTypeReadOnly.SpaceUsed, 10), rowIndex, poleIndex)) {\r\n console.log('Auto Placement: found a position to add a breaker at row ' + (rowIndex + 1) + ', column: ' + (poleIndex + 1))\r\n this.addBreakerToBoard(rowIndex, poleIndex, selectedBreaker.BreakerTypeReadOnly)\r\n foundPositionAndAddingBreaker = true\r\n break\r\n }\r\n }\r\n\r\n if (foundPositionAndAddingBreaker) break\r\n }\r\n\r\n if (!foundPositionAndAddingBreaker) {\r\n this.setState({ apiError: 'There are no suitable position on the board to add this breaker.!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n }\r\n }\r\n\r\n autoAddContactor(contactorId) {\r\n if (!contactorId || this.state.isAutoAdding) { return; }\r\n\r\n let selectedDevice = this.state.board.ProjectBoardContactorToolboxCollection.find(item => item.ItemID === contactorId)\r\n const numberOfRows = getNumberOfRowsFromPolesString(this.state.boardDetails.PolesNeeded)\r\n const numberOfPoles = getPolesCountFromPolesString(this.state.boardDetails.PolesNeeded)\r\n\r\n // Start checking each row and position to see if we can add the breaker to it\r\n let foundPositionAndAddingDevice = false\r\n for (let rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {\r\n for (let poleIndex = 0; poleIndex < numberOfPoles; poleIndex++) {\r\n // Contactors can't go before the main switch\r\n if (rowIndex === 0 && poleIndex < parseInt(this.state.board.MainSwitchPosition, 10)) continue\r\n\r\n if (this.canAddDeviceToPosition(parseInt(selectedDevice.ContactorReadOnly.SpaceUsed, 10), rowIndex, poleIndex)) {\r\n console.log('Auto Placement: found a position to add the contactor at row ' + (rowIndex + 1) + ', column: ' + (poleIndex + 1))\r\n this.addContactorToBoard(rowIndex, poleIndex, selectedDevice.ContactorReadOnly)\r\n foundPositionAndAddingDevice = true\r\n break\r\n }\r\n }\r\n\r\n if (foundPositionAndAddingDevice) break\r\n }\r\n\r\n if (!foundPositionAndAddingDevice) {\r\n this.setState({ apiError: 'There are no suitable position on the board to add this contactor.!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n }\r\n }\r\n\r\n autoAddFittedOption(fittedOptionId) {\r\n if (!fittedOptionId || this.state.isAutoAdding) { return; }\r\n\r\n let selectedDevice = this.state.board.ProjectBoardFittedOptionToolboxCollection.find(item => item.ItemID === fittedOptionId)\r\n const numberOfRows = getNumberOfRowsFromPolesString(this.state.boardDetails.PolesNeeded)\r\n const numberOfPoles = getPolesCountFromPolesString(this.state.boardDetails.PolesNeeded)\r\n\r\n // Start checking each row and position to see if we can add the breaker to it\r\n let foundPositionAndAddingDevice = false\r\n for (let rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {\r\n for (let poleIndex = 0; poleIndex < numberOfPoles; poleIndex++) {\r\n if (this.canAddDeviceToPosition(parseInt(selectedDevice.FittedOptionReadOnly.SpaceUsed, 10), rowIndex, poleIndex)) {\r\n console.log('Auto Placement: found a position to add the fitted option at row ' + (rowIndex + 1) + ', column: ' + (poleIndex + 1))\r\n this.addFittedOptionToBoard(rowIndex, poleIndex, selectedDevice.FittedOptionReadOnly)\r\n foundPositionAndAddingDevice = true\r\n break\r\n }\r\n }\r\n\r\n if (foundPositionAndAddingDevice) break\r\n }\r\n\r\n if (!foundPositionAndAddingDevice) {\r\n this.setState({ apiError: 'There are no suitable position on the board to add this contactor.!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n }\r\n }\r\n\r\n // Get the breaker data from the breaker type id\r\n getBreakerDataObj(breakerTypeId) {\r\n return this.state.breakerOptionData.find(item => item.ItemID === breakerTypeId)\r\n }\r\n\r\n canAddDeviceToPosition(speceUsed, rowIndex, poleIndex, returnErrorMessage, isMainSwitch, breakerItemID, boardContactorId, boardFittedOptionId, isWiserEnergyGateWay, ignoreBusbarChecks = false) {\r\n return canAddDeviceToBoardPosition(speceUsed, rowIndex, poleIndex, returnErrorMessage, this.state.board, this.state.boardDetails, this.state.boardOptionData, isMainSwitch, breakerItemID, boardContactorId, boardFittedOptionId, isWiserEnergyGateWay, ignoreBusbarChecks)\r\n }\r\n\r\n getMainSwitchDetails() {\r\n return this.state.boardOptionData.MainSwitches.find(mainSwitch => mainSwitch.ItemID === this.state.board.MainSwitchID)\r\n }\r\n\r\n addBreakerToBoard(rowIndex, poleIndex, breakerData, breakerItemID) {\r\n // Ignore the request if we are already adding breaker in this position\r\n if (this.state.isAddingDevice.indexOf(poleIndex) !== -1) return\r\n\r\n const canAddMessage = this.canAddDeviceToPosition(parseInt(breakerData.SpaceUsed, 10), rowIndex, poleIndex, true, false, breakerItemID)\r\n if (canAddMessage !== '') {\r\n this.setState({ apiError: canAddMessage })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return\r\n }\r\n\r\n // Check if the breaker can be added to the board considering the main incomer\r\n // If you have added a 1 phase main incomer - then you can only add 1 phase breakers to the board\r\n // If you have added a 1 phase main incomer - you still can add 36 mm 1P+N RCBO, because it's single phase even if it takes 2 spaces + other cases\r\n // If you have added a 2 phase main incomer - then you can only add 1 or 2 phase breaks to the board\r\n // If you have added a 3 phase main incomer - then you can add 1 or 2 or 3 or more phase breaks to the board\r\n const mainSwitchDetails = this.getMainSwitchDetails()\r\n const polesUsedByBreaker = parseInt(breakerData.SpaceUsed, 10)\r\n if (polesUsedByBreaker > mainSwitchDetails.SpaceUsed && mainSwitchDetails.SpaceUsed <= 2 &&\r\n // Special cases\r\n breakerData.NumberOfPoles !== '36 mm 1P+N' &&\r\n !(breakerData.TypeOfDevice === 'RCD-4.5kA' && breakerData.NumberOfPoles === '2P') &&\r\n !(breakerData.TypeOfDevice === 'RCD - 6kA' && breakerData.NumberOfPoles === '2P')\r\n ) {\r\n this.setState({ apiError: 'Breaker phase is not compatible with the board\\'s main switch phase incomer.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return\r\n }\r\n\r\n // Update the state with the breakers position we are adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.concat([poleIndex]) })\r\n\r\n\r\n const selectedBreakerData = breakerData ? breakerData : this.state.selectedBreaker.data\r\n // Here we are to improve the front-end performance when adding breakers. We don't want to display a loader each time and wait for a second or two\r\n // What we are going to do is to display a loader only when adding the very first breaker, once we have at least one breaker\r\n // We can use that as a sample object, reset it wrapping properties and add it immediatly locally, so it can be displayed on the board\r\n // Once the server response is ready we will override it or remove it if there were any errors\r\n\r\n let sampleBreaker = cloneDeep(SAMPLE_BREAKER)\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n sampleBreaker.BreakerTypeReadOnly = selectedBreakerData\r\n // Reset Item ID, so we can use it as an indicator to disable delete button/drag&drop until the response from the server \r\n // And to avoid some issues when user tries to do operations on this breakers before it's properly saved\r\n sampleBreaker.BreakerTypeItemID = selectedBreakerData.ItemID\r\n sampleBreaker.ItemID = 0\r\n // sampleBreaker.ChassisIndex = this.state.selectedChassisIndex\r\n sampleBreaker.PoleIndex = poleIndex\r\n sampleBreaker.RowIndex = rowIndex\r\n\r\n updatedBreakers.push(sampleBreaker)\r\n\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n\r\n let self = this\r\n // self.selectedBr\r\n // TODO: For updating will need to replace 0 with existing breaker ItemID === do we even use this function to update a breker, doesn't look like?\r\n apiCallsResidential.apiSaveBreakerToChassis(this.state.projectID, this.state.boardID, 0, breakerData.ItemID, rowIndex, poleIndex)\r\n .then(boardBreaker => {\r\n\r\n const existingTemporaryBreakerIndex = this.state.board.ProjectBoardBreakerCollection.findIndex(item => item.BreakerTypeItemID === breakerData.ItemID && item.RowIndex === rowIndex && item.PoleIndex === poleIndex)\r\n\r\n\r\n // TODO: PROBABLY CAN IGNORE, IT OBVIOUSLY WON'T EXIST AS WE CALL IT TO ADD IT\r\n // Only need to add the breaker to the board if the board breaker doesnt exist on the board already\r\n // const existingBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === breakerData.ItemID)\r\n\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedBreakers[existingTemporaryBreakerIndex] = boardBreaker\r\n\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(updatedBoard, this.state.boardDetails)\r\n this.setState({\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage\r\n })\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard }, () => {\r\n if (this.isEnoughFilledToGenerateQuote() && !this.state.hasAlreadyShownEnoughQuoteInfo) {\r\n this.setState({ pageInfo: 'You can now view a quote for this project!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n }\r\n\r\n this.checkForDifferentProductRanges()\r\n })\r\n\r\n\r\n analyticsDataLayer.addToCart({\r\n \"currency\": 'AUD',\r\n \"value\": boardBreaker.Price,\r\n \"project_type\": 'Residential',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.board.ItemID.toString(),\r\n \"items\": [\r\n {\r\n \"item_id\": boardBreaker.BreakerTypeReadOnly.Reference,\r\n \"item_name\": boardBreaker.BreakerTypeReadOnly.Description, // MCB-10kA-1P-16A\r\n \"quantity\": boardBreaker?.BreakerTypeReadOnly?.SpaceUsed ? parseInt(boardBreaker.BreakerTypeReadOnly.SpaceUsed) : 0,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": boardBreaker.Category,\r\n \"item_variant\": '',\r\n \"price\": boardBreaker.Price\r\n }\r\n ]\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n // Remove the breaker from the board if there was an error\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers.filter(item => item.ItemID !== 0)\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.filter(item => item !== poleIndex) })\r\n })\r\n }\r\n\r\n deleteBreakerFromBoard(rowIndex, poleIndex, boardBreakerId) {\r\n const selectedBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === boardBreakerId)\r\n\r\n this.setState({ isUpdatingDevice: true })\r\n\r\n apiCallsResidential.apiSaveBreakerToChassis(this.state.projectID, this.state.boardID, boardBreakerId, selectedBoardBreaker.BreakerTypeItemID, rowIndex, poleIndex, true)\r\n .then((boardBreaker) => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerCollection.filter(item => item.ItemID !== boardBreakerId)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(updatedBoard, this.state.boardDetails)\r\n this.setState({\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage,\r\n })\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard, pageInfo: 'Breaker deleted', isUpdatingDevice: false }, () => {\r\n this.checkForDifferentProductRanges()\r\n })\r\n\r\n analyticsDataLayer.removeFromCart({\r\n \"currency\": 'AUD',\r\n \"value\": selectedBoardBreaker.Price,\r\n \"project_type\": 'Residential',\r\n \"project_name\": this.state.project.Title,\r\n \"project_id\": this.state.projectID.toString(),\r\n \"item_board_name\": this.state.board.Name,\r\n \"item_board_id\": this.state.boardID.toString(),\r\n \"configuration_name\": this.state.board.Name,\r\n \"configuration_id\": this.state.boardID.toString(), \r\n \"items\": [\r\n {\r\n \"item_id\": selectedBoardBreaker.BreakerTypeReadOnly.Reference,\r\n \"item_name\": selectedBoardBreaker.BreakerTypeReadOnly.Description,\r\n \"quantity\": selectedBoardBreaker?.BreakerTypeReadOnly?.SpaceUsed ? parseInt(selectedBoardBreaker.BreakerTypeReadOnly.SpaceUsed) : 0,\r\n \"item_brand\": 'FlexSelect',\r\n \"item_category\": selectedBoardBreaker.Category,\r\n \"item_variant\": '',\r\n \"price\": selectedBoardBreaker.Price\r\n }\r\n ]\r\n })\r\n\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message, isUpdatingDevice: false })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n deleteContactorFromBoard(rowIndex, poleIndex, boardContactorId) {\r\n const selectedBoardContactor = this.state.board.ProjectBoardContractorCollection.find(boardContactor => boardContactor.ItemID === boardContactorId)\r\n\r\n this.setState({ isUpdatingDevice: true })\r\n\r\n apiCallsResidential.apiSaveContactorToChassis(this.state.projectID, this.state.boardID, boardContactorId, selectedBoardContactor.ContractorItemID, rowIndex, poleIndex, true)\r\n .then(() => {\r\n const updatedContactors = this.state.board.ProjectBoardContractorCollection.filter(item => item.ItemID !== boardContactorId)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardContractorCollection = updatedContactors\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(updatedBoard, this.state.boardDetails)\r\n this.setState({\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage,\r\n })\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard, pageInfo: 'Contactor deleted', isUpdatingDevice: false })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message, isUpdatingDevice: false })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n deleteFittedOptionFromBoard(rowIndex, poleIndex, boardFittedOptionId) {\r\n const selectedBoardFittedOption = this.state.board.ProjectBoardFittedOptionCollection.find(boardContactor => boardContactor.ItemID === boardFittedOptionId)\r\n\r\n this.setState({ isUpdatingDevice: true })\r\n\r\n apiCallsResidential.apiSaveFittedOptionToChassis(this.state.projectID, this.state.boardID, boardFittedOptionId, selectedBoardFittedOption.FittedOptionItemID, rowIndex, poleIndex, true)\r\n .then(() => {\r\n const updatedFittedOptions = this.state.board.ProjectBoardFittedOptionCollection.filter(item => item.ItemID !== boardFittedOptionId)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardFittedOptionCollection = updatedFittedOptions\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(updatedBoard, this.state.boardDetails)\r\n this.setState({\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage,\r\n })\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard, pageInfo: 'Fitted option deleted', isUpdatingDevice: false }, () => {\r\n this.handleWiserEnergyGatewayDisplay()\r\n })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message, isUpdatingDevice: false })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n canAddPowertag(returnErrorMessage, powerTagType) {\r\n // powerTagType can be 'breakerPowerTag' or 'fittedOptionPowerTag'\r\n // At this stage we support adding only 1 Wiser Energy Gateway, a second one will be automatically added as soon as user adds mora than \r\n // 20 devices (powertags + A9XMC1D3 fitted option component) combined or more than 5 A9XMC1D3 components, but adding a second\r\n // is not supported\r\n let numberOfPowertags = 0\r\n let numberOfPowertagControls = 0 // A9XMC1D3, maximum 5 for one Wiser Energy Gateway\r\n let errorMessage = ''\r\n\r\n this.state.board.ProjectBoardBreakerCollection.forEach(breaker => {\r\n if (breaker.BottomPowerTag || breaker.TopPowerTag) numberOfPowertags = numberOfPowertags + 1\r\n })\r\n\r\n this.state.board.ProjectBoardFittedOptionCollection.forEach(fittedOption => {\r\n if (fittedOption.FittedOptionReadOnly.Reference === 'A9XMC1D3') numberOfPowertagControls = numberOfPowertagControls + 1\r\n })\r\n\r\n // So user is trying to see if he can add one of these, so we consider them and do our checks\r\n if (powerTagType === 'breakerPowerTag') numberOfPowertags = numberOfPowertags + 1\r\n if (powerTagType === 'fittedOptionPowerTag') numberOfPowertagControls = numberOfPowertagControls + 1\r\n\r\n if (numberOfPowertags + numberOfPowertagControls === 0) {\r\n // We don't have any power tags added, so if we add one, we need to assure we have a space for a mandatory and automatically\r\n // inserted Wiser Energy Gateway, which takes 2.5 poles on real board, but we consider it as 3 in our board. If there is no space\r\n // then we can't say that the power tag can be added\r\n const positionFound = this.findAvailablePositionForDevice(3, true)\r\n if (positionFound === null) {\r\n errorMessage = 'This action will required adding to the board a Wiser Energy Gateway, which occupies 2.5 poles. There was no spece found on the board, please free some space in order to proceed.'\r\n } else {\r\n console.log('Performed a check before adding a Powertag and a suitable position to place a mandatory Wiser Energy Gateway was found: ', positionFound)\r\n }\r\n } else if (numberOfPowertags + numberOfPowertagControls > 20) {\r\n errorMessage = 'The total number of Powertag components has reached the supported limit of 20. Can\\'t add any more powertags.'\r\n } else if (numberOfPowertagControls > 5) {\r\n errorMessage = 'Can\\'t add another Powertag control, the maximum limit supported is 5.'\r\n }\r\n\r\n if (returnErrorMessage) {\r\n return errorMessage\r\n } else {\r\n return errorMessage === ''\r\n }\r\n }\r\n\r\n // This function will check if it should display or not Wiser Energy Gateway and it will display it or not\r\n handleWiserEnergyGatewayDisplay() {\r\n let numberOfPowertags = 0\r\n let numberOfPowertagControls = 0\r\n\r\n this.state.board.ProjectBoardBreakerCollection.forEach(breaker => {\r\n if (breaker.BottomPowerTag || breaker.TopPowerTag) numberOfPowertags += 1\r\n })\r\n\r\n this.state.board.ProjectBoardFittedOptionCollection.forEach(fittedOption => {\r\n if (fittedOption.FittedOptionReadOnly.Reference === 'A9XMC1D3') numberOfPowertagControls += 1\r\n })\r\n\r\n if (numberOfPowertags + numberOfPowertagControls === 0) {\r\n if (this.state.board.HasWiserEnergyGateway === true) {\r\n // Here the condition mean that the board doesn't have any powertags (probably just removed the last one), and it has\r\n // Wiser Energy Gateway. We don't need it, so we need to save the information that board doesn't have it\r\n const boardRequest = {\r\n Name: this.state.board.Name,\r\n ProjectID: this.state.projectID,\r\n EnclosureID: this.state.board.EnclosureID,\r\n MainSwitchID: this.state.board.MainSwitchID,\r\n SPDID: this.state.board.SPDID,\r\n MetalBlackPlateID: this.state.board.MetalBlackPlateID,\r\n Quantity: this.state.board.Quantity,\r\n ItemID: this.state.board.ItemID,\r\n MainSwitchPosition: this.state.board.MainSwitchPosition,\r\n HasWiserEnergyGateway: false,\r\n WiserEnergyGatewayPosition: 0,\r\n WiserEnergyGatewayRow: 0\r\n }\r\n\r\n this.saveBoard(boardRequest)\r\n }\r\n } else {\r\n if (this.state.board.HasWiserEnergyGateway === false) {\r\n const positionFound = this.findAvailablePositionForDevice(3, true)\r\n console.log(this.state.board)\r\n if (positionFound === null) {\r\n window.alert('Your action requires placing a Wiser Energy Gateway on the board, but no space was found to add it. Please, make space by removing some devices or increasing the size of the board')\r\n } else {\r\n const boardRequest = {\r\n Name: this.state.board.Name,\r\n ProjectID: this.state.projectID,\r\n EnclosureID: this.state.board.EnclosureID,\r\n MainSwitchID: this.state.board.MainSwitchID,\r\n SPDID: this.state.board.SPDID,\r\n MetalBlackPlateID: this.state.board.MetalBlackPlateID,\r\n Quantity: this.state.board.Quantity,\r\n ItemID: this.state.board.ItemID,\r\n MainSwitchPosition: this.state.board.MainSwitchPosition,\r\n HasWiserEnergyGateway: true,\r\n WiserEnergyGatewayPosition: positionFound.poleIndex,\r\n WiserEnergyGatewayRow: positionFound.rowIndex\r\n }\r\n\r\n this.saveBoard(boardRequest)\r\n }\r\n }\r\n }\r\n }\r\n\r\n togglePowerTag(rowIndex, poleIndex, boardBreakerId, position, addPowerTag) {\r\n const selectedBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === boardBreakerId)\r\n let topPowerTag = selectedBoardBreaker.TopPowerTag\r\n let bottomPowerTag = selectedBoardBreaker.BottomPowerTag\r\n\r\n if (position === 'top') topPowerTag = addPowerTag\r\n if (position === 'bottom') bottomPowerTag = addPowerTag\r\n\r\n // Check if we can add power tag, if we can then update selectedBoardBreaker inside the ProjectBoardBreakerCollection, even before API \r\n // So user can have immediate visual feedback, otherwise display a massage that it can't be added \r\n if (addPowerTag) { // Don't need to do check if user is actually removing a Power Tag\r\n const powertagCheck = this.canAddPowertag(true, 'breakerPowerTag')\r\n if (powertagCheck !== '') {\r\n // Display error message and don't continue\r\n this.setState({ apiError: powertagCheck })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n }\r\n\r\n if (position === 'top') selectedBoardBreaker.TopPowerTag = addPowerTag\r\n if (position === 'bottom') selectedBoardBreaker.BottomPowerTag = addPowerTag\r\n this.updateBreakerState(selectedBoardBreaker)\r\n\r\n\r\n this.setState({ isUpdatingDevice: true })\r\n\r\n apiCallsResidential.apiSaveBreakerToChassis(this.state.projectID, this.state.boardID, boardBreakerId, selectedBoardBreaker.BreakerTypeItemID, rowIndex, poleIndex, false, '', topPowerTag, bottomPowerTag)\r\n .then(boardBreaker => {\r\n this.updateBreakerState(boardBreaker)\r\n this.handleWiserEnergyGatewayDisplay()\r\n this.setState({ isUpdatingDevice: false })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message, isUpdatingDevice: false })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n updateBreakerState(boardBreakerData) {\r\n const updatedBreakers = cloneDeep(this.state.board.ProjectBoardBreakerCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n const indexOfTheUpdatedBreaker = updatedBreakers.findIndex(breaker => {\r\n return breaker.ItemID === boardBreakerData.ItemID\r\n })\r\n\r\n updatedBreakers[indexOfTheUpdatedBreaker] = boardBreakerData\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n }\r\n\r\n updateBrekerChassisNote(boardBreakerId, rowIndex, poleIndex, note) {\r\n const selectedBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === boardBreakerId)\r\n let topPowerTag = selectedBoardBreaker.TopPowerTag\r\n let bottomPowerTag = selectedBoardBreaker.BottomPowerTag\r\n\r\n apiCallsResidential.apiSaveBreakerToChassis(this.state.projectID, this.state.boardID, boardBreakerId, selectedBoardBreaker.BreakerTypeItemID, rowIndex, poleIndex, false, note, topPowerTag, bottomPowerTag)\r\n .then(boardBreaker => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerCollection.map(item => {\r\n if (item.ItemID === boardBreaker.ItemID) {\r\n return boardBreaker\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n this.setState({ board: updatedBoard, pageInfo: 'Breaker notes saved' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n updateContactorChassisNote(boardContactorId, rowIndex, poleIndex, note) {\r\n const selectedBoardContactor = this.state.board.ProjectBoardContractorCollection.find(boardBreaker => boardBreaker.ItemID === boardContactorId)\r\n\r\n apiCallsResidential.apiSaveContactorToChassis(this.state.projectID, this.state.boardID, boardContactorId, selectedBoardContactor.ContractorItemID, rowIndex, poleIndex, false, note)\r\n .then(boardContactor => {\r\n const updatedContactors = this.state.board.ProjectBoardContractorCollection.map(item => {\r\n if (item.ItemID === boardContactor.ItemID) {\r\n return boardContactor\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardContractorCollection = updatedContactors\r\n\r\n this.setState({ board: updatedBoard, pageInfo: 'Device notes saved' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n updateFittedOptionChassisNote(boardFittedOptionId, rowIndex, poleIndex, note) {\r\n const selectedBoardFittedOption = this.state.board.ProjectBoardFittedOptionCollection.find(boardBreaker => boardBreaker.ItemID === boardFittedOptionId)\r\n\r\n apiCallsResidential.apiSaveContactorToChassis(this.state.projectID, this.state.boardID, boardFittedOptionId, selectedBoardFittedOption.FittedOptionItemID, rowIndex, poleIndex, false, note)\r\n .then(boardContactor => {\r\n const updatedFittedOptios = this.state.board.ProjectBoardFittedOptionCollection.map(item => {\r\n if (item.ItemID === boardContactor.ItemID) {\r\n return boardContactor\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardFittedOptionCollection = updatedFittedOptios\r\n\r\n this.setState({ board: updatedBoard, pageInfo: 'Device notes saved' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n }\r\n\r\n updateBreakerPosition(boardBreakerId, rowIndex, poleIndex, note, skipChecks = false) {\r\n const selectedBoardBreaker = this.state.board.ProjectBoardBreakerCollection.find(boardBreaker => boardBreaker.ItemID === boardBreakerId)\r\n let topPowerTag = selectedBoardBreaker.TopPowerTag\r\n let bottomPowerTag = selectedBoardBreaker.BottomPowerTag\r\n\r\n if (!skipChecks) {\r\n const canAddMessage = this.canAddDeviceToPosition(parseInt(selectedBoardBreaker.BreakerTypeReadOnly.SpaceUsed, 10), rowIndex, poleIndex, true, false, boardBreakerId)\r\n if (canAddMessage !== '') {\r\n this.setState({ apiError: canAddMessage })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n return\r\n }\r\n }\r\n\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.concat([poleIndex]) })\r\n\r\n apiCallsResidential.apiSaveBreakerToChassis(this.state.projectID, this.state.boardID, boardBreakerId, selectedBoardBreaker.BreakerTypeItemID, rowIndex, poleIndex, false, note, topPowerTag, bottomPowerTag)\r\n .then(boardBreaker => {\r\n const updatedBreakers = this.state.board.ProjectBoardBreakerCollection.map(item => {\r\n if (item.ItemID === boardBreaker.ItemID) {\r\n return boardBreaker\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerCollection = updatedBreakers\r\n\r\n this.setState({ board: updatedBoard, pageInfo: 'Breaker notes saved' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.filter(item => item !== poleIndex) })\r\n })\r\n }\r\n\r\n updateContactorPosition(boardContactorId, rowIndex, poleIndex, note, skipChecks = false) {\r\n const selectedBoardContactor = this.state.board.ProjectBoardContractorCollection.find(boardContactor => boardContactor.ItemID === boardContactorId)\r\n\r\n if (!skipChecks) {\r\n const canAddMessage = this.canAddDeviceToPosition(parseInt(selectedBoardContactor.ContractorReadOnly.SpaceUsed, 10), rowIndex, poleIndex, true, false, undefined, boardContactorId)\r\n if (canAddMessage !== '') {\r\n this.setState({ apiError: canAddMessage })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n return\r\n }\r\n }\r\n\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.concat([poleIndex]) })\r\n\r\n apiCallsResidential.apiSaveContactorToChassis(this.state.projectID, this.state.boardID, boardContactorId, selectedBoardContactor.ContractorItemID, rowIndex, poleIndex, false, note)\r\n .then(boardContactor => {\r\n const updatedBreakers = this.state.board.ProjectBoardContractorCollection.map(item => {\r\n if (item.ItemID === boardContactor.ItemID) {\r\n return boardContactor\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardContractorCollection = updatedBreakers\r\n\r\n this.setState({ board: updatedBoard, pageInfo: 'Device position saved' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.filter(item => item !== poleIndex) })\r\n })\r\n }\r\n\r\n updateFittedOptionPosition(boardFittedOptionId, rowIndex, poleIndex, note, skipChecks = false) {\r\n const selectedBoardFittedOption = this.state.board.ProjectBoardFittedOptionCollection.find(boardContactor => boardContactor.ItemID === boardFittedOptionId)\r\n\r\n if (!skipChecks) {\r\n const canAddMessage = this.canAddDeviceToPosition(parseInt(selectedBoardFittedOption.FittedOptionReadOnly.SpaceUsed, 10), rowIndex, poleIndex, true, false, undefined, undefined, boardFittedOptionId)\r\n if (canAddMessage !== '') {\r\n this.setState({ apiError: canAddMessage })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n return\r\n }\r\n }\r\n\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.concat([poleIndex]) })\r\n\r\n apiCallsResidential.apiSaveFittedOptionToChassis(this.state.projectID, this.state.boardID, boardFittedOptionId, selectedBoardFittedOption.FittedOptionItemID, rowIndex, poleIndex, false, note)\r\n .then(boardFittedOption => {\r\n const updatedBreakers = this.state.board.ProjectBoardFittedOptionCollection.map(item => {\r\n if (item.ItemID === boardFittedOption.ItemID) {\r\n return boardFittedOption\r\n } else {\r\n return item\r\n }\r\n })\r\n\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardFittedOptionCollection = updatedBreakers\r\n\r\n this.setState({ board: updatedBoard, pageInfo: 'Device position saved' })\r\n\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.filter(item => item !== poleIndex) })\r\n })\r\n }\r\n\r\n updateMainSwitchPosition(poleIndex) {\r\n const boardRequest = {\r\n Name: this.state.board.Name,\r\n ProjectID: this.state.projectID,\r\n EnclosureID: this.state.board.EnclosureID,\r\n MainSwitchID: this.state.board.MainSwitchID,\r\n SPDID: this.state.board.SPDID,\r\n MetalBlackPlateID: this.state.board.MetalBlackPlateID,\r\n Quantity: this.state.board.Quantity,\r\n ItemID: this.state.board.ItemID,\r\n MainSwitchPosition: parseInt(poleIndex, 10),\r\n HasWiserEnergyGateway: this.state.board.HasWiserEnergyGateway,\r\n WiserEnergyGatewayPosition: this.state.board.WiserEnergyGatewayPosition,\r\n WiserEnergyGatewayRow: this.state.board.WiserEnergyGatewayRow\r\n }\r\n\r\n this.saveBoard(boardRequest)\r\n }\r\n\r\n updateWiserEnergyGatewayPosition(rowIndex, poleIndex) {\r\n const boardRequest = {\r\n Name: this.state.board.Name,\r\n ProjectID: this.state.projectID,\r\n EnclosureID: this.state.board.EnclosureID,\r\n MainSwitchID: this.state.board.MainSwitchID,\r\n SPDID: this.state.board.SPDID,\r\n MetalBlackPlateID: this.state.board.MetalBlackPlateID,\r\n Quantity: this.state.board.Quantity,\r\n ItemID: this.state.board.ItemID,\r\n MainSwitchPosition: this.state.board.MainSwitchPosition,\r\n HasWiserEnergyGateway: this.state.board.HasWiserEnergyGateway,\r\n WiserEnergyGatewayPosition: poleIndex,\r\n WiserEnergyGatewayRow: rowIndex\r\n }\r\n\r\n this.saveBoard(boardRequest)\r\n }\r\n\r\n saveBoard(boardRequest) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBoard(boardRequest)\r\n .then(boardData => {\r\n this.setState({ board: boardData })\r\n })\r\n .catch(error => {\r\n this.setState({ isLoading: false })\r\n window.alert(`There was an error saving the board: ${error.message}`)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n removeBusbar(itemID, BusBarItemID) {\r\n this.setState({ isLoading: true })\r\n\r\n apiCallsResidential.apiSaveBusBar(this.state.projectID, this.state.boardID, itemID, BusBarItemID, 0, 0, 0, 0, true)\r\n .then(() => {\r\n const updatedBusbars = cloneDeep(this.state.board.ProjectBoardBusbarCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedBoard.ProjectBoardBusbarCollection = updatedBusbars.filter(busbar => busbar.ItemID !== itemID)\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex(board => board.ItemID === updatedBoard.ItemID)\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard }, () => {\r\n console.log(this.state.project)\r\n this.setState({ pageInfo: 'Busbar removed from the board!' })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n handleBreakerDrop(rowIndex, poleIndex, ItemID, BreakerTypeItemID) {\r\n let selectedBreaker = this.state.board.ProjectBoardBreakerToolboxCollection.find(item => item.ItemID === ItemID)\r\n const useBreaker = this.state.breakerOptionData.find(item => selectedBreaker ? item.ItemID === selectedBreaker.BreakerTypeItemID : false)\r\n\r\n this.addBreakerToBoard(rowIndex, poleIndex, useBreaker, ItemID)\r\n }\r\n\r\n handleContactorDrop(rowIndex, poleIndex, ItemID, ContactorItemID) {\r\n let selectedContactor = this.state.board.ProjectBoardContactorToolboxCollection.find(item => item.ItemID === ItemID)\r\n this.addContactorToBoard(rowIndex, poleIndex, selectedContactor.ContactorReadOnly)\r\n }\r\n\r\n handleFittedOptionDrop(rowIndex, poleIndex, ItemID, FittedOptionItemID) {\r\n let selectedFittedOption = this.state.board.ProjectBoardFittedOptionToolboxCollection.find(item => item.ItemID === ItemID)\r\n this.addFittedOptionToBoard(rowIndex, poleIndex, selectedFittedOption.FittedOptionReadOnly)\r\n }\r\n\r\n addContactorToBoard(rowIndex, poleIndex, contactorData) {\r\n // Ignore the request if we are already adding device in this position\r\n if (this.state.isAddingDevice.indexOf(poleIndex) !== -1) return\r\n const canAddMessage = this.canAddDeviceToPosition(parseInt(contactorData.SpaceUsed, 10), rowIndex, poleIndex, true, false, null, contactorData.ItemID, null, false, false)\r\n if (canAddMessage !== '') {\r\n this.setState({ apiError: canAddMessage })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return\r\n }\r\n\r\n // Contactors can't be placed before the main switch\r\n if (rowIndex === 0 && poleIndex < parseInt(this.state.board.MainSwitchPosition, 10)) {\r\n this.setState({ apiError: 'Contactors can\\'t be added before the main switch.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return\r\n }\r\n\r\n // Update the state with the breakers position we are adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.concat([poleIndex]) })\r\n\r\n const selectedContactorData = contactorData ? contactorData : this.state.selectedContactor.data\r\n // Here we are to improve the front-end performance when adding breakers. We don't want to display a loader each time and wait for a second or two\r\n // What we are going to do is to display a loader only when adding the very first breaker, once we have at least one breaker\r\n // We can use that as a sample object, reset it wrapping properties and add it immediatly locally, so it can be displayed on the board\r\n // Once the server response is ready we will override it or remove it if there were any errors\r\n\r\n let sampleContactors = cloneDeep(SAMPLE_CONTRACTOR)\r\n const updatedContactors = cloneDeep(this.state.board.ProjectBoardContractorCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n sampleContactors.ContractorReadOnly = selectedContactorData\r\n // Reset Item ID, so we can use it as an indicator to disable delete button/drag&drop until the response from the server \r\n // And to avoid some issues when user tries to do operations on this breakers before it's properly saved\r\n sampleContactors.ItemID = 0\r\n sampleContactors.ContractorItemID = selectedContactorData.ItemID\r\n // sampleContactors.ChassisIndex = this.state.selectedChassisIndex\r\n sampleContactors.PoleIndex = poleIndex\r\n sampleContactors.RowIndex = rowIndex\r\n\r\n updatedContactors.push(sampleContactors)\r\n\r\n updatedBoard.ProjectBoardContractorCollection = updatedContactors\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n\r\n apiCallsResidential.apiSaveContactorToChassis(this.state.projectID, this.state.boardID, 0, contactorData.ItemID, rowIndex, poleIndex)\r\n .then(boardContactor => {\r\n\r\n const existingTemporaryContactorIndex = this.state.board.ProjectBoardContractorCollection.findIndex(item => item.ContractorItemID === contactorData.ItemID && item.RowIndex === rowIndex && item.PoleIndex === poleIndex)\r\n console.log('existingTemporaryContactorIndex', existingTemporaryContactorIndex)\r\n\r\n const updatedContactors = cloneDeep(this.state.board.ProjectBoardContractorCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n // updatedContactors.push(boardContactor)\r\n updatedContactors[existingTemporaryContactorIndex] = boardContactor\r\n\r\n updatedBoard.ProjectBoardContractorCollection = updatedContactors\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(updatedBoard, this.state.boardDetails)\r\n this.setState({\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage\r\n })\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard }, () => {\r\n if (this.isEnoughFilledToGenerateQuote() && !this.state.hasAlreadyShownEnoughQuoteInfo) {\r\n this.setState({ pageInfo: 'You can now view a quote for this project!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n }\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n // Remove the Contactor from the board if there was an error\r\n updatedBoard.ProjectBoardContractorCollection = updatedContactors.filter(item => item.ItemID !== 0)\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.filter(item => item !== poleIndex) })\r\n })\r\n }\r\n\r\n addFittedOptionToBoard(rowIndex, poleIndex, fittedOptionData) {\r\n // Ignore the request if we are already adding device in this position\r\n if (this.state.isAddingDevice.indexOf(poleIndex) !== -1) return\r\n const canAddMessage = this.canAddDeviceToPosition(parseInt(fittedOptionData.SpaceUsed, 10), rowIndex, poleIndex, true, false, null, null, fittedOptionData.ItemID, false, false)\r\n if (canAddMessage !== '') {\r\n this.setState({ apiError: canAddMessage })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return\r\n }\r\n\r\n // If it is a powertag, then performe checks\r\n if (fittedOptionData.Reference === 'A9XMC1D3') {\r\n const powertagCheck = this.canAddPowertag(true, 'fittedOptionPowerTag')\r\n if (powertagCheck !== '') {\r\n // Display error message and don't continue\r\n this.setState({ apiError: powertagCheck })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n }\r\n\r\n // Update the state with the breakers position we are adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.concat([poleIndex]) })\r\n\r\n const selectedFittedOptionData = fittedOptionData ? fittedOptionData : this.state.selectedContactor.data\r\n // Here we are to improve the front-end performance when adding breakers. We don't want to display a loader each time and wait for a second or two\r\n // What we are going to do is to display a loader only when adding the very first breaker, once we have at least one breaker\r\n // We can use that as a sample object, reset it wrapping properties and add it immediatly locally, so it can be displayed on the board\r\n // Once the server response is ready we will override it or remove it if there were any errors\r\n\r\n let sampleFittedOption = cloneDeep(SAMPLE_FITTED_OPTION)\r\n const updatedFittedOption = cloneDeep(this.state.board.ProjectBoardFittedOptionCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n sampleFittedOption.FittedOptionReadOnly = selectedFittedOptionData\r\n // Reset Item ID, so we can use it as an indicator to disable delete button/drag&drop until the response from the server \r\n // And to avoid some issues when user tries to do operations on this breakers before it's properly saved\r\n sampleFittedOption.ItemID = 0\r\n sampleFittedOption.FittedOptionItemID = selectedFittedOptionData.ItemID\r\n // sampleContactors.ChassisIndex = this.state.selectedChassisIndex\r\n sampleFittedOption.PoleIndex = poleIndex\r\n sampleFittedOption.RowIndex = rowIndex\r\n\r\n updatedFittedOption.push(sampleFittedOption)\r\n\r\n updatedBoard.ProjectBoardFittedOptionCollection = updatedFittedOption\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n\r\n apiCallsResidential.apiSaveFittedOptionToChassis(this.state.projectID, this.state.boardID, 0, fittedOptionData.ItemID, rowIndex, poleIndex)\r\n .then(boardFittedOption => {\r\n\r\n const existingTemporaryFittedOptionIndex = this.state.board.ProjectBoardFittedOptionCollection.findIndex(item => item.FittedOptionItemID === fittedOptionData.ItemID && item.RowIndex === rowIndex && item.PoleIndex === poleIndex)\r\n console.log('existingTemporaryFittedOptionIndex', existingTemporaryFittedOptionIndex)\r\n\r\n const updatedFittedOptions = cloneDeep(this.state.board.ProjectBoardFittedOptionCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedFittedOptions[existingTemporaryFittedOptionIndex] = boardFittedOption\r\n\r\n updatedBoard.ProjectBoardFittedOptionCollection = updatedFittedOptions\r\n\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(updatedBoard, this.state.boardDetails)\r\n this.setState({\r\n boardPolesTotal: boardCompletionDetails.totalPoles,\r\n boardPolesConfigured: boardCompletionDetails.totalPolesConfigured,\r\n boardPolesRemaining: boardCompletionDetails.totalPolesRemaining,\r\n boardCompletionPercentage: boardCompletionDetails.completionPercentage\r\n })\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex((board) => {\r\n return board.ItemID === updatedBoard.ItemID\r\n })\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard }, () => {\r\n this.handleWiserEnergyGatewayDisplay()\r\n\r\n if (this.isEnoughFilledToGenerateQuote() && !this.state.hasAlreadyShownEnoughQuoteInfo) {\r\n this.setState({ pageInfo: 'You can now view a quote for this project!', hasAlreadyShownEnoughQuoteInfo: true })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n }\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n\r\n // Remove the FittedOption from the board if there was an error\r\n updatedBoard.ProjectBoardFittedOptionCollection = updatedFittedOption.filter(item => item.ItemID !== 0)\r\n this.setState({ project: updatedProject, board: updatedBoard })\r\n })\r\n .then(() => {\r\n // Set state to indicate we are done adding\r\n this.setState({ isAddingDevice: this.state.isAddingDevice.filter(item => item !== poleIndex) })\r\n })\r\n }\r\n\r\n addBusBarToBoard(busBarItemID, row, extraPoles, startPosition, busbarLength) {\r\n this.setState({ isAddingBusBar: true })\r\n\r\n apiCallsResidential.apiSaveBusBar(this.state.projectID, this.state.boardID, 0, busBarItemID, row, extraPoles, startPosition, busbarLength, false)\r\n .then(response => {\r\n const updatedBusbars = cloneDeep(this.state.board.ProjectBoardBusbarCollection)\r\n const updatedProject = cloneDeep(this.state.project)\r\n const updatedBoard = cloneDeep(this.state.board)\r\n\r\n updatedBusbars.push(response)\r\n updatedBoard.ProjectBoardBusbarCollection = updatedBusbars\r\n\r\n const indexOfTheCurrentProjectBoard = updatedProject.ProjectBoards.findIndex(board => board.ItemID === updatedBoard.ItemID)\r\n\r\n updatedProject.ProjectBoards[indexOfTheCurrentProjectBoard] = updatedBoard\r\n\r\n this.setState({ project: updatedProject, board: updatedBoard }, () => {\r\n this.setState({ pageInfo: 'Busbar added to the board!', isBusbarModalOpen: false })\r\n window.setTimeout(() => this.setState({ pageInfo: '' }), 5000)\r\n })\r\n })\r\n .catch(error => {\r\n this.setState({ apiError: error.message })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n })\r\n .then(() => {\r\n this.setState({ isAddingBusBar: false })\r\n })\r\n }\r\n\r\n hasMaxBoardLimitBeenReached() {\r\n // Function to check if the user has reached max board limit or not\r\n // App should not let user copy or add boards if they are at the limit.\r\n // Hardcode the max board limit if its not returned from the API\r\n const boardLimit = this.state.project.MaxBoardLimit ? this.state.project.MaxBoardLimit : 8\r\n return (this.state.project.ProjectBoards.length >= boardLimit)\r\n }\r\n\r\n addNewBoard() {\r\n this.props.history.push(CONST.PAGES.PROJECT_DETAILS_RESIDENTIAL + '?orderID=' + this.state.projectID + '&newBoard=true')\r\n }\r\n\r\n startConfiguringBoard() {\r\n this.setState({ isConfiguringBoard: true, boardToConfigure: this.state.board })\r\n }\r\n\r\n stopConfiguringBoard = (board) => {\r\n this.setState({\r\n projectID: getUrlParameter('projectID'),\r\n boardID: getUrlParameter('boardID')\r\n }, () => {\r\n this.initialize()\r\n\r\n // Give somes time for the board to re-initialize items based on new configuration\r\n window.setTimeout(() => {\r\n this.setState({ isConfiguringBoard: false, boardToConfigure: null })\r\n commonFunctionsService.closeModals()\r\n }, 2000)\r\n })\r\n }\r\n\r\n viewQuote() {\r\n let areEnoughBoardsToGenerateQuote = this.areEnoughBoardsToGenerateQuote()\r\n if (!areEnoughBoardsToGenerateQuote) {\r\n this.setState({ apiError: 'Board quantity is not enough to generate a quote.' })\r\n return false\r\n }\r\n\r\n // You've got boards but not all of them are filled out to minimum levels...\r\n let noEnoughFilled = !this.isEnoughFilledToGenerateQuote()\r\n if (noEnoughFilled) {\r\n this.setState({ apiError: 'Your project needs all boards filled with at least 4 breakers to generate a quote.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // If you're a contractor you need a selected wholesaler\r\n if (this.state.userData.UserIsContractor && (this.state.wholesalerBranchID === 0 || this.state.wholesalerBranchID === -1)) {\r\n this.setState({ apiError: 'Current user doesn\\'t have a preferred wholesalers configured.' })\r\n window.setTimeout(() => this.setState({ apiError: '' }), 5000)\r\n return false\r\n }\r\n\r\n // Finally made it through all the hoops, go to the Quote page.\r\n let pageLink = ''\r\n if (this.state.userData.UserIsContractor) {\r\n pageLink += CONST.PAGES.QUOTE_RESIDENTIAL + '?projectID=' + this.state.projectID + '&wholesalerBranchID=' + this.state.wholesalerBranchID\r\n this.props.history.push(pageLink)\r\n } else {\r\n pageLink += CONST.PAGES.QUOTE_RESIDENTIAL + '?projectID=' + this.state.projectID\r\n this.props.history.push(pageLink)\r\n }\r\n\r\n analyticsDataLayer.ctaButtonClick({\r\n cta_name: 'View Quote',\r\n cta_link: window.location.hostname + pageLink,\r\n cta_location: 'Config board'\r\n })\r\n }\r\n\r\n isEnoughFilledToGenerateQuote() {\r\n // Let's work with assumption all boards are all enough filled and invalidate this indicator as soon as any board is not enough filled\r\n let areAllProjectBoardsEnoughFilled = true\r\n\r\n this.state.project.ProjectBoards.map(board => {\r\n const boardDetails = BoardService.getDetails(this.state.boardOptionData, board.EnclosureID, board.MainSwitchID, board.SPDID, board.MetalBlackPlateID)\r\n const boardCompletionDetails = BoardService.getBoardCompletionDetails(board, boardDetails)\r\n\r\n if (!boardCompletionDetails.isEnoughCompletedToSeeTheQuote) areAllProjectBoardsEnoughFilled = false\r\n })\r\n\r\n return areAllProjectBoardsEnoughFilled\r\n }\r\n\r\n areEnoughBoardsToGenerateQuote = () => {\r\n let totalUserBoardsQuantity = 0\r\n this.state.project.ProjectBoards.map(board => {\r\n totalUserBoardsQuantity = totalUserBoardsQuantity + board.Quantity\r\n })\r\n\r\n return totalUserBoardsQuantity >= CONST.MINIMUM_RESIDENTIAL_BOARD_QUANTITY ? true : false\r\n }\r\n\r\n getValidationMessage(item) {\r\n let validationMessage = ''\r\n if (!item?.IsInStock) {\r\n validationMessage = `${item.Description} is out of stock. Please, contact au.estimating@se.com`\r\n } else if (item?.IsLowStock) {\r\n validationMessage = 'Low stock, longer lead times may apply'\r\n } else {\r\n validationMessage = ''\r\n }\r\n return validationMessage\r\n }\r\n\r\n handleUpdateQuantity(qty, id) {\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardBreakerToolboxCollection = updatedBoard.ProjectBoardBreakerToolboxCollection.map(item => {\r\n if (item.ItemID === id) {\r\n item.quantity = qty\r\n }\r\n return item\r\n })\r\n\r\n this.setState({ board: updatedBoard })\r\n }\r\n\r\n handleContactorUpdateQuantity(qty, id) {\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardContactorToolboxCollection = updatedBoard.ProjectBoardContactorToolboxCollection.map(item => {\r\n if (item.ItemID === id) {\r\n item.quantity = qty\r\n }\r\n return item\r\n })\r\n\r\n this.setState({ board: updatedBoard })\r\n }\r\n\r\n handleFittedOptionUpdateQuantity(qty, id) {\r\n const updatedBoard = cloneDeep(this.state.board)\r\n updatedBoard.ProjectBoardFittedOptionToolboxCollection = updatedBoard.ProjectBoardFittedOptionToolboxCollection.map(item => {\r\n if (item.ItemID === id) {\r\n item.quantity = qty\r\n }\r\n return item\r\n })\r\n\r\n this.setState({ board: updatedBoard })\r\n }\r\n\r\n render() {\r\n const breaker = this.state.board.ProjectBoardBreakerCollection?.filter(item => item.ItemID).length\r\n const contractor = this.state.board.ProjectBoardContractorCollection?.filter(item => item.ItemID).length\r\n const fittedOption = this.state.board.ProjectBoardFittedOptionCollection?.filter(item => item.ItemID).length\r\n const totalComponent = breaker + contractor + fittedOption\r\n\r\n if (this.state.isLoading) {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Loading\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n if (this.state.isAddingDevice.length > 0 && totalComponent === 0) {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Saving Device\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n if (this.state.isAddingBusBar) {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Saving Busbar\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n this.state.showDragNDropTutorial &&\r\n \r\n \r\n \r\n }\r\n\r\n {\r\n this.state.isBreakerModalOpen &&\r\n this.closeBreakerModal()}>\r\n\r\n \r\n \r\n }\r\n\r\n {\r\n this.state.isAdditionalItemsModalOpen &&\r\n this.closeAddingAdditionalItemsModal()}>\r\n\r\n \r\n \r\n }\r\n\r\n {\r\n this.state.isBusbarModalOpen &&\r\n this.stopCreatingBusbar()}>\r\n\r\n {\r\n this.addBusBarToBoard(busBarItemID, row, extraPoles, startPosition, busbarLength)\r\n }}\r\n\r\n board={this.state.board}\r\n boardDetails={this.state.boardDetails}\r\n boardOptions={this.state.boardOptions}\r\n\r\n updateBreakerPosition={this.updateBreakerPosition}\r\n updateContactorPosition={this.updateContactorPosition}\r\n updateFittedOptionPosition={this.updateFittedOptionPosition}\r\n updateMainSwitchPosition={this.updateMainSwitchPosition}\r\n residentialAllPartsAvailable={this.state.residentialAllPartsAvailable}\r\n />\r\n \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n {this.props.isCommercial ? : }\r\n
    \r\n

    {this.state.board.Name}

    \r\n\r\n \r\n
    \r\n\r\n
    \r\n \r\n\r\n \r\n\r\n this.setState({ activeBreakersTab: 'all' })}>\r\n
    \r\n All\r\n
    \r\n
    \r\n
    this.setState({ activeBreakersTab: 'favourites' })}>\r\n \r\n
    \r\n Favourites\r\n
    \r\n
    \r\n
    this.setState({ activeBreakersTab: 'boardonly' })}>\r\n \r\n
    \r\n This board only\r\n
    \r\n
    \r\n
    \r\n\r\n {/* */}\r\n
    \r\n {this.state.board.ProjectBoardBreakerToolboxCollection.length === 0 &&\r\n this.state.board.ProjectBoardContactorToolboxCollection.length === 0 &&\r\n this.state.board.ProjectBoardFittedOptionToolboxCollection.length === 0 &&\r\n
    \r\n \r\n \r\n \r\n

    You don’t have any devices in your library yet.

    \r\n

    Add your first device above

    \r\n
    \r\n }\r\n\r\n {/* Render Breakers */}\r\n {this.state.board.ProjectBoardBreakerToolboxCollection.length > 0 &&\r\n
    \r\n {\r\n this.state.activeBreakersTab !== 'favourites' &&\r\n

    Breakers

    \r\n }\r\n {this.state.board.ProjectBoardBreakerToolboxCollection.map((toolboxItem, index) => {\r\n toolboxItem.quantity = toolboxItem.quantity === undefined ? 1 : toolboxItem.quantity\r\n if (this.state.activeBreakersTab === 'all' ||\r\n (this.state.activeBreakersTab === 'favourites' && this.isBreakerFavourite(toolboxItem.BreakerTypeItemID)) ||\r\n (this.state.activeBreakersTab === 'boardonly' && !this.isBreakerFavourite(toolboxItem.BreakerTypeItemID))) {\r\n\r\n const breakerObj = this.state.breakerOptionData.find(dataItem => dataItem.ItemID === toolboxItem.BreakerTypeItemID)\r\n\r\n const availabilityDataForSelectedBreaker = this.state.residentialAllPartsAvailable.find(item => item.ItemCode === breakerObj.Reference)\r\n let validationMessage = ''\r\n validationMessage = this.getValidationMessage(availabilityDataForSelectedBreaker, breakerObj.Description)\r\n\r\n return (\r\n <>\r\n { this.handleDeletingBreaker(itemID) }}\r\n isBreakerFavourite={this.isBreakerFavourite(toolboxItem.BreakerTypeItemID)}\r\n quantity={toolboxItem.quantity}\r\n handleToggleBreakerFavourite={(itemID) => { this.handleToggleBreakerFavourite(itemID) }}\r\n usedCount={this.getUsedCount(breakerObj)}\r\n isDisabled={false} // It's always enabled, leave it for now, as there could be conditions where it's not enabled\r\n handleBreakerAutoAdd={(itemID, quantity) => {\r\n quantity = parseInt(quantity)\r\n for (let i = 0; i < quantity; i++) {\r\n setTimeout(() => {\r\n this.autoAddbreaker(itemID, toolboxItem.BreakerTypeItemID)\r\n }, 0);\r\n }\r\n }}\r\n addBreakerToBoard={(rowIndex, poleIndex, ItemID, BreakerTypeItemID) => {\r\n this.handleBreakerDrop(rowIndex, poleIndex, ItemID, BreakerTypeItemID)\r\n }}\r\n handleUpdateQuantity={(quantity, itemID) => { this.handleUpdateQuantity(quantity, itemID) }}\r\n />\r\n {validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n \r\n )\r\n } else {\r\n return ''\r\n }\r\n })}\r\n
    \r\n }\r\n\r\n {/* Render Additinal items */}\r\n {(this.state.board.ProjectBoardContactorToolboxCollection.length > 0 ||\r\n this.state.board.ProjectBoardFittedOptionToolboxCollection.length > 0) &&\r\n
    \r\n {\r\n this.state.activeBreakersTab !== 'favourites' &&\r\n

    Additional Items

    \r\n }\r\n {this.state.board.ProjectBoardContactorToolboxCollection.map((toolboxItem, index) => {\r\n toolboxItem.quantity = toolboxItem.quantity === undefined ? 1 : toolboxItem.quantity\r\n if (this.state.activeBreakersTab === 'all' || this.state.activeBreakersTab === 'boardonly') {\r\n const contactorObj = toolboxItem.ContactorReadOnly\r\n\r\n const availabilityDataForSelectedBreaker = this.state.residentialAllPartsAvailable.find(item => item.ItemCode === toolboxItem?.ContactorReadOnly?.Rating)\r\n let validationMessage = ''\r\n validationMessage = this.getValidationMessage(availabilityDataForSelectedBreaker, toolboxItem.ContactorReadOnly.Description)\r\n\r\n return (\r\n <>\r\n { this.handleDeletingContactor(itemID) }}\r\n usedCount={this.getUsedContactorCount(contactorObj)}\r\n isDisabled={false}\r\n handleContactorAutoAdd={(itemID, quantity) => { \r\n quantity = parseInt(quantity)\r\n for (let i = 0; i < quantity; i++) {\r\n setTimeout(() => {\r\n this.autoAddContactor(itemID, toolboxItem.ContactorItemID) \r\n }, 0)\r\n }\r\n }}\r\n addContactorToBoard={(rowIndex, poleIndex, ItemID, ContactorItemID) => {\r\n this.handleContactorDrop(rowIndex, poleIndex, ItemID, ContactorItemID)\r\n }}\r\n handleContactorUpdateQuantity={(quantity, itemID) => { this.handleContactorUpdateQuantity(quantity, itemID) }}\r\n />\r\n {validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n \r\n )\r\n } else {\r\n return ''\r\n }\r\n })}\r\n\r\n {this.state.board.ProjectBoardFittedOptionToolboxCollection.map((toolboxItem, index) => {\r\n toolboxItem.quantity = toolboxItem.quantity === undefined ? 1 : toolboxItem.quantity\r\n if (this.state.activeBreakersTab === 'all' || this.state.activeBreakersTab === 'boardonly') {\r\n const fittedOptionObj = toolboxItem.FittedOptionReadOnly\r\n\r\n const availabilityDataForSelectedBreaker = this.state.residentialAllPartsAvailable.find(item => item.ItemCode === toolboxItem?.FittedOptionReadOnly?.Reference)\r\n\r\n let validationMessage = ''\r\n validationMessage = this.getValidationMessage(availabilityDataForSelectedBreaker, toolboxItem.FittedOptionReadOnly?.Description)\r\n\r\n return (\r\n <>\r\n { this.handleDeletingFittedOption(itemID) }}\r\n usedCount={this.getUsedFittedOptionCount(fittedOptionObj)}\r\n isDisabled={false}\r\n handleFittedOptionAutoAdd={(itemID, quantity) => { \r\n quantity = parseInt(quantity)\r\n for (let i = 0; i < quantity; i++) {\r\n setTimeout(() => {\r\n this.autoAddFittedOption(itemID, toolboxItem.FittedOptionItemID) \r\n }, 0)\r\n }\r\n }}\r\n addFittedOptionToBoard={(rowIndex, poleIndex, ItemID, FittedOptionItemID) => {\r\n this.handleFittedOptionDrop(rowIndex, poleIndex, ItemID, FittedOptionItemID)\r\n }}\r\n handleFittedOptionUpdateQuantity={(quantity, itemID) => { this.handleFittedOptionUpdateQuantity(quantity, itemID) }}\r\n />\r\n {validationMessage &&\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n \r\n )\r\n } else {\r\n return ''\r\n }\r\n })}\r\n
    \r\n }\r\n
    \r\n\r\n {/* */}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {/* Sidbar */}\r\n
    \r\n
    \r\n {\r\n this.state.pageInfo !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.pageInfo}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.isEditingPowerTags &&\r\n

    \r\n \r\n \r\n \r\n \r\n Power Tags will be supplied loose, and not fitted to the board.\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.hasMixedDifferentProductRanges &&\r\n

    \r\n \r\n \r\n \r\n \r\n You have mixed 6kA and 4.5kA. Please note that these breakers belong to different product ranges and that their appearance on the board will be different.\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.apiError !== '' &&\r\n

    \r\n \r\n \r\n \r\n \r\n {this.state.apiError}\r\n \r\n

    \r\n }\r\n\r\n {\r\n this.state.displayMaxBoardLimitReached &&\r\n

    \r\n \r\n \r\n \r\n \r\n You have reached the maximum number of boards per project and cannot ADD or COPY anymore.\r\n \r\n

    \r\n }\r\n
    \r\n\r\n
    \r\n
    \r\n this.startCreatingBusbar()}\r\n updatePowerTagsEditing={(isEditingPowerTags) => this.setState({ isEditingPowerTags: isEditingPowerTags })}\r\n isEditingPowerTags={this.state.isEditingPowerTags}\r\n isUpdatingDevice={this.state.isUpdatingDevice}\r\n canAddDeviceToPosition={(speceUsed, rowIndex, poleIndex, isMainSwitch, breakerItemID) => {\r\n return this.canAddDeviceToPosition(speceUsed, rowIndex, poleIndex, false, isMainSwitch, breakerItemID)\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {\r\n this.state.isConfiguringBoard &&\r\n \r\n }\r\n
    \r\n\r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(ConfigChassisResidential)\r\n","import React, { Component } from 'react'\r\nimport Header from '../../components/header/Header'\r\nimport { InputwholesalersLookUp } from '../../components/inputwholesalersLookUp/InputwholesalersLookUp'\r\nimport { apiUpdateProfile } from '../../utils/apiCalls'\r\nimport { apiCallsCommercial } from '../../utils/apiCallsCommercial'\r\n\r\nexport class UserProfile extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n userSettings: {},\r\n hasCompletedLoading: false,\r\n preferredWholesalerData: null,\r\n isLoading: false,\r\n hasUpdatedUserProfile: false\r\n }\r\n\r\n apiCallsCommercial.apiUserSettings()\r\n .then((userDataObj) => {\r\n this.setState({\r\n userSettings: userDataObj,\r\n hasCompletedLoading: true\r\n })\r\n })\r\n }\r\n\r\n getExistingWholesalerData = (wholesalerID) => {\r\n if (!wholesalerID || !this.state.userSettings.PreferredWholesalers) return null\r\n\r\n const foundWholesaler = this.state.userSettings.PreferredWholesalers.find(wholesaler => wholesaler.WholesalerBranchID === wholesalerID)\r\n return foundWholesaler\r\n }\r\n\r\n validateEmail = (email) => {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\r\n return emailRegex.test(email)\r\n }\r\n\r\n validatePhone = (phone) => {\r\n const phoneRegex = /^\\d{7,20}$/\r\n return phoneRegex.test(phone)\r\n }\r\n\r\n validatePostalCode = (postalCode) => {\r\n const postalCodeRegex = /^\\d{2,4}$/\r\n return postalCodeRegex.test(postalCode)\r\n }\r\n\r\n validateForm = (formId) => {\r\n const form = document.getElementById(formId)\r\n if (form.dataset.submitIntent === 'false') return false\r\n\r\n const formElements = form.elements\r\n let formIsValid = true\r\n\r\n for (let i = 0; i < formElements.length; i++) {\r\n const element = formElements[i]\r\n if (!['INPUT', 'SELECT'].includes(element.nodeName)) continue\r\n if (!['profile-email', 'fax-mobile-number'].includes(element.id)) {\r\n const elementId = element.id\r\n const elementLabel = document.querySelector(`label[for=\"${elementId}\"]`)?.textContent || 'Field'\r\n const elementValue = element.value\r\n const elementError = document.querySelector(`[data-error-for='${elementId}']`)\r\n if (element.required && elementValue.trim() === '') {\r\n elementError.textContent = elementLabel + ' is required'\r\n formIsValid = false\r\n } else if (element.type === 'email' && !this.validateEmail(elementValue)) {\r\n elementError.textContent = 'Please enter a valid email address'\r\n formIsValid = false\r\n } else if (element.type === 'tel' && element.dataset?.postal === 'true' && !this.validatePostalCode(elementValue)) {\r\n elementError.textContent = 'Please enter a valid postal code'\r\n formIsValid = false\r\n } else if (element.type === 'tel' && !element.dataset?.postal && !this.validatePhone(elementValue)) {\r\n elementError.textContent = 'Please enter a valid phone number'\r\n formIsValid = false\r\n } else {\r\n elementError.textContent = ''\r\n }\r\n elementError.style.display = !formIsValid ? 'block' : 'none'\r\n }\r\n }\r\n return formIsValid\r\n }\r\n\r\n submitProfileForm = (event) => {\r\n event.preventDefault()\r\n event.target.dataset.submitIntent = 'true'\r\n const isValid = this.validateForm('profileForm')\r\n\r\n if (!isValid) return\r\n\r\n this.updateUser()\r\n }\r\n\r\n updateUser = () => {\r\n let data = {\r\n 'userID': 0,\r\n 'userFirstName': '',\r\n 'userLastName': '',\r\n 'userEmail': '',\r\n 'userMobile': '',\r\n 'userPostalAddress': '',\r\n 'userPostcode': '',\r\n 'userCity': '',\r\n 'userState': '',\r\n 'branchId': 0,\r\n 'preferredWholesaler1Id': 0,\r\n 'preferredWholesaler2Id': 0,\r\n 'preferredWholesaler3Id': 0\r\n }\r\n\r\n data.userID = this.state.userSettings.UserID\r\n data.userFirstName = document.getElementById('profile-first-name').value\r\n data.userLastName = document.getElementById('profile-last-name').value\r\n data.userEmail = document.getElementById('profile-email').value\r\n data.userMobile = document.getElementById('profile-mobile-number').value\r\n data.userPostalAddress = document.getElementById('profile-shipping-address').value\r\n data.userPostcode = document.getElementById('profile-postal-code').value\r\n data.userCity = document.getElementById('profile-city').value\r\n data.userState = document.getElementById('profile-state').value\r\n data.branchId = this.state.userSettings.UserWholesalerBranchID\r\n\r\n const preferredWholesaler1Input = document.getElementById('register-wholesaler-1')\r\n const preferredWholesaler2Input = document.getElementById('register-wholesaler-2')\r\n const preferredWholesaler3Input = document.getElementById('register-wholesaler-3')\r\n\r\n if (preferredWholesaler1Input) {\r\n if (preferredWholesaler1Input.value !== '') {\r\n data.preferredWholesaler1Id = parseInt(preferredWholesaler1Input.value)\r\n } else {\r\n data.preferredWholesaler1Id = 0\r\n }\r\n }\r\n\r\n if (preferredWholesaler2Input) {\r\n if (preferredWholesaler2Input.value !== '') {\r\n data.preferredWholesaler2Id = parseInt(preferredWholesaler2Input.value)\r\n }\r\n }\r\n\r\n if (preferredWholesaler3Input) {\r\n if (preferredWholesaler3Input.value !== '') {\r\n data.preferredWholesaler3Id = parseInt(preferredWholesaler3Input.value)\r\n }\r\n }\r\n this.setState({ isLoading: true })\r\n apiUpdateProfile(data)\r\n .then(response => {\r\n this.setState({ hasUpdatedUserProfile: true })\r\n console.log('Update profile successful', response)\r\n })\r\n .catch(error => {\r\n window.alert(`Update profile failed: ${error.message}`)\r\n })\r\n .finally(() => {\r\n this.setState({ isLoading: false })\r\n })\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    \r\n My Profile\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {\r\n this.state.hasUpdatedUserProfile &&\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n Changes were saved\r\n \r\n

    \r\n

    \r\n Your profile is updated.\r\n

    \r\n

    \r\n Your changes have been saved to your account.\r\n

    \r\n \r\n \r\n Back to Home\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n { !this.state.hasUpdatedUserProfile &&\r\n
    \r\n
    \r\n\r\n
    \r\n

    \r\n Your details\r\n

    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.validateForm('profileForm')}\r\n defaultValue={this.state.userSettings.UserFirstName}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.validateForm('profileForm')} \r\n defaultValue={this.state.userSettings.UserLastName}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.validateForm('profileForm')}\r\n defaultValue={this.state.userSettings.UserMobile} \r\n />\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n Shipping Address\r\n

    \r\n
    \r\n
    \r\n
    \r\n this.validateForm('profileForm')} \r\n defaultValue={this.state.userSettings.UserPostalAddress}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.validateForm('profileForm')} \r\n defaultValue={this.state.userSettings.UserPostcode}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n this.validateForm('profileForm')} \r\n defaultValue={this.state.userSettings.UserCity}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n { this.state.userSettings.UserTypeString === 'Electrician' && this.state.hasCompletedLoading &&\r\n
    \r\n

    \r\n Wholesalers available\r\n

    \r\n
    \r\n \r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n }\r\n\r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n\r\n
    \r\n )\r\n }\r\n}","import React from 'react'\r\nimport Axios from 'axios'\r\nimport {\r\n withRouter,\r\n Switch,\r\n Route\r\n} from 'react-router-dom'\r\nimport Projects from './pages/projects/Projects'\r\nimport ProjectDetails from './pages/project-details/commercial/ProjectDetails'\r\nimport ProjectDetailsResidential from './pages/project-details/residential/ProjectDetailsResidential'\r\nimport Quote from './pages/quote/Quote'\r\nimport QuoteResidential from './pages/quote/QuoteResidential'\r\nimport { TechnicalInformation } from './pages/technical-information/TechnicalInformation'\r\nimport { Home } from './pages/home/Home'\r\nimport { Registration } from './pages/registration/Registration'\r\nimport ConfigChassis from './pages/config-chassis/ConfigChassis'\r\nimport ConfigChassisResidential from './pages/config-chassis/ConfigChassisResidential'\r\nimport { apiPostLoginSSOCallback } from './utils/apiCalls'\r\nimport { apiCallsCommercial } from './utils/apiCallsCommercial'\r\nimport { apiCallsResidential } from './utils/apiCallsResidential'\r\nimport analyticsDataLayer from './services/AnalyticsDataLayer'\r\nimport { UserProfile } from './pages/user-profile/UserProfile'\r\nconst { CONST } = require('./CONST')\r\n\r\nconst userType = {\r\n 0: 'Large Contractor',\r\n 1: 'Switchboard Manufacturer',\r\n 2: 'Wholesaler',\r\n 3: 'Contractor', //UserIsContractor\r\n 4: 'Consultant', //IsConsultant\r\n}\r\nclass App extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n isAuthenticating: true,\r\n userSettings: {}\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const urlParams = new URLSearchParams(window.location.search)\r\n const code = urlParams.get('code')\r\n const tokenParam = urlParams.get('token')\r\n const token = window.localStorage.getItem('token')\r\n\r\n if (code) {\r\n apiPostLoginSSOCallback(code)\r\n .then(response => {\r\n if (response.token) { \r\n window.localStorage.setItem('token', response.token)\r\n this.setAxiosAuthorizationHeader(response.token)\r\n // Remove the token from the URL\r\n window.history.replaceState({}, document.title, window.location.pathname)\r\n\r\n\r\n try {\r\n const arrayToken = response.token.split('.')\r\n const decodedToken = JSON.parse(atob(arrayToken[1]))\r\n\r\n // Need to pass more event data to the data layer\r\n analyticsDataLayer.login({\r\n 'user_id': response.federatedId !== null ? response.federatedId : '', \r\n 'user_type': response.ailApplications !== null ? response.ailApplications : '',\r\n 'company_name': response.companyName !== null ? response.companyName : '',\r\n 'is_federated_id': response.isFederatedId !== null ? response.isFederatedId : '',\r\n 'company_id': response.companyId !== null ? response.companyId : '', \r\n 'customer_classification_category': response.customerClassificationCategory !== null ? response.customerClassificationCategory : '',\r\n 'customer_classification_sub_category': response.customerClassificationSubCategory !== null ? response.customerClassificationSubCategory : '',\r\n\r\n // Currently passing as empty as those would still need to be provided\r\n 'is_test_user': '',\r\n 'is_schneider_employee': '',\r\n 'is_customer_impersonation': ''\r\n })\r\n } catch (error) {\r\n console.error('Error parsing token (Analytics purposes only)', error)\r\n }\r\n\r\n this.initialize()\r\n } else {\r\n window.alert('Failed to get token from the server')\r\n }\r\n })\r\n .catch((error) => {\r\n // Redirect the user to the home page with the error message in the params\r\n // Check that the message is a string, not an object\r\n if (typeof error === 'object') {\r\n error = JSON.stringify(error)\r\n }\r\n\r\n window.location.href = CONST.PAGES.HOME + `?error=${error}`\r\n })\r\n } else if (tokenParam) {\r\n window.localStorage.setItem('token', tokenParam)\r\n this.setAxiosAuthorizationHeader(tokenParam)\r\n this.initialize()\r\n } else if (token) {\r\n this.setAxiosAuthorizationHeader(token)\r\n this.initialize()\r\n } else {\r\n // Redirect to the login page if not already on the login page\r\n if (window.location.pathname.includes(CONST.PAGES.HOME)) {\r\n this.setState({ isAuthenticating: false })\r\n } else {\r\n this.props.history.push(CONST.PAGES.HOME)\r\n this.setState({ isAuthenticating: false })\r\n }\r\n }\r\n }\r\n\r\n // Set axios authorization header\r\n setAxiosAuthorizationHeader(token) {\r\n if (token) {\r\n Axios.defaults.headers.common['Authorization'] = `Bearer ${token}`\r\n } else {\r\n delete window.axios.defaults.headers.common['Authorization']\r\n }\r\n }\r\n\r\n initialize() {\r\n apiCallsCommercial.apiUserSettings()\r\n .then((userDataObj) => {\r\n // For the Medallia integration CLIP-606, we need to expose some of the global variables\r\n if (userDataObj !== null) {\r\n window.surveyFederatedId = userDataObj.UserGuid\r\n window.surveyLastName = userDataObj.UserLastName\r\n window.surveyFirstName = userDataObj.UserFirstName\r\n window.surveyEmailId = userDataObj.UserEmail\r\n window.surveyPhoneNumber = userDataObj.UserPhone\r\n }\r\n\r\n this.setState({\r\n userSettings: userDataObj,\r\n isAuthenticating: false\r\n })\r\n\r\n this.props.history.push('/')\r\n })\r\n .catch(() => {\r\n // Failed to get user setting, then take the user back to the login page\r\n if (window.location.href.indexOf('localhost') > -1) {\r\n window.alert('You are recognized as working in the local environment, but not authorized to call APIs, please check the documentation.')\r\n } else {\r\n this.props.history.push(CONST.PAGES.HOME)\r\n }\r\n })\r\n\r\n this.props.history.listen(location => {\r\n const userTypeName = userType?.[this.state?.userSettings?.UserType] || ''\r\n this.processDataLayerPageView(location, userTypeName)\r\n })\r\n }\r\n\r\n processDataLayerPageView(location, userType) {\r\n const path = location?.pathname === '/' ? 'home' : location?.pathname?.replace(/\\//g, '')\r\n // All pathnames follow the convention of same names, but the residential path has the additional word \"-residential\" in all the paths\r\n // Use this to determine if the user is on the residential or commercial path\r\n const isCommercial = location?.pathname.includes('residential') ? false : true\r\n // If the pathnames includes in whole or partially path from any of these pages PROJECT_DETAILS, CONFIGURE_CHASSIS, QUOTE it \r\n // means the user is on the project page. This is the best compromise for now, but if any drastic changes are made or new pages\r\n // introduced, this logic might need to be updated\r\n const isOnProjectPage = location?.pathname.includes(CONST.PAGES.PROJECT_DETAILS) || location?.pathname.includes(CONST.PAGES.CONFIGURE_CHASSIS) || location?.pathname.includes(CONST.PAGES.QUOTE)\r\n const queryString = location?.search || ''\r\n const params = new URLSearchParams(queryString)\r\n const projectId = params.get('orderID') || params.get('projectID') || ''\r\n const boardID = params.get('boardid') || params.get('boardID') || ''\r\n const callDataLayer = () => {\r\n // For more details on this implementation please refer to https://journey-digital.atlassian.net/browse/CLIP-628\r\n analyticsDataLayer.pageView({\r\n 'digital_platform': 'FlexSelect',\r\n 'digital_platform_country': 'au',\r\n 'environment': process.env.REACT_APP_ENVIRONMENT,\r\n // Pass empty if it's not a project page, otherwise pass \"Power Products\" for commercial and \"H&D\" for residential\r\n 'business_unit': isOnProjectPage ? (isCommercial ? 'Power Products' : 'H&D') : '',\r\n 'business_divison': '', // Should be left empty\r\n 'configurator_name': 'FlexSelect',\r\n 'page_category': '/flex',\r\n 'page_language': 'en',\r\n 'page_sub_category': projectId,\r\n 'page_sub_sub_category': boardID,\r\n 'page_top_category': this.getTopCategory(location) || '',\r\n 'user_persona': userType,\r\n // Pass empty if it's not a project page, otherwise pass project type\r\n 'project_type': isOnProjectPage ? (isCommercial ? 'Commercial' : 'residential') : '',\r\n 'project_name': projectName,\r\n 'project_id' : projectId, \r\n 'template': path\r\n })\r\n }\r\n\r\n let projectName = ''\r\n if (isOnProjectPage) {\r\n const apiCall = isCommercial ? apiCallsCommercial.apiGetProject : apiCallsResidential.apiGetProject\r\n apiCall(projectId).then(response => {\r\n projectName = response.Title\r\n callDataLayer()\r\n })\r\n } else {\r\n callDataLayer()\r\n }\r\n }\r\n\r\n getTopCategory(location) {\r\n return location?.pathname + (location?.search ? location.search : '') || ''\r\n }\r\n\r\n render() {\r\n if (this.state.isAuthenticating) {\r\n // We can improve this and put some global loader\r\n return ''\r\n } else {\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default withRouter(App)\r\n","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from \"react\"\r\nimport { withRouter } from 'react-router-dom';\r\n\r\nclass CookieSetting extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n componentDidMount() {\r\n if (this.props.location.pathname === '/project-details') {\r\n const cookieSettingsElement = document.querySelector('.cookie-settings');\r\n cookieSettingsElement.style.bottom = '11rem';\r\n }\r\n }\r\n\r\n 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 \r\n\r\n\r\n
    \r\n Cookie Settings\r\n
    \r\n\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(CookieSetting)\r\n","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport './resources/scss/main.scss'\r\nimport App from './App'\r\nimport { BrowserRouter } from 'react-router-dom'\r\nimport reportWebVitals from './reportWebVitals'\r\nimport { DndProvider } from 'react-dnd'\r\nimport { HTML5Backend } from 'react-dnd-html5-backend'\r\nimport CookieSetting from './components/cookie-settings/cookieSetting'\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href')\r\nconst rootElement = document.getElementById('root')\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n rootElement\r\n)\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals()\r\n","exports.CONST = {\r\n API_PATH: '/Clipsal_LDB_API/api/v3',\r\n API_PATH_RESIDENTIAL: '/Clipsal_Residential_API/api/v3',\r\n LEGACY_API_PATH: '/api',\r\n API_PATH_SSO_LOCALHOST: 'https://localhost:7030',\r\n SSO_CURRENT_SITE: 'FLEXSELECT',\r\n SSO_API_KEY: 'dVCakwqW8Ri4R8kA1UBibJWGnvnvwROQ',\r\n RECAPTCH_SITE_KEY: '6Lc8Gl0qAAAAAPK6qBvbhChnogaIhXCTmWrulKG_',\r\n PAGES: {\r\n HOME: '/home',\r\n LOGIN: '/login',\r\n REGISTER: '/register',\r\n PROFILE: '/user-profile',\r\n UPDATE_PROFILE_INFO: '/Update-Profile-Info',\r\n PROJECT_DETAILS: '/project-details',\r\n PROJECT_DETAILS_RESIDENTIAL: '/project-details-residential',\r\n TECHNICAL_INFORMATION: '/technical-information',\r\n CONFIGURE_CHASSIS: '/config-chassis',\r\n CONFIGURE_CHASSIS_RESIDENTIAL: '/config-chassis-residential',\r\n QUOTE: '/project-quote',\r\n QUOTE_RESIDENTIAL: '/project-quote-residential'\r\n },\r\n MINIMUM_RESIDENTIAL_BOARD_QUANTITY: 30\r\n}\r\n "],"sourceRoot":""}