{"version":3,"sources":["shared/hooks/useSitecoreContext.ts","shared/hooks/useAdobeTracking.ts","shared/hooks/index.ts","shared/hooks/useAdobePageLoadTracking.ts","shared/hooks/useAdobeTrackingData.ts","shared/hooks/useContextEnvironment.ts","shared/hooks/useContextSettings.ts","shared/hooks/useIsEditor.ts","assets/images/svg/icon-checkmark-red.svg","polyfills/es6egexp.js","temp/config.js","polyfills/array-fill.js","lib/SitecoreContextFactory.js","dataFetcher.js","constants/fieldReferences.js","shared/utils/field-validation/cleanLinkData.ts","shared/utils/sitecoreBoolToBool.ts","components/Card/Card.tsx","components/Cards/Cards.tsx","components/CenteredText/CenteredText.tsx","components/RichText/tooltipStyles.ts","components/RichText/richTextStyles.ts","components/ColorCard/ColorCard.tsx","components/ColorCard/ColorCardUI.tsx","components/ColorCards/ColorCards.tsx","components/CookieConsentBanner/CookieConsentBanner.tsx","components/CustomInsertHtml/CustomInsertHtml.tsx","shared/components/FieldChecker/FieldChecker.tsx","shared/utils/field-validation/isValidText.ts","shared/utils/field-validation/isValidImage.ts","shared/utils/field-validation/isValidLink.ts","shared/components/SitecoreButtons.tsx","shared/components/ImageContainer/ImageContainer.tsx","components/EntranceSingleLeft/EntranceSingleLeft.tsx","shared/utils/imageScaler.ts","components/EntranceSinglePopoutLeft/EntranceSinglePopoutLeft.tsx","components/EntranceSinglePopoutRight/EntranceSinglePopoutRight.tsx","components/EntranceSingleRight/EntranceSingleRight.tsx","shared/utils/placeholderChildren.ts","shared/utils/scrollTo.ts","components/ExpandedTextAccordionItem/ExpandedTextAccordionItem.tsx","components/TextAccordionItem/TextAccordionItem.tsx","components/ExpandedTextAccordion/ExpandedTextAccordion.tsx","components/ExpandedTextAccordion/useVisibleSection.ts","components/FacebookPixel/FacebookPixel.tsx","shared/utils/componentTopMargin.ts","components/Footer/Footer.tsx","shared/components/ErrorMessage/ErrorMessage.tsx","shared/components/ThankYouMessage/ThankYouMessage.tsx","shared/forms/submitFormData.ts","shared/components/AutoTextArea/AutoTextArea.tsx","shared/components/Checkbox/Checkbox.tsx","shared/components/Form/FormFooter.tsx","shared/components/Form/FormLayout.tsx","shared/components/Form/FormRow.tsx","shared/regex/CprRegex.ts","shared/regex/NameRegex.ts","shared/regex/NumberRegex.ts","shared/regex/PartnerRegex.ts","shared/regex/PhoneRegex.ts","components/FormCallMe/CallMeForm.tsx","components/FormCallMe/schema.ts","components/FormCallMe/FormCallMe.tsx","shared/forms/secureUploadHandling.ts","shared/utils/handleTranslation.ts","components/FormCprUpload/Page0Choose.tsx","shared/forms/customYup.ts","components/FormCprUpload/Page1Form.tsx","components/FormCprUpload/form-schema.ts","components/FormCprUpload/Page2Upload.tsx","components/FormCprUpload/FormCprUpload.tsx","components/FormCvrUpload/CVRConfirmation.tsx","components/FormCvrUpload/CVRForm.tsx","components/FormCvrUpload/form-schema.ts","components/FormCvrUpload/CVRUpload.tsx","components/FormCvrUpload/FormCvrUpload.tsx","components/FormGdpr/GDPRForm.tsx","components/FormGdpr/schema.ts","components/FormGdpr/FormGdpr.tsx","components/FormNemKonto/NemKontoForm.tsx","components/FormNemKonto/schema.ts","components/FormNemKonto/FormNemKonto.tsx","shared/forms/submitFormDataV4.ts","components/FormPpi/PpiForm.tsx","components/FormPpi/schema.ts","components/FormPpi/FormPpi.tsx","components/FormUnsubscribe/UnsubscribeForm.tsx","components/FormUnsubscribe/schema.ts","components/FormUnsubscribe/FormUnsubscribe.tsx","components/Header/Header.demo-data.ts","components/Header/googleSearchApi.ts","components/Header/Header.tsx","components/Headline/Headline.tsx","shared/utils/dateParser.ts","components/HeroDefault/IconDownload.tsx","components/HeroDefault/HeroDefault.tsx","components/HeroFrontpage/HeroFrontpage.tsx","components/HeroFrontpageColumnItem/HeroFrontpageColumnItem.tsx","components/HeroProduct/HeroProduct.tsx","shared/components/Editor/EditorWrapper.tsx","components/HtmlRenderer/HtmlRenderer.tsx","components/ImageHeader/ImageHeader.tsx","components/ImageLeft/ImageLeft.tsx","components/ImageRight/ImageRight.tsx","components/LoanCalculator/config.ts","components/LoanCalculator/helpers/query.ts","components/LoanCalculator/state/inputsState.ts","components/LoanCalculator/helpers/sleep.ts","components/LoanCalculator/helpers/mapAmortisationData.ts","components/LoanCalculator/calculators/cibor6/payload-preparer.ts","components/LoanCalculator/calculators/cibor6/payload-updater.ts","components/LoanCalculator/helpers/api.ts","components/LoanCalculator/calculators/cibor6/request.ts","components/LoanCalculator/calculators/cibor6/response-mapper.ts","shared/utils/currency.ts","components/LoanCalculator/state/settingsState.ts","components/LoanCalculator/components/tooltip/CalculatorTooltipTable.tsx","components/LoanCalculator/components/tooltip/CalculatorTooltipAdministrationFee.tsx","components/LoanCalculator/calculators/cibor6/table-converter.tsx","components/LoanCalculator/calculators/cibor6/index.ts","components/LoanCalculator/calculators/flexkort/payload-preparer.ts","components/LoanCalculator/calculators/flexkort/payload-updater.ts","components/LoanCalculator/calculators/flexkort/request.ts","components/LoanCalculator/calculators/flexkort/response-mapper.ts","components/LoanCalculator/helpers/tableItemValidation.ts","components/LoanCalculator/calculators/flexkort/table-converter.tsx","components/LoanCalculator/calculators/flexkort/index.ts","components/LoanCalculator/calculators/flexlaank/payload-preparer.ts","components/LoanCalculator/calculators/flexlaank/payload-updater.ts","components/LoanCalculator/calculators/flexlaank/request.ts","components/LoanCalculator/calculators/flexlaank/response-mapper.ts","components/LoanCalculator/calculators/flexlaank/table-converter.tsx","components/LoanCalculator/calculators/flexlaank/index.ts","components/LoanCalculator/calculators/flexlaant/payload-preparer.ts","components/LoanCalculator/calculators/flexlaant/payload-updater.ts","components/LoanCalculator/calculators/flexlaant/request.ts","components/LoanCalculator/calculators/flexlaant/response-mapper.ts","components/LoanCalculator/calculators/flexlaant/table-converter.tsx","components/LoanCalculator/calculators/flexlaant/index.ts","components/LoanCalculator/helpers/dateHelpers.ts","components/LoanCalculator/helpers/getBankHolidays.ts","components/LoanCalculator/calculators/flexlife/payload-preparer.ts","components/LoanCalculator/calculators/flexlife/payload-updater.ts","components/LoanCalculator/calculators/flexlife/request.ts","components/LoanCalculator/calculators/flexlife/response-mapper.ts","components/LoanCalculator/calculators/flexlife/table-converter.tsx","components/LoanCalculator/calculators/flexlife/index.ts","components/LoanCalculator/calculators/kontantlaan/payload-preparer.ts","components/LoanCalculator/calculators/kontantlaan/payload-updater.ts","components/LoanCalculator/calculators/kontantlaan/request.ts","components/LoanCalculator/calculators/kontantlaan/response-mapper.ts","components/LoanCalculator/calculators/kontantlaan/table-converter.tsx","components/LoanCalculator/calculators/kontantlaan/index.ts","components/LoanCalculator/calculators/obligationslaan/payload-preparer.ts","components/LoanCalculator/calculators/obligationslaan/payload-updater.ts","components/LoanCalculator/calculators/obligationslaan/request.ts","components/LoanCalculator/calculators/obligationslaan/response-mapper.ts","components/LoanCalculator/calculators/obligationslaan/table-converter.tsx","components/LoanCalculator/calculators/obligationslaan/index.ts","components/LoanCalculator/calculators/performCalculation.ts","components/LoanCalculator/state/loansState.ts","components/LoanCalculator/helpers/initial-loans.ts","components/LoanCalculator/components/detailslinks/CalculatorDetailsLinks.tsx","components/LoanCalculator/components/inputs/CalculatorInputsValidationMessage.tsx","components/LoanCalculator/components/inputs/CalculatorInputs.tsx","components/LoanCalculator/helpers/inputs.ts","components/LoanCalculator/components/modal/CalculatorModal.tsx","components/LoanCalculator/components/modal/hooks/useAmortExcelData.tsx","components/LoanCalculator/components/stickybar/CalculatorStickyBar.tsx","components/LoanCalculator/helpers/table.ts","components/LoanCalculator/components/fields/CalculatorDropdownField.tsx","components/LoanCalculator/components/fields/CalculatorInputField.tsx","components/LoanCalculator/components/fields/CalculatorSliderField.tsx","components/LoanCalculator/components/fields/CalculatorStaticField.tsx","components/LoanCalculator/components/table/CalculatorTableBodyCell.tsx","components/LoanCalculator/components/table/CalculatorTableBodyLabelCell.tsx","components/LoanCalculator/components/table/CalculatorTableErrorMessage.tsx","components/LoanCalculator/components/table/CalculatorTableHeadCell.tsx","components/LoanCalculator/components/table/CalculatorTableDesktop.tsx","components/LoanCalculator/components/table/CalculatorAddLoanButtonMobile.tsx","components/LoanCalculator/components/table/CalculatorTableMobile.tsx","components/LoanCalculator/components/table/CalculatorTablesContainer.tsx","components/LoanCalculator/components/tabs/CalculatorTabs.tsx","components/LoanCalculator/LoanCalculator.tsx","components/LoanCalculator/helpers/scroll.ts","components/LoanCalculatorInputsOnly/LoanCalculatorInputsOnly.tsx","components/NewsListHorizontal/NewsListHorizontal.tsx","components/NewsListHorizontalItem/NewsListHorizontalItem.tsx","components/NewsListVertical/NewsListVertical.tsx","components/NewsListVerticalItem/NewsListVerticalItem.tsx","components/ProductFeature/ProductFeature.tsx","components/RatesTables/Utils.ts","components/RatesTables/hooks/useFormatCashLoan.ts","components/RatesTables/hooks/useFormatFixedLoans.ts","components/RatesTables/hooks/useFormatVariableLoan.ts","components/RatesTables/hooks/useLastUpdateTimeStamp.ts","components/RatesTables/TableCellRender.tsx","components/RatesTables/TableCashLoan.tsx","components/RatesTables/TableClosedBonds.tsx","components/RatesTables/TableFastforrentet.tsx","components/RatesTables/TableVariabel.tsx","components/RatesTables/RatesTables.tsx","components/RichText/RichText.tsx","components/ShortcutLink/ShortcutLink.tsx","components/SurveyInit/SurveyInit.tsx","components/Table/Table.tsx","components/Table/parseExcelData.ts","components/TextAccordion/TextAccordion.tsx","temp/componentFactory.js","shared/components/AppSetup.tsx","shared/components/ContentParser/parsers/cookiePanel/index.tsx","shared/components/ContentParser/parsers/videoParser/index.tsx","shared/components/ContentParser/index.tsx","shared/components/Editor/EditorIncludes.tsx","shared/components/Editor/ExpEditorRow.tsx","shared/components/LabelDark.tsx","shared/components/LabelGrey.tsx","shared/components/LayoutBackground.tsx","shared/components/Monitoring/index.tsx","shared/components/Section/Section.tsx","shared/components/SitecoreLinks.tsx","shared/components/WithConditionWrapper.tsx","Layout.js","NotFound.js","RouteHandler.js","AppRoot.tsx","index.js","i18n.js","lib/GraphQLClientFactory.js"],"names":["useSitecoreContext","useContext","SitecoreContextReactContext","getSitecoreContext","useAdobeTracking","launchData","TrackingTypes","changeEventFired","useRef","initiated","cookieConsent","useCookieConsent","track","useCallback","data","customEvent","isAllowed","ConsentLevel","Statistics","w","window","_satellite","setLaunchData","launch_data","console","warn","getLaunchData","key","cleanLaunchData","keyNames","Object","keys","forEach","k","keyName","search","trackCalculatorInteraction","calculator_status","trackCalculatorCustomEvent","trackCalculatorSuccess","trackCalculatorReCalculation","trackCalculatorFailed","service_msg","useLayoutEffect","current","trackFormSubmitSuccess","form_status","FORM_TRACKING_TYPE","trackFormSubmitFail","trackNavigatedToStep","stepName","form_step","updatePageNameFromTab","tabName","page_name","onFormInteraction","e","originalHandler","trackSearchOpened","pageTitle","page_type","search_area","search_type","PAGE_VIEW_TRACKING_TYPE","trackSearchPerformed","search_term","search_results","SEARCH_TRACKING_TYPE","trackSearchLoadMoreResults","pageNumber","trackSearchResultClick","result","search_result_clicked","title","useAdobePageLoadTracking","viewName","breadcrumbs","location","pathname","split","filter","i","log","useAdobeTrackingData","metaTitle","trackingAllowed","dataTrackingDetails","document","querySelectorAll","el","index","getAttribute","addEventListener","event","setAttribute","EnvironmentName","EnvironmentRole","useContextSettings","settings","googleSiteVerification","facebookDomainVerification","videoAccountId","cookiePolicyEnabled","cookieBannerDisabled","monitoring","appKey","beaconUrl","useIsEditor","pageEditing","module","exports","global","test","navigator","userAgent","NativeRegExp","RegExp","prototype","defineProperty","configurable","get","this","toString","match","error","R_NAME","R_NAME_REPLACE","source","R_NAMED_BACKREF","R_GROUP","R_GROUPS","R_EMPTY_GROUPS","pattern","flags","input","String","output","groups","named","originalSource","store","count","names","map","part","name","block","push","pop","substr","exec","length","group","join","replace","generate","regexp","value","propertyName","enumerable","_regexp","lastIndex","set","_data","constructor","replacement","convertedReplacement","call","bind","maxQuantity","Array","fill","TypeError","O","len","start","arguments","relativeStart","Math","max","min","end","relativeEnd","undefined","finalValue","SitecoreContextFactory","dataFetcher","url","axios","method","withCredentials","fieldReferences","metaDescription","metaKeywords","metaNoindex","canonicalUrl","sharingImage","greyBackground","hideStickyBookMeeting","hideStickyCalculator","cleanLinkData","fromEntries","entries","sitecoreBoolToBool","sitecoreBool","toLocaleLowerCase","Boolean","Card","fields","params","isEditor","centerContent","ctaAsLink","imageFullWidth","noBorder","cardLink","href","trackingcode","desktopCardAmount","round","parseInt","DesktopColumnsAmount","tabletCardAmount","TabletColumnsAmount","mobileCardAmount","MobileColumnsAmount","ImageCoomponent","type","field","HeadlineComponent","TextComponent","CtaComponent","RibbonComponent","sm","md","lg","image","headline","text","cta","link","height","marginBottom","ribbonText","withPlaceholder","cards","Section","componentName","margin","CenteredText","justify","textAlign","mt","marginTop","tooltipPsudoStyle","css","Color","rdBrightWhite","tooltipPositionRight","mediaQuery","tooltipPositionBottom","tooltipLinkStyle","rdPureBlack","mdDown","tooltipBubble","tooltipHeading","RddkTheme","fonts","sans","tooltipContent","darkGrey","headingStyle","paragraphStyle","richTextList","black","olStyle","ulStyle","hrStyle","xl","linkStyle","colors","rdRed","richTextStyles","tooltipStyles","applyTextType","buttonBaseStyle","buttonPrimaryStyle","buttonSecondaryStyle","StyledRichText","styled","RichText","ColorCard","useRedBackground","centerText","CenterText","bgColor","red50","grey10","color","Container","backgroundColor","mb","variant","Box","props","div","ColorCardUI","colorcards","centerCards","CenterCards","style","justifyContent","CookieConsentBanner","t","useTranslation","disabled","handler","useCookieConsentBannerDefaultHandler","onSubmit","React","useEffect","cookieConsentBanner","reopen","onReopen","description","dangerouslySetInnerHTML","__html","buttonAllowNecessaryText","buttonAllowSelectedText","buttonAllowAllText","levels","CustomInsertHtml","consentLevels","getConsentLevels","render","position","renderScript","Function","Marketing","JSON","stringify","encode","editable","FieldChecker","children","trim","isValidText","src","isValidImage","isValidLink","secondaryLink","grey100","Button","StyledButton","data-tracking-id","Link","white","buttonCustomStyle","ContainerRow","Row","ImageColWrapper","Col","BackgroundImage","imagePath","xxl","ImageContainer","direction","EntranceSingleLeft","getQuerySymbol","paramCleaner","urlParts","loc","queryString","mediaUrlPrefixRegex","imageScaler","maxWidth","imageUrl","widthParameter","pixelRatio","scalingSteps","values","breakpoints","largestStep","innerWidth","reduce","a","c","ceil","scaledImageSuffix","BgImage","SlantedBackgroundImage","EntranceSinglePopoutLeft","slantPosition","zIndex","EntranceSinglePopoutRight","condition","process","REACT_APP_CM_BUILD","Wrapper","LazyLoad","once","offset","EntranceSingleRight","placeholderChildren","child","scrollTo","ele","scrollIntoView","behavior","ExpandedTextAccordionItem","uid","innerRef","ref","data-uid","RichTextStyle","TextAccordionItem","itemId","displayAsLink","expandedAccordionItems","rendering","useState","smUp","setSmUp","isSmUp","matchMedia","breakpointsBootstrap","matches","useOnWindowResize","items","useMemo","placeholders","item","createRef","URL","hash","substring","anchorsec","visibleSection","setVisibleSection","observer","IntersectionObserver","entry","target","isIntersecting","rootMargin","observe","unobserve","useVisibleSection","handleClick","Sticky","TitleButton","active","onClick","IconWrapper","ArrowRight","button","FacebookPixel","facebookPixelId","enableFacebookPixel","componentTopMargin","size","xsmallStyling","smallStyling","largeStyling","StyledFooter","footer","Columns","Effects","Underline","UnderlineHover","SubFooter","TermsText","DisclaimerText","ImageRow","Footer","aria-label","alt","LogoWhite","className","ErrorMessage","message","CustomIconWrapper","ErrorRed","ThankYouMessage","Confirm","ButtonLink","submitFormData","formConfig","formData","phone","indexOf","modifiedPhone","cpr","modifiedCPR","arrayOfFields","element","getElementsByName","fieldname","fieldlabel","fieldvalue","maptoegain","includeinmailboxemail","formBody","email","fullname","fname","firstname","dsid","egainDsid","mailboxId","language","version","emailsubject","formfieldsdata","formfields","fetch","apiUrl","headers","Accept","sc_apikey","apiKey","mode","body","then","response","json","catch","TextAreaWrapper","Label","label","hasValue","InnerTextArea","textarea","possumGrey","AutoTextArea","errorMessage","autosize","onChange","maxLength","required","id","sethasValue","stopPropagation","scrollHeight","rows","htmlFor","CheckboxWrapper","CheckboxInput","attrs","Checkbox","rest","FormFooter","trackingChangeHandler","setPreviousPage","page","fileList","step1Label","step2Label","step3Label","setSubmit","BoxWrapper","paddingTop","_","paddingBottom","ColText","Text","ButtonGroupDiv","data-testid","span","smDown","ButtonGroup","FormLayout","infoDescription","formTitle","InfoDescription","FormTitle","rdBlackTint2","FormRow","CprRegex","NameRegex","NumberRegex","PartnerRegex","PhoneRegex","BUSINESS_TOPIC_OPTIONS","PRIVATE_TOPIC_OPTIONS","WhiteBg","LabelHeader","Typography","CallMeForm","onSubmitData","privateMailboxId","businessMailboxId","partialMailSubject","TOPIC_OPTIONS","setTopic","mailBoxId","setmailBoxId","schema","Yup","shape","topic","getSchema","form_product","form_type","form_name","searchParams","toLowerCase","initialValues","isExistingCustomer","comment","validationSchema","errors","touched","handleChange","showExistingCustomer","noValidate","as","currentTarget","options","hasBorder","isBold","data-maptoegain","data-egainfield","data-label","data-includeinmailboxemail","data-stringvalue","checked","dataset","stringvalue","layout","FormCallMe","setPage","showModal","setShowModal","open","handleClose","ariaCloseLabel","overlayColor","subject","fileIdData","attachId","myHeaders","Headers","append","valueObj","fieldObj","techDetailsObj","fileIdObj","finalMailBody","raw","FldNavnH","fromMailBox","FldSendTo","toMailBox","FldSubjH","FldText","FileId","DSId","DocumentFile0","Language","AttachId","redirect","ErrorId","attachFileGetUploadParams","hasCompress","FldHasCompress","removeFile","file","status","responseObj","parse","isSuccess","handleTranslation","i18next","SitecoreRichText","Page0Choose","goToNextPage","callMeFormURL","modalContactHeadLabel","modalContactCPRLabel","modalFooterButtonLabel","modalContactFooterLabel","modalContactPhoneLabel","modalFooterOpenLabel","modalFooterTimingLabel","toggleModal","modalContent","ModalContainer","ModalTextRed","ModalTextGreen","hasCpr","TextHeader","RadioButtonWrapper","RadioButtonBoxGroup","dobDay","dobMonth","dobYear","day","month","centuryChar","fullYear","year","givenDate","cprDate","Date","modifiedMonth","getMonth","modifiedDay","getDate","modifiedDate","getFullYear","weights","sum","topicList","Page1Form","goToPrevPage","setFormData","setSelectedMailBox","mailToBoxList","setMailSubject","selectedTopic","isFromCVR","cprValidation","lastname","casenumber","adviser","mailTopicList","setFieldValue","ErrorDiv","format","FieldContainer","TooltipWrapper","Question","heading","content","red40","Page2Upload","setFileList","setAttachId","onSubmitFiles","fileInputLabel","setFileInputLabel","getWidth","removeEventListener","getUploadParams","onRemove","modifiedList","onRemoved","files","fullscreenOnWindowDragEnter","maxSize","maxFiles","accept","multiple","formDataFileKey","onUploadSuccess","percent","ActionResponse","hideSubmitButton","textBeforeInput","textInputBox","textInputButton","textAfterInput","textBeforeFiles","textSubmit","textOverlay","errorTexts","fileData","FormCprUpload","mailToListDetails","selectedMailBox","mailSubject","aria-live","CVRConfirmation","isCPR","setCPR","modalContactCVRLabel","hasCvr","setCheckedValue","CVRForm","cvr","companyName","contactPerson","SectionTitle","CVRUpload","FormCvrUpload","GDPRForm","FormGdpr","tablet","RadioButtonCantainerSmall","RadioButtonCantainerBig","NemKontoForm","custtype","setCusttype","iscompany","when","is","val","otherwise","lname","setTimeout","getElementById","click","FormNemKonto","handleSubmit","submitFormDataV4","IncludePageUrlInMail","webformname","webFormName","formattedData","FormData","statusCode","PpiForm","FormPpi","webformName","UnsubscribeForm","housenumber","streetname","postnumber","by","enableReinitialize","floor","side","FormUnsubscribe","DEMO_DATA","megaMenu","isCurrent","topMenu","doGoogleSearch","query","payload","startindex","googleResults","resultsPromise","Promise","resolve","reject","results","hits","currentPage","startIndex","queries","nextPage","searchInformation","totalResults","mappedResults","googleResult","thumbnailUrl","htmlTitle","htmlSnippet","fileFormat","searchTerms","request","Header","googleApiUrl","feedbackAllowed","Functional","context","route","searchResults","setSearchResults","searchQuery","setSearchQuery","customComponent","setCustomComponent","cacheSearchResults","sessionStorage","setItem","NoResults","ApiError","ApiErrorWrapper","Action","Broke","Spinner","LoadMoreSpinner","loginLinks","bookMeetingText","bookMeetingLink","hideStickybookMeeting","bookMeetingTrackingId","calculateText","calculateLink","calculatorTrackingId","areaLinks","menuLinks","logoImage","logoLink","backLink","backText","feedbackContent","mobileCtaLink","mobileCtaText","hasSearchButton","handleSearch","trackingHits","Number","doc","activeElement","blur","handleResultClick","res","handleSearchButtonClick","showing","cachedResults","getItem","navigationType","performance","getEntriesByType","isNavigation","previousQuery","removeItem","handleLoadMoreResults","startFrom","accumulate","resultData","searchOverlayComponent","searchLabels","searchInputLabel","hitsLabel","showMoreButtonLabel","loadMoreStylePagination","Headline","Languages","ConvertDate","dateValue","dateFormat","dateParseVal","localDate","dayjs","locale","IconDownload","xmlns","width","d","fill-rule","stroke","stroke-linecap","stroke-linejoin","stroke-width","DateDiv","InnerDateDiv","HeroDefault","smallHeader","SelectSingleField","ColumnsBox","ie11","columns","hasColumns","showColumns","ColumnLink","Icon","ColumnText","UnderLinedText","linkAnimatedUnderlineStyle","linkAnimatedUnderlineStyleHover","StyledText","HeroFrontpageColumnItem","HeroProduct","EditorWrapper","EmptyOutline","MinHeight","HtmlRenderer","htmlField","renderedHtmlField","ImageHeader","imageSize","CoverImage","backgroundImage","TextContainer","TextOverlayBox","minHeight","grey90","ImageMaxHeightContainer","ImageBlock","Image","Description","ImageLeft","ImageRight","TABLE_FIELDKEYS_REALKREDIT_1","TABLE_FIELDKEYS_REALKREDIT_2","TABLE_FIELDKEYS_BANKLOAN","TABLE_FIELDKEYS_OVERVIEW","getQueryString","URLSearchParams","getQueryFloatOrNull","parseFloat","useInputsStateFn","loanType","setLoanType","propertyType","setPropertyType","ownerCategory","setOwnerCategory","propertyValue","setPropertyValue","ownPayment","setOwnPayment","viewType","setViewType","activeLoan","setActiveLoan","selectedLoan","setSelectedLoan","propertyCategory","setPropertyCategory","ownPaymentVisible","setOwnPaymentVisible","tableFieldSet1Keys","setTableFieldSet1Keys","tableFieldSet2Keys","setTableFieldSet2Keys","wantedLoanAmount","setWantedLoanAmount","remainingDebt","setRemainingDebt","hasError","setError","submitCounter","setSubmitCounter","recalculate","setRecalculate","loanChanged","setLoanChanged","useInputsState","useBetween","sleep","ms","mapAmortisationData","array","termDate","find","months","startsWith","grossPayment","netPayment","instalment","interest","administrationFeeAmount","bondDebt","cashDebt","preparePayload","loan","inputs","ltv","property","maxLTV","basic","wantedAdditionalAmount","calculationType","category","product","maturity","years","businessCommercialMaturity","updatePayload","apiResponse","callApi","ok","Errors","table","requestApi","localData","loanAmount","netProceedsAmount","loanKeyFigures","mapResponse","monthlyGrossPaymentYearOne","payment","monthlyNetPaymentYearOne","calculatedTimeToMaturityYears","calculatedTimeToMaturityMonths","rateType","interestRate","interestOnlyYearsStart","interestOnly","interestOnlyYears","interestOnlyMonths","loanToValuePercentage","bankloan","ownpayment","paymentsPerYear","principalAmount","interestRatePercentage","debtorInterestRate","annualPercentageRate","totalRepaymentAmount","numberOfPayments","amortisation","weightedBondPrice","bonds","totalAdministrationFee","totalInterest","feeLoanCaseCosts","costsTotal","taxRate","customer","appliedTaxRate","cashFlow","firstYearInterestOnlyMonthlyPayment","firstYearInstalmentMonthlyPaymentGross","firstYearWithOutInstalmentMonthlyPaymentNet","firstYearInstalmentMonthlyPaymentNet","isInterestOnlyOption","instalmentTerms","term","isNaN","firstYearOfInstalmentPayment","firstYearOfInstalmentPaymentNet","x","loanProvider","paymentTotalAdministrationFee","settlementFeeAmount","loanCaseFee","registrationHandlingFee","variableRegistrationFee","fixedRegistrationFee","originationFeeAmount","formatAsCurrency","decimals","trailingZeros","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","formatToParts","p","useSettingsStateFn","setSettings","setApiUrl","useSettingsState","CalculatorTooltipTable","suffix","Table","CalculatorTooltipAdministrationFee","isPrivateCalculator","calculatorType","calculatorTooltipDetails","feeAmount","splice","isFromOverlay","totalCost","costTable","minWidth","row","rowData","LabelColumn","Column","bordered","firstRowIsHead","striped","convertToTableItems","maturityYears","propertyDepositDisclaimer","fieldKey","inputType","wantInterestOnlyCoupon","tooltip","cibor6","newLoan","cloneDeep","mappedData","tableItems","amortisationData","stickyValues","modifiedNetProceeds","refinancingFrequency","refinancing","ValidateNetProceedsAmountTop","errorMsg","isHolidayHome","displayType","displayAsLending","showIOSlider","validate","checkError","flexkort","flexType","flexlaank","maximumYears","desiredPaymentAmount","toFixed","flexlaant","snapDateToQuarter","date","add","toDate","formatPayloadDate","isBusinessDay","holidays","newYearsEve","UTC","newYearsDay","xMasEve","xMasDay","secondXmasDay","constitutionDay","easterDay","C","N","K","I","J","L","M","D","getEaster","maundryThursday","subtract","goodFriday","easterMonday","greatPrayerDay","ascensionDay","ascensionDayPlus1","whitSunday","whitMonday","getBankHolidays","getDay","getNextAvailableBusinessDay","minimumYears","today","calculationDate","changeOption","desiredDebtAtExpiry","desiredInterestOnlyStartDate","firstRun","maxInterestOnlyLTV","calculatedPaymentAmountPerMonth","calculatedDebtAtExpiry","calculatedInterestOnlyToMaturityStartDate","calculationDateUsed","nextTermDate","thisQuater","usedCalculationDate","interestOnlyStartYear","interestOnlyYearsEnd","approvedDebtAtExpiry","interestOnlyTerms","firstYearOfInterestOnlyPayment","maxInterestOnlyYears","minPayment","minMonthlyPayment","debtAtExpiryOption","interestOnlyPeriodStartOption","paymentAmountOption","nextTermDatePlusYears","amortEndDate","oldDesiredPaymentAmount","newProductKey","productKey","approvedDebtAtExpiryPercentage","rateText","flexlife","kontantlaan","obligationslaan","performCalculation","useLoansStateFn","loans","setLoans","now","lastCalculationDate","setLastCalculationDate","addLoan","removeLoan","loanIndex","setLoan","doCalculation","loanData","calculateSingleLoan","calculateLoansFromScratch","all","dataFromSettings","setLoanTypeAndCalculate","setLoanPayloadAndCalculate","isStatic","loanFromArray","setInitialLoansFromSettings","initialLoans","loanKeys","queryTypes","defaultLoans","isArray","allowedLoans","getInitialLoansFromQueryOrSettings","setLoansAfterChange","loansCount","useLoansState","CalculatorDetailsLinks","displayModal","ArrowLink","ArrowLongRight","lgDown","MAX_LOANS_MOBILE","grey20","CalculatorInputsValidationMessage","showLendingType","showError","isValid","showOwnPaymentNotice","errorCode","checkText","ownPaymentNotice","grey80","CalculatorInputs","submitButtonRef","urlParam","setURLParam","loanList","ownPaymentProcentage","showPropertyTypesDropdown","validationResult","modifiedWantedLoanAmount","minimumLoanAmount","maximumLoanAmount","maxmumLoanAmount","validateInputs","defaultPropertyTypeTypeSet","ownerCategorySet","propertyValuePropertyText","ownPaymentPropertyText","propertyValuePlaceholder","wantedLoanAmountPlaceholder","remainingDebtPlaceholder","ownPaymentPlaceholder","loanTypes","onLoanTypeChange","propertyTypesInSettings","propertyTypes","propertyTypesInFirstDropdown","uniq","onPropertyTypeChange","loanValue","firstOwnerCategory","newValue","calculator_info","loan_calculate_type","newOwnPayment","hasType","ownerCategories","onOwnerCategoryChange","onPropertyValueChange","onLoanAmountChange","onOwnPaymentChange","onRemainingDebtChange","checkDecimal","shiftKey","preventDefault","onBlurChange","newVal","onLoanAmountBlurChange","modifiedPropertyValue","onRemainingDebtBlurChange","newRemainingDebt","onSubmitHandler","FormContainer","InputColumn","StaticValue","Input","thousandSeparator","decimalSeparator","decimalScale","onKeyPress","onValueChange","floatValue","placeholder","onBlur","SubmitButton","form","BoxShadow","medium","grey50","ModalHeader","CalculatorModal","showData","setShowData","setValue","activeYear","setActiveYear","selectedTab","setTab","excelData","showCashDebt","tableHeader","useAmortExcelData","closeModal","dropdownOptions","amortisationDataTable","isActiveYear","cellRender","cursor","fontSize","lineHeight","m","fullscreen","isDark","newActiveloanValue","newActiveloanIndex","selectedIndex","newActiveloan","StyledDiv","isDarkTheme","top","workBook","Sheets","Ydelsesforløb","utils","aoa_to_sheet","cols","SheetNames","excelBuffer","write","bookType","Blob","yyyy","mm","dd","formattedToday","filename","downloadURL","createObjectURL","downloadLink","createElement","appendChild","download","removeChild","Download","xs","firstColumnIsSticky","isFromDialog","tableHeaderIsSticky","CalculatorStickyBar","showBeforeTax","setShowBeforeTax","toggleView","buttons","Buttons","UpIcon","Chiron","DownIcon","mobileLabelColumn","show","up","colSpan","borderColor","grey60","desktopLabelColumn","Title","borderBottom","renderLoan","beforeTax","afterTax","loansRendered","StyledContainer","Bar","grey30","grey40","getFieldKeysToDisplay","fieldKeys","fieldKeysInUse","flatMap","l","CalculatorDropdownField","tableItem","onChangeValue","prevProps","nextProps","CalculatorInputField","inputFieldRef","additionalText","showText","setShowText","IconButton","Alert","marginRight","Edit","CalculatorSliderField","Value","selectSuffix","selectWidth","breakpoint","CalculatorStaticField","TooltipContainer","autoWidth","placement","CalculatorTableBodyCell","loanArrayIndex","handleValueChange","delay","debounce","newPayload","currentTableItem","hasOwnProperty","renderSwitch","CalculatorTableBodyLabelCell","labelPropertyText","businessHelpText","lendingHelpText","labelText","businessLabelText","lendingLabelText","modifiedLabeltext","helpText","checkHelpText","TableLeftLabelColumn","TableLeftLabelColumnLabel","data-fieldlabel","CalculatorTableErrorMessage","Content","NoConnection","CalculatorTableHeadCell","showRemoveButton","onRemoveLoanClick","onLoanSelected","supportedPropertyTypes","supportedPropertyType","elem","HeaderCellValue","CloseLink","Close","grey0","CalculatorTableDesktop","showHeader","tableName","tableSlogan","fieldsKeysToDisplay","desktopTableData","headerRow","slice","cellValueRender","fieldIndex","bodyRow","rowSpan","verticalAlign","background","tableItemForLoan","TableContainer","CalculatorAddLoanButtonMobile","AddButton","CalculatorTableMobile","canAddLoan","mobileTableData","padding","prefix","CalculatorTablesContainer","TablesContainer","DesktopTables","isFieldsDisplayed","setFields","ignoredFieldKeys","fieldsToIgnore","allowedFieldSet1Keys","includes","allowedFieldSet2Keys","finalFieldSet1Keys","finalFieldSet2Keys","Block","MobileTables","marginLeft","CalculatorTabs","showTabs","showBankloanTab","disableAddButton","addButtonTracker","LoanCalculator","settingsRef","calculator_type","calculator_name","prevTrackingState","calculator_amount","tables","scrollToFocusArea","LoanCalculatorInputsOnly","smallTopMargin","calculatorPageUrl","ExperienceEditorCarousel","newsItemsHorizontal","hasNewsItems","showNewsItems","ListItem","StyledImage","NewsListHorizontalItem","forceMobileStyle","HorizontalLines","List","BottomShadow","newsItemsVertical","ListItemText","ListItemDate","NewsListVerticalItem","section","Overlay","Features","FeatureItem","ProductFeature","skew","groupDrillSort","groupKeys","keyIndex","resultSet","obj","validationCheck","gk","sortGroup","desc","sorted","sort","firstObj","secondObj","reverse","groupsArr","groupKey","sortResult","filterDataOnPrices","fromPrice","toPrice","offerprice","filterClosedBonds","useFormatCashLoan","useFetchProps","inputdata","showAllLoans","formattedAPIData","setFormattedAPIData","cashLoansAPIResponse","filteredData","cashloandemodata","dataToProcess","formatCashLoanData","useFormatFixedLoan","useFormatFixedLoanProps","isBusinessPage","fixedLoansAPIResponse","demoData","closedBondsdata","formatFixedLoanData","useFormatVariableLoan","useFormatVariableLoanProps","sortOrder","variableLoanAPIResponse","inputsortOrder","b","productOne","productTwo","formatVariableLoanData","useLastUpdateTimeStamp","APIResponseData","lastModified","setLastModified","isDown","TableCellRender","cell","arrowDirection","ArrowUp","TableCashLoan","tableData","date1","interestRates","date2","date3","alignVertically","borderLeft","sortable","numberOfTermsWithoutRepayment","bondname","termToMaturityYears","nominelInterestRate","isinCode","ClosedBond","textColor","underlineColorPrimary","offerrate","LinkAnimatedUnderline","TableClosedBonds","closedBondPriceDate","redemptionDate","datearray","newdate","formatDate","prices","price","TableFastforrentet","TableVariabel","bondName","RatesTables","setSelectedTab","tabValue","setTabValue","tracking","setTracking","loading","setLoading","setShowAllLoans","setIsBusinessPage","baseURL","setBaseURL","loanSettings","variableLoanSortOrder","cashLoanAPIResponse","setCashLoanAPIResponse","demodata","fixedLoanAPIResponse","setFixedLoanAPIResponse","setVariableLoanAPIResponse","formatVariableLoanProps","formatCashLoanProps","formatedVariableLoanData","formatedCashLoanData","lastUpdate","lastUpdateVariableLoan","lastUpdateCashLoan","hostname","hosturl","fetchData","success","apiurl","getVariableLoans","getCashLoansData","openNasdaqSite","newWindow","isinObject","shortName","encodeURIComponent","isinShortCode","fondsKodeShortName","assign","LoadingWrapper","ButtonWrapper","ShowAllWrapper","Remove","Add","TextWrapper","LastUpdateWrapper","LastUpdateBox","TextBelowTable","horizontalPosition","threshold","warmGrey","large","HorizontalRule","hr","richTextWidth","colsFromPercent","columnsXl","columnsMd","ShortcutLink","SurveyInit","enableSurvey","showTextBelowTableHeaders","sortableColumns","firstColumnWidth","allColumnsMinimumWidth","cellAlignment","linkInLastRow","linkTextInLastRow","unescapeText","cells","cellsArr","valueTrimmed","unescape","parseExcelData","cellValueRenderFunction","rowIndex","columnIndex","iconCheckmark","isLastRow","isFirstRow","addSuffixToHeader","column","isFirstColumn","alignHorizontally","accordionItems","titleType","components","Map","componentFactory","Cards","ColorCards","ExpandedTextAccordion","HeroFrontpage","NewsListHorizontal","NewsListVertical","TextAccordion","setGridConfiguration","gutterWidth","AppSetup","theme","contextFactory","CookiePanel","arrCookieConsent","init","innerHTML","level","time","processCookieDetails","EXT_SCRIPT_URL","EXT_CONFIG_URL","EXT_DATA_URL","defaultConfig","player","ContentParser","config","dependencies","cookieConsentLevels","contextSettings","handlersOnResize","useParsers","parser","onResize","throttle","resizeThrottle","parsers","arrVideoEl","accountId","goBrain","getGoBrain","processVideos","load","err","videoEl","setContainerHeight","arrConfig","innerText","videoId","sharing","create","getEmbedSettings","elW","offsetWidth","elH","autoplay","moduleSettings","Controls","enabled","showTitle","Analytics","cookies","repeat","EditorIncludes","rel","media","EditorRow","ExpEditorRow","LabelDark","LabelGrey","whiteTwo","LayoutBackground","greyPattern","Monitoring","StyledLinkAnimatedUnderline","underlineColorSecondary","WithConditionWrapper","Layout","Fragment","Helmet","NotFound","site","ssrInitialState","RouteHandler","state","notFound","routeData","defaultLanguage","sitecore","setSitecoreContext","componentIsMounted","languageIsChanging","updateLanguage","updateRouteData","sitecoreRoutePath","sitecoreRoute","defaultAppRoute","fetchOptions","layoutServiceConfig","host","sitecoreApiHost","querystringParams","sc_lang","sitecoreApiKey","fetcher","dataApi","fetchRouteData","getRouteData","lang","setState","newLanguage","i18n","changeLanguage","forceUpdate","previousProps","existingRoute","newRoute","isExperienceEditorActive","Component","routePatterns","AppRoot","path","Router","graphQLClient","routeRenderFunction","client","routePattern","renderFunction","ReactDOM","__JSS_STATE__","ssrRawJson","hydrate","dictionary","initialGraphQLState","APOLLO_STATE","endpoint","ssr","initialCacheState","createPersistedQueryLink","concat","BatchHttpLink","uri","credentials","cache","InMemoryCache","fragmentMatcher","IntrospectionFragmentMatcher","introspectionQueryResultData","ApolloClient","ssrMode","ssrForceFetchDelay","restore","GraphQLClientFactory","graphQLEndpoint","defaultLang","viewBag","defaultDic","debug","lng","fallbackLng","useCookie","interpolation","escapeValue","resources","translation","use","initReactI18next","dictionaryServicePath","jssAppName","backend","loadPath","parsedData","phrases","fetchBackend","rootElement","BrowserRouter"],"mappings":"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","file":"static/js/main.bd985c01.chunk.js","sourcesContent":["import { SitecoreContextReactContext } from '@sitecore-jss/sitecore-jss-react';\r\nimport { useContext } from 'react';\r\n\r\nexport const useSitecoreContext = () => {\r\n  return useContext(SitecoreContextReactContext).getSitecoreContext();\r\n};\r\n","import { ConsentLevel, SearchResultType, useCookieConsent } from 'db-npm-rdui';\r\nimport { useCallback, useLayoutEffect, useRef } from 'react';\r\nimport { LaunchData } from './launchDataType';\r\n\r\ntype FormikHandlerFunction = (e: React.ChangeEvent<any>) => void;\r\ntype TrackingHandlerFunction = (e: React.ChangeEvent<any>, originalHandler: FormikHandlerFunction) => void;\r\ntype AdobleTrackingFunction = (data: string, customEvent?: any) => void;\r\ntype SetLaunchDataFunction = (data: LaunchData) => void;\r\ntype GetLaunchDataFunction = (key: keyof LaunchData) => LaunchData[keyof LaunchData];\r\ntype CleanLaunchDataFunction = (keyNames: string[]) => void;\r\ntype TrackNavigatedToStep = (stepName: string) => void;\r\ntype UpdatePageName = (tabName: string) => void;\r\ntype TrackCalculatorSuccess = (data?: LaunchData) => void;\r\ntype TrackCalculatorFailed = (service_msg?: string) => void;\r\ntype TrackCalculatorReCalculation = (data?: LaunchData) => void;\r\ntype TrackCalculatorCustomEvent = (data?) => void;\r\ntype TrackSearchPerformed = (\r\n  search_term: LaunchData['search_term'],\r\n  search_results: LaunchData['search_results']\r\n) => void;\r\ntype TrackSearchResultClick = (result: SearchResultType) => void;\r\ntype TrackSearchLoadMoreResults = (pageTitle: string, pageNumber: number | string) => void;\r\ntype TrackSearchOpened = (pageTitle: string) => void;\r\n\r\n/**\r\n * @param {LaunchData} launchData Optinal object containing data to be tracked when tracking function is called.\r\n */\r\nexport function useAdobeTracking(\r\n  launchData?: LaunchData\r\n): {\r\n  track: AdobleTrackingFunction;\r\n  setLaunchData: SetLaunchDataFunction;\r\n  getLaunchData: GetLaunchDataFunction;\r\n  cleanLaunchData: CleanLaunchDataFunction;\r\n  trackFormSubmitSuccess: Function;\r\n  trackFormSubmitFail: Function;\r\n  trackNavigatedToStep: TrackNavigatedToStep;\r\n  updatePageNameFromTab: UpdatePageName;\r\n  onFormInteraction: TrackingHandlerFunction;\r\n  trackCalculatorInteraction: Function;\r\n  trackCalculatorSuccess: TrackCalculatorSuccess;\r\n  trackCalculatorReCalculation: TrackCalculatorReCalculation;\r\n  trackCalculatorFailed: TrackCalculatorFailed;\r\n  trackCalculatorCustomEvent: TrackCalculatorCustomEvent;\r\n  trackSearchOpened: TrackSearchOpened;\r\n  trackSearchPerformed: TrackSearchPerformed;\r\n  trackSearchLoadMoreResults: TrackSearchLoadMoreResults;\r\n  trackSearchResultClick: TrackSearchResultClick;\r\n} {\r\n  enum TrackingTypes {\r\n    FORM_TRACKING_TYPE = 'form interaction',\r\n    SEARCH_TRACKING_TYPE = 'internal_search',\r\n    PAGE_VIEW_TRACKING_TYPE = 'page_view',\r\n  }\r\n\r\n  const changeEventFired = useRef(false);\r\n  const initiated = useRef(false);\r\n  const cookieConsent = useCookieConsent();\r\n\r\n  const track: AdobleTrackingFunction = useCallback(\r\n    (data, customEvent) => {\r\n      if (!cookieConsent.isAllowed(ConsentLevel.Statistics)) return;\r\n      const w = window as any;\r\n      if (w && w._satellite && w._satellite.track) {\r\n        if (!customEvent) w._satellite.track(data);\r\n        else w._satellite.track(data, customEvent);\r\n      }\r\n    },\r\n    [cookieConsent]\r\n  );\r\n\r\n  const setLaunchData: SetLaunchDataFunction = useCallback((data) => {\r\n    const w = window as any;\r\n    if (w && w.launch_data) {\r\n      w.launch_data = { ...w.launch_data, ...data };\r\n    } else {\r\n      console.warn('error setting launch data: launch_data is not present');\r\n    }\r\n  }, []);\r\n\r\n  const getLaunchData: GetLaunchDataFunction = useCallback((key) => {\r\n    const w = window as any;\r\n    if (w && w.launch_data) {\r\n      return w.launch_data[key];\r\n    }\r\n  }, []);\r\n\r\n  const cleanLaunchData: CleanLaunchDataFunction = useCallback((keyNames) => {\r\n    const w = window as any;\r\n    if (w && w.launch_data) {\r\n      Object.keys(w.launch_data).forEach((k) => {\r\n        keyNames.forEach((keyName) => {\r\n          if (k.search(keyName) >= 0) delete w.launch_data[k];\r\n        });\r\n      });\r\n    }\r\n  }, []);\r\n\r\n  // Form tracking functions\r\n  const onFormInteraction: TrackingHandlerFunction = (e, originalHandler) => {\r\n    if (!changeEventFired.current) {\r\n      changeEventFired.current = true;\r\n      const formStatus = 'initiated';\r\n      setLaunchData({ form_status: [formStatus], form_step: formStatus });\r\n      track(TrackingTypes.FORM_TRACKING_TYPE);\r\n    }\r\n    originalHandler(e);\r\n  };\r\n\r\n  const trackFormSubmitSuccess = (): void => {\r\n    setLaunchData({ form_status: ['completed', 'view step'] });\r\n    track(TrackingTypes.FORM_TRACKING_TYPE);\r\n  };\r\n\r\n  const trackFormSubmitFail = (): void => {\r\n    setLaunchData({ form_status: 'failed' });\r\n    track(TrackingTypes.FORM_TRACKING_TYPE);\r\n  };\r\n\r\n  const trackNavigatedToStep: TrackNavigatedToStep = (stepName) => {\r\n    setLaunchData({ form_step: stepName, form_status: ['view step'] });\r\n    track(TrackingTypes.FORM_TRACKING_TYPE);\r\n  };\r\n\r\n  //Kurser Renter tracking function\r\n\r\n  // updating pagename on clicking on tab\r\n  const updatePageNameFromTab: UpdatePageName = (tabName) => {\r\n    setLaunchData({ page_name: tabName });\r\n    track('page_view');\r\n  };\r\n\r\n  // Calculator tracking functions\r\n\r\n  // Only send interaction tracking event once\r\n  const trackCalculatorInteraction = useCallback(() => {\r\n    if (getLaunchData('calculator_status') === 'loaded') {\r\n      setLaunchData({ calculator_status: 'initiated' });\r\n      track('calculator interaction');\r\n    }\r\n  }, [getLaunchData, setLaunchData, track]);\r\n\r\n  const trackCalculatorCustomEvent = useCallback(\r\n    (data) => {\r\n      track('custom event', data);\r\n    },\r\n    [track]\r\n  );\r\n\r\n  const trackCalculatorSuccess = useCallback(\r\n    (data) => {\r\n      setLaunchData({ calculator_status: 'completed' });\r\n      if (typeof data !== 'undefined') setLaunchData(data);\r\n      track('calculator interaction');\r\n    },\r\n    [setLaunchData, track]\r\n  );\r\n\r\n  const trackCalculatorReCalculation = useCallback(\r\n    (data) => {\r\n      setLaunchData({ calculator_status: 're-calculated' });\r\n      if (typeof data !== 'undefined') setLaunchData(data);\r\n      track('calculator interaction');\r\n    },\r\n    [setLaunchData, track]\r\n  );\r\n\r\n  const trackCalculatorFailed = useCallback(\r\n    (service_msg) => {\r\n      if (!service_msg) service_msg = 'Unknown error';\r\n      setLaunchData({ calculator_status: 'failed', service_msg });\r\n      track('calculator interaction');\r\n    },\r\n    [setLaunchData, track]\r\n  );\r\n\r\n  // Search tracking functions\r\n  const trackSearchOpened: TrackSearchOpened = (pageTitle) => {\r\n    cleanLaunchData(['calculator_']);\r\n    setLaunchData({\r\n      page_name: `Search | Realkredit Danmark | ${pageTitle}`,\r\n      page_type: 'search page',\r\n      search_area: 'RD',\r\n      search_type: 'google',\r\n    });\r\n    track(TrackingTypes.PAGE_VIEW_TRACKING_TYPE);\r\n  };\r\n\r\n  const trackSearchPerformed: TrackSearchPerformed = (search_term, search_results) => {\r\n    cleanLaunchData(['calculator_']);\r\n    setLaunchData({ search_area: 'RD', search_type: 'google', search_term, search_results });\r\n    track(TrackingTypes.SEARCH_TRACKING_TYPE);\r\n  };\r\n\r\n  const trackSearchLoadMoreResults: TrackSearchLoadMoreResults = (pageTitle, pageNumber) => {\r\n    cleanLaunchData(['calculator_', 'search_term']);\r\n    setLaunchData({\r\n      page_name: `Search | Realkredit Danmark | ${pageTitle} - page ${pageNumber}`,\r\n      page_type: 'search page',\r\n      search_area: 'RD',\r\n      search_type: 'google',\r\n    });\r\n    track(TrackingTypes.SEARCH_TRACKING_TYPE);\r\n  };\r\n\r\n  const trackSearchResultClick: TrackSearchResultClick = (result) => {\r\n    cleanLaunchData(['calculator_']);\r\n    setLaunchData({ search_result_clicked: result.title });\r\n    track('search result clicked');\r\n  };\r\n\r\n  useLayoutEffect(() => {\r\n    if (typeof launchData === 'undefined' || initiated.current === true) return;\r\n    initiated.current = true;\r\n    setLaunchData(launchData);\r\n  }, [launchData, setLaunchData]);\r\n  return {\r\n    track,\r\n    setLaunchData,\r\n    getLaunchData,\r\n    cleanLaunchData,\r\n    trackFormSubmitSuccess,\r\n    trackFormSubmitFail,\r\n    trackNavigatedToStep,\r\n    updatePageNameFromTab,\r\n    onFormInteraction,\r\n    trackCalculatorInteraction,\r\n    trackCalculatorSuccess,\r\n    trackCalculatorFailed,\r\n    trackCalculatorReCalculation,\r\n    trackCalculatorCustomEvent,\r\n    trackSearchOpened,\r\n    trackSearchPerformed,\r\n    trackSearchLoadMoreResults,\r\n    trackSearchResultClick,\r\n  };\r\n}\r\n","export * from './launchDataType';\r\nexport * from './useAdobePageLoadTracking';\r\nexport * from './useAdobeTracking';\r\nexport * from './useAdobeTrackingData';\r\nexport * from './useContextEnvironment';\r\nexport * from './useContextSettings';\r\nexport * from './useIsEditor';\r\nexport * from './useSitecoreContext';\r\n","import { useLayoutEffect } from 'react';\r\n\r\nexport function useAdobePageLoadTracking(viewName: string) {\r\n  useLayoutEffect(() => {\r\n    const w = window as any;\r\n\r\n    if (w && w.launch_data) {\r\n      // Make a breadcrumb array from the current location.pathname split by forward-slash\r\n      const breadcrumbArray: string[] = (w.location?.pathname || '').split('/');\r\n      // Remove empty strings from the array, eg. if the path ends with a forward-slash\r\n      const breadcrumbs = breadcrumbArray.filter((i) => !!i);\r\n\r\n      // Don't override global launch_data object - TODO: check with team tracking if the date coming is alright using an object that's not overridden\r\n      w.launch_data = {\r\n        ...w.launch_data,\r\n        page_name: viewName,\r\n        breadcrumbs,\r\n      };\r\n      if (w._satellite && w._satellite.track) {\r\n        w._satellite.track('page_view');\r\n      }\r\n\r\n      console.log('useAdobePageLoadTracking: launch_data updated:', w.launch_data);\r\n    } else {\r\n      console.warn('useAdobePageLoadTracking: launch_data not present');\r\n    }\r\n  }, [viewName]);\r\n}\r\n","import { useLayoutEffect } from 'react';\r\n\r\nexport function useAdobeTrackingData(metaTitle, trackingAllowed) {\r\n  useLayoutEffect(() => {\r\n    const w = window as any;\r\n    let dataTrackingDetails = document.querySelectorAll('a[data-tracking-id]');\r\n\r\n    if (trackingAllowed) {\r\n      dataTrackingDetails.forEach((el, index) => {\r\n        if (!el.getAttribute('data-tracked')) {\r\n          el.addEventListener('click', function () {\r\n            w._satellite.track('custom event', {\r\n              event: el.getAttribute('data-tracking-id'),\r\n            });\r\n            el.setAttribute('data-tracked', '');\r\n          });\r\n        }\r\n      });\r\n    }\r\n  }, [metaTitle, trackingAllowed]);\r\n}\r\n","import { useSitecoreContext } from './useSitecoreContext';\r\n\r\nexport enum EnvironmentName {\r\n  Dev = 'DEV',\r\n  Test = 'TEST',\r\n  Syst = 'SYST',\r\n  Prod = 'PROD',\r\n}\r\n\r\nexport enum EnvironmentRole {\r\n  ContentManagement = 'CM',\r\n  ContentDelivery = 'CD',\r\n}\r\n\r\nexport interface ContextEnvironment {\r\n  name: string;\r\n  role: string;\r\n}\r\n\r\nexport const useContextEnvironment = (): ContextEnvironment => {\r\n  const { environment } = useSitecoreContext();\r\n\r\n  return {\r\n    name: environment?.name || EnvironmentName.Prod,\r\n    role: environment?.role || EnvironmentRole.ContentDelivery,\r\n  };\r\n};\r\n","import { useSitecoreContext } from './useSitecoreContext';\r\n\r\nexport interface ContextSettings {\r\n  googleSiteVerification: string;\r\n  facebookDomainVerification: string;\r\n  videoAccountId: string;\r\n  cookiePolicyEnabled: boolean;\r\n  cookieBannerDisabled: boolean;\r\n  monitoring: ContextMonitoring;\r\n}\r\n\r\ninterface ContextMonitoring {\r\n  appKey: string;\r\n  beaconUrl: string;\r\n}\r\n\r\nexport const useContextSettings = (): ContextSettings => {\r\n  const { settings } = useSitecoreContext();\r\n\r\n  return {\r\n    googleSiteVerification: settings?.googleSiteVerification,\r\n    facebookDomainVerification: settings?.facebookDomainVerification,\r\n    videoAccountId: settings?.videoAccountId,\r\n    cookiePolicyEnabled: settings?.cookiePolicyEnabled === true,\r\n    cookieBannerDisabled: settings?.cookieBannerDisabled === true,\r\n    monitoring: {\r\n      appKey: settings?.monitoring?.appKey,\r\n      beaconUrl: settings?.monitoring?.beaconUrl,\r\n    },\r\n  };\r\n};\r\n","import { useSitecoreContext } from './useSitecoreContext';\r\n\r\nexport const useIsEditor = () => {\r\n  const { pageEditing } = useSitecoreContext();\r\n  return pageEditing;\r\n};\r\n","module.exports = __webpack_public_path__ + \"static/media/icon-checkmark-red.10c7df6b.svg\";","(function (global) {\r\n  var isIE11 = /Trident.*rv[ :]*11\\./.test(navigator.userAgent);\r\n  if (!isIE11) { return }\r\n  var NativeRegExp = global.RegExp;\r\n\r\n  if (!('flags' in NativeRegExp.prototype)) {\r\n    Object.defineProperty(NativeRegExp.prototype, 'flags', {\r\n      configurable: true,\r\n      get: function () {\r\n        return this.toString().match(/[gimuy]*$/)[0];\r\n      },\r\n    });\r\n  }\r\n\r\n  if (!('sticky' in NativeRegExp.prototype)) {\r\n    Object.defineProperty(NativeRegExp.prototype, 'sticky', {\r\n      configurable: true,\r\n      get: function () {\r\n        return false;\r\n      },\r\n    });\r\n  }\r\n\r\n  if (!('unicode' in NativeRegExp.prototype)) {\r\n    Object.defineProperty(NativeRegExp.prototype, 'unicode', {\r\n      configurable: true,\r\n      get: function () {\r\n        return false;\r\n      },\r\n    });\r\n  }\r\n\r\n  try {\r\n    NativeRegExp('(?<test>a)');\r\n  } catch (error) {\r\n    // https://github.com/commenthol/named-regexp-groups/blob/master/src/index.js\r\n    // https://github.com/slevithan/xregexp/blob/master/src/xregexp.js\r\n    // https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/RegExp\r\n    // https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/String\r\n    var R_NAME = /([a-zA-Z_$][a-zA-Z_$0-9]{0,50})/;\r\n    var R_NAME_REPLACE = new NativeRegExp('\\\\$<' + R_NAME.source + '>', 'g');\r\n    var R_NAMED_BACKREF = new NativeRegExp('^[?:]&' + R_NAME.source);\r\n    var R_GROUP = new NativeRegExp('^[?:]<' + R_NAME.source + '>([^]*)');\r\n    var R_GROUPS = /([\\\\]?[()])/g;\r\n    var R_EMPTY_GROUPS = /([^\\\\]|^)\\(\\)/g;\r\n\r\n    function generate(input, flags) {\r\n      var pattern;\r\n\r\n      if (input instanceof NativeRegExp) {\r\n        if (flags === void 0) {\r\n          flags = input.flags;\r\n        }\r\n        pattern = input.source;\r\n      } else {\r\n        pattern = String(input);\r\n      }\r\n\r\n      var output = {\r\n        groups: {},\r\n        named: {},\r\n        flags: flags === void 0 ? '' : String(flags),\r\n        source: '',\r\n        originalSource: pattern,\r\n      };\r\n\r\n      var store = {\r\n        count: 0, // counter for unnamed matching group\r\n        groups: [''], // store for named pattern\r\n        names: [], // store for names of capture groups\r\n      };\r\n\r\n      var index = 0;\r\n      var groups = pattern.split(R_GROUPS);\r\n      output.source = groups\r\n        .map(function (part, i) {\r\n          var name;\r\n          var block;\r\n          var isGroup = false;\r\n\r\n          switch (part) {\r\n            case '(':\r\n              store.groups.push('');\r\n              store.names.push('');\r\n              break;\r\n            case ')':\r\n              block = store.groups.pop();\r\n              name = store.names.pop();\r\n              if (name) {\r\n                output.named[name] = block.substr(1);\r\n              }\r\n              break;\r\n            default:\r\n              // is it a real group, not a cluster (?:...), or assertion (?=...), (?!...)\r\n              isGroup = groups[i - 1] === '(' && !/^\\?[:!=]/.test(part);\r\n\r\n              if (isGroup) {\r\n                index++;\r\n                // named capture group check\r\n                name = R_GROUP.exec(part);\r\n                if (name && name[1]) {\r\n                  if (!output.groups[name[1]]) {\r\n                    store.names[store.names.length - 1] = name[1];\r\n                    output.groups[name[1]] = index;\r\n                  } else {\r\n                    output.groups[store.count++] = index;\r\n                  }\r\n                  part = name[2] || '';\r\n                  if (groups[i + 1] === ')' && !name[2]) {\r\n                    part = '[^]+';\r\n                  }\r\n                } else {\r\n                  // is not a cluster, assertion or named capture group\r\n                  output.groups[store.count++] = index;\r\n                }\r\n                // named backreference check\r\n                name = R_NAMED_BACKREF.exec(part);\r\n                if (name && name[1]) {\r\n                  part = output.named[name[1]] || '';\r\n                }\r\n              }\r\n              break;\r\n          }\r\n\r\n          store.groups = store.groups.map(function (group) {\r\n            return group + part;\r\n          });\r\n\r\n          return part;\r\n        })\r\n        .join('')\r\n        .replace(R_EMPTY_GROUPS, '$1'); // remove any empty groups\r\n\r\n      // console.log(output);\r\n      return output;\r\n    }\r\n\r\n    var RegExp = function (pattern, flags) {\r\n      if (this instanceof RegExp) {\r\n        var data = generate(pattern, flags);\r\n        var regexp = new NativeRegExp(data.source, data.flags);\r\n        Object.defineProperty(this, '_regexp', { value: regexp });\r\n        Object.defineProperty(this, '_data', { value: data });\r\n      } else {\r\n        return new RegExp(pattern, flags);\r\n      }\r\n    };\r\n\r\n    RegExp.toString = function () {\r\n      return 'function RegExp() { [polyfilled code] }';\r\n    };\r\n    RegExp.prototype = {};\r\n\r\n    ['global', 'ignoreCase', 'multiline', 'sticky', 'unicode'].forEach(\r\n      function (propertyName) {\r\n        Object.defineProperty(RegExp.prototype, propertyName, {\r\n          enumerable: true,\r\n          get: function () {\r\n            return this._regexp[propertyName];\r\n          },\r\n        });\r\n      }\r\n    );\r\n\r\n    Object.defineProperty(RegExp.prototype, 'lastIndex', {\r\n      enumerable: true,\r\n      get: function () {\r\n        return this._regexp.lastIndex;\r\n      },\r\n      set: function (value) {\r\n        this._regexp.lastIndex = value;\r\n      },\r\n    });\r\n\r\n    Object.defineProperty(RegExp.prototype, 'flags', {\r\n      enumerable: true,\r\n      get: function () {\r\n        return this._data.flags;\r\n      },\r\n    });\r\n\r\n    Object.defineProperty(RegExp.prototype, 'source', {\r\n      enumerable: true,\r\n      get: function () {\r\n        return this._data.originalSource;\r\n      },\r\n    });\r\n\r\n    RegExp.prototype.toString = function () {\r\n      return '/' + this.source + '/' + this.flags;\r\n    };\r\n\r\n    RegExp.prototype.exec = function (input) {\r\n      var match = this._regexp.exec(input);\r\n      if (match) {\r\n        match.groups = {};\r\n        var groups = this._data.groups;\r\n        Object.keys(groups).forEach(function (name) {\r\n          match.groups[name] = match[groups[name]];\r\n        });\r\n      }\r\n      return match;\r\n    };\r\n\r\n    RegExp.prototype.test = function (input) {\r\n      return this._regexp.test(input);\r\n    };\r\n\r\n    RegExp.prototype.constructor = NativeRegExp;\r\n\r\n    global.RegExp = RegExp;\r\n\r\n    var replace = String.prototype.replace;\r\n    // eslint-disable-next-line\r\n    String.prototype.replace = function (regexp, replacement) {\r\n      if (regexp instanceof RegExp) {\r\n        var convertedReplacement;\r\n        switch (typeof replacement) {\r\n          case 'string':\r\n            convertedReplacement = replace.call(\r\n              replacement,\r\n              R_NAME_REPLACE,\r\n              function (match, name) {\r\n                return name in regexp._data.groups\r\n                  ? '$' + regexp._data.groups[name]\r\n                  : '';\r\n              }\r\n            );\r\n            break;\r\n          case 'function':\r\n            convertedReplacement = replacement.bind(regexp);\r\n            break;\r\n          default:\r\n            return String(replacement);\r\n        }\r\n        return replace.call(this, regexp._regexp, convertedReplacement);\r\n      } else {\r\n        return replace.call(this, regexp, replacement);\r\n      }\r\n    };\r\n\r\n    var match = String.prototype.match;\r\n    // eslint-disable-next-line\r\n    String.prototype.match = function (regexp) {\r\n      if (regexp instanceof RegExp) {\r\n        return regexp.exec(this);\r\n      } else if (regexp instanceof NativeRegExp) {\r\n        return match.call(this, regexp);\r\n      } else {\r\n        return this.match(new RegExp(regexp));\r\n      }\r\n    };\r\n\r\n    var split = String.prototype.split;\r\n    // eslint-disable-next-line\r\n    String.prototype.split = function (regexp, maxQuantity) {\r\n      if (regexp instanceof RegExp) {\r\n        return split.call(this, regexp._regexp, maxQuantity);\r\n      } else {\r\n        return split.call(this, regexp, maxQuantity);\r\n      }\r\n    };\r\n\r\n    var search = String.prototype.search;\r\n    // eslint-disable-next-line\r\n    String.prototype.search = function (regexp) {\r\n      if (regexp instanceof RegExp) {\r\n        return search.call(this, regexp._regexp);\r\n      } else {\r\n        return search.call(this, regexp);\r\n      }\r\n    };\r\n  }\r\n})(\r\n  typeof global !== 'undefined'\r\n    ? global\r\n    : typeof window !== 'undefined'\r\n      ? window\r\n      : this\r\n);\r\n","/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/bootstrap.js to modify the generation of this file.\nmodule.exports = {\n  \"sitecoreApiKey\": \"#APIKEY#\",\n  \"sitecoreApiHost\": \"#LAYOUTSERVICEHOST#\",\n  \"jssAppName\": \"rddk\",\n  \"defaultLanguage\": \"da\",\n  \"graphQLEndpointPath\": \"/api/rddk\",\n  \"defaultAppRoute\": \"/\",\n  \"graphQLEndpoint\": \"#LAYOUTSERVICEHOST#/api/rddk?sc_apikey=#APIKEY#\"\n};","export default (function () {\r\n  if (!Array.prototype.fill) {\r\n    // eslint-disable-next-line no-extend-native\r\n    Object.defineProperty(Array.prototype, 'fill', {\r\n      value: function (value) {\r\n        if (this == null) {\r\n          throw new TypeError('this is null or not defined');\r\n        }\r\n\r\n        var O = Object(this);\r\n\r\n        var len = O.length >>> 0;\r\n\r\n        var start = arguments[1];\r\n        var relativeStart = start >> 0;\r\n\r\n        var k =\r\n          relativeStart < 0\r\n            ? Math.max(len + relativeStart, 0)\r\n            : Math.min(relativeStart, len);\r\n\r\n        var end = arguments[2];\r\n        var relativeEnd = end === undefined ? len : end >> 0;\r\n\r\n        var finalValue =\r\n          relativeEnd < 0\r\n            ? Math.max(len + relativeEnd, 0)\r\n            : Math.min(relativeEnd, len);\r\n\r\n        while (k < finalValue) {\r\n          O[k] = value;\r\n          k++;\r\n        }\r\n\r\n        return O;\r\n      },\r\n    });\r\n  }\r\n})();\r\n","import { SitecoreContextFactory } from '@sitecore-jss/sitecore-jss-react';\r\n\r\n/*\r\n  The SitecoreContextFactory stores the current Sitecore context for the app.\r\n  For example, whether the page is currently being edited, or the current language.\r\n  Note that the export makes this essentially a singleton, so we can store state in it.\r\n\r\n  The Sitecore context is generally updated on route change (/src/index.js).\r\n  The `withSitecoreContext()` higher order component from `sitecore-jss-react`\r\n  can be used to access the context from within a component.\r\n*/\r\nexport default new SitecoreContextFactory();\r\n","import axios from 'axios';\r\n\r\n/**\r\n * Implements a data fetcher using Axios - replace with your favorite\r\n * SSR-capable HTTP or fetch library if you like. See HttpJsonFetcher<T> type\r\n * in sitecore-jss library for implementation details/notes.\r\n * @param {string} url The URL to request; may include query string\r\n * @param {any} data Optional data to POST with the request.\r\n */\r\nexport function dataFetcher(url, data) {\r\n  return axios({\r\n    url,\r\n    method: data ? 'POST' : 'GET',\r\n    data,\r\n    // note: axios needs to use `withCredentials: true` in order for Sitecore cookies to be included in CORS requests\r\n    // which is necessary for analytics and such\r\n    withCredentials: true,\r\n  });\r\n}\r\n","export const fieldReferences = {\r\n  basePage: {\r\n    metaTitle: 'Meta Title',\r\n    metaDescription: 'Meta Description',\r\n    metaKeywords: 'Meta Keywords',\r\n    metaNoindex: 'Meta Noindex',\r\n    canonicalUrl: 'Canonical Url',\r\n    sharingImage: 'Sharing Image',\r\n    greyBackground: 'Grey Background',\r\n    hideStickyBookMeeting: 'Hide Sticky Book Meeting',\r\n    hideStickyCalculator: 'Hide Sticky Calculator',\r\n  },\r\n  droplinkFieldValue: {\r\n    value: 'Value',\r\n  },\r\n};\r\n","export function cleanLinkData(value: any = {}): any {\r\n  return Object.fromEntries(Object.entries(value).filter((e) => e[1] !== ''));\r\n}\r\n","/**\r\n * You're probably thinking: what the hell is even that?\r\n * Well, it helps converting Sitecore's interpretation of booleans into real booleans! 'Nuff said.\r\n * @param sitecoreBool The value that a sitecore checkbox can potentially return\r\n * @returns an actual booloan\r\n */\r\nexport const sitecoreBoolToBool = (sitecoreBool: string | boolean | null | undefined): boolean => {\r\n  if (sitecoreBool === '0') return false;\r\n  if (sitecoreBool === '1') return true;\r\n  if (typeof sitecoreBool === 'string' && sitecoreBool.toLocaleLowerCase() === 'true') return true;\r\n  if (typeof sitecoreBool === 'string' && sitecoreBool.toLocaleLowerCase() === 'false') return false;\r\n  return Boolean(sitecoreBool);\r\n};\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Card as CardUi, Col } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { Button, FieldChecker, LinkAnimatedUnderline } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\nimport { cleanLinkData } from '../../shared/utils/field-validation';\r\nimport { sitecoreBoolToBool } from '../../shared/utils/sitecoreBoolToBool';\r\n\r\ntype CardProps = {\r\n  fields: any;\r\n  params?: any;\r\n};\r\n\r\nconst Card: React.FC<CardProps> = ({ fields = {}, params }) => {\r\n  const isEditor = useIsEditor();\r\n\r\n  const centerContent = sitecoreBoolToBool(params?.centerContent);\r\n  const ctaAsLink = sitecoreBoolToBool(params?.ctaAsLink);\r\n  const imageFullWidth = sitecoreBoolToBool(params?.imageFullWidth);\r\n  const noBorder = sitecoreBoolToBool(params?.noBorder);\r\n  const cardLink = fields['Cta'] !== undefined && fields['Cta']?.value?.href !== '' ? fields['Cta']?.value : null;\r\n  if (cardLink !== null) {\r\n    fields['Cta'].value = cleanLinkData(fields['Cta'].value);\r\n    cardLink['data-tracking-id'] = fields['Cta'].value.trackingcode;\r\n  }\r\n\r\n  const desktopCardAmount = Math.round(12 / parseInt(params.DesktopColumnsAmount) || 12);\r\n  const tabletCardAmount = Math.round(12 / parseInt(params.TabletColumnsAmount) || 12);\r\n  const mobileCardAmount = Math.round(12 / parseInt(params.MobileColumnsAmount) || 12);\r\n\r\n  const ImageCoomponent = (\r\n    <FieldChecker type=\"image\" field={fields['Image']}>\r\n      <Image field={fields['Image']} />\r\n    </FieldChecker>\r\n  );\r\n\r\n  const HeadlineComponent = (\r\n    <FieldChecker type=\"text\" field={fields['Headline']}>\r\n      <Text field={fields['Headline']} />\r\n    </FieldChecker>\r\n  );\r\n\r\n  const TextComponent = (\r\n    <FieldChecker type=\"text\" field={fields['Text']}>\r\n      <Text field={fields['Text']} />\r\n    </FieldChecker>\r\n  );\r\n\r\n  const CtaComponent = (\r\n    <FieldChecker type=\"link\" field={fields['Cta']}>\r\n      {ctaAsLink ? <LinkAnimatedUnderline field={fields['Cta']} /> : <Button field={fields['Cta']} />}\r\n    </FieldChecker>\r\n  );\r\n\r\n  const RibbonComponent = isEditor ? (\r\n    <FieldChecker type=\"text\" field={fields['RibbonText']}>\r\n      <Text field={fields['RibbonText']} />\r\n    </FieldChecker>\r\n  ) : (\r\n    fields['RibbonText']?.value\r\n  );\r\n\r\n  return (\r\n    <Col sm={mobileCardAmount} md={tabletCardAmount} lg={desktopCardAmount}>\r\n      <CardUi\r\n        centerContent={centerContent}\r\n        noBorder={noBorder}\r\n        imageFullWidth={imageFullWidth}\r\n        image={ImageCoomponent}\r\n        headline={HeadlineComponent}\r\n        text={TextComponent}\r\n        cta={CtaComponent}\r\n        link={cardLink}\r\n        height=\"calc(100% - 24px)\"\r\n        marginBottom={5}\r\n        ribbonText={RibbonComponent}\r\n      ></CardUi>\r\n    </Col>\r\n  );\r\n};\r\n\r\nexport default Card;\r\n","import { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { Container } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { ExpEditorRow, Section } from '../../shared/components';\r\n\r\nexport type CardsProps = PlaceholderProps & {\r\n  cards: any;\r\n};\r\n\r\nconst Cards: React.FC<CardsProps> = ({ cards }) => {\r\n  return (\r\n    <Section componentName=\"Cards\" margin=\"small\">\r\n      <Container>\r\n        <ExpEditorRow>{cards}</ExpEditorRow>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('cards')(Cards);\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Col, Container, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { FieldChecker, LinkAnimatedUnderline, Section } from '../../shared/components';\r\n\r\nexport type CenteredTextProps = {\r\n  fields: any;\r\n};\r\n\r\nconst CenteredText: React.FC<CenteredTextProps> = ({ fields = {} }) => (\r\n  <Section componentName=\"CenteredText\" margin=\"small\">\r\n    <Container>\r\n      <Row justify=\"center\">\r\n        <Col sm={6}>\r\n          <Box textAlign=\"center\">\r\n            <FieldChecker type=\"image\" field={fields['Icon']}>\r\n              <Box marginBottom={5}>\r\n                <Image field={fields['Icon']} />\r\n              </Box>\r\n            </FieldChecker>\r\n\r\n            <FieldChecker type=\"text\" field={fields['Headline']}>\r\n              <Typography type=\"h6\">\r\n                <Text field={fields['Headline']} />\r\n              </Typography>\r\n            </FieldChecker>\r\n\r\n            <FieldChecker type=\"text\" field={fields['Text']}>\r\n              <Typography type=\"manchetSmall\" mt={3}>\r\n                <Text field={fields['Text']} />\r\n              </Typography>\r\n            </FieldChecker>\r\n\r\n            <FieldChecker type=\"link\" field={fields['Link']}>\r\n              <Box marginTop={5}>\r\n                <LinkAnimatedUnderline field={fields['Link']} />\r\n              </Box>\r\n            </FieldChecker>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  </Section>\r\n);\r\n\r\nexport default CenteredText;\r\n","import { Color, mediaQuery, RddkTheme } from 'db-npm-rdui';\r\nimport { css } from 'styled-components';\r\n\r\nexport const tooltipPsudoStyle = css`\r\n  ::before {\r\n    content: '';\r\n    background: ${Color.rdBrightWhite};\r\n    position: absolute;\r\n    z-index: 20;\r\n    width: 22px;\r\n    height: 22px;\r\n    transform: rotate(45deg);\r\n  }\r\n  ::after {\r\n    content: '';\r\n    z-index: 22;\r\n    background: ${Color.rdBrightWhite};\r\n    position: absolute;\r\n  }\r\n`;\r\n\r\nexport const tooltipPositionRight = css`\r\n  left: calc(100% + 15px);\r\n  top: -15px;\r\n  ${mediaQuery.lg} {\r\n    top: -10px;\r\n  }\r\n  ::before {\r\n    left: -10px;\r\n    top: 15px;\r\n    border-radius: 0 0 0 3px;\r\n    box-shadow: 2px 3px 6px rgba(0, 0, 0, 0.25);\r\n  }\r\n  ::after {\r\n    height: 40px;\r\n    width: 20px;\r\n    left: 0;\r\n    top: 10px;\r\n  }\r\n`;\r\n\r\nexport const tooltipPositionBottom = css`\r\n  left: 0;\r\n  top: 45px;\r\n  ::before {\r\n    left: 20px;\r\n    top: -10px;\r\n    border-radius: 0 3px 0 0;\r\n    box-shadow: -1px -1px 6px rgba(0, 0, 0, 0.1);\r\n  }\r\n  ::after {\r\n    height: 20px;\r\n    width: 40px;\r\n    left: 10px;\r\n    top: 0px;\r\n  }\r\n`;\r\n\r\nexport const tooltipLinkStyle = css`\r\n  color: ${Color.rdPureBlack};\r\n  border-bottom: 2px dashed ${Color.rdPureBlack};\r\n  text-decoration: none;\r\n  cursor: help;\r\n  position: relative;\r\n  :hover {\r\n    .tooltip-bubble {\r\n      opacity: 1;\r\n      z-index: 20;\r\n    }\r\n  }\r\n  ${mediaQuery.mdDown} {\r\n    position: static;\r\n    display: inline-flex;\r\n    justify-content: space-around;\r\n    ::after {\r\n      content: '';\r\n      opacity: 0;\r\n      z-index: -1;\r\n      background: ${Color.rdBrightWhite};\r\n      width: 22px;\r\n      height: 22px;\r\n      position: absolute;\r\n      transform: rotate(45deg);\r\n      margin-top: 30px;\r\n      left: inherit;\r\n      border-radius: 0 3px 0 0;\r\n      box-shadow: -1px -1px 6px rgba(0, 0, 0, 0.1);\r\n      transition: opacity 0.5s ease;\r\n    }\r\n    ::before {\r\n      content: '';\r\n      background: ${Color.rdBrightWhite};\r\n      margin-top: 40px;\r\n      left: inherit;\r\n      height: 20px;\r\n      position: absolute;\r\n      width: 40px;\r\n      transition: opacity 0.5s ease;\r\n      z-index: -1;\r\n      opacity: 0;\r\n    }\r\n    :hover {\r\n      ::after {\r\n        opacity: 1;\r\n        z-index: 20;\r\n      }\r\n      ::before {\r\n        opacity: 1;\r\n        z-index: 22;\r\n      }\r\n    }\r\n  }\r\n`;\r\n\r\nexport const tooltipBubble = css`\r\n  cursor: auto;\r\n  opacity: 0;\r\n  z-index: -1;\r\n  transition: opacity 0.5s ease;\r\n  position: absolute;\r\n  width: 320px;\r\n  height: auto;\r\n  background: ${Color.rdBrightWhite};\r\n  border-radius: 3px;\r\n  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.15);\r\n  ${tooltipPsudoStyle}\r\n  ${tooltipPositionRight}\r\n  \r\n  ${mediaQuery.mdDown} {\r\n    ${tooltipPositionBottom}\r\n    ::before, ::after {\r\n      content: none;\r\n    }\r\n    top: inherit;\r\n    left: 5%;\r\n    margin-top: 40px;\r\n    width: 90vw;\r\n  }\r\n`;\r\n\r\nexport const tooltipHeading = css`\r\n  padding-left: 20px;\r\n  padding-right: 20px;\r\n  padding-top: 20px;\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  font-weight: 600;\r\n  font-stretch: normal;\r\n  font-style: normal;\r\n  line-height: 1.5;\r\n  letter-spacing: -0.2px;\r\n  color: ${Color.rdPureBlack};\r\n  display: inline-block;\r\n  width: 100%;\r\n  font-size: 13px;\r\n  ${mediaQuery.lg} {\r\n    font-size: 0.7em;\r\n  }\r\n`;\r\n\r\nexport const tooltipContent = css`\r\n  padding-left: 20px;\r\n  padding-right: 20px;\r\n  padding-bottom: 25px;\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  font-weight: normal;\r\n  font-stretch: normal;\r\n  font-style: italic;\r\n  line-height: 1.23;\r\n  letter-spacing: normal;\r\n  color: ${Color.darkGrey};\r\n  display: inline-block;\r\n  font-size: 12px;\r\n  ${mediaQuery.lg} {\r\n    font-size: 0.65em;\r\n  }\r\n`;\r\n","import {\r\n  applyTextType,\r\n  buttonBaseStyle,\r\n  buttonPrimaryStyle,\r\n  buttonSecondaryStyle,\r\n  Color,\r\n  mediaQuery,\r\n  RddkTheme,\r\n} from 'db-npm-rdui';\r\nimport { css } from 'styled-components';\r\nimport * as tooltipStyles from './tooltipStyles';\r\n\r\n/**\r\n * Editor styles for rich text area\r\n */\r\n\r\nconst headingStyle = css`\r\n  margin-top: 31px;\r\n  margin-bottom: 12px;\r\n`;\r\n\r\nconst paragraphStyle = css`\r\n  margin-top: 0;\r\n`;\r\n/* lists */\r\nconst richTextList = css`\r\n  color: ${Color.black};\r\n  list-style-position: inside;\r\n  padding-left: 0;\r\n  li {\r\n    margin: 2px 0;\r\n  }\r\n`;\r\nconst olStyle = css`\r\n  li {\r\n    text-indent: -26px;\r\n    padding-left: 26px;\r\n\r\n    ${mediaQuery.md} {\r\n      text-indent: -32px;\r\n      padding-left: 32px;\r\n    }\r\n  }\r\n  li::before {\r\n    content: '';\r\n    width: 10px;\r\n    display: inline-block;\r\n  }\r\n`;\r\nconst ulStyle = css`\r\n  list-style-type: none;\r\n  li {\r\n    text-indent: -6px;\r\n    margin-left: 12px;\r\n  }\r\n  li::before {\r\n    content: '-';\r\n    display: inline-block;\r\n    margin-right: 5px;\r\n  }\r\n`;\r\n\r\n/* hr */\r\nexport const hrStyle = css`\r\n  background: #f4f0f0;\r\n  height: 3px;\r\n  width: 100%;\r\n  position: relative;\r\n  border: none;\r\n  overflow: visible;\r\n  margin-top: 30px;\r\n  margin-bottom: 17px;\r\n\r\n  ::after {\r\n    content: '';\r\n    height: 3px;\r\n    width: 100%;\r\n    background: #f4f0f0;\r\n    position: absolute;\r\n    bottom: -7px;\r\n    left: 0;\r\n  }\r\n\r\n  ${mediaQuery.md} {\r\n    margin-top: 40px;\r\n  }\r\n  ${mediaQuery.xl} {\r\n    margin-top: 50px;\r\n  }\r\n`;\r\n\r\n/* Links */\r\nconst linkStyle = css`\r\n  color: ${RddkTheme.colors.rdRed};\r\n  text-decoration: underline;\r\n`;\r\n\r\nexport const richTextStyles = css`\r\n  /* Inline tooltip */\r\n  .tooltip,\r\n  .toolTip {\r\n    ${tooltipStyles.tooltipLinkStyle}\r\n  }\r\n  .tooltip-bubble {\r\n    ${tooltipStyles.tooltipBubble}\r\n  }\r\n  .tooltip-bubble__heading {\r\n    ${tooltipStyles.tooltipHeading}\r\n  }\r\n  .tooltip-bubble__content {\r\n    ${tooltipStyles.tooltipContent}\r\n  }\r\n  /* Text, list & link - default text style is paragraph */\r\n  ${applyTextType('paragraph')}\r\n  p {\r\n    ${paragraphStyle}\r\n  }\r\n  a:not(.toolTip):not(.button) {\r\n    ${linkStyle}\r\n  }\r\n  ol {\r\n    ${richTextList}\r\n    ${olStyle}\r\n  }\r\n  ul {\r\n    ${richTextList}\r\n    ${ulStyle}\r\n  }\r\n  hr {\r\n    ${hrStyle}\r\n  }\r\n  .manchetBig {\r\n    ${applyTextType('manchetBig')}\r\n  }\r\n\r\n  /* Headings */\r\n  h1,\r\n  .h1 {\r\n    ${applyTextType('h1')}\r\n    ${headingStyle}\r\n  }\r\n  h2,\r\n  .h2 {\r\n    ${applyTextType('h2')}\r\n    ${headingStyle}\r\n  }\r\n  h3,\r\n  .h3 {\r\n    ${applyTextType('h3')}\r\n    ${headingStyle}\r\n  }\r\n  h4,\r\n  .h4 {\r\n    ${applyTextType('h4')}\r\n    ${headingStyle}\r\n  }\r\n  h5,\r\n  .h5 {\r\n    ${applyTextType('h5')}\r\n    ${headingStyle}\r\n  }\r\n  h6,\r\n  .h6 {\r\n    ${applyTextType('h6')}\r\n    ${headingStyle}\r\n  }\r\n  .button {\r\n    ${buttonBaseStyle}\r\n  }\r\n  .button.primary {\r\n    ${buttonPrimaryStyle}\r\n  }\r\n  .button.secondary {\r\n    ${buttonSecondaryStyle}\r\n  }\r\n`;\r\n","import { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, mediaQuery, RddkTheme, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { Button, FieldChecker } from '../../shared/components';\r\nimport { sitecoreBoolToBool } from '../../shared/utils/sitecoreBoolToBool';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\n\r\nconst StyledRichText = styled(RichText)`\r\n  ${richTextStyles}\r\n  margin-bottom: 20px;\r\n  margin-top: 20px;\r\n`;\r\n\r\ntype Params = {\r\n  useRedBackground?: string;\r\n  CenterText?: string;\r\n};\r\n\r\ntype ColorCardProps = {\r\n  fields: any;\r\n  params?: Params;\r\n};\r\n\r\ntype ColorCardWrapperProps = {\r\n  backgroundColor?: string;\r\n  fontColor?: string;\r\n};\r\n\r\nconst ColorCard: React.FC<ColorCardProps & ColorCardWrapperProps> = ({ fields = {}, params = {} }) => {\r\n  const useRedBackground = sitecoreBoolToBool(params?.useRedBackground);\r\n  const centerText = sitecoreBoolToBool(params?.CenterText);\r\n  const bgColor = useRedBackground ? RddkTheme.colors.red50 : RddkTheme.colors.grey10;\r\n  const color = useRedBackground ? '#fff' : '#000';\r\n\r\n  return (\r\n    <Container centerText={centerText} backgroundColor={bgColor}>\r\n      <FieldChecker type=\"text\" field={fields['Title']}>\r\n        <Typography type=\"h3\" color={color}>\r\n          <Text field={fields['Title']} />\r\n        </Typography>\r\n      </FieldChecker>\r\n\r\n      {useRedBackground ? (\r\n        <TextComponent>\r\n          <FieldChecker type=\"text\" field={fields['Text']}>\r\n            <Typography type=\"manchetSmall\" mt={4} mb={4} color={color}>\r\n              <Text field={fields['Text']} />\r\n            </Typography>\r\n          </FieldChecker>\r\n          <FieldChecker type=\"link\" field={fields['Button Link']}>\r\n            <Button variant=\"secondary\" field={fields['Button Link']} />\r\n          </FieldChecker>\r\n        </TextComponent>\r\n      ) : (\r\n        <FieldChecker type=\"text\" field={fields['Default Card Description']}>\r\n          <StyledRichText field={fields['Default Card Description']} />\r\n        </FieldChecker>\r\n      )}\r\n    </Container>\r\n  );\r\n};\r\n\r\nexport default ColorCard;\r\n\r\ntype ContainerProps = {\r\n  centerText: boolean;\r\n};\r\n\r\nconst Container = styled(Box)<ContainerProps>`\r\n  height: calc(100% - 24px);\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  text-decoration: none;\r\n  transition: box-shadow 0.1s ease;\r\n  border-radius: 5px;\r\n  box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.15);\r\n  border: solid 0.8px #eeeeee;\r\n  &:hover {\r\n    box-shadow: 0 22px 44px 0 rgba(0, 0, 0, 0.22);\r\n  }\r\n\r\n  overflow: hidden;\r\n  margin-bottom: 24px;\r\n  padding: 25px;\r\n\r\n  ${mediaQuery.md} {\r\n    padding: 40px;\r\n  }\r\n  ${(props) =>\r\n    props?.centerText &&\r\n    css`\r\n      align-items: center;\r\n      > ${TextComponent} {\r\n        align-items: center;\r\n      }\r\n    `}\r\n`;\r\n\r\nconst TextComponent = styled.div`\r\n  display: flex;\r\n  flex-direction: column;\r\n  flex-wrap: wrap;\r\n  justify-content: space-between;\r\n  align-items: flex-start;\r\n  flex: 1;\r\n`;\r\n","import { Col } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport ColorCard from './ColorCard';\r\n\r\ntype ColorCardProps = {\r\n  fields: any;\r\n  params?: any;\r\n};\r\n\r\nconst ColorCardUI: React.FC<ColorCardProps> = ({ fields = {}, params = {} }) => {\r\n  const desktopCardAmount = Math.round(12 / parseInt(params.DesktopColumnsAmount));\r\n  const tabletCardAmount = Math.round(12 / parseInt(params.TabletColumnsAmount));\r\n  const mobileCardAmount = Math.round(12 / parseInt(params.MobileColumnsAmount));\r\n\r\n  return (\r\n    <Col sm={mobileCardAmount} md={tabletCardAmount} lg={desktopCardAmount}>\r\n      <ColorCard fields={fields} params={params} />\r\n    </Col>\r\n  );\r\n};\r\n\r\nexport default ColorCardUI;\r\n","import { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { Container } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { ExpEditorRow, Section } from '../../shared/components';\r\nimport { sitecoreBoolToBool } from '../../shared/utils/sitecoreBoolToBool';\r\n\r\nexport type ColorCardsProps = PlaceholderProps & {\r\n  colorcards: any;\r\n  params?: Params;\r\n};\r\n\r\ntype Params = {\r\n  CenterCards?: string;\r\n};\r\n\r\nconst ColorCards: React.FC<ColorCardsProps> = ({ colorcards, params = {} }) => {\r\n  const centerCards = sitecoreBoolToBool(params?.CenterCards);\r\n\r\n  return (\r\n    <Section componentName=\"ColorCards\" margin=\"large\">\r\n      <Container>\r\n        <ExpEditorRow style={centerCards ? { justifyContent: 'center' } : undefined}>{colorcards}</ExpEditorRow>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('colorcards')(ColorCards);\r\n","import { CookieConsentBanner as BannerComponent, useCookieConsentBannerDefaultHandler } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useContextSettings } from '../../shared/hooks';\r\n\r\ntype CookieConsentBannerProps = {\r\n  fields: any;\r\n};\r\n\r\nconst CookieConsentBanner: React.FC<CookieConsentBannerProps> = ({ fields }) => {\r\n  const { t } = useTranslation();\r\n  const disabled = useContextSettings().cookieBannerDisabled;\r\n\r\n  // Extra callback for consent level submit that triggers Adobe Launch \"_satellite.track\" event\r\n  const onSubmit = () => {\r\n    const w = window as any;\r\n    if (w && w._satellite && w._satellite.track) {\r\n      w._satellite.track('consentupdate');\r\n    }\r\n  };\r\n\r\n  // Create handler with extra onSubmit callback\r\n  const handler = useCookieConsentBannerDefaultHandler({\r\n    onSubmit,\r\n    disabled,\r\n  });\r\n\r\n  // Make handler onReopen callback accessible from e.g. a link in rich text\r\n  React.useEffect(() => {\r\n    const w = window as any;\r\n    if (w) {\r\n      w.cookieConsentBanner = {\r\n        reopen: handler.onReopen,\r\n      };\r\n    }\r\n  }, [handler.onReopen]);\r\n\r\n  if (!useContextSettings().cookiePolicyEnabled) {\r\n    return null;\r\n  }\r\n\r\n  return (\r\n    <BannerComponent\r\n      handler={handler}\r\n      title={fields['Title']?.value}\r\n      description={(<span dangerouslySetInnerHTML={{ __html: fields['Text']?.value }} />) as any}\r\n      buttonAllowNecessaryText={t('cookie-consent-buttons-oktonecessary')}\r\n      buttonAllowSelectedText={t('cookie-consent-buttons-oktoselected')}\r\n      buttonAllowAllText={t('cookie-consent-buttons-oktoall')}\r\n      levels={[\r\n        {\r\n          name: t(`cookie-consent-categories-0-title`),\r\n          description: t(`cookie-consent-categories-0-text`),\r\n        },\r\n        {\r\n          name: t(`cookie-consent-categories-1-title`),\r\n          description: t(`cookie-consent-categories-1-text`),\r\n        },\r\n        {\r\n          name: t(`cookie-consent-categories-2-title`),\r\n          description: t(`cookie-consent-categories-2-text`),\r\n        },\r\n        {\r\n          name: t(`cookie-consent-categories-3-title`),\r\n          description: t(`cookie-consent-categories-3-text`),\r\n        },\r\n      ]}\r\n    />\r\n  );\r\n};\r\n\r\nexport default CookieConsentBanner;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { ConsentLevel, useCookieConsent } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\n\r\ntype CustomInsertHtmlProps = {\r\n  fields: any;\r\n  params: any;\r\n};\r\n\r\nconst CustomInsertHtml: React.FC<CustomInsertHtmlProps> = ({ fields = {}, params }) => {\r\n  const cookieConsent = useCookieConsent();\r\n  const consentLevels = cookieConsent.getConsentLevels();\r\n  const render = params && params.position;\r\n  const renderScript = render && params.position === 'Footer';\r\n\r\n  React.useEffect(() => {\r\n    if (!renderScript) {\r\n      return;\r\n    }\r\n    if (cookieConsent.isAllowed(ConsentLevel.Statistics)) {\r\n      //eslint-disable-next-line no-new-func\r\n      new Function(fields['Script Analytical Cookie Accept']?.value)();\r\n    }\r\n    if (cookieConsent.isAllowed(ConsentLevel.Marketing)) {\r\n      //eslint-disable-next-line no-new-func\r\n      new Function(fields['Script Marketing Cookie Accept']?.value)();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [JSON.stringify(consentLevels)]);\r\n\r\n  if (!render) {\r\n    return null;\r\n  }\r\n\r\n  return (\r\n    <>\r\n      <Text field={fields[params.position + ' HTML']} encode={false} editable={false} />\r\n    </>\r\n  );\r\n};\r\n\r\nexport default CustomInsertHtml;\r\n","import React from 'react';\r\nimport { useIsEditor } from '../../hooks';\r\nimport { isValidImage, isValidLink, isValidText } from '../../utils/field-validation';\r\n\r\ntype FieldCheckerProps = {\r\n  field: any;\r\n  type: 'text' | 'image' | 'link';\r\n  children?: any;\r\n};\r\n\r\n/**\r\n * This component can be used for wrapping HTML/markup for rendering a Sitecore field,\r\n * to avoid rendering empty tags and unnecessary HTML when data is missing.\r\n * This component checks whether the given field has data, based on the type given for the field.\r\n * It only renders the child content if the field has data.\r\n * In \"editor mode\" it alaways renders the child content, no matter if the field has data or not.\r\n */\r\nexport const FieldChecker: React.FC<FieldCheckerProps> = ({ field, type, children }) => {\r\n  const isEditor = useIsEditor();\r\n\r\n  if (\r\n    isEditor ||\r\n    (type === 'text' && isValidText(field)) ||\r\n    (type === 'image' && isValidImage(field)) ||\r\n    (type === 'link' && isValidLink(field))\r\n  ) {\r\n    return children;\r\n  }\r\n\r\n  return null;\r\n};\r\n","export function isValidText(field?: any): boolean {\r\n  if (field && field.value) {\r\n    return field.value.trim() !== '';\r\n  }\r\n  return false;\r\n}\r\n","export function isValidImage(field?: any): boolean {\r\n  if (field && field.value && field.value.src) {\r\n    return field.value.src.trim() !== '';\r\n  }\r\n  return false;\r\n}\r\n","export function isValidLink(field?: any): boolean {\r\n  if (field && field.value && field.value.text) {\r\n    return field.value.text.trim() !== '';\r\n  }\r\n  return false;\r\n}\r\n","import { Link } from '@sitecore-jss/sitecore-jss-react';\r\nimport { buttonBaseStyle, buttonCustomStyle, buttonPrimaryStyle, buttonSecondaryStyle, Color } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { cleanLinkData } from '../../shared/utils/field-validation';\r\n\r\ntype ButtonProps = {\r\n  variant?: 'primary' | 'secondary' | 'custom';\r\n  field?: any;\r\n};\r\n\r\nconst secondaryLink = css`\r\n  a {\r\n    color: ${Color.grey100};\r\n  }\r\n`;\r\n\r\nexport const Button: React.FC<ButtonProps> = ({ variant, field }) => {\r\n  field.value = cleanLinkData(field.value);\r\n  return <StyledButton data-tracking-id={field?.value?.trackingcode} field={field} variant={variant}></StyledButton>;\r\n};\r\n\r\nconst StyledButton = styled(Link)<ButtonProps>`\r\n  ${buttonBaseStyle}\r\n  a {\r\n    text-decoration: none;\r\n    color: ${Color.white};\r\n  }\r\n  ${(props) => (!props.variant || props.variant === 'primary') && buttonPrimaryStyle}\r\n  ${(props) => props.variant === 'secondary' && [buttonSecondaryStyle, secondaryLink]}\r\n  ${(props) => props.variant === 'custom' && buttonCustomStyle}\r\n  :empty {\r\n    display: none;\r\n  }\r\n`;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, ButtonGroup, Col, Container, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker } from '../FieldChecker/FieldChecker';\r\nimport { Button } from '../SitecoreButtons';\r\n\r\nconst ContainerRow = styled(Row)`\r\n  align-items: center !important;\r\n`;\r\nconst ImageColWrapper = styled(Col)`\r\n  ${mediaQuery.mdDown} {\r\n    padding: 0 !important;\r\n    margin-bottom: 30px;\r\n  }\r\n`;\r\nconst BackgroundImage = styled.div<{ imagePath: string }>`\r\n  position: relative;\r\n  background-image: url(${(props) => props.imagePath});\r\n  background-position: center;\r\n  background-size: cover;\r\n  max-width: 100%;\r\n  height: 380px;\r\n\r\n  ${mediaQuery.xxl} {\r\n    height: 420px;\r\n  }\r\n\r\n  ${mediaQuery.mdDown} {\r\n    margin: 0;\r\n    height: 200px;\r\n    width: 100%;\r\n  }\r\n`;\r\n\r\ntype ImageContainerProps = {\r\n  fields: any;\r\n  direction: 'row' | 'row-reverse';\r\n};\r\n\r\nexport const ImageContainer: React.FC<ImageContainerProps> = ({ fields = {}, direction }) => {\r\n  return (\r\n    <Container>\r\n      <ContainerRow direction={direction}>\r\n        <ImageColWrapper md={6}>\r\n          <FieldChecker type=\"image\" field={fields['Image']}>\r\n            <BackgroundImage imagePath={fields['Image']?.value?.src} />\r\n          </FieldChecker>\r\n        </ImageColWrapper>\r\n        {direction === 'row-reverse' ? <Col md={2}></Col> : <Col md={1}></Col>}\r\n        <Col md={4}>\r\n          <FieldChecker type=\"text\" field={fields['Headline']}>\r\n            <Typography type=\"h4\">\r\n              <Text field={fields['Headline']} />\r\n            </Typography>\r\n          </FieldChecker>\r\n\r\n          <FieldChecker type=\"text\" field={fields['Description']}>\r\n            <Box marginTop={4} marginBottom={5}>\r\n              <Typography type=\"manchetSmall\">\r\n                <Text field={fields['Description']} />\r\n              </Typography>\r\n            </Box>\r\n          </FieldChecker>\r\n\r\n          <ButtonGroup>\r\n            <FieldChecker type=\"link\" field={fields['Button Primary']}>\r\n              <Button field={fields['Button Primary']} />\r\n            </FieldChecker>\r\n            <FieldChecker type=\"link\" field={fields['Button Secondary']}>\r\n              <Button variant=\"secondary\" field={fields['Button Secondary']} />\r\n            </FieldChecker>\r\n          </ButtonGroup>\r\n        </Col>\r\n        {direction === 'row' ? <Col md={1}></Col> : ''}\r\n      </ContainerRow>\r\n    </Container>\r\n  );\r\n};\r\n","import * as React from 'react';\r\nimport { Section } from '../../shared/components';\r\nimport { ImageContainer } from '../../shared/components/ImageContainer/ImageContainer';\r\n\r\nexport type EntranceSingleLeftProps = {\r\n  fields: any;\r\n};\r\n\r\nconst EntranceSingleLeft: React.FC<EntranceSingleLeftProps> = ({ fields = {} }) => {\r\n  return (\r\n    <Section componentName=\"EntranceSingleLeft\" margin=\"large\">\r\n      <ImageContainer fields={fields} direction=\"row-reverse\" />\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default EntranceSingleLeft;\r\n","import { breakpoints } from 'db-npm-rdui';\r\n\r\ninterface ImageField {\r\n  value: {\r\n    src: string;\r\n    alt?: string;\r\n  };\r\n}\r\n\r\nconst getQuerySymbol = (url: string) => (url.search(/\\?+/) === -1 ? '?' : '&');\r\nconst paramCleaner = (url: string) => {\r\n  const urlParts = url.split('?');\r\n  let loc = urlParts[0];\r\n  let queryString = '';\r\n  /** Copy of replacement regexp from JSS https://github.com/Sitecore/jss/blob/master/packages/sitecore-jss/src/mediaApi.ts */\r\n  const mediaUrlPrefixRegex = /\\/([-~]{1})\\/media\\//i;\r\n  const match = mediaUrlPrefixRegex.exec(loc);\r\n  if (match && match.length > 1) {\r\n    loc = loc.replace(mediaUrlPrefixRegex, `/${match[1]}/jssmedia/`);\r\n  }\r\n  /** JSS regexp end */\r\n  if (urlParts.length === 2) {\r\n    queryString = urlParts[1].replace(/(&|^)+(h|w|mh|mw)+=\\d+/g, '');\r\n    if (queryString.length > 0) {\r\n      return loc + queryString.replace('&', '?');\r\n    }\r\n  }\r\n  return loc;\r\n};\r\n\r\nconst imageScaler = (image: string | ImageField | undefined, maxWidth: number = 0): any => {\r\n  let imageUrl: string | undefined = typeof image === 'object' ? image.value.src : image;\r\n\r\n  if (imageUrl === undefined) {\r\n    return image;\r\n  }\r\n\r\n  const widthParameter = 'mw=';\r\n\r\n  if (typeof window !== 'undefined' && maxWidth === 0) {\r\n    const pixelRatio = 1; //window.devicePixelRatio || 1; //hard coding this to 1 for now. Revisit after performance vs niceness testing.\r\n    const scalingSteps = Object.values(breakpoints);\r\n    const largestStep = Math.max(...scalingSteps);\r\n    if (window.innerWidth < largestStep + 200) {\r\n      maxWidth = scalingSteps.reduce((a, c) => (c > window.innerWidth && c < a ? c : a), largestStep);\r\n    }\r\n    maxWidth = Math.ceil(maxWidth * pixelRatio);\r\n  }\r\n  imageUrl = paramCleaner(imageUrl); //sometimes images already have params from sitecore - if not removed, images may be way taller (padded) than needed\r\n  const scaledImageSuffix = getQuerySymbol(imageUrl) + widthParameter + maxWidth;\r\n  if (typeof image === 'object') {\r\n    image.value.src = imageUrl + scaledImageSuffix;\r\n  } else {\r\n    image = imageUrl + scaledImageSuffix;\r\n  }\r\n  return image;\r\n};\r\n\r\nexport default imageScaler;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  BottomShadow,\r\n  Box,\r\n  Col,\r\n  Container,\r\n  mediaQuery,\r\n  PopoutBox,\r\n  Row,\r\n  SlantedBackgroundImage,\r\n  Typography,\r\n} from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, LinkAnimatedUnderline, Section } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst BgImage = styled(SlantedBackgroundImage)`\r\n  width: 90%;\r\n  position: absolute !important;\r\n  z-index: 0;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 80%;\r\n  }\r\n`;\r\n\r\nexport type EntranceSinglePopoutLeftProps = {\r\n  fields: any;\r\n};\r\n\r\nconst EntranceSinglePopoutLeft: React.FC<EntranceSinglePopoutLeftProps> = ({ fields = {} }) => (\r\n  <Section componentName=\"EntranceSinglePopoutLeft\" margin=\"large\">\r\n    <FieldChecker type=\"image\" field={fields['Image']}>\r\n      <BgImage src={imageScaler(fields['Image']?.value?.src)} slantPosition=\"left\" />\r\n    </FieldChecker>\r\n\r\n    <Container>\r\n      <Row>\r\n        <Col md={8} lg={6} xxl={4}>\r\n          <Box marginTop={10} marginBottom={10} style={{ position: 'relative', zIndex: 1 }}>\r\n            <BottomShadow>\r\n              <PopoutBox>\r\n                <FieldChecker type=\"text\" field={fields['Headline']}>\r\n                  <Typography type=\"h4\">\r\n                    <Text field={fields['Headline']} />\r\n                  </Typography>\r\n                </FieldChecker>\r\n\r\n                <FieldChecker type=\"text\" field={fields['Description']}>\r\n                  <Typography type=\"manchetSmall\" mt={4} mb={4}>\r\n                    <Text field={fields['Description']} />\r\n                  </Typography>\r\n                </FieldChecker>\r\n\r\n                <FieldChecker type=\"link\" field={fields['Link']}>\r\n                  <LinkAnimatedUnderline field={fields['Link']} />\r\n                </FieldChecker>\r\n              </PopoutBox>\r\n            </BottomShadow>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  </Section>\r\n);\r\n\r\nexport default EntranceSinglePopoutLeft;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  BottomShadow,\r\n  Box,\r\n  Col,\r\n  Container,\r\n  mediaQuery,\r\n  PopoutBox,\r\n  Row,\r\n  SlantedBackgroundImage,\r\n  Typography,\r\n} from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport LazyLoad from 'react-lazyload';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, LinkAnimatedUnderline, Section, WithConditionWrapper } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst BgImage = styled(SlantedBackgroundImage)`\r\n  width: 90%;\r\n  position: absolute !important;\r\n  z-index: 0;\r\n  top: 0;\r\n  left: 0;\r\n  bottom: 0;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 80%;\r\n  }\r\n`;\r\n\r\nexport type EntranceSinglePopoutRightProps = {\r\n  fields: any;\r\n};\r\n\r\nconst EntranceSinglePopoutRight: React.FC<EntranceSinglePopoutRightProps> = ({ fields = {} }) => {\r\n  return (\r\n    <Section componentName=\"EntranceSinglePopoutRight\" margin=\"large\">\r\n      <WithConditionWrapper\r\n        condition={process.env.REACT_APP_CM_BUILD === 'true'}\r\n        Wrapper={LazyLoad}\r\n        props={{ height: 300, once: true }}\r\n      >\r\n        <FieldChecker type=\"image\" field={fields['Image']}>\r\n          <BgImage src={imageScaler(fields['Image']?.value?.src)} slantPosition=\"right\" />\r\n        </FieldChecker>\r\n\r\n        <Container>\r\n          <Row>\r\n            <Col md={8} lg={6} xxl={4} offset={{ md: 4, lg: 6, xxl: 8 }}>\r\n              <Box marginTop={10} marginBottom={10} style={{ position: 'relative', zIndex: 1 }}>\r\n                <BottomShadow>\r\n                  <PopoutBox>\r\n                    <FieldChecker type=\"text\" field={fields['Headline']}>\r\n                      <Typography type=\"h4\">\r\n                        <Text field={fields['Headline']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n\r\n                    <FieldChecker type=\"text\" field={fields['Description']}>\r\n                      <Typography type=\"manchetSmall\" mt={4} mb={4}>\r\n                        <Text field={fields['Description']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n\r\n                    <FieldChecker type=\"link\" field={fields['Link']}>\r\n                      <LinkAnimatedUnderline field={fields['Link']} />\r\n                    </FieldChecker>\r\n                  </PopoutBox>\r\n                </BottomShadow>\r\n              </Box>\r\n            </Col>\r\n          </Row>\r\n        </Container>\r\n      </WithConditionWrapper>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default EntranceSinglePopoutRight;\r\n","import * as React from 'react';\r\nimport { Section } from '../../shared/components';\r\nimport { ImageContainer } from '../../shared/components/ImageContainer/ImageContainer';\r\n\r\nexport type EntranceSingleRightProps = {\r\n  fields: any;\r\n};\r\n\r\nconst EntranceSingleRight: React.FC<EntranceSingleRightProps> = ({ fields = {} }) => {\r\n  return (\r\n    <Section componentName=\"EntranceSingleRight\" margin=\"large\">\r\n      <ImageContainer fields={fields} direction=\"row\" />\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default EntranceSingleRight;\r\n","const placeholderChildren = (isEditor = false, placeholderChildren: Array<any>) => {\r\n  if (isEditor) return placeholderChildren.filter((child) => 'fields' in child);\r\n  else return placeholderChildren;\r\n};\r\n\r\nexport default placeholderChildren;\r\n","export function scrollTo(ele: HTMLElement) {\r\n  ele.scrollIntoView({\r\n    behavior: 'smooth',\r\n    block: 'start',\r\n  });\r\n}\r\n","import { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { mediaQuery, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ContentParser } from '../../shared/components';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\n\r\ntype ExpandedTextAccordionItemProps = {\r\n  fields: any;\r\n  uid: string;\r\n  innerRef: React.RefObject<HTMLDivElement>;\r\n};\r\n\r\nconst ExpandedTextAccordionItem: React.FC<ExpandedTextAccordionItemProps> = ({ fields = {}, uid, innerRef }) => {\r\n  return (\r\n    <Container ref={innerRef} data-uid={uid}>\r\n      <Typography type=\"h6\">\r\n        <Text field={fields['Title']} />\r\n      </Typography>\r\n      <Typography type=\"paragraph\">\r\n        <ContentParser>\r\n          <RichTextStyle field={fields['Text']} />\r\n        </ContentParser>\r\n      </Typography>\r\n    </Container>\r\n  );\r\n};\r\n\r\nexport default ExpandedTextAccordionItem;\r\n\r\nconst Container = styled.div`\r\n  margin-bottom: 30px;\r\n\r\n  ${mediaQuery.md} {\r\n    margin-bottom: 40px;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    margin-bottom: 50px;\r\n  }\r\n`;\r\n\r\nconst RichTextStyle = styled(RichText)`\r\n  ${richTextStyles}\r\n`;\r\n","import { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { TextAccordionItem as TextAccordionItemComp, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ContentParser } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\n\r\nconst StyledRichText = styled(RichText)`\r\n  ${richTextStyles}\r\n  margin-bottom: 30px;\r\n`;\r\n\r\ntype TextAccordionItemProps = {\r\n  fields: any;\r\n  itemId: any;\r\n};\r\n\r\nconst TextAccordionItem: React.FC<TextAccordionItemProps> = ({ itemId, fields = {} }) => {\r\n  const isEditor = useIsEditor();\r\n\r\n  return isEditor ? (\r\n    <>\r\n      <Typography type=\"h6\">\r\n        <Text field={fields['Title']} />\r\n      </Typography>\r\n      <ContentParser>\r\n        <StyledRichText field={fields['Text']} />\r\n      </ContentParser>\r\n    </>\r\n  ) : (\r\n    <TextAccordionItemComp title={fields['Title']?.value} displayAsLink={true} itemId={itemId}>\r\n      <ContentParser>\r\n        <StyledRichText field={fields['Text']} />\r\n      </ContentParser>\r\n    </TextAccordionItemComp>\r\n  );\r\n};\r\n\r\nexport default TextAccordionItem;\r\n","import { Text, withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { Col, Container, Icons, Row, breakpointsBootstrap, useOnWindowResize } from 'db-npm-rdui';\r\nimport React, { createRef, useCallback, useEffect, useMemo } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { Section } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\nimport placeholderChildren from '../../shared/utils/placeholderChildren';\r\nimport { scrollTo } from '../../shared/utils/scrollTo';\r\nimport ExpandedTextAccordionItem from '../ExpandedTextAccordionItem';\r\nimport TextAccordionItem from '../TextAccordionItem';\r\nimport { useVisibleSection } from './useVisibleSection';\r\n\r\nexport type ExpandedTextAccordionProps = PlaceholderProps & {\r\n  expandedAccordionItems: any;\r\n  rendering: any;\r\n};\r\n\r\nexport type Item = {\r\n  uid: string;\r\n  fields: any;\r\n  ref: React.RefObject<HTMLDivElement>;\r\n};\r\n\r\nconst ExpandedTextAccordion: React.FC<ExpandedTextAccordionProps> = ({ expandedAccordionItems, rendering }) => {\r\n  // isEditor check needed for Sitecore Experience Editor to work\r\n  const isEditor = useIsEditor();\r\n  const [smUp, setSmUp] = React.useState<null | boolean>(null);\r\n  const isSmUp = () => {\r\n    const mql = window.matchMedia(`(min-width: ${breakpointsBootstrap.sm}px)`);\r\n    return mql.matches;\r\n  };\r\n\r\n  useOnWindowResize(() => {\r\n    setSmUp(isSmUp());\r\n  });\r\n\r\n  const items: Item[] = useMemo(\r\n    () =>\r\n      (rendering?.placeholders?.expandedAccordionItems || []).map((item: any) => ({\r\n        ...item,\r\n        ref: createRef<HTMLDivElement>(),\r\n      })),\r\n    [rendering]\r\n  );\r\n\r\n  useEffect(() => {\r\n    const url = new URL(window.location.href);\r\n    items\r\n      .filter((item) => item.uid === url.hash.substring(1))\r\n      .forEach((anchorsec) => {\r\n        if (anchorsec.ref && anchorsec.ref.current) scrollTo(anchorsec.ref.current);\r\n      });\r\n\r\n    setSmUp(isSmUp());\r\n  }, [items, smUp]);\r\n\r\n  const visibleSection = useVisibleSection(items);\r\n\r\n  const handleClick = useCallback(\r\n    (ref: React.RefObject<HTMLDivElement>, uid) => () => {\r\n      window.location.hash = '#' + uid;\r\n      if (ref && ref.current) {\r\n        scrollTo(ref.current);\r\n      }\r\n    },\r\n    []\r\n  );\r\n\r\n  if (!isEditor && smUp === null) return <div />;\r\n  return (\r\n    <Section componentName=\"ExpandedTextAccordion\" margin=\"large\">\r\n      <Container>\r\n        <Row>\r\n          {smUp ? (\r\n            <>\r\n              <Col sm={4}>\r\n                <Sticky>\r\n                  {placeholderChildren(isEditor, items).map(({ uid, ref, fields }) => (\r\n                    <TitleButton key={uid} active={visibleSection === uid} onClick={handleClick(ref, uid)}>\r\n                      <Text field={typeof fields === 'object' ? fields['Title'] : null} />\r\n                      <IconWrapper>\r\n                        <Icons.ArrowRight />\r\n                      </IconWrapper>\r\n                    </TitleButton>\r\n                  ))}\r\n                </Sticky>\r\n              </Col>\r\n              <Col sm={7} offset={{ sm: 1 }}>\r\n                {isEditor\r\n                  ? expandedAccordionItems\r\n                  : items.map(({ uid, ref, fields }) => (\r\n                      <ExpandedTextAccordionItem key={uid} uid={uid} innerRef={ref} fields={fields} />\r\n                    ))}\r\n              </Col>\r\n            </>\r\n          ) : (\r\n            <Col sm={12}>\r\n              {isEditor\r\n                ? expandedAccordionItems\r\n                : items.map(({ uid, fields }) => <TextAccordionItem key={uid} fields={fields} itemId={uid} />)}\r\n            </Col>\r\n          )}\r\n        </Row>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('expandedAccordionItems')(ExpandedTextAccordion);\r\n\r\nconst Sticky = styled.div`\r\n  position: sticky;\r\n  top: 0;\r\n`;\r\n\r\nconst TitleButton = styled.button<{ active?: boolean }>`\r\n  display: block;\r\n  width: 100%;\r\n  margin: 0;\r\n  padding: 15px;\r\n  border: 0;\r\n  border-radius: 0;\r\n  border-bottom: 1px solid #bdbdbd;\r\n  background: transparent;\r\n  text-align: left;\r\n  cursor: pointer;\r\n  font-weight: bold;\r\n\r\n  ${(props) =>\r\n    props.active &&\r\n    css`\r\n      background: #f5f5f5;\r\n    `}\r\n`;\r\n\r\nconst IconWrapper = styled.div`\r\n  float: right;\r\n`;\r\n","import { useEffect, useState } from 'react';\r\nimport type { Item } from './ExpandedTextAccordion';\r\n\r\nexport const useVisibleSection = (items: Item[]) => {\r\n  const [visibleSection, setVisibleSection] = useState('');\r\n\r\n  useEffect(() => {\r\n    const observer = new IntersectionObserver(\r\n      (entries) => {\r\n        entries.forEach((entry) => {\r\n          const uid = entry.target.getAttribute('data-uid');\r\n          if (entry.isIntersecting && uid) {\r\n            window.location.replace('#' + uid);\r\n            setVisibleSection(uid);\r\n          }\r\n        });\r\n      },\r\n      { rootMargin: `0% 0% -80% 0%` }\r\n    );\r\n\r\n    items.forEach((item) => {\r\n      if (item.ref.current) {\r\n        observer.observe(item.ref.current);\r\n      }\r\n    });\r\n\r\n    return () => {\r\n      items.forEach((item) => {\r\n        if (item.ref.current) {\r\n          observer.unobserve(item.ref.current);\r\n        }\r\n      });\r\n    };\r\n  }, [items]);\r\n\r\n  return visibleSection;\r\n};\r\n","import { ConsentLevel, useCookieConsent } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\n\r\ntype FacebookPixelProps = {\r\n  fields: any;\r\n};\r\n\r\nconst FacebookPixel: React.FC<FacebookPixelProps> = ({ fields = {} }) => {\r\n  const facebookPixelId = fields['Facebook Pixel ID']?.value;\r\n  const enableFacebookPixel = useCookieConsent().isAllowed(ConsentLevel.Marketing) && facebookPixelId !== '';\r\n\r\n  React.useEffect(() => {\r\n    if (!enableFacebookPixel) {\r\n      return;\r\n    }\r\n\r\n    //eslint-disable-next-line no-new-func\r\n    new Function(\r\n      `!function(f,b,e,v,n,t,s){{if(f.fbq)return;n=f.fbq=function(){{n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)}};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=\"2.0\";n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}}(window,document,\"script\",\"//connect.facebook.net/en_US/fbevents.js\");fbq(\"init\",\"{facebookPixelId}\");fbq(\"track\",\"PageView\");`.replace(\r\n        '{facebookPixelId}',\r\n        facebookPixelId\r\n      )\r\n    )();\r\n  }, [enableFacebookPixel, facebookPixelId]);\r\n\r\n  if (!enableFacebookPixel) {\r\n    return null;\r\n  }\r\n\r\n  return (\r\n    <span\r\n      dangerouslySetInnerHTML={{\r\n        __html: `<noscript><img height=\"1\" width=\"1\" style=\"display:none\" src=\"https://www.facebook.com/tr?id={facebookPixelId}&ev=PageView&noscript=1\" /></noscript>`.replace(\r\n          '{facebookPixelId}',\r\n          facebookPixelId\r\n        ),\r\n      }}\r\n    ></span>\r\n  );\r\n};\r\n\r\nexport default FacebookPixel;\r\n","import { mediaQuery } from 'db-npm-rdui';\r\nimport { css } from 'styled-components';\r\n\r\nexport type ComponentMarginSize = 'x-small' | 'small' | 'large';\r\n\r\nexport function componentTopMargin(size: ComponentMarginSize) {\r\n  switch (size) {\r\n    case 'x-small':\r\n      return xsmallStyling;\r\n    case 'small':\r\n      return smallStyling;\r\n    case 'large':\r\n      return largeStyling;\r\n  }\r\n}\r\n\r\nconst xsmallStyling = css`\r\n  margin-top: 16px;\r\n  ${mediaQuery.md} {\r\n    margin-top: 18px;\r\n  }\r\n  ${mediaQuery.lg} {\r\n    margin-top: 20px;\r\n  }\r\n  ${mediaQuery.xl} {\r\n    margin-top: 22px;\r\n  }\r\n`;\r\n\r\nconst smallStyling = css`\r\n  margin-top: 45px;\r\n  ${mediaQuery.md} {\r\n    margin-top: 52px;\r\n  }\r\n  ${mediaQuery.lg} {\r\n    margin-top: 58px;\r\n  }\r\n  ${mediaQuery.xl} {\r\n    margin-top: 65px;\r\n  }\r\n`;\r\n\r\nconst largeStyling = css`\r\n  margin-top: 80px;\r\n  ${mediaQuery.md} {\r\n    margin-top: 98px;\r\n  }\r\n  ${mediaQuery.lg} {\r\n    margin-top: 112px;\r\n  }\r\n  ${mediaQuery.xl} {\r\n    margin-top: 124px;\r\n  }\r\n`;\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { applyTextType, Col, Color, Container, Effects, Icons, mediaQuery, Row } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker } from '../../shared/components';\r\nimport { componentTopMargin } from '../../shared/utils/componentTopMargin';\r\n\r\nconst StyledFooter = styled.footer`\r\n  margin-top: 70px;\r\n  padding-bottom: 100px;\r\n  background: #000;\r\n  color: ${Color.white};\r\n\r\n  ${mediaQuery.md} {\r\n    margin-top: 90px;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    margin-top: 110px;\r\n  }\r\n`;\r\n\r\nconst Columns = styled.div`\r\n  border-top: 1px solid #bdbdbd;\r\n  padding-top: 10px;\r\n\r\n  ${mediaQuery.md} {\r\n    padding-top: 10px;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    padding-top: 100px;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    .border {\r\n      ::before {\r\n        content: '';\r\n        display: block;\r\n        position: absolute;\r\n        top: 0;\r\n        left: -15px;\r\n        bottom: 0;\r\n        width: 1px;\r\n        background: #eee;\r\n      }\r\n    }\r\n  }\r\n\r\n  h6 {\r\n    ${applyTextType('h6')}\r\n    margin: 20px 0 15px 0;\r\n    color: ${Color.white};\r\n    ${mediaQuery.lg} {\r\n      margin: 0 0 20px 0;\r\n    }\r\n  }\r\n\r\n  p {\r\n    margin: 0;\r\n  }\r\n\r\n  a {\r\n    display: inline-block;\r\n    position: relative;\r\n    margin: 5px 17px 10px 0;\r\n    font-size: 14px;\r\n    letter-spacing: 0.3px;\r\n    color: ${Color.white};\r\n    text-decoration: none;\r\n    transition: color 0.5s;\r\n    font-weight: 600;\r\n\r\n    ${Effects.Underline()}\r\n\r\n    &:hover,\r\n    &:focus {\r\n      color: ${Color.white};\r\n      ${Effects.UnderlineHover}\r\n    }\r\n  }\r\n`;\r\n\r\nconst SubFooter = styled.div`\r\n  font-style: italic;\r\n  color: ${Color.white};\r\n\r\n  a {\r\n    font-weight: 600;\r\n    color: ${Color.white};\r\n    text-decoration: none;\r\n\r\n    &:hover,\r\n    &:focus {\r\n      text-decoration: underline;\r\n    }\r\n  }\r\n\r\n  strong {\r\n    color: ${Color.white};\r\n  }\r\n`;\r\n\r\nconst TermsText = styled(SubFooter)`\r\n  ${componentTopMargin('small')}\r\n  font-size: 15px;\r\n  line-height: 1.4;\r\n`;\r\n\r\nconst DisclaimerText = styled(SubFooter)`\r\n  border-top: 1px solid #bdbdbd;\r\n  padding-top: 30px;\r\n  margin-top: 30px;\r\n  font-size: 14px;\r\n  line-height: 1.2;\r\n\r\n  ${mediaQuery.lg} {\r\n    padding-right: 200px;\r\n  }\r\n`;\r\n\r\nconst ImageRow = styled(Row)`\r\n  display: flex;\r\n  width: 130px;\r\n  height: 70px;\r\n  align-items: center;\r\n  padding-top: 35px;\r\n  margin-bottom: 30px;\r\n\r\n  ${mediaQuery.lg} {\r\n    padding-top: 105px;\r\n  }\r\n\r\n  a {\r\n    display: block;\r\n    text-decoration: none !important;\r\n\r\n    &:hover,\r\n    &:focus {\r\n      text-decoration: none !important;\r\n    }\r\n  }\r\n\r\n  svg {\r\n    width: 130px;\r\n    height: 32px;\r\n  }\r\n\r\n  img {\r\n    display: block;\r\n    max-width: 130px;\r\n    max-height: 70px;\r\n  }\r\n`;\r\n\r\nexport type FooterProps = {\r\n  fields: any;\r\n};\r\n\r\nconst Footer: React.FC<FooterProps> = ({ fields = {} }) => {\r\n  return (\r\n    <StyledFooter>\r\n      <Container>\r\n        <Row>\r\n          <Col lg={2.5}>\r\n            <ImageRow>\r\n              <Col>\r\n                <a\r\n                  href={fields['Logo Link']?.value.href}\r\n                  aria-label={fields['Logo Link']?.value.text}\r\n                  title={fields['Logo Link']?.value.text}\r\n                >\r\n                  {fields['Logo Image']?.value.src ? (\r\n                    <img src={fields['Logo Image']?.value.src} alt={fields['Logo Image']?.value.href} />\r\n                  ) : (\r\n                    <Icons.LogoWhite />\r\n                  )}\r\n                </a>\r\n              </Col>\r\n            </ImageRow>\r\n          </Col>\r\n          <Col lg={9.5}>\r\n            <Columns>\r\n              <Row>\r\n                <FieldChecker type=\"text\" field={fields['Column 1 Text']}>\r\n                  <Col lg={4} xxl={3}>\r\n                    <RichText field={fields['Column 1 Text']} editable={false} />\r\n                  </Col>\r\n                </FieldChecker>\r\n                <FieldChecker type=\"text\" field={fields['Column 2 Text']}>\r\n                  <Col lg={4} xxl={3} className=\"border\">\r\n                    <RichText field={fields['Column 2 Text']} editable={false} />\r\n                  </Col>\r\n                </FieldChecker>\r\n                <FieldChecker type=\"text\" field={fields['Column 3 Text']}>\r\n                  <Col lg={4} xxl={3} className=\"border\">\r\n                    <RichText field={fields['Column 3 Text']} editable={false} />\r\n                  </Col>\r\n                </FieldChecker>\r\n              </Row>\r\n            </Columns>\r\n\r\n            <Row>\r\n              <Col lg={6}>\r\n                <FieldChecker type=\"text\" field={fields['Terms Text']}>\r\n                  <TermsText>\r\n                    <RichText field={fields['Terms Text']} editable={false} />\r\n                  </TermsText>\r\n                </FieldChecker>\r\n              </Col>\r\n            </Row>\r\n\r\n            <FieldChecker type=\"text\" field={fields['Disclaimer Text']}>\r\n              <DisclaimerText>\r\n                <RichText field={fields['Disclaimer Text']} editable={false} />\r\n              </DisclaimerText>\r\n            </FieldChecker>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n    </StyledFooter>\r\n  );\r\n};\r\n\r\nexport default Footer;\r\n","import { Box, Col, Container, Icons, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n  message: any;\r\n};\r\n\r\nexport const ErrorMessage: React.FC<Props> = ({ message }) => {\r\n  const modalContent = (\r\n    <Container>\r\n      <Row justify=\"center\">\r\n        <Col md={8}>\r\n          <Box textAlign=\"center\" marginTop={12} marginBottom={12}>\r\n            <CustomIconWrapper>\r\n              <Icons.ErrorRed />\r\n            </CustomIconWrapper>\r\n\r\n            <Typography type=\"manchetBig\" mt={20} mb={30}>\r\n              {message}\r\n            </Typography>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  );\r\n\r\n  return modalContent;\r\n};\r\n\r\nconst CustomIconWrapper = styled.div`\r\n  margin-bottom: 20px;\r\n\r\n  ${mediaQuery.md} {\r\n    margin-bottom: 30px;\r\n  }\r\n\r\n  svg {\r\n    width: 60px;\r\n    height: 60px;\r\n  }\r\n`;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Button, Col, Container, Icons, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n  fields: any;\r\n};\r\n/* \r\n  This is a common file use for Tak for din henvendelse\r\n */\r\nexport const ThankYouMessage: React.FC<Props> = ({ fields = {} }) => {\r\n  return (\r\n    <Container>\r\n      <Row justify=\"center\">\r\n        <Col md={8}>\r\n          <Box textAlign=\"center\" marginTop={12} marginBottom={12}>\r\n            <CustomIconWrapper>\r\n              <Icons.Confirm />\r\n            </CustomIconWrapper>\r\n\r\n            <Typography type=\"h3\">\r\n              <Text field={fields['Confirmation Title']} />\r\n            </Typography>\r\n            <Typography type=\"manchetBig\" mt={20} mb={30}>\r\n              <Text field={fields['Confirmation Description']} />\r\n            </Typography>\r\n            <ButtonLink href={fields['Confirmation Link']?.value?.href}>\r\n              <Button>{fields['Confirmation Link']?.value?.text}</Button>\r\n            </ButtonLink>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  );\r\n};\r\n\r\nexport const ThankYouMessage1: React.FC<Props> = ({ fields = {} }) => {\r\n  return (\r\n    <Container>\r\n      <Row justify=\"center\">\r\n        <Col md={8}>\r\n          <Box textAlign=\"center\" marginTop={12} marginBottom={12}>\r\n            <CustomIconWrapper>\r\n              <Icons.Confirm />\r\n            </CustomIconWrapper>\r\n\r\n            <Typography type=\"h3\">{fields['Confirmation Title']}</Typography>\r\n            <Typography type=\"manchetBig\" mt={20} mb={30}>\r\n              {fields['Confirmation Description']}\r\n            </Typography>\r\n            <ButtonLink href={fields['Confirmation Link'].href}>\r\n              <Button>{fields['Confirmation Link'].text}</Button>\r\n            </ButtonLink>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  );\r\n};\r\n\r\nconst CustomIconWrapper = styled.div`\r\n  margin-bottom: 20px;\r\n\r\n  ${mediaQuery.md} {\r\n    margin-bottom: 30px;\r\n  }\r\n\r\n  svg {\r\n    width: 60px;\r\n    height: 60px;\r\n  }\r\n\r\n  circle {\r\n    stroke: #35a478;\r\n  }\r\n  path {\r\n    fill: #35a478;\r\n  }\r\n`;\r\n\r\nconst ButtonLink = styled.a`\r\n  text-decoration: none;\r\n`;\r\n","type FormConfig = {\r\n  /**\r\n   * The API endpoint URL where the form data is submitted to\r\n   */\r\n  apiUrl: string;\r\n  /**\r\n   * The API key to use when requesting the API\r\n   */\r\n  apiKey: string;\r\n  /**\r\n   * The DSID key for the form in EGAIN system.\r\n   * Please provide the string value WITHOUT brackets \"{\" and \"}\"\r\n   */\r\n  egainDsid: string;\r\n};\r\n\r\nexport async function submitFormData(formConfig: FormConfig, formData: any): Promise<any> {\r\n  if (formData && formData.phone && formData.phone.indexOf('+') !== -1) {\r\n    const modifiedPhone = formData.phone.replace('+', '00');\r\n    formData.phone = modifiedPhone;\r\n  }\r\n  if (formData && formData.cpr && formData.cpr.indexOf('-') !== -1) {\r\n    const modifiedCPR = formData.cpr.replace('-', '');\r\n    formData.cpr = modifiedCPR;\r\n  }\r\n  const arrayOfFields = Object.keys(formData).reduce((result, key) => {\r\n    const element = document.getElementsByName(key)[0] as HTMLInputElement;\r\n    if (element) {\r\n      return [\r\n        ...result,\r\n        {\r\n          fieldname: element.getAttribute('data-egainfield') || key,\r\n          fieldlabel: element.getAttribute('data-label') || key,\r\n          fieldvalue:\r\n            element.type === 'checkbox' ? element.getAttribute('data-stringvalue') ?? formData[key] : formData[key],\r\n          maptoegain: element.getAttribute('data-maptoegain') || 'true',\r\n          includeinmailboxemail: element.getAttribute('data-includeinmailboxemail') || 'true',\r\n        },\r\n      ];\r\n    }\r\n    return result;\r\n  }, [] as any[]);\r\n\r\n  const formBody = {\r\n    email: formData.email || '', // should be empty if there is no email field in the form\r\n    name: formData.fullname ? formData.fullname : formData.fname ? formData.fname : '',\r\n    firstname: formData.fname ? formData.fname : formData.fullname ? formData.fullname : '',\r\n    dsid: `{${formConfig.egainDsid}}`,\r\n    mailboxId: formData.mailboxId ? formData.mailboxId : '',\r\n    language: 'da',\r\n    version: 'v1',\r\n    emailsubject: formData.emailsubject,\r\n    formfieldsdata: {\r\n      formfields: arrayOfFields,\r\n    },\r\n  };\r\n\r\n  const response = await fetch(formConfig.apiUrl, {\r\n    method: 'POST',\r\n    headers: {\r\n      Accept: 'application/json',\r\n      'Content-Type': 'application/json',\r\n      'Access-Control-Allow-Origin': '*',\r\n      sc_apikey: formConfig.apiKey,\r\n    },\r\n    mode: 'cors',\r\n    body: JSON.stringify(formBody),\r\n  })\r\n    .then((response) => response.json())\r\n    .then((response) => {\r\n      const json = response;\r\n      if (json === 'success') {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    })\r\n    .catch((error) => {\r\n      console.warn('Form submit error:', error);\r\n      return false;\r\n    });\r\n  return response;\r\n}\r\n","import { Color, RddkTheme } from 'db-npm-rdui';\r\nimport React, { TextareaHTMLAttributes, useState } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nexport type TextAreaProps = {\r\n  label: string | React.ReactNode;\r\n  disabled?: boolean;\r\n  errorMessage?: string;\r\n  value?: string;\r\n  maxLength?: number;\r\n  autosize?: boolean;\r\n  placeholder?: string;\r\n  onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\r\n};\r\n\r\nconst TextAreaWrapper = styled.div`\r\n  display: flex;\r\n  flex-direction: column;\r\n  padding: 9px 20px;\r\n  position: relative;\r\n  min-height: 56px;\r\n  width: 100%;\r\n  border-radius: 5px;\r\n  background: #fff;\r\n  border: 1px solid #9e9e9e;\r\n  letter-spacing: 0.3px;\r\n  color: #4f4f4f;\r\n`;\r\n\r\nconst Label = styled.label<{\r\n  hasValue: boolean;\r\n}>`\r\n  order: 1;\r\n  pointer-events: none;\r\n  text-shadow: none;\r\n  transform-origin: left top;\r\n  transform: scale(1) translate3d(0, 10px, 0);\r\n  transition: 200ms ease all;\r\n  font-size: 16px;\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  font-style: italic;\r\n  color: #4f4f4f;\r\n  position: absolute;\r\n  ${({ hasValue }) => (hasValue ? `transform: scale(0.8) translate3d(0, -2px, 0)` : '')}\r\n`;\r\n\r\nconst InnerTextArea = styled.textarea`\r\n  width: 100%;\r\n  display: flex;\r\n  flex: 1 1 auto;\r\n  order: 2;\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  color: #000000;\r\n  border: none;\r\n  outline: none;\r\n  overflow: hidden;\r\n  font-size: 15px;\r\n  line-height: 19px;\r\n  font-weight: 600;\r\n  letter-spacing: -0.21px;\r\n  background-color: transparent;\r\n  padding: 0;\r\n  resize: none;\r\n  padding-top: 18px;\r\n\r\n  ::-ms-clear {\r\n    display: none;\r\n  }\r\n\r\n  &:disabled {\r\n    color: ${Color.possumGrey};\r\n    cursor: not-allowed;\r\n  }\r\n\r\n  &:focus + ${Label} {\r\n    transform: scale(0.8) translate3d(0, -2px, 0);\r\n  }\r\n`;\r\n\r\nexport const AutoTextArea: React.FC<TextAreaProps & TextareaHTMLAttributes<HTMLTextAreaElement>> = ({\r\n  label,\r\n  disabled,\r\n  errorMessage,\r\n  value,\r\n  autosize,\r\n  onChange,\r\n  maxLength,\r\n  required,\r\n  id,\r\n  ...props\r\n}) => {\r\n  const [hasValue, sethasValue] = useState(false);\r\n\r\n  const handleOnChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n    sethasValue(false);\r\n    if (event.target.value !== '') {\r\n      sethasValue(true);\r\n    }\r\n\r\n    if (maxLength && event.target.value.length > maxLength) {\r\n      return event.stopPropagation();\r\n    }\r\n\r\n    if (autosize) {\r\n      event.target.style.height = 'auto';\r\n      event.target.style.height = event.target.scrollHeight + 'px';\r\n    }\r\n\r\n    if (onChange) {\r\n      onChange(event);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <TextAreaWrapper>\r\n      <InnerTextArea\r\n        id={id}\r\n        disabled={disabled}\r\n        value={value}\r\n        maxLength={maxLength}\r\n        onChange={handleOnChange}\r\n        required={required}\r\n        {...props}\r\n        rows={1}\r\n      />\r\n      <Label hasValue={hasValue} htmlFor={id}>\r\n        {label}\r\n      </Label>\r\n    </TextAreaWrapper>\r\n  );\r\n};\r\n\r\nexport default AutoTextArea;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst CheckboxWrapper = styled.div`\r\n  padding: 17px 20px;\r\n  border-radius: 5px;\r\n  background: #fff;\r\n  border: 1px solid #9e9e9e;\r\n  color: #000;\r\n`;\r\n\r\nconst CheckboxInput = styled.input.attrs({\r\n  type: 'checkbox',\r\n})`\r\n  cursor: pointer;\r\n  float: right;\r\n  margin-top: 4px;\r\n`;\r\n\r\nconst Label = styled.label`\r\n  font-weight: bold;\r\n`;\r\n\r\nexport type CheckboxProps = {\r\n  label: string;\r\n  name?: string;\r\n  value: any;\r\n  onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n};\r\n\r\nexport const Checkbox: React.FC<CheckboxProps> = ({ label, name, value, onChange, ...rest }) => (\r\n  <CheckboxWrapper>\r\n    <CheckboxInput id={name} name={name} value={value} onChange={onChange} {...rest} />\r\n    <Label htmlFor={name}>{label}</Label>\r\n  </CheckboxWrapper>\r\n);\r\n","import { Box, Button, ButtonGroup, Col, Color, Container, mediaQuery, Row } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\n\r\ntype FormFooterProps = {\r\n  trackingChangeHandler?: (e: any) => void;\r\n  setPreviousPage?: () => void;\r\n  page: number;\r\n  fileList?: any;\r\n  step1Label: string;\r\n  step2Label: string;\r\n  step3Label: string;\r\n  isFromCVR?: boolean;\r\n  setSubmit?: () => void;\r\n};\r\n\r\nexport const FormFooter: React.FC<FormFooterProps> = ({\r\n  trackingChangeHandler,\r\n  setPreviousPage,\r\n  page,\r\n  fileList,\r\n  step1Label,\r\n  step2Label,\r\n  step3Label,\r\n  setSubmit,\r\n}) => {\r\n  const { t } = useTranslation();\r\n  return (\r\n    <BoxWrapper>\r\n      <Box backgroundColor={Color.white} paddingTop={{ _: 4, md: 6, lg: 6 }} paddingBottom={{ _: 4, md: 6, lg: 6 }}>\r\n        <Container>\r\n          <Row>\r\n            <ColText md={9}>\r\n              {' '}\r\n              <Text className={page === 0 ? 'active' : ''}>{step1Label}</Text> /{' '}\r\n              <Text className={page === 1 ? 'active' : ''}>{step2Label}</Text> /{' '}\r\n              <Text className={page === 2 ? 'active' : ''}>{step3Label}</Text>\r\n            </ColText>\r\n\r\n            <Col md={3}>\r\n              <ButtonGroupDiv>\r\n                {page !== 0 && (\r\n                  <Button type=\"button\" variant=\"secondary\" onClick={setPreviousPage}>\r\n                    {t('form-button-prev-label')}\r\n                  </Button>\r\n                )}\r\n                {page !== 2 && (\r\n                  <Button type=\"submit\" onClick={trackingChangeHandler} id=\"submitbtn\" data-testid=\"buttonSubmit\">\r\n                    {t('form-button-next-label')}\r\n                  </Button>\r\n                )}\r\n                {page === 2 && (\r\n                  <Button type=\"button\" disabled={fileList.length === 0} onClick={setSubmit}>\r\n                    {t('upload-text-submit-label')}\r\n                  </Button>\r\n                )}\r\n              </ButtonGroupDiv>\r\n            </Col>\r\n          </Row>\r\n        </Container>\r\n      </Box>\r\n    </BoxWrapper>\r\n  );\r\n};\r\n\r\nconst Text = styled.span`\r\n  &.active {\r\n    color: ${Color.red50};\r\n  }\r\n`;\r\n\r\nconst ColText = styled(Col)`\r\n  text-align: left;\r\n  display: block;\r\n  padding-top: 13px;\r\n\r\n  ${mediaQuery.lg} {\r\n    text-align: center;\r\n  }\r\n\r\n  ${mediaQuery.smDown} {\r\n    display: none;\r\n  }\r\n`;\r\n\r\nconst ButtonGroupDiv = styled(ButtonGroup)`\r\n  float: right;\r\n`;\r\n\r\nconst BoxWrapper = styled.div`\r\n  position: sticky;\r\n  bottom: 0;\r\n  width: 100%;\r\n  z-index: 1000;\r\n\r\n  margin-bottom: -70px;\r\n\r\n  ${mediaQuery.md} {\r\n    margin-bottom: -90px;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    margin-bottom: -110px;\r\n  }\r\n`;\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Col, Color, Container, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { richTextStyles } from '../../../components/RichText/richTextStyles';\r\n\r\ntype FormLayoutProps = {\r\n  headline?: string;\r\n  description?: any;\r\n  infoDescription?: any;\r\n  formTitle?: string;\r\n  children?: any;\r\n};\r\n\r\nconst StyledRichText = styled(RichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\nexport const FormLayout: React.FC<FormLayoutProps> = ({\r\n  headline,\r\n  description,\r\n  infoDescription,\r\n  formTitle,\r\n  children,\r\n}) => {\r\n  return (\r\n    <Box backgroundColor={Color.grey10} paddingTop={{ _: 6, md: 8, lg: 10 }} paddingBottom={{ _: 6, md: 8, lg: 10 }}>\r\n      <Container>\r\n        <Row>\r\n          <Col md={6}>\r\n            <Typography type=\"h3\">{headline}</Typography>\r\n            <Typography type=\"manchetSmall\" mt={20}>\r\n              {description.value ? <StyledRichText field={description} editable={false} /> : description}\r\n            </Typography>\r\n\r\n            {infoDescription && <InfoDescription>{infoDescription}</InfoDescription>}\r\n          </Col>\r\n\r\n          <Col md={5} offset={{ md: 1 }}>\r\n            <FormTitle>{formTitle}</FormTitle>\r\n            {children}\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n    </Box>\r\n  );\r\n};\r\n\r\nconst FormTitle = styled.div`\r\n  font-size: 14px;\r\n  font-weight: bold;\r\n  text-transform: uppercase;\r\n  color: ${Color.rdBlackTint2};\r\n  letter-spacing: 2px;\r\n  margin-top: 30px;\r\n\r\n  ${mediaQuery.md} {\r\n    margin-top: 0;\r\n  }\r\n`;\r\n\r\nconst InfoDescription = styled.div`\r\n  background-color: #ffea93;\r\n  padding: 5px 25px;\r\n  border-radius: 5px;\r\n  margin-top: 20px;\r\n  font-size: 14px;\r\n  color: ${Color.black};\r\n\r\n  li {\r\n    margin: 15px;\r\n    font-size: 16px;\r\n  }\r\n\r\n  ${mediaQuery.md} {\r\n    padding: 12px 35px 20px;\r\n  }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nexport const FormRow = styled.div`\r\n  margin: 12px 0;\r\n`;\r\n","// CPR regex copy-pasted from:\r\n// https://euromind.com/felt-for-cpr-nummer/\r\nexport const CprRegex = new RegExp(\r\n  /^(((0[1-9]|[12][0-9]|30)(0[13-9]|1[012])|31(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])02)[0-9]{2}|2902((([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))(-|\\s)?\\d{4}/\r\n);\r\n","export const NameRegex = new RegExp(/^[a-zA-ZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü¡¿çÇßØøÅåÆæÞþÐð. -]+$/);\r\n","export const NumberRegex = new RegExp(/^[0-9]*$/);\r\n","export const PartnerRegex = new RegExp(/^((\\d{4}[.]{0,1}\\d{4})|([-][0-9]{3}))+$/);\r\n","export const PhoneRegex = new RegExp(/^[+]{0,1}[0-9 ]*$/);\r\n","import { Button, ErrorMessage, InputField, Select, Typography } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { AutoTextArea } from '../../shared/components/AutoTextArea/AutoTextArea';\r\nimport { Checkbox } from '../../shared/components/Checkbox/Checkbox';\r\nimport { FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport { getSchema } from './schema';\r\n\r\ntype Props = {\r\n  fields: any;\r\n  onSubmitData: (formData: any) => Promise<void>;\r\n};\r\n\r\nconst BUSINESS_TOPIC_OPTIONS = [\r\n  {\r\n    label: 'Book møde',\r\n    value: 'Book møde',\r\n  },\r\n  {\r\n    label: 'Ny kunde',\r\n    value: 'Ny kunde',\r\n  },\r\n  {\r\n    label: 'Køb af ejendom',\r\n    value: 'Køb af ejendom',\r\n  },\r\n  {\r\n    label: 'Nyt lån/tillægslån',\r\n    value: 'Nyt lån/tillægslån',\r\n  },\r\n  {\r\n    label: 'Omlægning af lån',\r\n    value: 'Omlægning af lån',\r\n  },\r\n  {\r\n    label: 'Udløb af afdragsfrihed',\r\n    value: 'Udløb af afdragsfrihed',\r\n  },\r\n  {\r\n    label: 'Rentetilpasning',\r\n    value: 'Rentetilpasning',\r\n  },\r\n  {\r\n    label: 'Indfrielse af lån',\r\n    value: 'Indfrielse af lån',\r\n  },\r\n  {\r\n    label: 'Opsigelse af lån',\r\n    value: 'Opsigelse af lån',\r\n  },\r\n  {\r\n    label: 'Andet',\r\n    value: 'Andet',\r\n  },\r\n];\r\n\r\nconst PRIVATE_TOPIC_OPTIONS = [\r\n  {\r\n    label: 'Ny kunde',\r\n    value: 'Ny kunde',\r\n  },\r\n  {\r\n    label: 'Køb af bolig',\r\n    value: 'Køb af bolig',\r\n  },\r\n  {\r\n    label: 'Salg af bolig',\r\n    value: 'Salg af bolig',\r\n  },\r\n  {\r\n    label: 'Nyt lån/tillægslån',\r\n    value: 'Nyt lån/tillægslån',\r\n  },\r\n  {\r\n    label: 'Omlægning af lån',\r\n    value: 'Omlægning af lån',\r\n  },\r\n  {\r\n    label: 'Udløb af afdragsfrihed',\r\n    value: 'Udløb af afdragsfrihed',\r\n  },\r\n  {\r\n    label: 'Rentetilpasning',\r\n    value: 'Rentetilpasning',\r\n  },\r\n  {\r\n    label: 'Indfrielse af lån',\r\n    value: 'Indfrielse af lån',\r\n  },\r\n  {\r\n    label: 'Opsigelse af lån',\r\n    value: 'Opsigelse af lån',\r\n  },\r\n  {\r\n    label: 'Andet',\r\n    value: 'Andet',\r\n  },\r\n];\r\n\r\nconst WhiteBg = styled.div`\r\n  background: #fff;\r\n`;\r\n\r\nconst LabelHeader = styled(Typography)`\r\n  display: block;\r\n  margin-bottom: 10px;\r\n`;\r\n\r\nconst CallMeForm: React.FC<Props> = ({ fields = {}, onSubmitData }) => {\r\n  const privateMailboxId = fields['Private Mailbox ID']?.value || '';\r\n  const businessMailboxId = fields['Business Mailbox ID']?.value || '';\r\n  const partialMailSubject = fields['Mail Subject']?.value;\r\n  const [TOPIC_OPTIONS, setTopic] = useState(PRIVATE_TOPIC_OPTIONS);\r\n  const [mailBoxId, setmailBoxId] = useState(privateMailboxId);\r\n\r\n  const { t } = useTranslation();\r\n  const schema = getSchema(t);\r\n  const launchData: LaunchData = {\r\n    form_product: 'Contact form',\r\n    form_type: 'Customer contact via telephone',\r\n    form_name: 'Call me form',\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n  const { onFormInteraction } = useAdobeTracking(launchData);\r\n\r\n  useEffect(() => {\r\n    const url = new URL(window.location.href);\r\n    const isBusiness = url.searchParams.get('formtype')?.toLowerCase() === 'business';\r\n    if (isBusiness) {\r\n      setTopic(BUSINESS_TOPIC_OPTIONS);\r\n      setmailBoxId(businessMailboxId);\r\n    }\r\n  }, [businessMailboxId]);\r\n\r\n  return (\r\n    <FormLayout headline={fields['Headline']?.value} description={fields['Description']?.value}>\r\n      <Formik\r\n        initialValues={{\r\n          topic: TOPIC_OPTIONS[0].value,\r\n          isExistingCustomer: false,\r\n          fullname: '',\r\n          phone: '',\r\n          email: '',\r\n          comment: '',\r\n          mailboxId: mailBoxId,\r\n          emailsubject: 'Ny kunde - Er ikke kunde - ' + partialMailSubject,\r\n        }}\r\n        validationSchema={schema}\r\n        onSubmit={(values) => {\r\n          onSubmitData(values);\r\n        }}\r\n      >\r\n        {({ values, errors, touched, handleChange }) => {\r\n          const trackingChangeHandler = (e) => {\r\n            onFormInteraction(e, handleChange);\r\n          };\r\n\r\n          const setSubjectFromTopic = (e) => {\r\n            if (!showExistingCustomer(e.currentTarget.value)) {\r\n              values.isExistingCustomer = false;\r\n            }\r\n            if (values.isExistingCustomer) {\r\n              values.emailsubject = e.currentTarget.value + ' - Er kunde - ' + partialMailSubject;\r\n            } else {\r\n              values.emailsubject = e.currentTarget.value + ' - Er ikke kunde - ' + partialMailSubject;\r\n            }\r\n            trackingChangeHandler(e);\r\n          };\r\n\r\n          const setSubjectFromCheckbox = (e) => {\r\n            if (e.currentTarget.checked) {\r\n              values.emailsubject = values.topic + ' - Er kunde ' + partialMailSubject;\r\n              e.currentTarget.dataset.stringvalue = 'Ja';\r\n            } else {\r\n              values.emailsubject = values.topic + ' - Er ikke kunde ' + partialMailSubject;\r\n              e.currentTarget.dataset.stringvalue = 'Nej';\r\n            }\r\n            trackingChangeHandler(e);\r\n          };\r\n\r\n          const showExistingCustomer = (topic) =>\r\n            topic !== BUSINESS_TOPIC_OPTIONS[1].value && topic !== PRIVATE_TOPIC_OPTIONS[0].value;\r\n\r\n          return (\r\n            <Form noValidate>\r\n              <FormRow>\r\n                <LabelHeader type=\"label\" as=\"label\" htmlFor=\"topic\">\r\n                  {fields['Form Title']?.value}\r\n                </LabelHeader>\r\n                <WhiteBg>\r\n                  <Select\r\n                    name=\"topic\"\r\n                    id=\"topic\"\r\n                    onChange={setSubjectFromTopic}\r\n                    options={TOPIC_OPTIONS}\r\n                    hasBorder\r\n                    value={values.topic}\r\n                    isBold\r\n                    data-maptoegain=\"true\"\r\n                    data-egainfield=\"misc_one\"\r\n                    data-label={fields['Form Title']?.value}\r\n                    data-includeinmailboxemail=\"true\"\r\n                  />\r\n                </WhiteBg>\r\n                {touched.topic && errors.topic && <ErrorMessage>{errors.topic}</ErrorMessage>}\r\n              </FormRow>\r\n              <FormRow>\r\n                {showExistingCustomer(values.topic) && (\r\n                  <Checkbox\r\n                    label={t('form-checkbox-iscustomer-label')}\r\n                    name=\"isExistingCustomer\"\r\n                    value={values.isExistingCustomer}\r\n                    data-stringvalue=\"Nej\"\r\n                    data-maptoegain=\"true\"\r\n                    data-egainfield=\"misc_two\"\r\n                    data-label={t('form-checkbox-iscustomer-label')}\r\n                    data-includeinmailboxemail=\"true\"\r\n                    onChange={setSubjectFromCheckbox}\r\n                  />\r\n                )}\r\n              </FormRow>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"fullname\"\r\n                  id=\"fullname\"\r\n                  label={t('form-input-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.fullname}\r\n                  onChange={trackingChangeHandler}\r\n                  maxLength={50}\r\n                  data-maptoegain=\"true\"\r\n                  data-egainfield=\"customer_name\"\r\n                  data-label={t('form-input-name-label')}\r\n                  data-includeinmailboxemail=\"true\"\r\n                  errorMessage={touched.fullname && errors.fullname ? errors.fullname : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  maxLength={20}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_phone\"\r\n                  data-label={t('form-input-phone-label')}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"email\"\r\n                  id=\"email\"\r\n                  label={t('form-input-email-label')}\r\n                  layout=\"white\"\r\n                  value={values.email}\r\n                  maxLength={100}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"email\"\r\n                  data-label={t('form-input-email-label')}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.email && errors.email ? errors.email : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <AutoTextArea\r\n                  label={t('form-textarea-comment-label')}\r\n                  id=\"comment\"\r\n                  name=\"comment\"\r\n                  value={values.comment}\r\n                  maxLength={250}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"misc_text\"\r\n                  data-label={t('form-textarea-comment-label')}\r\n                  autosize={true}\r\n                  onChange={trackingChangeHandler}\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <Button onClick={trackingChangeHandler} id=\"submit\" type=\"submit\">\r\n                  {t('form-button-send-label')}\r\n                </Button>\r\n              </FormRow>\r\n            </Form>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </FormLayout>\r\n  );\r\n};\r\n\r\nexport default CallMeForm;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\nimport { NameRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    topic: Yup.string().required(t('form-select-required-error')),\r\n    fullname: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-name-error')),\r\n    phone: Yup.string()\r\n      .required(t('form-required-error'))\r\n      .matches(PhoneRegex, t('form-input-phone-error'))\r\n      .min(8, t('form-input-phone-error')),\r\n    email: Yup.string().required(t('form-required-error')).email(t('form-input-email-error')),\r\n  });\r\n}\r\n","import { Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormData } from '../../shared/forms/submitFormData';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport CallMeForm from './CallMeForm';\r\n\r\nexport type FormCallMeProps = {\r\n  fields: any;\r\n};\r\n\r\nconst FormCallMe: React.FC<FormCallMeProps> = ({ fields = {} }) => {\r\n  const [page, setPage] = useState(0);\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const { trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking();\r\n\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  const onSubmitData = async (formData) => {\r\n    try {\r\n      let returndata = await submitFormData(\r\n        {\r\n          apiUrl: fields['API Endpoint URL']?.value,\r\n          apiKey: fields['API Key']?.value,\r\n          egainDsid: fields['Egain DSID']?.value,\r\n        },\r\n        formData\r\n      );\r\n      if (returndata) {\r\n        trackFormSubmitSuccess();\r\n        goToNextPage();\r\n      } else {\r\n        trackFormSubmitFail();\r\n\r\n        //Error Handling\r\n        setShowModal(true);\r\n      }\r\n    } catch (err) {\r\n      trackFormSubmitFail();\r\n      console.error(err);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * conditional rendering\r\n   */\r\n  switch (page) {\r\n    case 0:\r\n      return (\r\n        <>\r\n          <CallMeForm fields={fields} onSubmitData={onSubmitData} />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </>\r\n      );\r\n    case 1: //Thank You Message\r\n      return <ThankYouMessage fields={fields} />;\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormCallMe;\r\n","type FormConfigSubmit = {\r\n  /**\r\n   * The API endpoint URL where the form data is submitted to\r\n   */\r\n  apiUrl: string;\r\n  /**\r\n   * The DSID key for the form in EGAIN system.\r\n   * Please provide the string value WITHOUT brackets \"{\" and \"}\"\r\n   */\r\n  egainDsid: string;\r\n  /**\r\n   * The From mail box used when email was triggered (sender)\r\n   */\r\n  fromMailBox: string;\r\n  /**\r\n   * The To mail box used when email was triggered (receiver)\r\n   */\r\n  toMailBox: string;\r\n};\r\ntype FormConfigUpload = {\r\n  apiUrl: string;\r\n  egainDsid: string;\r\n};\r\nexport async function submitFormData(\r\n  formConfig: FormConfigSubmit,\r\n  subject: string,\r\n  formData: any,\r\n  fileIdData: any,\r\n  attachId: any\r\n): Promise<any> {\r\n  if (formData && formData.phone && formData.phone.indexOf('+') !== -1) {\r\n    const modifiedPhone = formData.phone.replace('+', '00');\r\n    formData.phone = modifiedPhone;\r\n  }\r\n  if (formData && formData.cpr && formData.cpr.indexOf('-') !== -1) {\r\n    const modifiedCPR = formData.cpr.replace('-', '');\r\n    formData.cpr = modifiedCPR;\r\n  }\r\n  const myHeaders = new Headers();\r\n  myHeaders.append('Content-Type', 'application/json');\r\n\r\n  const valueObj = Object.keys(formData);\r\n  let fieldObj = valueObj.map((key) => `${key}:${formData[key]}`).join('!#');\r\n\r\n  let techDetailsObj = `!#!#!#****************************!# Technical Details !#****************************!#!#  Attach Id : ${attachId}!#!#`;\r\n\r\n  const fileIdObj = fileIdData.map((a, index) => `File id ${index + 1} : ${a} `).join('!#');\r\n\r\n  const finalMailBody = fieldObj + techDetailsObj + fileIdObj;\r\n\r\n  const raw = JSON.stringify({\r\n    FldNavnH: formConfig.fromMailBox,\r\n    FldSendTo: formConfig.toMailBox,\r\n    FldSubjH: subject,\r\n    FldText: finalMailBody,\r\n    FileId: '',\r\n    DSId: `{${formConfig.egainDsid}}`,\r\n    DocumentFile0: '',\r\n    Language: 'da',\r\n    AttachId: attachId,\r\n  });\r\n\r\n  const response = await fetch(formConfig.apiUrl, {\r\n    method: 'POST',\r\n    headers: myHeaders,\r\n    body: raw,\r\n    redirect: 'follow',\r\n  })\r\n    .then((response) => response.json())\r\n    .then((response) => {\r\n      if (response.ErrorId === '0') {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    })\r\n    .catch((error) => {\r\n      console.warn('Form submit error:', error);\r\n      return false;\r\n    });\r\n  return response;\r\n}\r\n\r\nexport function attachFileGetUploadParams(formConfig: FormConfigUpload, attachId: any, hasCompress: any, subject: any) {\r\n  const getUploadParams = () => ({\r\n    url: formConfig.apiUrl,\r\n    fields: {\r\n      FldHasCompress: hasCompress,\r\n      DSId: `{${formConfig.egainDsid}}`,\r\n      Language: 'da',\r\n      AttachId: attachId,\r\n      FldSubjH: subject,\r\n    },\r\n  });\r\n  return getUploadParams;\r\n}\r\n\r\nexport async function removeFile(file: any, formConfig: FormConfigUpload, attachId: any): Promise<any> {\r\n  if (file.status !== 1) {\r\n    return true;\r\n  }\r\n  const responseObj = file.response;\r\n  try {\r\n    const result = await fetch(formConfig.apiUrl, {\r\n      method: 'POST',\r\n      headers: {\r\n        'Content-Type': 'application/json',\r\n      },\r\n      body: JSON.stringify({\r\n        AttachId: attachId,\r\n        FileId: responseObj.FileId,\r\n        DSId: `{${formConfig.egainDsid}}`,\r\n        Language: 'da',\r\n      }),\r\n    });\r\n    const text = await result.text(); // Needed for Response stream to resolve\r\n    const json = JSON.parse(text);\r\n    const isSuccess = json.ErrorId === '0';\r\n    return isSuccess;\r\n  } catch {\r\n    return false;\r\n  }\r\n}\r\n","import i18next from 'i18next';\r\n\r\nexport const handleTranslation = (text: string) => {\r\n  const checkText = text !== i18next.t(text) ? i18next.t(text) : null;\r\n  return checkText;\r\n};\r\n","import { RichText as SitecoreRichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Button, Color, mediaQuery, Modal, RadioButtonBox, RadioButtonBoxGroup, Typography } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { FormFooter, FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport { handleTranslation } from '../../shared/utils/handleTranslation';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\n\r\nconst StyledRichText = styled(SitecoreRichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\ntype Props = {\r\n  fields: any;\r\n  goToNextPage: () => void;\r\n  page: number;\r\n};\r\n\r\nconst Page0Choose: React.FC<Props> = ({ fields = {}, goToNextPage, page }) => {\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const { onFormInteraction } = useAdobeTracking();\r\n  const callMeFormURL = fields['Call Me Form URL']?.value?.href || '';\r\n\r\n  const modalContactHeadLabel = handleTranslation('modal-contact-head-label');\r\n  const modalContactCPRLabel = handleTranslation('modal-contact-content-label');\r\n  const modalFooterButtonLabel = handleTranslation('modal-contact-button-label');\r\n  const modalContactFooterLabel = handleTranslation('modal-contact-footer-label');\r\n  const modalContactPhoneLabel = handleTranslation('modal-contact-footer-phone-label');\r\n  const modalFooterOpenLabel = handleTranslation('modal-contact-footer-open-label');\r\n  const modalFooterTimingLabel = handleTranslation('modal-contact-footer-timing-label');\r\n\r\n  /**\r\n   * This function toggles the \"showModal\" to the opposite value of the current\r\n   */\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const callmeForm = () => {\r\n    if (!!callMeFormURL && window && window.location) {\r\n      window.location.href = callMeFormURL;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * The content for the modal\r\n   */\r\n  const modalContent = (\r\n    <ModalContainer>\r\n      <Typography type=\"h3\">{modalContactHeadLabel}</Typography>\r\n      <Typography type=\"manchetBig\" mt={30} mb={30}>\r\n        {modalContactCPRLabel}\r\n      </Typography>\r\n      <ButtonLink>\r\n        <Button onClick={callmeForm}>{modalFooterButtonLabel}</Button>\r\n      </ButtonLink>\r\n      <Typography type=\"image\" mt={30}>\r\n        {modalContactFooterLabel} <ModalTextRed>{modalContactPhoneLabel}</ModalTextRed>\r\n      </Typography>\r\n      <Typography type=\"image\" mt={10}>\r\n        <ModalTextGreen>{modalFooterOpenLabel}</ModalTextGreen>\r\n        {' ' /* Space between green text and the rest */}\r\n        {modalFooterTimingLabel}\r\n      </Typography>\r\n    </ModalContainer>\r\n  );\r\n\r\n  return (\r\n    <Formik\r\n      initialValues={{\r\n        hasCpr: 'yes',\r\n      }}\r\n      onSubmit={(values) => {\r\n        if (values.hasCpr === 'yes') {\r\n          goToNextPage();\r\n        } else {\r\n          toggleModal();\r\n        }\r\n      }}\r\n    >\r\n      {({ values, handleChange }) => {\r\n        const trackingChangeHandler = (e) => {\r\n          onFormInteraction(e, handleChange);\r\n        };\r\n\r\n        return (\r\n          <Form noValidate>\r\n            <FormLayout\r\n              headline={fields['Headline']?.value}\r\n              description={<StyledRichText field={fields['Choose CPR Description']} />}\r\n            >\r\n              <TextHeader type=\"h6\" as=\"h3\" mb={30}>\r\n                {fields['Choose CPR Title']?.value}\r\n              </TextHeader>\r\n              <FormRow>\r\n                <RadioButtonWrapper>\r\n                  <RadioButtonBox\r\n                    label={t('form-input-yes-label')}\r\n                    id=\"cpr_yes\"\r\n                    name=\"hasCpr\"\r\n                    value=\"yes\"\r\n                    variant=\"secondary\"\r\n                    checked={values.hasCpr === 'yes'}\r\n                    onChange={trackingChangeHandler}\r\n                  />\r\n                </RadioButtonWrapper>\r\n              </FormRow>\r\n              <FormRow>\r\n                <RadioButtonWrapper>\r\n                  <RadioButtonBox\r\n                    label={t('form-input-no-label')}\r\n                    id=\"cpr_no\"\r\n                    name=\"hasCpr\"\r\n                    value=\"no\"\r\n                    variant=\"secondary\"\r\n                    checked={values.hasCpr === 'no'}\r\n                    onChange={trackingChangeHandler}\r\n                  />\r\n                </RadioButtonWrapper>\r\n              </FormRow>\r\n\r\n              <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n                {modalContent}\r\n              </Modal>\r\n            </FormLayout>\r\n            <FormFooter\r\n              step1Label={t('CPR-footer-step1-title')}\r\n              step2Label={t('CPR-footer-step2-title')}\r\n              step3Label={t('CPR-footer-step3-title')}\r\n              trackingChangeHandler={trackingChangeHandler}\r\n              page={page}\r\n            />\r\n          </Form>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nexport default Page0Choose;\r\n\r\nconst ModalContainer = styled.div`\r\n  padding: 50px 0;\r\n  text-align: center;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 664px;\r\n    padding: 80px 0;\r\n  }\r\n\r\n  ${mediaQuery.xl} {\r\n    padding: 120px 0 80px 0;\r\n  }\r\n`;\r\n\r\nconst ButtonLink = styled.a`\r\n  text-decoration: none;\r\n`;\r\n\r\nconst ModalTextGreen = styled.span`\r\n  color: #008523;\r\n`;\r\n\r\nconst ModalTextRed = styled.span`\r\n  color: ${Color.rdRed};\r\n  text-decoration: underline;\r\n`;\r\n\r\nconst RadioButtonWrapper = styled(RadioButtonBoxGroup)`\r\n  label {\r\n    margin-top: 0;\r\n  }\r\n`;\r\n\r\nconst TextHeader = styled(Typography)`\r\n  margin-bottom: 30px;\r\n`;\r\n","import * as Yup from 'yup';\r\n\r\ndeclare module 'yup' {\r\n  interface StringSchema {\r\n    cprValidation(message: string): StringSchema;\r\n  }\r\n}\r\n\r\nYup.addMethod(Yup.string, 'cprValidation', function (message) {\r\n  return this.test('cpr', message, function (value) {\r\n    const cpr = value ? value.trim().replace('-', '') : '';\r\n\r\n    // Check that input is exactly 10 characters long\r\n\r\n    if (cpr.length !== 10) {\r\n      return false;\r\n    }\r\n\r\n    //Check if CPR is a kindi number\r\n    if (parseInt(cpr[0]) === 8) {\r\n      return true;\r\n    }\r\n\r\n    // Check that birth date is valid\r\n    const dobDay = cpr.substring(0, 2);\r\n    const dobMonth = cpr.substring(2, 4);\r\n    const dobYear = cpr.substring(4, 6);\r\n\r\n    const day = parseInt(dobDay);\r\n    const month = parseInt(dobMonth);\r\n\r\n    const centuryChar = parseInt(cpr[6]);\r\n    let fullYear = '19' + dobYear;\r\n    if (centuryChar === 4 || centuryChar === 9) {\r\n      if (parseInt(dobYear) <= 36) {\r\n        fullYear = '20' + dobYear;\r\n      }\r\n    } else if (centuryChar > 4) {\r\n      if (parseInt(dobYear) > 57) {\r\n        fullYear = '19' + dobYear;\r\n      } else {\r\n        fullYear = '20' + dobYear;\r\n      }\r\n    }\r\n\r\n    //setting  year\r\n    const year = parseInt(fullYear);\r\n\r\n    //Check the Date is Valid\r\n\r\n    const givenDate = parseInt(fullYear + dobMonth + dobDay);\r\n\r\n    const cprDate = new Date(year, month - 1, day);\r\n    const modifiedMonth =\r\n      cprDate.getMonth() + 1 < 10 ? '0' + (cprDate.getMonth() + 1).toString() : (cprDate.getMonth() + 1).toString();\r\n    const modifiedDay = cprDate.getDate() < 10 ? '0' + cprDate.getDate().toString() : cprDate.getDate().toString();\r\n    const modifiedDate = cprDate.getFullYear().toString() + modifiedMonth + modifiedDay;\r\n\r\n    if (givenDate !== parseInt(modifiedDate)) {\r\n      return false;\r\n    }\r\n\r\n    // Check that control digits are correct Mod11\r\n\r\n    const weights = [4, 3, 2, 7, 6, 5, 4, 3, 2, 1];\r\n    let sum = 0;\r\n\r\n    for (let i = 0; i <= cpr.length - 1; i++) {\r\n      sum += weights[i] * parseInt(cpr[i]);\r\n    }\r\n\r\n    const remainder = sum % 11;\r\n\r\n    if (remainder !== 0) {\r\n      const ignoreYearsWithMonths = [\r\n        '01/01/1960',\r\n        '01/01/1964',\r\n        '01/01/1965',\r\n        '01/01/1966',\r\n        '01/01/1969',\r\n        '01/01/1970',\r\n        '01/01/1974',\r\n        '01/01/1980',\r\n        '01,01/1982',\r\n        '01/01/1984',\r\n        '01/01/1985',\r\n        '01/01/1986',\r\n        '01/01/1987',\r\n        '01/01/1988',\r\n        '01/01/1989',\r\n        '01/01/1990',\r\n        '01/01/1991',\r\n        '01/01/1992',\r\n        '01/01/1995',\r\n      ];\r\n      const selectedDate = day + '/' + month + '/' + year;\r\n      if (ignoreYearsWithMonths.indexOf(selectedDate) !== -1) {\r\n        return true;\r\n      }\r\n      return false;\r\n    }\r\n\r\n    // Input is valid CPR number\r\n    return true;\r\n  });\r\n});\r\n\r\nexport * from 'yup';\r\n","import { RichText as SitecoreRichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Color, ErrorMessage, Icons, InputField, Select, Tooltip, Typography } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { FormFooter, FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\nimport { getSchema } from './form-schema';\r\n\r\nconst StyledRichText = styled(SitecoreRichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\ntype Props = {\r\n  fields: any;\r\n  formData: any;\r\n  goToNextPage: () => void;\r\n  goToPrevPage: () => void;\r\n  setFormData: (data: Object) => void;\r\n  setSelectedMailBox: (data: string) => void;\r\n  selectedTopic: string;\r\n  setTopic: (data: string) => void;\r\n  mailToBoxList: any;\r\n  setMailSubject: (data: string) => void;\r\n  page: number;\r\n  isFromCVR?: boolean;\r\n};\r\n\r\nconst TOPIC_OPTIONS = [\r\n  {\r\n    label: 'Vælg emne',\r\n    value: '',\r\n  },\r\n  {\r\n    label: 'Legitimation',\r\n    value: 'Legitimation',\r\n  },\r\n  {\r\n    label: 'Udarbejdelse af lånetilbud',\r\n    value: 'Udarbejdelse af lånetilbud',\r\n  },\r\n  {\r\n    label: 'Opfyldelse af forbehold',\r\n    value: 'Opfyldelse af forbehold',\r\n  },\r\n  {\r\n    label: 'Sletning af pantebrev',\r\n    value: 'Sletning af pantebrev',\r\n  },\r\n  {\r\n    label: 'Opsigelse / indfrielse',\r\n    value: 'Opsigelse / indfrielse',\r\n  },\r\n  {\r\n    label: 'Henvendelser til inkassoafdeling',\r\n    value: 'Henvendelser til inkassoafdeling',\r\n  },\r\n  {\r\n    label: 'Andet',\r\n    value: 'Andet',\r\n  },\r\n];\r\n\r\nconst topicList = [\r\n  'Legitimation',\r\n  'Udarbejdelse af lånetilbud',\r\n  'Opfyldelse af forbehold',\r\n  'Sletning af pantebrev',\r\n  'Opsigelse / indfrielse',\r\n  'Henvendelser til inkassoafdeling',\r\n  'Andet',\r\n];\r\n\r\nconst Page1Form: React.FC<Props> = ({\r\n  fields = {},\r\n  formData,\r\n  goToNextPage,\r\n  goToPrevPage,\r\n  setFormData,\r\n  setSelectedMailBox,\r\n  mailToBoxList,\r\n  setMailSubject,\r\n  selectedTopic,\r\n  setTopic,\r\n  page,\r\n  isFromCVR,\r\n}) => {\r\n  const { t } = useTranslation();\r\n  const schema = getSchema(t);\r\n  const mailTopicList = mailToBoxList.reduce(function (result, field, index) {\r\n    result[topicList[index]] = field;\r\n    return result;\r\n  }, {});\r\n\r\n  const cpr: string = formData?.cpr || '';\r\n  const firstname: string = formData?.firstname || '';\r\n  const lastname: string = formData?.lastname || '';\r\n  const email: string = formData?.email || '';\r\n  const phone: string = formData?.phone || '';\r\n  const casenumber: string = formData?.casenumber || '';\r\n  const adviser: string = formData?.adviser || '';\r\n\r\n  return (\r\n    <Formik\r\n      initialValues={{\r\n        topic: selectedTopic,\r\n        cpr,\r\n        firstname,\r\n        lastname,\r\n        email,\r\n        phone,\r\n        casenumber,\r\n        adviser,\r\n      }}\r\n      validationSchema={schema}\r\n      onSubmit={(values) => {\r\n        goToNextPage();\r\n        if (values.casenumber.trim() === '') {\r\n          setMailSubject(values.topic + ' - Intet pantnr - ' + values.firstname + ' ' + values.lastname);\r\n        } else {\r\n          setMailSubject(values.topic + ' - ' + values.casenumber + ' - ' + values.firstname + ' ' + values.lastname);\r\n        }\r\n        setFormData(values);\r\n      }}\r\n    >\r\n      {({ values, errors, touched, handleChange, setFieldValue }) => {\r\n        const setMailbox = (e) => {\r\n          if (e.currentTarget.value) {\r\n            setTopic(e.currentTarget.value);\r\n            setFieldValue('topic', e.currentTarget.value);\r\n            setSelectedMailBox(mailTopicList[e.currentTarget.value]);\r\n          }\r\n        };\r\n\r\n        const setPreviousPage = () => {\r\n          goToPrevPage();\r\n          setFormData(values);\r\n        };\r\n\r\n        return (\r\n          <Form noValidate>\r\n            <FormLayout\r\n              headline={fields['Headline']?.value}\r\n              description={\r\n                isFromCVR ? (\r\n                  <StyledRichText field={fields['Choose CPR Description']} />\r\n                ) : (\r\n                  fields['Form Description']?.value\r\n                )\r\n              }\r\n            >\r\n              <FormRow>\r\n                <LabelHeader type=\"label\" as=\"label\" htmlFor=\"topic\">\r\n                  {fields['Form Title']?.value}\r\n                </LabelHeader>\r\n                <WhiteBg>\r\n                  <Select\r\n                    name=\"topic\"\r\n                    id=\"topic\"\r\n                    onChange={setMailbox}\r\n                    options={TOPIC_OPTIONS}\r\n                    hasBorder\r\n                    value={values.topic}\r\n                    isBold\r\n                  />\r\n                </WhiteBg>\r\n                {touched.topic && errors.topic && <ErrorDiv>{errors.topic}</ErrorDiv>}\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"cpr\"\r\n                  id=\"cpr\"\r\n                  label={t('form-input-cpr-label')}\r\n                  layout=\"white\"\r\n                  variant=\"numeric\"\r\n                  format=\"######-####\"\r\n                  value={values.cpr}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-cpr-label')}\r\n                  errorMessage={touched.cpr && errors.cpr ? errors.cpr : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"firstname\"\r\n                  id=\"firstname\"\r\n                  label={t('form-input-first-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.firstname}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-cpr-label')}\r\n                  errorMessage={touched.firstname && errors.firstname ? errors.firstname : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"lastname\"\r\n                  id=\"lastname\"\r\n                  label={t('form-input-last-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.lastname}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-last-name-label')}\r\n                  errorMessage={touched.lastname && errors.lastname ? errors.lastname : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"email\"\r\n                  id=\"email\"\r\n                  label={t('form-input-email-label')}\r\n                  layout=\"white\"\r\n                  value={values.email}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-email-label')}\r\n                  errorMessage={touched.email && errors.email ? errors.email : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-phone-label')}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                />\r\n              </FormRow>\r\n\r\n              <FieldContainer>\r\n                <InputField\r\n                  name=\"casenumber\"\r\n                  id=\"casenumber\"\r\n                  label={t('form-input-casenumber-label')}\r\n                  layout=\"white\"\r\n                  value={values.casenumber}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-casenumber-label')}\r\n                  errorMessage={touched.casenumber && errors.casenumber ? errors.casenumber : ''}\r\n                />\r\n                <TooltipWrapper>\r\n                  <Tooltip\r\n                    element={<Icons.Question />}\r\n                    heading={t('CPR-form-casenumber-tooltip-header')}\r\n                    content={t('CPR-form-casenumber-tooltip-text')}\r\n                  />\r\n                </TooltipWrapper>\r\n              </FieldContainer>\r\n\r\n              <FieldContainer>\r\n                <InputField\r\n                  name=\"adviser\"\r\n                  id=\"adviser\"\r\n                  label={t('form-input-adviser-label')}\r\n                  layout=\"white\"\r\n                  value={values.adviser}\r\n                  onChange={handleChange}\r\n                  data-label={t('form-input-casenumber-label')}\r\n                  errorMessage={touched.adviser && errors.adviser ? errors.adviser : ''}\r\n                />\r\n                <TooltipWrapper>\r\n                  <Tooltip\r\n                    element={<Icons.Question />}\r\n                    heading={t('CPR-form-adviser-tooltip-header')}\r\n                    content={t('CPR-form-adviser-tooltip-text')}\r\n                  />\r\n                </TooltipWrapper>\r\n              </FieldContainer>\r\n            </FormLayout>\r\n            <FormFooter\r\n              step1Label={isFromCVR ? t('CVR-footer-step1-title') : t('CPR-footer-step1-title')}\r\n              step2Label={isFromCVR ? t('CVR-footer-step2-title') : t('CPR-footer-step2-title')}\r\n              step3Label={isFromCVR ? t('CVR-footer-step3-title') : t('CPR-footer-step3-title')}\r\n              setPreviousPage={setPreviousPage}\r\n              page={page}\r\n              isFromCVR={isFromCVR}\r\n            />\r\n          </Form>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nexport default Page1Form;\r\n\r\nconst WhiteBg = styled.div`\r\n  background: #fff;\r\n`;\r\n\r\nconst FieldContainer = styled(FormRow)`\r\n  position: relative;\r\n`;\r\n\r\nconst ErrorDiv = styled(ErrorMessage)`\r\n  margin-top: 4px;\r\n  margin-left: 20px;\r\n`;\r\n\r\nconst TooltipWrapper = styled.span`\r\n  position: absolute;\r\n  top: 20px;\r\n  right: 15px;\r\n  svg {\r\n    width: 16px;\r\n    height: 16px;\r\n  }\r\n  [data-popper-placement^='bottom'] div {\r\n    border-color: transparent transparent ${Color.red40};\r\n  }\r\n`;\r\n\r\nconst LabelHeader = styled(Typography)`\r\n  display: block;\r\n  margin-bottom: 10px;\r\n`;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from '../../shared/forms/customYup';\r\nimport { NameRegex, PartnerRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    topic: Yup.string().required(t('form-select-required-error')),\r\n    cpr: Yup.string().required(t('form-required-error')).cprValidation(t('form-input-cpr-error')),\r\n    firstname: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-name-error')),\r\n    lastname: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-name-error')),\r\n    email: Yup.string().required(t('form-required-error')).email(t('form-input-email-error')),\r\n    phone: Yup.string().matches(PhoneRegex, t('form-input-phone-error')).min(8, t('form-input-phone-error')),\r\n    casenumber: Yup.string().matches(PartnerRegex, t('form-input-casenumber-error')),\r\n    adviser: Yup.string().matches(NameRegex, t('form-input-adviser-error')),\r\n  });\r\n}\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { breakpointsBootstrap, FileUpload, FileWithMeta } from 'db-npm-rdui';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormFooter, FormLayout } from '../../shared/components/Form';\r\nimport { attachFileGetUploadParams, removeFile } from '../../shared/forms/secureUploadHandling';\r\n\r\ntype Props = {\r\n  fields: any;\r\n  topic: string;\r\n  subject: string;\r\n  setFileList: any;\r\n  fileList: any;\r\n  attachId: string;\r\n  setAttachId: any;\r\n  page: number;\r\n  goToPrevPage: () => void;\r\n  onSubmitFiles: (files: FileWithMeta[], attachId) => void;\r\n};\r\n\r\nconst Page2Upload: React.FC<Props> = ({\r\n  fields = {},\r\n  topic,\r\n  subject,\r\n  fileList,\r\n  setFileList,\r\n  attachId,\r\n  setAttachId,\r\n  page,\r\n  goToPrevPage,\r\n  onSubmitFiles,\r\n}) => {\r\n  const { t } = useTranslation();\r\n  const [fileInputLabel, setFileInputLabel] = useState('');\r\n\r\n  const getWidth = useCallback(() => {\r\n    const label =\r\n      window.innerWidth > breakpointsBootstrap.lg\r\n        ? t('upload-text-input-box-label')\r\n        : t('upload-text-input-box-smaller-device-label');\r\n    setFileInputLabel(label);\r\n  }, [setFileInputLabel, t]);\r\n\r\n  useEffect(() => {\r\n    getWidth();\r\n    window.addEventListener('resize', getWidth);\r\n    return () => window.removeEventListener('resize', getWidth);\r\n  }, [getWidth]);\r\n\r\n  /**\r\n   * This function is called for each file upload.\r\n   * Use this function to specify the upload request information, like url and headers.\r\n   */\r\n\r\n  const getUploadParams = attachFileGetUploadParams(\r\n    {\r\n      apiUrl: fields['API Endpoint URL Attach']?.value,\r\n      egainDsid: fields['Egain DSID']?.value,\r\n    },\r\n    attachId,\r\n    'false',\r\n    subject\r\n  );\r\n\r\n  /**\r\n   * This function parses the \"AttachId\" from the uploaded file,\r\n   * and stores it in our state variable.\r\n   */\r\n  const onUploadSuccess = (file: any, response: any) => {\r\n    const responseObj = JSON.parse(response);\r\n    file.status = 1;\r\n    file.percent = 100;\r\n    file.response = responseObj;\r\n\r\n    if (responseObj.ActionResponse !== '0' || (responseObj && responseObj?.FileId?.length === 0)) {\r\n      return 'invalid-file';\r\n    }\r\n\r\n    setAttachId(responseObj.AttachId);\r\n    setFileList([...fileList, { attachId: responseObj.AttachId, file: file }]);\r\n  };\r\n\r\n  /**\r\n   * This function runs when user clicks the \"remove\" button on a file.\r\n   * It must return a boolean whether the file was removed succesfully or not.\r\n   */\r\n  const onRemove = async (file: FileWithMeta) => {\r\n    const modifiedList = fileList.filter((item) => item.file.id !== file.id);\r\n    setFileList(modifiedList);\r\n    const onRemoved = await removeFile(\r\n      file,\r\n      {\r\n        apiUrl: fields['API Endpoint URL Remove']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n      },\r\n      attachId\r\n    );\r\n    return onRemoved;\r\n  };\r\n\r\n  /**\r\n   * This function runs when the user submits the upload form.\r\n   */\r\n  const onSubmit = async (files: FileWithMeta[]) => {\r\n    setFileList(files);\r\n  };\r\n\r\n  const setPreviousPage = () => {\r\n    goToPrevPage();\r\n  };\r\n\r\n  const setSubmit = () => {\r\n    const fileData = fileList.map((a) => a.file);\r\n    const id = attachId !== '' ? attachId : fileList[0].attachId;\r\n    onSubmitFiles(fileData, id);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <FormLayout\r\n        headline={fields['Headline']?.value}\r\n        description={fields['Upload Description']?.value}\r\n        infoDescription={topic === 'Legitimation' && <RichText field={fields['Upload Info Legitimation']} />}\r\n      >\r\n        <FileUpload\r\n          fullscreenOnWindowDragEnter={true}\r\n          maxSize={1024 * 1024 * 4} // 4mb\r\n          maxFiles={10}\r\n          accept=\"application/pdf, image/jpeg, image/gif, image/png, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain\"\r\n          multiple={false}\r\n          fileList={fileList.map((a) => a.file)}\r\n          formDataFileKey=\"DocumentFile0\"\r\n          getUploadParams={getUploadParams}\r\n          onUploadSuccess={onUploadSuccess}\r\n          onRemove={onRemove}\r\n          onSubmit={onSubmit}\r\n          hideSubmitButton={true}\r\n          textBeforeInput={fields['Upload Title']?.value}\r\n          textInputBox={fileInputLabel}\r\n          textInputButton={t('upload-text-input-button-label')}\r\n          textAfterInput={t('upload-text-after-input-label')}\r\n          textBeforeFiles={t('upload-text-before-files-label')}\r\n          textSubmit={t('upload-text-submit-label')}\r\n          textOverlay={t('upload-text-overlay-label')}\r\n          errorTexts={{\r\n            'upload-cancelled': t('upload-cancelled-error-text'),\r\n            'upload-failed': t('upload-failed-error-text'),\r\n            'file-too-large': t('upload-file-too-large-error-text'),\r\n            'file-too-small': t('upload-file-too-small-error-text'),\r\n            'too-many-files': t('upload-too-many-files-error-text'),\r\n            'file-invalid-type': t('upload-file-invalid-type-error-text'),\r\n            'invalid-upload-params': t('upload-invalid-upload-params-text'),\r\n            'invalid-file': t('upload-invalid-file-error-text'),\r\n          }}\r\n        />\r\n      </FormLayout>\r\n      <FormFooter\r\n        step1Label={t('CPR-footer-step1-title')}\r\n        step2Label={t('CPR-footer-step2-title')}\r\n        step3Label={t('CPR-footer-step3-title')}\r\n        page={page}\r\n        setPreviousPage={setPreviousPage}\r\n        fileList={fileList}\r\n        setSubmit={setSubmit}\r\n      />\r\n    </>\r\n  );\r\n};\r\n\r\nexport default Page2Upload;\r\n","import { FileWithMeta, Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormData } from '../../shared/forms/secureUploadHandling';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport Page0Choose from './Page0Choose';\r\nimport Page1Form from './Page1Form';\r\nimport Page2Upload from './Page2Upload';\r\n\r\nexport type FormCprUploadProps = {\r\n  fields: any;\r\n};\r\n\r\nexport interface FileList {\r\n  attachId: string;\r\n  file: FileWithMeta;\r\n}\r\n\r\nexport interface FilesDetails {\r\n  fileList: FileList[];\r\n}\r\n\r\nconst FormCprUpload: React.FC<FormCprUploadProps> = ({ fields = {} }) => {\r\n  const [page, setPage] = useState(0);\r\n  const [formData, setFormData] = useState({});\r\n  const mailToList = fields['Mail Box To']?.value;\r\n  const mailToListDetails = mailToList.split(',');\r\n  const [selectedMailBox, setSelectedMailBox] = useState(mailToListDetails[0]);\r\n  const [mailSubject, setMailSubject] = useState('');\r\n  const [selectedTopic, setTopic] = useState('');\r\n  const [fileList, setFileList] = React.useState<FilesDetails[]>([]);\r\n  const [attachId, setAttachId] = React.useState('');\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const launchData: LaunchData = {\r\n    form_product: 'Document upload',\r\n    form_type: 'Customer document upload',\r\n    form_name: 'Cpr upload form',\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n\r\n  const { trackNavigatedToStep, trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking(launchData);\r\n\r\n  /**\r\n   * Use this function to go to the next page\r\n   */\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  /**\r\n   * Use this function to go to the previous page\r\n   */\r\n  const goToPrevPage = () => {\r\n    setPage(page - 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  /**\r\n   * Function for submitting the form.\r\n   * This function is used on page 2 (Upload files).\r\n   */\r\n  const onSubmitFiles = async (files: FileWithMeta[], attachId) => {\r\n    const fileIdData = files.map((a) => a.response.FileId);\r\n\r\n    const response = await submitFormData(\r\n      {\r\n        apiUrl: fields['API Endpoint URL Send']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n        fromMailBox: fields['Mail Box From']?.value,\r\n        toMailBox: selectedMailBox,\r\n      },\r\n      mailSubject,\r\n      formData,\r\n      fileIdData,\r\n      attachId\r\n    );\r\n\r\n    if (response) {\r\n      trackFormSubmitSuccess();\r\n      goToNextPage();\r\n    } else {\r\n      trackFormSubmitFail();\r\n\r\n      //Error Handling\r\n      setShowModal(true);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Render the page depending on the \"page\" number\r\n   */\r\n  switch (page) {\r\n    case 0: {\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <Page0Choose fields={fields} goToNextPage={goToNextPage} page={page} />\r\n        </div>\r\n      );\r\n    }\r\n    case 1: {\r\n      trackNavigatedToStep('Contact information and cpr number');\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <Page1Form\r\n            fields={fields}\r\n            formData={formData}\r\n            setFormData={setFormData}\r\n            setSelectedMailBox={setSelectedMailBox}\r\n            mailToBoxList={mailToListDetails}\r\n            selectedTopic={selectedTopic}\r\n            setTopic={setTopic}\r\n            setMailSubject={setMailSubject}\r\n            goToNextPage={goToNextPage}\r\n            goToPrevPage={goToPrevPage}\r\n            page={page}\r\n          />\r\n        </div>\r\n      );\r\n    }\r\n    case 2: {\r\n      trackNavigatedToStep('Cpr document upload');\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <Page2Upload\r\n            fields={fields}\r\n            topic={formData['topic'] || ''}\r\n            subject={mailSubject}\r\n            goToPrevPage={goToPrevPage}\r\n            onSubmitFiles={onSubmitFiles}\r\n            fileList={fileList}\r\n            setFileList={setFileList}\r\n            attachId={attachId}\r\n            setAttachId={setAttachId}\r\n            page={page}\r\n          />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </div>\r\n      );\r\n    }\r\n    case 3: {\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <ThankYouMessage fields={fields} aria-live=\"polite\" />\r\n        </div>\r\n      );\r\n    }\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormCprUpload;\r\n","import { RichText as SitecoreRichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Button, Color, mediaQuery, Modal, RadioButtonBox, RadioButtonBoxGroup, Typography } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { FormFooter, FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport { handleTranslation } from '../../shared/utils/handleTranslation';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\n\r\nconst StyledRichText = styled(SitecoreRichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\ntype Props = {\r\n  fields: any;\r\n  page: number;\r\n  isCPR: boolean;\r\n  goToNextPage: () => void;\r\n  setCPR: (data: boolean) => void;\r\n};\r\n\r\nconst CVRConfirmation: React.FC<Props> = ({ fields = {}, page, isCPR, goToNextPage, setCPR }) => {\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const callMeFormURL = fields['Call Me Form URL']?.value?.href || '';\r\n  const { onFormInteraction } = useAdobeTracking();\r\n\r\n  const modalContactHeadLabel = handleTranslation('modal-contact-head-label');\r\n  const modalContactCVRLabel = handleTranslation('modal-contact-cvr-content-label');\r\n  const modalFooterButtonLabel = handleTranslation('modal-contact-button-label');\r\n  const modalContactFooterLabel = handleTranslation('modal-contact-footer-label');\r\n  const modalContactPhoneLabel = handleTranslation('modal-contact-footer-phone-label');\r\n  const modalFooterOpenLabel = handleTranslation('modal-contact-footer-open-label');\r\n  const modalFooterTimingLabel = handleTranslation('modal-contact-footer-timing-label');\r\n\r\n  /**\r\n   * This function toggles the \"showModal\" to the opposite value of the current\r\n   */\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const callmeForm = () => {\r\n    if (!!callMeFormURL && window && window.location) {\r\n      window.location.href = callMeFormURL;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * The content for the modal\r\n   */\r\n  const modalContent = (\r\n    <ModalContainer>\r\n      <Typography type=\"h3\">{modalContactHeadLabel}</Typography>\r\n      <Typography type=\"manchetBig\" mt={30} mb={30}>\r\n        {modalContactCVRLabel}\r\n      </Typography>\r\n      <ButtonLink>\r\n        <Button onClick={callmeForm}>{modalFooterButtonLabel}</Button>\r\n      </ButtonLink>\r\n      <Typography type=\"image\" mt={30}>\r\n        {modalContactFooterLabel}{' '}\r\n        <a href={'tel:+45 ' + modalContactPhoneLabel}>\r\n          {' '}\r\n          <ModalTextRed>{modalContactPhoneLabel}</ModalTextRed>{' '}\r\n        </a>\r\n      </Typography>\r\n      <Typography type=\"image\" mt={10}>\r\n        <ModalTextGreen>{modalFooterOpenLabel}</ModalTextGreen>\r\n        {' ' /* Space between green text and the rest */}\r\n        {modalFooterTimingLabel}\r\n      </Typography>\r\n    </ModalContainer>\r\n  );\r\n\r\n  const onSubmitValues = (values) => {\r\n    if (values.hasCvr === 'yes') {\r\n      setCPR(false);\r\n      goToNextPage();\r\n    } else if (values.hasCpr === 'yes') {\r\n      setCPR(true);\r\n      goToNextPage();\r\n    } else {\r\n      toggleModal();\r\n    }\r\n  };\r\n\r\n  return (\r\n    <Formik\r\n      initialValues={{\r\n        hasCpr: 'yes',\r\n        hasCvr: isCPR ? 'no' : 'yes',\r\n      }}\r\n      onSubmit={onSubmitValues}\r\n    >\r\n      {({ values, handleChange }) => {\r\n        const trackingChangeHandler = (e) => {\r\n          onFormInteraction(e, handleChange);\r\n        };\r\n\r\n        const setCheckedValue = (e) => {\r\n          trackingChangeHandler(e);\r\n          if (e.target.value === 'yes') {\r\n            setCPR(false);\r\n          } else {\r\n            setCPR(true);\r\n          }\r\n        };\r\n        return (\r\n          <Form noValidate>\r\n            <FormLayout\r\n              headline={fields['Headline']?.value}\r\n              description={<StyledRichText field={fields['Choose CVR Description']} />}\r\n            >\r\n              <Typography type=\"h6\" as=\"h3\" mb={30}>\r\n                {fields['Choose CVR Title']?.value}\r\n              </Typography>\r\n              <FormRow>\r\n                <RadioButtonWrapper>\r\n                  <RadioButtonBox\r\n                    label={t('form-input-yes-label')}\r\n                    id=\"cvr_yes\"\r\n                    name=\"hasCvr\"\r\n                    value=\"yes\"\r\n                    variant=\"secondary\"\r\n                    checked={values.hasCvr === 'yes'}\r\n                    onChange={setCheckedValue}\r\n                  />\r\n                </RadioButtonWrapper>\r\n              </FormRow>\r\n              <FormRow>\r\n                <RadioButtonWrapper>\r\n                  <RadioButtonBox\r\n                    label={t('form-input-no-label')}\r\n                    id=\"cvr_no\"\r\n                    name=\"hasCvr\"\r\n                    value=\"no\"\r\n                    variant=\"secondary\"\r\n                    checked={values.hasCvr === 'no'}\r\n                    onChange={setCheckedValue}\r\n                  />\r\n                </RadioButtonWrapper>\r\n              </FormRow>\r\n              {isCPR && (\r\n                <FormRow>\r\n                  <Typography type=\"h6\" as=\"h3\" mb={30}>\r\n                    {fields['Choose CPR Title']?.value}\r\n                  </Typography>\r\n                  <FormRow>\r\n                    <RadioButtonWrapper>\r\n                      <RadioButtonBox\r\n                        label={t('form-input-yes-label')}\r\n                        id=\"cpr_yes\"\r\n                        name=\"hasCpr\"\r\n                        value=\"yes\"\r\n                        variant=\"secondary\"\r\n                        checked={values.hasCpr === 'yes'}\r\n                        onChange={trackingChangeHandler}\r\n                      />\r\n                    </RadioButtonWrapper>\r\n                  </FormRow>\r\n                  <FormRow>\r\n                    <RadioButtonWrapper>\r\n                      <RadioButtonBox\r\n                        label={t('form-input-no-label')}\r\n                        id=\"cpr_no\"\r\n                        name=\"hasCpr\"\r\n                        value=\"no\"\r\n                        variant=\"secondary\"\r\n                        checked={values.hasCpr === 'no'}\r\n                        onChange={trackingChangeHandler}\r\n                      />\r\n                    </RadioButtonWrapper>\r\n                  </FormRow>\r\n                </FormRow>\r\n              )}\r\n              <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close'} overlayColor=\"#1f2532\">\r\n                {modalContent}\r\n              </Modal>\r\n            </FormLayout>\r\n            <FormFooter\r\n              step1Label={t('CVR-footer-step1-title')}\r\n              step2Label={t('CVR-footer-step2-title')}\r\n              step3Label={t('CVR-footer-step3-title')}\r\n              trackingChangeHandler={trackingChangeHandler}\r\n              page={page}\r\n            />\r\n          </Form>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nexport default CVRConfirmation;\r\n\r\nconst ModalContainer = styled.div`\r\n  padding: 50px 0;\r\n  text-align: center;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 664px;\r\n    padding: 80px 0;\r\n  }\r\n\r\n  ${mediaQuery.xl} {\r\n    padding: 120px 0 80px 0;\r\n  }\r\n`;\r\n\r\nconst ButtonLink = styled.a`\r\n  text-decoration: none;\r\n`;\r\n\r\nconst ModalTextGreen = styled.span`\r\n  color: #008523;\r\n`;\r\n\r\nconst ModalTextRed = styled.span`\r\n  color: ${Color.rdRed};\r\n  text-decoration: underline;\r\n`;\r\n\r\nconst RadioButtonWrapper = styled(RadioButtonBoxGroup)`\r\n  label {\r\n    margin-top: 0;\r\n  }\r\n`;\r\n","import { RichText as SitecoreRichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Color, ErrorMessage, Icons, InputField, Select, Tooltip, Typography } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { FormFooter, FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\nimport { getSchema } from './form-schema';\r\n\r\nconst StyledRichText = styled(SitecoreRichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\ntype Props = {\r\n  fields: any;\r\n  formData: any;\r\n  goToNextPage: () => void;\r\n  goToPrevPage: () => void;\r\n  setFormData: (data: Object) => void;\r\n  setSelectedMailBox: (data: string) => void;\r\n  selectedTopic: string;\r\n  setTopic: (data: string) => void;\r\n  mailToBoxList: any;\r\n  setMailSubject: (data: string) => void;\r\n  page: number;\r\n};\r\n\r\nconst TOPIC_OPTIONS = [\r\n  {\r\n    label: 'Vælg emne',\r\n    value: '',\r\n  },\r\n  {\r\n    label: 'Legitimation',\r\n    value: 'Legitimation',\r\n  },\r\n  {\r\n    label: 'Udarbejdelse af lånetilbud',\r\n    value: 'Udarbejdelse af lånetilbud',\r\n  },\r\n  {\r\n    label: 'Opfyldelse af forbehold',\r\n    value: 'Opfyldelse af forbehold',\r\n  },\r\n  {\r\n    label: 'Sletning af pantebrev',\r\n    value: 'Sletning af pantebrev',\r\n  },\r\n  {\r\n    label: 'Opsigelse / indfrielse',\r\n    value: 'Opsigelse / indfrielse',\r\n  },\r\n  {\r\n    label: 'Henvendelser til inkassoafdeling',\r\n    value: 'Henvendelser til inkassoafdeling',\r\n  },\r\n  {\r\n    label: 'Andet',\r\n    value: 'Andet',\r\n  },\r\n];\r\n\r\nconst topicList = [\r\n  'Legitimation',\r\n  'Udarbejdelse af lånetilbud',\r\n  'Opfyldelse af forbehold',\r\n  'Sletning af pantebrev',\r\n  'Opsigelse / indfrielse',\r\n  'Henvendelser til inkassoafdeling',\r\n  'Andet',\r\n];\r\n\r\nconst CVRForm: React.FC<Props> = ({\r\n  fields = {},\r\n  formData,\r\n  goToNextPage,\r\n  goToPrevPage,\r\n  setFormData,\r\n  setSelectedMailBox,\r\n  mailToBoxList,\r\n  setMailSubject,\r\n  selectedTopic,\r\n  setTopic,\r\n  page,\r\n}) => {\r\n  const { t } = useTranslation();\r\n  const schema = getSchema(t);\r\n  const mailTopicList = mailToBoxList.reduce(function (result, field, index) {\r\n    result[topicList[index]] = field;\r\n    return result;\r\n  }, {});\r\n\r\n  const cvr: string = formData?.cvr || '';\r\n  const companyName: string = formData?.companyName || '';\r\n  const contactPerson: string = formData?.contactPerson || '';\r\n  const email: string = formData?.email || '';\r\n  const phone: string = formData?.phone || '';\r\n  const casenumber: string = formData?.casenumber || '';\r\n  const adviser: string = formData?.adviser || '';\r\n\r\n  return (\r\n    <Formik\r\n      initialValues={{\r\n        topic: selectedTopic,\r\n        cvr,\r\n        companyName,\r\n        contactPerson,\r\n        email,\r\n        phone,\r\n        casenumber,\r\n        adviser,\r\n      }}\r\n      validationSchema={schema}\r\n      onSubmit={(values) => {\r\n        goToNextPage();\r\n        if (values.casenumber.trim() === '') {\r\n          setMailSubject(values.topic + ' - Intet pantnr - ' + values.contactPerson);\r\n        } else {\r\n          setMailSubject(values.topic + ' - ' + values.casenumber + ' - ' + values.contactPerson);\r\n        }\r\n        setFormData(values);\r\n      }}\r\n    >\r\n      {({ values, errors, touched, handleChange, setFieldValue }) => {\r\n        const setMailbox = (e) => {\r\n          if (e.currentTarget.value) {\r\n            setTopic(e.currentTarget.value);\r\n            setFieldValue('topic', e.currentTarget.value);\r\n            setSelectedMailBox(mailTopicList[e.currentTarget.value]);\r\n          }\r\n        };\r\n\r\n        const setPreviousPage = () => {\r\n          goToPrevPage();\r\n          setFormData(values);\r\n        };\r\n\r\n        return (\r\n          <Form noValidate>\r\n            <FormLayout\r\n              headline={fields['Headline']?.value}\r\n              description={<StyledRichText field={fields['Choose CVR Description']} />}\r\n            >\r\n              <FormRow>\r\n                <LabelHeader type=\"label\" as=\"label\" htmlFor=\"topic\">\r\n                  {fields['Form Title']?.value}\r\n                </LabelHeader>\r\n                <WhiteBg>\r\n                  <Select\r\n                    name=\"topic\"\r\n                    id=\"topic\"\r\n                    onChange={setMailbox}\r\n                    options={TOPIC_OPTIONS}\r\n                    hasBorder\r\n                    value={values.topic}\r\n                    isBold\r\n                  />\r\n                </WhiteBg>\r\n                {touched.topic && errors.topic && <ErrorDiv>{errors.topic}</ErrorDiv>}\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"cvr\"\r\n                  id=\"cvr\"\r\n                  label={t('form-input-cvr-label')}\r\n                  layout=\"white\"\r\n                  variant=\"numeric\"\r\n                  value={values.cvr}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.cvr && errors.cvr ? errors.cvr : ''}\r\n                  data-label={t('form-input-cvr-label')}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"companyName\"\r\n                  id=\"companyName\"\r\n                  label={t('form-input-company-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.companyName}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.companyName && errors.companyName ? errors.companyName : ''}\r\n                  data-label={t('form-input-company-name-label')}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <SectionTitle>{fields['Section Title']?.value}</SectionTitle>\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"contactPerson\"\r\n                  id=\"contactPerson\"\r\n                  label={t('form-input-contact-person-label')}\r\n                  layout=\"white\"\r\n                  value={values.contactPerson}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.contactPerson && errors.contactPerson ? errors.contactPerson : ''}\r\n                  data-label={t('form-input-contact-person-label')}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"email\"\r\n                  id=\"email\"\r\n                  label={t('form-input-email-label')}\r\n                  layout=\"white\"\r\n                  value={values.email}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.email && errors.email ? errors.email : ''}\r\n                  data-label={t('form-input-email-label')}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                  data-label={t('form-input-phone-label')}\r\n                />\r\n              </FormRow>\r\n\r\n              <Container>\r\n                <InputField\r\n                  name=\"casenumber\"\r\n                  id=\"casenumber\"\r\n                  label={t('form-input-casenumber-label')}\r\n                  layout=\"white\"\r\n                  value={values.casenumber}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.casenumber && errors.casenumber ? errors.casenumber : ''}\r\n                  data-label={t('form-input-casenumber-label')}\r\n                />\r\n                <TooltipWrapper>\r\n                  <Tooltip\r\n                    element={<Icons.Question />}\r\n                    heading={t('CVR-form-casenumber-tooltip-header')}\r\n                    content={t('CVR-form-casenumber-tooltip-text')}\r\n                  />\r\n                </TooltipWrapper>\r\n              </Container>\r\n\r\n              <Container>\r\n                <InputField\r\n                  name=\"adviser\"\r\n                  id=\"adviser\"\r\n                  label={t('form-input-adviser-label')}\r\n                  layout=\"white\"\r\n                  value={values.adviser}\r\n                  onChange={handleChange}\r\n                  errorMessage={touched.adviser && errors.adviser ? errors.adviser : ''}\r\n                />\r\n                <TooltipWrapper>\r\n                  <Tooltip\r\n                    element={<Icons.Question />}\r\n                    heading={t('CVR-form-adviser-tooltip-header')}\r\n                    content={t('CVR-form-adviser-tooltip-text')}\r\n                  />\r\n                </TooltipWrapper>\r\n              </Container>\r\n            </FormLayout>\r\n            <FormFooter\r\n              step1Label={t('CVR-footer-step1-title')}\r\n              step2Label={t('CVR-footer-step2-title')}\r\n              step3Label={t('CVR-footer-step3-title')}\r\n              setPreviousPage={setPreviousPage}\r\n              page={page}\r\n            />\r\n          </Form>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nexport default CVRForm;\r\n\r\nconst WhiteBg = styled.div`\r\n  background: #fff;\r\n`;\r\n\r\nconst Container = styled(FormRow)`\r\n  position: relative;\r\n`;\r\n\r\nconst ErrorDiv = styled(ErrorMessage)`\r\n  margin-top: 4px;\r\n  margin-left: 20px;\r\n`;\r\n\r\nconst TooltipWrapper = styled.span`\r\n  position: absolute;\r\n  top: 20px;\r\n  right: 15px;\r\n  svg {\r\n    width: 16px;\r\n    height: 16px;\r\n  }\r\n  [data-popper-placement^='bottom'] div {\r\n    border-color: transparent transparent ${Color.red40};\r\n  }\r\n`;\r\n\r\nconst SectionTitle = styled.div`\r\n  font-size: 14px;\r\n  font-weight: bold;\r\n  text-transform: uppercase;\r\n  color: #595959;\r\n  -webkit-letter-spacing: 2px;\r\n  -moz-letter-spacing: 2px;\r\n  -ms-letter-spacing: 2px;\r\n  letter-spacing: 2px;\r\n  margin-top: 32px;\r\n`;\r\n\r\nconst LabelHeader = styled(Typography)`\r\n  display: block;\r\n  margin-bottom: 10px;\r\n`;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\nimport { NameRegex, NumberRegex, PartnerRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    topic: Yup.string().required(t('form-select-required-error')),\r\n    cvr: Yup.string()\r\n      .required(t('form-required-error'))\r\n      .matches(NumberRegex, t('form-input-cvr-error'))\r\n      .min(8, t('form-input-cvr-min-char-error')),\r\n    companyName: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-company-name-error')),\r\n    contactPerson: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-name-error')),\r\n    email: Yup.string().required(t('form-required-error')).email(t('form-input-email-error')),\r\n    phone: Yup.string().matches(PhoneRegex, t('form-input-phone-error')).min(8, t('form-input-phone-error')),\r\n    casenumber: Yup.string().matches(PartnerRegex, t('form-input-casenumber-error')),\r\n    adviser: Yup.string().matches(NameRegex, t('form-input-adviser-error')),\r\n  });\r\n}\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { breakpointsBootstrap, FileUpload, FileWithMeta } from 'db-npm-rdui';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormFooter, FormLayout } from '../../shared/components/Form';\r\nimport { attachFileGetUploadParams, removeFile } from '../../shared/forms/secureUploadHandling';\r\n\r\ntype Props = {\r\n  fields: any;\r\n  topic: string;\r\n  subject: string;\r\n  setFileList: any;\r\n  fileList: any;\r\n  attachId: string;\r\n  setAttachId: any;\r\n  page: number;\r\n  goToPrevPage: () => void;\r\n  onSubmitFiles: (files: FileWithMeta[], attachId) => void;\r\n};\r\n\r\nconst CVRUpload: React.FC<Props> = ({\r\n  fields = {},\r\n  topic,\r\n  subject,\r\n  fileList,\r\n  setFileList,\r\n  attachId,\r\n  setAttachId,\r\n  page,\r\n  goToPrevPage,\r\n  onSubmitFiles,\r\n}) => {\r\n  const { t } = useTranslation();\r\n  const [fileInputLabel, setFileInputLabel] = useState('');\r\n\r\n  const getWidth = useCallback(() => {\r\n    const label =\r\n      window.innerWidth > breakpointsBootstrap.lg\r\n        ? t('upload-text-input-box-label')\r\n        : t('upload-text-input-box-smaller-device-label');\r\n    setFileInputLabel(label);\r\n  }, [setFileInputLabel, t]);\r\n\r\n  useEffect(() => {\r\n    getWidth();\r\n    window.addEventListener('resize', getWidth);\r\n    return () => window.removeEventListener('resize', getWidth);\r\n  }, [getWidth]);\r\n\r\n  /**\r\n   * This function is called for each file upload.\r\n   * Use this function to specify the upload request information, like url and headers.\r\n   */\r\n  const getUploadParams = attachFileGetUploadParams(\r\n    {\r\n      apiUrl: fields['API Endpoint URL Attach']?.value,\r\n      egainDsid: fields['Egain DSID']?.value,\r\n    },\r\n    attachId,\r\n    'false',\r\n    subject\r\n  );\r\n\r\n  /**\r\n   * This function parses the \"AttachId\" from the uploaded file,\r\n   * and stores it in our state variable.\r\n   */\r\n  const onUploadSuccess = (file: any, response: any) => {\r\n    const responseObj = JSON.parse(response);\r\n    file.status = 1;\r\n    file.percent = 100;\r\n    file.response = responseObj;\r\n\r\n    if (responseObj.ActionResponse !== '0' || (responseObj && responseObj?.FileId?.length === 0)) {\r\n      return 'invalid-file';\r\n    }\r\n\r\n    setAttachId(responseObj.AttachId);\r\n    setFileList([...fileList, { attachId: responseObj.AttachId, file: file }]);\r\n  };\r\n\r\n  /**\r\n   * This function runs when user clicks the \"remove\" button on a file.\r\n   * It must return a boolean whether the file was removed succesfully or not.\r\n   */\r\n  const onRemove = async (file: FileWithMeta) => {\r\n    const modifiedList = fileList.filter((item) => item.file.id !== file.id);\r\n    setFileList(modifiedList);\r\n    const onRemoved = await removeFile(\r\n      file,\r\n      {\r\n        apiUrl: fields['API Endpoint URL Remove']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n      },\r\n      attachId\r\n    );\r\n    return onRemoved;\r\n  };\r\n\r\n  /**\r\n   * This function runs when the user submits the upload form.\r\n   */\r\n  const onSubmit = async (files: FileWithMeta[]) => {\r\n    setFileList(files);\r\n  };\r\n\r\n  const setPreviousPage = () => {\r\n    goToPrevPage();\r\n  };\r\n\r\n  const setSubmit = () => {\r\n    const fileData = fileList.map((a) => a.file);\r\n    const id = attachId !== '' ? attachId : fileList[0].attachId;\r\n    onSubmitFiles(fileData, id);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <FormLayout\r\n        headline={fields['Headline']?.value}\r\n        description={fields['Upload Description']?.value}\r\n        infoDescription={topic === 'Legitimation' && <RichText field={fields['Upload Info Legitimation']} />}\r\n      >\r\n        <FileUpload\r\n          fullscreenOnWindowDragEnter={true}\r\n          maxSize={1024 * 1024 * 4} // 4mb\r\n          maxFiles={10}\r\n          accept=\"application/pdf, image/jpeg, image/gif, image/png, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain\"\r\n          multiple={false}\r\n          fileList={fileList.map((a) => a.file)}\r\n          formDataFileKey=\"DocumentFile0\"\r\n          getUploadParams={getUploadParams}\r\n          onUploadSuccess={onUploadSuccess}\r\n          onRemove={onRemove}\r\n          onSubmit={onSubmit}\r\n          hideSubmitButton={true}\r\n          textBeforeInput={fields['Upload Title']?.value}\r\n          textInputBox={fileInputLabel}\r\n          textInputButton={t('upload-text-input-button-label')}\r\n          textAfterInput={t('upload-text-after-input-label')}\r\n          textBeforeFiles={t('upload-text-before-files-label')}\r\n          textSubmit={t('upload-text-submit-label')}\r\n          textOverlay={t('upload-text-overlay-label')}\r\n          errorTexts={{\r\n            'upload-cancelled': t('upload-cancelled-error-text'),\r\n            'upload-failed': t('upload-failed-error-text'),\r\n            'file-too-large': t('upload-file-too-large-error-text'),\r\n            'file-too-small': t('upload-file-too-small-error-text'),\r\n            'too-many-files': t('upload-too-many-files-error-text'),\r\n            'file-invalid-type': t('upload-file-invalid-type-error-text'),\r\n            'invalid-upload-params': t('upload-invalid-upload-params-text'),\r\n            'invalid-file': t('upload-invalid-file-error-text'),\r\n          }}\r\n        />\r\n      </FormLayout>\r\n      <FormFooter\r\n        step1Label={t('CVR-footer-step1-title')}\r\n        step2Label={t('CVR-footer-step2-title')}\r\n        step3Label={t('CVR-footer-step3-title')}\r\n        page={page}\r\n        setPreviousPage={setPreviousPage}\r\n        fileList={fileList}\r\n        setSubmit={setSubmit}\r\n      />\r\n    </>\r\n  );\r\n};\r\n\r\nexport default CVRUpload;\r\n","import { FileWithMeta, Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormData } from '../../shared/forms/secureUploadHandling';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport Page1Form from '../FormCprUpload/Page1Form';\r\nimport CVRConfirmation from './CVRConfirmation';\r\nimport CVRForm from './CVRForm';\r\nimport CVRUpload from './CVRUpload';\r\n\r\nexport type FormCvrUploadProps = {\r\n  fields: any;\r\n};\r\n\r\nexport interface FileList {\r\n  attachId: string;\r\n  file: FileWithMeta;\r\n}\r\n\r\nexport interface FilesDetails {\r\n  fileList: FileList[];\r\n}\r\n\r\nconst FormCvrUpload: React.FC<FormCvrUploadProps> = ({ fields = {} }) => {\r\n  const [page, setPage] = useState(0);\r\n  const [formData, setFormData] = useState({});\r\n  const mailToList = fields['Mail Box To']?.value;\r\n  const mailToListDetails = mailToList.split(',');\r\n  const [selectedMailBox, setSelectedMailBox] = useState(mailToListDetails[0]);\r\n  const [mailSubject, setMailSubject] = useState('');\r\n  const [selectedTopic, setTopic] = useState('');\r\n  const [fileList, setFileList] = useState<FilesDetails[]>([]);\r\n  const [isCPR, setCPR] = useState(false);\r\n  const [attachId, setAttachId] = React.useState('');\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const launchData: LaunchData = {\r\n    form_product: 'Document upload',\r\n    form_type: 'Customer document upload',\r\n    form_name: 'Cvr upload form',\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n\r\n  const { trackNavigatedToStep, trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking(launchData);\r\n\r\n  /**\r\n   * Use this function to go to the next page\r\n   */\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  /**\r\n   * Use this function to go to the previous page\r\n   */\r\n  const goToPrevPage = () => {\r\n    setPage(page - 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  /**\r\n   * Function for submitting the form.\r\n   * This function is used on page 2 (Upload files).\r\n   */\r\n  const onSubmitFiles = async (files: FileWithMeta[], attachId) => {\r\n    const fileIdData = files.map((a) => a.response.FileId);\r\n\r\n    const response = await submitFormData(\r\n      {\r\n        apiUrl: fields['API Endpoint URL Send']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n        fromMailBox: fields['Mail Box From']?.value,\r\n        toMailBox: selectedMailBox,\r\n      },\r\n      mailSubject,\r\n      formData,\r\n      fileIdData,\r\n      attachId\r\n    );\r\n\r\n    if (response) {\r\n      trackFormSubmitSuccess();\r\n      goToNextPage();\r\n    } else {\r\n      trackFormSubmitFail();\r\n      //Error Handling\r\n      setShowModal(true);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * conditional rendering\r\n   */\r\n  switch (page) {\r\n    case 0:\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <CVRConfirmation fields={fields} goToNextPage={goToNextPage} page={page} isCPR={isCPR} setCPR={setCPR} />\r\n        </div>\r\n      );\r\n    case 1: // CVR form\r\n      trackNavigatedToStep('Contact information and cvr number');\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          {!isCPR && (\r\n            <CVRForm\r\n              fields={fields}\r\n              formData={formData}\r\n              setFormData={setFormData}\r\n              setSelectedMailBox={setSelectedMailBox}\r\n              mailToBoxList={mailToListDetails}\r\n              setMailSubject={setMailSubject}\r\n              selectedTopic={selectedTopic}\r\n              setTopic={setTopic}\r\n              goToNextPage={goToNextPage}\r\n              goToPrevPage={goToPrevPage}\r\n              page={page}\r\n            />\r\n          )}\r\n\r\n          {isCPR && (\r\n            <Page1Form\r\n              fields={fields}\r\n              formData={formData}\r\n              setFormData={setFormData}\r\n              setSelectedMailBox={setSelectedMailBox}\r\n              mailToBoxList={mailToListDetails}\r\n              selectedTopic={selectedTopic}\r\n              setTopic={setTopic}\r\n              setMailSubject={setMailSubject}\r\n              goToNextPage={goToNextPage}\r\n              goToPrevPage={goToPrevPage}\r\n              page={page}\r\n              isFromCVR={isCPR}\r\n            />\r\n          )}\r\n        </div>\r\n      );\r\n    case 2: // CVR upload\r\n      trackNavigatedToStep('Cvr document upload');\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <CVRUpload\r\n            fields={fields}\r\n            topic={formData['topic'] || ''}\r\n            subject={mailSubject}\r\n            goToPrevPage={goToPrevPage}\r\n            onSubmitFiles={onSubmitFiles}\r\n            fileList={fileList}\r\n            setFileList={setFileList}\r\n            attachId={attachId}\r\n            setAttachId={setAttachId}\r\n            page={page}\r\n          />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </div>\r\n      );\r\n    case 3: // CVR upload confirmation\r\n      return (\r\n        <div aria-live=\"polite\">\r\n          <ThankYouMessage fields={fields} />\r\n        </div>\r\n      );\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormCvrUpload;\r\n","import { Button, InputField } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport { getSchema } from './schema';\r\n\r\ntype Props = {\r\n  fields: any;\r\n  onSubmitData: (formData: any) => Promise<void>;\r\n};\r\n\r\nconst GDPRForm: React.FC<Props> = ({ fields = {}, onSubmitData }) => {\r\n  const { t } = useTranslation();\r\n  const schema = getSchema(t);\r\n  const mailBoxId = fields['Mailbox ID']?.value;\r\n  const mailSubject = fields['Mail Subject']?.value;\r\n  const { onFormInteraction } = useAdobeTracking();\r\n\r\n  return (\r\n    <FormLayout\r\n      headline={fields['Headline']?.value}\r\n      description={fields['Description']}\r\n      formTitle={fields['Form Title']?.value}\r\n    >\r\n      <Formik\r\n        initialValues={{\r\n          cpr: '',\r\n          name: '',\r\n          phone: '',\r\n          email: '',\r\n          mailboxId: mailBoxId,\r\n          emailsubject: mailSubject,\r\n        }}\r\n        validationSchema={schema}\r\n        onSubmit={(values) => {\r\n          onSubmitData(values);\r\n        }}\r\n      >\r\n        {({ values, errors, touched, handleChange }) => {\r\n          const trackingChangeHandler = (e) => {\r\n            onFormInteraction(e, handleChange);\r\n          };\r\n          return (\r\n            <Form noValidate>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"cpr\"\r\n                  id=\"cpr\"\r\n                  label={t('form-input-cpr-label')}\r\n                  layout=\"white\"\r\n                  variant=\"numeric\"\r\n                  format=\"######-####\"\r\n                  value={values.cpr}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_number\"\r\n                  data-label={t('form-input-cpr-label')}\r\n                  errorMessage={touched.cpr && errors.cpr ? errors.cpr : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"name\"\r\n                  id=\"name\"\r\n                  label={t('form-input-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.name}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_name\"\r\n                  maxLength={50}\r\n                  data-label={t('form-input-name-label')}\r\n                  errorMessage={touched.name && errors.name ? errors.name : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  maxLength={20}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_phone\"\r\n                  data-label={t('form-input-phone-label')}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"email\"\r\n                  id=\"email\"\r\n                  label={t('form-input-email-label')}\r\n                  layout=\"white\"\r\n                  value={values.email}\r\n                  onChange={trackingChangeHandler}\r\n                  maxLength={100}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"email\"\r\n                  data-label={t('form-input-email-label')}\r\n                  errorMessage={touched.email && errors.email ? errors.email : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <Button onClick={trackingChangeHandler} type=\"submit\" id=\"submit\">\r\n                  {t('form-button-request-label')}\r\n                </Button>\r\n              </FormRow>\r\n            </Form>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </FormLayout>\r\n  );\r\n};\r\n\r\nexport default GDPRForm;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\nimport { CprRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    cpr: Yup.string().required(t('form-input-cpr-error')).matches(CprRegex, t('form-input-cpr-error')),\r\n    name: Yup.string().required(t('form-input-name-error')),\r\n    phone: Yup.string()\r\n      .required(t('form-input-phone-error'))\r\n      .matches(PhoneRegex, t('form-input-phone-error'))\r\n      .min(8, t('form-input-phone-error')),\r\n    email: Yup.string().required(t('form-input-email-error')).email(t('form-input-email-error')),\r\n  });\r\n}\r\n","import { Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormData } from '../../shared/forms/submitFormData';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport GDPRForm from './GDPRForm';\r\n\r\nexport type FormGDPRProps = {\r\n  fields: any;\r\n};\r\n\r\nconst FormGdpr: React.FC<FormGDPRProps> = ({ fields = {} }) => {\r\n  const { t } = useTranslation();\r\n  const [page, setPage] = useState(0);\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const launchData: LaunchData = {\r\n    form_product: 'GDRP request',\r\n    form_type: 'GDPR information request',\r\n    form_name: 'GDPR form',\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n\r\n  const { trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking(launchData);\r\n\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  const onSubmitData = async (formData) => {\r\n    const response = await submitFormData(\r\n      {\r\n        apiUrl: fields['API Endpoint URL']?.value,\r\n        apiKey: fields['API Key']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n      },\r\n      formData\r\n    );\r\n    if (response) {\r\n      goToNextPage();\r\n      trackFormSubmitSuccess();\r\n    } else {\r\n      trackFormSubmitFail();\r\n\r\n      //Error Handling\r\n      setShowModal(true);\r\n    }\r\n  };\r\n\r\n  /* conditional rendering  */\r\n  switch (page) {\r\n    case 0:\r\n      return (\r\n        <>\r\n          <GDPRForm fields={fields} onSubmitData={onSubmitData} />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </>\r\n      );\r\n    case 1: //Thank You Message\r\n      return <ThankYouMessage fields={fields} />;\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormGdpr;\r\n","import { Button, InputField, mediaQuery, RadioButtonBox, RadioButtonBoxGroup } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport { getSchema } from './schema';\r\n\r\ntype Props = {\r\n  onSubmit: (formData: any) => Promise<void>;\r\n  fields: any;\r\n};\r\n\r\nconst RadioButtonWrapper = styled.div`\r\n  display: flex;\r\n  width: 100%;\r\n\r\n  ${mediaQuery.maxWidth.tablet} {\r\n    display: block;\r\n  }\r\n`;\r\n\r\nconst RadioButtonCantainerSmall = styled.div`\r\n  width: 40%;\r\n  margin: 8px;\r\n\r\n  ${mediaQuery.maxWidth.tablet} {\r\n    width: 95%;\r\n  }\r\n`;\r\n\r\nconst RadioButtonCantainerBig = styled.div`\r\n  width: 60%;\r\n  margin: 8px;\r\n\r\n  ${mediaQuery.maxWidth.tablet} {\r\n    width: 95%;\r\n  }\r\n`;\r\n\r\ntype Custtype = 'private' | 'company';\r\n\r\nconst NemKontoForm: React.FC<Props> = ({ fields = {}, onSubmit }) => {\r\n  const { t } = useTranslation();\r\n  const [custtype, setCusttype] = useState<Custtype>('private');\r\n  const schema = getSchema(t);\r\n  const mailBoxId = fields['Mailbox ID']?.value;\r\n  const mailSubject = fields['Mail Subject']?.value;\r\n  const { onFormInteraction } = useAdobeTracking();\r\n\r\n  useEffect(() => {\r\n    const url = new URL(window.location.href);\r\n    const isBusiness = url.searchParams.get('formtype')?.toLowerCase() === 'business';\r\n    if (isBusiness) {\r\n      setTimeout(() => {\r\n        document.getElementById('custtype_company')?.click();\r\n      }, 300);\r\n    }\r\n  }, []);\r\n\r\n  return (\r\n    <FormLayout\r\n      headline={fields['Headline']?.value}\r\n      description={fields['Description']?.value}\r\n      formTitle={fields['Form Title']?.value}\r\n    >\r\n      <Formik\r\n        initialValues={{\r\n          custtype: 'private' as Custtype,\r\n          fname: '',\r\n          lname: '',\r\n          fullname: '',\r\n          cpr: '',\r\n          cvr: '',\r\n          phone: '',\r\n          email: '',\r\n          mailboxId: mailBoxId,\r\n          emailsubject: mailSubject,\r\n        }}\r\n        validationSchema={schema}\r\n        onSubmit={(values) => {\r\n          onSubmit(values);\r\n        }}\r\n      >\r\n        {({ values, errors, touched, handleChange }) => {\r\n          const trackingChangeHandler = (e) => {\r\n            onFormInteraction(e, handleChange);\r\n          };\r\n          return (\r\n            <Form noValidate>\r\n              <FormRow>\r\n                <RadioButtonBoxGroup>\r\n                  <RadioButtonWrapper>\r\n                    <RadioButtonCantainerSmall>\r\n                      <RadioButtonBox\r\n                        label={t('form-input-private-label')}\r\n                        id=\"custtype_private\"\r\n                        name=\"custtype\"\r\n                        value=\"private\"\r\n                        checked={custtype === 'private'}\r\n                        variant=\"secondary\"\r\n                        onChange={(e) => {\r\n                          setCusttype(e.currentTarget.value as Custtype);\r\n                          values.custtype = e.currentTarget.value as Custtype;\r\n                          values.cvr = '';\r\n                        }}\r\n                        data-label=\"Customer type\"\r\n                        data-egainfield=\"misc_one\"\r\n                        data-maptoegain=\"true\"\r\n                        data-includeinmailboxemail=\"true\"\r\n                      />\r\n                    </RadioButtonCantainerSmall>\r\n                    <RadioButtonCantainerBig>\r\n                      <RadioButtonBox\r\n                        label={t('form-input-company-label')}\r\n                        id=\"custtype_company\"\r\n                        name=\"custtype\"\r\n                        value=\"company\"\r\n                        checked={custtype === 'company'}\r\n                        variant=\"secondary\"\r\n                        onChange={(e) => {\r\n                          setCusttype(e.currentTarget.value as Custtype);\r\n                          values.custtype = e.currentTarget.value as Custtype;\r\n                          values.cpr = '';\r\n                          values.lname = '';\r\n                        }}\r\n                        data-label=\"Customer type\"\r\n                        data-egainfield=\"misc_one\"\r\n                        data-maptoegain=\"true\"\r\n                        data-includeinmailboxemail=\"true\"\r\n                      />\r\n                    </RadioButtonCantainerBig>\r\n                  </RadioButtonWrapper>\r\n                </RadioButtonBoxGroup>\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name={values.custtype === 'company' ? 'fullname' : 'fname'}\r\n                  id={values.custtype === 'company' ? 'fullname' : 'fname'}\r\n                  label={values.custtype === 'company' ? t('form-input-name-label') : t('form-input-first-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.custtype === 'company' ? values.fullname : values.fname}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={\r\n                    touched.fname && errors.fname\r\n                      ? values.custtype === 'private'\r\n                        ? errors.fname\r\n                        : errors.fullname\r\n                      : ''\r\n                  }\r\n                  required\r\n                  data-testid=\"fname\"\r\n                  data-label={\r\n                    values.custtype === 'company' ? t('form-input-name-label') : t('form-input-first-name-label')\r\n                  }\r\n                  data-egainfield={values.custtype === 'company' ? 'customer_name' : 'first_name'}\r\n                  data-maptoegain=\"true\"\r\n                  maxLength={values.custtype === 'company' ? 50 : 30}\r\n                  data-includeinmailboxemail=\"true\"\r\n                />\r\n              </FormRow>\r\n\r\n              {values.custtype === 'private' && (\r\n                <FormRow>\r\n                  <FormRow>\r\n                    <InputField\r\n                      name=\"lname\"\r\n                      id=\"lname\"\r\n                      label={t('form-input-last-name-label')}\r\n                      layout=\"white\"\r\n                      value={values.lname}\r\n                      onChange={trackingChangeHandler}\r\n                      errorMessage={touched.lname && errors.lname ? errors.lname : ''}\r\n                      required\r\n                      maxLength={30}\r\n                      data-testid=\"lname\"\r\n                      data-label={t('form-input-last-name-label')}\r\n                      data-egainfield=\"last_name\"\r\n                      data-maptoegain=\"true\"\r\n                      data-includeinmailboxemail=\"true\"\r\n                    />\r\n                  </FormRow>\r\n\r\n                  <FormRow>\r\n                    <InputField\r\n                      name=\"cpr\"\r\n                      id=\"cpr\"\r\n                      label={t('form-input-cpr-label')}\r\n                      layout=\"white\"\r\n                      variant=\"numeric\"\r\n                      format=\"######-####\"\r\n                      value={values.cpr}\r\n                      onChange={trackingChangeHandler}\r\n                      errorMessage={touched.cpr && errors.cpr ? errors.cpr : ''}\r\n                      required\r\n                      data-testid=\"cpr\"\r\n                      data-label={t('form-input-cpr-label')}\r\n                      data-egainfield=\"customer_number\"\r\n                      data-maptoegain=\"true\"\r\n                      data-includeinmailboxemail=\"true\"\r\n                    />\r\n                  </FormRow>\r\n                </FormRow>\r\n              )}\r\n\r\n              <FormRow>\r\n                {values.custtype === 'company' && (\r\n                  <InputField\r\n                    name=\"cvr\"\r\n                    id=\"cvr\"\r\n                    label={t('form-input-cvr-label')}\r\n                    layout=\"white\"\r\n                    variant=\"numeric\"\r\n                    format=\"########\"\r\n                    value={values.cvr}\r\n                    maxLength={20}\r\n                    onChange={trackingChangeHandler}\r\n                    errorMessage={touched.cvr && errors.cvr ? errors.cvr : ''}\r\n                    required\r\n                    data-testid=\"cvr\"\r\n                    data-label={t('form-input-cvr-label')}\r\n                    data-egainfield=\"customer_number\"\r\n                    data-maptoegain=\"true\"\r\n                    data-includeinmailboxemail=\"true\"\r\n                  />\r\n                )}\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                  required\r\n                  maxLength={20}\r\n                  data-testid=\"phone\"\r\n                  data-label={t('form-input-phone-label')}\r\n                  data-egainfield=\"customer_phone\"\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"email\"\r\n                  id=\"email\"\r\n                  label={t('form-input-email-label')}\r\n                  layout=\"white\"\r\n                  value={values.email}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.email && errors.email ? errors.email : ''}\r\n                  required\r\n                  maxLength={100}\r\n                  data-testid=\"email\"\r\n                  data-label={t('form-input-email-label')}\r\n                  data-egainfield=\"customer_email\"\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <Button onClick={trackingChangeHandler} type=\"submit\" data-testid=\"buttonSubmit\">\r\n                  {t('form-button-next-label')}\r\n                </Button>\r\n              </FormRow>\r\n            </Form>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </FormLayout>\r\n  );\r\n};\r\n\r\nexport default NemKontoForm;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\nimport { CprRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    custtype: Yup.string(),\r\n    iscompany: Yup.string(),\r\n\r\n    cvr: Yup.number().when('custtype', {\r\n      is: (value) => value && value === 'company',\r\n      then: Yup.number()\r\n        .test('len', t('form-input-cvr-error'), (val) => val?.toString().length === 8)\r\n        .required(t('form-input-cvr-error')),\r\n      otherwise: Yup.number(),\r\n    }),\r\n\r\n    cpr: Yup.string().when('custtype', {\r\n      is: (value) => value === 'private' && value.length > 0,\r\n      then: Yup.string().required(t('form-input-cpr-error')).matches(CprRegex, t('form-input-cpr-error')),\r\n      otherwise: Yup.string(),\r\n    }),\r\n\r\n    fullname: Yup.string().when('custtype', {\r\n      is: (value) => value && value === 'company',\r\n      then: Yup.string().required(t('form-input-name-error')),\r\n      otherwise: Yup.string(),\r\n    }),\r\n\r\n    fname: Yup.string().when('custtype', {\r\n      is: (value) => value === 'private' && value.length > 0,\r\n      then: Yup.string().required(t('form-input-first-name-error')),\r\n      otherwise: Yup.string(),\r\n    }),\r\n\r\n    lname: Yup.string().when('custtype', {\r\n      is: (value) => value === 'private' && value.length > 0,\r\n      then: Yup.string().required(t('form-input-last-name-error')),\r\n      otherwise: Yup.string(),\r\n    }),\r\n\r\n    phone: Yup.string()\r\n      .required(t('form-input-phone-error'))\r\n      .matches(PhoneRegex, t('form-input-phone-error'))\r\n      .min(8, t('form-input-phone-error')),\r\n\r\n    email: Yup.string().required(t('form-input-email-error')).email(t('form-input-email-error')),\r\n  });\r\n}\r\n","import { Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormData } from '../../shared/forms/submitFormData';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport NemKontoForm from './NemKontoForm';\r\n\r\nexport type NemKontoProps = {\r\n  fields: any;\r\n};\r\n\r\nconst FormNemKonto: React.FC<NemKontoProps> = ({ fields = {} }) => {\r\n  const [page, setPage] = useState(0);\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const launchData: LaunchData = {\r\n    form_product: 'Nemkonto',\r\n    form_type: 'Opt out of nemKonto payment',\r\n    form_name: 'NemKonto opt out',\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n\r\n  const { trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking(launchData);\r\n\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  const handleSubmit = async (formData) => {\r\n    const response = await submitFormData(\r\n      {\r\n        apiUrl: fields['API Endpoint URL']?.value,\r\n        apiKey: fields['API Key']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n      },\r\n      formData\r\n    );\r\n    if (response) {\r\n      trackFormSubmitSuccess();\r\n      goToNextPage();\r\n    } else {\r\n      trackFormSubmitFail();\r\n\r\n      //Error Handling\r\n      setShowModal(true);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * conditional rendering\r\n   */\r\n  switch (page) {\r\n    case 0:\r\n      return (\r\n        <>\r\n          <NemKontoForm fields={fields} onSubmit={handleSubmit} />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </>\r\n      );\r\n    case 1: //Thank You Message\r\n      return <ThankYouMessage fields={fields} />;\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormNemKonto;\r\n","type FormConfig = {\r\n  /**\r\n   * The API endpoint URL where the form data is submitted to\r\n   */\r\n  apiUrl: string;\r\n  /**\r\n   * The API key to use when requesting the API\r\n   */\r\n  apiKey: string;\r\n  /**\r\n   * The DSID key for the form in EGAIN system.\r\n   * Please provide the string value WITHOUT brackets \"{\" and \"}\"\r\n   */\r\n  egainDsid: string;\r\n\r\n  /**\r\n   * The Form name which is shown in dashboard\r\n   */\r\n  webFormName: string;\r\n};\r\n\r\nexport async function submitFormDataV4(formConfig: FormConfig, formData: any): Promise<any> {\r\n  if (formData && formData.phone && formData.phone.indexOf('+') !== -1) {\r\n    const modifiedPhone = formData.phone.replace('+', '00');\r\n    formData.phone = modifiedPhone;\r\n  }\r\n  if (formData && formData.cpr && formData.cpr.indexOf('-') !== -1) {\r\n    const modifiedCPR = formData.cpr.replace('-', '');\r\n    formData.cpr = modifiedCPR;\r\n  }\r\n  const arrayOfFields = Object.keys(formData).reduce((result, key) => {\r\n    const element = document.getElementsByName(key)[0];\r\n    if (element) {\r\n      return [\r\n        ...result,\r\n        {\r\n          fieldname: element.getAttribute('data-egainfield') || key,\r\n          fieldlabel: element.getAttribute('data-label') || key,\r\n          fieldvalue: formData[key],\r\n          maptoegain: element.getAttribute('data-maptoegain') || 'true',\r\n          includeinmailboxemail: element.getAttribute('data-includeinmailboxemail') || 'true',\r\n        },\r\n      ];\r\n    }\r\n    return result;\r\n  }, [] as any[]);\r\n\r\n  const formBody = {\r\n    email: formData.email || '', // should be empty if there is no email field in the form\r\n    name: formData.fullname ? formData.fullname : formData.fname ? formData.fname : '',\r\n    firstname: formData.fname ? formData.fname : formData.fullname ? formData.fullname : '',\r\n    dsid: `{${formConfig.egainDsid}}`,\r\n    mailboxId: formData.mailboxId ? formData.mailboxId : '',\r\n    language: 'da',\r\n    version: 'v4',\r\n    IncludePageUrlInMail: 'true',\r\n    emailsubject: formData.emailsubject,\r\n    webformname: formConfig.webFormName,\r\n    formfieldsdata: {\r\n      formfields: arrayOfFields,\r\n    },\r\n  };\r\n\r\n  let formattedData = new FormData();\r\n  formattedData.append('FormPostData', JSON.stringify(formBody));\r\n  const response = await fetch(formConfig.apiUrl, {\r\n    method: 'POST',\r\n    headers: {\r\n      Accept: 'application/json',\r\n\r\n      'Access-Control-Allow-Origin': '*',\r\n      sc_apikey: formConfig.apiKey,\r\n    },\r\n    mode: 'cors',\r\n    body: formattedData,\r\n  })\r\n    .then((response) => response.json())\r\n    .then((response) => {\r\n      const json = response;\r\n      if (json.statusCode.toLowerCase() === 'ok') {\r\n        if (json.content.toLowerCase() === 'success') {\r\n          return true;\r\n        } else {\r\n          return false;\r\n        }\r\n      } else {\r\n        return false;\r\n      }\r\n    })\r\n    .catch((error) => {\r\n      console.warn('Form submit error:', error);\r\n      return false;\r\n    });\r\n  return response;\r\n}\r\n","import { Button, InputField } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport { getSchema } from './schema';\r\n\r\ntype Props = {\r\n  fields: any;\r\n  onSubmitData: (formData: any) => Promise<void>;\r\n};\r\n\r\nconst PpiForm: React.FC<Props> = ({ fields = {}, onSubmitData }) => {\r\n  const { t } = useTranslation();\r\n  const schema = getSchema(t);\r\n  const mailSubject = fields['Mail Subject']?.value;\r\n  const { onFormInteraction } = useAdobeTracking();\r\n\r\n  return (\r\n    <FormLayout\r\n      headline={fields['Headline']?.value}\r\n      description={fields['Description']?.value}\r\n      formTitle={fields['Form Title']?.value}\r\n    >\r\n      <Formik\r\n        initialValues={{\r\n          name: '',\r\n          phone: '',\r\n          cpr: '',\r\n          email: '',\r\n          emailsubject: mailSubject,\r\n        }}\r\n        validationSchema={schema}\r\n        onSubmit={(values) => {\r\n          onSubmitData(values);\r\n        }}\r\n      >\r\n        {({ values, errors, touched, handleChange }) => {\r\n          const trackingChangeHandler = (e) => {\r\n            onFormInteraction(e, handleChange);\r\n          };\r\n          return (\r\n            <Form noValidate>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"name\"\r\n                  id=\"name\"\r\n                  label={t('form-input-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.name}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_name\"\r\n                  maxLength={50}\r\n                  data-label={t('form-input-name-label')}\r\n                  errorMessage={touched.name && errors.name ? errors.name : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  maxLength={20}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_phone\"\r\n                  data-label={t('form-input-phone-label')}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"cpr\"\r\n                  id=\"cpr\"\r\n                  label={t('form-input-cpr-label')}\r\n                  layout=\"white\"\r\n                  variant=\"numeric\"\r\n                  format=\"######-####\"\r\n                  value={values.cpr}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"customer_number\"\r\n                  data-label={t('form-input-cpr-label')}\r\n                  errorMessage={touched.cpr && errors.cpr ? errors.cpr : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"email\"\r\n                  id=\"email\"\r\n                  label={t('form-input-email-label')}\r\n                  layout=\"white\"\r\n                  value={values.email}\r\n                  onChange={trackingChangeHandler}\r\n                  maxLength={100}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"email\"\r\n                  data-label={t('form-input-email-label')}\r\n                  errorMessage={touched.email && errors.email ? errors.email : ''}\r\n                  required\r\n                />\r\n                <small>\r\n                  <i>{fields['Email Field Description']?.value}</i>\r\n                </small>\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <Button onClick={trackingChangeHandler} type=\"submit\" id=\"submit\">\r\n                  {t('form-button-send-label')}\r\n                </Button>\r\n                <p>{fields['Submit Button Description']?.value}</p>\r\n              </FormRow>\r\n            </Form>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </FormLayout>\r\n  );\r\n};\r\n\r\nexport default PpiForm;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\nimport { CprRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    cpr: Yup.string().required(t('form-input-cpr-error')).matches(CprRegex, t('form-input-cpr-error')),\r\n    name: Yup.string().required(t('form-input-name-error')),\r\n    phone: Yup.string()\r\n      .required(t('form-input-phone-error'))\r\n      .matches(PhoneRegex, t('form-input-phone-error'))\r\n      .min(8, t('form-input-phone-error')),\r\n    email: Yup.string().required(t('form-input-email-error')).email(t('form-input-email-error')),\r\n  });\r\n}\r\n","import { Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormDataV4 } from '../../shared/forms/submitFormDataV4';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport PpiForm from './PpiForm';\r\n\r\nexport type FormPpiProps = {\r\n  fields: any;\r\n};\r\n\r\nconst FormPpi: React.FC<FormPpiProps> = ({ fields = {} }) => {\r\n  const { t } = useTranslation();\r\n  const [page, setPage] = useState(0);\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n  const webformName = 'lånesikring RD';\r\n  const launchData: LaunchData = {\r\n    form_product: webformName + ' request',\r\n    form_type: webformName + ' information request',\r\n    form_name: webformName,\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n\r\n  const { trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking(launchData);\r\n\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  const onSubmitData = async (formData) => {\r\n    const response = await submitFormDataV4(\r\n      {\r\n        apiUrl: fields['API Endpoint URL']?.value,\r\n        apiKey: fields['API Key']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n        webFormName: webformName,\r\n      },\r\n      formData\r\n    );\r\n    if (response) {\r\n      goToNextPage();\r\n      trackFormSubmitSuccess();\r\n    } else {\r\n      trackFormSubmitFail();\r\n\r\n      //Error Handling\r\n      setShowModal(true);\r\n    }\r\n  };\r\n\r\n  /* conditional rendering  */\r\n  switch (page) {\r\n    case 0:\r\n      return (\r\n        <>\r\n          <PpiForm fields={fields} onSubmitData={onSubmitData} />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </>\r\n      );\r\n    case 1: //Thank You Message\r\n      return <ThankYouMessage fields={fields} />;\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormPpi;\r\n","import { Button, Col, InputField, Row, Typography } from 'db-npm-rdui';\r\nimport { Form, Formik } from 'formik';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { FormLayout, FormRow } from '../../shared/components/Form';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport { getSchema } from './schema';\r\n\r\nexport type UnsubscribeProps = {\r\n  fields: any;\r\n  onSubmitData: (formData: any) => Promise<void>;\r\n};\r\n\r\nconst LabelHeader = styled(Typography)`\r\n  display: block;\r\n  margin-bottom: 10px;\r\n`;\r\n\r\nconst UnsubscribeForm: React.FC<UnsubscribeProps> = ({ fields = {}, onSubmitData }) => {\r\n  const { t } = useTranslation();\r\n  const schema = getSchema(t);\r\n  const mailBoxId = fields['Mailbox ID']?.value;\r\n  const mailSubject = fields['Mail Subject']?.value;\r\n  const launchData: LaunchData = {\r\n    form_product: 'Unsubscribe form',\r\n    form_type: 'Customer unsubscribe from marketing',\r\n    form_name: 'Unsubscribe form',\r\n    form_step: 'Initial step',\r\n    form_status: ['loaded', 'view step'],\r\n  };\r\n  const { onFormInteraction } = useAdobeTracking(launchData);\r\n\r\n  return (\r\n    <FormLayout headline={fields['Headline']?.value} description={fields['Description']?.value}>\r\n      <Formik\r\n        enableReinitialize\r\n        initialValues={{\r\n          fname: '',\r\n          lname: '',\r\n          streetname: '',\r\n          housenumber: '',\r\n          floor: '',\r\n          side: '',\r\n          postnumber: '',\r\n          by: '',\r\n          phone: '',\r\n          mailboxId: mailBoxId,\r\n          emailsubject: mailSubject,\r\n        }}\r\n        validationSchema={schema}\r\n        onSubmit={(values) => {\r\n          onSubmitData(values);\r\n        }}\r\n      >\r\n        {({ values, errors, touched, handleChange }) => {\r\n          const trackingChangeHandler = (e) => {\r\n            onFormInteraction(e, handleChange);\r\n          };\r\n\r\n          return (\r\n            <Form noValidate>\r\n              <FormRow>\r\n                <LabelHeader type=\"label\" as=\"label\" htmlFor=\"topic\">\r\n                  {fields['Form Title']?.value}\r\n                </LabelHeader>\r\n              </FormRow>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"fname\"\r\n                  id=\"firstname\"\r\n                  label={t('form-input-first-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.fname}\r\n                  maxLength={30}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-egainfield=\"first_name\"\r\n                  data-label={t('form-input-first-name-label')}\r\n                  data-includeinmailboxemail=\"true\"\r\n                  errorMessage={touched.fname && errors.fname ? errors.fname : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"lname\"\r\n                  id=\"lastname\"\r\n                  label={t('form-input-last-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.lname}\r\n                  maxLength={30}\r\n                  onChange={trackingChangeHandler}\r\n                  data-maptoegain=\"true\"\r\n                  data-egainfield=\"last_name\"\r\n                  data-label={t('form-input-last-name-label')}\r\n                  data-includeinmailboxemail=\"true\"\r\n                  errorMessage={touched.lname && errors.lname ? errors.lname : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"streetname\"\r\n                  id=\"streetname\"\r\n                  label={t('form-input-street-name-label')}\r\n                  layout=\"white\"\r\n                  value={values.streetname}\r\n                  maxLength={50}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"misc_one\"\r\n                  data-label={t('form-input-street-name-label')}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.streetname && errors.streetname ? errors.streetname : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"housenumber\"\r\n                  id=\"housenumber\"\r\n                  label={t('form-input-house-number-label')}\r\n                  layout=\"white\"\r\n                  value={values.housenumber}\r\n                  data-maptoegain=\"true\"\r\n                  maxLength={50}\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"misc_two\"\r\n                  data-label={t('form-input-house-number-label')}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.housenumber && errors.housenumber ? errors.housenumber : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"floor\"\r\n                  id=\"floor\"\r\n                  label={t('form-input-floor-label')}\r\n                  layout=\"white\"\r\n                  value={values.floor}\r\n                  maxLength={50}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"misc_three\"\r\n                  data-label={t('form-input-floor-label')}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.floor && errors.floor ? errors.floor : ''}\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"side\"\r\n                  id=\"side\"\r\n                  label={t('form-input-side-label')}\r\n                  layout=\"white\"\r\n                  value={values.side}\r\n                  maxLength={50}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  data-egainfield=\"misc_four\"\r\n                  data-label={t('form-input-side-label')}\r\n                  onChange={trackingChangeHandler}\r\n                  errorMessage={touched.side && errors.side ? errors.side : ''}\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <Row>\r\n                  <Col lg={6} sm={12}>\r\n                    <InputField\r\n                      name=\"postnumber\"\r\n                      id=\"postnumber\"\r\n                      label={t('form-input-zip-label')}\r\n                      layout=\"white\"\r\n                      value={values.postnumber}\r\n                      maxLength={50}\r\n                      data-maptoegain=\"true\"\r\n                      data-includeinmailboxemail=\"true\"\r\n                      onChange={trackingChangeHandler}\r\n                      data-egainfield=\"misc_five\"\r\n                      data-label={t('form-input-zip-label')}\r\n                      errorMessage={touched.postnumber && errors.postnumber ? errors.postnumber : ''}\r\n                      required\r\n                    />\r\n                  </Col>\r\n                  <Col lg={6} sm={12}>\r\n                    <InputField\r\n                      name=\"by\"\r\n                      id=\"by\"\r\n                      label={t('form-input-city-label')}\r\n                      layout=\"white\"\r\n                      value={values.by}\r\n                      data-maptoegain=\"true\"\r\n                      data-includeinmailboxemail=\"true\"\r\n                      onChange={trackingChangeHandler}\r\n                      maxLength={50}\r\n                      data-egainfield=\"misc_six\"\r\n                      data-label={t('form-input-city-label')}\r\n                      errorMessage={touched.by && errors.by ? errors.by : ''}\r\n                      required\r\n                    />\r\n                  </Col>\r\n                </Row>\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <InputField\r\n                  name=\"phone\"\r\n                  id=\"phone\"\r\n                  label={t('form-input-phone-label')}\r\n                  layout=\"white\"\r\n                  value={values.phone}\r\n                  maxLength={20}\r\n                  data-maptoegain=\"true\"\r\n                  data-includeinmailboxemail=\"true\"\r\n                  onChange={trackingChangeHandler}\r\n                  data-egainfield=\"customer_phone\"\r\n                  data-label={t('form-input-phone-label')}\r\n                  errorMessage={touched.phone && errors.phone ? errors.phone : ''}\r\n                  required\r\n                />\r\n              </FormRow>\r\n\r\n              <FormRow>\r\n                <Button onClick={trackingChangeHandler} id=\"submit\" type=\"submit\">\r\n                  {t('form-button-send-label')}\r\n                </Button>\r\n              </FormRow>\r\n            </Form>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </FormLayout>\r\n  );\r\n};\r\n\r\nexport default UnsubscribeForm;\r\n","import { TFunction } from 'i18next';\r\nimport * as Yup from 'yup';\r\nimport { NameRegex, NumberRegex, PhoneRegex } from '../../shared/regex';\r\n\r\nexport function getSchema(t: TFunction) {\r\n  return Yup.object().shape({\r\n    fname: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-name-error')),\r\n    lname: Yup.string().required(t('form-required-error')).matches(NameRegex, t('form-input-name-error')),\r\n    housenumber: Yup.string().required(t('form-required-error')).matches(NumberRegex, t('form-input-number-error')),\r\n    streetname: Yup.string().required(t('form-required-error')),\r\n    postnumber: Yup.string()\r\n      .required(t('form-required-error'))\r\n      .matches(NumberRegex, t('form-input-number-error'))\r\n      .min(3, t('form-input-number-error')),\r\n    by: Yup.string().required(t('form-required-error')),\r\n    phone: Yup.string()\r\n      .required(t('form-required-error'))\r\n      .matches(PhoneRegex, t('form-input-phone-error'))\r\n      .min(8, t('form-input-phone-error')),\r\n  });\r\n}\r\n","import { Modal } from 'db-npm-rdui';\r\nimport React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorMessage } from '../../shared/components/ErrorMessage/ErrorMessage';\r\nimport { ThankYouMessage } from '../../shared/components/ThankYouMessage/ThankYouMessage';\r\nimport { submitFormData } from '../../shared/forms/submitFormData';\r\nimport { useAdobeTracking } from '../../shared/hooks';\r\nimport UnsubscribeForm from './UnsubscribeForm';\r\n\r\nexport type FormUnsubscribeProps = {\r\n  fields: any;\r\n};\r\n\r\nconst FormUnsubscribe: React.FC<FormUnsubscribeProps> = ({ fields = {} }) => {\r\n  const [page, setPage] = useState(0);\r\n  const { t } = useTranslation();\r\n  const [showModal, setShowModal] = React.useState(false);\r\n  const toggleModal = () => setShowModal(!showModal);\r\n\r\n  const { trackFormSubmitSuccess, trackFormSubmitFail } = useAdobeTracking();\r\n  const goToNextPage = () => {\r\n    setPage(page + 1);\r\n    window.scrollTo(0, 0);\r\n  };\r\n\r\n  const onSubmitData = async (formData) => {\r\n    const returndata = await submitFormData(\r\n      {\r\n        apiUrl: fields['API Endpoint URL']?.value,\r\n        apiKey: fields['API Key']?.value,\r\n        egainDsid: fields['Egain DSID']?.value,\r\n      },\r\n      formData\r\n    );\r\n    if (returndata) {\r\n      trackFormSubmitSuccess();\r\n      goToNextPage();\r\n    } else {\r\n      trackFormSubmitFail();\r\n\r\n      //Error Handling\r\n      setShowModal(true);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * conditional rendering\r\n   */\r\n  switch (page) {\r\n    case 0:\r\n      return (\r\n        <>\r\n          <UnsubscribeForm fields={fields} onSubmitData={onSubmitData} />\r\n          <Modal open={showModal} handleClose={toggleModal} ariaCloseLabel={'Close modal'} overlayColor=\"#1f2532\">\r\n            <ErrorMessage message={t('form-submit-error')} />\r\n          </Modal>\r\n        </>\r\n      );\r\n    case 1: //Thank You Message\r\n      return <ThankYouMessage fields={fields} />;\r\n  }\r\n\r\n  return null;\r\n};\r\n\r\nexport default FormUnsubscribe;\r\n","/**\r\n * Static demo menu items for developmen\r\n */\r\nexport const DEMO_DATA = {\r\n  megaMenu: [\r\n    {\r\n      name: 'Privat',\r\n      url: '/privat',\r\n      trackingcode: 'privat',\r\n      isCurrent: true,\r\n    },\r\n    {\r\n      name: 'Erhverv',\r\n      url: '/erhverv',\r\n      trackingcode: 'erhverv',\r\n    },\r\n    {\r\n      name: 'Investor',\r\n      url: '/investor',\r\n      trackingcode: 'investor',\r\n    },\r\n  ],\r\n  topMenu: [\r\n    {\r\n      name: 'Example pages',\r\n      url: '/example',\r\n      children: [\r\n        {\r\n          name: 'Pages',\r\n          url: '#',\r\n          children: [\r\n            {\r\n              name: 'Product page',\r\n              url: '/da/privat/product-page',\r\n              trackingcode: 'Product Page',\r\n            },\r\n            {\r\n              name: 'Article page',\r\n              url: '/da/privat/article-page',\r\n              trackingcode: 'Article Page',\r\n            },\r\n            {\r\n              name: 'Kurser & Renter page',\r\n              url: '/da/privat/kurser',\r\n            },\r\n            {\r\n              name: 'Calculator Private',\r\n              url: '/da/privat/calculator-private',\r\n              trackingcode: 'Calculator Private',\r\n            },\r\n            {\r\n              name: 'Calculator Business',\r\n              url: '/da/privat/calculator-business',\r\n              trackingcode: 'Calculator Business',\r\n            },\r\n            {\r\n              name: 'Calculator Lending',\r\n              url: '/da/privat/calculator-lending',\r\n              trackingcode: 'Calculator Lending',\r\n            },\r\n            {\r\n              name: 'Form: GDPR',\r\n              url: '/da/privat/form-gdpr',\r\n            },\r\n            {\r\n              name: 'Form: Deselect NemKonto',\r\n              url: '/da/privat/form-nemkonto',\r\n            },\r\n            {\r\n              name: 'Form: NemKonto Business',\r\n              url: '/da/privat/form-nemkonto?formtype=business',\r\n            },\r\n            {\r\n              name: 'Form: Call Me',\r\n              url: '/da/privat/form-callme',\r\n            },\r\n            {\r\n              name: 'Form: Call Me Business',\r\n              url: '/da/privat/form-callme?formtype=business',\r\n            },\r\n            {\r\n              name: 'Form: CPR Upload',\r\n              url: '/da/privat/form-cpr-upload',\r\n            },\r\n            {\r\n              name: 'Form: CVR Upload',\r\n              url: '/da/privat/form-cvr-upload',\r\n            },\r\n            {\r\n              name: 'New Accordion Module',\r\n              url: '/da/privat/new-accordion',\r\n            },\r\n            {\r\n              name: 'Contact Page',\r\n              url: '/da/privat/contact-page',\r\n            },\r\n            {\r\n              name: 'New Frontpage Module',\r\n              url: '/da/privat/new-frontpage-module',\r\n            },\r\n            {\r\n              name: 'Form: Frameld markedsføring',\r\n              url: '/da/privat/form-unsubscribe',\r\n            },\r\n            {\r\n              name: 'Form: PPI',\r\n              url: '/da/privat/form-ppi',\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n    },\r\n    {\r\n      name: 'Lånetyper',\r\n      url: '/laantyper',\r\n      children: [\r\n        {\r\n          name: 'Lånetyper',\r\n          url: '#',\r\n          children: [\r\n            { name: 'Obligationslån', url: '#' },\r\n            { name: 'Flexlife', url: '#' },\r\n            {\r\n              name: 'Flexlån K',\r\n              url: '#',\r\n              label: 'New',\r\n              trackingcode: 'Flexlån K',\r\n            },\r\n            { name: 'Flexlån T', url: '#' },\r\n            { name: 'Flexkort', url: '#' },\r\n            { name: 'Kontantlån', url: '#' },\r\n          ],\r\n        },\r\n        {\r\n          name: 'Banklån',\r\n          url: '#',\r\n          children: [\r\n            {\r\n              name: 'Låneanbefalinger',\r\n              url: '#',\r\n            },\r\n            {\r\n              name: 'Hvilket lån skal jeg vælge?',\r\n              url: '#',\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n    },\r\n    {\r\n      name: 'Kurser & priser',\r\n      url: '/kurser',\r\n      children: [\r\n        {\r\n          name: 'Kurser og priser',\r\n          url: '#',\r\n          children: [\r\n            {\r\n              name: 'Kurser & Renter',\r\n              url: '/da/privat/kurser',\r\n            },\r\n            {\r\n              name: 'Kurser & Renter Business',\r\n              url: '/da/privat/kurser/#erhverv',\r\n            },\r\n            {\r\n              name: 'Aktuelle priser',\r\n              url: '#',\r\n            },\r\n            {\r\n              name: 'Prisblad (vilkår)',\r\n              url: '#',\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n    },\r\n    {\r\n      name: 'Aktuelt',\r\n      url: '/aktuelt',\r\n      children: [\r\n        {\r\n          name: 'Aktuelt',\r\n          url: '#',\r\n          children: [\r\n            { name: 'Analyser', url: '#' },\r\n            { name: 'Anbefalinger', url: '#' },\r\n            { name: 'Nyheder', url: '#' },\r\n            { name: 'Refinansiering *', url: '#' },\r\n            {\r\n              name: 'Rentetilpasning',\r\n              url: '#',\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n    },\r\n  ],\r\n};\r\n","import { SearchResultsType } from 'db-npm-rdui';\r\n\r\n/**\r\n * Api function to call the search API\r\n * @param {string} query The search querye to send to the API\r\n * @param {number} start Start showing results from this number\r\n * @param {string} apiUrl Absolute url for the api\r\n * @param {string} dsid Id for the Sitecore item holding the api settings\r\n */\r\nexport async function doGoogleSearch(query, start, apiUrl, dsid) {\r\n  const payload = {\r\n    dsid: dsid,\r\n    query: query,\r\n    count: '10',\r\n    startindex: start,\r\n  };\r\n\r\n  let googleResults: any = null;\r\n\r\n  try {\r\n    const response = await fetch(apiUrl, {\r\n      method: 'POST',\r\n      mode: 'cors',\r\n      headers: {\r\n        Accept: 'application/json',\r\n        'Content-Type': 'application/json',\r\n      },\r\n      body: JSON.stringify(payload),\r\n    });\r\n    googleResults = await response.json();\r\n  } catch (e) {\r\n    console.log('fetch error', e);\r\n  }\r\n\r\n  const promiseExecutor = async (resolve, reject) => {\r\n    const results: SearchResultsType = { hits: 0, results: [], currentPage: 1 };\r\n\r\n    if (!googleResults) {\r\n      reject('Error getting results from google');\r\n      return;\r\n    }\r\n    const startIndex =\r\n      typeof googleResults.queries?.nextPage === 'object' ? googleResults.queries?.nextPage[0].startIndex : 11;\r\n    const currentPage = (startIndex - 1) / 10;\r\n    results.currentPage = currentPage;\r\n    results.hits = googleResults?.searchInformation?.totalResults ?? 0;\r\n    const mappedResults = googleResults.items?.map((googleResult) => ({\r\n      thumbnailUrl: '', //googleResult.pagemap?.cse_thumbnail?.length ? googleResult.pagemap?.cse_thumbnail[0].src : '',\r\n      title: googleResult.htmlTitle,\r\n      description: googleResult.htmlSnippet,\r\n      link: googleResult.link,\r\n      fileFormat: googleResult.fileFormat,\r\n      searchTerms: googleResults.queries?.request?.[0]?.searchTerms || '',\r\n    }));\r\n    results.results = mappedResults ?? [];\r\n    resolve(results);\r\n  };\r\n\r\n  const resultsPromise = new Promise<SearchResultsType>(promiseExecutor);\r\n\r\n  return resultsPromise;\r\n}\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  ConsentLevel,\r\n  Header as HeaderComponent,\r\n  Icons,\r\n  SearchResultsType,\r\n  StickyCta,\r\n  Typography,\r\n  breakpointsBootstrap,\r\n  useCookieConsent,\r\n} from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { fieldReferences } from '../../constants';\r\nimport { LaunchData, useAdobeTracking, useSitecoreContext } from '../../shared/hooks';\r\nimport { DEMO_DATA } from './Header.demo-data';\r\nimport { doGoogleSearch } from './googleSearchApi';\r\n\r\nexport type HeaderProps = {\r\n  fields: any;\r\n};\r\n\r\nconst Header: React.FC<HeaderProps> = (props) => {\r\n  // Use demo data links as default,\r\n  // but override with real data from props.fields if any\r\n  const fields = {\r\n    ...DEMO_DATA,\r\n    ...props.fields,\r\n  };\r\n\r\n  const googleApiUrl = fields['Search API Endpoint URL']?.value ?? '';\r\n  const dsid = fields['Search API Sitecore Setting ID']?.value ?? '';\r\n  const feedbackAllowed = useCookieConsent().isAllowed(ConsentLevel.Functional);\r\n  const context = useSitecoreContext();\r\n  const hideStickyCalculator = context?.route?.fields?.[fieldReferences.basePage.hideStickyCalculator]?.value || false;\r\n  const hideStickyBookMeeting =\r\n    context?.route?.fields?.[fieldReferences.basePage.hideStickyBookMeeting]?.value || false;\r\n  const [searchResults, setSearchResults] = React.useState<SearchResultsType>({\r\n    hits: null,\r\n    results: [],\r\n  });\r\n  const [searchQuery, setSearchQuery] = React.useState('');\r\n  const [customComponent, setCustomComponent] = React.useState<any>(null);\r\n  const { t } = useTranslation();\r\n\r\n  const launchData: LaunchData = {\r\n    search_area: 'RD',\r\n    search_results: '',\r\n    search_term: '',\r\n  };\r\n\r\n  const cacheSearchResults = (searchResults) => {\r\n    window.sessionStorage.setItem('last_search', JSON.stringify(searchResults));\r\n  };\r\n\r\n  const retrieveCachedResults = (): SearchResultsType =>\r\n    JSON.parse(window.sessionStorage.getItem('last_search') as string);\r\n\r\n  const clearCachedResults = () => window.sessionStorage.removeItem('last_search');\r\n\r\n  const isNavigation = () => {\r\n    const navigationType = (window.performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming)?.type;\r\n    return navigationType === 'back_forward' || navigationType === 'navigate';\r\n  };\r\n\r\n  const {\r\n    trackSearchOpened,\r\n    trackSearchResultClick,\r\n    trackSearchPerformed,\r\n    trackSearchLoadMoreResults,\r\n  } = useAdobeTracking(launchData);\r\n\r\n  // Search handlers\r\n  const searchHandler = (query: string) => {\r\n    setCustomComponent(\r\n      <Spinner>\r\n        <Icons.Spinner />\r\n      </Spinner>\r\n    );\r\n    doGoogleSearch(query, 1, googleApiUrl, dsid).then(\r\n      (results: SearchResultsType) => {\r\n        const trackingHits = Number(results?.hits) === 0 ? 'zero' : results?.hits ?? 0;\r\n        trackSearchPerformed(query, trackingHits);\r\n        setCustomComponent(Number(results?.hits) === 0 ? NoResults : null);\r\n        setSearchResults(results);\r\n        cacheSearchResults(results);\r\n        if (window.innerWidth < breakpointsBootstrap.md) {\r\n          const doc: any = document;\r\n          doc?.activeElement?.blur();\r\n        }\r\n      },\r\n      (error: any) => {\r\n        console.log(error);\r\n        setCustomComponent(<ApiError />);\r\n      }\r\n    );\r\n  };\r\n\r\n  const loadMoreResultsHandler = (query: string, startFrom: number, count: number, accumulate: boolean = false) => {\r\n    setCustomComponent(\r\n      <LoadMoreSpinner>\r\n        <Icons.Spinner />\r\n      </LoadMoreSpinner>\r\n    );\r\n    let startIndex = startFrom - 1;\r\n    const start = startIndex * count + 1;\r\n    trackSearchLoadMoreResults(document.title, startIndex + 1);\r\n    doGoogleSearch(query, start, googleApiUrl, dsid).then(\r\n      (resultData: SearchResultsType) => {\r\n        setCustomComponent(Number(resultData?.hits) === 0 ? NoResults : null);\r\n        if (accumulate) {\r\n          resultData.results = [...(searchResults.results as Array<any>), ...(resultData.results as Array<any>)];\r\n        }\r\n        setSearchResults(resultData);\r\n        cacheSearchResults(resultData);\r\n      },\r\n      (error: any) => {\r\n        console.log(error);\r\n        setCustomComponent(<ApiError />);\r\n      }\r\n    );\r\n  };\r\n\r\n  const NoResults: React.FC = () => <RichText field={fields['No Search Results Text']} editable={false} />;\r\n\r\n  const ApiError: React.FC = () => (\r\n    <ApiErrorWrapper>\r\n      <Icons.Action.Broke></Icons.Action.Broke>\r\n      <Typography type=\"h8\">{t('search-error-title')}</Typography>\r\n      <span\r\n        dangerouslySetInnerHTML={{\r\n          __html: t('search-error-text'),\r\n        }}\r\n      />\r\n    </ApiErrorWrapper>\r\n  );\r\n\r\n  const Spinner = styled.div`\r\n    margin-top: 50px;\r\n    svg {\r\n      width: 50px;\r\n      height: 50px;\r\n    }\r\n  `;\r\n\r\n  const LoadMoreSpinner = styled(Spinner)`\r\n    position: fixed;\r\n    bottom: 150px;\r\n  `;\r\n\r\n  const ApiErrorWrapper = styled.div`\r\n    margin-top: 40px;\r\n    gap: 10px;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    > svg {\r\n      width: 40px;\r\n      height: 40px;\r\n    }\r\n  `;\r\n\r\n  // Create menu items array for \"loginLinks\"\r\n  const loginLinks = [\r\n    {\r\n      name: fields['Login Button Text']?.value,\r\n      url: '#',\r\n      children: [\r\n        {\r\n          name: fields['Login NemID Link']?.value?.text,\r\n          url: fields['Login NemID Link']?.value?.href,\r\n          text: fields['Login NemID Description']?.value,\r\n          trackingcode: fields['Login NemID Link']?.value?.trackingcode,\r\n        },\r\n        {\r\n          name: fields['Login CVR Link']?.value?.text,\r\n          url: fields['Login CVR Link']?.value?.href,\r\n          text: fields['Login CVR Description']?.value,\r\n          trackingcode: fields['Login CVR Link']?.value?.trackingcode,\r\n        },\r\n        {\r\n          name: fields['Login Signing Link']?.value?.text,\r\n          url: fields['Login Signing Link']?.value?.href,\r\n          text: fields['Login Signing Description']?.value,\r\n          trackingcode: fields['Login Signing Link']?.value?.trackingcode,\r\n        },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  return (\r\n    <>\r\n      {(!hideStickyCalculator || !hideStickyBookMeeting) && (\r\n        <StickyCta\r\n          bookMeetingText={fields['Sticky CTA Book Meeting Link']?.value?.text}\r\n          bookMeetingLink={fields['Sticky CTA Book Meeting Link']?.value?.href}\r\n          hideStickybookMeeting={hideStickyBookMeeting}\r\n          bookMeetingTrackingId={fields['Sticky CTA Book Meeting Link']?.value?.trackingcode}\r\n          calculateText={fields['Sticky CTA Calculator Link']?.value?.text}\r\n          calculateLink={fields['Sticky CTA Calculator Link']?.value?.href}\r\n          hideStickyCalculator={hideStickyCalculator}\r\n          calculatorTrackingId={fields['Sticky CTA Calculator Link']?.value?.trackingcode}\r\n        />\r\n      )}\r\n\r\n      <HeaderComponent\r\n        areaLinks={fields.megaMenu}\r\n        menuLinks={fields.topMenu}\r\n        loginLinks={loginLinks}\r\n        logoImage={fields['Logo Image']?.value.src}\r\n        logoLink={fields['Logo Link']?.value.href}\r\n        backLink={fields['Beta Banner Back Link']?.value?.href}\r\n        backText={fields['Beta Banner Back Link']?.value?.text}\r\n        feedbackContent={\r\n          feedbackAllowed && (\r\n            <span\r\n              dangerouslySetInnerHTML={{\r\n                __html: fields['Beta Banner Feedback Raw Content']?.value,\r\n              }}\r\n            />\r\n          )\r\n        }\r\n        mobileCtaLink={fields['Book Meeting Link']?.value?.href}\r\n        mobileCtaText={fields['Book Meeting Link']?.value?.text}\r\n        hasSearchButton={fields['Show Search Icon']?.value}\r\n        handleSearch={searchHandler}\r\n        handleResultClick={(res) => {\r\n          trackSearchResultClick(res);\r\n        }}\r\n        handleSearchButtonClick={(showing) => {\r\n          if (showing) {\r\n            trackSearchOpened(document.title);\r\n            const cachedResults = retrieveCachedResults();\r\n            if (cachedResults) {\r\n              if (isNavigation()) {\r\n                setSearchResults(cachedResults);\r\n                const previousQuery = cachedResults?.results?.[0].searchTerms ?? '';\r\n                setSearchQuery(previousQuery);\r\n              } else {\r\n                clearCachedResults();\r\n              }\r\n            }\r\n          }\r\n        }}\r\n        handleLoadMoreResults={loadMoreResultsHandler}\r\n        searchResults={searchResults}\r\n        searchOverlayComponent={customComponent}\r\n        searchLabels={{\r\n          searchInputLabel: t('search-input-label'),\r\n          hitsLabel: '',\r\n          showMoreButtonLabel: t('show-more-button-label'),\r\n        }}\r\n        loadMoreStylePagination={true}\r\n        searchQuery={searchQuery}\r\n      />\r\n    </>\r\n  );\r\n};\r\n\r\nexport default Header;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Col, Container, Row, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { FieldChecker, Section } from '../../shared/components';\r\n\r\nexport type HeadlineProps = {\r\n  fields: any;\r\n};\r\n\r\nconst Headline: React.FC<HeadlineProps> = ({ fields = {} }) => (\r\n  <Section componentName=\"Headline\" margin=\"large\">\r\n    <Container>\r\n      <Row justify=\"center\">\r\n        <Col md={6}>\r\n          <Box textAlign=\"center\" marginBottom={5}>\r\n            <FieldChecker type=\"text\" field={fields['Label']}>\r\n              <Typography type=\"label\">\r\n                <Text field={fields['Label']} />\r\n              </Typography>\r\n            </FieldChecker>\r\n          </Box>\r\n\r\n          <Box textAlign=\"center\">\r\n            <FieldChecker type=\"text\" field={fields['Headline']}>\r\n              <Typography type=\"h2\">\r\n                <Text field={fields['Headline']} />\r\n              </Typography>\r\n            </FieldChecker>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  </Section>\r\n);\r\n\r\nexport default Headline;\r\n","import dayjs from 'dayjs';\r\nimport 'dayjs/locale/da';\r\n\r\nexport const Languages = {\r\n  English: 'en',\r\n  Denmark: 'da',\r\n  French: 'fr',\r\n  Spanish: 'es',\r\n};\r\n\r\nfunction ConvertDate(dateValue: string, dateFormat: string, language = Languages.English) {\r\n  let dateParseVal = Date.parse(dateValue);\r\n  let localDate = dayjs(dateParseVal).locale(language).format(dateFormat);\r\n  return localDate;\r\n}\r\n\r\nexport default ConvertDate;\r\n","import * as React from 'react';\r\n\r\nexport const IconDownload = () => (\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"14\">\r\n    <path\r\n      d=\"M9.733 6.008L6.386 9.354 3.04 6.008m3.346 2.584L6.5 1.285M2 12.299h8.773\"\r\n      fill=\"none\"\r\n      fill-rule=\"evenodd\"\r\n      stroke=\"#000\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n      stroke-width=\"1.5\"\r\n    />\r\n  </svg>\r\n);\r\n","import { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Col, Container, Row, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, LabelGrey, LinkAnimatedUnderline, Section } from '../../shared/components';\r\nimport ConvertDate, { Languages } from '../../shared/utils/dateParser';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\nimport { IconDownload } from './IconDownload';\r\n\r\nconst DateDiv = styled.div`\r\n  position: relative;\r\n  display: inline-block;\r\n  line-height: 1;\r\n  color: black;\r\n`;\r\n\r\nconst InnerDateDiv = styled.div`\r\n  text-transform: capitalize;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  font-stretch: normal;\r\n  font-style: italic;\r\n  line-height: normal;\r\n  letter-spacing: normal;\r\n  :not(:empty)::before {\r\n    left: -5px;\r\n  }\r\n  :not(:empty)::after {\r\n    right: -5px;\r\n  }\r\n  :not(:empty)::after,\r\n  ::before {\r\n    position: absolute;\r\n    content: '';\r\n\r\n    background: #d8d8d8;\r\n    height: 12px;\r\n    width: 2px;\r\n    transform: skewX(-10deg);\r\n    bottom: 2px;\r\n  }\r\n`;\r\n\r\n/* Out of 3 variations proposed we need to select one field. */\r\nfunction SelectSingleField(fields: any = {}) {\r\n  if (fields['Link'] && fields['Link']?.value?.text && fields['Link']?.value?.href) {\r\n    return (\r\n      <Box textAlign=\"center\" marginTop={6}>\r\n        <LinkAnimatedUnderline field={fields['Link']}>\r\n          <IconDownload /> {fields['Link']?.value?.text}\r\n        </LinkAnimatedUnderline>\r\n      </Box>\r\n    );\r\n  } else if (fields['Date'] && new Date(fields['Date'].value).getFullYear() > 2000) {\r\n    return (\r\n      <Box textAlign=\"center\" marginTop={6}>\r\n        <DateDiv>\r\n          <InnerDateDiv>{ConvertDate(fields['Date']?.value, 'DD MMMM - YYYY', Languages.Denmark)}</InnerDateDiv>\r\n        </DateDiv>\r\n      </Box>\r\n    );\r\n  } else if (fields['Hero Sub Text'] && fields['Hero Sub Text']?.value?.length > 0) {\r\n    return (\r\n      <Box textAlign=\"center\" marginTop={6}>\r\n        <DateDiv>\r\n          <InnerDateDiv>{fields['Hero Sub Text']?.value}</InnerDateDiv>\r\n        </DateDiv>\r\n      </Box>\r\n    );\r\n  }\r\n  return null;\r\n}\r\n\r\nexport type HeroDefaultProps = {\r\n  fields: any;\r\n};\r\n\r\nconst HeroDefault: React.FC<HeroDefaultProps> = ({ fields = {} }) => {\r\n  const smallHeader = fields['SmallHeader']?.value === true;\r\n  return (\r\n    <Section componentName=\"HeroDefault\">\r\n      <Container>\r\n        <Row justify=\"center\">\r\n          <Col md={7}>\r\n            <Box paddingTop={{ _: 6, md: 8, lg: 10, xl: 12 }}>\r\n              <FieldChecker type=\"text\" field={fields['Label']}>\r\n                <Box textAlign=\"center\" marginBottom={5}>\r\n                  <LabelGrey field={fields['Label']} />\r\n                </Box>\r\n              </FieldChecker>\r\n              <FieldChecker type=\"text\" field={fields['Headline']}>\r\n                <Box textAlign=\"center\">\r\n                  <Typography type={smallHeader ? 'h2' : 'display'} as=\"h1\">\r\n                    <Text field={fields['Headline']} />\r\n                  </Typography>\r\n                </Box>\r\n              </FieldChecker>\r\n              <FieldChecker type=\"text\" field={fields['Description']}>\r\n                <Box textAlign=\"center\" marginTop={5}>\r\n                  <Typography type=\"manchetBig\">\r\n                    <Text field={fields['Description'] ?? {}} />\r\n                  </Typography>\r\n                </Box>\r\n              </FieldChecker>\r\n              <FieldChecker type=\"text\" field={fields['Rich Text Description']}>\r\n                <Box textAlign=\"center\" marginTop={5}>\r\n                  <Typography type=\"manchetBig\">\r\n                    <StyledRichText field={fields['Rich Text Description']} />\r\n                  </Typography>\r\n                </Box>\r\n              </FieldChecker>\r\n              {SelectSingleField(fields)}\r\n            </Box>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nconst StyledRichText = styled(RichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\nexport default HeroDefault;\r\n","import { Text, withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { BottomShadow, Box, Col, Container, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, LabelGrey, Section } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\n\r\nconst ColumnsBox = styled.div`\r\n  ${mediaQuery.ie11} {\r\n    min-height: 290px;\r\n  }\r\n  position: relative;\r\n  z-index: 1;\r\n  background: #fff;\r\n  border-radius: 5px;\r\n  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.15);\r\n  padding: 10px 20px;\r\n\r\n  ${mediaQuery.md} {\r\n    padding: 50px 20px;\r\n  }\r\n`;\r\n\r\nexport type HeroFrontpageProps = PlaceholderProps & {\r\n  fields: any;\r\n  columns: any;\r\n};\r\n\r\nconst HeroFrontpage: React.FC<HeroFrontpageProps> = ({ fields = {}, columns }) => {\r\n  const hasColumns = columns && columns.length > 0;\r\n  const isEditor = useIsEditor();\r\n  const showColumns = hasColumns || isEditor;\r\n\r\n  return (\r\n    <Section componentName=\"HeroFrontpage\">\r\n      <Box textAlign=\"center\" paddingTop={{ _: 6, md: 8, lg: 10, xl: 12 }}>\r\n        <Container>\r\n          <Row justify=\"center\">\r\n            <Col sm={10} md={7}>\r\n              <FieldChecker type=\"text\" field={fields['Label']}>\r\n                <Box marginBottom={5}>\r\n                  <LabelGrey field={fields['Label']} />\r\n                </Box>\r\n              </FieldChecker>\r\n\r\n              <FieldChecker type=\"text\" field={fields['Headline']}>\r\n                <Typography type=\"display\">\r\n                  <Text field={fields['Headline']} />\r\n                </Typography>\r\n              </FieldChecker>\r\n\r\n              <FieldChecker type=\"text\" field={fields['Description']}>\r\n                <Box marginTop={5}>\r\n                  <Typography type=\"manchetBig\">\r\n                    <Text field={fields['Description']} />\r\n                  </Typography>\r\n                </Box>\r\n              </FieldChecker>\r\n            </Col>\r\n          </Row>\r\n        </Container>\r\n      </Box>\r\n\r\n      {showColumns && (\r\n        <Box marginTop={{ _: 6, md: 8 }}>\r\n          <Container>\r\n            <BottomShadow>\r\n              <ColumnsBox>\r\n                <Row justify=\"center\">{columns}</Row>\r\n              </ColumnsBox>\r\n            </BottomShadow>\r\n          </Container>\r\n        </Box>\r\n      )}\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('columns')(HeroFrontpage);\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  Col,\r\n  Color,\r\n  linkAnimatedUnderlineStyle,\r\n  linkAnimatedUnderlineStyleHover,\r\n  mediaQuery,\r\n  RddkTheme,\r\n  Typography,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker } from '../../shared/components';\r\n\r\nconst ColumnLink = styled.a`\r\n  position: relative;\r\n  display: flex;\r\n  flex: 0 1 auto;\r\n  ${mediaQuery.ie11} {\r\n    flex: 0 0 auto;\r\n  }\r\n  flex-direction: row;\r\n  margin: 1px 0;\r\n  padding: 12px 0;\r\n  border-top: 3px solid #faf7f8;\r\n  border-bottom: 3px solid #faf7f8;\r\n  align-items: center;\r\n  text-decoration: none;\r\n\r\n  div:first-child > & {\r\n    border-top: 0;\r\n  }\r\n  div:last-child > & {\r\n    border-bottom: 0;\r\n  }\r\n\r\n  ${mediaQuery.md} {\r\n    padding: 0 10px;\r\n    flex-direction: column;\r\n    text-align: center;\r\n    border: 0;\r\n\r\n    ::before,\r\n    ::after {\r\n      content: '';\r\n      display: block;\r\n      position: absolute;\r\n      top: 0;\r\n      bottom: 0;\r\n      width: 3px;\r\n      background: #faf7f8;\r\n    }\r\n    ::before {\r\n      left: -10px;\r\n    }\r\n    ::after {\r\n      right: -10px;\r\n    }\r\n\r\n    div:first-child > &::before,\r\n    div:last-child > &::after {\r\n      display: none;\r\n    }\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    padding: 0 20px;\r\n  }\r\n`;\r\n\r\nconst Icon = styled.span`\r\n  width: 54px;\r\n  height: 54px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  background: #faf7f8;\r\n  border-radius: 50%;\r\n  transition: all 0.3s;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 64px;\r\n    height: 64px;\r\n\r\n    ${ColumnLink}:hover &,\r\n    ${ColumnLink}:focus & {\r\n      transform: translateY(-5px);\r\n    }\r\n  }\r\n`;\r\n\r\nconst ColumnText = styled.span`\r\n  display: block;\r\n  flex: 1 1 0%;\r\n  text-align: left;\r\n  margin: 0 0 0 12px;\r\n\r\n  ${mediaQuery.md} {\r\n    text-align: center;\r\n    margin: 20px 0 0;\r\n  }\r\n`;\r\n\r\nconst UnderLinedText = styled.span`\r\n  ${linkAnimatedUnderlineStyle()}\r\n\r\n  ${ColumnLink}:hover &,\r\n  ${ColumnLink}:focus & {\r\n    ${linkAnimatedUnderlineStyleHover}\r\n  }\r\n\r\n  display: none;\r\n  ${mediaQuery.md} {\r\n    display: inline-block;\r\n  }\r\n`;\r\n\r\ntype HeroFrontpageColumnItemProps = {\r\n  fields: any;\r\n};\r\n\r\nconst StyledText = styled.div`\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  font-size: 12px;\r\n  line-height: 1.08;\r\n  color: ${Color.rdBlackTint2};\r\n  margin: 3px 0 0;\r\n\r\n  ${mediaQuery.md} {\r\n    font-size: 14px;\r\n    line-height: 1.15;\r\n    margin: 0 0 16px;\r\n  }\r\n\r\n  ${mediaQuery.ie11} {\r\n    max-width: 60%;\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n    display: block;\r\n  }\r\n`;\r\n\r\nconst HeroFrontpageColumnItem: React.FC<HeroFrontpageColumnItemProps> = ({ fields = {} }) => {\r\n  return (\r\n    <Col md={3}>\r\n      <ColumnLink href={fields['Link']?.value} className=\"column\">\r\n        <FieldChecker type=\"image\" field={fields['Image']}>\r\n          <Icon>\r\n            <Image field={fields['Image']} width=\"30\" height=\"30\" />\r\n          </Icon>\r\n        </FieldChecker>\r\n        <ColumnText>\r\n          <FieldChecker type=\"text\" field={fields['Headline']}>\r\n            <Typography type=\"h7\" color=\"#000\">\r\n              <Text field={fields['Headline']} />\r\n            </Typography>\r\n          </FieldChecker>\r\n\r\n          <FieldChecker type=\"text\" field={fields['Text']}>\r\n            <StyledText>\r\n              <Text field={fields['Text']} />\r\n            </StyledText>\r\n          </FieldChecker>\r\n\r\n          <FieldChecker type=\"text\" field={fields['Link Text']}>\r\n            <UnderLinedText>\r\n              <Text field={fields['Link Text']} />\r\n            </UnderLinedText>\r\n          </FieldChecker>\r\n        </ColumnText>\r\n      </ColumnLink>\r\n    </Col>\r\n  );\r\n};\r\n\r\nexport default HeroFrontpageColumnItem;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, ButtonGroup, Col, Container, mediaQuery, Row, SlantedBackgroundImage, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { Button, FieldChecker, LabelGrey, Section } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst BgImage = styled(SlantedBackgroundImage)`\r\n  height: 300px;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 50%;\r\n    height: auto;\r\n    position: absolute !important;\r\n    z-index: 0;\r\n    top: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n  }\r\n`;\r\n\r\nexport type HeroProductProps = {\r\n  fields: any;\r\n};\r\n\r\nconst HeroProduct: React.FC<HeroProductProps> = ({ fields = {} }) => (\r\n  <Section componentName=\"HeroProduct\">\r\n    <Container>\r\n      <Row>\r\n        <Col md={5}>\r\n          <Box textAlign=\"center\" paddingTop={{ _: 6, md: 10, xl: 12 }} paddingBottom={{ _: 6, md: 10, xl: 12 }}>\r\n            <FieldChecker type=\"text\" field={fields['Label']}>\r\n              <Box marginBottom={5}>\r\n                <LabelGrey field={fields['Label']} />\r\n              </Box>\r\n            </FieldChecker>\r\n\r\n            <FieldChecker type=\"text\" field={fields['Headline']}>\r\n              <Typography type=\"h2\">\r\n                <Text field={fields['Headline']} />\r\n              </Typography>\r\n            </FieldChecker>\r\n\r\n            <FieldChecker type=\"text\" field={fields['Description']}>\r\n              <Box marginTop={5} marginBottom={6}>\r\n                <Typography type=\"manchetBig\">\r\n                  <Text field={fields['Description']} />\r\n                </Typography>\r\n              </Box>\r\n            </FieldChecker>\r\n\r\n            <ButtonGroup>\r\n              <FieldChecker type=\"link\" field={fields['Button Primary']}>\r\n                <Button field={fields['Button Primary']} />\r\n              </FieldChecker>\r\n              <FieldChecker type=\"link\" field={fields['Button Secondary']}>\r\n                <Button variant=\"secondary\" field={fields['Button Secondary']} />\r\n              </FieldChecker>\r\n            </ButtonGroup>\r\n          </Box>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n\r\n    <FieldChecker type=\"image\" field={fields['Image']}>\r\n      <BgImage src={imageScaler(fields['Image']?.value?.src)} slantPosition=\"left\" />\r\n    </FieldChecker>\r\n  </Section>\r\n);\r\n\r\nexport default HeroProduct;\r\n","import styled from 'styled-components';\r\n\r\nconst EmptyOutline = styled.div`\r\n  padding: 10px;\r\n  color: #b0b0b0;\r\n  border: 1px dotted #c0c0c0;\r\n  position: relative;\r\n`;\r\n\r\nconst MinHeight = styled.div`\r\n  min-height: 45px;\r\n`;\r\n\r\nexport const EditorWrapper = {\r\n  EmptyOutline,\r\n  MinHeight,\r\n};\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport * as React from 'react';\r\nimport { EditorWrapper } from '../../shared/components/Editor/EditorWrapper';\r\nimport { useIsEditor } from '../../shared/hooks';\r\n\r\nexport type HtmlRendererProps = {\r\n  fields: any;\r\n};\r\n\r\nconst HtmlRenderer: React.FC<HtmlRendererProps> = ({ fields = {} }) => {\r\n  const htmlField = fields['HTML'];\r\n  const renderedHtmlField = <Text field={htmlField} encode={false} editable={false} />;\r\n\r\n  if (useIsEditor()) {\r\n    const strippedHtml = htmlField.value\r\n      .replace(/<script([\\S\\s]*?)>([\\S\\s]*?)<\\/script>/gi, '')\r\n      .replace(/<style([\\S\\s]*?)>([\\S\\s]*?)<\\/style>/gi, '');\r\n\r\n    return strippedHtml !== '' ? (\r\n      <EditorWrapper.MinHeight>{renderedHtmlField}</EditorWrapper.MinHeight>\r\n    ) : (\r\n      <EditorWrapper.EmptyOutline>\r\n        HTML Renderer\r\n        {renderedHtmlField}\r\n      </EditorWrapper.EmptyOutline>\r\n    );\r\n  } else {\r\n    return <>{renderedHtmlField}</>;\r\n  }\r\n};\r\n\r\nexport default HtmlRenderer;\r\n","import { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { applyTextType, Box, Col, Container, mediaQuery, RddkTheme, Row } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, Section } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst IMAGE_SIZE_LARGE = 700;\r\nconst IMAGE_SIZE_SMALL = 450;\r\n\r\nexport type ImageHeaderProps = {\r\n  fields: any;\r\n};\r\n\r\nconst ImageHeader: React.FC<ImageHeaderProps> = ({ fields = {} }) => {\r\n  const imageSize = fields['Large Image']?.value === true ? IMAGE_SIZE_LARGE : IMAGE_SIZE_SMALL;\r\n\r\n  return (\r\n    <Section componentName=\"ImageHeader\">\r\n      <FieldChecker type=\"image\" field={fields['Image']}>\r\n        <Box\r\n          height={{\r\n            _: 220,\r\n            md: imageSize * 0.55,\r\n            xl: imageSize * 0.7,\r\n          }}\r\n        >\r\n          <CoverImage\r\n            height={{\r\n              _: 290,\r\n              md: imageSize * 0.75,\r\n              xl: imageSize,\r\n            }}\r\n            backgroundImage={imageScaler(fields['Image']?.value?.src)}\r\n          />\r\n        </Box>\r\n      </FieldChecker>\r\n\r\n      <TextContainer>\r\n        <Row>\r\n          <Col>\r\n            <TextOverlayBox\r\n              minHeight={{\r\n                _: 290 - 220,\r\n                md: imageSize * 0.75 - imageSize * 0.55,\r\n                xl: imageSize - imageSize * 0.7,\r\n              }}\r\n              paddingTop={{\r\n                _: 6,\r\n                md: 7,\r\n                xl: 9,\r\n              }}\r\n            >\r\n              <FieldChecker type=\"text\" field={fields['Label']}>\r\n                <Label marginBottom={5}>\r\n                  <Text field={fields['Label']} />\r\n                </Label>\r\n              </FieldChecker>\r\n\r\n              <FieldChecker type=\"text\" field={fields['Text']}>\r\n                <RichText field={fields['Text']} />\r\n              </FieldChecker>\r\n            </TextOverlayBox>\r\n          </Col>\r\n        </Row>\r\n      </TextContainer>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default ImageHeader;\r\n\r\nconst CoverImage = styled(Box)<{ backgroundImage?: string }>`\r\n  background-image: url(${(props) => props.backgroundImage});\r\n  background-position: center;\r\n  background-size: cover;\r\n`;\r\n\r\nconst TextContainer = styled(Container)`\r\n  ${mediaQuery.smDown} {\r\n    padding-left: 0px !important;\r\n    padding-right: 0px !important;\r\n  }\r\n`;\r\n\r\nconst TextOverlayBox = styled(Box)`\r\n  text-align: center;\r\n  padding-left: 15px;\r\n  padding-right: 15px;\r\n  background: #fff;\r\n  border-radius: 10px 10px 0 0;\r\n\r\n  h1,\r\n  h2,\r\n  h3 {\r\n    margin: 0;\r\n    ${applyTextType('h2')}\r\n  }\r\n\r\n  p {\r\n    ${applyTextType('manchetBig')}\r\n    color: ${RddkTheme.colors.grey90};\r\n  }\r\n\r\n  a {\r\n    color: ${RddkTheme.colors.red40};\r\n  }\r\n`;\r\n\r\nconst Label = styled(Box)`\r\n  display: inline-block;\r\n  border-radius: 3px;\r\n  padding: 7px 17px 6px 18px;\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  line-height: 1.25;\r\n  letter-spacing: 0.8px;\r\n  text-align: center;\r\n  border: solid 2px ${RddkTheme.colors.grey90};\r\n`;\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { mediaQuery, SlantedOverlay, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, Section } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst Wrapper = styled.div`\r\n  width: 95%;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 104%;\r\n  }\r\n`;\r\n\r\nconst ImageMaxHeightContainer = styled.div`\r\n  overflow: hidden;\r\n  max-height: 600px;\r\n`;\r\n\r\nconst ImageBlock = styled(Image)`\r\n  display: block;\r\n  max-width: 100%;\r\n  height: auto;\r\n`;\r\n\r\nconst Description = styled.div`\r\n  text-align: right;\r\n  padding-top: 15px;\r\n  padding-right: 18%;\r\n  padding-left: 15px;\r\n\r\n  ${mediaQuery.md} {\r\n    padding-right: 16%;\r\n  }\r\n\r\n  ${mediaQuery.xl} {\r\n    padding-top: 20px;\r\n    padding-right: 12%;\r\n  }\r\n`;\r\n\r\nexport type ImageLeftProps = {\r\n  fields: any;\r\n};\r\n\r\nconst ImageLeft: React.FC<ImageLeftProps> = ({ fields = {} }) => (\r\n  <Section componentName=\"ImageLeft\" margin=\"large\">\r\n    <Wrapper>\r\n      <SlantedOverlay slantPosition=\"right\">\r\n        <ImageMaxHeightContainer>\r\n          <ImageBlock field={imageScaler(fields['Image'])} />\r\n        </ImageMaxHeightContainer>\r\n\r\n        <FieldChecker type=\"text\" field={fields['Description']}>\r\n          <Description>\r\n            <Typography type=\"image\">\r\n              <Text field={fields['Description']} />\r\n            </Typography>\r\n          </Description>\r\n        </FieldChecker>\r\n      </SlantedOverlay>\r\n    </Wrapper>\r\n  </Section>\r\n);\r\n\r\nexport default ImageLeft;\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { mediaQuery, SlantedOverlay, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, Section } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst Wrapper = styled.div`\r\n  width: 95%;\r\n  margin-left: 5%;\r\n`;\r\n\r\nconst ImageMaxHeightContainer = styled.div`\r\n  overflow: hidden;\r\n  max-height: 600px;\r\n`;\r\n\r\nconst ImageBlock = styled(Image)`\r\n  display: block;\r\n  max-width: 100%;\r\n  height: auto;\r\n`;\r\n\r\nconst Description = styled.div`\r\n  padding: 20px 15px 0 30px;\r\n\r\n  ${mediaQuery.md} {\r\n    padding-top: 20px;\r\n  }\r\n`;\r\n\r\nexport type ImageRightProps = {\r\n  fields: any;\r\n};\r\n\r\nconst ImageRight: React.FC<ImageRightProps> = ({ fields = {} }) => (\r\n  <Section componentName=\"ImageRight\" margin=\"large\">\r\n    <Wrapper>\r\n      <SlantedOverlay slantPosition=\"left\">\r\n        <ImageMaxHeightContainer>\r\n          <ImageBlock field={imageScaler(fields['Image'])} />\r\n        </ImageMaxHeightContainer>\r\n\r\n        <FieldChecker type=\"text\" field={fields['Description']}>\r\n          <Description>\r\n            <Typography type=\"image\">\r\n              <Text field={fields['Description']} />\r\n            </Typography>\r\n          </Description>\r\n        </FieldChecker>\r\n      </SlantedOverlay>\r\n    </Wrapper>\r\n  </Section>\r\n);\r\n\r\nexport default ImageRight;\r\n","/**\r\n * The minimum number of loans in the table. User can only remove loans when more than this number.\r\n */\r\nexport const MINIMUN_AMOUNT_OF_LOANS = 1;\r\n/**\r\n * The maximum number of loans on mobile view.\r\n */\r\nexport const MAX_LOANS_MOBILE = 2;\r\n/**\r\n * The maximum number of loans on desktop view.\r\n */\r\nexport const MAX_LOANS_DESKTOP = 3;\r\n/**\r\n * The width of the label column on desktop\r\n */\r\nexport const DESKTOP_LABEL_COLUMN_WIDTH = 300;\r\n/**\r\n * The min-width of the loan columns on desktop\r\n */\r\nexport const DESKTOP_LOAN_COLUMNS_MIN_WIDTH = 200;\r\n/**\r\n * The delay for new calculations when changing input values.\r\n */\r\nexport const CALCULATION_DELAY_INPUT = 2000;\r\n/**\r\n * The delay for new calculations when changing slider values.\r\n */\r\nexport const CALCULATION_DELAY_SLIDER = 600;\r\n/**\r\n * The delay for new calculations when changing dropdown values.\r\n */\r\nexport const CALCULATION_DELAY_DROPDOWN = 100;\r\n/**\r\n * LTV used for validating the inputs\r\n */\r\nexport const MINIMUM_LTV = 0.75;\r\n/**\r\n * The minimum loan amount\r\n */\r\nexport const LOAN_AMOUNT_MINIMUM = 100000;\r\n/**\r\n * The maximum loan amount\r\n */\r\nexport const LOAN_AMOUNT_MAXIMUM = 1000000000;\r\n/**\r\n * The HTML ID of inputs submit button\r\n */\r\nexport const HTML_ID_SUBMIT_BUTTON = 'calculator-submit-button';\r\n/**\r\n * The HTML ID of scroll-to area\r\n */\r\nexport const HTML_ID_SCROLLTO_AREA = 'calculator-scrollto-area';\r\n/**\r\n * The local demo data for API calls is used if API Endpoint URL is set to this value\r\n */\r\nexport const API_LOCAL_VALUE = 'local';\r\n/**\r\n * Key for query parameter to set loan types\r\n */\r\nexport const QUERY_KEY_LOANS = 'loan';\r\n/**\r\n * Key for query parameter to set property type\r\n */\r\nexport const QUERY_KEY_PROPERTY_TYPE = 'type';\r\n/**\r\n * Key for query parameter to set owner category\r\n */\r\nexport const QUERY_KEY_OWNER_CATEGORY = 'owner';\r\n/**\r\n * Key for query parameter to set property type\r\n */\r\nexport const QUERY_KEY_PROPERTY_VALUE = 'price';\r\n/**\r\n * Key for query parameter to set own payment\r\n */\r\nexport const QUERY_KEY_OWN_PAYMENT = 'payment';\r\n/**\r\n * The char to use as thousand separator when formatting\r\n */\r\nexport const FORMATTING_THOUSAND_SEPATOR = '.';\r\n/**\r\n * The char to use as decimal separator when formatting\r\n */\r\nexport const FORMATTING_DECIMAL_SEPATOR = ',';\r\n/**\r\n * The field keys of table 1 \"Realkredit\"\r\n */\r\nexport const TABLE_FIELDKEYS_REALKREDIT_1 = [\r\n  'bankloan',\r\n  'ownpayment',\r\n  'remainingDebt',\r\n  'netProceedsAmountTop',\r\n  'firstYearInterestOnlyMonthlyPaymentTop',\r\n  'firstYearInstalmentMonthlyPaymentGrossTop',\r\n  'monthlyPaymentWithOutInstallment',\r\n  'monthlyPaymentWithInstallment',\r\n  'businessMonthlyPaymentWithOutInstallment',\r\n  'businessMonthlyPaymentWithInstallment',\r\n  'maturityTop',\r\n  'interestOnlyYearsStart',\r\n  'interestOnlyYearsEnd',\r\n  'rateType',\r\n  'refinancingFrequency',\r\n  'calculatedDebtAtExpiry',\r\n  'loanToValuePercentage',\r\n  'taxRate',\r\n  'paymentsPerYear',\r\n];\r\n/**\r\n * The field keys of table 2 \"Realkredit\"\r\n */\r\nexport const TABLE_FIELDKEYS_REALKREDIT_2 = [\r\n  'loanProvider',\r\n  'netProceedsAmount',\r\n  'principalAmount',\r\n  'maturityBottom',\r\n  'monthlyGrossPaymentYearOneBottom',\r\n  'numberOfPayments',\r\n  'debtorInterestRate',\r\n  'weightedBondPrice',\r\n  'annualPercentageRate',\r\n  'totalAdministrationFee',\r\n  'totalRepaymentAmount',\r\n  'propertyDepositDisclaimer',\r\n] as const;\r\n/**\r\n * The field keys of table \"Banklaan\"\r\n */\r\nexport const TABLE_FIELDKEYS_BANKLOAN = ['dummy1', 'dummy2'] as const;\r\n/**\r\n * The field keys of table \"Samlet\"\r\n */\r\nexport const TABLE_FIELDKEYS_OVERVIEW = ['monthlyGrossPaymentYearOneTop', 'dummy1', 'dummy2'] as const;\r\n\r\nexport const CITY_COMMERCIAL = 'CityCommercial';\r\n","export const getQueryString = (key: string): string => {\r\n  if (typeof window !== 'undefined') {\r\n    return new URLSearchParams(window.location?.search || '').get(key) || '';\r\n  }\r\n  return '';\r\n};\r\n\r\nexport const getQueryFloatOrNull = (key: string): number | null => {\r\n  return parseFloat(getQueryString(key)) || null;\r\n};\r\n","import { useState } from 'react';\r\nimport { useBetween } from 'use-between';\r\nimport {\r\n  QUERY_KEY_LOANS,\r\n  QUERY_KEY_OWNER_CATEGORY,\r\n  QUERY_KEY_OWN_PAYMENT,\r\n  QUERY_KEY_PROPERTY_TYPE,\r\n  QUERY_KEY_PROPERTY_VALUE,\r\n  TABLE_FIELDKEYS_REALKREDIT_1,\r\n  TABLE_FIELDKEYS_REALKREDIT_2,\r\n} from '../config';\r\nimport { getQueryFloatOrNull, getQueryString } from '../helpers/query';\r\nimport { LoanStateItem } from '../types/LoanStateItem';\r\nimport { ViewType } from '../types/ViewType';\r\n\r\nconst useInputsStateFn = () => {\r\n  const [loanType, setLoanType] = useState(getQueryString(QUERY_KEY_LOANS));\r\n  const [propertyType, setPropertyType] = useState(getQueryString(QUERY_KEY_PROPERTY_TYPE));\r\n  const [ownerCategory, setOwnerCategory] = useState(getQueryString(QUERY_KEY_OWNER_CATEGORY));\r\n  const [propertyValue, setPropertyValue] = useState<number | null>(getQueryFloatOrNull(QUERY_KEY_PROPERTY_VALUE));\r\n  const [ownPayment, setOwnPayment] = useState<number | null>(getQueryFloatOrNull(QUERY_KEY_OWN_PAYMENT));\r\n  const [viewType, setViewType] = useState<ViewType>('realkredit');\r\n  const [showModal, setShowModal] = useState(false);\r\n  const [activeLoan, setActiveLoan] = useState<null | LoanStateItem>(null);\r\n  const [selectedLoan, setSelectedLoan] = useState<any>('');\r\n  const [propertyCategory, setPropertyCategory] = useState<any>('');\r\n  const [ownPaymentVisible, setOwnPaymentVisible] = useState(true);\r\n  const [tableFieldSet1Keys, setTableFieldSet1Keys] = useState<any>(TABLE_FIELDKEYS_REALKREDIT_1);\r\n  const [tableFieldSet2Keys, setTableFieldSet2Keys] = useState<any>(TABLE_FIELDKEYS_REALKREDIT_2);\r\n  const [wantedLoanAmount, setWantedLoanAmount] = useState<number | null>(null);\r\n  const [remainingDebt, setRemainingDebt] = useState<number | null>(null);\r\n  const [hasError, setError] = useState(false);\r\n  const [submitCounter, setSubmitCounter] = useState(0);\r\n  const [recalculate, setRecalculate] = useState(false);\r\n  const [loanChanged, setLoanChanged] = useState(false);\r\n\r\n  return {\r\n    loanType,\r\n    propertyType,\r\n    ownerCategory,\r\n    propertyValue,\r\n    wantedLoanAmount,\r\n    ownPayment,\r\n    viewType,\r\n    showModal,\r\n    activeLoan,\r\n    selectedLoan,\r\n    loanChanged,\r\n    propertyCategory,\r\n    ownPaymentVisible,\r\n    tableFieldSet1Keys,\r\n    tableFieldSet2Keys,\r\n    remainingDebt,\r\n    hasError,\r\n    submitCounter,\r\n    recalculate,\r\n    setRecalculate,\r\n    setLoanChanged,\r\n    setSubmitCounter,\r\n    setError,\r\n    setLoanType,\r\n    setPropertyType,\r\n    setOwnerCategory,\r\n    setPropertyValue,\r\n    setWantedLoanAmount,\r\n    setOwnPayment,\r\n    setRemainingDebt,\r\n    setViewType,\r\n    setShowModal,\r\n    setActiveLoan,\r\n    setSelectedLoan,\r\n    setPropertyCategory,\r\n    setOwnPaymentVisible,\r\n    setTableFieldSet1Keys,\r\n    setTableFieldSet2Keys,\r\n  };\r\n};\r\n\r\nexport const useInputsState = () => useBetween(useInputsStateFn);\r\n","/**\r\n * Use this function to simulate an async request.\r\n * Example: await sleep(500);\r\n * @param ms The number of milliseconds to wait\r\n * @returns void\r\n */\r\nexport const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\r\n","import { AmortisationDataYear } from '../types/AmortisationData';\r\n\r\nexport function mapAmortisationData(array: any[]): AmortisationDataYear[] {\r\n  // First we will get all the years from the array data\r\n  const years = array.reduce((result: string[], item: any) => {\r\n    // Get the year from termDate (first 4 chars)\r\n    const year = item.termDate.substr(0, 4);\r\n\r\n    // If year is not in array, then add it\r\n    if (!result.find((i) => i === year)) {\r\n      return [...result, year];\r\n    }\r\n\r\n    return result;\r\n  }, []);\r\n\r\n  // Now we iterate through the years and construct our array of amortisation data years\r\n  return years.map((year: string) => {\r\n    // Filter all the months for this year and map the data correctly\r\n    const months = array\r\n      .filter((i) => i.termDate.startsWith(year))\r\n      .map((item) => {\r\n        return {\r\n          month: item.termDate,\r\n          data: {\r\n            grossPayment: parseFloat(item.grossPayment),\r\n            netPayment: parseFloat(item.netPayment),\r\n            instalment: parseFloat(item.instalment),\r\n            interest: parseFloat(item.interest),\r\n            administrationFeeAmount: parseFloat(item.administrationFeeAmount),\r\n            bondDebt: parseFloat(item.bondDebt),\r\n            cashDebt: parseFloat(item.cashDebt),\r\n          },\r\n        };\r\n      });\r\n\r\n    // Construct the year object and sum up the data\r\n    const item: AmortisationDataYear = {\r\n      year,\r\n      data: {\r\n        grossPayment: months.reduce((result, item) => result + item.data.grossPayment, 0),\r\n        netPayment: months.reduce((result, item) => result + item.data.netPayment, 0),\r\n        instalment: months.reduce((result, item) => result + item.data.instalment, 0),\r\n        interest: months.reduce((result, item) => result + item.data.interest, 0),\r\n        administrationFeeAmount: months.reduce((result, item) => result + item.data.administrationFeeAmount, 0),\r\n        bondDebt: months.reduce((result, item) => result + item.data.bondDebt, 0),\r\n        cashDebt: months.reduce((result, item) => result + item.data.cashDebt, 0),\r\n      },\r\n      months,\r\n    };\r\n\r\n    return item;\r\n  });\r\n}\r\n","import { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n\r\n  if (ltv > settings.maxLTV * 0.9) {\r\n    payload.basic.wantedAdditionalAmount = 0;\r\n    payload.basic.calculationType = 'Maximum';\r\n  } else {\r\n    payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.maturity.years >= settings?.businessCommercialMaturity\r\n    ) {\r\n      payload.product.maturity.years = settings.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  // TODO: if needed, update payload, if not delete this file\r\n\r\n  return loan;\r\n}\r\n","/**\r\n * Shared function to call the API endpoint that calculates the loans.\r\n * @param apiUrl The API endpoint URL\r\n * @param payload The payload to send to the API\r\n */\r\nexport async function callApi(apiUrl: string, payload: any) {\r\n  try {\r\n    const response = await fetch(apiUrl, {\r\n      method: 'POST',\r\n      mode: 'cors',\r\n      headers: {\r\n        Accept: 'application/json',\r\n        'Content-Type': 'application/json',\r\n      },\r\n      body: JSON.stringify(payload),\r\n    });\r\n\r\n    if (!response.ok) {\r\n      console.warn('Error in callApi: response is NOT ok');\r\n      return false;\r\n    }\r\n\r\n    const { data, Errors } = await response.json();\r\n\r\n    if (Errors) {\r\n      console.log('Business validation error from calculation api:');\r\n      console.table(Errors);\r\n    }\r\n\r\n    if (data) {\r\n      return data;\r\n    }\r\n\r\n    return false;\r\n  } catch (error) {\r\n    console.error('Error in LoanCalculator callApi:', error);\r\n    return false;\r\n  }\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './cibor6ResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import { CalculatorInputs } from '../../types/CalculatorInputs';\r\n\r\nexport interface Cibor6Response {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  interestOnlyYearsStart: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInterestOnlyMonthlyPayment: number;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearWithOutInstalmentMonthlyPaymentNet: number;\r\n  firstYearInstalmentMonthlyPaymentNet: number;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs): Cibor6Response {\r\n  const monthlyGrossPaymentYearOne = parseFloat(data.payment?.monthlyGrossPaymentYearOne) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = parseFloat(data.payment?.monthlyNetPaymentYearOne) || 0; // 1 års månedlig ydelse efter skat\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = data.interestRate?.rateType === 'Variable' ? 'Variabel rente' : 'Fast rente'; //Rentetype\r\n\r\n  const interestOnlyYearsStart =\r\n    parseInt(data.interestOnly?.interestOnlyYears) + (parseInt(data.interestOnly?.interestOnlyMonths) > 0 ? 1 : 0) || 0; //Afdragsfrihed år\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 80 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  // TODO: tjek at det her er \"Udbetalt kreditbeløb\"\r\n  const netProceedsAmount = parseFloat(data.loanKeyFigures?.netProceedsAmount) || 0; // Udbetalt kreditbeløb\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  //Find first term with installment payment if interest only is chosen\r\n  let firstYearInterestOnlyMonthlyPayment = 0;\r\n  let firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n\r\n  let firstYearWithOutInstalmentMonthlyPaymentNet = 0;\r\n  let firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n  if (data.interestOnly?.isInterestOnlyOption && parseInt(data.interestOnly?.interestOnlyYears) > 0) {\r\n    const instalmentTerms = data.amortisation.cashFlow.filter(\r\n      (term) => !isNaN(parseFloat(term.instalment)) && parseFloat(term.instalment) !== 0\r\n    );\r\n    firstYearInterestOnlyMonthlyPayment = monthlyGrossPaymentYearOne;\r\n    firstYearWithOutInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n    let firstYearOfInstalmentPayment = 0;\r\n    let firstYearOfInstalmentPaymentNet = 0;\r\n    for (let x = 0; x < 12; x++) {\r\n      firstYearOfInstalmentPayment = firstYearOfInstalmentPayment + parseFloat(instalmentTerms[x].grossPayment);\r\n      firstYearOfInstalmentPaymentNet = firstYearOfInstalmentPaymentNet + parseFloat(instalmentTerms[x].netPayment);\r\n    }\r\n    firstYearInstalmentMonthlyPaymentGross = firstYearOfInstalmentPayment / 12;\r\n    firstYearInstalmentMonthlyPaymentNet = firstYearOfInstalmentPaymentNet / 12;\r\n  }\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    interestOnlyYearsStart,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    firstYearInterestOnlyMonthlyPayment,\r\n    firstYearWithOutInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","/**\r\n * The char to use as thousand separator when formatting\r\n */\r\nexport const FORMATTING_THOUSAND_SEPATOR = '.';\r\n/**\r\n * The char to use as decimal separator when formatting\r\n */\r\nexport const FORMATTING_DECIMAL_SEPATOR = ',';\r\n/**\r\n * The field keys of table 1 \"Realkredit\"\r\n */\r\n\r\n/**\r\n * Format a number to Danish currency format (without DKK symbol)\r\n * @param value The number to format\r\n * @param decimals Amount of decimals (default is 0)\r\n * @param trailingZeros Boolean (true / false). default is false. Need trailing zeros, to maintain uniformity in the presentation\r\n */\r\nexport const formatAsCurrency = (value: number, decimals = 0, trailingZeros = false): string => {\r\n  return (trailingZeros\r\n    ? new Intl.NumberFormat('da-DK', { minimumFractionDigits: decimals })\r\n    : new Intl.NumberFormat('da-DK', { maximumFractionDigits: decimals })\r\n  )\r\n    .formatToParts(value)\r\n    .map((p) => {\r\n      if (p.type === 'group') return FORMATTING_THOUSAND_SEPATOR;\r\n      if (p.type === 'decimal') return FORMATTING_DECIMAL_SEPATOR;\r\n      return p.value;\r\n    })\r\n    .join('');\r\n};\r\n","import { useState } from 'react';\r\nimport { useBetween } from 'use-between';\r\n\r\nconst useSettingsStateFn = () => {\r\n  const [settings, setSettings] = useState<any>({});\r\n  const [apiUrl, setApiUrl] = useState('');\r\n\r\n  return {\r\n    settings,\r\n    apiUrl,\r\n    setSettings,\r\n    setApiUrl,\r\n  };\r\n};\r\n\r\nexport const useSettingsState = () => useBetween(useSettingsStateFn);\r\n","import * as React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype CalculatorTooltipTableProps = {\r\n  title: string;\r\n  rows: {\r\n    label: string | any;\r\n    value: string | number;\r\n    suffix: string;\r\n  }[];\r\n};\r\n\r\nexport const CalculatorTooltipTable: React.FC<CalculatorTooltipTableProps> = ({ title, rows }) => {\r\n  return (\r\n    <>\r\n      <strong>{title}</strong>\r\n      <hr />\r\n      <Table>\r\n        <tbody>\r\n          {rows.map((data, index) => {\r\n            return (\r\n              <tr key={index}>\r\n                <td>{data.label}</td>\r\n                <td>\r\n                  <strong>{data.value + data.suffix}</strong>\r\n                </td>\r\n              </tr>\r\n            );\r\n          })}\r\n        </tbody>\r\n      </Table>\r\n    </>\r\n  );\r\n};\r\n\r\nconst Table = styled.table`\r\n  width: 300px;\r\n  border: none;\r\n  padding: 0;\r\n  margin: 0;\r\n  table-layout: auto !important;\r\n\r\n  td {\r\n    position: relative;\r\n    color: #212121;\r\n    vertical-align: top;\r\n    text-align: left;\r\n    border: none;\r\n    padding: 5px 0;\r\n    white-space: nowrap;\r\n\r\n    :last-child {\r\n      text-align: right;\r\n    }\r\n  }\r\n`;\r\n","import { Cell, DynamicTable, Icons, IconWrapper, Tooltip } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { useSettingsState } from '../../state/settingsState';\r\nimport { CalculatorTooltipTable } from './CalculatorTooltipTable';\r\n\r\ntype CalculatorTooltipAdministrationFeeProps = {\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  originationFeeAmount: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  isFromOverlay?: boolean;\r\n  totalAdministrationFee: number;\r\n};\r\n\r\nexport const CalculatorTooltipAdministrationFee: React.FC<CalculatorTooltipAdministrationFeeProps> = (props) => {\r\n  const { t } = useTranslation();\r\n  const { settings } = useSettingsState();\r\n  const isPrivateCalculator = settings.calculatorType === 'Private loan';\r\n  const calculatorTooltipDetails = [\r\n    {\r\n      label: t('calculator-row-totalInterest-label'),\r\n      value: formatAsCurrency(props.totalInterest),\r\n      suffix: ' kr.',\r\n    },\r\n    {\r\n      label: t('calculator-row-paymentTotalAdministrationFee-label'),\r\n      value: formatAsCurrency(props.paymentTotalAdministrationFee),\r\n      suffix: ' kr.',\r\n    },\r\n    {\r\n      label: t('calculator-row-settlementFeeAmount-label'),\r\n      value: formatAsCurrency(props.settlementFeeAmount),\r\n      suffix: ' kr.',\r\n    },\r\n    {\r\n      label: t('calculator-row-loanCaseFee-label'),\r\n      value: formatAsCurrency(props.loanCaseFee),\r\n      suffix: ' kr.',\r\n    },\r\n    {\r\n      label: t('calculator-row-registrationHandlingFee-label'),\r\n      value: formatAsCurrency(props.registrationHandlingFee),\r\n      suffix: ' kr.',\r\n    },\r\n    isPrivateCalculator\r\n      ? {\r\n          label: (\r\n            <>\r\n              {t('calculator-row-variableRegistrationFee-label')}\r\n              {'     '}\r\n              <Tooltip\r\n                element={\r\n                  <IconWrapper size=\"24\" color=\"Action\">\r\n                    <Icons.Action.Question />\r\n                  </IconWrapper>\r\n                }\r\n                content={t('calculator-row-variableRegistrationFee-help')}\r\n              />\r\n            </>\r\n          ),\r\n          value: formatAsCurrency(props.variableRegistrationFee),\r\n          suffix: ' kr.',\r\n        }\r\n      : {\r\n          label: t('calculator-row-variableRegistrationFee-label'),\r\n          value: formatAsCurrency(props.variableRegistrationFee),\r\n          suffix: ' kr.',\r\n        },\r\n    {\r\n      label: t('calculator-row-fixedRegistrationFee-label'),\r\n      value: formatAsCurrency(props.fixedRegistrationFee),\r\n      suffix: ' kr.',\r\n    },\r\n  ];\r\n  if (props.originationFeeAmount) {\r\n    const feeAmount = {\r\n      label: t('calculator-row-originationFeeAmount-label'),\r\n      value: formatAsCurrency(props.originationFeeAmount),\r\n      suffix: ' kr.',\r\n    };\r\n    calculatorTooltipDetails.splice(4, 0, feeAmount);\r\n  }\r\n\r\n  if (props.isFromOverlay) {\r\n    const totalCost = {\r\n      label: t('calculator-row-totalAdministrationFee-label'),\r\n      value: formatAsCurrency(props.totalAdministrationFee),\r\n      suffix: ' kr.',\r\n    };\r\n    calculatorTooltipDetails.push(totalCost);\r\n  }\r\n\r\n  const costTable = React.useMemo(() => {\r\n    const rows: Cell[][] = [];\r\n    let tableHeader = [\r\n      {\r\n        value: 'Omkostning',\r\n        minWidth: 110,\r\n        width: 200,\r\n      },\r\n      {\r\n        value: 'Beløb',\r\n        minWidth: 150,\r\n      },\r\n    ];\r\n    rows.push(tableHeader);\r\n\r\n    calculatorTooltipDetails.forEach((row) => {\r\n      let rowData = [\r\n        {\r\n          value: <LabelColumn>{row.label}</LabelColumn>,\r\n          width: 200,\r\n        },\r\n        {\r\n          value:\r\n            row.label !== 'Omkostninger' ? (\r\n              <Column>\r\n                {row.value}\r\n                {row.suffix}\r\n              </Column>\r\n            ) : (\r\n              <LabelColumn>\r\n                {row.value}\r\n                {row.suffix}\r\n              </LabelColumn>\r\n            ),\r\n          width: 200,\r\n        },\r\n      ];\r\n      rows.push(rowData);\r\n    });\r\n    return rows;\r\n  }, [calculatorTooltipDetails]);\r\n\r\n  if (props.isFromOverlay) {\r\n    return <DynamicTable bordered data={costTable} firstRowIsHead striped />;\r\n  } else {\r\n    return <CalculatorTooltipTable title={'De samlede omkostninger består af'} rows={calculatorTooltipDetails} />;\r\n  }\r\n};\r\n\r\nconst LabelColumn = styled.span`\r\n  display: inline-block;\r\n  font-weight: bold;\r\n  margin-right: 8px;\r\n`;\r\n\r\nconst Column = styled.span`\r\n  display: inline-block;\r\n  margin-right: 8px;\r\n`;\r\n","import i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { Cibor6Response } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: Cibor6Response,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n\r\n  // Table: Fastforrentet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmountTop',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross * 12)\r\n      : formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment > 0) {\r\n    items.push({\r\n      fieldKey: 'firstYearInterestOnlyMonthlyPaymentTop',\r\n      inputType: 'static',\r\n      value: inputs.wantedLoanAmount\r\n        ? formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment * 12)\r\n        : formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'slider',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n    min: response.firstYearInterestOnlyMonthlyPayment > 0 ? 15 : 10,\r\n    max: maturityYears,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.maturity.years = value;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'interestOnlyYearsStart',\r\n    inputType: 'slider',\r\n    value: response.interestOnlyYearsStart,\r\n    min: 0,\r\n    max: 10,\r\n    suffix: ' år',\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.interestOnly.years = value;\r\n      payload.product.interestOnly.wantInterestOnlyCoupon = value > 0 ? true : false;\r\n\r\n      if (payload.product.interestOnly.years > 0) {\r\n        payload.product.maturity.years = Math.max(payload.product.maturity.years, 15);\r\n      }\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'static',\r\n    value: response.rateType,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n    suffix: ' mdr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${response.rateType}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n    tooltip: false,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.paymentsPerYear = parseInt(value);\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const cibor6: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  const apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to Cibor6Response object\r\n  const mappedData = mapResponse(apiResponse, inputs);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, loan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  // Set values\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n\r\n  if (!settings.modifiedNetProceeds) {\r\n    if (ltv > settings.maxLTV * 0.9) {\r\n      payload.basic.wantedAdditionalAmount = 0;\r\n      payload.basic.calculationType = 'Maximum';\r\n    } else {\r\n      payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n      payload.basic.calculationType = 'Proceeds';\r\n    }\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.maturity.years >= settings?.businessCommercialMaturity\r\n    ) {\r\n      payload.product.maturity.years = settings.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  //used for lending calculator\r\n  if (inputs.remainingDebt) {\r\n    payload.basic.remainingDebt = inputs.remainingDebt;\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  // TODO: if needed, update payload, if not delete this file\r\n\r\n  return loan;\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './flexkortResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData.data;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import { CalculatorInputs } from '../../types/CalculatorInputs';\r\n\r\nexport interface FlexkortResponse {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  refinancingFrequency: number;\r\n  interestOnlyYearsStart: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInterestOnlyMonthlyPayment: number;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearWithOutInstalmentMonthlyPaymentNet: number;\r\n  firstYearInstalmentMonthlyPaymentNet: number;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs): FlexkortResponse {\r\n  const monthlyGrossPaymentYearOne = parseFloat(data.payment?.monthlyGrossPaymentYearOne) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = parseFloat(data.payment?.monthlyNetPaymentYearOne) || 0; // 1 års månedlig ydelse efter skat\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = 'Variabel rente'; //Rentetype\r\n\r\n  const refinancingFrequency = parseInt(data.refinancing?.refinancingFrequency) || 1; //Periode Hvor Renten Bindes i år\r\n\r\n  const interestOnlyYearsStart =\r\n    parseInt(data.interestOnly?.interestOnlyYears) + (parseInt(data.interestOnly?.interestOnlyMonths) > 0 ? 1 : 0) || 0; //Afdragsfrihed år\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 80 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  // TODO: tjek at det her er \"Udbetalt kreditbeløb\"\r\n  const netProceedsAmount = parseFloat(data.loanKeyFigures?.netProceedsAmount) || 0; // Udbetalt kreditbeløb\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  //Find first term with installment payment if interest only is chosen\r\n  let firstYearInterestOnlyMonthlyPayment = 0;\r\n  let firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n\r\n  let firstYearWithOutInstalmentMonthlyPaymentNet = 0;\r\n  let firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n  if (data.interestOnly?.isInterestOnlyOption && parseInt(data.interestOnly?.interestOnlyYears) > 0) {\r\n    const instalmentTerms = data.amortisation.cashFlow.filter(\r\n      (term) => !isNaN(parseFloat(term.instalment)) && parseFloat(term.instalment) !== 0\r\n    );\r\n    firstYearInterestOnlyMonthlyPayment = monthlyGrossPaymentYearOne;\r\n    firstYearWithOutInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n    let firstYearOfInstalmentPayment = 0;\r\n    let firstYearOfInstalmentPaymentNet = 0;\r\n    for (let x = 0; x < 12; x++) {\r\n      firstYearOfInstalmentPayment = firstYearOfInstalmentPayment + parseFloat(instalmentTerms[x].grossPayment);\r\n      firstYearOfInstalmentPaymentNet = firstYearOfInstalmentPaymentNet + parseFloat(instalmentTerms[x].netPayment);\r\n    }\r\n    firstYearInstalmentMonthlyPaymentGross = firstYearOfInstalmentPayment / 12;\r\n    firstYearInstalmentMonthlyPaymentNet = firstYearOfInstalmentPaymentNet / 12;\r\n  }\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    refinancingFrequency,\r\n    interestOnlyYearsStart,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInterestOnlyMonthlyPayment,\r\n    firstYearWithOutInstalmentMonthlyPaymentNet,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","import i18next from 'i18next';\r\n\r\nexport function ValidateNetProceedsAmountTop(value, propertyValue, fieldKey) {\r\n  if (value < 100000 || value > 1000000000) {\r\n    return {\r\n      error: true,\r\n      errorMsg: i18next.t(`calculator-row-${fieldKey}-range-error`),\r\n    };\r\n  }\r\n  if (value > propertyValue) {\r\n    return {\r\n      error: true,\r\n      errorMsg: i18next.t(`calculator-row-${fieldKey}-property-error`),\r\n    };\r\n  }\r\n  return {\r\n    error: false,\r\n    errorMsg: '',\r\n  };\r\n}\r\n","import i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport { ValidateNetProceedsAmountTop } from '../../helpers/tableItemValidation';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { FlexkortResponse } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: FlexkortResponse,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  let isHolidayHome = inputs.propertyType === 'HolidayHouse';\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const displayType = loan.settings?.displayAsLending === true;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n  const showIOSlider =\r\n    loan.type === 'flexkort' && loan?.payload?.product?.maturity?.years > 20 && isHolidayHome\r\n      ? Math.round(response.loanToValuePercentage) < 60\r\n      : !isHolidayHome;\r\n  // Table: Fastforrentet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (displayType) {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'input',\r\n      validate: true,\r\n      hasError: {\r\n        error: false,\r\n        errorMsg: '',\r\n      },\r\n      value: Math.floor(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n      onChange(loan, value) {\r\n        const { payload, settings, tableItems } = loan;\r\n\r\n        settings.modifiedNetProceeds = true;\r\n\r\n        if (value > response.netProceedsAmount - 1000) {\r\n          payload.basic.calculationType = 'Maximum';\r\n          payload.basic.wantedAdditionalAmount = 0;\r\n        } else {\r\n          payload.basic.wantedAdditionalAmount = parseInt(value);\r\n          payload.basic.calculationType = 'Proceeds';\r\n        }\r\n\r\n        const checkError = ValidateNetProceedsAmountTop(value, inputs.propertyValue, 'netProceedsAmountTop');\r\n        if (checkError && checkError.error) {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: true,\r\n                errorMsg: checkError.errorMsg,\r\n              };\r\n            }\r\n          });\r\n        } else {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: false,\r\n                errorMsg: '',\r\n              };\r\n            }\r\n          });\r\n        }\r\n\r\n        return loan;\r\n      },\r\n    });\r\n  } else {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross * 12)\r\n      : formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment > 0 && showIOSlider) {\r\n    items.push({\r\n      fieldKey: 'firstYearInterestOnlyMonthlyPaymentTop',\r\n      inputType: 'static',\r\n      value: inputs.wantedLoanAmount\r\n        ? formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment * 12)\r\n        : formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'slider',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n    min: response.firstYearInterestOnlyMonthlyPayment > 0 ? 15 : 10,\r\n    max: maturityYears,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.maturity.years = value;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  showIOSlider &&\r\n    items.push({\r\n      fieldKey: 'interestOnlyYearsStart',\r\n      inputType: 'slider',\r\n      value: response.interestOnlyYearsStart,\r\n      min: 0,\r\n      max: 10,\r\n      suffix: ' år',\r\n      onChange(loan, value) {\r\n        const { payload } = loan;\r\n\r\n        payload.product.interestOnly.years = value;\r\n        payload.product.interestOnly.wantInterestOnlyCoupon = value > 0 ? true : false;\r\n\r\n        return payload;\r\n      },\r\n    });\r\n\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'static',\r\n    value: response.rateType,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${response.rateType}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.paymentsPerYear = parseInt(value);\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0 && showIOSlider) {\r\n    items.push({\r\n      fieldKey: 'monthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const flexkort: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  const apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to FlexlifeResponse object\r\n  const mappedData = mapResponse(apiResponse, inputs);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, loan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  // Set values\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n\r\n  if (!settings.modifiedNetProceeds) {\r\n    if (ltv > settings.maxLTV * 0.9) {\r\n      payload.basic.wantedAdditionalAmount = 0;\r\n      payload.basic.calculationType = 'Maximum';\r\n    } else {\r\n      payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n      payload.basic.calculationType = 'Proceeds';\r\n    }\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.flexType.maturity.years >= settings?.businessCommercialMaturity\r\n    ) {\r\n      payload.product.flexType.maturity.years = settings.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  //used for lending calculator\r\n  if (inputs.remainingDebt) {\r\n    payload.basic.remainingDebt = inputs.remainingDebt;\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  // TODO: if needed, update payload, if not delete this file\r\n\r\n  return loan;\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './flexlaankResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import { CalculatorInputs } from '../../types/CalculatorInputs';\r\n\r\nexport interface FlexlaanKResponse {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  refinancingFrequency: number;\r\n  interestOnlyYearsStart: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInterestOnlyMonthlyPayment: number;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearInstalmentMonthlyPaymentNet;\r\n  firstYearWithOutInstalmentMonthlyPaymentNet;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs): FlexlaanKResponse {\r\n  const monthlyGrossPaymentYearOne = parseFloat(data.payment?.monthlyGrossPaymentYearOne) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = parseFloat(data.payment?.monthlyNetPaymentYearOne) || 0; // 1 års månedlig ydelse efter skat\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = 'Variabel rente'; //Rentetype\r\n\r\n  const refinancingFrequency = parseInt(data.refinancing?.refinancingFrequency) || 1; //Periode Hvor Renten Bindes i år\r\n\r\n  const interestOnlyYearsStart =\r\n    parseInt(data.interestOnly?.interestOnlyYears) + (parseInt(data.interestOnly?.interestOnlyMonths) > 0 ? 1 : 0) || 0; //Afdragsfrihed år\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 80 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  // TODO: tjek at det her er \"Udbetalt kreditbeløb\"\r\n  const netProceedsAmount = parseFloat(data.loanKeyFigures?.netProceedsAmount) || 0; // Udbetalt kreditbeløb\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  //Find first term with installment payment if interest only is chosen\r\n  let firstYearInterestOnlyMonthlyPayment = 0;\r\n  let firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n\r\n  let firstYearWithOutInstalmentMonthlyPaymentNet = 0;\r\n  let firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n  if (data.interestOnly?.isInterestOnlyOption && parseInt(data.interestOnly?.interestOnlyYears) > 0) {\r\n    const instalmentTerms = data.amortisation.cashFlow.filter(\r\n      (term) => !isNaN(parseFloat(term.instalment)) && parseFloat(term.instalment) !== 0\r\n    );\r\n    firstYearInterestOnlyMonthlyPayment = monthlyGrossPaymentYearOne;\r\n    firstYearWithOutInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n    let firstYearOfInstalmentPayment = 0;\r\n    let firstYearOfInstalmentPaymentNet = 0;\r\n    for (let x = 0; x < 12; x++) {\r\n      firstYearOfInstalmentPayment = firstYearOfInstalmentPayment + parseFloat(instalmentTerms[x].grossPayment);\r\n      firstYearOfInstalmentPaymentNet = firstYearOfInstalmentPaymentNet + parseFloat(instalmentTerms[x].netPayment);\r\n    }\r\n    firstYearInstalmentMonthlyPaymentGross = firstYearOfInstalmentPayment / 12;\r\n    firstYearInstalmentMonthlyPaymentNet = firstYearOfInstalmentPaymentNet / 12;\r\n  }\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    refinancingFrequency,\r\n    interestOnlyYearsStart,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInterestOnlyMonthlyPayment,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    firstYearWithOutInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","import i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport { ValidateNetProceedsAmountTop } from '../../helpers/tableItemValidation';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { FlexlaanKResponse } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: FlexlaanKResponse,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  let isHolidayHome = inputs.propertyType === 'HolidayHouse';\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const displayType = loan.settings?.displayAsLending === true;\r\n  const showIOSlider =\r\n    loan.type === 'flexlaank' && loan.payload.product.flexType.maturity.years > 20 && isHolidayHome\r\n      ? Math.round(response.loanToValuePercentage) < 60\r\n      : !isHolidayHome;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n\r\n  // Table: Fastforrentet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (displayType) {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'input',\r\n      validate: true,\r\n      hasError: {\r\n        error: false,\r\n        errorMsg: '',\r\n      },\r\n      value: Math.floor(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n      onChange(loan, value) {\r\n        const { payload, settings, tableItems } = loan;\r\n\r\n        settings.modifiedNetProceeds = true;\r\n\r\n        if (value > response.netProceedsAmount - 1000) {\r\n          payload.basic.calculationType = 'Maximum';\r\n          payload.basic.wantedAdditionalAmount = 0;\r\n        } else {\r\n          payload.basic.wantedAdditionalAmount = parseInt(value);\r\n          payload.basic.calculationType = 'Proceeds';\r\n        }\r\n\r\n        const checkError = ValidateNetProceedsAmountTop(value, inputs.propertyValue, 'netProceedsAmountTop');\r\n        if (checkError && checkError.error) {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: true,\r\n                errorMsg: checkError.errorMsg,\r\n              };\r\n            }\r\n          });\r\n        } else {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: false,\r\n                errorMsg: '',\r\n              };\r\n            }\r\n          });\r\n        }\r\n\r\n        return loan;\r\n      },\r\n    });\r\n  } else {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross * 12)\r\n      : formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment > 0 && showIOSlider) {\r\n    items.push({\r\n      fieldKey: 'firstYearInterestOnlyMonthlyPaymentTop',\r\n      inputType: 'static',\r\n      value: inputs.wantedLoanAmount\r\n        ? formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment * 12)\r\n        : formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'slider',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n    min: response.firstYearInterestOnlyMonthlyPayment > 0 ? 15 : 10,\r\n    max: maturityYears,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.flexType.maturity.years = value;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  showIOSlider &&\r\n    items.push({\r\n      fieldKey: 'interestOnlyYearsStart',\r\n      inputType: 'slider',\r\n      value: response.interestOnlyYearsStart,\r\n      min: 0,\r\n      max: 10,\r\n      suffix: ' år',\r\n      onChange(loan, value) {\r\n        const { payload } = loan;\r\n\r\n        payload.product.flexType.interestOnly.years = value;\r\n        payload.product.flexType.interestOnly.wantInterestOnlyCoupon = value > 0 ? true : false;\r\n\r\n        return payload;\r\n      },\r\n    });\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'static',\r\n    value: response.rateType,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'refinancingFrequency',\r\n    inputType: 'slider',\r\n    min: 1,\r\n    max: 10,\r\n    suffix: ' år',\r\n    value: response.refinancingFrequency,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.flexType.refinancingFrequency = value;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${response.rateType}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.flexType.paymentsPerYear = parseInt(value);\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet),\r\n    suffix: ' kr.',\r\n  });\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0 && showIOSlider) {\r\n    items.push({\r\n      fieldKey: 'monthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const flexlaank: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  const apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to FlexlifeResponse object\r\n  const mappedData = mapResponse(apiResponse, inputs);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, loan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  // Set values\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n  if (!settings.modifiedNetProceeds) {\r\n    if (ltv > settings.maxLTV * 0.9) {\r\n      payload.basic.wantedAdditionalAmount = 0;\r\n      payload.basic.calculationType = 'Maximum';\r\n    } else {\r\n      payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n      payload.basic.calculationType = 'Proceeds';\r\n    }\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.flexType.maximumYears >= settings?.businessCommercialMaturity\r\n    ) {\r\n      payload.product.flexType.maximumYears = settings?.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  //used for lending calculator\r\n  if (inputs.remainingDebt) {\r\n    payload.basic.remainingDebt = inputs.remainingDebt;\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  // TODO: if needed, update payload, if not delete this file\r\n\r\n  return loan;\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './flexlaantResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import { CalculatorInputs } from '../../types/CalculatorInputs';\r\n\r\nexport interface FlexlaanTResponse {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  refinancingFrequency: number;\r\n  interestOnlyYearsStart: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearInstalmentMonthlyPaymentNet: number;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs): FlexlaanTResponse {\r\n  const monthlyGrossPaymentYearOne = Math.ceil(parseFloat(data.payment?.monthlyGrossPaymentYearOne)) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = Math.ceil(parseFloat(data.payment?.monthlyNetPaymentYearOne)) || 0; // 1 års månedlig ydelse efter skat\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = 'Variabel rente'; //Rentetype\r\n\r\n  const refinancingFrequency = parseInt(data.refinancing?.refinancingFrequency) || 1; //Periode Hvor Renten Bindes i år\r\n\r\n  const interestOnlyYearsStart =\r\n    parseInt(data.interestOnly?.interestOnlyYears) + (parseInt(data.interestOnly?.interestOnlyMonths) > 0 ? 1 : 0) || 0; //Afdragsfrihed år\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 80 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  // TODO: tjek at det her er \"Udbetalt kreditbeløb\"\r\n  const netProceedsAmount = parseFloat(data.loanKeyFigures?.netProceedsAmount) || 0; // Udbetalt\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n  const firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    refinancingFrequency,\r\n    interestOnlyYearsStart,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","import i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { ValidateNetProceedsAmountTop } from '../../helpers/tableItemValidation';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { FlexlaanTResponse } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: FlexlaanTResponse,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  const displayType = loan.settings?.displayAsLending === true;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n\r\n  // Table: Fastforrentet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (displayType) {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'input',\r\n      validate: true,\r\n      hasError: {\r\n        error: false,\r\n        errorMsg: '',\r\n      },\r\n      value: Math.floor(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n      onChange(loan, value) {\r\n        const { payload, settings, tableItems } = loan;\r\n\r\n        settings.modifiedNetProceeds = true;\r\n\r\n        if (value > response.netProceedsAmount - 1000) {\r\n          payload.basic.calculationType = 'Maximum';\r\n          payload.basic.wantedAdditionalAmount = 0;\r\n        } else {\r\n          payload.basic.wantedAdditionalAmount = parseInt(value);\r\n          payload.basic.calculationType = 'Proceeds';\r\n        }\r\n\r\n        const checkError = ValidateNetProceedsAmountTop(value, inputs.propertyValue, 'netProceedsAmountTop');\r\n        if (checkError && checkError.error) {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: true,\r\n                errorMsg: checkError.errorMsg,\r\n              };\r\n            }\r\n          });\r\n        } else {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: false,\r\n                errorMsg: '',\r\n              };\r\n            }\r\n          });\r\n        }\r\n\r\n        return loan;\r\n      },\r\n    });\r\n  } else {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n    inputType: 'input',\r\n    value: inputs.wantedLoanAmount\r\n      ? response.firstYearInstalmentMonthlyPaymentGross * 12\r\n      : response.firstYearInstalmentMonthlyPaymentGross,\r\n    suffix: ' kr.',\r\n    min: 50,\r\n    max: 1000000,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.flexType.desiredPaymentAmount = inputs.wantedLoanAmount\r\n        ? parseFloat((parseInt(value) / parseInt(response.paymentsPerYear)).toFixed(2))\r\n        : value;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'static',\r\n    value: response.rateType,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'refinancingFrequency',\r\n    inputType: 'slider',\r\n    min: 1,\r\n    max: 10,\r\n    suffix: ' år',\r\n    value: response.refinancingFrequency,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.flexType.refinancingFrequency = value;\r\n      payload.product.flexType.desiredPaymentAmount = inputs.wantedLoanAmount\r\n        ? parseFloat(\r\n            ((response.firstYearInstalmentMonthlyPaymentGross * 12) / parseInt(response.paymentsPerYear)).toFixed(2)\r\n          )\r\n        : response.firstYearInstalmentMonthlyPaymentGross;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${response.rateType}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.flexType.paymentsPerYear = parseInt(value);\r\n\r\n      payload.product.flexType.desiredPaymentAmount = parseFloat(\r\n        (\r\n          (parseInt(payload.product.flexType.desiredPaymentAmount) * parseInt(response.paymentsPerYear)) /\r\n          parseInt(value)\r\n        ).toFixed(2)\r\n      );\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const flexlaant: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  const apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to FLexlaanTResponse object\r\n  const mappedData = mapResponse(apiResponse, inputs);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, loan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { getBankHolidays } from './getBankHolidays';\r\nimport dayjs from 'dayjs';\r\n\r\n/**\r\n * This function takes a date and returns the first date of the next quarter.\r\n * Example: January 1st => April 1st.\r\n * @param date The input date.\r\n * @returns The date of the next quarter.\r\n */\r\nexport const snapDateToQuarter = (date: Date): Date => {\r\n  const d = dayjs(date);\r\n\r\n  if (d.month() > 8) {\r\n    return d.add(1, 'year').set('month', 0).set('date', 1).toDate();\r\n  }\r\n  if (d.month() > 5) {\r\n    return d.set('month', 9).set('date', 1).toDate();\r\n  }\r\n  if (d.month() > 2) {\r\n    return d.set('month', 6).set('date', 1).toDate();\r\n  }\r\n  return d.set('month', 3).set('date', 1).toDate();\r\n};\r\n\r\n/** Formats a date object to a string in this format: YYYY-MM-DD */\r\nexport const formatPayloadDate = (date: Date): string => {\r\n  return dayjs(date).format('YYYY-MM-DD');\r\n};\r\n\r\n/** Given a date object, this will return true if the date is a bank business day as a date object */\r\nexport const isBusinessDay = (date: Date): boolean => {\r\n  const holidays = getBankHolidays(date.getFullYear());\r\n  return !(formatPayloadDate(date) in holidays) && date.getDay() > 0 && date.getDay() < 6;\r\n};\r\n\r\n/** Given a date object, this will return the next available bank business day as a date object */\r\nexport const getNextAvailableBusinessDay = (date: Date): Date => {\r\n  while (!isBusinessDay(date)) {\r\n    return getNextAvailableBusinessDay(dayjs(date).add(1, 'day').toDate());\r\n  }\r\n  return date;\r\n};\r\n","import { formatPayloadDate } from './dateHelpers';\r\nimport dayjs from 'dayjs';\r\n\r\n/** Given a year (YYYY), this will return an index of all bank holidays of that year\r\n * Index form: { 'YYYY-DD-MM': { name: 'holiday name', date: <Date object>}}\r\n */\r\nexport function getBankHolidays(year: number): Record<string, Object> {\r\n  const getEaster = () => {\r\n    let C = Math.floor(year / 100);\r\n    let N = year - 19 * Math.floor(year / 19);\r\n    let K = Math.floor((C - 17) / 25);\r\n    let I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;\r\n    I = I - 30 * Math.floor(I / 30);\r\n    I = I - Math.floor(I / 28) * (1 - Math.floor(I / 28) * Math.floor(29 / (I + 1)) * Math.floor((21 - N) / 11));\r\n    let J = year + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4);\r\n    J = J - 7 * Math.floor(J / 7);\r\n    let L = I - J;\r\n    let M = 3 + Math.floor((L + 40) / 44);\r\n    let D = L + 28 - 31 * Math.floor(M / 4);\r\n    const easterDay = new Date(Date.UTC(year, M - 1, D));\r\n    return easterDay;\r\n  };\r\n\r\n  const newYearsEve = new Date(Date.UTC(year, 11, 31));\r\n  const newYearsDay = new Date(Date.UTC(year, 0, 1));\r\n  const xMasEve = new Date(Date.UTC(year, 11, 24));\r\n  const xMasDay = new Date(year, 11, 25);\r\n  const secondXmasDay = new Date(Date.UTC(year, 11, 26));\r\n  const constitutionDay = new Date(Date.UTC(year, 5, 5));\r\n  const easterDay = getEaster();\r\n  const maundryThursday = dayjs(easterDay).subtract(3, 'day').toDate();\r\n  const goodFriday = dayjs(easterDay).subtract(2, 'day').toDate();\r\n  const easterMonday = dayjs(easterDay).add(1, 'day').toDate();\r\n  const greatPrayerDay = dayjs(easterDay).add(26, 'day').toDate();\r\n  const ascensionDay = dayjs(maundryThursday)\r\n    .add(7 * 6, 'day')\r\n    .toDate();\r\n  const ascensionDayPlus1 = dayjs(ascensionDay).add(1, 'day').toDate();\r\n  const whitSunday = dayjs(easterDay)\r\n    .add(7 * 7, 'day')\r\n    .toDate();\r\n  const whitMonday = dayjs(whitSunday).add(1, 'day').toDate();\r\n\r\n  const holidays = {\r\n    [formatPayloadDate(newYearsEve)]: { name: 'newYearsEve', date: newYearsEve },\r\n    [formatPayloadDate(newYearsDay)]: { name: 'newYearsDay', date: newYearsDay },\r\n    [formatPayloadDate(xMasEve)]: { name: 'xMasEve', date: xMasEve },\r\n    [formatPayloadDate(xMasDay)]: { name: 'xMasDay', date: xMasDay },\r\n    [formatPayloadDate(secondXmasDay)]: { name: 'secondXmasDay', date: secondXmasDay },\r\n    [formatPayloadDate(constitutionDay)]: { name: 'constitutionDay', date: constitutionDay },\r\n    [formatPayloadDate(easterDay)]: { name: 'easterDay', date: easterDay },\r\n    [formatPayloadDate(maundryThursday)]: { name: 'maundryThursday', date: maundryThursday },\r\n    [formatPayloadDate(goodFriday)]: { name: 'goodFriday', date: goodFriday },\r\n    [formatPayloadDate(easterMonday)]: { name: 'easterMonday', date: easterMonday },\r\n    [formatPayloadDate(greatPrayerDay)]: { name: 'greatPrayerDay', date: greatPrayerDay },\r\n    [formatPayloadDate(ascensionDay)]: { name: 'ascensionDay', date: ascensionDay },\r\n    [formatPayloadDate(ascensionDayPlus1)]: { name: 'ascensionDayPlus1', date: ascensionDayPlus1 },\r\n    [formatPayloadDate(whitSunday)]: { name: 'whitSunday', date: whitSunday },\r\n    [formatPayloadDate(whitMonday)]: { name: 'whitMonday', date: whitMonday },\r\n  };\r\n\r\n  return holidays;\r\n}\r\n","import dayjs from 'dayjs';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport { formatPayloadDate, getNextAvailableBusinessDay, isBusinessDay } from '../../helpers/dateHelpers';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n  if (!settings.modifiedNetProceeds) {\r\n    payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  // Special check for LTV over MaxLTV minus 10%\r\n  if (ltv > settings.maxLTV * 0.9 && !settings.modifiedNetProceeds) {\r\n    payload.basic.wantedAdditionalAmount = 0;\r\n    payload.basic.calculationType = 'Maximum';\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.maximumYears >= settings?.businessCommercialMaturity\r\n    ) {\r\n      payload.product.minimumYears = settings?.businessCommercialMaturity;\r\n      payload.product.maximumYears = settings?.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  //used for lending calculator\r\n  if (inputs.remainingDebt) {\r\n    payload.basic.remainingDebt = inputs.remainingDebt;\r\n  }\r\n\r\n  //Dates handling\r\n  const today = new Date();\r\n  //Keeping this if we should support fixed price calculations in the future\r\n  let calculationDate = dayjs(today).add(0, 'day').toDate();\r\n  //Only businessdays are allowed and finding the next businessday\r\n  if (!isBusinessDay(calculationDate)) {\r\n    calculationDate = getNextAvailableBusinessDay(calculationDate);\r\n  }\r\n  payload.basic.calculationDate = formatPayloadDate(calculationDate);\r\n\r\n  // Set values\r\n\r\n  //Checking if no options has a null setting\r\n  if (\r\n    payload.product.changeOption.desiredDebtAtExpiry != null &&\r\n    payload.product.changeOption.desiredInterestOnlyStartDate != null &&\r\n    payload.product.changeOption.desiredPaymentAmount != null\r\n  ) {\r\n    settings.firstRun = true;\r\n    payload.product.changeOption.desiredPaymentAmount = null;\r\n  }\r\n\r\n  // First run\r\n  if (settings.firstRun) {\r\n    if (ltv > settings.maxInterestOnlyLTV) {\r\n      payload.product.changeOption.desiredDebtAtExpiry = inputs.propertyValue * settings.maxInterestOnlyLTV;\r\n    } else {\r\n      payload.product.changeOption.desiredDebtAtExpiry = inputs.propertyValue - inputs.ownPayment;\r\n      if (inputs.wantedLoanAmount) {\r\n        payload.product.changeOption.desiredDebtAtExpiry = inputs.wantedLoanAmount;\r\n      }\r\n    }\r\n    settings.firstRun = false;\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  const { payload } = loan;\r\n\r\n  // Update the changeOption object to the new one from the API response\r\n  payload.product.changeOption.desiredPaymentAmount = parseInt(\r\n    apiResponse.changeOption.calculatedPaymentAmountPerMonth\r\n  );\r\n  payload.product.changeOption.desiredDebtAtExpiry = parseInt(apiResponse.changeOption.calculatedDebtAtExpiry);\r\n  payload.product.changeOption.desiredInterestOnlyStartDate =\r\n    apiResponse.changeOption.calculatedInterestOnlyToMaturityStartDate;\r\n  payload.basic.wantedAdditionalAmount = Math.round(parseFloat(apiResponse.loanKeyFigures.netProceedsAmount));\r\n\r\n  // Update minimumYears and maximumYears to the new ones from the API response\r\n  payload.product.minimumYears = parseInt(apiResponse.maturity.minimumYears);\r\n  payload.product.maximumYears = parseInt(apiResponse.maturity.maximumYears);\r\n\r\n  return loan;\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './flexlifeResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData.data;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import dayjs from 'dayjs';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport {\r\n  // formatPayloadDate,\r\n  getNextAvailableBusinessDay,\r\n  isBusinessDay,\r\n  snapDateToQuarter,\r\n} from '../../helpers/dateHelpers';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\nexport interface FlexlifeResponse {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  refinancingFrequency: number;\r\n  interestOnlyYearsEnd: number;\r\n  calculatedDebtAtExpiry: number;\r\n  approvedDebtAtExpiry: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearInterestOnlyMonthlyPayment: number;\r\n  firstYearWithOutInstalmentMonthlyPaymentNet: number;\r\n  firstYearInstalmentMonthlyPaymentNet: number;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  calculationDate: string;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs, loan: LoanStateItem): FlexlifeResponse {\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const today = new Date();\r\n  let calculationDateUsed = dayjs(today).add(0, 'day').toDate();\r\n\r\n  if (!isBusinessDay(calculationDateUsed)) {\r\n    calculationDateUsed = getNextAvailableBusinessDay(calculationDateUsed);\r\n  }\r\n  const nextTermDate = snapDateToQuarter(calculationDateUsed);\r\n\r\n  const thisQuater = dayjs(nextTermDate).subtract(3, 'month').toDate();\r\n\r\n  const monthlyGrossPaymentYearOne = Math.ceil(parseFloat(data.payment?.monthlyGrossPaymentYearOne)) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = parseFloat(data.payment?.monthlyNetPaymentYearOne) || 0; // 1. års mdl. ydelse efter skat m. afdrag\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = data.interestRate?.rateType === 'Variable' ? 'Variable' : 'Fixed' || 'Fixed'; //Rentetype\r\n\r\n  const refinancingFrequency =\r\n    data.interestRate?.rateType === 'Variable' ? parseInt(data.refinancing?.refinancingFrequency) || 1 : 30 || 1; //Periode Hvor Renten Bindes i år\r\n\r\n  const calculationDate = data.basic?.usedCalculationDate || ''; //Beregningsdato\r\n\r\n  const interestOnlyStartYear = new Date(data.changeOption?.calculatedInterestOnlyToMaturityStartDate);\r\n\r\n  const interestOnlyYearsEnd =\r\n    maturityYears - (interestOnlyStartYear.getFullYear() - thisQuater.getFullYear()) < 0\r\n      ? 0\r\n      : maturityYears - (interestOnlyStartYear.getFullYear() - thisQuater.getFullYear()); //Afdragsfrihed år\r\n\r\n  const calculatedDebtAtExpiry = Math.floor(parseFloat(data.changeOption?.calculatedDebtAtExpiry)) || 0; //Restgæld Ved Udløb\r\n\r\n  const approvedDebtAtExpiry = parseFloat(data.changeOption?.approvedDebtAtExpiry) || 0; // Maximum value for Restgæld ved udløb\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 75 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  const netProceedsAmount = Math.floor(parseFloat(data.loanKeyFigures?.netProceedsAmount)) || 0; // Udbetalt kreditbeløb\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  let firstYearWithOutInstalmentMonthlyPaymentNet = 0;\r\n  let firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n  //Find first term with interest only payment\r\n  const firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n  let firstYearInterestOnlyMonthlyPayment = 0;\r\n\r\n  let interestOnlyTerms = [] as any;\r\n  if (data.amortisation.cashFlow[0].instalment !== '0.00') {\r\n    interestOnlyTerms = data.amortisation.cashFlow.filter((term) => term.instalment === '0.00');\r\n    if (interestOnlyTerms.length > 11) {\r\n      let firstYearOfInterestOnlyPayment = 0;\r\n      let firstYearOfInstalmentPaymentNet = 0;\r\n      for (let x = 0; x < 12; x++) {\r\n        firstYearOfInterestOnlyPayment = firstYearOfInterestOnlyPayment + parseFloat(interestOnlyTerms[x].grossPayment);\r\n        firstYearOfInstalmentPaymentNet = firstYearOfInstalmentPaymentNet + parseFloat(interestOnlyTerms[x].netPayment);\r\n      }\r\n      firstYearInterestOnlyMonthlyPayment = firstYearOfInterestOnlyPayment / 12;\r\n      firstYearWithOutInstalmentMonthlyPaymentNet = firstYearOfInstalmentPaymentNet / 12;\r\n    }\r\n  } else {\r\n    firstYearInterestOnlyMonthlyPayment = monthlyGrossPaymentYearOne;\r\n    firstYearWithOutInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n  }\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    refinancingFrequency,\r\n    interestOnlyYearsEnd,\r\n    calculatedDebtAtExpiry,\r\n    approvedDebtAtExpiry,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInterestOnlyMonthlyPayment,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    firstYearWithOutInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    calculationDate,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","import dayjs from 'dayjs';\r\nimport i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport {\r\n  formatPayloadDate,\r\n  getNextAvailableBusinessDay,\r\n  isBusinessDay,\r\n  snapDateToQuarter,\r\n} from '../../helpers/dateHelpers';\r\nimport { ValidateNetProceedsAmountTop } from '../../helpers/tableItemValidation';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { FlexlifeResponse } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: FlexlifeResponse,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const displayType = loan.settings?.displayAsLending === true;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n\r\n  const today = new Date();\r\n  let calculationDate = dayjs(today).add(0, 'day').toDate();\r\n\r\n  if (!isBusinessDay(calculationDate)) {\r\n    calculationDate = getNextAvailableBusinessDay(calculationDate);\r\n  }\r\n  const nextTermDate = snapDateToQuarter(calculationDate);\r\n\r\n  let thisQuater = dayjs(nextTermDate).subtract(3, 'month').toDate();\r\n\r\n  const maxInterestOnlyYears =\r\n    response.loanToValuePercentage >= loan.settings.maxInterestOnlyLTV * 100\r\n      ? response.maturity - 1\r\n      : response.maturity;\r\n\r\n  if (loan.settings.minPayment === 0) {\r\n    loan.settings.minPayment = response.monthlyGrossPaymentYearOne;\r\n  }\r\n\r\n  const minMonthlyPayment = loan.settings.minPayment === 1 ? 1 : loan.settings.minPayment;\r\n\r\n  // Table: Fastforretet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (displayType) {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'input',\r\n      value: response.netProceedsAmount,\r\n      validate: true,\r\n      hasError: {\r\n        error: false,\r\n        errorMsg: '',\r\n      },\r\n      suffix: ' kr.',\r\n      onChange(loan, value) {\r\n        const { payload, settings, tableItems } = loan;\r\n\r\n        settings.modifiedNetProceeds = true;\r\n\r\n        if (value > response.netProceedsAmount - 1000) {\r\n          payload.basic.calculationType = 'Maximum';\r\n          payload.basic.wantedAdditionalAmount = 0;\r\n        } else {\r\n          payload.basic.wantedAdditionalAmount = parseInt(value);\r\n          payload.basic.calculationType = 'Proceeds';\r\n        }\r\n\r\n        if (payload.product.changeOption.desiredDebtAtExpiry >= response.approvedDebtAtExpiry) {\r\n          payload.product.changeOption.desiredDebtAtExpiry = response.approvedDebtAtExpiry;\r\n          payload.product.changeOption.desiredPaymentAmount = 1;\r\n          payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        }\r\n\r\n        const checkError = ValidateNetProceedsAmountTop(value, inputs.propertyValue, 'netProceedsAmountTop');\r\n        if (checkError && checkError.error) {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: true,\r\n                errorMsg: checkError.errorMsg,\r\n              };\r\n            }\r\n          });\r\n        } else {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: false,\r\n                errorMsg: '',\r\n              };\r\n            }\r\n          });\r\n        }\r\n\r\n        return loan;\r\n      },\r\n    });\r\n  } else {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment !== response.monthlyGrossPaymentYearOne) {\r\n    if (response.interestOnlyYearsEnd === maturityYears) {\r\n      items.push({\r\n        fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n        inputType: 'static',\r\n        value: inputs.wantedLoanAmount\r\n          ? formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross * 12)\r\n          : formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross),\r\n        suffix: ' kr.',\r\n      });\r\n    } else {\r\n      items.push({\r\n        fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n        inputType: 'input',\r\n        value: inputs.wantedLoanAmount\r\n          ? response.firstYearInstalmentMonthlyPaymentGross * 12\r\n          : response.firstYearInstalmentMonthlyPaymentGross,\r\n        suffix: ' kr.',\r\n        min: minMonthlyPayment,\r\n        max: 1000000,\r\n        onChange(loan, value) {\r\n          const { payload } = loan;\r\n          if (payload.product.changeOption.desiredDebtAtExpiry < response.approvedDebtAtExpiry) {\r\n            payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n          } else {\r\n            payload.product.changeOption.desiredDebtAtExpiry = null;\r\n          }\r\n\r\n          payload.product.changeOption.desiredPaymentAmount = inputs.wantedLoanAmount\r\n            ? parseFloat((parseInt(value) / parseInt(response.paymentsPerYear)).toFixed(2))\r\n            : value;\r\n\r\n          payload.product.changeOption.debtAtExpiryOption = 2;\r\n          payload.product.changeOption.interestOnlyPeriodStartOption = 3;\r\n          payload.product.changeOption.paymentAmountOption = 1;\r\n          return payload;\r\n        },\r\n      });\r\n    }\r\n  }\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment > 0) {\r\n    items.push({\r\n      fieldKey: 'firstYearInterestOnlyMonthlyPaymentTop',\r\n      inputType: 'static',\r\n      value: inputs.wantedLoanAmount\r\n        ? formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment * 12)\r\n        : formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  //Static value only at this time\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  // Might be 2 of these covering 2 periods of interest only, but only 1 at this time\r\n  // Showing the last interest only period for Flexlife\r\n  items.push({\r\n    fieldKey: 'interestOnlyYearsEnd',\r\n    inputType: 'slider',\r\n    value: response.interestOnlyYearsEnd,\r\n    min: 0,\r\n    max: maxInterestOnlyYears,\r\n    suffix: ' år',\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      const nextTermDatePlusYears = dayjs(thisQuater)\r\n        .add(maturityYears - value, 'year')\r\n        .toDate();\r\n\r\n      let amortEndDate = new Date(response.amortisation.cashFlow[response.amortisation.cashFlow.length - 1].termDate);\r\n      if (maturityYears - (amortEndDate.getFullYear() - thisQuater.getFullYear()) < 0) {\r\n        amortEndDate = dayjs(amortEndDate).subtract(3, 'month').toDate();\r\n      }\r\n\r\n      const oldDesiredPaymentAmount =\r\n        payload.product.changeOption.desiredPaymentAmount > 0\r\n          ? payload.product.changeOption.desiredPaymentAmount\r\n          : response.firstYearInstalmentMonthlyPaymentGross;\r\n\r\n      payload.product.changeOption.desiredPaymentAmount = null;\r\n\r\n      if (value === 0) {\r\n        payload.product.changeOption.desiredInterestOnlyStartDate = formatPayloadDate(amortEndDate);\r\n      } else {\r\n        payload.product.changeOption.desiredInterestOnlyStartDate = formatPayloadDate(nextTermDatePlusYears);\r\n      }\r\n\r\n      if (payload.product.changeOption.desiredDebtAtExpiry === response.principalAmount && value < maturityYears) {\r\n        payload.product.changeOption.desiredDebtAtExpiry = response.principalAmount / 2;\r\n      }\r\n\r\n      if (payload.product.changeOption.desiredDebtAtExpiry === 0 && value > 0 && value < maturityYears) {\r\n        payload.product.changeOption.desiredDebtAtExpiry = null;\r\n        payload.product.changeOption.desiredPaymentAmount = oldDesiredPaymentAmount;\r\n      }\r\n\r\n      if (value === maturityYears) {\r\n        payload.product.changeOption.desiredDebtAtExpiry = response.principalAmount;\r\n        payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        payload.product.changeOption.desiredPaymentAmount = 1;\r\n      }\r\n\r\n      payload.product.changeOption.debtAtExpiryOption = 2;\r\n      payload.product.changeOption.interestOnlyPeriodStartOption = 3;\r\n      payload.product.changeOption.paymentAmountOption = 1;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'dropdown',\r\n    value: response.rateType,\r\n    options: [\r\n      {\r\n        label: 'Fast rente',\r\n        value: 'Fixed',\r\n      },\r\n      {\r\n        label: 'Variabel rente',\r\n        value: 'Variable',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      const newProductKey = value === 'Fixed' ? 'FlexLifeKR' : 'FlexLifeIR';\r\n\r\n      payload.product.productKey = newProductKey;\r\n\r\n      if (response.loanToValuePercentage >= payload.product.changeOption.approvedDebtAtExpiryPercentage) {\r\n        payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        payload.product.changeOption.desiredPaymentAmount = 1;\r\n        payload.basic.wantedAdditionalAmount = 0;\r\n        payload.basic.calculationType = 'Maximum';\r\n        payload.product.changeOption.desiredDebtAtExpiry = response.approvedDebtAtExpiry;\r\n      } else {\r\n        payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        payload.product.changeOption.desiredPaymentAmount = 1;\r\n        payload.product.changeOption.desiredDebtAtExpiry = response.approvedDebtAtExpiry;\r\n      }\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  if (response.rateType === 'Variable') {\r\n    items.push({\r\n      fieldKey: 'refinancingFrequency',\r\n      inputType: 'slider',\r\n      min: 1,\r\n      max: 10,\r\n      suffix: ' år',\r\n      value: response.refinancingFrequency,\r\n      onChange(loan, value) {\r\n        const { payload } = loan;\r\n\r\n        payload.product.refinancingFrequency = value;\r\n        payload.product.changeOption.desiredPaymentAmount = null;\r\n\r\n        if (\r\n          payload.product.changeOption.desiredDebtAtExpiry === 0 ||\r\n          response.principalAmount > response.approvedDebtAtExpiry\r\n        ) {\r\n          payload.product.changeOption.desiredPaymentAmount = 1;\r\n          payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        }\r\n\r\n        return payload;\r\n      },\r\n    });\r\n  }\r\n  if (response.interestOnlyYearsEnd === maturityYears) {\r\n    items.push({\r\n      fieldKey: 'calculatedDebtAtExpiry',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.calculatedDebtAtExpiry),\r\n      suffix: ' kr.',\r\n    });\r\n  } else {\r\n    items.push({\r\n      fieldKey: 'calculatedDebtAtExpiry',\r\n      inputType: 'input',\r\n      value: response.calculatedDebtAtExpiry,\r\n      min: 0,\r\n      max: response.approvedDebtAtExpiry,\r\n      suffix: ' kr.',\r\n      onChange(loan, value) {\r\n        const { payload } = loan;\r\n\r\n        payload.product.changeOption.desiredDebtAtExpiry = value;\r\n        payload.product.changeOption.desiredPaymentAmount = null;\r\n        payload.basic.calculationType = 'Proceeds';\r\n\r\n        if (value < 1) {\r\n          payload.product.changeOption.desiredPaymentAmount = 1;\r\n          payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        }\r\n\r\n        if (value >= response.approvedDebtAtExpiry) {\r\n          payload.product.changeOption.desiredDebtAtExpiry = response.approvedDebtAtExpiry;\r\n          payload.product.changeOption.desiredPaymentAmount = 1;\r\n          payload.product.changeOption.desiredInterestOnlyStartDate = null;\r\n        }\r\n\r\n        return payload;\r\n      },\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n  });\r\n\r\n  const rateText = response.rateType === 'Fixed' ? 'Fast rente' : 'Variabel rente';\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${rateText}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.paymentsPerYear = parseInt(value);\r\n\r\n      if (payload.product.changeOption.desiredDebtAtExpiry > response.principalAmount) {\r\n        payload.product.changeOption.desiredDebtAtExpiry = response.principalAmount;\r\n      }\r\n      payload.product.changeOption.desiredPaymentAmount = null;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet),\r\n    suffix: ' kr.',\r\n  });\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'monthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet !== response.monthlyNetPaymentYearOne) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const flexlife: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  let apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to FlexlifeResponse object\r\n  const mappedData = mapResponse(apiResponse, inputs, newLoan);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, newLoan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  // Return\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n\r\n  if (ltv > settings.maxLTV * 0.9) {\r\n    payload.basic.wantedAdditionalAmount = 0;\r\n    payload.basic.calculationType = 'Maximum';\r\n  } else {\r\n    payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.maturity.years >= settings?.businessCommercialMaturity\r\n    ) {\r\n      payload.product.maturity.years = settings.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  // TODO: if needed, update payload, if not delete this file\r\n\r\n  return loan;\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './kontantlaanResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import { CalculatorInputs } from '../../types/CalculatorInputs';\r\n\r\nexport interface KontantlaanResponse {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  interestOnlyYearsStart: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInterestOnlyMonthlyPayment: number;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearWithOutInstalmentMonthlyPaymentNet: number;\r\n  firstYearInstalmentMonthlyPaymentNet: number;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs): KontantlaanResponse {\r\n  const monthlyGrossPaymentYearOne = parseFloat(data.payment?.monthlyGrossPaymentYearOne) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = parseFloat(data.payment?.monthlyNetPaymentYearOne) || 0; // 1 års månedlig ydelse efter skat\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = 'Fast rente'; //Rentetype\r\n\r\n  const interestOnlyYearsStart =\r\n    parseInt(data.interestOnly?.interestOnlyYears) + (parseInt(data.interestOnly?.interestOnlyMonths) > 0 ? 1 : 0) || 0; //Afdragsfrihed år\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 80 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  // TODO: tjek at det her er \"Udbetalt kreditbeløb\"\r\n  const netProceedsAmount = parseFloat(data.loanKeyFigures?.netProceedsAmount) || 0; // Udbetalt kreditbeløb\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  //Find first term with installment payment if interest only is chosen\r\n  let firstYearInterestOnlyMonthlyPayment = 0;\r\n  let firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n\r\n  let firstYearWithOutInstalmentMonthlyPaymentNet = 0;\r\n  let firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n  if (data.interestOnly?.isInterestOnlyOption && parseInt(data.interestOnly?.interestOnlyYears) > 0) {\r\n    const instalmentTerms = data.amortisation.cashFlow.filter((term) => term.instalment !== '0.00');\r\n\r\n    firstYearInterestOnlyMonthlyPayment = monthlyGrossPaymentYearOne;\r\n    firstYearWithOutInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n    let firstYearOfInstalmentPayment = 0;\r\n    let firstYearOfInstalmentPaymentNet = 0;\r\n\r\n    for (let x = 0; x < 12; x++) {\r\n      firstYearOfInstalmentPayment = firstYearOfInstalmentPayment + parseFloat(instalmentTerms[x].grossPayment);\r\n      firstYearOfInstalmentPaymentNet = firstYearOfInstalmentPaymentNet + parseFloat(instalmentTerms[x].netPayment);\r\n    }\r\n    firstYearInstalmentMonthlyPaymentGross = firstYearOfInstalmentPayment / 12;\r\n    firstYearInstalmentMonthlyPaymentNet = firstYearOfInstalmentPaymentNet / 12;\r\n  }\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    interestOnlyYearsStart,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInterestOnlyMonthlyPayment,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    firstYearWithOutInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","import i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { KontantlaanResponse } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: KontantlaanResponse,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n\r\n  // Table: Fastforrentet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmountTop',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross * 12)\r\n      : formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment > 0) {\r\n    items.push({\r\n      fieldKey: 'firstYearInterestOnlyMonthlyPaymentTop',\r\n      inputType: 'static',\r\n      value: inputs.wantedLoanAmount\r\n        ? formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment * 12)\r\n        : formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'slider',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n    min: response.firstYearInterestOnlyMonthlyPayment > 0 ? 15 : 10,\r\n    max: maturityYears,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.maturity.years = value;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'static',\r\n    value: response.rateType,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n    suffix: ' mdr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${response.rateType}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n    tooltip: false,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.paymentsPerYear = parseInt(value);\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const kontantlaan: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  const apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to KontantlaanResponse object\r\n  const mappedData = mapResponse(apiResponse, inputs);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, loan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { CITY_COMMERCIAL } from '../../config';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for preparing the payload before sending it to the API.\r\n * @param loan The loan\r\n * @param inputs The inputs from the user\r\n */\r\nexport function preparePayload(loan: LoanStateItem, inputs: CalculatorInputs): LoanStateItem {\r\n  const { payload, settings } = loan;\r\n\r\n  let ltv = (inputs.propertyValue - inputs.ownPayment) / inputs.propertyValue;\r\n  if (inputs.wantedLoanAmount) {\r\n    ltv = 0.5;\r\n  }\r\n  payload.property.type = inputs.propertyType;\r\n  payload.property.value = inputs.propertyValue;\r\n\r\n  if (!settings.modifiedNetProceeds) {\r\n    if (ltv > settings.maxLTV * 0.9) {\r\n      payload.basic.wantedAdditionalAmount = 0;\r\n      payload.basic.calculationType = 'Maximum';\r\n    } else {\r\n      payload.basic.wantedAdditionalAmount = inputs.propertyValue - inputs.ownPayment;\r\n      payload.basic.calculationType = 'Proceeds';\r\n    }\r\n  }\r\n\r\n  /* used for business calcualtor only */\r\n  if (inputs.propertyCategory && inputs.propertyCategory !== '') {\r\n    payload.property.category = inputs.propertyType;\r\n    payload.property.type = inputs.propertyCategory;\r\n    if (\r\n      inputs.propertyType === CITY_COMMERCIAL &&\r\n      payload.product.maturity.years >= settings.businessCommercialMaturity\r\n    ) {\r\n      payload.product.maturity.years = settings.businessCommercialMaturity;\r\n    }\r\n  }\r\n  if (inputs.ownerCategory && inputs.ownerCategory !== '') {\r\n    payload.basic.ownerCategory = inputs.ownerCategory;\r\n  }\r\n  if (inputs.wantedLoanAmount) {\r\n    payload.basic.wantedAdditionalAmount = inputs.wantedLoanAmount;\r\n    payload.basic.calculationType = 'Proceeds';\r\n  }\r\n\r\n  //used for lending calculator\r\n  if (inputs.remainingDebt) {\r\n    payload.basic.remainingDebt = inputs.remainingDebt;\r\n  }\r\n\r\n  return loan;\r\n}\r\n","import { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\n/**\r\n * This function is responsible for updating the internal payload we have in the state for the loan.\r\n * The values coming from the API response should override the values we have internally, so\r\n * that the next API request has the latest updated and most correct values.\r\n * @param loan The loan\r\n * @param apiResponse The API response\r\n */\r\nexport function updatePayload(loan: LoanStateItem, apiResponse: any): LoanStateItem {\r\n  // TODO: if needed, update payload, if not delete this file\r\n\r\n  return loan;\r\n}\r\n","import { API_LOCAL_VALUE } from '../../config';\r\nimport { callApi } from '../../helpers/api';\r\nimport { sleep } from '../../helpers/sleep';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport localData from './obligationslaanResponseExample.json';\r\n\r\nexport async function requestApi(loan: LoanStateItem, inputs: CalculatorInputs, apiUrl: string): Promise<any> {\r\n  if (apiUrl === API_LOCAL_VALUE) {\r\n    await sleep(300);\r\n    return localData;\r\n  }\r\n\r\n  const response = await callApi(apiUrl, loan.payload);\r\n  if (response === false) {\r\n    return false;\r\n  }\r\n\r\n  // HCM-838: Check if 2nd request for \"wantedAdditionalAmount\" is necessary\r\n  const loanAmount = inputs.propertyValue - inputs.ownPayment;\r\n  const netProceedsAmount = parseFloat(response?.loanKeyFigures?.netProceedsAmount) || 0;\r\n\r\n  if (loan.payload.basic.calculationType === 'Proceeds') {\r\n    return response;\r\n  } else {\r\n    if (loanAmount >= netProceedsAmount) {\r\n      return response;\r\n    } else {\r\n      loan.payload.basic.wantedAdditionalAmount = loanAmount;\r\n      loan.payload.basic.calculationType = 'Proceeds';\r\n      const response = await callApi(apiUrl, loan.payload);\r\n      return response;\r\n    }\r\n  }\r\n}\r\n","import { CalculatorInputs } from '../../types/CalculatorInputs';\r\n\r\nexport interface ObligationslaanResponse {\r\n  monthlyGrossPaymentYearOne: number;\r\n  monthlyNetPaymentYearOne: number;\r\n  maturity: number;\r\n  rateType: string;\r\n  interestOnlyYearsStart: number;\r\n  loanToValuePercentage: number;\r\n  loanProvider: string;\r\n  netProceedsAmount: number;\r\n  propertyValue: number;\r\n  bankloan: number;\r\n  ownpayment: number;\r\n  principalAmount: number;\r\n  interestRatePercentage: number;\r\n  debtorInterestRate: number;\r\n  annualPercentageRate: number;\r\n  totalRepaymentAmount: number;\r\n  numberOfPayments: number;\r\n  weightedBondPrice: number;\r\n  totalAdministrationFee: number;\r\n  taxRate: number;\r\n  amortisation: any;\r\n  firstYearInterestOnlyMonthlyPayment: number;\r\n  firstYearInstalmentMonthlyPaymentGross: number;\r\n  firstYearWithOutInstalmentMonthlyPaymentNet: number;\r\n  firstYearInstalmentMonthlyPaymentNet: number;\r\n  totalInterest: number;\r\n  paymentTotalAdministrationFee: number;\r\n  settlementFeeAmount: number;\r\n  loanCaseFee: number;\r\n  registrationHandlingFee: number;\r\n  variableRegistrationFee: number;\r\n  fixedRegistrationFee: number;\r\n  originationFeeAmount: number;\r\n  paymentsPerYear: string;\r\n}\r\n\r\nexport function mapResponse(data: any, inputs: CalculatorInputs): ObligationslaanResponse {\r\n  const monthlyGrossPaymentYearOne = parseFloat(data.payment?.monthlyGrossPaymentYearOne) || 0; // 1 års månedlig ydelse før skat\r\n\r\n  const monthlyNetPaymentYearOne = parseFloat(data.payment?.monthlyNetPaymentYearOne) || 0; // 1 års månedlig ydelse efter skat\r\n\r\n  const maturity =\r\n    parseInt(data.maturity?.calculatedTimeToMaturityYears) +\r\n      (parseInt(data.maturity?.calculatedTimeToMaturityMonths) > 0 ? 1 : 0) || 0; //Løbetid i år\r\n\r\n  const rateType = 'Fast rente'; //Rentetype\r\n\r\n  const interestOnlyYearsStart =\r\n    parseInt(data.interestOnly?.interestOnlyYears) + (parseInt(data.interestOnly?.interestOnlyMonths) > 0 ? 1 : 0) || 0; //Afdragsfrihed år\r\n\r\n  const loanToValuePercentage =\r\n    parseFloat(data.property?.loanToValuePercentage) > 0 ? parseFloat(data.property?.loanToValuePercentage) : 80 || 0; //LTV\r\n\r\n  const loanProvider = 'Realkredit Danmark';\r\n\r\n  // TODO: tjek at det her er \"Udbetalt kreditbeløb\"\r\n  const netProceedsAmount = parseFloat(data.loanKeyFigures?.netProceedsAmount) || 0; // Udbetalt kreditbeløb\r\n\r\n  const propertyValue = parseInt(data.property?.propertyValue) || 0;\r\n\r\n  const bankloan = Math.ceil(propertyValue - netProceedsAmount - inputs.ownPayment);\r\n\r\n  const ownpayment = inputs.ownPayment;\r\n\r\n  const paymentsPerYear = data.payment?.paymentsPerYear;\r\n\r\n  const principalAmount = parseFloat(data.basic?.principalAmount) || 0; //Hovedstol\r\n\r\n  const interestRatePercentage = parseFloat(data.interestRate?.interestRatePercentage) || 0; //Rente\r\n\r\n  const debtorInterestRate = parseFloat(data.interestRate?.debtorInterestRate) || 0; //Debitorrente\r\n\r\n  const annualPercentageRate = parseFloat(data.loanKeyFigures?.annualPercentageRate) || 0; //ÅOP\r\n\r\n  const totalRepaymentAmount = parseFloat(data.payment?.totalRepaymentAmount) || 0; //Tilbagebetaling\r\n\r\n  const numberOfPayments = parseInt(data.amortisation?.numberOfPayments) || 0; //Antal ydelser\r\n\r\n  const weightedBondPrice = parseFloat(data.bonds?.weightedBondPrice) || 0; //Kurs\r\n\r\n  const totalAdministrationFee =\r\n    parseFloat(data.payment?.totalAdministrationFee) +\r\n      parseFloat(data.payment?.totalInterest) +\r\n      parseFloat(data.feeLoanCaseCosts?.costsTotal) || 0; //Omkostninger\r\n\r\n  const taxRate = parseFloat(data.customer?.appliedTaxRate) || 0; //Used taxrate\r\n\r\n  const amortisation =\r\n    typeof data.amortisation !== 'undefined'\r\n      ? {\r\n          numberOfPayments: data.amortisation.numberOfPayments,\r\n          cashFlow: data.amortisation.cashFlow,\r\n        }\r\n      : []; //Ydelsesforløb (Object)\r\n\r\n  //Find first term with installment payment if interest only is chosen\r\n  let firstYearInterestOnlyMonthlyPayment = 0;\r\n  let firstYearInstalmentMonthlyPaymentGross = monthlyGrossPaymentYearOne;\r\n\r\n  let firstYearWithOutInstalmentMonthlyPaymentNet = 0;\r\n  let firstYearInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n  if (data.interestOnly?.isInterestOnlyOption && parseInt(data.interestOnly?.interestOnlyYears) > 0) {\r\n    const instalmentTerms = data.amortisation.cashFlow.filter(\r\n      (term) => !isNaN(parseFloat(term.instalment)) && parseFloat(term.instalment) !== 0\r\n    );\r\n\r\n    firstYearInterestOnlyMonthlyPayment = monthlyGrossPaymentYearOne;\r\n    firstYearWithOutInstalmentMonthlyPaymentNet = monthlyNetPaymentYearOne;\r\n\r\n    let firstYearOfInstalmentPayment = 0;\r\n    let firstYearOfInstalmentPaymentNet = 0;\r\n    for (let x = 0; x < 12; x++) {\r\n      firstYearOfInstalmentPayment = firstYearOfInstalmentPayment + parseFloat(instalmentTerms[x].grossPayment);\r\n      firstYearOfInstalmentPaymentNet = firstYearOfInstalmentPaymentNet + parseFloat(instalmentTerms[x].netPayment);\r\n    }\r\n    firstYearInstalmentMonthlyPaymentGross = firstYearOfInstalmentPayment / 12;\r\n    firstYearInstalmentMonthlyPaymentNet = firstYearOfInstalmentPaymentNet / 12;\r\n  }\r\n\r\n  // Values for \"total administration fee\" tooltip content\r\n  const totalInterest = parseFloat(data.payment?.totalInterest) || 0;\r\n  const paymentTotalAdministrationFee = parseFloat(data.payment?.totalAdministrationFee) || 0;\r\n  const settlementFeeAmount = parseFloat(data.feeLoanCaseCosts?.settlementFeeAmount) || 0;\r\n  const loanCaseFee = parseFloat(data.feeLoanCaseCosts?.loanCaseFee) || 0;\r\n  const registrationHandlingFee = parseFloat(data.feeLoanCaseCosts?.registrationHandlingFee) || 0;\r\n  const variableRegistrationFee = parseFloat(data.feeLoanCaseCosts?.variableRegistrationFee) || 0;\r\n  const fixedRegistrationFee = parseFloat(data.feeLoanCaseCosts?.fixedRegistrationFee) || 0;\r\n  const originationFeeAmount = parseFloat(data.feeLoanCaseCosts?.originationFeeAmount) || 0;\r\n\r\n  return {\r\n    monthlyGrossPaymentYearOne,\r\n    monthlyNetPaymentYearOne,\r\n    maturity,\r\n    rateType,\r\n    interestOnlyYearsStart,\r\n    loanToValuePercentage,\r\n    loanProvider,\r\n    netProceedsAmount,\r\n    propertyValue,\r\n    bankloan,\r\n    ownpayment,\r\n    principalAmount,\r\n    interestRatePercentage,\r\n    debtorInterestRate,\r\n    annualPercentageRate,\r\n    totalRepaymentAmount,\r\n    numberOfPayments,\r\n    weightedBondPrice,\r\n    totalAdministrationFee,\r\n    taxRate,\r\n    amortisation,\r\n    firstYearInstalmentMonthlyPaymentGross,\r\n    firstYearInterestOnlyMonthlyPayment,\r\n    firstYearWithOutInstalmentMonthlyPaymentNet,\r\n    firstYearInstalmentMonthlyPaymentNet,\r\n    totalInterest,\r\n    paymentTotalAdministrationFee,\r\n    settlementFeeAmount,\r\n    loanCaseFee,\r\n    registrationHandlingFee,\r\n    variableRegistrationFee,\r\n    fixedRegistrationFee,\r\n    originationFeeAmount,\r\n    paymentsPerYear,\r\n  };\r\n}\r\n","import i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { CalculatorTooltipAdministrationFee } from '../../components/tooltip/CalculatorTooltipAdministrationFee';\r\nimport { CITY_COMMERCIAL } from '../../config';\r\nimport { ValidateNetProceedsAmountTop } from '../../helpers/tableItemValidation';\r\nimport { CalculatorInputs } from '../../types/CalculatorInputs';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { ObligationslaanResponse } from './response-mapper';\r\n\r\nexport const convertToTableItems = (\r\n  response: ObligationslaanResponse,\r\n  loan: LoanStateItem,\r\n  inputs: CalculatorInputs\r\n): TableItem[] => {\r\n  const items: TableItem[] = [];\r\n  let isHolidayHome = inputs.propertyType === 'HolidayHouse';\r\n  const maturityYears = inputs.propertyType === CITY_COMMERCIAL ? loan.settings?.businessCommercialMaturity : 30;\r\n  const displayType = loan.settings?.displayAsLending === true;\r\n  const showIOSlider =\r\n    loan.type === 'obligationslaan' && loan?.payload?.product?.maturity.years > 20 && isHolidayHome\r\n      ? Math.round(response.loanToValuePercentage) < 60\r\n      : !isHolidayHome;\r\n  const propertyDepositDisclaimer = inputs.wantedLoanAmount\r\n    ? i18next.t('calculator-row-business-propertyDepositDisclaimer-value')\r\n    : i18next.t('calculator-row-propertyDepositDisclaimer-value');\r\n\r\n  // Table: Fastforrentet 1\r\n  if (response.bankloan > 0) {\r\n    items.push({\r\n      fieldKey: 'bankloan',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.bankloan),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'ownpayment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.ownpayment),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (displayType) {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'input',\r\n      validate: true,\r\n      hasError: {\r\n        error: false,\r\n        errorMsg: '',\r\n      },\r\n      value: Math.floor(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n      onChange(loan, value) {\r\n        const { payload, settings, tableItems } = loan;\r\n\r\n        settings.modifiedNetProceeds = true;\r\n\r\n        if (value > response.netProceedsAmount - 1000) {\r\n          payload.basic.calculationType = 'Maximum';\r\n          payload.basic.wantedAdditionalAmount = 0;\r\n        } else {\r\n          payload.basic.wantedAdditionalAmount = parseInt(value);\r\n          payload.basic.calculationType = 'Proceeds';\r\n        }\r\n\r\n        const checkError = ValidateNetProceedsAmountTop(value, inputs.propertyValue, 'netProceedsAmountTop');\r\n        if (checkError && checkError.error) {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: true,\r\n                errorMsg: checkError.errorMsg,\r\n              };\r\n            }\r\n          });\r\n        } else {\r\n          tableItems?.forEach((value) => {\r\n            if (value.fieldKey === 'netProceedsAmountTop') {\r\n              value.hasError = {\r\n                error: false,\r\n                errorMsg: '',\r\n              };\r\n            }\r\n          });\r\n        }\r\n\r\n        return loan;\r\n      },\r\n    });\r\n  } else {\r\n    items.push({\r\n      fieldKey: 'netProceedsAmountTop',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.netProceedsAmount),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'firstYearInstalmentMonthlyPaymentGrossTop',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross * 12)\r\n      : formatAsCurrency(response.firstYearInstalmentMonthlyPaymentGross),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearInterestOnlyMonthlyPayment > 0 && showIOSlider) {\r\n    items.push({\r\n      fieldKey: 'firstYearInterestOnlyMonthlyPaymentTop',\r\n      inputType: 'static',\r\n      value: inputs.wantedLoanAmount\r\n        ? formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment * 12)\r\n        : formatAsCurrency(response.firstYearInterestOnlyMonthlyPayment),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'maturityTop',\r\n    inputType: 'slider',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n    min: response.firstYearInterestOnlyMonthlyPayment > 0 ? 15 : 10,\r\n    max: maturityYears,\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.maturity.years = value;\r\n\r\n      payload.product.interestOnly.years = 0;\r\n\r\n      payload.product.interestOnly.wantInterestOnlyCoupon = false;\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  showIOSlider &&\r\n    items.push({\r\n      fieldKey: 'interestOnlyYearsStart',\r\n      inputType: 'slider',\r\n      value: response.interestOnlyYearsStart,\r\n      min: 0,\r\n      max: 10,\r\n      suffix: ' år',\r\n      onChange(loan, value) {\r\n        const { payload } = loan;\r\n\r\n        payload.product.interestOnly.years = value;\r\n        payload.product.interestOnly.wantInterestOnlyCoupon = value > 0 ? true : false;\r\n\r\n        if (payload.product.interestOnly.years > 0) {\r\n          payload.product.maturity.years = Math.max(payload.product.maturity.years, 15);\r\n        }\r\n\r\n        return payload;\r\n      },\r\n    });\r\n\r\n  items.push({\r\n    fieldKey: 'rateType',\r\n    inputType: 'static',\r\n    value: response.rateType,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'loanToValuePercentage',\r\n    inputType: 'static',\r\n    value: Math.round(response.loanToValuePercentage),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'taxRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.taxRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  // Table: Fastforrentet 2\r\n  items.push({\r\n    fieldKey: 'loanProvider',\r\n    inputType: 'static',\r\n    value: response.loanProvider,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'netProceedsAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.netProceedsAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'principalAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.principalAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'maturityBottom',\r\n    inputType: 'static',\r\n    value: response.maturity,\r\n    suffix: ' år',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyGrossPaymentYearOneBottom',\r\n    inputType: 'static',\r\n    value: inputs.wantedLoanAmount\r\n      ? formatAsCurrency(response.monthlyGrossPaymentYearOne * 12)\r\n      : formatAsCurrency(response.monthlyGrossPaymentYearOne),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'numberOfPayments',\r\n    inputType: 'static',\r\n    value: response.numberOfPayments,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'debtorInterestRate',\r\n    inputType: 'static',\r\n    value: `(${response.rateType}) ${formatAsCurrency(response.debtorInterestRate, 2)}`,\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'weightedBondPrice',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.weightedBondPrice, 10),\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'annualPercentageRate',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.annualPercentageRate, 2),\r\n    suffix: ' %',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalAdministrationFee',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalAdministrationFee),\r\n    suffix: ' kr.',\r\n    tooltip: <CalculatorTooltipAdministrationFee {...response} />,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'totalRepaymentAmount',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.totalRepaymentAmount),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'propertyDepositDisclaimer',\r\n    inputType: 'static',\r\n    value: propertyDepositDisclaimer,\r\n    tooltip: false,\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'paymentsPerYear',\r\n    inputType: 'dropdown',\r\n    value: response.paymentsPerYear,\r\n    options: [\r\n      {\r\n        label: '4',\r\n        value: '4',\r\n      },\r\n      {\r\n        label: '12',\r\n        value: '12',\r\n      },\r\n    ],\r\n    onChange(loan, value) {\r\n      const { payload } = loan;\r\n\r\n      payload.product.paymentsPerYear = parseInt(value);\r\n\r\n      return payload;\r\n    },\r\n  });\r\n\r\n  items.push({\r\n    fieldKey: 'monthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0 && showIOSlider) {\r\n    items.push({\r\n      fieldKey: 'monthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  items.push({\r\n    fieldKey: 'businessMonthlyPaymentWithInstallment',\r\n    inputType: 'static',\r\n    value: formatAsCurrency(response.firstYearInstalmentMonthlyPaymentNet * 12),\r\n    suffix: ' kr.',\r\n  });\r\n\r\n  if (response.firstYearWithOutInstalmentMonthlyPaymentNet > 0) {\r\n    items.push({\r\n      fieldKey: 'businessMonthlyPaymentWithOutInstallment',\r\n      inputType: 'static',\r\n      value: formatAsCurrency(response.firstYearWithOutInstalmentMonthlyPaymentNet * 12),\r\n      suffix: ' kr.',\r\n    });\r\n  }\r\n\r\n  return items;\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { mapAmortisationData } from '../../helpers/mapAmortisationData';\r\nimport { LoanTypeCalculatorFunction } from '../../types/LoanTypeCalculatorFunction';\r\nimport { preparePayload } from './payload-preparer';\r\nimport { updatePayload } from './payload-updater';\r\nimport { requestApi } from './request';\r\nimport { mapResponse } from './response-mapper';\r\nimport { convertToTableItems } from './table-converter';\r\n\r\nexport const obligationslaan: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  let newLoan = cloneDeep(loan);\r\n\r\n  // Prepare payload\r\n  newLoan = preparePayload(loan, inputs);\r\n\r\n  // Request the API\r\n  const apiResponse = await requestApi(newLoan, inputs, apiUrl);\r\n  if (!apiResponse) return false;\r\n\r\n  // Update payload\r\n  newLoan = updatePayload(newLoan, apiResponse);\r\n\r\n  // Map the response to FlexlifeResponse object\r\n  const mappedData = mapResponse(apiResponse, inputs);\r\n\r\n  // Convert to array of TableItem\r\n  const tableItems = convertToTableItems(mappedData, loan, inputs);\r\n\r\n  // Get amortisation data\r\n  const amortisationData = mapAmortisationData(mappedData.amortisation.cashFlow);\r\n\r\n  return {\r\n    ...newLoan,\r\n    apiResponse,\r\n    tableItems,\r\n    stickyValues: {\r\n      monthlyGrossPaymentYearOne: mappedData.monthlyGrossPaymentYearOne,\r\n      monthlyNetPaymentYearOne: mappedData.monthlyNetPaymentYearOne,\r\n    },\r\n    amortisationData,\r\n    mappedData,\r\n  };\r\n};\r\n","import { sleep } from '../helpers/sleep';\r\nimport { LoanTypeCalculatorFunction } from '../types/LoanTypeCalculatorFunction';\r\nimport { cibor6 } from './cibor6';\r\nimport { flexkort } from './flexkort';\r\nimport { flexlaank } from './flexlaank';\r\nimport { flexlaant } from './flexlaant';\r\nimport { flexlife } from './flexlife';\r\nimport { kontantlaan } from './kontantlaan';\r\nimport { obligationslaan } from './obligationslaan';\r\n\r\nexport const performCalculation: LoanTypeCalculatorFunction = async (loan, inputs, apiUrl) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.log('performCalculation:', { loan, inputs, apiUrl });\r\n  }\r\n\r\n  switch (loan.type) {\r\n    case 'flexlife':\r\n      return flexlife(loan, inputs, apiUrl);\r\n\r\n    case 'obligationslaan':\r\n      return obligationslaan(loan, inputs, apiUrl);\r\n\r\n    case 'flexlaank':\r\n      return flexlaank(loan, inputs, apiUrl);\r\n\r\n    case 'flexlaant':\r\n      return flexlaant(loan, inputs, apiUrl);\r\n\r\n    case 'flexkort':\r\n      return flexkort(loan, inputs, apiUrl);\r\n\r\n    case 'kontantlaan':\r\n      return kontantlaan(loan, inputs, apiUrl);\r\n\r\n    case 'cibor6':\r\n      return cibor6(loan, inputs, apiUrl);\r\n\r\n    default:\r\n      console.warn('performCalculation not implemented for', loan.type);\r\n      await sleep(300);\r\n      return Promise.resolve(false);\r\n  }\r\n};\r\n","import cloneDeep from 'lodash/cloneDeep';\r\nimport { useCallback, useState } from 'react';\r\nimport { useBetween } from 'use-between';\r\nimport { performCalculation } from '../calculators/performCalculation';\r\nimport { getInitialLoansFromQueryOrSettings } from '../helpers/initial-loans';\r\nimport { LoanStateItem } from '../types/LoanStateItem';\r\nimport { useInputsState } from './inputsState';\r\nimport { useSettingsState } from './settingsState';\r\n\r\nconst useLoansStateFn = () => {\r\n  const [loans, setLoans] = useState<LoanStateItem[]>([]);\r\n  const [lastCalculationDate, setLastCalculationDate] = useState(Date.now().toString());\r\n\r\n  const { settings, apiUrl } = useSettingsState();\r\n  const {\r\n    propertyType,\r\n    ownerCategory,\r\n    propertyValue,\r\n    ownPayment,\r\n    remainingDebt,\r\n    wantedLoanAmount,\r\n    propertyCategory,\r\n  } = useInputsState();\r\n\r\n  /**\r\n   * Add a new loan\r\n   */\r\n  const addLoan = useCallback(() => {\r\n    setLoans((loans) => [...loans, { type: '', status: 'initial' }]);\r\n  }, []);\r\n\r\n  /**\r\n   * Remove a loan from the array\r\n   */\r\n  const removeLoan = useCallback((loanIndex: number) => {\r\n    setLoans((loans) => loans.filter((_, index) => index !== loanIndex));\r\n  }, []);\r\n\r\n  /**\r\n   * Set single loan data\r\n   */\r\n  const setLoan = useCallback((loanIndex: number, data: LoanStateItem) => {\r\n    setLoans((loans) => loans.map((loan, index) => (index === loanIndex ? data : loan)));\r\n  }, []);\r\n\r\n  /**\r\n   * Calculate a single loan and update the loan status and data.\r\n   */\r\n  const doCalculation = useCallback(\r\n    async (loanIndex: number, loanData: LoanStateItem) => {\r\n      // Gather inputs\r\n      if (propertyValue === null || ownPayment === null || wantedLoanAmount === null || remainingDebt === null) {\r\n        // If invalid inputs, skip calculation and just set to 'done'\r\n        setLoan(loanIndex, {\r\n          ...loanData,\r\n          status: 'initial',\r\n        });\r\n        return;\r\n      }\r\n\r\n      // Set loading\r\n      setLoan(loanIndex, {\r\n        ...loanData,\r\n        status: 'loading',\r\n      });\r\n\r\n      // Get the result\r\n      const result = await performCalculation(\r\n        loanData,\r\n        {\r\n          propertyType,\r\n          ownerCategory,\r\n          propertyValue,\r\n          wantedLoanAmount,\r\n          ownPayment,\r\n          remainingDebt,\r\n          propertyCategory,\r\n        },\r\n        apiUrl\r\n      );\r\n\r\n      // Set the result if it isn't false\r\n      if (result !== false) {\r\n        setLoan(loanIndex, {\r\n          ...result,\r\n          status: 'done',\r\n        });\r\n      } else {\r\n        // Set error status\r\n        setLoan(loanIndex, {\r\n          ...loanData,\r\n          status: 'error',\r\n        });\r\n      }\r\n    },\r\n    [\r\n      ownPayment,\r\n      propertyType,\r\n      propertyCategory,\r\n      ownerCategory,\r\n      propertyValue,\r\n      remainingDebt,\r\n      wantedLoanAmount,\r\n      apiUrl,\r\n      setLoan,\r\n    ]\r\n  );\r\n\r\n  /**\r\n   * Calculate single loan\r\n   */\r\n  const calculateSingleLoan = useCallback(\r\n    async (loanIndex: number) => {\r\n      // Get the loan\r\n      const loanData = cloneDeep(loans[loanIndex] || {});\r\n\r\n      // Do calculation\r\n      await doCalculation(loanIndex, loanData);\r\n\r\n      // Set new calculation date (triggers re-render of the tables)\r\n      setLastCalculationDate(Date.now().toString());\r\n    },\r\n    [doCalculation, loans]\r\n  );\r\n\r\n  /**\r\n   * Calculate all loans in the array\r\n   */\r\n  const calculateLoansFromScratch = useCallback(async () => {\r\n    await Promise.all(\r\n      loans.map(async (loan, loanIndex) => {\r\n        if (!loan.type) {\r\n          return;\r\n        }\r\n\r\n        // Get the default values from settings\r\n        const dataFromSettings = cloneDeep(settings.loans[loan.type] || {});\r\n        const loanData = {\r\n          type: loan.type,\r\n          ...dataFromSettings,\r\n        };\r\n\r\n        // Do calculation\r\n        await doCalculation(loanIndex, loanData);\r\n      })\r\n    );\r\n\r\n    // Set new calculation date (triggers re-render of the tables)\r\n    setLastCalculationDate(Date.now().toString());\r\n  }, [doCalculation, loans, settings.loans]);\r\n\r\n  /**\r\n   * Set loan type and do calculation\r\n   */\r\n  const setLoanTypeAndCalculate = useCallback(\r\n    async (loanIndex: number, type: string) => {\r\n      if (!type) {\r\n        setLoan(loanIndex, {\r\n          type,\r\n          status: 'initial',\r\n        });\r\n        return;\r\n      }\r\n\r\n      // Get the loan\r\n      const dataFromSettings = cloneDeep(settings.loans[type] || {});\r\n      const loanData = {\r\n        type,\r\n        ...dataFromSettings,\r\n      };\r\n\r\n      // Do calculation\r\n      await doCalculation(loanIndex, loanData);\r\n\r\n      // Set new calculation date (triggers re-render of the tables)\r\n      setLastCalculationDate(Date.now().toString());\r\n    },\r\n    [setLoan, doCalculation, settings.loans]\r\n  );\r\n\r\n  /**\r\n   * Set loan type and do calculation\r\n   */\r\n  const setLoanPayloadAndCalculate = useCallback(\r\n    async (loanIndex: number, payload: any, settings?: any, tableItems?: any, isStatic?: boolean) => {\r\n      // Get the loan\r\n      const loanFromArray = cloneDeep(loans[loanIndex] || {});\r\n      let loanData = {\r\n        ...loanFromArray,\r\n        payload,\r\n      };\r\n\r\n      if (settings) {\r\n        loanData = {\r\n          ...loanFromArray,\r\n          payload,\r\n          settings,\r\n        };\r\n      }\r\n\r\n      if (isStatic) {\r\n        loanData = {\r\n          ...loanFromArray,\r\n          payload,\r\n          settings,\r\n          tableItems,\r\n        };\r\n        setLoan(loanIndex, {\r\n          ...loanData,\r\n          status: 'done',\r\n        });\r\n      } else {\r\n        // Do calculation\r\n        await doCalculation(loanIndex, loanData);\r\n\r\n        // Set new calculation date (triggers re-render of the tables)\r\n        setLastCalculationDate(Date.now().toString());\r\n      }\r\n    },\r\n    [doCalculation, loans, setLoan]\r\n  );\r\n\r\n  /**\r\n   * Get and set the initial loans from either settings or query parameter\r\n   */\r\n  const setInitialLoansFromSettings = useCallback((settings: any) => {\r\n    const initialLoans = getInitialLoansFromQueryOrSettings(settings);\r\n    setLoans(\r\n      initialLoans.map((type) => {\r\n        const dataFromSettings = cloneDeep(settings.loans[type] || {});\r\n        return {\r\n          ...dataFromSettings,\r\n          type,\r\n          status: 'initial',\r\n        };\r\n      })\r\n    );\r\n  }, []);\r\n\r\n  /**\r\n   * Get and set the initial loans from either settings or query parameter\r\n   */\r\n  const setLoansAfterChange = useCallback((settings, selectedLoan) => {\r\n    if (settings.loans && Object.keys(settings).length > 0) {\r\n      const defaultLoans = settings?.table?.defaultLoans[selectedLoan];\r\n      setLoans(\r\n        defaultLoans.map((type) => {\r\n          const dataFromSettings = cloneDeep(settings.loans[type] || {});\r\n          return {\r\n            ...dataFromSettings,\r\n            type,\r\n            status: 'initial',\r\n          };\r\n        })\r\n      );\r\n    }\r\n  }, []);\r\n\r\n  return {\r\n    loans,\r\n    lastCalculationDate,\r\n    loansCount: loans.length,\r\n    addLoan,\r\n    setLoans,\r\n    removeLoan,\r\n    calculateSingleLoan,\r\n    calculateLoansFromScratch,\r\n    setLoanTypeAndCalculate,\r\n    setLoanPayloadAndCalculate,\r\n    setInitialLoansFromSettings,\r\n    setLoansAfterChange,\r\n  };\r\n};\r\n\r\nexport const useLoansState = () => useBetween(useLoansStateFn);\r\n","import { QUERY_KEY_LOANS } from '../config';\r\nimport { getQueryString } from './query';\r\n\r\nexport const getInitialLoansFromQueryOrSettings = (settings: any): string[] => {\r\n  // Get loan keys from settings\r\n  const loanKeys = Object.keys(settings.loans);\r\n\r\n  // Get query parameters\r\n  const queryTypes = getQueryString(QUERY_KEY_LOANS)\r\n    .split(',')\r\n    .filter((item) => item !== '');\r\n\r\n  // Get default loans from settings\r\n  const defaultLoans: string[] = Array.isArray(\r\n    settings?.table?.defaultLoans[Object.keys(settings?.table?.defaultLoans)[0]]\r\n  )\r\n    ? settings?.table?.defaultLoans[Object.keys(settings?.table?.defaultLoans)[0]]\r\n    : [];\r\n\r\n  // Filter loans by allowed keys in settings\r\n  const allowedLoans = queryTypes.filter((key) => loanKeys.indexOf(key) >= 0);\r\n\r\n  // Get final loans\r\n  const finalLoans = allowedLoans.length > 0 ? allowedLoans : defaultLoans;\r\n\r\n  return finalLoans;\r\n};\r\n","import { Container, Effects, Icons, mediaQuery, RddkTheme } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { DESKTOP_LABEL_COLUMN_WIDTH, MAX_LOANS_MOBILE } from '../../config';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useLoansState } from '../../state/loansState';\r\n\r\nexport const CalculatorDetailsLinks: React.FC = () => {\r\n  const { t } = useTranslation();\r\n  const { loans } = useLoansState();\r\n  const { setActiveLoan, setShowModal } = useInputsState();\r\n  const displayModal = React.useCallback(\r\n    (val) => {\r\n      setActiveLoan(val);\r\n      setShowModal(true);\r\n    },\r\n    [setShowModal, setActiveLoan]\r\n  );\r\n\r\n  return (\r\n    <>\r\n      <Container>\r\n        <Table>\r\n          <tbody>\r\n            <tr>\r\n              <td style={{ width: DESKTOP_LABEL_COLUMN_WIDTH }}></td>\r\n              {loans.map((loan, index) => {\r\n                if (loan.status === 'done') {\r\n                  return (\r\n                    <td key={index}>\r\n                      <ArrowLink onClick={() => displayModal(loan)}>\r\n                        {t('calculator-detail-link-label')} <Icons.ArrowLongRight />\r\n                      </ArrowLink>\r\n                    </td>\r\n                  );\r\n                }\r\n                return <td key={index}></td>;\r\n              })}\r\n            </tr>\r\n          </tbody>\r\n        </Table>\r\n      </Container>\r\n    </>\r\n  );\r\n};\r\n\r\nconst Table = styled.table`\r\n  width: 100%;\r\n  table-layout: fixed; /* IMPORTANT */\r\n\r\n  ${mediaQuery.lgDown} {\r\n    td:first-child,\r\n    td:nth-of-type(1n + ${MAX_LOANS_MOBILE + 2}) {\r\n      display: none;\r\n    }\r\n  }\r\n\r\n  td {\r\n    position: relative;\r\n    padding: 12px;\r\n    color: #212121;\r\n    vertical-align: top;\r\n    text-align: left;\r\n  }\r\n`;\r\n\r\nconst ArrowLink = styled.a`\r\n  display: inline-block;\r\n  position: relative;\r\n  font-size: 14px;\r\n  letter-spacing: 0.3px;\r\n  text-decoration: none;\r\n  white-space: nowrap;\r\n  transition: color 0.5s;\r\n  font-weight: 600;\r\n  cursor: pointer;\r\n\r\n  ${Effects.Underline(RddkTheme.colors.grey20)}\r\n\r\n  &:hover,\r\n  &:focus {\r\n    ${Effects.UnderlineHover}\r\n  }\r\n  svg {\r\n    width: 24px;\r\n    height: 18px;\r\n    vertical-align: bottom;\r\n\r\n    path {\r\n      fill: ${RddkTheme.colors.grey90};\r\n    }\r\n  }\r\n\r\n  ${mediaQuery.lgDown} {\r\n    white-space: normal;\r\n  }\r\n`;\r\n","import { RddkTheme } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { handleTranslation } from '../../../../shared/utils/handleTranslation';\r\nimport { InputsValidationResult } from '../../helpers/inputs';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useSettingsState } from '../../state/settingsState';\r\n\r\nexport type CalculatorInputsValidationMessageProps = {\r\n  result: InputsValidationResult;\r\n};\r\n\r\nexport const CalculatorInputsValidationMessage: React.FC<CalculatorInputsValidationMessageProps> = ({ result }) => {\r\n  const { t } = useTranslation();\r\n  const { loanType, propertyType, propertyValue, propertyCategory, remainingDebt, ownPayment } = useInputsState();\r\n  const { settings } = useSettingsState();\r\n  const showLendingType = settings?.inputs?.showLendingType === true;\r\n\r\n  // Check if the inputs are valid\r\n  const showError = showLendingType\r\n    ? ((propertyValue !== null && remainingDebt !== null) || (propertyValue !== null && remainingDebt == null)) &&\r\n      !result.isValid\r\n    : propertyValue !== null && ownPayment !== null && !result.isValid;\r\n\r\n  const showOwnPaymentNotice = result.errorCode === 'invalid-inputs' || result.isValid;\r\n  const checkText =\r\n    showLendingType && propertyCategory === ''\r\n      ? t(`calculator-inputs-lending-calculator-notice`)\r\n      : handleTranslation(`calculator-inputs-ownPayment-${propertyType}-notice`) || null;\r\n  const ownPaymentNotice = loanType\r\n    ? t(`calculator-inputs-ownPayment-notice`).replace('{PERCENTAGE}', t(`calculator-setting-ownPaymentProcentage`))\r\n    : checkText !== null\r\n    ? checkText.replace('{PERCENTAGE}', t(`calculator-setting-ownPaymentProcentage-${propertyType}`))\r\n    : '';\r\n  const errorMessage = t(`calculator-inputs-error-${result.errorCode}`);\r\n\r\n  return <Text showError={showError}>{showOwnPaymentNotice ? ownPaymentNotice : errorMessage}</Text>;\r\n};\r\n\r\nconst Text = styled.div<{ showError?: boolean }>`\r\n  margin-top: 15px;\r\n  margin-left: 20px;\r\n  margin-bottom: 30px;\r\n  font-size: 11px;\r\n  font-style: italic;\r\n  color: ${(props) => (props.showError ? RddkTheme.colors.red40 : RddkTheme.colors.grey80)};\r\n`;\r\n","import { BoxShadow, Col, Color, Container, mediaQuery, RddkTheme, Row, Select } from 'db-npm-rdui';\r\nimport uniq from 'lodash/uniq';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport NumberFormat from 'react-number-format';\r\nimport styled from 'styled-components';\r\nimport { useAdobeTracking } from '../../../../shared/hooks';\r\nimport { handleTranslation } from '../../../../shared/utils/handleTranslation';\r\nimport { FORMATTING_DECIMAL_SEPATOR, FORMATTING_THOUSAND_SEPATOR, HTML_ID_SUBMIT_BUTTON } from '../../config';\r\nimport { validateInputs } from '../../helpers/inputs';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { useSettingsState } from '../../state/settingsState';\r\nimport { CalculatorInputsValidationMessage } from './CalculatorInputsValidationMessage';\r\n\r\nexport type CalculatorInputsOnSubmit = (data: {\r\n  loanType: string;\r\n  propertyType: string;\r\n  ownerCategory: string;\r\n  wantedLoanAmount: number | null;\r\n  propertyValue: number | null;\r\n  ownPayment: number | null;\r\n  remainingDebt: number | null;\r\n  propertyCategory: string;\r\n}) => void;\r\n\r\nexport type CalculatorInputsProps = {\r\n  onSubmit?: CalculatorInputsOnSubmit;\r\n};\r\n\r\nexport const CalculatorInputs: React.FC<CalculatorInputsProps> = ({ onSubmit }) => {\r\n  const { t } = useTranslation();\r\n  const { settings } = useSettingsState();\r\n  const submitButtonRef = React.useRef<HTMLInputElement>(null);\r\n  const { setLoansAfterChange, loans } = useLoansState();\r\n  const {\r\n    loanType,\r\n    propertyType,\r\n    ownerCategory,\r\n    propertyValue,\r\n    wantedLoanAmount,\r\n    ownPayment,\r\n    remainingDebt,\r\n    ownPaymentVisible,\r\n    propertyCategory,\r\n    submitCounter,\r\n    setRecalculate,\r\n    setLoanType,\r\n    setPropertyType,\r\n    setOwnerCategory,\r\n    setPropertyValue,\r\n    setWantedLoanAmount,\r\n    setRemainingDebt,\r\n    setOwnPayment,\r\n    setPropertyCategory,\r\n    setOwnPaymentVisible,\r\n    setSubmitCounter,\r\n  } = useInputsState();\r\n  const { setLaunchData, trackCalculatorInteraction } = useAdobeTracking();\r\n  const [urlParam, setURLParam] = React.useState(false);\r\n  const loanList = loans.map((value) => value.type).join(' - ');\r\n\r\n  // Get \"ownPaymentProcentage\" from Sitecore dictionary\r\n  const checkText = handleTranslation(`calculator-setting-ownPaymentProcentage-${propertyType}`);\r\n  const ownPaymentProcentage =\r\n    checkText !== null\r\n      ? parseFloat(t(`calculator-setting-ownPaymentProcentage-${propertyType}`)) / 100\r\n      : (parseFloat(t(`calculator-setting-ownPaymentProcentage`)) || 5) / 100;\r\n\r\n  // Get \"showLoanTypesDropdown\" and \"showPropertyTypesDropdown\" from settings\r\n  //const showLoanTypesDropdown = settings?.inputs?.showLoanTypesDropdown === true;\r\n  const showPropertyTypesDropdown = settings?.inputs?.showPropertyTypesDropdown === true;\r\n  const showLendingType = settings?.inputs?.showLendingType === true;\r\n\r\n  // Check if the inputs are valid\r\n  const validationResult = validateInputs(\r\n    propertyValue,\r\n    ownPayment,\r\n    ownPaymentProcentage,\r\n    wantedLoanAmount,\r\n    remainingDebt,\r\n    ownPaymentVisible,\r\n    settings\r\n  );\r\n  const defaultPropertyTypeTypeSet = React.useRef(false);\r\n  const ownerCategorySet = React.useRef(false);\r\n\r\n  const propertyValuePropertyText = handleTranslation(`calculator-inputs-propertyValue-placeholder-${propertyType}`);\r\n  const ownPaymentPropertyText = handleTranslation(`calculator-inputs-ownPayment-placeholder-${propertyType}`);\r\n\r\n  const propertyValuePlaceholder =\r\n    propertyType && propertyValuePropertyText !== null\r\n      ? propertyValuePropertyText\r\n      : t(`calculator-inputs-propertyValue-placeholder`);\r\n  const wantedLoanAmountPlaceholder = t(`calculator-inputs-loan-amount-placeholder`);\r\n  const remainingDebtPlaceholder = t(`calculator-inputs-remaining-debt-placeholder`);\r\n  const ownPaymentPlaceholder =\r\n    propertyType && ownPaymentPropertyText !== null\r\n      ? ownPaymentPropertyText\r\n      : t(`calculator-inputs-ownPayment-placeholder`);\r\n\r\n  /**\r\n   * LOAN TYPE\r\n   */\r\n\r\n  // Get \"loanTypes\" string array from settings and memo it\r\n  const loanTypes = React.useMemo(() => {\r\n    return String(settings?.inputs?.loanTypes || '')\r\n      .split(',')\r\n      .map((i) => i.trim());\r\n  }, [settings]);\r\n\r\n  // Handler for changing the loan type\r\n  const onLoanTypeChange = React.useCallback(\r\n    (val: string) => {\r\n      setLoanType(val);\r\n    },\r\n    [setLoanType]\r\n  );\r\n\r\n  // Set default loan type\r\n  React.useEffect(() => {\r\n    if (loanType === '' && loanTypes.length > 0) {\r\n      onLoanTypeChange(loanTypes[0]);\r\n    }\r\n  }, [loanType, loanTypes, onLoanTypeChange]);\r\n\r\n  /**\r\n   * PROPERTY TYPE\r\n   */\r\n\r\n  // Get \"propertyTypes\" string array from settings and memo it\r\n  const propertyTypesInSettings = React.useMemo(() => {\r\n    return String(settings?.inputs?.propertyTypes || '')\r\n      .split(',')\r\n      .map((i) => i.trim());\r\n  }, [settings]);\r\n\r\n  // Get unique array of property types for 1. level dropdown and memo it\r\n  const propertyTypesInFirstDropdown = React.useMemo(() => {\r\n    return uniq(propertyTypesInSettings.map((i) => i.split('/')[0]));\r\n  }, [propertyTypesInSettings]);\r\n\r\n  // Handler for changing the property type\r\n  const onPropertyTypeChange = React.useCallback(\r\n    (val: string) => {\r\n      setPropertyType(val);\r\n      const loanValue = loanType !== '' ? loanType : loans.length > 0 ? loans[0].type : '';\r\n      // Check if the property type has owner categories defined. If it has, set the first one is active.\r\n      const firstOwnerCategory = propertyTypesInSettings.find((i) => i.startsWith(val + '/'));\r\n      if (firstOwnerCategory !== undefined) {\r\n        const newValue = val + '/' + firstOwnerCategory.split('/')[1];\r\n        setOwnerCategory(firstOwnerCategory.split('/')[1]);\r\n        setPropertyCategory(firstOwnerCategory.split('/')[2]);\r\n        setLoansAfterChange(settings, newValue);\r\n        setOwnPaymentVisible(false);\r\n        ownerCategorySet.current = true;\r\n        if ((ownPayment && propertyValue) || (showLendingType && propertyValue && remainingDebt)) {\r\n          setLaunchData({\r\n            calculator_info:\r\n              'loan_product:' +\r\n              loanValue +\r\n              ',property_type:' +\r\n              val +\r\n              ',property_category:' +\r\n              firstOwnerCategory.split('/')[2] +\r\n              ',own_value:' +\r\n              ownPayment +\r\n              ',wanted_loan_amount:' +\r\n              wantedLoanAmount +\r\n              ',remaining_debt:' +\r\n              remainingDebt,\r\n            loan_calculate_type: loanList,\r\n          });\r\n        }\r\n      } else {\r\n        setLoansAfterChange(settings, val);\r\n        if ((ownPayment && propertyValue) || (showLendingType && propertyValue && remainingDebt)) {\r\n          setLaunchData({\r\n            calculator_info:\r\n              'loan_product:' +\r\n              loanValue +\r\n              ',property_type:' +\r\n              val +\r\n              ',property_category:' +\r\n              propertyCategory +\r\n              ',own_value:' +\r\n              ownPayment +\r\n              ',wanted_loan_amount:' +\r\n              wantedLoanAmount +\r\n              ',remaining_debt:' +\r\n              remainingDebt,\r\n            loan_calculate_type: loanList,\r\n          });\r\n        }\r\n        setWantedLoanAmount(0);\r\n      }\r\n\r\n      if (!showLendingType) {\r\n        setRemainingDebt(0);\r\n      }\r\n\r\n      if (propertyValue) {\r\n        const checkText = handleTranslation(`calculator-setting-ownPaymentProcentage-${val}`);\r\n        const ownPaymentProcentage =\r\n          checkText !== null\r\n            ? parseFloat(t(`calculator-setting-ownPaymentProcentage-${val}`)) / 100\r\n            : (parseFloat(t(`calculator-setting-ownPaymentProcentage`)) || 5) / 100;\r\n        const newOwnPayment = Math.ceil(propertyValue * ownPaymentProcentage);\r\n        setOwnPayment(Math.ceil(newOwnPayment / 100) * 100);\r\n      }\r\n\r\n      if ((ownPayment && propertyValue) || (showLendingType && propertyValue && remainingDebt)) {\r\n        setTimeout(() => {\r\n          if (submitButtonRef.current) submitButtonRef.current.click();\r\n        }, 50);\r\n      }\r\n    },\r\n    [\r\n      ownPayment,\r\n      propertyValue,\r\n      settings,\r\n      showLendingType,\r\n      remainingDebt,\r\n      propertyCategory,\r\n      wantedLoanAmount,\r\n      loanType,\r\n      loans,\r\n      loanList,\r\n      setPropertyType,\r\n      setOwnerCategory,\r\n      setPropertyCategory,\r\n      setOwnPayment,\r\n      setLaunchData,\r\n      propertyTypesInSettings,\r\n      setLoansAfterChange,\r\n      setOwnPaymentVisible,\r\n      setWantedLoanAmount,\r\n      setRemainingDebt,\r\n      t,\r\n    ]\r\n  );\r\n\r\n  // Set default property type\r\n  React.useEffect(() => {\r\n    if (defaultPropertyTypeTypeSet.current && ownerCategorySet.current) return;\r\n    const url = new URL(window.location.href);\r\n    const hasType = url.searchParams.get('type')?.toString();\r\n    if (hasType && !urlParam) {\r\n      setPropertyType(hasType);\r\n      setWantedLoanAmount(0);\r\n      setRemainingDebt(0);\r\n      setURLParam(true);\r\n    }\r\n    if (showPropertyTypesDropdown && propertyType === '' && propertyTypesInFirstDropdown.length > 0) {\r\n      onPropertyTypeChange(propertyTypesInFirstDropdown[0]);\r\n      defaultPropertyTypeTypeSet.current = true;\r\n    }\r\n  }, [\r\n    propertyType,\r\n    propertyTypesInFirstDropdown,\r\n    showPropertyTypesDropdown,\r\n    urlParam,\r\n    setPropertyType,\r\n    setWantedLoanAmount,\r\n    setRemainingDebt,\r\n    setOwnPaymentVisible,\r\n    onPropertyTypeChange,\r\n    setURLParam,\r\n  ]);\r\n\r\n  /**\r\n   * OWNER CATEGORY\r\n   */\r\n\r\n  // Get array of owner category for 2. level dropdown and memo it\r\n  const ownerCategories = React.useMemo(() => {\r\n    if (propertyType === '') {\r\n      return [];\r\n    }\r\n    return propertyTypesInSettings\r\n      .filter((i) => i.startsWith(propertyType) && i.indexOf('/') >= 0)\r\n      .map((i) => i.split('/')[1]);\r\n  }, [propertyType, propertyTypesInSettings]);\r\n\r\n  // Handler for changing the owner category\r\n  const onOwnerCategoryChange = React.useCallback(\r\n    (val: string) => {\r\n      setOwnerCategory(val);\r\n      // Check if the property type has owner categories defined. If it has, set the property category.\r\n      const firstOwnerCategory = propertyTypesInSettings.find((i) => i.startsWith(propertyType + '/'));\r\n      if (firstOwnerCategory !== undefined) {\r\n        setPropertyCategory(firstOwnerCategory.split('/')[2]);\r\n        setLoansAfterChange(settings, propertyType + '/' + val);\r\n        setLaunchData({\r\n          calculator_info:\r\n            'loan_product:' + loanType !== ''\r\n              ? loanType\r\n              : loans[0].type +\r\n                ',property_type:' +\r\n                propertyType +\r\n                ',property_category:' +\r\n                val +\r\n                ',own_value:' +\r\n                ownPayment +\r\n                ',wanted_loan_amount:' +\r\n                wantedLoanAmount +\r\n                ',remaining_debt:' +\r\n                remainingDebt,\r\n          loan_calculate_type: loanList,\r\n        });\r\n        if (ownPayment && propertyValue) {\r\n          setTimeout(() => {\r\n            if (submitButtonRef.current) submitButtonRef.current.click();\r\n          }, 50);\r\n        }\r\n      }\r\n    },\r\n    [\r\n      settings,\r\n      propertyType,\r\n      ownPayment,\r\n      wantedLoanAmount,\r\n      remainingDebt,\r\n      loanType,\r\n      loans,\r\n      propertyValue,\r\n      submitButtonRef,\r\n      loanList,\r\n      setOwnerCategory,\r\n      setPropertyCategory,\r\n      propertyTypesInSettings,\r\n      setLoansAfterChange,\r\n      setLaunchData,\r\n    ]\r\n  );\r\n\r\n  /**\r\n   * PROPERTY VALUE\r\n   */\r\n\r\n  // Handler for changing the property value\r\n  const onPropertyValueChange = React.useCallback(\r\n    (val: number) => {\r\n      setPropertyValue(val);\r\n\r\n      // When changing this, we automatically update the \"ownPayment\" value also to a required minimum\r\n      const newOwnPayment = Math.ceil(val * ownPaymentProcentage);\r\n      setOwnPayment(Math.ceil(newOwnPayment / 100) * 100);\r\n      trackCalculatorInteraction();\r\n    },\r\n    [ownPaymentProcentage, setOwnPayment, setPropertyValue, trackCalculatorInteraction]\r\n  );\r\n\r\n  /**\r\n   * WANTED LOAN AMOUNT VALUE\r\n   */\r\n\r\n  // Handler for changing the property value\r\n  const onLoanAmountChange = React.useCallback(\r\n    (val: number) => {\r\n      setWantedLoanAmount(val);\r\n      onPropertyValueChange(2 * val);\r\n      trackCalculatorInteraction();\r\n    },\r\n    [setWantedLoanAmount, onPropertyValueChange, trackCalculatorInteraction]\r\n  );\r\n\r\n  /**\r\n   * OWN PAYMENT\r\n   */\r\n\r\n  // Handler for changing the own payment\r\n  const onOwnPaymentChange = React.useCallback(\r\n    (val: number) => {\r\n      setOwnPayment(val);\r\n      trackCalculatorInteraction();\r\n    },\r\n    [setOwnPayment, trackCalculatorInteraction]\r\n  );\r\n\r\n  /**\r\n   * OWN PAYMENT\r\n   */\r\n\r\n  // Handler for changing the own payment\r\n  const onRemainingDebtChange = React.useCallback(\r\n    (val: number) => {\r\n      setRemainingDebt(val);\r\n      trackCalculatorInteraction();\r\n    },\r\n    [setRemainingDebt, trackCalculatorInteraction]\r\n  );\r\n\r\n  const checkDecimal = React.useCallback((event) => {\r\n    if (event.key === '.' && !event.shiftKey) {\r\n      event.preventDefault();\r\n    }\r\n  }, []);\r\n\r\n  // Handler for rounding down the own payment to nearest 100 when leaving the input field to prevent API error\r\n  const onBlurChange = React.useCallback(\r\n    (e) => {\r\n      const strVal = e.target?.value || '';\r\n      const newVal = strVal.replace(/[\\.,]+/g, ''); //eslint-disable-line\r\n      const newOwnPayment = Math.floor(parseInt(newVal) / 100) * 100;\r\n      setOwnPayment(newOwnPayment);\r\n    },\r\n    [setOwnPayment]\r\n  );\r\n\r\n  const onLoanAmountBlurChange = React.useCallback(() => {\r\n    if (!ownPaymentVisible && wantedLoanAmount && wantedLoanAmount > 1000) {\r\n      const modifiedPropertyValue = Math.round(wantedLoanAmount / 1000) * 1000;\r\n      setWantedLoanAmount(modifiedPropertyValue);\r\n      setPropertyValue(2 * modifiedPropertyValue);\r\n    }\r\n  }, [ownPaymentVisible, wantedLoanAmount, setWantedLoanAmount, setPropertyValue]);\r\n\r\n  // Handler for rounding down the remaining debt to nearest 100 when leaving the input field\r\n  const onRemainingDebtBlurChange = React.useCallback(\r\n    (e) => {\r\n      const strVal = e.target?.value || '';\r\n      const newVal = strVal.replace(/[\\.,]+/g, ''); //eslint-disable-line\r\n      const newRemainingDebt = Math.floor(parseInt(newVal));\r\n      setRemainingDebt(newRemainingDebt);\r\n    },\r\n    [setRemainingDebt]\r\n  );\r\n\r\n  /**\r\n   * SUBMIT\r\n   */\r\n\r\n  // Handler for onSubmit event\r\n  const onSubmitHandler = async (e: React.FormEvent<HTMLFormElement>) => {\r\n    e.preventDefault();\r\n\r\n    // If inputs are invalid, then do nothing\r\n    if (!validationResult.isValid) {\r\n      return;\r\n    }\r\n\r\n    setSubmitCounter(submitCounter + 1);\r\n    if (submitCounter >= 1) {\r\n      setRecalculate(true);\r\n    }\r\n\r\n    // If a onSubmit function is provided, then call it\r\n    if (typeof onSubmit === 'function') {\r\n      onSubmit({\r\n        loanType,\r\n        ownerCategory,\r\n        propertyType,\r\n        propertyValue,\r\n        wantedLoanAmount,\r\n        ownPayment,\r\n        remainingDebt,\r\n        propertyCategory,\r\n      });\r\n    }\r\n  };\r\n\r\n  return (\r\n    <Container>\r\n      <Row>\r\n        <Col>\r\n          <Wrapper>\r\n            <div>\r\n              <FormContainer noValidate onSubmit={onSubmitHandler}>\r\n                {showPropertyTypesDropdown && (\r\n                  <InputColumn>\r\n                    <label>\r\n                      <Label>\r\n                        {ownerCategories.length > 0\r\n                          ? t('calculator-inputs-propertyType-label')\r\n                          : t('calculator-inputs-housingType-label')}\r\n                      </Label>\r\n                      {propertyTypesInFirstDropdown.length > 1 ? (\r\n                        <Select\r\n                          options={propertyTypesInFirstDropdown.map((item) => ({\r\n                            value: item,\r\n                            label: t(`calculator-inputs-propertyType-${item}`).toString(),\r\n                          }))}\r\n                          value={propertyType}\r\n                          onChange={(e) => onPropertyTypeChange(e.target.value)}\r\n                          isBold\r\n                          required\r\n                        />\r\n                      ) : (\r\n                        <StaticValue>\r\n                          {t(`calculator-inputs-propertyType-${propertyTypesInFirstDropdown[0]}`)}\r\n                        </StaticValue>\r\n                      )}\r\n                    </label>\r\n                  </InputColumn>\r\n                )}\r\n\r\n                {ownerCategories.length > 0 && (\r\n                  <InputColumn>\r\n                    <label>\r\n                      <Label>{t('calculator-inputs-ownerCategory-label')}</Label>\r\n                      {ownerCategories.length > 1 ? (\r\n                        <Select\r\n                          options={ownerCategories.map((item) => ({\r\n                            value: item,\r\n                            label: t(`calculator-inputs-ownerCategory-${item}`).toString(),\r\n                          }))}\r\n                          value={ownerCategory}\r\n                          onChange={(e) => onOwnerCategoryChange(e.target.value)}\r\n                          isBold\r\n                          required\r\n                        />\r\n                      ) : (\r\n                        <StaticValue>{t(`calculator-inputs-ownerCategory-${ownerCategories[0]}`)}</StaticValue>\r\n                      )}\r\n                    </label>\r\n                  </InputColumn>\r\n                )}\r\n\r\n                {ownerCategories.length === 0 && (\r\n                  <InputColumn>\r\n                    <label>\r\n                      <Label>{t('calculator-inputs-propertyValue-label')}</Label>\r\n                      <Input\r\n                        type=\"text\"\r\n                        thousandSeparator={FORMATTING_THOUSAND_SEPATOR}\r\n                        decimalSeparator={FORMATTING_DECIMAL_SEPATOR}\r\n                        decimalScale={2}\r\n                        onKeyPress={(e) => checkDecimal(e)}\r\n                        onValueChange={(e) => onPropertyValueChange(e.floatValue)}\r\n                        value={propertyValue}\r\n                        placeholder={propertyValuePlaceholder}\r\n                        required\r\n                      />\r\n                    </label>\r\n                  </InputColumn>\r\n                )}\r\n\r\n                {ownerCategories.length > 0 && (\r\n                  <InputColumn>\r\n                    <label>\r\n                      <Label>{t('calculator-inputs-loan-amount-label')}</Label>\r\n                      <Input\r\n                        type=\"text\"\r\n                        thousandSeparator={FORMATTING_THOUSAND_SEPATOR}\r\n                        decimalSeparator={FORMATTING_DECIMAL_SEPATOR}\r\n                        decimalScale={2}\r\n                        onKeyPress={(e) => checkDecimal(e)}\r\n                        onValueChange={(e) => onLoanAmountChange(e.floatValue)}\r\n                        onBlur={onLoanAmountBlurChange}\r\n                        value={wantedLoanAmount}\r\n                        placeholder={wantedLoanAmountPlaceholder}\r\n                        required\r\n                      />\r\n                    </label>\r\n                  </InputColumn>\r\n                )}\r\n\r\n                {!showLendingType && ownerCategories.length === 0 && (\r\n                  <InputColumn>\r\n                    <label>\r\n                      <Label>{t('calculator-inputs-ownPayment-label')}</Label>\r\n                      <Input\r\n                        type=\"text\"\r\n                        thousandSeparator={FORMATTING_THOUSAND_SEPATOR}\r\n                        decimalSeparator={FORMATTING_DECIMAL_SEPATOR}\r\n                        decimalScale={2}\r\n                        onKeyPress={(e) => checkDecimal(e)}\r\n                        onValueChange={(e) => onOwnPaymentChange(e.floatValue)}\r\n                        onBlur={(e) => onBlurChange(e)}\r\n                        value={ownPayment}\r\n                        placeholder={ownPaymentPlaceholder}\r\n                        required\r\n                      />\r\n                    </label>\r\n                  </InputColumn>\r\n                )}\r\n\r\n                {showLendingType && (\r\n                  <InputColumn>\r\n                    <label>\r\n                      <Label>{t('calculator-inputs-remainingDebt-label')}</Label>\r\n                      <Input\r\n                        type=\"text\"\r\n                        thousandSeparator={FORMATTING_THOUSAND_SEPATOR}\r\n                        decimalSeparator={FORMATTING_DECIMAL_SEPATOR}\r\n                        decimalScale={2}\r\n                        onKeyPress={(e) => checkDecimal(e)}\r\n                        onValueChange={(e) => onRemainingDebtChange(e.floatValue)}\r\n                        onBlur={(e) => onRemainingDebtBlurChange(e)}\r\n                        value={remainingDebt}\r\n                        placeholder={remainingDebtPlaceholder}\r\n                        required\r\n                      />\r\n                    </label>\r\n                  </InputColumn>\r\n                )}\r\n\r\n                <SubmitButton\r\n                  type=\"submit\"\r\n                  id={HTML_ID_SUBMIT_BUTTON}\r\n                  ref={submitButtonRef}\r\n                  value={t('calculator-inputs-submit-label').toString()}\r\n                />\r\n              </FormContainer>\r\n              <CalculatorInputsValidationMessage result={validationResult} />\r\n            </div>\r\n          </Wrapper>\r\n        </Col>\r\n      </Row>\r\n    </Container>\r\n  );\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n  ${mediaQuery.md} {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n  }\r\n`;\r\n\r\nconst FormContainer = styled.form`\r\n  display: flex;\r\n  flex-direction: column;\r\n  background: #fff;\r\n  border-radius: 6px;\r\n  box-shadow: ${BoxShadow.medium};\r\n  overflow: hidden;\r\n\r\n  ${mediaQuery.md} {\r\n    display: inline-flex;\r\n    flex-direction: row;\r\n  }\r\n`;\r\n\r\nconst InputColumn = styled.div`\r\n  width: 100%;\r\n  margin-bottom: 18px;\r\n  padding: 0 20px;\r\n\r\n  :first-child {\r\n    margin-top: 18px;\r\n  }\r\n\r\n  ${mediaQuery.md} {\r\n    width: 140px;\r\n    margin: 18px 0;\r\n    border-left: 1px solid ${Color.grey20};\r\n\r\n    :first-child {\r\n      border-left: 0;\r\n    }\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    width: 180px;\r\n  }\r\n\r\n  ${mediaQuery.xl} {\r\n    width: 200px;\r\n  }\r\n`;\r\n\r\nconst Label = styled.span`\r\n  display: block;\r\n  font-weight: 400;\r\n  font-size: 12px;\r\n  letter-spacing: 0.3px;\r\n  color: ${Color.grey90};\r\n  margin-bottom: 4px;\r\n`;\r\n\r\nconst Input = styled(NumberFormat)`\r\n  appearance: none;\r\n  border: 0;\r\n  border-radius: 0;\r\n  outline: none;\r\n  width: 100%;\r\n  padding: 0;\r\n  font-size: 1.063rem;\r\n  font-weight: 600;\r\n  color: #000;\r\n\r\n  ::-webkit-outer-spin-button,\r\n  ::-webkit-inner-spin-button {\r\n    -webkit-appearance: none;\r\n    margin: 0;\r\n  }\r\n\r\n  ::placeholder {\r\n    color: ${RddkTheme.colors.grey50};\r\n  }\r\n`;\r\n\r\nconst StaticValue = styled.span`\r\n  display: block;\r\n  font-size: 1.063rem;\r\n  font-weight: 600;\r\n  color: #000;\r\n`;\r\n\r\nconst SubmitButton = styled.input`\r\n  width: 100%;\r\n  border: 0;\r\n  padding: 20px 0;\r\n  background: #35a47a;\r\n  color: #fff;\r\n  font-weight: 600;\r\n  text-transform: uppercase;\r\n  cursor: pointer;\r\n  transition: background 0.3s;\r\n\r\n  ${mediaQuery.md} {\r\n    width: 140px;\r\n    padding: 0;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    width: 180px;\r\n  }\r\n\r\n  ${mediaQuery.xl} {\r\n    width: 200px;\r\n  }\r\n\r\n  :disabled {\r\n    cursor: auto;\r\n  }\r\n`;\r\n","import { LOAN_AMOUNT_MAXIMUM, LOAN_AMOUNT_MINIMUM, MINIMUM_LTV } from '../config';\r\n\r\nexport type InputsValidationErrorCode =\r\n  | 'invalid-inputs'\r\n  | 'own-payment-too-low'\r\n  | 'own-payment-too-high'\r\n  | 'property-value-too-low'\r\n  | 'property-value-too-high'\r\n  | 'loan-amount-value-too-low'\r\n  | 'loan-amount-value-too-high'\r\n  | 'remaining-debt-too-high'\r\n  | 'remaining-debt-too-low';\r\n\r\nexport type InputsValidationResult = {\r\n  isValid: boolean;\r\n  errorCode?: InputsValidationErrorCode;\r\n};\r\n\r\n/**\r\n * Check if the inputs are valid and can be submitted\r\n * @param propertyValue The property value\r\n * @param ownPayment The own payment amount\r\n * @param ownPaymentProcentage The own payment percentage\r\n */\r\nexport const validateInputs = (\r\n  propertyValue: number | null,\r\n  ownPayment: number | null,\r\n  ownPaymentProcentage: number,\r\n  wantedLoanAmount: number | null,\r\n  remainingDebt: number | null,\r\n  ownPaymentVisible: boolean,\r\n  settings\r\n): InputsValidationResult => {\r\n  // Check for invalid inputs\r\n  if (typeof propertyValue !== 'number' || typeof ownPayment !== 'number') {\r\n    return {\r\n      isValid: false,\r\n      errorCode: 'invalid-inputs',\r\n    };\r\n  }\r\n\r\n  // Check if loan amount is too low or too high\r\n  const modifiedWantedLoanAmount = wantedLoanAmount !== null ? wantedLoanAmount : 0;\r\n  //const modifiedRemainingDebt = remainingDebt !== null ? remainingDebt : 0;\r\n  const showLendingType = settings?.inputs?.showLendingType === true;\r\n  const loanAmount = ownPaymentVisible ? propertyValue * MINIMUM_LTV : modifiedWantedLoanAmount;\r\n  const minimumLoanAmount = settings?.inputs?.minimumLoanAmount || LOAN_AMOUNT_MINIMUM;\r\n  const maximumLoanAmount = settings?.inputs?.maxmumLoanAmount || LOAN_AMOUNT_MAXIMUM;\r\n  if (loanAmount < minimumLoanAmount) {\r\n    const errorCode = ownPaymentVisible ? 'property-value-too-low' : 'loan-amount-value-too-low';\r\n    return {\r\n      isValid: false,\r\n      errorCode: errorCode,\r\n    };\r\n  }\r\n  if (loanAmount > maximumLoanAmount) {\r\n    const errorCode = ownPaymentVisible ? 'property-value-too-high' : 'loan-amount-value-too-high';\r\n    return {\r\n      isValid: false,\r\n      errorCode: errorCode,\r\n    };\r\n  }\r\n\r\n  // Check if own payment is larger than property value\r\n  if (propertyValue < ownPayment + minimumLoanAmount) {\r\n    return {\r\n      isValid: false,\r\n      errorCode: 'own-payment-too-high',\r\n    };\r\n  }\r\n  // Check if own payment is too low\r\n  if (ownPayment < propertyValue * ownPaymentProcentage) {\r\n    return {\r\n      isValid: false,\r\n      errorCode: 'own-payment-too-low',\r\n    };\r\n  }\r\n\r\n  // Check if remaining debt is larger than property value\r\n  if (showLendingType && remainingDebt && remainingDebt > propertyValue * 0.8) {\r\n    return {\r\n      isValid: false,\r\n      errorCode: 'remaining-debt-too-high',\r\n    };\r\n  }\r\n\r\n  // Check if remaining debt is too low\r\n  if (showLendingType && (remainingDebt === null || isNaN(remainingDebt) || remainingDebt < 0)) {\r\n    return {\r\n      isValid: false,\r\n      errorCode: 'remaining-debt-too-low',\r\n    };\r\n  }\r\n\r\n  return {\r\n    isValid: true,\r\n  };\r\n};\r\n","import dayjs from 'dayjs';\r\nimport {\r\n  Button,\r\n  Cell,\r\n  ChironDown,\r\n  ChironUp,\r\n  Col,\r\n  Container,\r\n  DynamicTable,\r\n  Icons,\r\n  mediaQuery,\r\n  Modal,\r\n  RddkTheme,\r\n  Row,\r\n  Select,\r\n  Space,\r\n  TableSelector,\r\n  Visible,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { utils, write } from 'xlsx';\r\nimport { LabelDark } from '../../../../shared/components';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { CalculatorTooltipAdministrationFee } from '../tooltip/CalculatorTooltipAdministrationFee';\r\nimport { useAmortExcelData } from './hooks/useAmortExcelData';\r\n\r\ntype CalculatorModalProps = {\r\n  title: any;\r\n};\r\n\r\nconst ModalHeader = styled.div`\r\n  display: flex;\r\n  padding-top: 120px;\r\n  justify-content: center;\r\n  align-items: center;\r\n  flex-direction: column;\r\n  margin-bottom: 60px;\r\n\r\n  > select {\r\n    font-size: 32px;\r\n    font-family: 'IBM Plex Serif', serif;\r\n    font-weight: 500;\r\n    width: auto;\r\n    margin-top: 10px;\r\n    background-size: 20px;\r\n    padding-right: 30px;\r\n    background-position: 100% 70%;\r\n    line-height: 40px;\r\n    ${mediaQuery.md} {\r\n      line-height: 60px;\r\n      font-size: 41px;\r\n    }\r\n  }\r\n`;\r\n\r\nexport const CalculatorModal: React.FC<CalculatorModalProps> = ({ title }) => {\r\n  const { t } = useTranslation();\r\n  const { setShowModal, showModal, activeLoan, setActiveLoan } = useInputsState();\r\n  const { loans } = useLoansState();\r\n  const [showData, setShowData] = React.useState(false);\r\n  const [value, setValue] = React.useState(activeLoan?.type);\r\n  const [activeYear, setActiveYear] = React.useState('');\r\n  const [selectedTab, setTab] = React.useState(0);\r\n  const mappedData = activeLoan?.mappedData;\r\n  const excelData: (string | number)[][] = useAmortExcelData();\r\n\r\n  const closeModal = React.useCallback(() => {\r\n    setShowModal(false);\r\n    setTab(0);\r\n  }, [setShowModal, setTab]);\r\n\r\n  const dropdownOptions = [\r\n    ...loans.map((loan) => ({\r\n      value: loan.type,\r\n      label: t(`calculator-loan-${loan.type}-label`),\r\n    })),\r\n  ];\r\n\r\n  const onChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n    const newActiveloanValue = event.target.value;\r\n    setValue(newActiveloanValue);\r\n    const newActiveloanIndex = event.target.selectedIndex;\r\n    const newActiveloan = loans[newActiveloanIndex];\r\n    setActiveLoan(newActiveloan);\r\n    setActiveYear('');\r\n  };\r\n\r\n  const amortisationDataTable = React.useMemo(() => {\r\n    setShowData(false);\r\n    const rows: Cell[][] = [];\r\n    const showCashDebt: any =\r\n      activeLoan !== null && activeLoan.amortisationData && activeLoan.amortisationData[0].data.cashDebt ? true : false;\r\n\r\n    let tableHeader = [\r\n      {\r\n        value: t(`calculator-amortization-year-header`),\r\n        minWidth: 110,\r\n        width: 200,\r\n      },\r\n      {\r\n        value: t(`calculator-amortization-grossPayment-header`),\r\n        minWidth: 150,\r\n      },\r\n      {\r\n        value: t(`calculator-amortization-netPayment-header`),\r\n        minWidth: 150,\r\n      },\r\n      {\r\n        value: t(`calculator-amortization-installments-header`),\r\n        minWidth: showCashDebt ? 110 : 150,\r\n      },\r\n      {\r\n        value: t(`calculator-amortization-interest-header`),\r\n        minWidth: showCashDebt ? 110 : 150,\r\n      },\r\n      {\r\n        value: t(`calculator-amortization-adminFee-header`),\r\n        minWidth: 150,\r\n      },\r\n      {\r\n        value: t(`calculator-amortization-bondDept-header`),\r\n        minWidth: 150,\r\n      },\r\n    ];\r\n    if (showCashDebt) {\r\n      const cashDebt = {\r\n        value: t(`calculator-amortization-cashDept-header`),\r\n        minWidth: 150,\r\n      };\r\n      tableHeader.splice(6, 0, cashDebt);\r\n    }\r\n\r\n    // Add header row\r\n    rows.push(tableHeader);\r\n\r\n    if (activeLoan !== null) {\r\n      // Add all body rows\r\n      activeLoan.amortisationData?.forEach((row) => {\r\n        const isActiveYear = row.year === activeYear;\r\n        let rowData = [\r\n          {\r\n            // Year/termDate cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <strong style={{ cursor: 'pointer' }} onClick={() => setActiveYear(isActiveYear ? '' : row.year)}>\r\n                    {row.year} {isActiveYear ? <ChironUp /> : <ChironDown />}\r\n                  </strong>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{dayjs(m.month).format('DD.MM.YYYY')}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n          {\r\n            // grossPayment cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.data.grossPayment)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.grossPayment)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n          {\r\n            // netPayment cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.data.netPayment)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.netPayment)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n          {\r\n            // instalment cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.data.instalment)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.instalment)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n          {\r\n            // interest  cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.data.interest)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.interest)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n          {\r\n            // administrationFeeAmount cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.data.administrationFeeAmount)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.administrationFeeAmount)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n          {\r\n            // bondDebt cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.months[row.months.length - 1].data.bondDebt)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.bondDebt)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          },\r\n        ];\r\n\r\n        if (showCashDebt) {\r\n          const cashDebt: any = {\r\n            // cashDebt cell\r\n            cellRender: () => {\r\n              return (\r\n                <>\r\n                  <div>{formatAsCurrency(row.months[row.months.length - 1].data.cashDebt)}</div>\r\n                  {isActiveYear && (\r\n                    <div\r\n                      style={{\r\n                        marginTop: 20,\r\n                        fontSize: 14,\r\n                        lineHeight: '30px',\r\n                      }}\r\n                    >\r\n                      {row.months.map((m) => (\r\n                        <div key={m.month}>{formatAsCurrency(m.data.cashDebt)}</div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </>\r\n              );\r\n            },\r\n          };\r\n          rowData.splice(6, 0, cashDebt);\r\n        }\r\n        rows.push(rowData);\r\n      });\r\n    }\r\n    setTimeout(() => {\r\n      setShowData(true);\r\n    }, 0);\r\n    return rows;\r\n  }, [activeLoan, activeYear, t, setShowData]);\r\n\r\n  const downloadSpreadsheet = () => {\r\n    const fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';\r\n\r\n    const workSheet = utils.aoa_to_sheet(excelData);\r\n\r\n    // Generate a Work Book containing the above sheet.\r\n    const workBook = {\r\n      Sheets: { Ydelsesforløb: workSheet, cols: [] },\r\n      SheetNames: ['Ydelsesforløb'],\r\n    };\r\n\r\n    // Exporting the file with the desired name and extension.\r\n    const excelBuffer = write(workBook, {\r\n      bookType: 'xlsx',\r\n      type: 'array',\r\n    });\r\n\r\n    const fileData = new Blob([excelBuffer], { type: fileType });\r\n\r\n    const today = new Date();\r\n    const yyyy = today.getFullYear();\r\n    const mm = today.getMonth() + 1; // Months start at 0!\r\n    const dd = today.getDate();\r\n    const formattedToday = `${dd}.${mm}.${yyyy}`;\r\n\r\n    const loanType = t(`calculator-loan-${activeLoan?.type}-label`);\r\n    const filename = `Ydelsesforløb for ${loanType} ${formattedToday}`;\r\n\r\n    const downloadURL = URL.createObjectURL(fileData);\r\n    const downloadLink = document.createElement('a');\r\n    document.body.appendChild(downloadLink);\r\n    downloadLink.download = `${filename}.xlsx`;\r\n    downloadLink.href = downloadURL;\r\n    downloadLink.click();\r\n    document.body.removeChild(downloadLink);\r\n  };\r\n\r\n  React.useEffect(() => {\r\n    setValue(activeLoan?.type);\r\n  }, [activeLoan, setValue]);\r\n\r\n  return (\r\n    <Modal\r\n      open={showModal}\r\n      handleClose={closeModal}\r\n      ariaCloseLabel={'Close'}\r\n      backgroundColor={RddkTheme.colors.grey90}\r\n      fullscreen\r\n    >\r\n      <ModalHeader>\r\n        <LabelDark field={title} />\r\n        <Select value={value} isDark={true} options={dropdownOptions || []} onChange={onChangeHandler} />\r\n      </ModalHeader>\r\n      <Container>\r\n        <Row justify=\"center\">\r\n          <Col sm={10}>\r\n            <StyledDiv>\r\n              <TableSelector selectedIndex={0} isDarkTheme={true}>\r\n                <div onClick={() => setTab(0)}>Ydelsesforløb</div>\r\n                <div onClick={() => setTab(1)}>Omkostninger</div>\r\n              </TableSelector>\r\n              <Space top={16}></Space>\r\n              {selectedTab === 0 && (\r\n                <Button variant=\"secondary\" onClick={downloadSpreadsheet} style={{ height: '35px', zIndex: 0 }}>\r\n                  <React.Fragment key=\".0\">\r\n                    {t(`calculator-amortization-download-button`)} <Icons.Download />\r\n                  </React.Fragment>\r\n                </Button>\r\n              )}\r\n            </StyledDiv>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n      <ModalContainer>\r\n        {showData && (\r\n          <Container>\r\n            {selectedTab === 0 && (\r\n              <div>\r\n                <Visible xs sm md>\r\n                  <DynamicTable\r\n                    bordered\r\n                    data={amortisationDataTable}\r\n                    firstRowIsHead\r\n                    striped\r\n                    firstColumnIsSticky\r\n                    isFromDialog\r\n                  />\r\n                </Visible>\r\n                <Visible lg xl xxl>\r\n                  <DynamicTable\r\n                    bordered\r\n                    data={amortisationDataTable}\r\n                    firstRowIsHead\r\n                    striped\r\n                    tableHeaderIsSticky\r\n                    firstColumnIsSticky\r\n                    isFromDialog\r\n                  />\r\n                </Visible>\r\n              </div>\r\n            )}\r\n            {selectedTab === 1 && (\r\n              <div>\r\n                <CalculatorTooltipAdministrationFee {...mappedData} isFromOverlay={true} />\r\n              </div>\r\n            )}\r\n          </Container>\r\n        )}\r\n      </ModalContainer>\r\n    </Modal>\r\n  );\r\n};\r\n\r\nconst ModalContainer = styled.div`\r\n  padding: 50px;\r\n`;\r\n\r\nconst StyledDiv = styled.div`\r\n  display: flex;\r\n  flex-direction: row;\r\n  justify-content: space-between;\r\n  ${mediaQuery.lgDown} {\r\n    flex-direction: column;\r\n  }\r\n`;\r\n","import dayjs from 'dayjs';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useInputsState } from '../../../state/inputsState';\r\n\r\nexport function useAmortExcelData() {\r\n  const { t } = useTranslation();\r\n  const { activeLoan } = useInputsState();\r\n  const showCashDebt =\r\n    activeLoan !== null && activeLoan.amortisationData && activeLoan.amortisationData[0].data.cashDebt ? true : false;\r\n\r\n  let tableHeader = [\r\n    t(`calculator-amortization-year-header`),\r\n    t(`calculator-amortization-grossPayment-header`),\r\n    t(`calculator-amortization-netPayment-header`),\r\n    t(`calculator-amortization-installments-header`),\r\n    t(`calculator-amortization-interest-header`),\r\n    t(`calculator-amortization-adminFee-header`),\r\n    t(`calculator-amortization-bondDept-header`),\r\n  ];\r\n\r\n  if (showCashDebt) {\r\n    tableHeader.splice(6, 0, t(`calculator-amortization-cashDept-header`));\r\n  }\r\n\r\n  let data: (string | number)[][] = [];\r\n\r\n  data.push(tableHeader);\r\n\r\n  if (activeLoan !== null) {\r\n    activeLoan?.amortisationData?.forEach((row) => {\r\n      row?.months?.map((month) => {\r\n        const row = [\r\n          dayjs(month.month).format('DD.MM.YYYY'),\r\n          month.data.grossPayment,\r\n          month.data.netPayment,\r\n          month.data.instalment,\r\n          month.data.interest,\r\n          month.data.administrationFeeAmount,\r\n          month.data.bondDebt,\r\n        ];\r\n        if (showCashDebt) {\r\n          row.splice(6, 0, month.data.cashDebt);\r\n        }\r\n        data.push(row);\r\n      });\r\n    });\r\n  }\r\n\r\n  return data;\r\n}\r\n","import { Box, Container, DynamicTable, Hidden, Icons, mediaQuery, RddkTheme, Visible } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled, { css } from 'styled-components';\r\nimport { formatAsCurrency } from '../../../../shared/utils/currency';\r\nimport { DESKTOP_LABEL_COLUMN_WIDTH, MAX_LOANS_MOBILE } from '../../config';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\nexport const CalculatorStickyBar: React.FC = () => {\r\n  const { t } = useTranslation();\r\n  const { loans } = useLoansState();\r\n  // const { setShowModal, setActiveLoan } = useInputsState();\r\n  const [showBeforeTax, setShowBeforeTax] = React.useState(true);\r\n\r\n  // Count loans with type set\r\n  // Temporariliy commented out becuse of obscure legal reason - todo: create function that only shows sticky bar after the user has scrolled - note that you must distingues the automatic scroll that happens on calculate from this...\r\n  // const hasLoans =loans.filter((l) => l.type && l.status === 'done').length > 0;\r\n  const hasLoans = false;\r\n\r\n  // Handler for clicking the flip arrows\r\n  const toggleView = () => setShowBeforeTax(!showBeforeTax);\r\n\r\n  // Buttons to change view\r\n  const buttons = (\r\n    <Buttons>\r\n      <Button onClick={toggleView} disabled={showBeforeTax} title={t('calculator-bar-showBeforeTax')}>\r\n        <UpIcon active={!showBeforeTax}>\r\n          <Icons.Chiron />\r\n        </UpIcon>\r\n      </Button>\r\n      <Button onClick={toggleView} disabled={!showBeforeTax} title={t('calculator-bar-showAfterTax')}>\r\n        <DownIcon active={showBeforeTax}>\r\n          <Icons.Chiron />\r\n        </DownIcon>\r\n      </Button>\r\n    </Buttons>\r\n  );\r\n\r\n  // The label column on top (on mobile)\r\n  const mobileLabelColumn = {\r\n    value: (\r\n      <Box position=\"relative\" height={14}>\r\n        {buttons}\r\n        <Box position=\"relative\">\r\n          <Text show={showBeforeTax} up>\r\n            {t('calculator-bar-monthlyPaymentBeforeTax')}\r\n          </Text>\r\n          <Text show={!showBeforeTax}>{t('calculator-bar-monthlyPaymentAfterTax')}</Text>\r\n        </Box>\r\n      </Box>\r\n    ),\r\n    colSpan: Math.min(loans.length, MAX_LOANS_MOBILE),\r\n    style: {\r\n      borderColor: RddkTheme.colors.grey60,\r\n      backgroundColor: RddkTheme.colors.grey90,\r\n    },\r\n  };\r\n\r\n  // The label column on the left (on desktop)\r\n  const desktopLabelColumn = {\r\n    value: (\r\n      <Box position=\"relative\">\r\n        <Title>{t('calculator-bar-monthlyPayment')}</Title>\r\n        {buttons}\r\n        <Box position=\"relative\">\r\n          <Text show={showBeforeTax} up>\r\n            {t('calculator-bar-beforeTax')}\r\n          </Text>\r\n          <Text show={!showBeforeTax}>{t('calculator-bar-afterTax')}</Text>\r\n        </Box>\r\n      </Box>\r\n    ),\r\n    width: DESKTOP_LABEL_COLUMN_WIDTH,\r\n    style: {\r\n      borderBottom: 0,\r\n      borderColor: RddkTheme.colors.grey60,\r\n      backgroundColor: RddkTheme.colors.grey90,\r\n    },\r\n  };\r\n\r\n  /**\r\n   * Function that renders a loan as the table cell value\r\n   */\r\n  const renderLoan = (loan: LoanStateItem) => {\r\n    if (!loan.type) {\r\n      return null;\r\n    }\r\n\r\n    // const onClickHandler = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\r\n    //   e.preventDefault();\r\n    //   setActiveLoan(loan);\r\n    //   setShowModal(true);\r\n    // };\r\n\r\n    const beforeTax = loan.stickyValues ? `${formatAsCurrency(loan.stickyValues.monthlyGrossPaymentYearOne)} DKK` : `-`;\r\n    const afterTax = loan.stickyValues ? `${formatAsCurrency(loan.stickyValues.monthlyNetPaymentYearOne)} DKK` : `-`;\r\n\r\n    return (\r\n      <Box position=\"relative\" height={{ _: 30, lg: 42 }} maxWidth={{ _: 200, sm: 320, lg: 400 }}>\r\n        {/* <ArrowLink href=\"#\" onClick={onClickHandler}>\r\n          <Icons.ArrowLongRight />\r\n        </ArrowLink> */}\r\n        <Title>{t(`calculator-loan-${loan.type}-label`)}</Title>\r\n        <Box position=\"relative\">\r\n          <Text show={showBeforeTax} up>\r\n            {beforeTax}\r\n          </Text>\r\n          <Text show={!showBeforeTax}>{afterTax}</Text>\r\n        </Box>\r\n      </Box>\r\n    );\r\n  };\r\n\r\n  /**\r\n   * Iterate through all loans and render them\r\n   */\r\n  const loansRendered = loans.map((loan) => {\r\n    return {\r\n      value: renderLoan(loan),\r\n      style: {\r\n        borderBottom: 0,\r\n        borderColor: RddkTheme.colors.grey60,\r\n        backgroundColor: RddkTheme.colors.grey90,\r\n      },\r\n    };\r\n  });\r\n\r\n  return (\r\n    <Wrapper show={hasLoans}>\r\n      <StyledContainer>\r\n        <Bar>\r\n          <Visible xs sm md>\r\n            <DynamicTable data={[[mobileLabelColumn], [...loansRendered]]} />\r\n          </Visible>\r\n          <Hidden xs sm md>\r\n            <DynamicTable data={[[desktopLabelColumn, ...loansRendered]]} />\r\n          </Hidden>\r\n        </Bar>\r\n      </StyledContainer>\r\n    </Wrapper>\r\n  );\r\n};\r\n\r\nconst Wrapper = styled.div<{ show?: boolean }>`\r\n  position: fixed;\r\n  z-index: 500;\r\n  left: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  transform: translateY(500px);\r\n  transition: transform 0.5s;\r\n\r\n  ${(props) =>\r\n    props.show &&\r\n    css`\r\n      transform: translateY(-5px);\r\n      ${mediaQuery.lgDown} {\r\n        transform: translateY(0);\r\n      }\r\n    `}\r\n\r\n  table {\r\n    table-layout: fixed; /* IMPORTANT */\r\n\r\n    ${mediaQuery.lgDown} {\r\n      td:nth-of-type(1n + ${MAX_LOANS_MOBILE + 1}) {\r\n        display: none;\r\n      }\r\n    }\r\n  }\r\n\r\n  td {\r\n    position: relative;\r\n  }\r\n`;\r\n\r\nconst StyledContainer = styled(Container)`\r\n  ${mediaQuery.mdDown} {\r\n    padding-left: 0 !important;\r\n    padding-right: 0 !important;\r\n    max-width: 100% !important;\r\n  }\r\n`;\r\n\r\nconst Bar = styled.div`\r\n  background: ${RddkTheme.colors.grey30};\r\n  border-radius: 5px 5px 0 0;\r\n  box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.25), 0 3px 4px 0 rgba(0, 0, 0, 0.05);\r\n`;\r\n\r\nconst Buttons = styled.div`\r\n  display: flex;\r\n  flex-direction: row;\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  z-index: 1;\r\n\r\n  ${mediaQuery.lg} {\r\n    top: 2px;\r\n    flex-direction: column;\r\n  }\r\n`;\r\n\r\nconst Button = styled.button`\r\n  border: none;\r\n  margin: 0;\r\n  padding: 0;\r\n  width: auto;\r\n  overflow: visible;\r\n  background: transparent;\r\n  color: inherit;\r\n  font: inherit;\r\n  line-height: normal;\r\n  -webkit-font-smoothing: inherit;\r\n  -moz-osx-font-smoothing: inherit;\r\n  -webkit-appearance: none;\r\n  outline: none;\r\n\r\n  &:hover {\r\n    cursor: pointer;\r\n  }\r\n\r\n  &:disabled {\r\n    &:hover {\r\n      cursor: auto;\r\n    }\r\n  }\r\n\r\n  ${mediaQuery.lgDown} {\r\n    margin-left: 15px;\r\n  }\r\n`;\r\n\r\nconst UpIcon = styled.span<{ active?: boolean }>`\r\n  position: relative;\r\n  left: 2px;\r\n  display: inline-block;\r\n  opacity: ${(props) => (props.active ? 1 : 0.4)};\r\n  transform: rotate(-90deg);\r\n  transition: opacity 0.3s;\r\n\r\n  svg path {\r\n    stroke: ${RddkTheme.colors.grey20};\r\n  }\r\n\r\n  ${mediaQuery.lgDown} {\r\n    transform: rotate(-180deg);\r\n    top: -4px;\r\n  }\r\n`;\r\n\r\nconst DownIcon = styled(UpIcon)`\r\n  left: -2px;\r\n  transform: rotate(90deg);\r\n\r\n  ${mediaQuery.lgDown} {\r\n    top: 0;\r\n    transform: rotate(0);\r\n  }\r\n`;\r\n\r\nconst Title = styled.div`\r\n  font-size: 11px;\r\n  font-weight: 600;\r\n  line-height: 1.25;\r\n  letter-spacing: 0.8px;\r\n  color: ${RddkTheme.colors.grey40};\r\n  text-transform: uppercase;\r\n  margin-bottom: 3px;\r\n\r\n  ${mediaQuery.lg} {\r\n    font-size: 12px;\r\n  }\r\n`;\r\n\r\nconst Text = styled.div<{ up?: boolean; show?: boolean }>`\r\n  position: absolute;\r\n  font-size: 15px;\r\n  font-weight: 600;\r\n  line-height: 1.08;\r\n  letter-spacing: -0.3px;\r\n  color: ${RddkTheme.colors.white};\r\n  transition: all 0.4s;\r\n  opacity: 0;\r\n  transform: ${(props) => (props.up ? 'translateY(10px)' : 'translateY(-10px)')};\r\n  perspective: 100px;\r\n  ${(props) =>\r\n    props.show &&\r\n    css`\r\n      opacity: 1;\r\n      transform: translateY(0);\r\n    `}\r\n\r\n  ${mediaQuery.lg} {\r\n    font-size: 24px;\r\n  }\r\n`;\r\n\r\n// const ArrowLink = styled.a`\r\n//   display: block;\r\n//   position: absolute;\r\n//   top: 5px;\r\n//   right: 0;\r\n\r\n//   ${mediaQuery.lg} {\r\n//     top: 10px;\r\n//   }\r\n\r\n//   svg {\r\n//     width: 24px;\r\n//     height: 24px;\r\n\r\n//     path {\r\n//       fill: ${RddkTheme.colors.grey20};\r\n//     }\r\n//   }\r\n// `;\r\n","import flatMap from 'lodash/flatMap';\r\nimport { FieldKey, FieldKeys } from '../types/FieldKey';\r\nimport { LoanStateItem } from '../types/LoanStateItem';\r\n\r\n/**\r\n * Filter the fieldKeys based on whats being displayed from the loans\r\n */\r\nexport const getFieldKeysToDisplay = (fieldKeys: FieldKeys, loans: LoanStateItem[]): FieldKey[] => {\r\n  const fieldKeysInUse = flatMap(loans, (l) => l.tableItems || []).map((item) => item.fieldKey);\r\n\r\n  if (fieldKeysInUse.length <= 0) {\r\n    return [...fieldKeys];\r\n  }\r\n\r\n  return [...fieldKeys].filter((key) => fieldKeysInUse.indexOf(key) >= 0);\r\n};\r\n","import { mediaQuery, Select } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { TableItemDropdown } from '../../types/TableItem';\r\n\r\ntype CalculatorDropdownFieldProps = {\r\n  tableItem: TableItemDropdown;\r\n  onChangeValue: (value: any) => void;\r\n};\r\n\r\nconst shouldComponentUpdate = (prevProps: CalculatorDropdownFieldProps, nextProps: CalculatorDropdownFieldProps) => {\r\n  return prevProps.tableItem.value !== nextProps.tableItem.value;\r\n};\r\n\r\nexport const CalculatorDropdownField: React.FC<CalculatorDropdownFieldProps> = React.memo(\r\n  ({ tableItem, onChangeValue }) => {\r\n    const [value, setValue] = React.useState(tableItem.value);\r\n\r\n    const onChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n      const newValue = event.target.value;\r\n\r\n      // Set value internally in this component for faster re-render\r\n      setValue(newValue);\r\n\r\n      // Trigger the change event for recalculation\r\n      onChangeValue(newValue);\r\n    };\r\n\r\n    return (\r\n      <Container>\r\n        <Select value={value} options={tableItem.options || []} onChange={onChangeHandler} />\r\n      </Container>\r\n    );\r\n  },\r\n  shouldComponentUpdate\r\n);\r\n\r\nconst Container = styled.div`\r\n  > select {\r\n    width: auto;\r\n    padding-right: 20px;\r\n    cursor: pointer;\r\n    font-size: 14px;\r\n\r\n    ${mediaQuery.sm} {\r\n      font-size: 16px;\r\n    }\r\n  }\r\n`;\r\n","import { Color, Icons, Tooltip, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport NumberFormat from 'react-number-format';\r\nimport styled from 'styled-components';\r\nimport { FORMATTING_DECIMAL_SEPATOR, FORMATTING_THOUSAND_SEPATOR } from '../../config';\r\nimport { TableItemInput } from '../../types/TableItem';\r\n\r\ntype CalculatorInputFieldProps = {\r\n  tableItem: TableItemInput;\r\n  onChangeValue: (value: any) => void;\r\n  hasError?: any;\r\n};\r\n\r\nconst shouldComponentUpdate = (prevProps: CalculatorInputFieldProps, nextProps: CalculatorInputFieldProps) => {\r\n  return prevProps.tableItem.value !== nextProps.tableItem.value;\r\n};\r\n\r\nexport const CalculatorInputField: React.FC<CalculatorInputFieldProps> = React.memo(\r\n  ({ tableItem, onChangeValue, hasError }) => {\r\n    const [value, setValue] = React.useState(tableItem.value);\r\n    const inputFieldRef = React.useRef<HTMLInputElement>(null);\r\n    const [showText, setShowText] = React.useState(\r\n      typeof tableItem.additionalText === 'string' && tableItem.additionalText?.length\r\n    ); // Text below additional lending value\r\n\r\n    const onChangeHandler = (e: any) => {\r\n      let newValue = e.floatValue;\r\n\r\n      if (newValue === undefined) {\r\n        return;\r\n      }\r\n\r\n      // Set value internally in this component for faster re-render\r\n      setValue(newValue);\r\n\r\n      // Trigger the change event for recalculation\r\n      onChangeValue(newValue);\r\n\r\n      // Remove the text below additional lending value\r\n      setShowText(false);\r\n    };\r\n\r\n    const submitHandler = (event: any) => {\r\n      event.preventDefault();\r\n    };\r\n\r\n    return (\r\n      <Container>\r\n        <form onSubmit={submitHandler}>\r\n          <Input\r\n            ref={inputFieldRef}\r\n            className={tableItem.hasError && tableItem.hasError.error ? 'error' : ''}\r\n            suffix={tableItem.suffix ? tableItem.suffix : ''}\r\n            type=\"tel\"\r\n            thousandSeparator={FORMATTING_THOUSAND_SEPATOR}\r\n            decimalSeparator={FORMATTING_DECIMAL_SEPATOR}\r\n            decimalScale={2}\r\n            onValueChange={onChangeHandler}\r\n            value={value}\r\n          />\r\n          <IconButton>\r\n            {tableItem.hasError && tableItem.hasError.error ? (\r\n              <span className=\"tooltip\">\r\n                <Tooltip element={<Icons.Action.Alert />} content={tableItem.hasError.errorMsg} />\r\n              </span>\r\n            ) : (\r\n              <span style={{ color: 'red' }}>\r\n                Tilpas <span style={{ marginRight: '0.25rem' }}></span> <Icons.Action.Edit />\r\n              </span>\r\n            )}\r\n          </IconButton>\r\n        </form>\r\n        {showText ? (\r\n          <Typography type=\"image\" style={{ marginTop: '5px', fontSize: '11px' }}>\r\n            {' '}\r\n            {tableItem.additionalText}{' '}\r\n          </Typography>\r\n        ) : (\r\n          ''\r\n        )}\r\n      </Container>\r\n    );\r\n  },\r\n  shouldComponentUpdate\r\n);\r\n\r\nconst Container = styled.div`\r\n  position: relative;\r\n`;\r\n\r\nconst Input = styled(NumberFormat)`\r\n  width: 100%;\r\n  margin: 0;\r\n  padding: 0;\r\n  border: 0;\r\n  border-radius: 0;\r\n  border-bottom: 1px dashed transparent;\r\n  outline: none;\r\n  background: transparent;\r\n  transition: border-color 0.5s ease;\r\n\r\n  :hover,\r\n  :active,\r\n  :focus {\r\n    border-color: ${Color.grey50};\r\n  }\r\n\r\n  &.error {\r\n    color: ${Color.red50};\r\n    border-color: ${Color.red50};\r\n  }\r\n`;\r\n\r\nconst IconButton = styled.span`\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  pointer-events: none;\r\n\r\n  .tooltip {\r\n    pointer-events: auto;\r\n    path {\r\n      fill: ${Color.red50};\r\n    }\r\n  }\r\n\r\n  path {\r\n    stroke: ${Color.grey100};\r\n  }\r\n`;\r\n","import { mediaQuery, Slider } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { TableItemSlider } from '../../types/TableItem';\r\n\r\ntype CalculatorSliderFieldProps = {\r\n  tableItem: TableItemSlider;\r\n  onChangeValue: (value: any) => void;\r\n};\r\n\r\nconst shouldComponentUpdate = (prevProps: CalculatorSliderFieldProps, nextProps: CalculatorSliderFieldProps) => {\r\n  return prevProps.tableItem.value !== nextProps.tableItem.value;\r\n};\r\n\r\nexport const CalculatorSliderField: React.FC<CalculatorSliderFieldProps> = React.memo(\r\n  ({ tableItem, onChangeValue }) => {\r\n    const [value, setValue] = React.useState(tableItem.value);\r\n\r\n    const onChangeHandler = (val: any) => {\r\n      const newValue = parseFloat(val) || 0;\r\n\r\n      // Set value internally in this component for faster re-render\r\n      setValue(newValue);\r\n\r\n      // Trigger the change event for recalculation\r\n      onChangeValue(newValue);\r\n    };\r\n\r\n    const suffix = tableItem.suffix ? tableItem.suffix : '';\r\n\r\n    return (\r\n      <Container>\r\n        <Value>\r\n          {value}\r\n          {suffix}\r\n        </Value>\r\n        <Slider\r\n          onChange={onChangeHandler}\r\n          min={tableItem.min}\r\n          max={tableItem.max}\r\n          value={value}\r\n          selectSuffix={suffix}\r\n          selectWidth=\"auto\"\r\n          breakpoint={992}\r\n        />\r\n      </Container>\r\n    );\r\n  },\r\n  shouldComponentUpdate\r\n);\r\n\r\nconst Container = styled.div`\r\n  display: flex;\r\n  flex-direction: row;\r\n  align-items: center;\r\n\r\n  select {\r\n    width: auto;\r\n    padding-right: 20px;\r\n    cursor: pointer;\r\n    font-size: 14px;\r\n\r\n    ${mediaQuery.sm} {\r\n      font-size: 16px;\r\n    }\r\n  }\r\n\r\n  ${mediaQuery.md} {\r\n    padding-right: 10px;\r\n  }\r\n`;\r\n\r\nconst Value = styled.div`\r\n  width: 100px;\r\n\r\n  ${mediaQuery.lgDown} {\r\n    display: none;\r\n  }\r\n`;\r\n","import { Icons, Tooltip } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { TableItemStatic } from '../../types/TableItem';\r\n\r\ntype CalculatorStaticFieldProps = {\r\n  tableItem: TableItemStatic;\r\n};\r\n\r\nexport const CalculatorStaticField: React.FC<CalculatorStaticFieldProps> = ({ tableItem }) => {\r\n  return (\r\n    <>\r\n      {tableItem.value}\r\n      {tableItem.suffix ? tableItem.suffix : ''}\r\n      {tableItem.tooltip && (\r\n        <TooltipContainer>\r\n          <Tooltip autoWidth element={<Icons.Question />} content={tableItem.tooltip} placement=\"top\" />\r\n        </TooltipContainer>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n\r\nconst TooltipContainer = styled.span`\r\n  margin-left: 12px;\r\n`;\r\n","import { Skeleton } from 'db-npm-rdui';\r\nimport cloneDeep from 'lodash/cloneDeep';\r\nimport debounce from 'lodash/debounce';\r\nimport filter from 'lodash/filter';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CALCULATION_DELAY_DROPDOWN, CALCULATION_DELAY_INPUT, CALCULATION_DELAY_SLIDER } from '../../config';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\nimport { TableItem } from '../../types/TableItem';\r\nimport { CalculatorDropdownField } from '../fields/CalculatorDropdownField';\r\nimport { CalculatorInputField } from '../fields/CalculatorInputField';\r\nimport { CalculatorSliderField } from '../fields/CalculatorSliderField';\r\nimport { CalculatorStaticField } from '../fields/CalculatorStaticField';\r\n\r\ntype CalculatorTableBodyCellProps = {\r\n  loanArrayIndex: number;\r\n  tableItem: TableItem | undefined;\r\n};\r\n\r\nexport const CalculatorTableBodyCell: React.FC<CalculatorTableBodyCellProps> = ({ loanArrayIndex, tableItem }) => {\r\n  const { loans, setLoanPayloadAndCalculate } = useLoansState();\r\n  const { hasError, setError } = useInputsState();\r\n  const { t } = useTranslation();\r\n\r\n  const loan: LoanStateItem = loans[loanArrayIndex];\r\n\r\n  if (tableItem?.fieldKey === 'netProceedsAmountTop') {\r\n    tableItem.additionalText = t(`calculator-inputs-lending-calculator-additional-lending-text`);\r\n  }\r\n\r\n  /**\r\n   * This callback function handles the onChange event and updates the loan\r\n   */\r\n  const handleValueChange = React.useCallback(\r\n    (delay: number) =>\r\n      debounce((value: any) => {\r\n        if (!tableItem) {\r\n          return;\r\n        }\r\n\r\n        if ('min' in tableItem && typeof tableItem.min === 'number') {\r\n          value = Math.max(value, tableItem.min);\r\n        }\r\n        if ('max' in tableItem && typeof tableItem.max === 'number') {\r\n          value = Math.min(value, tableItem.max);\r\n        }\r\n\r\n        if ('onChange' in tableItem) {\r\n          const newPayload = tableItem.onChange(cloneDeep(loan), value);\r\n          setError(false);\r\n\r\n          const currentTableItem = filter(newPayload.tableItems, { fieldKey: tableItem.fieldKey });\r\n\r\n          // This condition has written inorder to check whether input field is valid or not\r\n          if (newPayload && !tableItem.hasOwnProperty('hasError')) {\r\n            if (newPayload.settings) {\r\n              setLoanPayloadAndCalculate(loanArrayIndex, newPayload.payload, newPayload.settings);\r\n            } else {\r\n              setLoanPayloadAndCalculate(loanArrayIndex, newPayload);\r\n            }\r\n          } else {\r\n            if (tableItem.hasOwnProperty('hasError')) {\r\n              if (currentTableItem.length > 0 && currentTableItem[0].hasError && currentTableItem[0].hasError.error) {\r\n                setLoanPayloadAndCalculate(\r\n                  loanArrayIndex,\r\n                  newPayload.payload,\r\n                  newPayload.settings,\r\n                  newPayload.tableItems,\r\n                  true\r\n                );\r\n              } else {\r\n                setLoanPayloadAndCalculate(loanArrayIndex, newPayload.payload, newPayload.settings);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }, delay),\r\n    [tableItem, loan, loanArrayIndex, setError, setLoanPayloadAndCalculate]\r\n  );\r\n\r\n  if (loan.status === 'loading') {\r\n    return <Skeleton active />;\r\n  }\r\n\r\n  if (loan.status === 'error' || tableItem === undefined) {\r\n    return null;\r\n  }\r\n\r\n  const renderSwitch = () => {\r\n    switch (tableItem.inputType) {\r\n      case 'input':\r\n        return (\r\n          <CalculatorInputField\r\n            tableItem={tableItem}\r\n            onChangeValue={handleValueChange(CALCULATION_DELAY_INPUT)}\r\n            hasError={hasError}\r\n          />\r\n        );\r\n      case 'dropdown':\r\n        return (\r\n          <CalculatorDropdownField\r\n            tableItem={tableItem}\r\n            onChangeValue={handleValueChange(CALCULATION_DELAY_DROPDOWN)}\r\n          />\r\n        );\r\n      case 'slider':\r\n        return (\r\n          <CalculatorSliderField tableItem={tableItem} onChangeValue={handleValueChange(CALCULATION_DELAY_SLIDER)} />\r\n        );\r\n      case 'static':\r\n        return <CalculatorStaticField tableItem={tableItem} />;\r\n    }\r\n  };\r\n\r\n  return <>{renderSwitch()}</>;\r\n};\r\n","import { Icons, RddkTheme, Tooltip } from 'db-npm-rdui';\r\nimport i18next from 'i18next';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { handleTranslation } from '../../../../shared/utils/handleTranslation';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useSettingsState } from '../../state/settingsState';\r\n\r\ntype CalculatorTableBodyLabelCellProps = {\r\n  fieldKey: string;\r\n};\r\n\r\n/**\r\n * This renders the label cell on the left. Only shown on desktop.\r\n */\r\nexport const CalculatorTableBodyLabelCell: React.FC<CalculatorTableBodyLabelCellProps> = ({ fieldKey }) => {\r\n  const { propertyType, ownPaymentVisible } = useInputsState();\r\n  const { settings } = useSettingsState();\r\n  const showLendingType = settings?.inputs?.showLendingType === true;\r\n  const labelPropertyText = handleTranslation(`calculator-row-${fieldKey}-${propertyType}-help`);\r\n  const businessHelpText = !ownPaymentVisible ? handleTranslation(`calculator-row-business-${fieldKey}-help`) : null;\r\n  const lendingHelpText = showLendingType ? handleTranslation(`calculator-row-${fieldKey}-lending-help`) : null;\r\n\r\n  const labelText = i18next.t(`calculator-row-${fieldKey}-label`);\r\n  const businessLabelText = !ownPaymentVisible ? handleTranslation(`calculator-row-business-${fieldKey}-label`) : null;\r\n  const lendingLabelText = showLendingType ? handleTranslation(`calculator-row-${fieldKey}-lending-label`) : null;\r\n  const modifiedLabeltext =\r\n    lendingLabelText !== null ? lendingLabelText : businessLabelText !== null ? businessLabelText : labelText;\r\n\r\n  const helpText =\r\n    lendingHelpText !== null\r\n      ? lendingHelpText\r\n      : businessHelpText !== null\r\n      ? businessHelpText\r\n      : labelPropertyText !== null\r\n      ? labelPropertyText\r\n      : i18next.t(`calculator-row-${fieldKey}-help`);\r\n  const checkHelpText =\r\n    helpText ===\r\n    (businessHelpText !== null\r\n      ? `calculator-row-business-${fieldKey}-help`\r\n      : labelPropertyText !== null\r\n      ? `calculator-row-${fieldKey}-${propertyType}-help`\r\n      : `calculator-row-${fieldKey}-help`);\r\n\r\n  return (\r\n    <TableLeftLabelColumn>\r\n      <TableLeftLabelColumnLabel data-fieldlabel={fieldKey}>{modifiedLabeltext}</TableLeftLabelColumnLabel>\r\n      {!!helpText && !checkHelpText && <Tooltip element={<Icons.Question />} content={helpText} placement=\"right\" />}\r\n    </TableLeftLabelColumn>\r\n  );\r\n};\r\n\r\nconst TableLeftLabelColumn = styled.div`\r\n  display: flex;\r\n  flex-direction: row;\r\n  align-items: center;\r\n\r\n  /* Help icon */\r\n  svg,\r\n  circle {\r\n    stroke: ${RddkTheme.colors.grey90};\r\n  }\r\n`;\r\n\r\nconst TableLeftLabelColumnLabel = styled.span`\r\n  display: inline-block;\r\n  font-weight: bold;\r\n  margin-right: 8px;\r\n`;\r\n","import { Button, Icons, mediaQuery, RddkTheme } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { useLoansState } from '../../state/loansState';\r\n\r\ntype Props = {\r\n  loanArrayIndex: number;\r\n};\r\n\r\nexport const CalculatorTableErrorMessage: React.FC<Props> = ({ loanArrayIndex }) => {\r\n  const { t } = useTranslation();\r\n  const { calculateSingleLoan } = useLoansState();\r\n\r\n  const onClick = () => calculateSingleLoan(loanArrayIndex);\r\n\r\n  return (\r\n    <Content>\r\n      <Icons.NoConnection />\r\n      <Title>{t('calculator-error-title')}</Title>\r\n      <Text>{t('calculator-error-text')}</Text>\r\n      <Button variant=\"secondary\" onClick={onClick}>\r\n        {t('calculator-error-button-label')}\r\n      </Button>\r\n    </Content>\r\n  );\r\n};\r\n\r\nconst Content = styled.div`\r\n  text-align: center;\r\n\r\n  ${mediaQuery.md} {\r\n    max-width: 400px;\r\n  }\r\n\r\n  svg {\r\n    width: 60px !important;\r\n    height: 60px !important;\r\n  }\r\n`;\r\n\r\nconst Title = styled.div`\r\n  font-weight: 800;\r\n  font-size: 14px;\r\n  color: ${RddkTheme.colors.black};\r\n  margin-top: 6px;\r\n`;\r\n\r\nconst Text = styled.div`\r\n  font-size: 14px;\r\n  color: ${RddkTheme.colors.black};\r\n  margin-top: 3px;\r\n  margin-bottom: 20px;\r\n`;\r\n","import { Icons, mediaQuery, RddkTheme, Select } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { MINIMUN_AMOUNT_OF_LOANS } from '../../config';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { useSettingsState } from '../../state/settingsState';\r\nimport { LoanStateItem } from '../../types/LoanStateItem';\r\n\r\ntype CalculatorTableHeadCellProps = {\r\n  loanArrayIndex: number;\r\n  loan: LoanStateItem;\r\n};\r\n\r\nexport const CalculatorTableHeadCell: React.FC<CalculatorTableHeadCellProps> = ({ loanArrayIndex, loan }) => {\r\n  const { t } = useTranslation();\r\n  const { settings } = useSettingsState();\r\n  const {\r\n    propertyType,\r\n    ownerCategory,\r\n    submitCounter,\r\n    setSubmitCounter,\r\n    setSelectedLoan,\r\n    setLoanChanged,\r\n  } = useInputsState();\r\n  const { loansCount, removeLoan, setLoanTypeAndCalculate } = useLoansState();\r\n\r\n  const showRemoveButton = loansCount > MINIMUN_AMOUNT_OF_LOANS;\r\n\r\n  /**\r\n   * Callback for removing a loan/column\r\n   */\r\n  const onRemoveLoanClick = React.useCallback(() => {\r\n    removeLoan(loanArrayIndex);\r\n  }, [removeLoan, loanArrayIndex]);\r\n\r\n  /**\r\n   * Callback for selecting a loan in the dropdown\r\n   */\r\n  const onLoanSelected = React.useCallback(\r\n    (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n      setSelectedLoan(event.target.value);\r\n      setLoanChanged(true);\r\n      setLoanTypeAndCalculate(loanArrayIndex, event.target.value);\r\n      setSubmitCounter(submitCounter + 1);\r\n    },\r\n    [setLoanTypeAndCalculate, loanArrayIndex, submitCounter, setSubmitCounter, setSelectedLoan, setLoanChanged]\r\n  );\r\n\r\n  const dropdownOptions = [\r\n    {\r\n      label: t('calculator-table-select-dropdown'),\r\n      value: '',\r\n    },\r\n    ...Object.keys(settings.loans)\r\n      .map(function (key) {\r\n        const propertyTypes = settings.loans[key].settings.supportedPropertyTypes;\r\n        let supportedPropertyType = propertyType;\r\n        if (ownerCategory) {\r\n          supportedPropertyType = propertyType + '/' + ownerCategory;\r\n        }\r\n        if (supportedPropertyType !== '' && propertyTypes.indexOf(supportedPropertyType) > -1) {\r\n          return {\r\n            value: key,\r\n            label: t(`calculator-loan-${key}-label`),\r\n          };\r\n        } else {\r\n          return {\r\n            label: '',\r\n            value: '',\r\n          };\r\n        }\r\n      })\r\n      .filter((elem) => elem.label !== ''),\r\n  ];\r\n\r\n  return (\r\n    <HeaderCellValue>\r\n      <Select\r\n        aria-label={t('calculator-table-select-dropdown')}\r\n        onChange={onLoanSelected}\r\n        isDark\r\n        isBold\r\n        options={dropdownOptions}\r\n        value={loan.type}\r\n      />\r\n\r\n      {showRemoveButton && (\r\n        <CloseLink target=\"#\" onClick={onRemoveLoanClick}>\r\n          <Icons.Close />\r\n        </CloseLink>\r\n      )}\r\n    </HeaderCellValue>\r\n  );\r\n};\r\n\r\nconst HeaderCellValue = styled.div`\r\n  display: flex;\r\n  flex-direction: row;\r\n  justify-content: space-between;\r\n\r\n  select {\r\n    width: auto;\r\n    padding-right: 16px;\r\n    font-size: 14px;\r\n\r\n    ${mediaQuery.sm} {\r\n      font-size: 16px;\r\n    }\r\n  }\r\n`;\r\n\r\nconst CloseLink = styled.a`\r\n  display: block;\r\n  position: relative;\r\n  cursor: pointer;\r\n\r\n  ${mediaQuery.sm} {\r\n    top: 2px;\r\n  }\r\n\r\n  svg {\r\n    width: 10px !important;\r\n    height: 10px !important;\r\n\r\n    ${mediaQuery.sm} {\r\n      width: 14px !important;\r\n      height: 14px !important;\r\n    }\r\n\r\n    path {\r\n      fill: ${RddkTheme.colors.grey0} !important;\r\n    }\r\n  }\r\n`;\r\n","import { Cell, DynamicTable, RddkTheme } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { DESKTOP_LABEL_COLUMN_WIDTH, DESKTOP_LOAN_COLUMNS_MIN_WIDTH, MAX_LOANS_DESKTOP } from '../../config';\r\nimport { getFieldKeysToDisplay } from '../../helpers/table';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { FieldKeys } from '../../types/FieldKey';\r\nimport { CalculatorTableBodyCell } from './CalculatorTableBodyCell';\r\nimport { CalculatorTableBodyLabelCell } from './CalculatorTableBodyLabelCell';\r\nimport { CalculatorTableErrorMessage } from './CalculatorTableErrorMessage';\r\nimport { CalculatorTableHeadCell } from './CalculatorTableHeadCell';\r\n\r\ntype CalculatorTableDesktopProps = {\r\n  fieldKeys: FieldKeys;\r\n  showHeader: boolean;\r\n  tableName?: string;\r\n  tableSlogan?: string;\r\n};\r\n\r\nexport const CalculatorTableDesktop: React.FC<CalculatorTableDesktopProps> = ({\r\n  fieldKeys,\r\n  showHeader,\r\n  tableName,\r\n  tableSlogan,\r\n}) => {\r\n  const { t } = useTranslation();\r\n  const { loans, lastCalculationDate } = useLoansState();\r\n\r\n  const fieldsKeysToDisplay = getFieldKeysToDisplay(fieldKeys, loans);\r\n\r\n  /**\r\n   * Configure the table data for desktop viewport\r\n   */\r\n  const desktopTableData = React.useMemo(() => {\r\n    const rows: Cell[][] = [];\r\n\r\n    // Add table header row, if \"showHeader\" is true\r\n    if (showHeader) {\r\n      const headerRow: Cell[] = [];\r\n\r\n      headerRow.push({\r\n        value: tableName,\r\n        suffix: tableSlogan,\r\n        width: DESKTOP_LABEL_COLUMN_WIDTH,\r\n      });\r\n\r\n      loans.slice(0, MAX_LOANS_DESKTOP).forEach((loan, index) => {\r\n        headerRow.push({\r\n          value: loan.type,\r\n          suffix: !!loan.type && t(`calculator-loan-${loan.type}-text`),\r\n          cellValueRender: () => <CalculatorTableHeadCell loanArrayIndex={index} loan={loan} />,\r\n        });\r\n      });\r\n\r\n      rows.push(headerRow);\r\n    }\r\n\r\n    // Iterate through all keys and add them as rows\r\n    fieldsKeysToDisplay.forEach((fieldKey, fieldIndex) => {\r\n      const bodyRow: Cell[] = [];\r\n\r\n      bodyRow.push({\r\n        value: <CalculatorTableBodyLabelCell fieldKey={fieldKey} />,\r\n        width: DESKTOP_LABEL_COLUMN_WIDTH,\r\n      });\r\n\r\n      loans.slice(0, MAX_LOANS_DESKTOP).forEach((loan, loanIndex) => {\r\n        if (loan.status === 'error') {\r\n          // If the loan status is \"error\", then display the error mesage, but only for the first row\r\n          if (fieldIndex === 0) {\r\n            bodyRow.push({\r\n              value: <CalculatorTableErrorMessage loanArrayIndex={loanIndex} />,\r\n              minWidth: DESKTOP_LOAN_COLUMNS_MIN_WIDTH,\r\n              rowSpan: 99,\r\n              style: {\r\n                verticalAlign: 'middle',\r\n                background: RddkTheme.colors.grey10,\r\n              },\r\n            });\r\n          }\r\n        } else {\r\n          // If no error, then show the tableItem content\r\n          const tableItemForLoan = loan.tableItems?.find((i) => i.fieldKey === fieldKey);\r\n          bodyRow.push({\r\n            value: <CalculatorTableBodyCell loanArrayIndex={loanIndex} tableItem={tableItemForLoan} />,\r\n            minWidth: DESKTOP_LOAN_COLUMNS_MIN_WIDTH,\r\n          });\r\n        }\r\n      });\r\n\r\n      rows.push(bodyRow);\r\n    });\r\n\r\n    return rows;\r\n  }, [t, loans, tableName, tableSlogan, showHeader, fieldsKeysToDisplay]);\r\n\r\n  return (\r\n    <TableContainer>\r\n      <DynamicTable\r\n        key={lastCalculationDate}\r\n        bordered={true}\r\n        striped={true}\r\n        firstRowIsHead={showHeader}\r\n        data={desktopTableData}\r\n      />\r\n    </TableContainer>\r\n  );\r\n};\r\n\r\nconst TableContainer = styled.div`\r\n  table {\r\n    table-layout: fixed; /* IMPORTANT */\r\n  }\r\n`;\r\n","import { Color } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { useLoansState } from '../../state/loansState';\r\n\r\ntype Props = {};\r\n\r\nexport const CalculatorAddLoanButtonMobile: React.FC<Props> = () => {\r\n  const { t } = useTranslation();\r\n  const { addLoan } = useLoansState();\r\n\r\n  return <AddButton onClick={addLoan}>{t('calculator-table-addloan-button')}</AddButton>;\r\n};\r\n\r\nconst AddButton = styled.a`\r\n  position: absolute;\r\n  top: 0;\r\n  left: -1px;\r\n  right: 0;\r\n  bottom: 0;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n  text-align: center;\r\n  border: 1px dashed #000;\r\n  font-size: 14px;\r\n  font-weight: normal;\r\n  color: #000;\r\n  transition: all 0.3s;\r\n  background: ${Color.grey20};\r\n\r\n  :hover {\r\n    cursor: pointer;\r\n    background: ${Color.grey30};\r\n  }\r\n`;\r\n","import { Cell, DynamicTable, RddkTheme } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { MAX_LOANS_MOBILE } from '../../config';\r\nimport { getFieldKeysToDisplay } from '../../helpers/table';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { FieldKeys } from '../../types/FieldKey';\r\nimport { CalculatorAddLoanButtonMobile } from './CalculatorAddLoanButtonMobile';\r\nimport { CalculatorTableBodyCell } from './CalculatorTableBodyCell';\r\nimport { CalculatorTableBodyLabelCell } from './CalculatorTableBodyLabelCell';\r\nimport { CalculatorTableErrorMessage } from './CalculatorTableErrorMessage';\r\nimport { CalculatorTableHeadCell } from './CalculatorTableHeadCell';\r\n\r\ntype CalculatorTableMobileProps = {\r\n  fieldKeys: FieldKeys;\r\n  showHeader: boolean;\r\n};\r\n\r\nexport const CalculatorTableMobile: React.FC<CalculatorTableMobileProps> = ({ fieldKeys, showHeader }) => {\r\n  const { t } = useTranslation();\r\n  const { loans, lastCalculationDate } = useLoansState();\r\n\r\n  const canAddLoan = loans.length < MAX_LOANS_MOBILE;\r\n\r\n  const fieldsKeysToDisplay = getFieldKeysToDisplay(fieldKeys, loans);\r\n\r\n  /**\r\n   * Configure the table data for mobile viewport\r\n   */\r\n  const mobileTableData = React.useMemo(() => {\r\n    const rows: Cell[][] = [];\r\n\r\n    // Add table header row, if \"showHeader\" is true\r\n    if (showHeader) {\r\n      const headerRow: Cell[] = [];\r\n\r\n      loans.slice(0, MAX_LOANS_MOBILE).forEach((loan, index) => {\r\n        headerRow.push({\r\n          value: loan.type,\r\n          suffix: !!loan.type && t(`calculator-loan-${loan.type}-text`),\r\n          cellValueRender: () => <CalculatorTableHeadCell loanArrayIndex={index} loan={loan} />,\r\n        });\r\n      });\r\n\r\n      // Add the \"Add loan\" button as a table header cell\r\n      if (canAddLoan) {\r\n        headerRow.push({\r\n          cellRender: () => <CalculatorAddLoanButtonMobile />,\r\n          style: {\r\n            position: 'relative',\r\n            padding: 0,\r\n            margin: 0,\r\n          },\r\n        });\r\n      }\r\n\r\n      rows.push(headerRow);\r\n    }\r\n\r\n    // Iterate through all keys and add them as rows\r\n    fieldsKeysToDisplay.forEach((fieldKey, fieldIndex) => {\r\n      const bodyRow: Cell[] = [];\r\n\r\n      loans.slice(0, MAX_LOANS_MOBILE).forEach((loan, loanIndex) => {\r\n        if (loan.status === 'error') {\r\n          // If the loan status is \"error\", then display the error mesage, but only for the first row\r\n          if (fieldIndex === 0) {\r\n            bodyRow.push({\r\n              value: <CalculatorTableErrorMessage loanArrayIndex={loanIndex} />,\r\n              colSpan: canAddLoan ? 2 : 1,\r\n              width: canAddLoan ? '100%' : '50%',\r\n              rowSpan: 99,\r\n              style: {\r\n                verticalAlign: 'middle',\r\n                background: RddkTheme.colors.grey10,\r\n              },\r\n            });\r\n          }\r\n        } else {\r\n          // If no error, then show the tableItem content\r\n          const tableItemForLoan = loan.tableItems?.find((i) => i.fieldKey === fieldKey);\r\n          bodyRow.push({\r\n            prefix: <CalculatorTableBodyLabelCell fieldKey={fieldKey} />,\r\n            value: <CalculatorTableBodyCell loanArrayIndex={loanIndex} tableItem={tableItemForLoan} />,\r\n            colSpan: canAddLoan ? 2 : 1,\r\n            width: canAddLoan ? '100%' : '50%',\r\n          });\r\n        }\r\n      });\r\n\r\n      rows.push(bodyRow);\r\n    });\r\n\r\n    return rows;\r\n  }, [t, loans, showHeader, fieldsKeysToDisplay, canAddLoan]);\r\n\r\n  return (\r\n    <TableContainer>\r\n      <DynamicTable key={lastCalculationDate} striped={true} firstRowIsHead={showHeader} data={mobileTableData} />\r\n    </TableContainer>\r\n  );\r\n};\r\n\r\nconst TableContainer = styled.div`\r\n  table {\r\n    table-layout: fixed; /* IMPORTANT */\r\n  }\r\n`;\r\n","import { Container, mediaQuery, Typography, Visible } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport {\r\n  TABLE_FIELDKEYS_BANKLOAN,\r\n  TABLE_FIELDKEYS_OVERVIEW,\r\n  TABLE_FIELDKEYS_REALKREDIT_1,\r\n  TABLE_FIELDKEYS_REALKREDIT_2,\r\n} from '../../config';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useSettingsState } from '../../state/settingsState';\r\nimport { CalculatorTableDesktop } from './CalculatorTableDesktop';\r\nimport { CalculatorTableMobile } from './CalculatorTableMobile';\r\n\r\nexport const CalculatorTablesContainer: React.FC = () => {\r\n  return (\r\n    <TablesContainer>\r\n      <Visible xs sm md>\r\n        <MobileTables />\r\n      </Visible>\r\n\r\n      <Visible lg xl xxl>\r\n        <DesktopTables />\r\n      </Visible>\r\n    </TablesContainer>\r\n  );\r\n};\r\n\r\nconst DesktopTables = () => {\r\n  const { t } = useTranslation();\r\n  const {\r\n    viewType,\r\n    tableFieldSet1Keys,\r\n    setTableFieldSet1Keys,\r\n    tableFieldSet2Keys,\r\n    setTableFieldSet2Keys,\r\n  } = useInputsState();\r\n  const { settings } = useSettingsState();\r\n  const [isFieldsDisplayed, setFields] = React.useState(false);\r\n\r\n  React.useEffect(() => {\r\n    if (Object.keys(settings).length > 0 && !isFieldsDisplayed) {\r\n      const ignoredFieldKeys = settings?.table?.fieldsToIgnore || [];\r\n      const allowedFieldSet1Keys = tableFieldSet1Keys.filter((value) => !ignoredFieldKeys.includes(value));\r\n      const allowedFieldSet2Keys = tableFieldSet2Keys.filter((value) => !ignoredFieldKeys.includes(value));\r\n\r\n      const finalFieldSet1Keys = tableFieldSet1Keys.length > 0 ? allowedFieldSet1Keys : TABLE_FIELDKEYS_REALKREDIT_1;\r\n      const finalFieldSet2Keys = tableFieldSet2Keys.length > 0 ? allowedFieldSet2Keys : TABLE_FIELDKEYS_REALKREDIT_2;\r\n\r\n      setTableFieldSet1Keys(finalFieldSet1Keys);\r\n      setTableFieldSet2Keys(finalFieldSet2Keys);\r\n      setFields(true);\r\n    }\r\n  }, [\r\n    tableFieldSet1Keys,\r\n    tableFieldSet2Keys,\r\n    settings,\r\n    isFieldsDisplayed,\r\n    setTableFieldSet1Keys,\r\n    setTableFieldSet2Keys,\r\n    setFields,\r\n  ]);\r\n\r\n  return (\r\n    <>\r\n      <Block show={viewType === 'realkredit'}>\r\n        <CalculatorTableDesktop\r\n          fieldKeys={tableFieldSet1Keys}\r\n          showHeader={true}\r\n          tableName={t('calculator-table-realkredit-title')}\r\n          tableSlogan={t('calculator-table-realkredit-text')}\r\n        />\r\n\r\n        <Typography type=\"h6\" marginTop={7} marginBottom={4}>\r\n          {t('calculator-table-realkredit-secondtable-title')}\r\n        </Typography>\r\n\r\n        <CalculatorTableDesktop fieldKeys={tableFieldSet2Keys} showHeader={false} />\r\n      </Block>\r\n\r\n      <Block show={viewType === 'bankloan'}>\r\n        <CalculatorTableDesktop\r\n          fieldKeys={TABLE_FIELDKEYS_BANKLOAN}\r\n          showHeader={true}\r\n          tableName={'Tilpas banklånet'}\r\n          tableSlogan={'Sammenlign realkredit lån her'}\r\n        />\r\n      </Block>\r\n\r\n      <Block show={viewType === 'overview'}>\r\n        <CalculatorTableDesktop\r\n          fieldKeys={TABLE_FIELDKEYS_OVERVIEW}\r\n          showHeader={true}\r\n          tableName={'OVERVIEW'}\r\n          tableSlogan={'Realkredit og banklån'}\r\n        />\r\n      </Block>\r\n    </>\r\n  );\r\n};\r\n\r\nconst MobileTables = () => {\r\n  const { t } = useTranslation();\r\n  const {\r\n    viewType,\r\n    tableFieldSet1Keys,\r\n    tableFieldSet2Keys,\r\n    setTableFieldSet1Keys,\r\n    setTableFieldSet2Keys,\r\n  } = useInputsState();\r\n  const { settings } = useSettingsState();\r\n  const [isFieldsDisplayed, setFields] = React.useState(false);\r\n\r\n  React.useEffect(() => {\r\n    if (Object.keys(settings).length > 0 && !isFieldsDisplayed) {\r\n      const ignoredFieldKeys = settings?.table?.fieldsToIgnore || [];\r\n      const allowedFieldSet1Keys = tableFieldSet1Keys.filter((value) => !ignoredFieldKeys.includes(value));\r\n      const allowedFieldSet2Keys = tableFieldSet2Keys.filter((value) => !ignoredFieldKeys.includes(value));\r\n\r\n      const finalFieldSet1Keys = tableFieldSet1Keys.length > 0 ? allowedFieldSet1Keys : TABLE_FIELDKEYS_REALKREDIT_1;\r\n      const finalFieldSet2Keys = tableFieldSet2Keys.length > 0 ? allowedFieldSet2Keys : TABLE_FIELDKEYS_REALKREDIT_2;\r\n\r\n      setTableFieldSet1Keys(finalFieldSet1Keys);\r\n      setTableFieldSet2Keys(finalFieldSet2Keys);\r\n      setFields(true);\r\n    }\r\n  }, [\r\n    tableFieldSet1Keys,\r\n    tableFieldSet2Keys,\r\n    settings,\r\n    isFieldsDisplayed,\r\n    setTableFieldSet1Keys,\r\n    setTableFieldSet2Keys,\r\n    setFields,\r\n  ]);\r\n\r\n  return (\r\n    <>\r\n      <Block show={viewType === 'realkredit'}>\r\n        <CalculatorTableMobile fieldKeys={tableFieldSet1Keys} showHeader={true} />\r\n\r\n        <Typography type=\"h6\" marginTop={7} marginBottom={4} marginLeft={4}>\r\n          {t('calculator-table-realkredit-secondtable-title')}\r\n        </Typography>\r\n\r\n        <CalculatorTableMobile fieldKeys={tableFieldSet2Keys} showHeader={false} />\r\n      </Block>\r\n\r\n      <Block show={viewType === 'bankloan'}>\r\n        <CalculatorTableMobile fieldKeys={TABLE_FIELDKEYS_BANKLOAN} showHeader={true} />\r\n      </Block>\r\n\r\n      <Block show={viewType === 'overview'}>\r\n        <CalculatorTableMobile fieldKeys={TABLE_FIELDKEYS_OVERVIEW} showHeader={true} />\r\n      </Block>\r\n    </>\r\n  );\r\n};\r\n\r\nconst TablesContainer = styled(Container)`\r\n  ${mediaQuery.mdDown} {\r\n    max-width: 100% !important;\r\n    padding-left: 0 !important;\r\n    padding-right: 0 !important;\r\n  }\r\n\r\n  table tbody .value {\r\n    min-height: 18px;\r\n    max-width: 200px;\r\n\r\n    ${mediaQuery.sm} {\r\n      max-width: 320px;\r\n    }\r\n\r\n    ${mediaQuery.lg} {\r\n      min-height: 20px;\r\n      max-width: 400px;\r\n    }\r\n  }\r\n`;\r\n\r\nconst Block = styled.div<{ show?: boolean }>`\r\n  display: ${(props) => (props.show ? 'block' : 'none')};\r\n`;\r\n","import { Box, Button, Col, Container, Hidden, Row, TableSelector } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useAdobeTracking } from '../../../../shared/hooks/useAdobeTracking';\r\nimport { HTML_ID_SCROLLTO_AREA, MAX_LOANS_DESKTOP } from '../../config';\r\nimport { useInputsState } from '../../state/inputsState';\r\nimport { useLoansState } from '../../state/loansState';\r\nimport { useSettingsState } from '../../state/settingsState';\r\n\r\nexport const CalculatorTabs: React.FC = () => {\r\n  const { t } = useTranslation();\r\n  const { setViewType } = useInputsState();\r\n  const { loansCount, addLoan } = useLoansState();\r\n  const { settings } = useSettingsState();\r\n  const { getLaunchData, trackCalculatorCustomEvent } = useAdobeTracking();\r\n\r\n  // Check if \"showBankloanTab\" (in JSON settings) is true and tabs should be shown\r\n  const showTabs = settings?.table?.showBankloanTab === true;\r\n\r\n  // Disable \"Add loan\" button if max amount of loans is reached\r\n  const disableAddButton = loansCount >= MAX_LOANS_DESKTOP;\r\n\r\n  const addButtonTracker = React.useCallback(() => {\r\n    const calculatorType = getLaunchData('calculator_type');\r\n    trackCalculatorCustomEvent({ event: calculatorType + ' : Loan calculator : Tilfoej laan' });\r\n  }, [trackCalculatorCustomEvent, getLaunchData]);\r\n\r\n  return (\r\n    <Container id={HTML_ID_SCROLLTO_AREA}>\r\n      <Row>\r\n        <Col>\r\n          {showTabs && (\r\n            <Box marginTop={4} marginBottom={4}>\r\n              <TableSelector selectedIndex={0} size=\"small\">\r\n                <div onClick={() => setViewType('realkredit')}>{t('calculator-tabs-realkredit')}</div>\r\n                <div onClick={() => setViewType('bankloan')}>{t('calculator-tabs-bankloan')}</div>\r\n                <div onClick={() => setViewType('overview')}>{t('calculator-tabs-overview')}</div>\r\n              </TableSelector>\r\n            </Box>\r\n          )}\r\n        </Col>\r\n\r\n        <Hidden xs sm md>\r\n          <Col xs=\"content\">\r\n            <Box marginBottom={4}>\r\n              <Button\r\n                variant=\"secondary\"\r\n                onClick={() => {\r\n                  addLoan();\r\n                  addButtonTracker();\r\n                }}\r\n                disabled={disableAddButton}\r\n              >\r\n                {t('calculator-table-addloan-button')}\r\n              </Button>\r\n            </Box>\r\n          </Col>\r\n        </Hidden>\r\n      </Row>\r\n    </Container>\r\n  );\r\n};\r\n","import * as React from 'react';\r\nimport { Section } from '../../shared/components';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport { CalculatorDetailsLinks } from './components/detailslinks/CalculatorDetailsLinks';\r\nimport { CalculatorInputs, CalculatorInputsOnSubmit } from './components/inputs/CalculatorInputs';\r\nimport { CalculatorModal } from './components/modal/CalculatorModal';\r\nimport { CalculatorStickyBar } from './components/stickybar/CalculatorStickyBar';\r\nimport { CalculatorTablesContainer } from './components/table/CalculatorTablesContainer';\r\nimport { CalculatorTabs } from './components/tabs/CalculatorTabs';\r\nimport { HTML_ID_SUBMIT_BUTTON, QUERY_KEY_OWN_PAYMENT, QUERY_KEY_PROPERTY_VALUE } from './config';\r\nimport { getQueryFloatOrNull } from './helpers/query';\r\nimport { scrollToFocusArea } from './helpers/scroll';\r\nimport { useInputsState } from './state/inputsState';\r\nimport { useLoansState } from './state/loansState';\r\nimport { useSettingsState } from './state/settingsState';\r\n\r\nexport type LoanCalculatorProps = {\r\n  fields: any;\r\n};\r\n\r\nconst LoanCalculator: React.FC<LoanCalculatorProps> = ({ fields = {} }) => {\r\n  const { settings, setSettings, setApiUrl } = useSettingsState();\r\n  const { setInitialLoansFromSettings, setLoansAfterChange, calculateLoansFromScratch } = useLoansState();\r\n  const settingsRef = React.useRef({}) as any;\r\n  if (!Object.keys(settingsRef.current).length) {\r\n    settingsRef.current = JSON.parse(fields['Settings']?.value || '{}');\r\n  }\r\n\r\n  const launchData: LaunchData = {\r\n    calculator_type: settingsRef.current?.calculatorType ?? 'Private loan',\r\n    calculator_name: 'Loan calculator - ' + settingsRef.current?.calculatorType ?? 'Private loan',\r\n    calculator_info: '',\r\n    calculator_status: 'loaded',\r\n  };\r\n  const {\r\n    getLaunchData,\r\n    setLaunchData,\r\n    trackCalculatorSuccess,\r\n    trackCalculatorReCalculation,\r\n    trackCalculatorFailed,\r\n    trackCalculatorInteraction,\r\n  } = useAdobeTracking(launchData);\r\n  const {\r\n    ownPayment,\r\n    propertyValue,\r\n    propertyType,\r\n    propertyCategory,\r\n    wantedLoanAmount,\r\n    remainingDebt,\r\n    submitCounter,\r\n    selectedLoan,\r\n    recalculate,\r\n    loanChanged,\r\n    setRecalculate,\r\n    setLoanChanged,\r\n  } = useInputsState();\r\n  const { loans } = useLoansState();\r\n  const prevTrackingState = React.useRef({});\r\n\r\n  /**\r\n   * Track on loan state changes\r\n   */\r\n  React.useLayoutEffect(() => {\r\n    const loanList = loans.map((value) => value.type).join(' - ');\r\n\r\n    loans.forEach((loan, i) => {\r\n      if (!prevTrackingState.current[loan.type] && submitCounter <= 1) {\r\n        if (\r\n          loan.status === 'done' &&\r\n          getLaunchData('calculator_status') !== 'completed' &&\r\n          getLaunchData('calculator_status') !== 're-calculated'\r\n        ) {\r\n          trackCalculatorSuccess({\r\n            calculator_amount: propertyValue || 0,\r\n            calculator_info:\r\n              'loan_product:' +\r\n              loan.type +\r\n              ',property_type:' +\r\n              propertyType +\r\n              ',property_category:' +\r\n              propertyCategory +\r\n              ',own_value:' +\r\n              ownPayment +\r\n              ',wanted_loan_amount:' +\r\n              wantedLoanAmount +\r\n              ',remaining_debt:' +\r\n              remainingDebt,\r\n            loan_calculate_type: loanList,\r\n          });\r\n        } else if (loan.status === 'error' && getLaunchData('calculator_status') !== 'failed') {\r\n          trackCalculatorFailed('API error');\r\n        }\r\n      }\r\n      if (prevTrackingState.current[loan.type] && submitCounter > 1 && recalculate) {\r\n        if (\r\n          loan.status === 'done' &&\r\n          (getLaunchData('calculator_status') === 'completed' ||\r\n            getLaunchData('calculator_status') === 're-calculated' ||\r\n            getLaunchData('calculator_status') === 'failed')\r\n        ) {\r\n          setRecalculate(false);\r\n          trackCalculatorReCalculation({\r\n            calculator_amount: propertyValue || 0,\r\n            calculator_info:\r\n              'loan_product:' +\r\n              loan.type +\r\n              ',property_type:' +\r\n              propertyType +\r\n              ',property_category:' +\r\n              propertyCategory +\r\n              ',own_value:' +\r\n              ownPayment +\r\n              ',wanted_loan_amount:' +\r\n              wantedLoanAmount +\r\n              ',remaining_debt:' +\r\n              remainingDebt,\r\n            loan_calculate_type: loanList,\r\n          });\r\n        } else if (loan.status === 'error' && getLaunchData('calculator_status') !== 'failed') {\r\n          trackCalculatorFailed('API error');\r\n          setRecalculate(false);\r\n        }\r\n      }\r\n      if (prevTrackingState.current[loan.type] && submitCounter > 1 && loanChanged) {\r\n        if (\r\n          loan.status === 'done' &&\r\n          loan.type === selectedLoan &&\r\n          (getLaunchData('calculator_status') === 'completed' ||\r\n            getLaunchData('calculator_status') === 're-calculated' ||\r\n            getLaunchData('calculator_status') === 'failed')\r\n        ) {\r\n          setLoanChanged(false);\r\n          trackCalculatorReCalculation({\r\n            calculator_amount: propertyValue || 0,\r\n            calculator_info:\r\n              'loan_product:' +\r\n              loan.type +\r\n              ',property_type:' +\r\n              propertyType +\r\n              ',property_category:' +\r\n              propertyCategory +\r\n              ',own_value:' +\r\n              ownPayment +\r\n              ',wanted_loan_amount:' +\r\n              wantedLoanAmount +\r\n              ',remaining_debt:' +\r\n              remainingDebt,\r\n            loan_calculate_type: loanList,\r\n          });\r\n        } else if (loan.status === 'error' && getLaunchData('calculator_status') !== 'failed') {\r\n          trackCalculatorFailed('API error');\r\n          setLoanChanged(false);\r\n        }\r\n      }\r\n      if (!prevTrackingState.current[loan.type] && loan.status === 'done')\r\n        prevTrackingState.current[loan.type] = loan.status;\r\n    });\r\n  }, [\r\n    loans,\r\n    propertyValue,\r\n    propertyType,\r\n    propertyCategory,\r\n    wantedLoanAmount,\r\n    remainingDebt,\r\n    ownPayment,\r\n    submitCounter,\r\n    selectedLoan,\r\n    loanChanged,\r\n    recalculate,\r\n    setRecalculate,\r\n    setLoanChanged,\r\n    getLaunchData,\r\n    trackCalculatorFailed,\r\n    trackCalculatorSuccess,\r\n    trackCalculatorReCalculation,\r\n  ]);\r\n\r\n  /**\r\n   * Set settings and initial loans\r\n   */\r\n  React.useEffect(() => {\r\n    // const settings = JSON.parse(fields['Settings']?.value || '{}');\r\n    const apiUrl = fields['API Endpoint URL']?.value || '';\r\n    setSettings(settingsRef.current);\r\n    setApiUrl(apiUrl);\r\n    const url = new URL(window.location.href);\r\n    const hasType = url.searchParams.get('type')?.toString();\r\n    if (hasType) {\r\n      setLoansAfterChange(settings, hasType);\r\n    } else {\r\n      setInitialLoansFromSettings(settingsRef.current);\r\n    }\r\n  }, [fields, settings, setSettings, setApiUrl, setInitialLoansFromSettings, setLoansAfterChange, settingsRef]);\r\n\r\n  /**\r\n   * On page load, try clicking the submit button and do a calculation\r\n   */\r\n  React.useEffect(() => {\r\n    if (getQueryFloatOrNull(QUERY_KEY_PROPERTY_VALUE) !== null && getQueryFloatOrNull(QUERY_KEY_OWN_PAYMENT) !== null) {\r\n      setLaunchData({ calculator_type: 'Hero module' });\r\n      setTimeout(() => {\r\n        document.getElementById(HTML_ID_SUBMIT_BUTTON)?.click();\r\n      }, 300);\r\n    }\r\n  }, [setLaunchData]);\r\n\r\n  /**\r\n   * Track calcuation if directed from calculator hero module - keep in separate effect to avoid looping calculation submit click\r\n   */\r\n  React.useEffect(() => {\r\n    if (getQueryFloatOrNull(QUERY_KEY_PROPERTY_VALUE) !== null && getQueryFloatOrNull(QUERY_KEY_OWN_PAYMENT) !== null) {\r\n      setTimeout(() => {\r\n        trackCalculatorInteraction();\r\n      }, 300);\r\n    }\r\n  }, [trackCalculatorInteraction]);\r\n\r\n  /**\r\n   * Callback to run when submitting inputs on the calculator page\r\n   */\r\n  const onInputsSubmit: CalculatorInputsOnSubmit = () => {\r\n    calculateLoansFromScratch();\r\n    scrollToFocusArea();\r\n  };\r\n\r\n  return (\r\n    <Section componentName=\"LoanCalculator\" margin=\"small\">\r\n      <CalculatorInputs onSubmit={onInputsSubmit} />\r\n      <CalculatorTabs />\r\n      <CalculatorTablesContainer />\r\n      <CalculatorDetailsLinks />\r\n      <CalculatorStickyBar />\r\n      <CalculatorModal title={fields['Modal Title']} />\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default LoanCalculator;\r\n","import { scrollTo } from '../../../shared/utils/scrollTo';\r\nimport { HTML_ID_SCROLLTO_AREA } from '../config';\r\n\r\nexport function scrollToFocusArea() {\r\n  const tables = document.getElementById(HTML_ID_SCROLLTO_AREA);\r\n  if (tables) {\r\n    scrollTo(tables);\r\n  }\r\n}\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Col, Container, Row, Typography } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { FieldChecker, Section } from '../../shared/components';\r\nimport { LaunchData, useAdobeTracking } from '../../shared/hooks';\r\nimport { CalculatorInputs, CalculatorInputsOnSubmit } from '../LoanCalculator/components/inputs/CalculatorInputs';\r\nimport {\r\n  QUERY_KEY_OWNER_CATEGORY,\r\n  QUERY_KEY_OWN_PAYMENT,\r\n  QUERY_KEY_PROPERTY_TYPE,\r\n  QUERY_KEY_PROPERTY_VALUE,\r\n} from '../LoanCalculator/config';\r\nimport { useSettingsState } from '../LoanCalculator/state/settingsState';\r\n\r\nexport type LoanCalculatorInputsOnlyProps = {\r\n  fields: any;\r\n};\r\n\r\nconst LoanCalculatorInputsOnly: React.FC<LoanCalculatorInputsOnlyProps> = ({ fields = {} }) => {\r\n  const smallTopMargin = fields['Small Top Margin']?.value === true;\r\n  const calculatorPageUrl = String(fields['Calculator Page URL']?.value || '');\r\n  const launchData: LaunchData = {\r\n    calculator_type: 'Hero module',\r\n    calculator_name: 'Loan calculator',\r\n    calculator_status: 'loaded',\r\n  };\r\n  useAdobeTracking(launchData);\r\n\r\n  /**\r\n   * Set settings in calculator state\r\n   */\r\n  const { setSettings } = useSettingsState();\r\n  React.useEffect(() => {\r\n    const settings = JSON.parse(fields['Settings']?.value || '{}');\r\n    setSettings(settings);\r\n  }, [fields, setSettings]);\r\n\r\n  /**\r\n   * When the user submits we use this function to redirect the user to the next page (calculator page).\r\n   * All the submitted data will be set as query parameters.\r\n   * @param propertyType The property type the user selected (eg SingleFamilyDetachedHouse)\r\n   * @param propertyValue The property value the user entered\r\n   * @param ownPayment The own payment amount the user entered\r\n   */\r\n  const onSubmit: CalculatorInputsOnSubmit = (data) => {\r\n    const { propertyType, ownerCategory, propertyValue, ownPayment } = data;\r\n\r\n    // Combine all data into a URLSearchParams object\r\n    const params = new URLSearchParams({\r\n      [QUERY_KEY_PROPERTY_TYPE]: propertyType || '',\r\n      [QUERY_KEY_OWNER_CATEGORY]: ownerCategory || '',\r\n      [QUERY_KEY_PROPERTY_VALUE]: (propertyValue || 0) + '',\r\n      [QUERY_KEY_OWN_PAYMENT]: (ownPayment || 0) + '',\r\n    });\r\n\r\n    // Redirect the user to the new page\r\n    if (!!calculatorPageUrl && window && window.location) {\r\n      window.location.href = `${calculatorPageUrl}?${params}`;\r\n    }\r\n  };\r\n\r\n  return (\r\n    <Section componentName=\"LoanCalculatorInputsOnly\" margin={smallTopMargin ? 'x-small' : 'large'}>\r\n      <Container>\r\n        <Row justify=\"center\">\r\n          <Col md={6}>\r\n            <FieldChecker type=\"text\" field={fields['Headline']}>\r\n              <Box textAlign=\"center\" marginBottom={5}>\r\n                <Typography type=\"h2\">\r\n                  <Text field={fields['Headline']} />\r\n                </Typography>\r\n              </Box>\r\n            </FieldChecker>\r\n\r\n            <FieldChecker type=\"text\" field={fields['Description']}>\r\n              <Box textAlign=\"center\" marginBottom={6}>\r\n                <Typography type=\"manchetBig\">\r\n                  <Text field={fields['Description']} />\r\n                </Typography>\r\n              </Box>\r\n            </FieldChecker>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n\r\n      <CalculatorInputs onSubmit={onSubmit} />\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default LoanCalculatorInputsOnly;\r\n","import { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { Carousel, CarouselDefaultContainer, Container, mediaQuery } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport LazyLoad from 'react-lazyload';\r\nimport styled from 'styled-components';\r\nimport { Section, WithConditionWrapper } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\n\r\nconst StyledContainer = styled(Container)`\r\n  ${mediaQuery.lgDown} {\r\n    padding-left: 0 !important;\r\n    padding-right: 0 !important;\r\n    max-width: 100% !important;\r\n  }\r\n`;\r\n\r\nconst ExperienceEditorCarousel = styled.div`\r\n  display: flex;\r\n  flex-direction: row;\r\n  overflow-x: scroll;\r\n  .scEmptyPlaceholder {\r\n    flex: auto;\r\n  }\r\n`;\r\n\r\nexport type NewsListHorizontalProps = PlaceholderProps & {\r\n  newsItemsHorizontal: any;\r\n};\r\n\r\nconst NewsListHorizontal: React.FC<NewsListHorizontalProps> = ({ newsItemsHorizontal }) => {\r\n  const hasNewsItems = newsItemsHorizontal && newsItemsHorizontal.length > 0;\r\n  const isEditor = useIsEditor();\r\n  const showNewsItems = hasNewsItems || isEditor;\r\n\r\n  return (\r\n    <Section componentName=\"NewsListHorizontal\" margin=\"small\">\r\n      <StyledContainer>\r\n        {showNewsItems &&\r\n          (isEditor ? (\r\n            <CarouselDefaultContainer>\r\n              <ExperienceEditorCarousel>{newsItemsHorizontal}</ExperienceEditorCarousel>\r\n            </CarouselDefaultContainer>\r\n          ) : (\r\n            <WithConditionWrapper\r\n              condition={process.env.REACT_APP_CM_BUILD === 'true'}\r\n              Wrapper={LazyLoad}\r\n              props={{ height: 400, once: true }}\r\n            >\r\n              <CarouselDefaultContainer>\r\n                <Carousel>{newsItemsHorizontal}</Carousel>\r\n              </CarouselDefaultContainer>\r\n            </WithConditionWrapper>\r\n          ))}\r\n      </StyledContainer>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('newsItemsHorizontal')(NewsListHorizontal);\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { BottomShadow, Color, mediaQuery, RddkTheme, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker } from '../../shared/components';\r\nimport imageScaler from '../../shared/utils/imageScaler';\r\n\r\nconst ListItem = styled.a`\r\n  display: block;\r\n  margin: 10px 10px 30px 10px;\r\n  background: #fff;\r\n  border-radius: 5px;\r\n  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.15);\r\n  text-decoration: none;\r\n`;\r\n\r\nconst StyledImage = styled(Image)`\r\n  display: block;\r\n  width: 100%;\r\n  height: auto;\r\n  aspect-ratio: 16/9;\r\n`;\r\n\r\nconst Content = styled.span`\r\n  display: flex;\r\n  flex-direction: column;\r\n  height: 200px;\r\n  padding: 18px 23px;\r\n\r\n  ${mediaQuery.md} {\r\n    padding: 27px 30px;\r\n  }\r\n`;\r\n\r\nconst StyledText = styled.span`\r\n  flex: 1;\r\n  display: block;\r\n  overflow: hidden;\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  font-size: 14px;\r\n  line-height: 1.36;\r\n  color: ${Color.rdBlackTint2};\r\n  margin: 5px 0;\r\n\r\n  ${mediaQuery.sm} {\r\n    margin: 10px 0 5px;\r\n  }\r\n`;\r\n\r\nconst Date = styled.span`\r\n  font-weight: 600;\r\n  font-size: 12px;\r\n  color: #000;\r\n`;\r\n\r\ntype NewsListHorizontalItemProps = {\r\n  fields: any;\r\n};\r\n\r\nconst NewsListHorizontalItem: React.FC<NewsListHorizontalItemProps> = ({ fields = {} }) => (\r\n  <BottomShadow forceMobileStyle>\r\n    <ListItem href={fields['Link']?.value?.href}>\r\n      <FieldChecker type=\"image\" field={fields['Image']}>\r\n        <StyledImage field={imageScaler(fields['Image'], 350)} />\r\n      </FieldChecker>\r\n\r\n      <Content>\r\n        <FieldChecker type=\"text\" field={fields['Headline']}>\r\n          <Typography type=\"h8\" color={Color.rdPureBlack}>\r\n            <Text field={fields['Headline']} />\r\n          </Typography>\r\n        </FieldChecker>\r\n\r\n        <FieldChecker type=\"text\" field={fields['Text']}>\r\n          <StyledText>\r\n            <Text field={fields['Text']} />\r\n          </StyledText>\r\n        </FieldChecker>\r\n\r\n        <FieldChecker type=\"text\" field={fields['Date']}>\r\n          <Date>\r\n            <Text field={fields['Date']} />\r\n          </Date>\r\n        </FieldChecker>\r\n      </Content>\r\n    </ListItem>\r\n  </BottomShadow>\r\n);\r\n\r\nexport default NewsListHorizontalItem;\r\n","import { Text, withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { BottomShadow, Box, Col, Container, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, LinkAnimatedUnderline, Section } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\n\r\nconst HorizontalLines = styled.div`\r\n  &,\r\n  ::before {\r\n    position: absolute;\r\n    top: 0;\r\n    left: 0;\r\n    right: 0;\r\n    height: 4px;\r\n    background: #f1f1f1;\r\n\r\n    ${mediaQuery.md} {\r\n      top: 50px;\r\n    }\r\n  }\r\n\r\n  ::before {\r\n    content: '';\r\n    display: block;\r\n    top: 7px;\r\n  }\r\n`;\r\n\r\nconst List = styled(BottomShadow)`\r\n  border-radius: 5px;\r\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.15);\r\n  background: #fff;\r\n`;\r\n\r\nexport type NewsListVerticalProps = PlaceholderProps & {\r\n  fields: any;\r\n  newsItemsVertical: any;\r\n};\r\n\r\nconst NewsListVertical: React.FC<NewsListVerticalProps> = ({ fields = {}, newsItemsVertical }) => {\r\n  const hasNewsItems = newsItemsVertical && newsItemsVertical.length > 0;\r\n  const isEditor = useIsEditor();\r\n  const showNewsItems = hasNewsItems || isEditor;\r\n\r\n  return (\r\n    <Section componentName=\"NewsListVertical\" margin=\"large\">\r\n      <Container>\r\n        <HorizontalLines />\r\n\r\n        <Row>\r\n          <Col md={5}>\r\n            <Box paddingTop={{ _: 6, md: 10 }} paddingBottom={6}>\r\n              <FieldChecker type=\"text\" field={fields['Headline']}>\r\n                <Typography type=\"h3\">\r\n                  <Text field={fields['Headline']} />\r\n                </Typography>\r\n              </FieldChecker>\r\n\r\n              <FieldChecker type=\"text\" field={fields['Description']}>\r\n                <Typography type=\"manchetSmall\" mt={4} mb={4}>\r\n                  <Text field={fields['Description']} />\r\n                </Typography>\r\n              </FieldChecker>\r\n\r\n              <FieldChecker type=\"link\" field={fields['Link']}>\r\n                <LinkAnimatedUnderline field={fields['Link']} />\r\n              </FieldChecker>\r\n            </Box>\r\n          </Col>\r\n\r\n          <Col md={6} offset={{ md: 1 }}>\r\n            {showNewsItems && <List>{newsItemsVertical}</List>}\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('newsItemsVertical')(NewsListVertical);\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Color, mediaQuery, RddkTheme, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker } from '../../shared/components';\r\n\r\nconst ListItem = styled.a`\r\n  position: relative;\r\n  display: block;\r\n  overflow: hidden;\r\n  padding: 25px 30px;\r\n  text-decoration: none;\r\n  border-top: 3px solid #eee;\r\n\r\n  &:first-child {\r\n    border-top: 0;\r\n  }\r\n\r\n  ::before {\r\n    content: '';\r\n    display: block;\r\n    width: 8px;\r\n    position: absolute;\r\n    top: 0;\r\n    left: -8px;\r\n    bottom: 0;\r\n    background: #e2001a;\r\n    transition: all 0.3s;\r\n  }\r\n\r\n  :hover,\r\n  :focus {\r\n    ::before {\r\n      left: 0;\r\n    }\r\n  }\r\n\r\n  ${mediaQuery.sm} {\r\n    padding: 30px 40px;\r\n  }\r\n\r\n  ${mediaQuery.lg} {\r\n    padding: 40px 50px;\r\n  }\r\n`;\r\n\r\nconst ListItemText = styled.div`\r\n  font-family: ${RddkTheme.fonts.sans};\r\n  font-size: 14px;\r\n  line-height: 1.36;\r\n  color: ${Color.rdBlackTint2};\r\n  margin: 5px 0;\r\n\r\n  ${mediaQuery.md} {\r\n    margin: 0 0 5px;\r\n  }\r\n`;\r\n\r\nconst ListItemDate = styled.span`\r\n  font-weight: 600;\r\n  font-size: 12px;\r\n  color: #000;\r\n`;\r\n\r\ntype NewsListVerticalItemProps = {\r\n  fields: any;\r\n};\r\n\r\nconst NewsListVerticalItem: React.FC<NewsListVerticalItemProps> = ({ fields = {} }) => (\r\n  <ListItem href={fields['Link']?.value?.href}>\r\n    <FieldChecker type=\"text\" field={fields['Headline']}>\r\n      <Typography type=\"h7\" color={Color.rdPureBlack}>\r\n        <Text field={fields['Headline']} />\r\n      </Typography>\r\n    </FieldChecker>\r\n\r\n    <FieldChecker type=\"text\" field={fields['Text']}>\r\n      <ListItemText>\r\n        <Text field={fields['Text']} />\r\n      </ListItemText>\r\n    </FieldChecker>\r\n\r\n    <FieldChecker type=\"text\" field={fields['Date']}>\r\n      <ListItemDate>\r\n        <Text field={fields['Date']} />\r\n      </ListItemDate>\r\n    </FieldChecker>\r\n  </ListItem>\r\n);\r\n\r\nexport default NewsListVerticalItem;\r\n","import { Image, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  BottomShadow,\r\n  Box,\r\n  Col,\r\n  Container,\r\n  FifthElement,\r\n  Hidden,\r\n  mediaQuery,\r\n  PopoutBox,\r\n  Row,\r\n  Typography,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, LinkAnimatedUnderline, Section } from '../../shared/components';\r\n\r\nconst Wrapper = styled.section`\r\n  overflow: hidden;\r\n  position: relative;\r\n  padding: 50px 0;\r\n  background: rgb(246, 243, 244);\r\n  background: linear-gradient(0deg, rgba(246, 243, 244, 1) 0%, rgba(252, 249, 250, 1) 100%);\r\n\r\n  ${mediaQuery.md} {\r\n    padding: 90px 0;\r\n  }\r\n`;\r\n\r\nconst Overlay = styled.div`\r\n  position: absolute;\r\n  top: 0;\r\n  bottom: 0;\r\n  right: -990px;\r\n  left: 60%;\r\n  background: #fff;\r\n  transform: skew(-12deg);\r\n`;\r\n\r\nconst Features = styled.div`\r\n  margin-top: 20px;\r\n  border-top: 3px solid #f2f2f2;\r\n`;\r\n\r\nconst FeatureItem = styled.div`\r\n  padding: 20px 0;\r\n  display: flex;\r\n  flex-direction: row;\r\n  align-items: center;\r\n  border-bottom: 3px solid #f2f2f2;\r\n`;\r\n\r\nconst Icon = styled.div`\r\n  flex: 0 0 auto;\r\n  margin-right: 30px;\r\n\r\n  ${mediaQuery.mdDown} {\r\n    display: none;\r\n  }\r\n`;\r\n\r\nexport type ProductFeatureProps = {\r\n  fields: any;\r\n};\r\n\r\nconst ProductFeature: React.FC<ProductFeatureProps> = ({ fields = {} }) => {\r\n  return (\r\n    <Section componentName=\"ProductFeature\" margin=\"large\">\r\n      <Wrapper>\r\n        <Hidden xs sm md>\r\n          <Overlay>\r\n            <FifthElement position=\"top-left\" variant=\"small\" skew={false} />\r\n          </Overlay>\r\n        </Hidden>\r\n\r\n        <Container>\r\n          <Row>\r\n            <Col lg={6}>\r\n              <FieldChecker type=\"text\" field={fields['Headline']}>\r\n                <Typography type=\"h5\">\r\n                  <Text field={fields['Headline']} />\r\n                </Typography>\r\n              </FieldChecker>\r\n\r\n              <FieldChecker type=\"text\" field={fields['Label']}>\r\n                <Typography type=\"manchetSmall\">\r\n                  <Text field={fields['Label']} />\r\n                </Typography>\r\n              </FieldChecker>\r\n\r\n              <Features>\r\n                <FeatureItem>\r\n                  <FieldChecker type=\"image\" field={fields['Feature Icon 1']}>\r\n                    <Icon>\r\n                      <Image field={fields['Feature Icon 1']} />\r\n                    </Icon>\r\n                  </FieldChecker>\r\n                  <div>\r\n                    <FieldChecker type=\"text\" field={fields['Feature Title 1']}>\r\n                      <Typography type=\"h7\">\r\n                        <Text field={fields['Feature Title 1']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n                    <FieldChecker type=\"text\" field={fields['Feature Description 1']}>\r\n                      <Typography type=\"manchetSmall\">\r\n                        <Text field={fields['Feature Description 1']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n                  </div>\r\n                </FeatureItem>\r\n\r\n                <FeatureItem>\r\n                  <FieldChecker type=\"image\" field={fields['Feature Icon 2']}>\r\n                    <Icon>\r\n                      <Image field={fields['Feature Icon 2']} />\r\n                    </Icon>\r\n                  </FieldChecker>\r\n                  <div>\r\n                    <FieldChecker type=\"text\" field={fields['Feature Title 2']}>\r\n                      <Typography type=\"h7\">\r\n                        <Text field={fields['Feature Title 2']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n                    <FieldChecker type=\"text\" field={fields['Feature Description 2']}>\r\n                      <Typography type=\"manchetSmall\">\r\n                        <Text field={fields['Feature Description 2']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n                  </div>\r\n                </FeatureItem>\r\n\r\n                <FeatureItem>\r\n                  <FieldChecker type=\"image\" field={fields['Feature Icon 3']}>\r\n                    <Icon>\r\n                      <Image field={fields['Feature Icon 3']} />\r\n                    </Icon>\r\n                  </FieldChecker>\r\n                  <div>\r\n                    <FieldChecker type=\"text\" field={fields['Feature Title 3']}>\r\n                      <Typography type=\"h7\">\r\n                        <Text field={fields['Feature Title 3']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n                    <FieldChecker type=\"text\" field={fields['Feature Description 3']}>\r\n                      <Typography type=\"manchetSmall\">\r\n                        <Text field={fields['Feature Description 3']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n                  </div>\r\n                </FeatureItem>\r\n              </Features>\r\n            </Col>\r\n\r\n            <Col lg={6} xl={5} offset={{ xl: 1 }}>\r\n              <Box marginTop={{ _: 6, lg: 0 }}>\r\n                <BottomShadow>\r\n                  <PopoutBox>\r\n                    <FieldChecker type=\"text\" field={fields['Box Headline']}>\r\n                      <Typography type=\"h4\">\r\n                        <Text field={fields['Box Headline']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n\r\n                    <FieldChecker type=\"text\" field={fields['Box Text']}>\r\n                      <Typography type=\"manchetSmall\" mt={4} mb={4}>\r\n                        <Text field={fields['Box Text']} />\r\n                      </Typography>\r\n                    </FieldChecker>\r\n\r\n                    <FieldChecker type=\"link\" field={fields['Box Link']}>\r\n                      <LinkAnimatedUnderline field={fields['Box Link']} />\r\n                    </FieldChecker>\r\n                  </PopoutBox>\r\n                </BottomShadow>\r\n              </Box>\r\n            </Col>\r\n          </Row>\r\n        </Container>\r\n      </Wrapper>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default ProductFeature;\r\n","import { CashLoanInterestRates, GroupSortKey, OpenOffer, VariableLoans } from './types';\r\n/**\r\n * Sorting function that takes and array of keys which will be used in a drilldown manner to firstly group data and\r\n * then sort it either ascending or descending.\r\n * No grouping will be performed on the last key of the array.\r\n * Note that the keys have to be able to be parsed as floats\r\n * @param {(OpenOffer | VariableLoans| CashLoanInterestRates)[]} data Array of OpenOffer or VariableLoans objects\r\n * @param {GroupSortKey[]} groupKeys Array of keys from an OpenOffer or VariableLoans object to be used for sorting\r\n * @returns Sorted araay of OpenOffer or VariableLoans objects\r\n */\r\nexport const groupDrillSort = (\r\n  data: (OpenOffer | VariableLoans | CashLoanInterestRates)[],\r\n  groupKeys: GroupSortKey[]\r\n): (OpenOffer | VariableLoans | CashLoanInterestRates)[] => {\r\n  let keyIndex = 0;\r\n  let resultSet: (OpenOffer | VariableLoans | CashLoanInterestRates)[] = [];\r\n\r\n  // Check if keys fail parseFloat\r\n  const validateData = (obj: OpenOffer | VariableLoans | CashLoanInterestRates): GroupSortKey[] =>\r\n    groupKeys.filter((gk) => obj[gk.key] === undefined || isNaN(parseFloat(obj[gk.key])));\r\n\r\n  const sortGroup = (data, { key, desc }): (OpenOffer | VariableLoans | CashLoanInterestRates)[] => {\r\n    if (key === groupKeys[groupKeys.length - 1].key) {\r\n      const sorted = data.sort((firstObj, secondObj) => parseFloat(firstObj[key]) - parseFloat(secondObj[key]));\r\n      if (desc) sorted.reverse();\r\n      return sorted;\r\n    }\r\n    const groups = {};\r\n    data.forEach((loan) => {\r\n      if (!groups[loan[key]]) {\r\n        groups[loan[key]] = [];\r\n      }\r\n      groups[loan[key]].push(loan);\r\n    });\r\n    const groupsArr = Object.keys(groups)\r\n      .sort((firstObj, secondObj) => parseFloat(firstObj) - parseFloat(secondObj))\r\n      .map((groupKey) => {\r\n        return [...groups[groupKey]];\r\n      });\r\n    if (desc) groupsArr.reverse();\r\n    keyIndex++;\r\n    groupsArr.forEach((group) => {\r\n      if (keyIndex < groupKeys.length) {\r\n        const sortResult = sortGroup(group, groupKeys[keyIndex]);\r\n        if (sortResult.length) resultSet.push(...sortResult);\r\n      }\r\n    });\r\n    keyIndex = 0;\r\n    return [];\r\n  };\r\n\r\n  if (!data.length) {\r\n    console.warn('No table data to sort');\r\n    return resultSet;\r\n  }\r\n\r\n  const validationCheck = validateData(data[0]);\r\n  if (validationCheck.length) {\r\n    console.warn(`Following key${validationCheck.length > 1 ? 's' : ''} cannot be used for sorting: `, validationCheck);\r\n    return data;\r\n  }\r\n\r\n  sortGroup(data, groupKeys[0]);\r\n  return resultSet;\r\n};\r\n\r\nexport const filterDataOnPrices = (\r\n  data: (OpenOffer | CashLoanInterestRates)[],\r\n  fromPrice: number,\r\n  toPrice: number\r\n): (OpenOffer | CashLoanInterestRates)[] => {\r\n  return data.filter((item) => item?.offerprice >= fromPrice && item?.offerprice <= toPrice);\r\n};\r\n\r\n// filterClosedBonds to be removed after PROD verification of closed bonds\r\nexport const filterClosedBonds = (\r\n  data: (OpenOffer | CashLoanInterestRates)[]\r\n): (OpenOffer | CashLoanInterestRates)[] => {\r\n  return data.filter((item) => item?.offerprice > -1);\r\n};\r\n\r\n// filterClosedBonds to be removed after PROD verification of closed bonds\r\nexport const showClosedBonds = (data: (OpenOffer | CashLoanInterestRates)[]): (OpenOffer | CashLoanInterestRates)[] => {\r\n  return data.filter((item) => item?.offerprice < 0);\r\n};\r\n\r\nexport const filterDataOnProductType = (\r\n  data: VariableLoans[],\r\n  productOne: string,\r\n  productTwo: string\r\n): VariableLoans[] => {\r\n  const filteredData: VariableLoans[] = data.filter((item) => item?.name !== productOne && item?.name !== productTwo);\r\n  return filteredData;\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { filterClosedBonds, filterDataOnPrices, groupDrillSort } from '../Utils';\r\nimport { CashLoanInterestRates, OpenOffer, VariableLoans } from '../types';\r\n\r\nimport cashloandemodata from '../demo-data/getCashLoansInterestRates.json';\r\n\r\nconst useFormatCashLoan = (useFetchProps) => {\r\n  const { inputdata, showAllLoans } = useFetchProps;\r\n  const [formattedAPIData, setFormattedAPIData] = useState<any>('');\r\n\r\n  const formatCashLoanData = (cashLoansAPIResponse, showAllLoans) => {\r\n    let filteredData: (OpenOffer | VariableLoans | CashLoanInterestRates)[] = cashloandemodata;\r\n    if (cashLoansAPIResponse?.length > 0) {\r\n      let dataToProcess: (CashLoanInterestRates | OpenOffer)[] = cashLoansAPIResponse;\r\n      if (!showAllLoans) dataToProcess = filterDataOnPrices(dataToProcess, 90, 99.75);\r\n      filteredData = filterClosedBonds(dataToProcess);\r\n      const sortedData = groupDrillSort(filteredData, [\r\n        { key: 'termToMaturityYears', desc: true },\r\n        { key: 'nominelInterestRate', desc: true },\r\n        { key: 'numberOfTermsWithoutRepayment', desc: false },\r\n      ]);\r\n      filteredData = sortedData;\r\n      return filteredData as CashLoanInterestRates[];\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (inputdata && inputdata.length > 0) {\r\n      setFormattedAPIData(formatCashLoanData(inputdata, showAllLoans));\r\n    }\r\n  }, [inputdata, showAllLoans]);\r\n  return formattedAPIData;\r\n};\r\nexport default useFormatCashLoan;\r\n","import { useEffect, useState } from 'react';\r\nimport { filterClosedBonds, filterDataOnPrices, groupDrillSort, showClosedBonds } from '../Utils';\r\nimport { CashLoanInterestRates, OpenOffer, VariableLoans } from '../types';\r\n\r\nimport demoData from '../demo-data/getOpenOffers.json';\r\n\r\nconst useFormatFixedLoan = (useFormatFixedLoanProps) => {\r\n  const { inputdata, isBusinessPage, selectedTab, showAllLoans } = useFormatFixedLoanProps;\r\n  const [formattedAPIData, setFormattedAPIData] = useState<any>('');\r\n\r\n  const formatFixedLoanData = (fixedLoansAPIResponse, isBusinessPage, showAllLoans, selectedTab) => {\r\n    let filteredData: (OpenOffer | VariableLoans | CashLoanInterestRates)[] = demoData;\r\n\r\n    if (fixedLoansAPIResponse?.length > 0) {\r\n      let dataToProcess: (OpenOffer | CashLoanInterestRates)[] = fixedLoansAPIResponse;\r\n      filteredData = [...dataToProcess];\r\n      //for closed bond tab-> closed loans are shown for fixed bond tab->show all button is processed\r\n      if ((isBusinessPage && selectedTab === 3) || (!isBusinessPage && selectedTab === 2)) {\r\n        let closedBondsdata = showClosedBonds(dataToProcess);\r\n        closedBondsdata.length > 0 ? (filteredData = closedBondsdata) : (filteredData = demoData);\r\n      } else {\r\n        if (!showAllLoans) dataToProcess = filterDataOnPrices(dataToProcess, 90, 99.75);\r\n        filteredData = filterClosedBonds(dataToProcess);\r\n      }\r\n      const sortedData = groupDrillSort(filteredData, [\r\n        { key: 'termToMaturityYears', desc: true },\r\n        { key: 'nominelInterestRate', desc: true },\r\n        { key: 'numberOfTermsWithoutRepayment', desc: false },\r\n      ]);\r\n      filteredData = sortedData;\r\n    }\r\n\r\n    return filteredData as OpenOffer[];\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (inputdata && inputdata.length > 0) {\r\n      setFormattedAPIData(formatFixedLoanData(inputdata, isBusinessPage, showAllLoans, selectedTab));\r\n    }\r\n  }, [inputdata, selectedTab, isBusinessPage, showAllLoans]);\r\n  return formattedAPIData;\r\n};\r\n\r\nexport default useFormatFixedLoan;\r\n","import { useEffect, useState } from 'react';\r\nimport { filterDataOnProductType } from '../Utils';\r\n\r\nconst useFormatVariableLoan = (useFormatVariableLoanProps) => {\r\n  const { inputdata, isBusinessPage, sortOrder } = useFormatVariableLoanProps;\r\n  const [formattedAPIData, setFormattedAPIData] = useState<any>('');\r\n\r\n  const formatVariableLoanData = (variableLoanAPIResponse, isBusinessPage, sortOrder) => {\r\n    const sortVariableLoans = (inputsortOrder, dataToSort) => {\r\n      dataToSort.sort((a, b) => {\r\n        return inputsortOrder.indexOf(a.name) - inputsortOrder.indexOf(b.name);\r\n      });\r\n    };\r\n    sortVariableLoans(sortOrder, variableLoanAPIResponse);\r\n    // Cibor products are hidden from non-business customers\r\n    let filteredData = variableLoanAPIResponse;\r\n    if (!isBusinessPage) {\r\n      filteredData = filterDataOnProductType(\r\n        variableLoanAPIResponse,\r\n        'Cibor6_WithInstallment',\r\n        'Cibor6_WithoutInstallment'\r\n      );\r\n    }\r\n    return filteredData;\r\n  };\r\n  useEffect(() => {\r\n    if (inputdata && inputdata.length > 0) {\r\n      setFormattedAPIData(formatVariableLoanData(inputdata, isBusinessPage, sortOrder));\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [inputdata, isBusinessPage]);\r\n  return formattedAPIData;\r\n};\r\n\r\nexport default useFormatVariableLoan;\r\n","import { useEffect, useState } from 'react';\r\nconst useLastUpdateTimeStamp = (APIResponseData, selectedTab) => {\r\n  const [lastModified, setLastModified] = useState(null);\r\n  useEffect(() => {\r\n    if (!APIResponseData || APIResponseData.length <= 0) {\r\n      setLastModified(null);\r\n    }\r\n    const date = APIResponseData[0]?.lastModified;\r\n    if (!date) {\r\n      setLastModified(null);\r\n    }\r\n    setLastModified(date);\r\n  }, [APIResponseData, selectedTab]);\r\n  return lastModified;\r\n};\r\nexport default useLastUpdateTimeStamp;\r\n","import { CellRenderProps, Icons } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled, { css } from 'styled-components';\r\n\r\nconst IconWrapper = styled.span<{ isDown?: boolean }>`\r\n  position: relative;\r\n  top: 2px;\r\n  margin-right: 5px;\r\n\r\n  path {\r\n    fill: #11b135;\r\n  }\r\n\r\n  ${(props) =>\r\n    props.isDown &&\r\n    css`\r\n      svg {\r\n        transform: rotate(180deg);\r\n      }\r\n      path {\r\n        fill: red;\r\n      }\r\n    `}\r\n`;\r\n\r\nexport const TableCellRender: React.FC<CellRenderProps> = (props) => {\r\n  const { text, arrowDirection } = props.cell.data;\r\n\r\n  return (\r\n    <>\r\n      {arrowDirection === 'up' && (\r\n        <IconWrapper>\r\n          <Icons.ArrowUp />\r\n        </IconWrapper>\r\n      )}\r\n      {arrowDirection === 'down' && (\r\n        <IconWrapper isDown={true}>\r\n          <Icons.ArrowUp />\r\n        </IconWrapper>\r\n      )}\r\n      {text}\r\n    </>\r\n  );\r\n};\r\n","import dayjs from 'dayjs';\r\nimport {\r\n  Cell,\r\n  Color,\r\n  DynamicTable,\r\n  Icons,\r\n  IconWrapper,\r\n  LinkAnimatedUnderline,\r\n  RddkTheme,\r\n  TableData,\r\n  Tooltip,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { formatAsCurrency } from '../../shared/utils/currency';\r\nimport { TableCellRender } from './TableCellRender';\r\nimport { CashLoanInterestRates } from './types';\r\n\r\ntype TableCashLoanProps = {\r\n  data: CashLoanInterestRates[];\r\n  handleClick: any;\r\n};\r\n\r\nexport const TableCashLoan: React.FC<TableCashLoanProps> = ({ data, handleClick }) => {\r\n  const { t } = useTranslation();\r\n  const tableData = React.useMemo((): TableData => {\r\n    if (!data || data.length <= 0) {\r\n      return [];\r\n    }\r\n    const date1 = data[0]?.interestRates?.[1]?.date\r\n      ? dayjs(data[0]?.interestRates?.[1]?.date).format('DD.MM.YYYY')\r\n      : '';\r\n    const date2 = data[0]?.interestRates?.[2]?.date\r\n      ? dayjs(data[0]?.interestRates?.[2]?.date).format('DD.MM.YYYY')\r\n      : '';\r\n    const date3 = data[0]?.interestRates?.[3]?.date\r\n      ? dayjs(data[0]?.interestRates?.[3]?.date).format('DD.MM.YYYY')\r\n      : '';\r\n\r\n    return [\r\n      // Header row:\r\n      [\r\n        {\r\n          style: {\r\n            width: 250,\r\n          },\r\n          value: t(`kurser-cashLoan-LoanName-header`),\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n        // This column is here match \"bond closed\" column so sorting works (sorting functions uses the index of the header as the indes for the data column)\r\n        {\r\n          style: {\r\n            borderLeft: 0,\r\n            width: 120,\r\n          },\r\n          value: null,\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Aktuel kontantrente',\r\n          sortable: true,\r\n          alignVertically: 'middle',\r\n          minWidth: 160,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixedcashloan-tooltip-Aktuel-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Tilbudt kontantrente',\r\n          sortable: true,\r\n          alignVertically: 'middle',\r\n          minWidth: 160,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixedcashloan-tooltip-Tilbudt-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Kontantrente',\r\n          suffix: 'Fastkursaftale ' + date1,\r\n          minWidth: 190,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixedcashloan-tooltip-Kontantrente-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Kontantrente',\r\n          suffix: 'Fastkursaftale ' + date2,\r\n          minWidth: 190,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixedcashloan-tooltip-Kontantrente-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Kontantrente',\r\n          suffix: 'Fastkursaftale ' + date3,\r\n          minWidth: 190,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixedcashloan-tooltip-Kontantrente-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n      ],\r\n      // Body rows:\r\n      ...data.map((item): Cell[] => {\r\n        return [\r\n          {\r\n            style: {\r\n              width: 250,\r\n            },\r\n            prefix: item?.numberOfTermsWithoutRepayment\r\n              ? parseFloat(item.numberOfTermsWithoutRepayment) === 0\r\n                ? t('kurser-termsWithoutRepaymentEQ0-label') + `  (årgang ${item?.bondname.slice(-4)})`\r\n                : parseFloat(item.numberOfTermsWithoutRepayment) === 40\r\n                ? t('kurser-termsWithoutRepaymentEQ40-label') + `  (årgang ${item?.bondname.slice(-4)})`\r\n                : t('kurser-termsWithoutRepaymentGT40-label') + `  (årgang ${item?.bondname.slice(-4)})`\r\n              : '',\r\n            value: `${item?.termToMaturityYears ? parseFloat(item.termToMaturityYears).toFixed(0) : 0} år / ${\r\n              item?.nominelInterestRate ? formatAsCurrency(parseFloat(item.nominelInterestRate), 1, true) : 0\r\n            } %`,\r\n            suffix: item?.isinCode || '',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              minWidth: 110,\r\n              position: 'relative',\r\n            },\r\n            value: (\r\n              <>\r\n                {item?.offerprice > 99.75 || item?.offerprice < 0 ? (\r\n                  <ClosedBond>\r\n                    {' '}\r\n                    <span>{t('kurser-closedbond-information-label')}</span>{' '}\r\n                  </ClosedBond>\r\n                ) : null}\r\n                <Link\r\n                  href={void 0}\r\n                  textColor={Color.red40}\r\n                  underlineColorPrimary={Color.red40}\r\n                  onClick={(e) => {\r\n                    handleClick(item?.isinCode);\r\n                  }}\r\n                >\r\n                  {t('kurser-showLoanDetails-label')}\r\n                </Link>\r\n              </>\r\n            ),\r\n            alignVertically: 'top',\r\n          },\r\n          {\r\n            value: `${\r\n              parseFloat(item?.interestRates?.[0]?.interestRate.replace(/,/, '.')) < 0 ||\r\n              String(item?.interestRates?.[0]?.interestRate) === '' ||\r\n              String(item?.interestRates?.[0]?.interestRate) === 'undefined'\r\n                ? '-'\r\n                : isNaN(Number(item?.interestRates?.[0]?.interestRate))\r\n                ? item.interestRates?.[0].interestRate\r\n                : formatAsCurrency(Number(item.interestRates?.[0].interestRate), 4, true) + ' %'\r\n            }`,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: item?.offerrate,\r\n            data: {\r\n              text: `${\r\n                String(item?.offerrate) === '' ||\r\n                String(item?.offerrate) === 'undefined' ||\r\n                parseFloat(String(item?.offerrate).replace(/,/, '.')) < 0\r\n                  ? '-'\r\n                  : isNaN(item?.offerrate)\r\n                  ? item?.offerrate\r\n                  : formatAsCurrency(item?.offerrate, 4, true) + ' %'\r\n              }`,\r\n            },\r\n            cellValueRender: TableCellRender,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          // code changes made to show '-' whenever we get -ve value from backend.\r\n          // backend would send -ve value when the API could not get bond prices for future dates.\r\n          {\r\n            value:\r\n              parseFloat(item?.interestRates?.[1]?.interestRate.replace(/,/, '.')) < 0 ||\r\n              item?.interestRates?.[1]?.interestRate === '' ||\r\n              item?.interestRates?.[1]?.interestRate === 'undefined'\r\n                ? '-'\r\n                : isNaN(Number(item?.interestRates?.[1]?.interestRate))\r\n                ? item.interestRates?.[1].interestRate\r\n                : formatAsCurrency(Number(item.interestRates?.[1].interestRate), 4, true) + ' %',\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value:\r\n              parseFloat(item?.interestRates?.[2]?.interestRate.replace(/,/, '.')) < 0 ||\r\n              item?.interestRates?.[2]?.interestRate === '' ||\r\n              item?.interestRates?.[2]?.interestRate === 'undefined'\r\n                ? '-'\r\n                : isNaN(Number(item?.interestRates?.[2]?.interestRate))\r\n                ? item.interestRates?.[2].interestRate\r\n                : formatAsCurrency(Number(item.interestRates?.[2].interestRate), 4, true) + ' %',\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value:\r\n              parseFloat(item?.interestRates?.[3]?.interestRate.replace(/,/, '.')) < 0 ||\r\n              item?.interestRates?.[3]?.interestRate === '' ||\r\n              item?.interestRates?.[3]?.interestRate === 'undefined'\r\n                ? '-'\r\n                : isNaN(Number(item?.interestRates?.[3]?.interestRate))\r\n                ? item.interestRates?.[3].interestRate\r\n                : formatAsCurrency(Number(item.interestRates?.[3].interestRate), 4, true) + ' %',\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n        ];\r\n      }),\r\n    ];\r\n  }, [data, t, handleClick]);\r\n\r\n  return <DynamicTable striped={false} bordered={true} firstRowIsHead={true} data={tableData} />;\r\n};\r\n\r\nconst ClosedBond = styled.div`\r\n  width: 74px;\r\n  height: 28px;\r\n  padding: 3px;\r\n  border-radius: 3px;\r\n  text-align: center;\r\n  border: solid 1px ${RddkTheme.colors.red50};\r\n  background-color: rgba(226, 0, 26, 0.08);\r\n  span {\r\n    font-size: 12px;\r\n    font-weight: 600;\r\n    font-stretch: normal;\r\n    font-style: normal;\r\n    line-height: 1.25;\r\n    letter-spacing: 0.8px;\r\n    text-align: center;\r\n    color: ${RddkTheme.colors.red50};\r\n  }\r\n`;\r\n\r\nconst Link = styled(LinkAnimatedUnderline)`\r\n  cursor: pointer;\r\n  position: absolute;\r\n  bottom: 21%;\r\n  right: 19%;\r\n  font-size: 12px;\r\n  color: ${RddkTheme.colors.red40};\r\n`;\r\n","import dayjs from 'dayjs';\r\nimport {\r\n  Cell,\r\n  Color,\r\n  DynamicTable,\r\n  Icons,\r\n  IconWrapper,\r\n  LinkAnimatedUnderline,\r\n  RddkTheme,\r\n  TableData,\r\n  Tooltip,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { OpenOffer } from './types';\r\n\r\ntype TableClosedBondsProps = {\r\n  data: OpenOffer[];\r\n  handleClick: any;\r\n};\r\n\r\nexport const TableClosedBonds: React.FC<TableClosedBondsProps> = ({ data, handleClick }) => {\r\n  const { t } = useTranslation();\r\n  const formatDate = (date: string) => {\r\n    //extract and format data from \"dd-mm-yyyy 00:00:00\" to \"yyyy.mm.dd\"\r\n    let datearray = date.slice(0, 10).split('-');\r\n    let newdate = datearray[2] + '-' + datearray[1] + '-' + datearray[0];\r\n    return dayjs(newdate).format('DD.MM.YYYY');\r\n  };\r\n\r\n  const tableData = React.useMemo((): TableData => {\r\n    if (!data || data.length <= 0) {\r\n      return [];\r\n    }\r\n    return [\r\n      // Header row:\r\n      [\r\n        {\r\n          style: {\r\n            width: 250,\r\n          },\r\n          value: t(`kurser-closedbonds-header`),\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n        // This column is here match \"show details\" column so sorting works (sorting functions uses the index of the header as the indes for the data column)\r\n        {\r\n          style: {\r\n            borderLeft: 0,\r\n            width: 120,\r\n          },\r\n          value: null,\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          style: {\r\n            width: 250,\r\n          },\r\n          value: t(`kurser-closedbonds-columnname-maturity`),\r\n          sortable: true,\r\n\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n        {\r\n          style: {\r\n            width: 250,\r\n          },\r\n          value: t(`kurser-closedbonds-columnname-interestRate`),\r\n          sortable: true,\r\n\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n        {\r\n          style: {\r\n            width: 210,\r\n          },\r\n          value: t(`kurser-closedbonds-columnname-redemptionPrice`),\r\n          alignVertically: 'middle',\r\n          minWidth: 140,\r\n          sortable: false,\r\n        },\r\n        {\r\n          style: {\r\n            width: 20,\r\n          },\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-closedbonds-tooltip-Kursvalue-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          style: {\r\n            width: 250,\r\n          },\r\n          value: t(`kurser-closedbonds-columnname-redemptionDate`),\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n      ],\r\n      // Body rows:\r\n      ...data.map((item): Cell[] => {\r\n        const closedBondPriceDate = item?.redemptionDate && formatDate(item?.redemptionDate);\r\n        return [\r\n          {\r\n            style: {\r\n              width: 250,\r\n            },\r\n            prefix:\r\n              item?.bondname.slice(0, 1) === '-'\r\n                ? item?.numberOfTermsWithoutRepayment\r\n                  ? parseFloat(item.numberOfTermsWithoutRepayment) === 0\r\n                    ? t('kurser-termsWithoutRepaymentEQ0-label') + `  (årgang ${item?.bondname.slice(15, 19)})`\r\n                    : parseFloat(item.numberOfTermsWithoutRepayment) === 40\r\n                    ? t('kurser-termsWithoutRepaymentEQ40-label') + `  (årgang ${item?.bondname.slice(15, 19)})`\r\n                    : t('kurser-termsWithoutRepaymentGT40-label') + `  (årgang ${item?.bondname.slice(15, 19)})`\r\n                  : ''\r\n                : item?.numberOfTermsWithoutRepayment\r\n                ? parseFloat(item.numberOfTermsWithoutRepayment) === 0\r\n                  ? t('kurser-termsWithoutRepaymentEQ0-label') + `  (årgang ${item?.bondname.slice(14, 18)})`\r\n                  : parseFloat(item.numberOfTermsWithoutRepayment) === 40\r\n                  ? t('kurser-termsWithoutRepaymentEQ40-label') + `  (årgang ${item?.bondname.slice(14, 18)})`\r\n                  : t('kurser-termsWithoutRepaymentGT40-label') + `  (årgang ${item?.bondname.slice(14, 18)})`\r\n                : '',\r\n\r\n            value: '',\r\n            suffix: item?.isinCode || '',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              minWidth: 110,\r\n              position: 'relative',\r\n            },\r\n            value: (\r\n              <>\r\n                {null}\r\n                <Link\r\n                  href={void 0}\r\n                  textColor={Color.red40}\r\n                  underlineColorPrimary={Color.red40}\r\n                  onClick={(e) => {\r\n                    handleClick(item?.isinCode);\r\n                  }}\r\n                >\r\n                  {t('kurser-showLoanDetails-label')}\r\n                </Link>\r\n              </>\r\n            ),\r\n            alignVertically: 'top',\r\n          },\r\n          {\r\n            value:\r\n              item?.termToMaturityYears === '' || item?.termToMaturityYears === undefined\r\n                ? '-'\r\n                : parseFloat(item.termToMaturityYears),\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            value:\r\n              item?.nominelInterestRate === '' || item?.nominelInterestRate === undefined\r\n                ? '-'\r\n                : isNaN(Number(item?.nominelInterestRate))\r\n                ? `${item?.nominelInterestRate}%`\r\n                : `${item?.nominelInterestRate.replace('.', ',').slice(0, -3)}%`,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            value:\r\n              item?.prices?.[0]?.price === '' || item?.prices?.[0]?.price === undefined\r\n                ? '-'\r\n                : String(item?.prices?.[0]?.price).slice(0, -1),\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: `${closedBondPriceDate === '' || closedBondPriceDate === 'undefined' ? '-' : closedBondPriceDate}`,\r\n            alignVertically: 'middle',\r\n          },\r\n        ];\r\n      }),\r\n    ];\r\n  }, [data, t, handleClick]);\r\n\r\n  return <DynamicTable striped={false} bordered={true} firstRowIsHead={true} data={tableData} />;\r\n};\r\n\r\nconst Link = styled(LinkAnimatedUnderline)`\r\n  cursor: pointer;\r\n  position: absolute;\r\n  bottom: 21%;\r\n  right: 19%;\r\n  font-size: 12px;\r\n  color: ${RddkTheme.colors.red40};\r\n`;\r\n","import dayjs from 'dayjs';\r\nimport {\r\n  Cell,\r\n  Color,\r\n  DynamicTable,\r\n  Icons,\r\n  IconWrapper,\r\n  LinkAnimatedUnderline,\r\n  RddkTheme,\r\n  TableData,\r\n  Tooltip,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { formatAsCurrency } from '../../shared/utils/currency';\r\nimport { TableCellRender } from './TableCellRender';\r\nimport { OpenOffer } from './types';\r\n\r\ntype TableFastforrentetProps = {\r\n  data: OpenOffer[];\r\n  handleClick: any;\r\n};\r\n\r\nexport const TableFastforrentet: React.FC<TableFastforrentetProps> = ({ data, handleClick }) => {\r\n  const { t } = useTranslation();\r\n  const tableData = React.useMemo((): TableData => {\r\n    if (!data || data.length <= 0) {\r\n      return [];\r\n    }\r\n\r\n    const date1 = data[0]?.prices?.[1]?.date ? dayjs(data[0].prices?.[1].date).format('DD.MM.YYYY') : '';\r\n    const date2 = data[0]?.prices?.[2]?.date ? dayjs(data[0].prices?.[2].date).format('DD.MM.YYYY') : '';\r\n    const date3 = data[0]?.prices?.[3]?.date ? dayjs(data[0].prices?.[3].date).format('DD.MM.YYYY') : '';\r\n\r\n    return [\r\n      // Header row:\r\n      [\r\n        {\r\n          style: {\r\n            width: 250,\r\n          },\r\n          value: 'Obligationslån',\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n\r\n        // This column is here match \"bond closed\" column so sorting works (sorting functions uses the index of the header as the indes for the data column)\r\n        {\r\n          style: {\r\n            borderLeft: 0,\r\n            width: 120,\r\n          },\r\n          value: null,\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Aktuel kurs',\r\n          sortable: true,\r\n          alignVertically: 'middle',\r\n          minWidth: 160,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixed-tooltip-aktuelkurs-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Tilbudskurs',\r\n          sortable: true,\r\n          alignVertically: 'middle',\r\n          minWidth: 160,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixed-tooltip-tilbudskurs-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Udbetalingskurs',\r\n          suffix: 'Fastkursaftale ' + date1,\r\n          minWidth: 190,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixed-tooltip-fastkurs-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Udbetalingskurs',\r\n          suffix: 'Fastkursaftale ' + date2,\r\n          minWidth: 190,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixed-tooltip-fastkurs-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Udbetalingskurs',\r\n          suffix: 'Fastkursaftale ' + date3,\r\n          minWidth: 190,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-fixed-tooltip-fastkurs-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n      ],\r\n      // Body rows:\r\n      ...data.map((item): Cell[] => {\r\n        return [\r\n          {\r\n            style: {\r\n              width: 250,\r\n            },\r\n            prefix: item?.numberOfTermsWithoutRepayment\r\n              ? parseFloat(item.numberOfTermsWithoutRepayment) === 0\r\n                ? t('kurser-termsWithoutRepaymentEQ0-label') + ` (årgang ${item?.bondname.slice(-4)})`\r\n                : parseFloat(item.numberOfTermsWithoutRepayment) === 40\r\n                ? t('kurser-termsWithoutRepaymentEQ40-label') + ` (årgang ${item?.bondname.slice(-4)})`\r\n                : t('kurser-termsWithoutRepaymentGT40-label') + ` (årgang ${item?.bondname.slice(-4)})`\r\n              : '',\r\n            value: `${item?.termToMaturityYears ? parseFloat(item.termToMaturityYears).toFixed(0) : 0} år / ${\r\n              item?.nominelInterestRate ? formatAsCurrency(parseFloat(item.nominelInterestRate), 1, true) : 0\r\n            } %`,\r\n            suffix: item?.isinCode || '',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              minWidth: 110,\r\n              position: 'relative',\r\n            },\r\n            value: (\r\n              <>\r\n                {item?.offerprice > 99.75 || item?.offerprice < 0 ? (\r\n                  <ClosedBond>\r\n                    {' '}\r\n                    <span>{t('kurser-closedbond-information-label')}</span>{' '}\r\n                  </ClosedBond>\r\n                ) : null}\r\n                <Link\r\n                  href={void 0}\r\n                  textColor={Color.red40}\r\n                  underlineColorPrimary={Color.red40}\r\n                  onClick={(e) => {\r\n                    handleClick(item?.isinCode);\r\n                  }}\r\n                >\r\n                  {t('kurser-showLoanDetails-label')}\r\n                </Link>\r\n              </>\r\n            ),\r\n            alignVertically: 'top',\r\n          },\r\n          {\r\n            value: parseFloat(item?.prices?.[0]?.price.replace(/,/, '.')),\r\n            data: {\r\n              text:\r\n                parseFloat(item?.prices?.[0]?.price.replace(/,/, '.')) < 0 ||\r\n                item?.prices?.[0]?.price === '' ||\r\n                item?.prices?.[0]?.price === 'undefined'\r\n                  ? '-'\r\n                  : (item?.prices?.[0]?.price).slice(0, -1),\r\n            },\r\n            cellValueRender: TableCellRender,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: item?.offerprice,\r\n            data: {\r\n              text:\r\n                item?.offerprice <= 0 || item?.offerprice === undefined\r\n                  ? '-'\r\n                  : formatAsCurrency(item.offerprice, 3, true),\r\n            },\r\n            cellValueRender: TableCellRender,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          // code changes made to show '-' whenever we get -ve value from backend.\r\n          // backend would send -ve value when the API could not get bond prices for future dates.\r\n          {\r\n            value:\r\n              parseFloat(item?.prices?.[1]?.price.replace(/,/, '.')) < 0 ||\r\n              item?.prices?.[1]?.price === '' ||\r\n              item?.prices?.[1]?.price === 'undefined'\r\n                ? '-'\r\n                : (item?.prices?.[1]?.price).slice(0, -1),\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value:\r\n              parseFloat(item?.prices?.[2]?.price.replace(/,/, '.')) < 0 ||\r\n              item?.prices?.[2]?.price === '' ||\r\n              item?.prices?.[2]?.price === 'undefined'\r\n                ? '-'\r\n                : (item?.prices?.[2]?.price).slice(0, -1),\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value:\r\n              parseFloat(item?.prices?.[3]?.price.replace(/,/, '.')) < 0 ||\r\n              item?.prices?.[3]?.price === '' ||\r\n              item?.prices?.[3]?.price === 'undefined'\r\n                ? '-'\r\n                : (item?.prices?.[3]?.price).slice(0, -1),\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n        ];\r\n      }),\r\n    ];\r\n  }, [data, t, handleClick]);\r\n\r\n  return <DynamicTable striped={false} bordered={true} firstRowIsHead={true} data={tableData} />;\r\n};\r\n\r\nconst ClosedBond = styled.div`\r\n  width: 74px;\r\n  height: 28px;\r\n  padding: 3px;\r\n  border-radius: 3px;\r\n  text-align: center;\r\n  border: solid 1px ${RddkTheme.colors.red50};\r\n  background-color: rgba(226, 0, 26, 0.08);\r\n  span {\r\n    font-size: 12px;\r\n    font-weight: 600;\r\n    font-stretch: normal;\r\n    font-style: normal;\r\n    line-height: 1.25;\r\n    letter-spacing: 0.8px;\r\n    text-align: center;\r\n    color: ${RddkTheme.colors.red50};\r\n  }\r\n`;\r\n\r\nconst Link = styled(LinkAnimatedUnderline)`\r\n  cursor: pointer;\r\n  position: absolute;\r\n  bottom: 21%;\r\n  right: 19%;\r\n  font-size: 12px;\r\n  color: ${RddkTheme.colors.red40};\r\n`;\r\n","import dayjs from 'dayjs';\r\nimport { Cell, DynamicTable, Icons, IconWrapper, TableData, Tooltip } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { formatAsCurrency } from '../../shared/utils/currency';\r\nimport { VariableLoans } from './types';\r\n\r\ntype TableVariabelProps = {\r\n  data: VariableLoans[];\r\n};\r\n\r\nexport const TableVariabel: React.FC<TableVariabelProps> = ({ data }) => {\r\n  const { t } = useTranslation();\r\n  const tableData = React.useMemo((): TableData => {\r\n    if (!data || data.length <= 0) {\r\n      return [];\r\n    }\r\n    const date1 = data[0]?.prices?.[1]?.date ? dayjs(data[0].prices?.[1].date).format('DD.MM.YYYY') : '';\r\n    const date2 = data[0]?.prices?.[2]?.date ? dayjs(data[0].prices?.[2].date).format('DD.MM.YYYY') : '';\r\n    const date3 = data[0]?.prices?.[3]?.date ? dayjs(data[0].prices?.[3].date).format('DD.MM.YYYY') : '';\r\n    return [\r\n      // Header row:\r\n      [\r\n        {\r\n          value: t(`kurser-variable-LoanName-header`),\r\n          alignVertically: 'middle',\r\n          minWidth: 170,\r\n        },\r\n        {\r\n          value: 'Aktuel rente',\r\n          alignVertically: 'middle',\r\n          minWidth: 160,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-variable-tooltip-ActualRente-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Tilbudsrente',\r\n          alignVertically: 'middle',\r\n          minWidth: 160,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-variable-tooltip-OfferedCashLoan-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Kontantlånsrente',\r\n          suffix: 'Fastkursaftale ' + date1,\r\n          minWidth: 180,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-variable-tooltip-FixedRateCashLoan-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Kontantlånsrente',\r\n          suffix: 'Fastkursaftale ' + date2,\r\n          minWidth: 180,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-variable-tooltip-FixedRateCashLoan-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n        {\r\n          value: 'Kontantlånsrente',\r\n          suffix: 'Fastkursaftale ' + date3,\r\n          minWidth: 180,\r\n        },\r\n        {\r\n          value: (\r\n            <Tooltip\r\n              element={\r\n                <IconWrapper size=\"24\" color=\"Action\">\r\n                  <Icons.Action.Question />\r\n                </IconWrapper>\r\n              }\r\n              content={t('kurser-variable-tooltip-FixedRateCashLoan-text')}\r\n            />\r\n          ),\r\n          alignVertically: 'middle',\r\n        },\r\n      ],\r\n      // Body rows:\r\n      ...data.map((item): Cell[] => {\r\n        const bondName = item?.name.split('_');\r\n        return [\r\n          {\r\n            prefix:\r\n              bondName.length >= 2\r\n                ? bondName[0] === 'FlexLife'\r\n                  ? t(`kurser-variable-${bondName[0]}-header`)\r\n                  : t(`kurser-variable-${bondName[0]}-header`) +\r\n                    ' ' +\r\n                    t(`kurser-variable-${bondName[bondName?.length - 1]}-asterix-label`)\r\n                : t(`kurser-variable-${bondName[0]}-header`),\r\n            value:\r\n              bondName.length === 3\r\n                ? bondName[1] + ' ' + t(`kurser-variable-${bondName[2]}-label`)\r\n                : bondName.length === 2\r\n                ? bondName[0] === 'FlexLife'\r\n                  ? (bondName[1] === 'F1'\r\n                      ? (bondName[1] = '1IR')\r\n                      : bondName[1] === 'F3'\r\n                      ? (bondName[1] = '3IR')\r\n                      : bondName[1] === 'F5'\r\n                      ? (bondName[1] = '5IR')\r\n                      : (bondName[1] = '10IR')) +\r\n                    ' ' +\r\n                    t(`kurser-variable-${bondName[0]}-label`)\r\n                  : t(`kurser-variable-${bondName[1]}-label`)\r\n                : t(`kurser-variable-${bondName[0]}-label`),\r\n            suffix: `30 år`,\r\n          },\r\n          //If API returns null value or undefined set the value as '-'\r\n          {\r\n            value: `${\r\n              String(item?.prices?.[0]?.price) === '' || String(item?.prices?.[0]?.price) === 'undefined'\r\n                ? '-'\r\n                : isNaN(item?.prices?.[0]?.price)\r\n                ? item.prices?.[0].price\r\n                : formatAsCurrency(item.prices?.[0].price, 4, true) + ' %'\r\n            }`,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: `${\r\n              String(item?.offerrate) === '' || String(item?.offerrate) === 'undefined'\r\n                ? '-'\r\n                : isNaN(item?.offerrate)\r\n                ? item?.offerrate\r\n                : formatAsCurrency(item?.offerrate, 4, true) + ' %'\r\n            }`,\r\n\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: `${\r\n              String(item?.prices?.[1]?.price) === '' || String(item?.prices?.[1]?.price) === 'undefined'\r\n                ? '-'\r\n                : isNaN(item?.prices?.[1]?.price)\r\n                ? item.prices?.[1].price\r\n                : formatAsCurrency(item.prices?.[1].price, 4, true) + ' %'\r\n            } `,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: `${\r\n              String(item?.prices?.[2]?.price) === '' || String(item?.prices?.[2]?.price) === 'undefined'\r\n                ? '-'\r\n                : isNaN(item?.prices?.[2]?.price)\r\n                ? item.prices?.[2].price\r\n                : formatAsCurrency(item.prices?.[2].price, 4, true) + ' %'\r\n            }`,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n          {\r\n            value: `${\r\n              String(item?.prices?.[3]?.price) === '' || String(item?.prices?.[3]?.price) === 'undefined'\r\n                ? '-'\r\n                : isNaN(item?.prices?.[3]?.price)\r\n                ? item.prices?.[3].price\r\n                : formatAsCurrency(item.prices?.[3].price, 4, true) + ' %'\r\n            }`,\r\n            alignVertically: 'middle',\r\n          },\r\n          {\r\n            style: {\r\n              borderLeft: 0,\r\n              maxWidth: '1px',\r\n            },\r\n            value: null,\r\n          },\r\n        ];\r\n      }),\r\n    ];\r\n  }, [data, t]);\r\n\r\n  return <DynamicTable striped={false} bordered={true} firstRowIsHead={true} data={tableData} />;\r\n};\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  Box,\r\n  BoxShadow,\r\n  Button,\r\n  Col,\r\n  Color,\r\n  Container,\r\n  Icons,\r\n  mediaQuery,\r\n  RddkTheme,\r\n  Row,\r\n  ScrollToTop,\r\n  TableSelector,\r\n  Tooltip,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { ContentParser, Section } from '../../shared/components';\r\nimport { useAdobeTracking } from '../../shared/hooks/useAdobeTracking';\r\nimport { richTextStyles } from '../RichText/richTextStyles';\r\nimport demodata from './demo-data/getOpenOffers.json';\r\nimport useFormatCashLoan from './hooks/useFormatCashLoan';\r\nimport useFormatFixedLoan from './hooks/useFormatFixedLoans';\r\nimport useFormatVariableLoan from './hooks/useFormatVariableLoan';\r\nimport useLastUpdateTimeStamp from './hooks/useLastUpdateTimeStamp';\r\nimport { TableCashLoan } from './TableCashLoan';\r\nimport { TableClosedBonds } from './TableClosedBonds';\r\nimport { TableFastforrentet } from './TableFastforrentet';\r\nimport { TableVariabel } from './TableVariabel';\r\nimport { CashLoanInterestRates, OpenOffer, VariableLoans } from './types';\r\nexport type RatesTablesProps = {\r\n  fields: any;\r\n};\r\n\r\nconst RatesTables: React.FC<RatesTablesProps> = ({ fields = {} }) => {\r\n  const { t } = useTranslation();\r\n  const [selectedTab, setSelectedTab] = React.useState(0);\r\n  const [tabValue, setTabValue] = React.useState(1);\r\n  const [tracking, setTracking] = React.useState('fixed');\r\n  const [loading, setLoading] = React.useState(true);\r\n  const [showAllLoans, setShowAllLoans] = React.useState<boolean>(false);\r\n  const [isBusinessPage, setIsBusinessPage] = React.useState<boolean>(false);\r\n  const [baseURL, setBaseURL] = React.useState('');\r\n  const loanSettings = JSON.parse(fields['Settings']?.value || '{}');\r\n  const variableLoanSortOrder = loanSettings?.variableLoanSortOrder;\r\n  const { updatePageNameFromTab } = useAdobeTracking();\r\n  //data received from API call\r\n  const [cashLoanAPIResponse, setCashLoanAPIResponse] = React.useState<CashLoanInterestRates[]>();\r\n  const [fixedLoanAPIResponse, setFixedLoanAPIResponse] = React.useState<OpenOffer[]>(demodata);\r\n  const [variableLoanAPIResponse, setVariableLoanAPIResponse] = React.useState<VariableLoans[]>();\r\n  //props for formatting API response\r\n  const formatFixedLoanProps = {\r\n    inputdata: fixedLoanAPIResponse,\r\n    isBusinessPage,\r\n    selectedTab,\r\n    showAllLoans,\r\n  };\r\n  const formatVariableLoanProps = {\r\n    inputdata: variableLoanAPIResponse,\r\n    isBusinessPage,\r\n    sortOrder: variableLoanSortOrder,\r\n  };\r\n  const formatCashLoanProps = {\r\n    inputdata: cashLoanAPIResponse,\r\n    showAllLoans,\r\n  };\r\n  //Format the data received from API call\r\n  const formatFixedLoanData = useFormatFixedLoan(formatFixedLoanProps);\r\n  const formatedVariableLoanData = useFormatVariableLoan(formatVariableLoanProps);\r\n  const formatedCashLoanData = useFormatCashLoan(formatCashLoanProps);\r\n  // Get the \"last updated\" timestamp from the fixed loan data - hook\r\n  const lastUpdate: any = useLastUpdateTimeStamp(fixedLoanAPIResponse, selectedTab);\r\n  const lastUpdateVariableLoan: any = useLastUpdateTimeStamp(formatedVariableLoanData, selectedTab);\r\n  const lastUpdateCashLoan: any = useLastUpdateTimeStamp(formatedCashLoanData, selectedTab);\r\n\r\n  React.useEffect(() => {\r\n    // Check origin of the call and Fetch data on page load\r\n    setIsBusinessPage(window.location.pathname.includes('erhverv'));\r\n    let hostname = window.location.hostname;\r\n    let hosturl = hostname === 'localhost' ? 'syst-www.rd.dk' : hostname;\r\n    setBaseURL(hosturl);\r\n    const apiUrl = `https://${hosturl}${fields['Fixed Rate - API Endpoint URL']?.value}`;\r\n    if (fields['Fixed Rate - API Endpoint URL']?.value !== '') {\r\n      const fetch = async () => {\r\n        let apiResponse: any = await fetchData(apiUrl);\r\n        if (apiResponse.success) {\r\n          setFixedLoanAPIResponse(apiResponse.data);\r\n        } else {\r\n          console.log(`error in calling ${apiUrl}, error is ${apiResponse.error}`);\r\n        }\r\n      };\r\n      fetch();\r\n      setLoading(false);\r\n    } else {\r\n      console.warn('RatesTables > Fetch Fixed Loan API Endpoint URL not defined');\r\n    }\r\n  }, [fields, setTracking]);\r\n\r\n  // Update Adobe analytics for Fixed loans\r\n  const setTrackingState = () => {\r\n    setSelectedTab(0);\r\n    setTracking('fixed');\r\n  };\r\n\r\n  //Common method to call APIs\r\n  const fetchData = async (apiurl) => {\r\n    let response;\r\n    try {\r\n      response = await fetch(apiurl, {\r\n        method: 'GET',\r\n        headers: {\r\n          Accept: 'application/json',\r\n        },\r\n      });\r\n      if (!response.ok) {\r\n        return {\r\n          success: false,\r\n          error: await response,\r\n        };\r\n      }\r\n      return {\r\n        success: true,\r\n        data: await response.json(),\r\n      };\r\n    } catch (error) {\r\n      console.log(`error in calling ${apiurl}. Error is ${error}`);\r\n    }\r\n  };\r\n\r\n  // Get Variable Loans data and Update Adobe analytics for Variable loans table\r\n  const getVariableLoans = async () => {\r\n    if (!formatedVariableLoanData || formatedVariableLoanData.length <= 0) {\r\n      setLoading(true);\r\n      const apiUrl = `https://${baseURL}${fields['Variable Rate - API Endpoint URL']?.value}`;\r\n      if (fields['Variable Rate - API Endpoint URL']?.value !== '') {\r\n        let apiResponse: any = await fetchData(apiUrl);\r\n        if (apiResponse.success) {\r\n          setVariableLoanAPIResponse(apiResponse.data);\r\n        } else {\r\n          console.log(`error in calling ${apiUrl}, error is ${apiResponse.error}`);\r\n        }\r\n      } else {\r\n        console.warn('RatesTables > Fetch Variable Loan API Endpoint URL not defined');\r\n      }\r\n    }\r\n    setLoading(false);\r\n    setSelectedTab(1);\r\n    setTracking('variable');\r\n  };\r\n  //Get Cash Loans data and Update Adobe analytics for for cash loans table\r\n  const getCashLoansData = async () => {\r\n    if (!formatedCashLoanData || formatedCashLoanData.length <= 0) {\r\n      setLoading(true);\r\n      const apiUrl = `https://${baseURL}${fields['Cashloan Fixed Interest Rate - API Endpoint URL']?.value}`;\r\n      if (fields['Cashloan Fixed Interest Rate - API Endpoint URL']?.value !== '') {\r\n        let apiResponse: any = await fetchData(apiUrl);\r\n        if (apiResponse.success) {\r\n          setCashLoanAPIResponse(apiResponse.data);\r\n        } else {\r\n          console.log(`error in calling ${apiUrl}, error is ${apiResponse.error}`);\r\n        }\r\n      } else {\r\n        console.warn('RatesTables > Fetch Cashloan Fixed Interest Rate API Endpoint URL not defined');\r\n      }\r\n    }\r\n    setLoading(false);\r\n    setSelectedTab(2);\r\n    setTracking('cashloan');\r\n  };\r\n\r\n  //Handle Click on Isin Code to show Details on ISIN on Nasdaq page\r\n  const openNasdaqSite = async (isinCode) => {\r\n    setLoading(true);\r\n    let newWindow = window.open('about:blank', '_blank');\r\n    const apiUrl = `https://${baseURL}${fields['GetIsinShortCode - API Endpoint URL']?.value}?isinCode=${isinCode}`;\r\n    if (fields['GetIsinShortCode - API Endpoint URL']?.value !== '') {\r\n      let apiResponse: any = await fetchData(apiUrl);\r\n      if (apiResponse.success) {\r\n        const isinObject = apiResponse.data;\r\n        const shortName = encodeURIComponent(isinObject?.isinShortCode).replace(/%2C/, '-').toLowerCase();\r\n        const fondsKodeShortName = encodeURIComponent(isinObject?.isinShortCode).replace(/%2C/, '_');\r\n        setLoading(false);\r\n        newWindow?.location.assign(\r\n          `https://www.nasdaq.com/da/european-market-activity/mortgage-bonds/${shortName}?id=XCSE${fondsKodeShortName}`\r\n        );\r\n      } else {\r\n        console.log(`error in calling ${apiUrl}, error is ${apiResponse.error}`);\r\n      }\r\n      setLoading(false);\r\n    } else {\r\n      console.warn('RatesTables > Fetch IsinShortCode Endpoint URL not defined');\r\n    }\r\n  };\r\n\r\n  //Set tracking State for Closed Bonds\r\n  const setTrackingStateForClosedBonds = () => {\r\n    isBusinessPage ? setSelectedTab(3) : setSelectedTab(2);\r\n    setTracking('closedBonds');\r\n  };\r\n\r\n  //set Adobe analytics details for all tabs\r\n  React.useEffect(() => {\r\n    if (tabValue !== selectedTab) {\r\n      if (tracking === 'fixed') {\r\n        updatePageNameFromTab('Kurser og renter > ' + t('kurser-tabs-fixed'));\r\n      }\r\n      if (tracking === 'variable') {\r\n        updatePageNameFromTab('Kurser og renter > ' + t('kurser-tabs-variable'));\r\n      }\r\n      if (tracking === 'cashLoans') {\r\n        updatePageNameFromTab('Kurser og renter > ' + t('kurser-tabs-cashloan'));\r\n      }\r\n      if (tracking === 'closedBonds') {\r\n        updatePageNameFromTab('Kurser og renter > ' + t('kurser-tabs-closedBonds'));\r\n      }\r\n      setTabValue(selectedTab);\r\n    }\r\n  }, [tracking, tabValue, selectedTab, t, updatePageNameFromTab, setTabValue]);\r\n\r\n  //Toggle the data-to show all bonds or show only default bonds\r\n  const handleOnClick = (e) => {\r\n    e.preventDefault();\r\n    setLoading(true);\r\n    setTimeout(() => {\r\n      setShowAllLoans((value) => !value);\r\n      setLoading(false);\r\n    }, 750);\r\n  };\r\n\r\n  // If the state is \"loading=true\" then display loading UI\r\n  if (loading) {\r\n    return (\r\n      <Section componentName=\"RatesTables\" margin=\"large\">\r\n        <LoadingWrapper>\r\n          <Icons.Spinner />\r\n        </LoadingWrapper>\r\n      </Section>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <Section componentName=\"RatesTables\" margin=\"large\">\r\n      <Container>\r\n        <Row>\r\n          <Col>\r\n            <Box marginBottom={3}>\r\n              <TableSelector selectedIndex={selectedTab} size=\"small\">\r\n                <div onClick={() => setTrackingState()}>{t('kurser-tabs-fixed')}</div>\r\n                <div onClick={() => getVariableLoans()}>{t('kurser-tabs-variable')}</div>\r\n                {isBusinessPage && <div onClick={() => getCashLoansData()}>{t('kurser-tabs-cashloan')}</div>}\r\n                <div onClick={() => setTrackingStateForClosedBonds()}>{t('kurser-tabs-closedBonds')}</div>\r\n              </TableSelector>\r\n            </Box>\r\n          </Col>\r\n        </Row>\r\n        {/* If FixedRate Table is selected, show extra button to select all bonds\r\n        If other tables are selected, hide the button and align lastupdated wrapper with text above table */}\r\n        {selectedTab === 0 || (isBusinessPage && selectedTab === 2) ? (\r\n          <>\r\n            <Row justify=\"between\">\r\n              <Col md={6}>\r\n                <Description>\r\n                  {selectedTab === 0 && fields['Fixed Rate - Text Above Table']?.value}\r\n                  {isBusinessPage\r\n                    ? selectedTab === 2 && fields['Cashloan Fixed Interest Rate - Text Above Table']?.value\r\n                    : selectedTab === 2 && fields['Redemption Rate - Text Above Table']?.value}\r\n                </Description>\r\n              </Col>\r\n            </Row>\r\n            <ButtonWrapper>\r\n              <ShowAllWrapper variant=\"secondary\" onClick={handleOnClick}>\r\n                <IconWrapper>{showAllLoans ? <Icons.Action.Remove /> : <Icons.Action.Add />}</IconWrapper>\r\n                <TextWrapper>{showAllLoans ? 'SE FÆRRE LÅN' : 'SE FLERE LÅN'}</TextWrapper>\r\n              </ShowAllWrapper>\r\n              <Col xs=\"content\">\r\n                {(lastUpdate !== null || lastUpdateCashLoan !== null) && (\r\n                  <LastUpdateWrapper>\r\n                    <LastUpdateBox>\r\n                      {t('kurser-lastUpdated-label')}{' '}\r\n                      {selectedTab === 0 || (!isBusinessPage && selectedTab === 2)\r\n                        ? lastUpdate?.replace(/-/g, '.')\r\n                        : lastUpdateCashLoan?.replace(/-/g, '.')}\r\n                      {}\r\n                    </LastUpdateBox>\r\n                    <TooltipWrapper>\r\n                      <Tooltip\r\n                        element={<Icons.Action.Question />}\r\n                        heading={t('kurser-lastupdated-tooltip-header')}\r\n                        content={t('kurser-lastupdated-tooltip-text')}\r\n                      />\r\n                    </TooltipWrapper>\r\n                  </LastUpdateWrapper>\r\n                )}\r\n              </Col>\r\n            </ButtonWrapper>\r\n          </>\r\n        ) : (\r\n          <>\r\n            <Row justify=\"between\">\r\n              <Col md={6}>\r\n                <Description>\r\n                  {selectedTab === 1 && fields['Variable Rate - Text Above Table']?.value}\r\n                  {selectedTab === 2 && fields['Redemption Rate - Text Above Table']?.value}\r\n                  {isBusinessPage && selectedTab === 3 && fields['Redemption Rate - Text Above Table']?.value}\r\n                </Description>\r\n              </Col>\r\n              <Col xs=\"content\">\r\n                {(lastUpdate !== null || lastUpdateVariableLoan !== null) && (\r\n                  <LastUpdateWrapper>\r\n                    <LastUpdateBox>\r\n                      {t('kurser-lastUpdated-label')}{' '}\r\n                      {selectedTab === 1 ? lastUpdateVariableLoan?.replace(/-/g, '.') : lastUpdate?.replace(/-/g, '.')}\r\n                      {}\r\n                    </LastUpdateBox>\r\n                    <TooltipWrapper>\r\n                      <Tooltip\r\n                        element={<Icons.Action.Question />}\r\n                        heading={t('kurser-lastupdated-tooltip-header')}\r\n                        content={t('kurser-lastupdated-tooltip-text')}\r\n                      />\r\n                    </TooltipWrapper>\r\n                  </LastUpdateWrapper>\r\n                )}\r\n              </Col>\r\n            </Row>\r\n          </>\r\n        )}\r\n        <Row>\r\n          <Col>\r\n            {selectedTab === 0 && (\r\n              <TableFastforrentet\r\n                key={formatFixedLoanData + ''}\r\n                data={formatFixedLoanData}\r\n                handleClick={openNasdaqSite}\r\n              />\r\n            )}\r\n            {selectedTab === 1 && <TableVariabel data={formatedVariableLoanData} />}\r\n            {isBusinessPage\r\n              ? selectedTab === 2 && (\r\n                  <TableCashLoan key={showAllLoans + ''} data={formatedCashLoanData} handleClick={openNasdaqSite} />\r\n                )\r\n              : selectedTab === 2 && (\r\n                  <TableClosedBonds\r\n                    key={formatFixedLoanData + ''}\r\n                    data={formatFixedLoanData}\r\n                    handleClick={openNasdaqSite}\r\n                  />\r\n                )}\r\n            {selectedTab === 3 && (\r\n              <TableClosedBonds\r\n                key={formatFixedLoanData + ''}\r\n                data={formatFixedLoanData}\r\n                handleClick={openNasdaqSite}\r\n              />\r\n            )}\r\n          </Col>\r\n        </Row>\r\n\r\n        <Row>\r\n          <Col>\r\n            <Box marginTop={3}>\r\n              {selectedTab === 0 && <TextBelowTable field={fields['Fixed Rate - Text Below Table']} />}\r\n              {selectedTab === 1 && <TextBelowTable field={fields['Variable Rate - Text Below Table']} />}\r\n              {isBusinessPage\r\n                ? selectedTab === 2 && (\r\n                    <TextBelowTable field={fields['Cashloan Fixed Interest Rate - Text Below Table']} />\r\n                  )\r\n                : selectedTab === 2 && <TextBelowTable field={fields['Redemption Rate - Text Below Table']} />}\r\n              {selectedTab === 3 && <TextBelowTable field={fields['Redemption Rate - Text Below Table']} />}\r\n            </Box>\r\n          </Col>\r\n        </Row>\r\n\r\n        <Row justify=\"center\">\r\n          <Col md={8} xl={6}>\r\n            <Box marginTop={10}>\r\n              <ContentParser>\r\n                {selectedTab === 0 && <StyledRichText field={fields['Fixed Rate - Text Section']} />}\r\n                {selectedTab === 1 && <StyledRichText field={fields['Variable Rate - Text Section']} />}\r\n                {isBusinessPage\r\n                  ? selectedTab === 2 && (\r\n                      <StyledRichText field={fields['Cashloan Fixed Interest Rate - Text Section']} />\r\n                    )\r\n                  : selectedTab === 2 && <StyledRichText field={fields['Redemption Rate - Text Section']} />}\r\n                {selectedTab === 3 && <StyledRichText field={fields['Redemption Rate - Text Section']} />}\r\n              </ContentParser>\r\n            </Box>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n      <ScrollToTop horizontalPosition=\"center\" threshold={300} />\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default RatesTables;\r\n\r\nconst LoadingWrapper = styled.div`\r\n  text-align: center;\r\n  svg {\r\n    width: 50px;\r\n    height: 50px;\r\n  }\r\n`;\r\n\r\nconst Description = styled.div`\r\n  font-size: 14px;\r\n  font-style: italic;\r\n  color: ${Color.rdBlackTint2};\r\n  margin-bottom: 15px;\r\n`;\r\n\r\nconst LastUpdateWrapper = styled.div`\r\n  display: flex;\r\n  margin-bottom: 15px;\r\n  align-items: center;\r\n`;\r\n\r\nconst LastUpdateBox = styled.div`\r\n  font-size: 13px;\r\n  font-style: italic;\r\n  font-weight: 600;\r\n  color: #35a47a;\r\n  padding: 9px 19px 9px 20px;\r\n  border-radius: 5px;\r\n  border: solid 1px #35a47a;\r\n  background-color: rgba(53, 164, 122, 0.22);\r\n  white-space: nowrap;\r\n`;\r\n\r\nconst TextBelowTable = styled(RichText)`\r\n  font-size: 13px;\r\n  color: ${RddkTheme.colors.warmGrey};\r\n  line-height: 1.4;\r\n`;\r\n\r\nconst TooltipWrapper = styled.span`\r\n  margin-left: 8px;\r\n  top: 2px;\r\n  position: relative;\r\n  cursor: help;\r\n  white-space: normal;\r\n  svg {\r\n    width: 24px;\r\n    height: 24px;\r\n  }\r\n`;\r\nconst StyledRichText = styled(RichText)`\r\n  ${richTextStyles}\r\n`;\r\nconst ButtonWrapper = styled.div`\r\n  font-size: 12px;\r\n  display: flex;\r\n  justify-content: space-between;\r\n  ${mediaQuery.mdDown} {\r\n    flex-direction: column-reverse;\r\n  }\r\n`;\r\n\r\nconst ShowAllWrapper = styled(Button)`\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  display: flex;\r\n  justify-content: space-evenly;\r\n  border-radius: 3px;\r\n  box-shadow: ${BoxShadow.large};\r\n  padding: 13px 16px 12px;\r\n  letter-spacing: 1px;\r\n  height: 41px;\r\n  margin-bottom: 8px;\r\n  ${mediaQuery.mdDown} {\r\n    width: 50%;\r\n    justify-content: flex-start;\r\n  }\r\n`;\r\nconst IconWrapper = styled.span`\r\n  display: flex;\r\n  justify-content: space-between;\r\n  ${mediaQuery.mdDown} {\r\n    flex-direction: column;\r\n  }\r\n`;\r\nconst TextWrapper = styled.span`\r\n  display: flex;\r\n  justify-content: space-between;\r\n  margin-left: 8px;\r\n  ${mediaQuery.mdDown} {\r\n    flex-direction: column;\r\n  }\r\n`;\r\n","import { RichText as SitecoreRichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Box, Col, Container, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ContentParser, FieldChecker, Section } from '../../shared/components';\r\nimport { hrStyle, richTextStyles } from './richTextStyles';\r\n\r\nconst HorizontalRule = styled.hr`\r\n  ${hrStyle}\r\n`;\r\n\r\nconst StyledRichText = styled(SitecoreRichText)`\r\n  ${richTextStyles}\r\n`;\r\n\r\ntype Params = {\r\n  richTextWidth?: string;\r\n};\r\n\r\nexport type RichTextProps = {\r\n  fields: any;\r\n  params: Params;\r\n};\r\n\r\nconst RichText: React.FC<RichTextProps> = ({ fields = {}, params = {} }) => {\r\n  const richTextWidth = Number(params?.richTextWidth) || 50;\r\n  const colsFromPercent = Math.round(12 * (richTextWidth / 100));\r\n  const columnsXl = colsFromPercent > 12 ? 12 : colsFromPercent;\r\n  const columnsMd = columnsXl + 2 > 12 ? 12 : columnsXl + 2;\r\n\r\n  return (\r\n    <Section componentName=\"RichText\" margin={fields['Headline']?.length ? 'large' : 'small'}>\r\n      <Container>\r\n        <Row justify=\"center\">\r\n          <Col md={columnsMd} xl={columnsXl}>\r\n            <FieldChecker type=\"text\" field={fields['Headline']}>\r\n              <Box textAlign=\"center\" marginBottom={5}>\r\n                <Typography type=\"h2\">\r\n                  <Text field={fields['Headline']} />\r\n                </Typography>\r\n              </Box>\r\n              <HorizontalRule />\r\n            </FieldChecker>\r\n\r\n            <ContentParser>\r\n              <StyledRichText field={fields['Text']} />\r\n            </ContentParser>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default RichText;\r\n","import { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { applyTextType, Col, Color, Container, mediaQuery, Row, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FieldChecker, Section } from '../../shared/components';\r\n\r\nconst Columns = styled.div`\r\n  padding-top: 30px;\r\n\r\n  h6 {\r\n    ${applyTextType('h6')}\r\n    margin: 20px 0 15px 0;\r\n    ${mediaQuery.lg} {\r\n      margin: 0 0 20px 0;\r\n    }\r\n  }\r\n\r\n  p {\r\n    margin: 15px 0 30px 0;\r\n  }\r\n\r\n  a {\r\n    display: inline-block;\r\n    position: relative;\r\n    margin: 5px 0 10px;\r\n    font-size: 14px;\r\n    letter-spacing: 0.3px;\r\n    color: ${Color.rdPureBlack};\r\n    text-decoration: underline;\r\n    white-space: nowrap;\r\n    transition: color 0.5s;\r\n    font-weight: 600;\r\n  }\r\n`;\r\n\r\nexport type ShortcutLinkProps = {\r\n  fields: any;\r\n};\r\n\r\nconst ShortcutLink: React.FC<ShortcutLinkProps> = ({ fields = {} }) => {\r\n  return (\r\n    <Section componentName=\"ShortcutLink\" margin=\"large\">\r\n      <Container>\r\n        <Columns>\r\n          <Row>\r\n            <FieldChecker type=\"text\" field={fields['Title']}>\r\n              <Col lg={12}>\r\n                <Typography type=\"h3\">\r\n                  <Text field={fields['Title']} />\r\n                </Typography>\r\n              </Col>\r\n            </FieldChecker>\r\n            <FieldChecker type=\"text\" field={fields['Description']}>\r\n              <Col lg={12}>\r\n                <Typography type=\"paragraph\">\r\n                  <Text field={fields['Description']} />\r\n                </Typography>\r\n              </Col>\r\n            </FieldChecker>\r\n          </Row>\r\n          <Row>\r\n            <FieldChecker type=\"text\" field={fields['Column 1 Text']}>\r\n              <Col md={6} lg={3}>\r\n                <RichText field={fields['Column 1 Text']} editable={false} />\r\n              </Col>\r\n            </FieldChecker>\r\n            <FieldChecker type=\"text\" field={fields['Column 2 Text']}>\r\n              <Col md={6} lg={3}>\r\n                <RichText field={fields['Column 2 Text']} editable={false} />\r\n              </Col>\r\n            </FieldChecker>\r\n            <FieldChecker type=\"text\" field={fields['Column 3 Text']}>\r\n              <Col md={6} lg={3}>\r\n                <RichText field={fields['Column 3 Text']} editable={false} />\r\n              </Col>\r\n            </FieldChecker>\r\n            <FieldChecker type=\"text\" field={fields['Column 3 Text']}>\r\n              <Col md={6} lg={3}>\r\n                <RichText field={fields['Column 4 Text']} editable={false} />\r\n              </Col>\r\n            </FieldChecker>\r\n          </Row>\r\n        </Columns>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default ShortcutLink;\r\n","import { ConsentLevel, useCookieConsent } from 'db-npm-rdui';\r\nimport * as React from 'react';\r\n\r\nexport type SurveyInitProps = {\r\n  fields: any;\r\n};\r\n\r\nconst SurveyInit: React.FC<SurveyInitProps> = ({ fields = {} }) => {\r\n  const enableSurvey = useCookieConsent().isAllowed(ConsentLevel.Functional) && fields['Enable Survey']?.value === true;\r\n\r\n  React.useEffect(() => {\r\n    if (!enableSurvey) {\r\n      return;\r\n    }\r\n\r\n    //eslint-disable-next-line no-new-func\r\n    new Function(`(function(){var g=function(e,h,f,g){\r\n      this.get=function(a){for(var a=a+\"=\",c=document.cookie.split(\";\"),b=0,e=c.length;b<e;b++){for(var d=c[b];\" \"==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};\r\n      this.set=function(a,c){var b=\"\",b=new Date;b.setTime(b.getTime()+6048E5);b=\"; expires=\"+b.toGMTString();document.cookie=a+\"=\"+c+b+\"; path=/; \"};\r\n      this.check=function(){var a=this.get(f);if(a)a=a.split(\":\");else if(100!=e)\"v\"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(\":\"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case \"v\":return!1;case \"r\":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(\":\")),!c}return!0};\r\n      this.go=function(){if(this.check()){var a=document.createElement(\"script\");a.type=\"text/javascript\";a.src=g;document.body&&document.body.appendChild(a)}};\r\n      this.start=function(){var t=this;\"complete\"!==document.readyState?window.addEventListener?window.addEventListener(\"load\",function(){t.go()},!1):window.attachEvent&&window.attachEvent(\"onload\",function(){t.go()}):t.go()};};\r\n      try{(new g(100,\"r\",\"QSI_S_ZN_5sYbnguVKijGLQ1\",\"https://zn5sybnguvkijglq1-danskebank.siteintercept.qualtrics.com/SIE/?Q_ZID=ZN_5sYbnguVKijGLQ1\")).start()}catch(i){}})();`)();\r\n  }, [enableSurvey]);\r\n\r\n  if (!enableSurvey) {\r\n    return null;\r\n  }\r\n\r\n  return (\r\n    <span\r\n      dangerouslySetInnerHTML={{\r\n        __html: `<div id='ZN_5sYbnguVKijGLQ1'><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>`,\r\n      }}\r\n    ></span>\r\n  );\r\n};\r\n\r\nexport default SurveyInit;\r\n","import { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n  Cell,\r\n  CellRenderProps,\r\n  Col,\r\n  Color,\r\n  Container,\r\n  DynamicTable,\r\n  mediaQuery,\r\n  RddkTheme,\r\n  Row,\r\n  TableData,\r\n} from 'db-npm-rdui';\r\nimport * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport iconCheckmark from '../../assets/images/svg/icon-checkmark-red.svg';\r\nimport { Section } from '../../shared/components';\r\nimport { parseExcelData } from './parseExcelData';\r\n\r\nconst DEFAULT_CELL_WIDTH = 150;\r\n\r\nconst StyledContainer = styled(Container)`\r\n  ${mediaQuery.lgDown} {\r\n    max-width: 100% !important;\r\n    padding: 0 !important;\r\n  }\r\n`;\r\n\r\nconst Wrapper = styled.section`\r\n  a {\r\n    color: ${Color.rdRed};\r\n    font-style: italic;\r\n    text-decoration: underline;\r\n\r\n    &:hover,\r\n    &:focus,\r\n    &:active {\r\n      text-decoration: none;\r\n    }\r\n  }\r\n`;\r\n\r\nconst StyledRichText = styled(RichText)`\r\n  font-size: 13px;\r\n  color: ${RddkTheme.colors.warmGrey};\r\n  line-height: 1.4;\r\n  margin: 15px 15px 0;\r\n\r\n  ${mediaQuery.lg} {\r\n    margin: 15px 0 0;\r\n  }\r\n`;\r\n\r\nexport type TableProps = {\r\n  fields: any;\r\n};\r\n\r\nconst Table: React.FC<TableProps> = ({ fields = {} }) => {\r\n  // Extract values from fields and set defaults\r\n  const excelData = fields['Excel Data']?.value || '';\r\n  const showTextBelowTableHeaders = Boolean(fields['Show Text Below Table Headers']?.value);\r\n  const sortableColumns = Boolean(fields['Sortable Columns']?.value);\r\n  const firstColumnWidth = Number(fields['First Column Width In Pixels']?.value) || DEFAULT_CELL_WIDTH;\r\n  const allColumnsMinimumWidth = Number(fields['All Columns Minimum Width In Pixels']?.value) || DEFAULT_CELL_WIDTH;\r\n  const cellAlignment = fields['Cell Alignment']?.fields['Value']?.value || 'left';\r\n  const linkInLastRow = Boolean(fields['Link In Last Row']?.value);\r\n  const linkTextInLastRow = fields['Link Text In Last Row']?.value;\r\n\r\n  // Parse data to array of arrays\r\n  const tableData = parseExcelData(excelData);\r\n\r\n  // Function to render each cell value\r\n  const cellValueRenderFunction = React.useCallback(\r\n    ({ cell, rowIndex, columnIndex }: CellRenderProps) => {\r\n      // Render as bold if first column\r\n      if (columnIndex === 0) {\r\n        return <strong>{cell?.value}</strong>;\r\n      }\r\n\r\n      // Render checkmark if text is TRUE\r\n      if (cell?.value === 'TRUE') {\r\n        return <img src={iconCheckmark} alt=\"Checkmark\" title=\"Checkmark\" />;\r\n      }\r\n\r\n      // Render as link if it's the last row and boolean \"linkInLastRow\" is true and cell is not empty\r\n      const isLastRow = rowIndex === tableData.length - (showTextBelowTableHeaders ? 2 : 1);\r\n\r\n      if (linkInLastRow && isLastRow && cell?.value !== '') {\r\n        return (\r\n          <a href={cell?.value} title={linkTextInLastRow}>\r\n            {linkTextInLastRow}\r\n          </a>\r\n        );\r\n      }\r\n\r\n      return cell?.value;\r\n    },\r\n    [linkInLastRow, linkTextInLastRow, showTextBelowTableHeaders, tableData.length]\r\n  );\r\n\r\n  // Generate table data\r\n  const data = React.useMemo(\r\n    () =>\r\n      tableData.reduce((result, row, rowIndex) => {\r\n        const isFirstRow = rowIndex === 0;\r\n\r\n        const addSuffixToHeader = showTextBelowTableHeaders && isFirstRow && tableData.length >= 2;\r\n\r\n        // If we are using the 2nd row as header rows suffixes,\r\n        // then we skip rendering the 2nd row.\r\n        if (showTextBelowTableHeaders && rowIndex === 1) {\r\n          return result;\r\n        }\r\n\r\n        return [\r\n          ...result,\r\n          row.map((column, columnIndex) => {\r\n            const isFirstColumn = columnIndex === 0;\r\n\r\n            const cell: Cell = {\r\n              value: column,\r\n              suffix: addSuffixToHeader ? tableData[1][columnIndex] : undefined,\r\n              width: isFirstColumn ? firstColumnWidth : undefined,\r\n              minWidth: isFirstColumn ? undefined : allColumnsMinimumWidth,\r\n              alignHorizontally: cellAlignment,\r\n              alignVertically: 'top',\r\n              sortable: !isFirstColumn && isFirstRow ? sortableColumns : false,\r\n              cellValueRender: cellValueRenderFunction,\r\n            };\r\n\r\n            return cell;\r\n          }),\r\n        ];\r\n      }, [] as TableData),\r\n    [\r\n      allColumnsMinimumWidth,\r\n      cellAlignment,\r\n      cellValueRenderFunction,\r\n      firstColumnWidth,\r\n      showTextBelowTableHeaders,\r\n      sortableColumns,\r\n      tableData,\r\n    ]\r\n  );\r\n\r\n  return (\r\n    <Section componentName=\"Table\" margin=\"small\">\r\n      <StyledContainer>\r\n        <Row justify=\"center\">\r\n          <Col xl={10}>\r\n            <Wrapper>\r\n              <DynamicTable\r\n                bordered={true}\r\n                striped={true}\r\n                firstRowIsHead={true}\r\n                firstColumnIsSticky={false}\r\n                data={data}\r\n              />\r\n\r\n              <StyledRichText field={fields['Text Below Table']} />\r\n            </Wrapper>\r\n          </Col>\r\n        </Row>\r\n      </StyledContainer>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default Table;\r\n","import unescape from 'lodash/unescape';\r\n\r\nexport function parseExcelData(data: string, unescapeText = true): string[][] {\r\n  // Split data into rows on linebreaks\r\n  const rows = data.split('\\n') || data.split('\\rn');\r\n\r\n  return rows.reduce((result, row) => {\r\n    // Split row into cells on tab character\r\n    const cells = row.split('\\t');\r\n    if (cells.length < 1 || (cells.length === 1 && cells[0] === '')) {\r\n      return result;\r\n    }\r\n\r\n    // Map all cells and prepare the data\r\n    const cellsArr = cells.map(function (cell) {\r\n      const valueTrimmed = cell.trim();\r\n      if (unescapeText) {\r\n        return unescape(valueTrimmed);\r\n      }\r\n      return valueTrimmed;\r\n    });\r\n\r\n    // Combine and return\r\n    return [...result, cellsArr];\r\n  }, [] as string[][]);\r\n}\r\n","import { Text, withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { PlaceholderProps } from '@sitecore-jss/sitecore-jss-react/types/components/PlaceholderCommon';\r\nimport { Col, Container, Row, TextAccordion as TextAccordionComp, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport { Section } from '../../shared/components';\r\nimport { useIsEditor } from '../../shared/hooks';\r\nimport TextAccordionItem from '../TextAccordionItem';\r\n\r\nexport type TextAccordionProps = PlaceholderProps & {\r\n  fields: any;\r\n  accordionItems: any;\r\n  rendering: any;\r\n};\r\n\r\ntype Item = {\r\n  uid: string;\r\n  accordionItems: any;\r\n  fields: any;\r\n};\r\n\r\nconst TextAccordion: React.FC<TextAccordionProps> = ({ fields = {}, accordionItems, rendering }) => {\r\n  // isEditor check needed for Sitecore Experience Editor to work\r\n  const isEditor = useIsEditor();\r\n\r\n  const items: Item[] = rendering?.placeholders?.accordionItems || [];\r\n\r\n  return (\r\n    <Section componentName=\"TextAccordion\" margin=\"large\">\r\n      <Container>\r\n        <Row justify=\"center\">\r\n          <Col md={8} xl={6}>\r\n            {isEditor && (\r\n              <Typography type={'h2'}>\r\n                <Text field={fields['Title']} />\r\n              </Typography>\r\n            )}\r\n            <TextAccordionComp title={isEditor ? '' : fields['Title']?.value} titleType={'h2'}>\r\n              {isEditor\r\n                ? accordionItems\r\n                : items.map(({ uid, fields }) => <TextAccordionItem key={uid} fields={fields} itemId={uid} />)}\r\n            </TextAccordionComp>\r\n          </Col>\r\n        </Row>\r\n      </Container>\r\n    </Section>\r\n  );\r\n};\r\n\r\nexport default withPlaceholder('accordionItems')(TextAccordion);\r\n","/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/generate-component-factory.js to modify the generation of this file.\nimport Card from '../components/Card';\nimport Cards from '../components/Cards';\nimport CenteredText from '../components/CenteredText';\nimport ColorCard from '../components/ColorCard';\nimport ColorCards from '../components/ColorCards';\nimport CookieConsentBanner from '../components/CookieConsentBanner';\nimport CustomInsertHtml from '../components/CustomInsertHtml';\nimport EntranceSingleLeft from '../components/EntranceSingleLeft';\nimport EntranceSinglePopoutLeft from '../components/EntranceSinglePopoutLeft';\nimport EntranceSinglePopoutRight from '../components/EntranceSinglePopoutRight';\nimport EntranceSingleRight from '../components/EntranceSingleRight';\nimport ExpandedTextAccordion from '../components/ExpandedTextAccordion';\nimport ExpandedTextAccordionItem from '../components/ExpandedTextAccordionItem';\nimport FacebookPixel from '../components/FacebookPixel';\nimport Footer from '../components/Footer';\nimport FormCallMe from '../components/FormCallMe';\nimport FormCprUpload from '../components/FormCprUpload';\nimport FormCvrUpload from '../components/FormCvrUpload';\nimport FormGdpr from '../components/FormGdpr';\nimport FormNemKonto from '../components/FormNemKonto';\nimport FormPpi from '../components/FormPpi';\nimport FormUnsubscribe from '../components/FormUnsubscribe';\nimport Header from '../components/Header';\nimport Headline from '../components/Headline';\nimport HeroDefault from '../components/HeroDefault';\nimport HeroFrontpage from '../components/HeroFrontpage';\nimport HeroFrontpageColumnItem from '../components/HeroFrontpageColumnItem';\nimport HeroProduct from '../components/HeroProduct';\nimport HtmlRenderer from '../components/HtmlRenderer';\nimport ImageHeader from '../components/ImageHeader';\nimport ImageLeft from '../components/ImageLeft';\nimport ImageRight from '../components/ImageRight';\nimport LoanCalculator from '../components/LoanCalculator';\nimport LoanCalculatorInputsOnly from '../components/LoanCalculatorInputsOnly';\nimport NewsListHorizontal from '../components/NewsListHorizontal';\nimport NewsListHorizontalItem from '../components/NewsListHorizontalItem';\nimport NewsListVertical from '../components/NewsListVertical';\nimport NewsListVerticalItem from '../components/NewsListVerticalItem';\nimport ProductFeature from '../components/ProductFeature';\nimport RatesTables from '../components/RatesTables';\nimport RichText from '../components/RichText';\nimport ShortcutLink from '../components/ShortcutLink';\nimport SurveyInit from '../components/SurveyInit';\nimport Table from '../components/Table';\nimport TextAccordion from '../components/TextAccordion';\nimport TextAccordionItem from '../components/TextAccordionItem';\n\nconst components = new Map();\ncomponents.set('Card', Card);\ncomponents.set('Cards', Cards);\ncomponents.set('CenteredText', CenteredText);\ncomponents.set('ColorCard', ColorCard);\ncomponents.set('ColorCards', ColorCards);\ncomponents.set('CookieConsentBanner', CookieConsentBanner);\ncomponents.set('CustomInsertHtml', CustomInsertHtml);\ncomponents.set('EntranceSingleLeft', EntranceSingleLeft);\ncomponents.set('EntranceSinglePopoutLeft', EntranceSinglePopoutLeft);\ncomponents.set('EntranceSinglePopoutRight', EntranceSinglePopoutRight);\ncomponents.set('EntranceSingleRight', EntranceSingleRight);\ncomponents.set('ExpandedTextAccordion', ExpandedTextAccordion);\ncomponents.set('ExpandedTextAccordionItem', ExpandedTextAccordionItem);\ncomponents.set('FacebookPixel', FacebookPixel);\ncomponents.set('Footer', Footer);\ncomponents.set('FormCallMe', FormCallMe);\ncomponents.set('FormCprUpload', FormCprUpload);\ncomponents.set('FormCvrUpload', FormCvrUpload);\ncomponents.set('FormGdpr', FormGdpr);\ncomponents.set('FormNemKonto', FormNemKonto);\ncomponents.set('FormPpi', FormPpi);\ncomponents.set('FormUnsubscribe', FormUnsubscribe);\ncomponents.set('Header', Header);\ncomponents.set('Headline', Headline);\ncomponents.set('HeroDefault', HeroDefault);\ncomponents.set('HeroFrontpage', HeroFrontpage);\ncomponents.set('HeroFrontpageColumnItem', HeroFrontpageColumnItem);\ncomponents.set('HeroProduct', HeroProduct);\ncomponents.set('HtmlRenderer', HtmlRenderer);\ncomponents.set('ImageHeader', ImageHeader);\ncomponents.set('ImageLeft', ImageLeft);\ncomponents.set('ImageRight', ImageRight);\ncomponents.set('LoanCalculator', LoanCalculator);\ncomponents.set('LoanCalculatorInputsOnly', LoanCalculatorInputsOnly);\ncomponents.set('NewsListHorizontal', NewsListHorizontal);\ncomponents.set('NewsListHorizontalItem', NewsListHorizontalItem);\ncomponents.set('NewsListVertical', NewsListVertical);\ncomponents.set('NewsListVerticalItem', NewsListVerticalItem);\ncomponents.set('ProductFeature', ProductFeature);\ncomponents.set('RatesTables', RatesTables);\ncomponents.set('RichText', RichText);\ncomponents.set('ShortcutLink', ShortcutLink);\ncomponents.set('SurveyInit', SurveyInit);\ncomponents.set('Table', Table);\ncomponents.set('TextAccordion', TextAccordion);\ncomponents.set('TextAccordionItem', TextAccordionItem);\n\nexport default function componentFactory(componentName) {\n  return components.get(componentName);\n};\n","import { SitecoreContext } from '@sitecore-jss/sitecore-jss-react';\r\nimport { CookiesProvider, RddkTheme, setGridConfiguration } from 'db-npm-rdui';\r\nimport 'db-npm-rdui/dist/fonts.css';\r\nimport 'db-npm-rdui/dist/normalize.css';\r\nimport 'db-npm-rdui/dist/styles.css';\r\nimport * as React from 'react';\r\nimport { ThemeProvider } from 'styled-components';\r\nimport SitecoreContextFactory from '../../lib/SitecoreContextFactory';\r\nimport componentFactory from '../../temp/componentFactory';\r\n\r\n// Configure the Grid in RD UI\r\nsetGridConfiguration({ gutterWidth: 24 });\r\n\r\nexport type AppSetupProps = {\r\n  children?: any;\r\n};\r\n\r\nexport const AppSetup = ({ children }: AppSetupProps) => {\r\n  return (\r\n    <CookiesProvider>\r\n      <ThemeProvider theme={RddkTheme}>\r\n        <SitecoreContext componentFactory={componentFactory} contextFactory={SitecoreContextFactory}>\r\n          {children}\r\n        </SitecoreContext>\r\n      </ThemeProvider>\r\n    </CookiesProvider>\r\n  );\r\n};\r\n","import { ParserFunctionInterface } from '../../';\r\n\r\ntype CookiePanelType = {\r\n  level: { title: string; value: string };\r\n  time: { title: string; value: string };\r\n  id: { title: string; value: string };\r\n};\r\n\r\nconst QUERY_SELECTOR = '[data-module=\"cookie-consent-status\"]';\r\n\r\nlet CookiePanel: ParserFunctionInterface;\r\nCookiePanel = (el: any) => {\r\n  const arrCookieConsent = el.querySelectorAll(QUERY_SELECTOR);\r\n\r\n  function init() {\r\n    if (arrCookieConsent.length > 0) {\r\n      processCookieDetails(arrCookieConsent);\r\n    }\r\n  }\r\n\r\n  function processCookieDetails(arrCookieConsent) {\r\n    const apiUrl = '/api/ccstatus';\r\n    fetch(apiUrl, {\r\n      method: 'GET',\r\n      mode: 'no-cors',\r\n      headers: {\r\n        Accept: 'application/json',\r\n        'Content-Type': 'application/json',\r\n        'Access-Control-Allow-Origin': '*',\r\n      },\r\n    })\r\n      .then((response) => response.json())\r\n      .then((json: CookiePanelType) => {\r\n        const node = arrCookieConsent[0];\r\n\r\n        node.innerHTML = `<div>   \r\n<span>{levelTitle} : </span>\r\n<span>{levelValue}</span>\r\n</div>\r\n<div>\r\n<span>{IDTitle}: </span>\r\n<span>{IDValue}</span>\r\n</div>\r\n<div>\r\n<span>{TimeTitle}: </span>\r\n<span>{TimeValue}</span>\r\n</div> `\r\n          .replace('{levelTitle}', json?.level?.title)\r\n          .replace('{levelValue}', json?.level?.value)\r\n          .replace('{IDTitle}', json?.id?.title)\r\n          .replace('{IDValue}', json?.id?.value)\r\n          .replace('{TimeTitle}', json?.time?.title)\r\n          .replace('{TimeValue}', json?.time?.value);\r\n      })\r\n      .catch((error) => {\r\n        console.warn('cookie status api failed: ', error);\r\n      });\r\n  }\r\n  return {\r\n    init,\r\n  };\r\n};\r\n\r\nexport default CookiePanel;\r\n","import { ConsentLevel, ConsentLevels } from 'db-npm-rdui';\r\nimport load from 'load-script';\r\nimport { ParserFunctionInterface } from '../../';\r\nimport { ContextSettings } from '../../../../../shared/hooks';\r\nimport './styles.css';\r\n\r\n//TODO\r\n// Support list type player\r\n// Advanced sizing/resizing used for list type player\r\n\r\nconst EXT_SCRIPT_URL = 'https://play2.qbrick.com/framework/GoBrain.min.js';\r\nconst EXT_CONFIG_URL = '//video.qbrick.com/play2/api/v1/accounts/[accountId]/configurations/[player]';\r\nconst EXT_DATA_URL = '//video.qbrick.com/api/v1/public/accounts/[accountId]/medias/[videoId]';\r\nconst QUERY_SELECTOR = '[data-module=\"video-snippet\"]';\r\n\r\nexport type videoParserConfig = {\r\n  player: string;\r\n  accountId?: string;\r\n  sharing?: boolean;\r\n  download?: boolean;\r\n  showTitle?: boolean;\r\n  cookies?: boolean;\r\n};\r\n\r\nconst defaultConfig: videoParserConfig = {\r\n  player: 'db-standard',\r\n};\r\n\r\nlet videoParser: ParserFunctionInterface;\r\nvideoParser = (\r\n  el: any,\r\n  config: videoParserConfig,\r\n  cookieConsentLevels: ConsentLevels = [0],\r\n  contextSettings: ContextSettings | undefined\r\n) => {\r\n  config = config ?? defaultConfig;\r\n  const arrVideoEl = el.querySelectorAll(QUERY_SELECTOR);\r\n  const accountId = config.accountId || contextSettings?.videoAccountId || '';\r\n  let goBrain = getGoBrain();\r\n\r\n  function init() {\r\n    if (arrVideoEl.length > 0) {\r\n      if (typeof goBrain !== 'undefined') {\r\n        processVideos(arrVideoEl, goBrain);\r\n      } else {\r\n        load(EXT_SCRIPT_URL, function (err) {\r\n          if (err) {\r\n            console.log('Qbrick error: Could not load script');\r\n          } else {\r\n            goBrain = getGoBrain();\r\n            if (typeof goBrain !== 'undefined') {\r\n              processVideos(arrVideoEl, goBrain);\r\n            }\r\n          }\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  function onResize() {\r\n    if (arrVideoEl.length > 0) {\r\n      arrVideoEl.forEach((videoEl) => {\r\n        setContainerHeight(videoEl);\r\n      });\r\n    }\r\n  }\r\n\r\n  function processVideos(arrVideoEl, goBrain) {\r\n    arrVideoEl.forEach((videoEl) => {\r\n      // Get config settings from video element\r\n      const arrConfig = videoEl.innerText.replace(/ /g, '').split('#');\r\n      const videoId = arrConfig[0];\r\n      config.sharing = arrConfig.length > 1 && arrConfig[1] === '1' ? true : false;\r\n      config.download = arrConfig.length > 2 && arrConfig[2] === '1' ? true : false;\r\n\r\n      setContainerHeight(videoEl);\r\n\r\n      // Clear contents of video element\r\n      videoEl.innerHTML = '';\r\n\r\n      // Create video player\r\n      goBrain.create(videoEl, getEmbedSettings(videoId));\r\n    });\r\n  }\r\n\r\n  function setContainerHeight(videoEl) {\r\n    // Calculate height of video element based on available width to maintain 16/9\r\n    const elW = videoEl.offsetWidth;\r\n    const elH = Math.round(elW * 0.5625);\r\n    videoEl.style.height = elH + 'px';\r\n  }\r\n\r\n  function getGoBrain() {\r\n    return window['GoBrain'];\r\n  }\r\n\r\n  function getEmbedSettings(videoId: string) {\r\n    return {\r\n      autoplay: false,\r\n      config: EXT_CONFIG_URL.replace('[accountId]', accountId).replace('[player]', config.player),\r\n      data: EXT_DATA_URL.replace('[accountId]', accountId).replace('[videoId]', videoId),\r\n      moduleSettings: {\r\n        Controls: {\r\n          sharing: { enabled: config.sharing },\r\n          download: { enabled: config.download },\r\n          settings: { showTitle: false },\r\n        },\r\n        Analytics: {\r\n          cookies: { enabled: cookieConsentLevels.indexOf(ConsentLevel.Statistics) > -1 },\r\n        },\r\n      },\r\n      repeat: false,\r\n    };\r\n  }\r\n\r\n  return {\r\n    init,\r\n    onResize,\r\n  };\r\n};\r\n\r\nexport default videoParser;\r\n","import { ConsentLevels, useCookieConsent, useOnWindowResize } from 'db-npm-rdui';\r\nimport throttle from 'lodash/throttle';\r\nimport React, { ReactNode, useCallback, useEffect, useRef } from 'react';\r\nimport { ContextSettings, useContextSettings, useIsEditor } from '../../../shared/hooks';\r\nimport * as parsers from './parsers/';\r\n\r\ntype ContentParserProps = {\r\n  children: ReactNode[] | JSX.Element;\r\n  /**\r\n   * Config for customizing which parsers to use\r\n   */\r\n  config?: ContentParserConfig;\r\n  /**\r\n   * Specify dependencies e.g. for content not being rendered initially\r\n   */\r\n  dependencies?: any[];\r\n};\r\n\r\nexport type ContentParserConfig = {\r\n  /**\r\n   * Parsers to run - currently only videoParser\r\n   */\r\n  useParsers: Parser[];\r\n  /**\r\n   * Throttle (ms) for onResize\r\n   */\r\n  resizeThrottle: number;\r\n};\r\n\r\nexport type Parser = {\r\n  /**\r\n   * Parser function\r\n   */\r\n  handler: ParserFunctionInterface;\r\n  /**\r\n   * Config for customizing the parser\r\n   */\r\n  config?: any;\r\n  /**\r\n   * Pass current cookie consent level if relevant for parser\r\n   */\r\n  cookieConsentLevels?: ConsentLevels;\r\n};\r\n\r\nexport interface ParserFunctionInterface {\r\n  (el: any, config?: any, cookieConsentLevels?: ConsentLevels, contextSettings?: ContextSettings): {\r\n    init: () => void;\r\n    onResize?: () => void;\r\n  };\r\n}\r\n\r\nexport const ContentParser: React.FC<ContentParserProps> = ({\r\n  children,\r\n  config = defaultConfig,\r\n  dependencies = [],\r\n}) => {\r\n  const cookieConsentLevels = useCookieConsent().getConsentLevels();\r\n  const contextSettings = useContextSettings();\r\n  const ref = useRef(null);\r\n  let handlersOnResize: any[] = [];\r\n  const isEditor = useIsEditor();\r\n\r\n  useEffect(\r\n    () => {\r\n      if (ref.current === null || isEditor) return;\r\n\r\n      config.useParsers.forEach(function (parser) {\r\n        const handler = parser.handler(ref.current, parser.config, cookieConsentLevels, contextSettings);\r\n        handler.init();\r\n        if (typeof handler.onResize === 'function') {\r\n          handlersOnResize.push(handler);\r\n        }\r\n      });\r\n    },\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    dependencies\r\n  );\r\n\r\n  const onResize = useCallback(\r\n    throttle(() => {\r\n      handlersOnResize.forEach(function (handler) {\r\n        handler.onResize();\r\n      });\r\n    }, config.resizeThrottle),\r\n    []\r\n  );\r\n  useOnWindowResize(onResize);\r\n\r\n  return <div ref={ref}>{children}</div>;\r\n};\r\n\r\nconst defaultConfig: ContentParserConfig = {\r\n  useParsers: [{ handler: parsers.cookiePanel }, { handler: parsers.videoParser }],\r\n  resizeThrottle: 500,\r\n};\r\n","import React from 'react';\r\nimport { useIsEditor } from '../../hooks';\r\n\r\nexport const EditorIncludes = () => {\r\n  return useIsEditor() ? (\r\n    <>\r\n      <link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"/css/author/rddk/edit.css\" />\r\n      <script src=\"/js/framework/DanskeBank_ChromeControls.js\"></script>\r\n      <script src=\"/js/framework/DanskeBank_Chrome.js\"></script>\r\n      <script src=\"/js/framework/DanskeBank_Browser.js\"></script>\r\n      <script src=\"/js/framework/DanskeBank_PlaceholderChromeType.js\"></script>\r\n      <script src=\"/js/framework/DanskeBank_PlaceholderInsertion.js\"></script>\r\n      <script src=\"/js/framework/DanskeBank_RenderingChromeType.js\"></script>\r\n      <script src=\"/js/framework/DanskeBank_StripFormatting.js\"></script>\r\n    </>\r\n  ) : null;\r\n};\r\n","import { Row } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { useIsEditor } from '../../hooks';\r\n\r\nconst EditorRow = styled(Row)`\r\n  .scEmptyPlaceholder {\r\n    flex-grow: 1;\r\n  }\r\n`;\r\n\r\ntype ExpEditorRowProps = {\r\n  children: any;\r\n  style?: React.CSSProperties & object;\r\n};\r\n\r\nexport const ExpEditorRow: React.FC<ExpEditorRowProps> = ({ children, style }): JSX.Element => {\r\n  const isEditor = useIsEditor();\r\n  if (isEditor) {\r\n    return <EditorRow style={style}>{children}</EditorRow>;\r\n  }\r\n  return <Row style={style}>{children}</Row>;\r\n};\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Color, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n  field: any;\r\n};\r\n\r\nexport const LabelDark: React.FC<Props> = ({ field }) => {\r\n  return (\r\n    <Label>\r\n      <Typography type=\"label\">\r\n        <Text field={field} />\r\n      </Typography>\r\n    </Label>\r\n  );\r\n};\r\n\r\nconst Label = styled.span`\r\n  display: inline-block;\r\n  border-radius: 3px;\r\n  padding: 6px 12px;\r\n  border: 2px solid ${Color.grey40};\r\n  ${Typography} {\r\n    color: ${Color.grey10};\r\n  }\r\n`;\r\n","import { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Color, Typography } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n  field: any;\r\n};\r\n\r\nexport const LabelGrey: React.FC<Props> = ({ field }) => {\r\n  return (\r\n    <Label>\r\n      <Typography type=\"label\">\r\n        <Text field={field} />\r\n      </Typography>\r\n    </Label>\r\n  );\r\n};\r\n\r\nconst Label = styled.span`\r\n  display: inline-block;\r\n  border-radius: 3px;\r\n  padding: 6px 12px;\r\n  background-color: ${Color.whiteTwo};\r\n`;\r\n","import { Color, mediaQuery } from 'db-npm-rdui';\r\nimport styled, { css } from 'styled-components';\r\n\r\ntype Props = {\r\n  greyPattern?: boolean;\r\n};\r\n\r\nexport const LayoutBackground = styled.div<Props>`\r\n  ${(props) =>\r\n    props.greyPattern &&\r\n    css`\r\n      overflow: hidden;\r\n      background-color: ${Color.grey20};\r\n      background-repeat: repeat-x;\r\n      background-image: url(\"data:image/svg+xml,%3Csvg width='48' height='479' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3ClinearGradient x1='50%25' y1='99.871%25' x2='50%25' y2='3.298%25' id='a'%3E%3Cstop stop-color='%23E0E0E0' stop-opacity='0' offset='0%25'/%3E%3Cstop stop-color='%23C3C3C3' offset='100%25'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath d='M48 0v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H1v47h47v1H0V0h48z' fill='url(%23a)' fill-rule='nonzero'/%3E%3C/svg%3E\");\r\n      ${mediaQuery.lgDown} {\r\n        background-size: 27px;\r\n      }\r\n    `}\r\n`;\r\n","import * as React from 'react';\r\n\r\ntype MonitoringProps = {\r\n  appKey: string;\r\n  beaconUrl: string;\r\n};\r\n\r\nexport const Monitoring: React.FC<MonitoringProps> = ({ appKey, beaconUrl }) => {\r\n  if (!appKey || !beaconUrl) {\r\n    return null;\r\n  }\r\n\r\n  return (\r\n    <span\r\n      dangerouslySetInnerHTML={{\r\n        __html: `<script charset='UTF-8'>\r\n                    window['adrum-start-time'] = new Date().getTime();\r\n                    (function(config){\r\n                        config.appKey = '{appKey}';\r\n                        config.adrumExtUrlHttp = '/js/adrum/';\r\n                        config.adrumExtUrlHttps = '/js/adrum/';\r\n                        config.beaconUrlHttps = '{beaconUrl}';\r\n                        config.xd = {enable : false};\r\n                    })(window['adrum-config'] || (window['adrum-config'] = {}));\r\n                    document.write(unescape('%3Cscript')\r\n                        + \" src='/js/adrum/adrum-4.3.2.0.js' \"\r\n                        + \" type='text/javascript' charset='UTF-8'\"\r\n                        + unescape('%3E%3C/script%3E'));\r\n                </script>`\r\n          .replace('{appKey}', appKey)\r\n          .replace('{beaconUrl}', beaconUrl),\r\n      }}\r\n    ></span>\r\n  );\r\n};\r\n","import styled from 'styled-components';\r\nimport { ComponentMarginSize, componentTopMargin } from '../../utils/componentTopMargin';\r\n\r\ntype Props = {\r\n  componentName?: string;\r\n  margin?: ComponentMarginSize;\r\n};\r\n\r\nexport const Section = styled.div.attrs<Props>((props) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    return {\r\n      'data-component': props.componentName,\r\n    };\r\n  }\r\n})<Props>`\r\n  position: relative;\r\n  ${(props) => props.margin && componentTopMargin(props.margin)}\r\n`;\r\n","import { Link } from '@sitecore-jss/sitecore-jss-react';\r\nimport { LinkAnimatedUnderlineProps, linkAnimatedUnderlineStyle, linkAnimatedUnderlineStyleHover } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { cleanLinkData } from '../../shared/utils/field-validation';\r\n\r\ntype LinkProps = {\r\n  field?: any;\r\n};\r\n\r\nexport const LinkAnimatedUnderline: React.FC<LinkAnimatedUnderlineProps & LinkProps> = ({ field }) => {\r\n  field.value = cleanLinkData(field.value);\r\n\r\n  return (\r\n    <StyledLinkAnimatedUnderline\r\n      data-tracking-id={field?.value?.trackingcode}\r\n      field={field}\r\n    ></StyledLinkAnimatedUnderline>\r\n  );\r\n};\r\n\r\nconst StyledLinkAnimatedUnderline = styled(Link)<LinkAnimatedUnderlineProps>`\r\n  ${({ textColor, underlineColorPrimary, underlineColorSecondary }) =>\r\n    linkAnimatedUnderlineStyle(textColor, underlineColorPrimary, underlineColorSecondary)}\r\n  ${linkAnimatedUnderlineStyleHover}\r\n:empty {\r\n    display: none;\r\n  }\r\n`;\r\n","import React, { ReactNode } from 'react';\r\n\r\ntype Props = {\r\n  condition: boolean;\r\n  Wrapper: React.ElementType;\r\n  props: Object;\r\n  children: ReactNode[] | JSX.Element;\r\n};\r\n\r\nexport const WithConditionWrapper: React.FC<Props> = ({ condition, Wrapper, props, children }): JSX.Element => (\r\n  <>{condition ? children : <Wrapper {...props}>{children}</Wrapper>}</>\r\n);\r\n","import { Placeholder, VisitorIdentification } from '@sitecore-jss/sitecore-jss-react';\r\nimport { ConsentLevel, ScrollIndicator, useCookieConsent } from 'db-npm-rdui';\r\nimport React from 'react';\r\nimport Helmet from 'react-helmet';\r\nimport { fieldReferences } from './constants';\r\nimport { EditorIncludes, LayoutBackground, Monitoring } from './shared/components';\r\nimport { useAdobePageLoadTracking, useAdobeTrackingData, useContextSettings } from './shared/hooks';\r\n\r\n/*\r\n  APP LAYOUT\r\n  This is where the app's HTML structure and root placeholders should be defined.\r\n\r\n  All routes share this root layout by default (this could be customized in RouteHandler),\r\n  but components added to inner placeholders are route-specific.\r\n*/\r\n\r\nconst Layout = ({ route }) => {\r\n  const contextSettings = useContextSettings();\r\n  const cookieConsent = useCookieConsent();\r\n\r\n  const metaTitle = route.fields?.[fieldReferences.basePage.metaTitle]?.value || '';\r\n  const metaDescription = route.fields?.[fieldReferences.basePage.metaDescription]?.value || '';\r\n  const metaKeywords = route.fields?.[fieldReferences.basePage.metaKeywords]?.value || '';\r\n  const metaNoindex = route.fields?.[fieldReferences.basePage.metaNoindex]?.value || false;\r\n  const canonicalUrl = route.fields?.[fieldReferences.basePage.canonicalUrl]?.value || null;\r\n  const googleSiteVerification = contextSettings.googleSiteVerification || '';\r\n  const facebookDomainVerification = contextSettings.facebookDomainVerification || '';\r\n  const sharingImage = route.fields?.[fieldReferences.basePage.sharingImage]?.value || '';\r\n  const greyBackground = route.fields?.[fieldReferences.basePage.greyBackground]?.value || false;\r\n\r\n  useAdobePageLoadTracking(metaTitle);\r\n  const trackingAllowed = cookieConsent.isAllowed(ConsentLevel.Statistics);\r\n  useAdobeTrackingData(metaTitle, trackingAllowed);\r\n\r\n  return (\r\n    <React.Fragment>\r\n      {/* react-helmet enables setting <head> contents, like title and OG meta tags */}\r\n      <Helmet>\r\n        <title>{metaTitle}</title>\r\n        {metaNoindex && <meta name=\"robots\" content=\"noindex\" />}\r\n        {metaDescription !== '' && <meta name=\"description\" content={metaDescription} />}\r\n        {metaKeywords !== '' && <meta name=\"keywords\" content={metaKeywords} />}\r\n        {googleSiteVerification !== '' && <meta name=\"google-site-verification\" content={googleSiteVerification} />}\r\n        {facebookDomainVerification !== '' && (\r\n          <meta name=\"facebook-domain-verification\" content={facebookDomainVerification} />\r\n        )}\r\n        {canonicalUrl && <link rel=\"canonical\" href={canonicalUrl} />}\r\n        <meta property=\"og:type\" content=\"website\" />\r\n        {sharingImage !== '' && <meta property=\"og:image\" content={sharingImage} />}\r\n      </Helmet>\r\n      {/*\r\n      VisitorIdentification is necessary for Sitecore Analytics to determine if the visitor is a robot.\r\n      If Sitecore XP (with xConnect/xDB) is used, this is required or else analytics will not be collected for the JSS app.\r\n      For XM (CMS-only) apps, this should be removed.\r\n\r\n      VI detection only runs once for a given analytics ID, so this is not a recurring operation once cookies are established.\r\n    */}\r\n      <VisitorIdentification />\r\n\r\n      <ScrollIndicator />\r\n\r\n      <Placeholder name=\"jss-header\" rendering={route} />\r\n\r\n      <LayoutBackground greyPattern={greyBackground}>\r\n        <Placeholder name=\"jss-content\" rendering={route} />\r\n      </LayoutBackground>\r\n\r\n      <Placeholder name=\"jss-footer\" rendering={route} />\r\n\r\n      <EditorIncludes />\r\n      <Monitoring appKey={contextSettings.monitoring.appKey} beaconUrl={contextSettings.monitoring.beaconUrl} />\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nexport default Layout;\r\n","import React from 'react';\r\n\r\n// Renders a route-not-found message when no route is available from Sitecore\r\n// The JSS equivalent of a 404 Not Found page.\r\n\r\n// This is invoked from RouteHandler when Sitecore returns no valid route data.\r\n// The NotFound component receives the Layout Service Context data, but no route data.\r\n// This can be used to power parts of your site, such as navigation, from LS context additions\r\n// without losing the ability to render them on your 404 pages :)\r\n\r\nconst NotFound = ({ context = { site: { name: '' }, language: '' } }) => (\r\n  <React.Fragment>\r\n    <h1>Page not found</h1>\r\n    <p>This page does not exist.</p>\r\n    <p>\r\n      Site: {context.site && context.site.name}\r\n      <br />\r\n      Language: {context.language}\r\n    </p>\r\n  </React.Fragment>\r\n);\r\n\r\nexport default NotFound;\r\n","import React from 'react';\r\nimport i18n from 'i18next';\r\nimport Helmet from 'react-helmet';\r\nimport { isExperienceEditorActive, dataApi } from '@sitecore-jss/sitecore-jss-react';\r\nimport SitecoreContextFactory from './lib/SitecoreContextFactory';\r\nimport { dataFetcher } from './dataFetcher';\r\nimport config from './temp/config';\r\nimport Layout from './Layout';\r\nimport NotFound from './NotFound';\r\n\r\n// Dynamic route handler for Sitecore items.\r\n// Because JSS app routes are defined in Sitecore, traditional static React routing isn't enough -\r\n// we need to be able to load dynamic route data from Sitecore after the client side route changes.\r\n// So react-router delegates all route rendering to this handler, which attempts to get the right\r\n// route data from Sitecore - and if none exists, renders the not found component.\r\n\r\nlet ssrInitialState = null;\r\n\r\nexport default class RouteHandler extends React.Component {\r\n  constructor(props) {\r\n    super(props);\r\n\r\n    this.state = {\r\n      notFound: true,\r\n      routeData: ssrInitialState, // null when client-side rendering\r\n      defaultLanguage: config.defaultLanguage,\r\n    };\r\n\r\n    if (ssrInitialState && ssrInitialState.sitecore && ssrInitialState.sitecore.route) {\r\n      // set the initial sitecore context data if we got SSR initial state\r\n      SitecoreContextFactory.setSitecoreContext({\r\n        route: ssrInitialState.sitecore.route,\r\n        itemId: ssrInitialState.sitecore.route.itemId,\r\n        ...ssrInitialState.sitecore.context,\r\n      });\r\n    }\r\n\r\n    // route data from react-router - if route was resolved, it's not a 404\r\n    if (props.route !== null) {\r\n      this.state.notFound = false;\r\n    }\r\n\r\n    // if we have an initial SSR state, and that state doesn't have a valid route data,\r\n    // then this is a 404 route.\r\n    if (ssrInitialState && (!ssrInitialState.sitecore || !ssrInitialState.sitecore.route)) {\r\n      this.state.notFound = true;\r\n    }\r\n\r\n    // if we have an SSR state, and that state has language data, set the current language\r\n    // (this makes the language of content follow the Sitecore context language cookie)\r\n    // note that a route-based language (i.e. /de-DE) will override this default; this is for home.\r\n    if (ssrInitialState && ssrInitialState.context && ssrInitialState.context.language) {\r\n      this.state.defaultLanguage = ssrInitialState.context.language;\r\n    }\r\n\r\n    // once we initialize the route handler, we've \"used up\" the SSR data,\r\n    // if it existed, so we want to clear it now that it's in react state.\r\n    // future route changes that might destroy/remount this component should ignore any SSR data.\r\n    // EXCEPTION: Unless we are still SSR-ing. Because SSR can re-render the component twice\r\n    // (once to find GraphQL queries that need to run, the second time to refresh the view with\r\n    // GraphQL query results)\r\n    // We test for SSR by checking for Node-specific process.env variable.\r\n    if (typeof window !== 'undefined') {\r\n      ssrInitialState = null;\r\n    }\r\n\r\n    this.componentIsMounted = false;\r\n    this.languageIsChanging = false;\r\n\r\n    // tell i18next to sync its current language with the route language\r\n    this.updateLanguage();\r\n  }\r\n\r\n  componentDidMount() {\r\n    // if no existing routeData is present (from SSR), get Layout Service fetching the route data\r\n    if (!this.state.routeData) {\r\n      this.updateRouteData();\r\n    }\r\n\r\n    this.componentIsMounted = true;\r\n  }\r\n\r\n  componentWillUnmount() {\r\n    this.componentIsMounted = false;\r\n  }\r\n\r\n  /**\r\n   * Loads route data from Sitecore Layout Service into state.routeData\r\n   */\r\n  updateRouteData() {\r\n    let sitecoreRoutePath = this.props.route.match.params.sitecoreRoute || config.defaultAppRoute;\r\n    if (!sitecoreRoutePath.startsWith('/')) {\r\n      sitecoreRoutePath = `/${sitecoreRoutePath}`;\r\n    }\r\n\r\n    const language = this.props.route.match.params.lang || this.state.defaultLanguage;\r\n\r\n    // get the route data for the new route\r\n    getRouteData(sitecoreRoutePath, language).then((routeData) => {\r\n      if (routeData !== null && routeData.sitecore && routeData.sitecore.route) {\r\n        // set the sitecore context data and push the new route\r\n        SitecoreContextFactory.setSitecoreContext({\r\n          route: routeData.sitecore.route,\r\n          itemId: routeData.sitecore.route.itemId,\r\n          ...routeData.sitecore.context,\r\n        });\r\n        this.setState({ routeData, notFound: false });\r\n      } else {\r\n        this.setState({ routeData, notFound: true });\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Updates the current app language to match the route data.\r\n   */\r\n  updateLanguage() {\r\n    const newLanguage = this.props.route.match.params.lang || this.state.defaultLanguage;\r\n\r\n    if (i18n.language !== newLanguage) {\r\n      this.languageIsChanging = true;\r\n\r\n      i18n.changeLanguage(newLanguage, () => {\r\n        this.languageIsChanging = false;\r\n\r\n        // if the component is not mounted, we don't care\r\n        // (next time it mounts, it will render with the right language context)\r\n        if (this.componentIsMounted) {\r\n          // after we change the i18n language, we need to force-update React,\r\n          // since otherwise React won't know that the dictionary has changed\r\n          // because it is stored in i18next state not React state\r\n          this.forceUpdate();\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  componentDidUpdate(previousProps) {\r\n    const existingRoute = previousProps.route.match.url;\r\n    const newRoute = this.props.route.match.url;\r\n\r\n    // don't change state (refetch route data) if the route has not changed\r\n    if (existingRoute === newRoute) {\r\n      return;\r\n    }\r\n\r\n    // if in experience editor - force reload instead of route data update\r\n    // avoids confusing Sitecore's editing JS\r\n    if (isExperienceEditorActive()) {\r\n      window.location.assign(newRoute);\r\n      return;\r\n    }\r\n\r\n    this.updateLanguage();\r\n    this.updateRouteData();\r\n  }\r\n\r\n  render() {\r\n    const { notFound, routeData } = this.state;\r\n\r\n    // no route data for the current route in Sitecore - show not found component.\r\n    // Note: this is client-side only 404 handling. Server-side 404 handling is the responsibility\r\n    // of the server being used (i.e. node-headless-ssr-proxy and Sitecore intergrated rendering know how to send 404 status codes).\r\n    if (notFound) {\r\n      return (\r\n        <div>\r\n          <Helmet>\r\n            <title>{i18n.t('Page not found')}</title>\r\n          </Helmet>\r\n          <NotFound context={routeData.sitecore && routeData.sitecore.context} />\r\n        </div>\r\n      );\r\n    }\r\n\r\n    // Don't render anything if the route data or dictionary data is not fully loaded yet.\r\n    // This is a good place for a \"Loading\" component, if one is needed.\r\n    if (!routeData || this.languageIsChanging) {\r\n      return null;\r\n    }\r\n\r\n    // Render the app's root structural layout\r\n    return <Layout route={routeData.sitecore.route} />;\r\n  }\r\n}\r\n\r\n/**\r\n * Sets the initial state provided by server-side rendering.\r\n * Setting this state will bypass initial route data fetch calls.\r\n * @param {object} ssrState\r\n */\r\nexport function setServerSideRenderingState(ssrState) {\r\n  ssrInitialState = ssrState;\r\n}\r\n\r\n/**\r\n * Gets route data from Sitecore. This data is used to construct the component layout for a JSS route.\r\n * @param {string} route Route path to get data for (e.g. /about)\r\n * @param {string} language Language to get route data in (content language, e.g. 'en')\r\n */\r\nfunction getRouteData(route, language) {\r\n  const fetchOptions = {\r\n    layoutServiceConfig: { host: config.sitecoreApiHost },\r\n    querystringParams: { sc_lang: language, sc_apikey: config.sitecoreApiKey },\r\n    fetcher: dataFetcher,\r\n  };\r\n\r\n  return dataApi.fetchRouteData(route, fetchOptions).catch((error) => {\r\n    if (error.response && error.response.status === 404 && error.response.data) {\r\n      return error.response.data;\r\n    }\r\n\r\n    console.error('Route data fetch error', error, error.response);\r\n\r\n    return null;\r\n  });\r\n}\r\n","import { NormalizedCacheObject } from 'apollo-cache-inmemory';\r\nimport ApolloClient from 'apollo-client';\r\nimport 'db-npm-rdui/dist/fonts.css';\r\nimport 'db-npm-rdui/dist/normalize.css';\r\nimport 'db-npm-rdui/dist/styles.css';\r\nimport * as React from 'react';\r\nimport { ApolloProvider } from 'react-apollo';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport RouteHandler from './RouteHandler';\r\nimport { AppSetup } from './shared/components/AppSetup';\r\n\r\n// This is the main JSX entry point of the app invoked by the renderer (server or client rendering).\r\n// By default the app's normal rendering is delegated to <RouteHandler> that handles the loading of JSS route data.\r\n\r\n// support languages in the URL prefix\r\n// e.g. /da-DK/path, or /en/path, or /path\r\nexport const routePatterns = [\r\n  // '/:lang([a-z]{2}-[A-Z]{2})/:sitecoreRoute*',\r\n  // '/:lang([a-z]{2})/:sitecoreRoute*',\r\n  '/:sitecoreRoute*',\r\n];\r\n\r\n// wrap the app with:\r\n// ApolloProvider: provides an instance of Apollo GraphQL client to the app to make Connected GraphQL queries.\r\n//    Not needed if not using connected GraphQL.\r\n// SitecoreContext: provides component resolution and context services via withSitecoreContext\r\n// Router: provides a basic routing setup that will resolve Sitecore item routes and allow for language URL prefixes.\r\nconst AppRoot = ({\r\n  path,\r\n  Router,\r\n  graphQLClient,\r\n}: {\r\n  path: string;\r\n  Router: any;\r\n  graphQLClient: ApolloClient<NormalizedCacheObject>;\r\n}) => {\r\n  const routeRenderFunction = (props: any) => <RouteHandler route={props} />;\r\n  return (\r\n    <AppSetup>\r\n      <ApolloProvider client={graphQLClient}>\r\n        <Router location={path} context={{}}>\r\n          <Switch>\r\n            {routePatterns.map((routePattern) => (\r\n              <Route key={routePattern} path={routePattern} render={routeRenderFunction} />\r\n            ))}\r\n          </Switch>\r\n        </Router>\r\n      </ApolloProvider>\r\n    </AppSetup>\r\n  );\r\n};\r\n\r\nexport default AppRoot;\r\n","/* Polyfills */\r\nimport 'react-app-polyfill/ie11';\r\nimport 'core-js';\r\nimport './polyfills/array-fill';\r\nimport './polyfills/es6egexp';\r\nimport 'core-js/features/string/repeat';\r\n\r\n/* App */\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport AppRoot from './AppRoot';\r\nimport { setServerSideRenderingState } from './RouteHandler';\r\nimport GraphQLClientFactory from './lib/GraphQLClientFactory';\r\nimport config from './temp/config';\r\nimport i18ninit from './i18n';\r\n\r\n/* eslint-disable no-underscore-dangle */\r\n\r\nlet renderFunction = ReactDOM.render;\r\n\r\n/*\r\n  SSR Data\r\n  If we're running in a server-side rendering scenario,\r\n  the server will provide JSON in the #__JSS_STATE__ element\r\n  for us to acquire the initial state to run with on the client.\r\n\r\n  This enables us to skip a network request to load up the layout data.\r\n  We are emitting a quiescent script with JSON so that we can take advantage\r\n  of JSON.parse()'s speed advantage over parsing full JS, and enable\r\n  working without needing `unsafe-inline` in Content Security Policies.\r\n\r\n  SSR is initiated from /server/server.js.\r\n*/\r\nlet __JSS_STATE__ = null;\r\nconst ssrRawJson = document.getElementById('__JSS_STATE__');\r\nif (ssrRawJson) {\r\n  __JSS_STATE__ = JSON.parse(ssrRawJson.innerHTML);\r\n}\r\nif (__JSS_STATE__) {\r\n  // push the initial SSR state into the route handler, where it will be used\r\n  setServerSideRenderingState(__JSS_STATE__);\r\n\r\n  // when React initializes from a SSR-based initial state, you need to render with `hydrate` instead of `render`\r\n  renderFunction = ReactDOM.hydrate;\r\n}\r\n\r\n/*\r\n  GraphQL Data\r\n  The Apollo Client needs to be initialized to make GraphQL available to the JSS app.\r\n  Not using GraphQL? Remove this, and the ApolloContext from `AppRoot`.\r\n*/\r\n// Apollo supports SSR of GraphQL queries, so like JSS SSR, it has an object we can pre-hydrate the client cache from\r\n// to avoid needing to re-run GraphQL queries after the SSR page loads\r\nconst initialGraphQLState =\r\n  __JSS_STATE__ && __JSS_STATE__.APOLLO_STATE\r\n    ? __JSS_STATE__.APOLLO_STATE\r\n    : null;\r\n\r\nconst graphQLClient = GraphQLClientFactory(\r\n  config.graphQLEndpoint,\r\n  false,\r\n  initialGraphQLState\r\n);\r\n\r\n\r\nconst defaultLang = __JSS_STATE__ && __JSS_STATE__.viewBag && __JSS_STATE__.viewBag.language ? __JSS_STATE__.viewBag.language : null;\r\nconst defaultDic = __JSS_STATE__ && __JSS_STATE__.viewBag && __JSS_STATE__.viewBag.dictionary ? __JSS_STATE__.viewBag.dictionary : null;\r\n/*\r\n  App Rendering\r\n*/\r\n// initialize the dictionary, then render the app\r\n// note: if not making a multlingual app, the dictionary init can be removed.\r\ni18ninit(defaultLang, defaultDic).then(() => {\r\n  // HTML element to place the app into\r\n  const rootElement = document.getElementById('root');\r\n\r\n  renderFunction(\r\n    <AppRoot\r\n      path={window.location.pathname}\r\n      Router={BrowserRouter}\r\n      graphQLClient={graphQLClient}\r\n    />,\r\n    rootElement\r\n  );\r\n});\r\n","import i18n from 'i18next';\r\nimport fetchBackend from 'i18next-fetch-backend';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport config from './temp/config';\r\n\r\n/**\r\n * Initializes the i18next library to provide a translation dictionary to the app.\r\n * If your app is not multilingual, this file and references to it can be removed.\r\n * Elsewhere in the app to use the dictionary `import { t } from 'i18next'; ... t('key')`\r\n * @param {string} language Optional, the initial language. Only used for SSR; otherwise language set in RouteHandler.\r\n * @param {*} dictionary Optional, the dictionary to load. Only used for SSR; otherwise, the dictionary is loaded via JSS dictionary service.\r\n */\r\nexport default function i18nInit(language, dictionary) {\r\n  return new Promise((resolve, reject) => {\r\n    const options = {\r\n      debug: false,\r\n      lng: language,\r\n      fallbackLng: false, // fallback to keys\r\n      load: 'currentOnly', // e.g. don't load 'es' when requesting 'es-MX' -- Sitecore config should handle this\r\n      useCookie: false, // using URLs and Sitecore to store language context, don't need a cookie\r\n\r\n      interpolation: {\r\n        escapeValue: false, // not needed for react\r\n      },\r\n    };\r\n\r\n    if (dictionary) {\r\n      // if we got dictionary passed, that means we're in a SSR context with a server-provided dictionary\r\n      // so we do not want a backend, because we already know all possible keys\r\n      options.resources = {};\r\n      options.resources[language] = {\r\n        translation: dictionary,\r\n      };\r\n\r\n      i18n.use(initReactI18next).init(options, (error) => {\r\n        if (error) reject(error);\r\n        resolve();\r\n      });\r\n    } else {\r\n      // We're running client-side, so we get translation data from the Sitecore dictionary API using fetch backend\r\n      // For higher performance (but less simplicity), consider adding the i18n chained backend to a local cache option like the local storage backend.\r\n\r\n      const dictionaryServicePath = `${config.sitecoreApiHost}/sitecore/api/jss/dictionary/${config.jssAppName}/{{lng}}?sc_apikey=${config.sitecoreApiKey}`;\r\n\r\n      options.backend = {\r\n        loadPath: dictionaryServicePath,\r\n        parse: (data) => {\r\n          const parsedData = JSON.parse(data);\r\n          if (parsedData.phrases) {\r\n            return parsedData.phrases;\r\n          }\r\n          return parsedData;\r\n        },\r\n      };\r\n\r\n      i18n\r\n        .use(fetchBackend)\r\n        .use(initReactI18next)\r\n        .init(options, (error) => {\r\n          if (error) reject(error);\r\n\r\n          resolve();\r\n        });\r\n    }\r\n  });\r\n}\r\n","/* eslint-disable import/first */\r\n\r\nimport 'isomorphic-fetch';\r\nimport { ApolloClient } from 'apollo-client';\r\nimport { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';\r\n\r\n/*\r\n  INTROSPECTION DATA\r\n  See https://www.apollographql.com/docs/react/recipes/fragment-matching.html\r\n  This enables the Apollo cache to process fragments on interface types correctly.\r\n  If this file does not exist, you may need to run the `jss graphql:update` script.\r\n*/\r\nimport introspectionQueryResultData from '../temp/GraphQLFragmentTypes.json';\r\n\r\n/*\r\n  QUERY LINK SELECTION\r\n  A link is transport which GraphQL queries are pushed across.\r\n  You have many choices.\r\n  See the apollo-link documentation for more details.\r\n\r\n  NOTE: to use Sitecore Experience Editor it is essential that your\r\n  link passes cookies along with requests (credentials: 'include').\r\n*/\r\n\r\n// choose between a basic HTTP link to run queries...\r\n// import { createHttpLink } from 'apollo-link-http';\r\n// const link = createHttpLink({ uri: endpoint, credentials: 'include' });\r\n\r\n// ...or a batched link (multiple queries within 10ms all go in one HTTP request)\r\nimport { BatchHttpLink } from 'apollo-link-batch-http';\r\n\r\n// ...and an automatic persisted query link, which reduces bandwidth by using query hashes to alias content\r\n// the APQ link is _chained_ behind another link that performs the actual HTTP calls, so you can choose\r\n// APQ + batched, or APQ + http links for example.\r\nimport { createPersistedQueryLink } from 'apollo-link-persisted-queries';\r\n\r\nexport default function (endpoint, ssr, initialCacheState) {\r\n  /* HTTP link selection: default to batched + APQ */\r\n  const link = createPersistedQueryLink().concat(new BatchHttpLink({ uri: endpoint, credentials: 'include' }));\r\n\r\n  const cache = new InMemoryCache({\r\n    fragmentMatcher: new IntrospectionFragmentMatcher({\r\n      introspectionQueryResultData,\r\n    }),\r\n  });\r\n\r\n  return new ApolloClient({\r\n    ssrMode: ssr,\r\n    ssrForceFetchDelay: 100,\r\n    link,\r\n    cache: cache.restore(initialCacheState),\r\n  });\r\n}\r\n"],"sourceRoot":""}