{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./static/react/EventBus.tsx","webpack:///./static/react/Energipresentation/DataHelper.tsx","webpack:///./static/react/Energipresentation/DisplayHelper.tsx","webpack:///./static/react/Energipresentation/EnergipresentationAccordion.tsx","webpack:///./static/react/Energipresentation/EnergipresentationExportButton.tsx","webpack:///./static/react/ElstodsFormularBlock/index.tsx","webpack:///./static/react/ElstodsFormularBlock/ElstodsFormular.tsx","webpack:///./static/react/KalkylUrsprungsgarantier/index.tsx","webpack:///./static/react/KalkylUrsprungsgarantier/KalkylUrsprungsgarantier.tsx","webpack:///./static/react/KalkylUrsprungsgarantier/HelpText.tsx","webpack:///./static/react/Energipresentation/index.tsx","webpack:///./static/react/Energipresentation/EnergipresentationBubbles.tsx","webpack:///./static/react/Energipresentation/EnergipresentationDoubleBubbles.tsx","webpack:///./static/react/Energipresentation/EnergipresentationFilter.tsx","webpack:///./static/react/Energipresentation/EnergipresentationGraph.tsx","webpack:///./static/react/Energipresentation/SortOrderEnum.tsx","webpack:///./static/react/Energipresentation/EnergipresentationDoubleGraph.tsx","webpack:///./static/react/Energipresentation/EnergipresentationCircle.tsx","webpack:///./static/react/Energipresentation/EnergipresentationSankey.tsx","webpack:///./static/react/Energipresentation/EnergipresentationScales.tsx","webpack:///./static/react/KalkylElefterfragan/index.tsx","webpack:///./static/react/KalkylElefterfragan/KalkylElefterfragan.tsx","webpack:///./static/react/KalkylElefterfragan/KalkylElefterfraganGraph.tsx","webpack:///./static/react/KalkylElefterfragan/KalkylElefterfraganTable.tsx","webpack:///./static/react/KalkylElefterfragan/HelpText.tsx","webpack:///./static/react/KalkylElefterfragan/KalkylElefterfraganPopulationTable.tsx","webpack:///./static/react/MobileTopBar/index.tsx","webpack:///./static/react/MobileTopBar/MobileTopBar.tsx","webpack:///./static/react/MobileTopBar/DataHelper.tsx","webpack:///./static/react/MobileTopBar/MobileMenuItem.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","EventBus","on","event","callback","document","addEventListener","e","detail","dispatch","dispatchEvent","CustomEvent","remove","removeEventListener","FetchGraphData","apiRequest","this","performFetch","response","cleanedJson","removeUnusedProperties","FetchDoubleGraphData","FetchScaleData","newYears","FetchCircleData","FetchSankeyData","FetchGraphOverviewData","FetchDoubleGraphOverviewData","pascalToCamel","input","toLowerCase","transformKeysToCamelCase","obj","Array","isArray","map","newObj","newKey","removeIndentFromJsonString","jsonString","jsonObject","JSON","parse","stringify","endPoint","debug","requests","requestBody","getElementsByTagName","lang","fetch","credentials","method","headers","keepalive","body","then","json","ok","domainStartIndex","apiUrl","indexOf","domainEndIndex","substring","domain","Error","ExceptionMessage","newJson","catch","err","DisplayHelper","language","documentElement","navigator","ToHTMLTable","series","type","title","heading","decimals","unit","inverted","sortOrder","tableData","ToWorksheetData","numberFormat","Intl","NumberFormat","maximumFractionDigits","minimumFractionDigits","ttsUnit","LocaleText","theadTh","rowTh","toTr","tr","isHeader","tag","format","join","thead","tbody","workSheet","scaleData","getScaleData","SwapDataAxis","localHeading","seriesData","getSeriesData","worksheetData","orderColumns","getWorksheetData","rightSideValues","sourceCValues","sourceBValues","leftSide","rightSide","totalText","sourceAEltillforselTotal","sourceRightSideTotal","sourceAValues","forEach","item","descriptionDifference","statisticDifference","resultTextSourceC","sourceCEnergianvandningBranslenTotal","resultTextSourceB","sourceBEnergianvandningTotal","serie","y","from","to","weight","chartHeading","_","colIndex","row","order","rows","col","val","orderArray","kv","sorted","OrderByDescending","arr","Descending","OrderBy","Ascending","some","x","keys","includes","collator","Collator","usage","sort","a","b","compare","GetTextReplacementsFromData","graphData","hasPrognose","chart","getTextReplacemntsFromCircleData","getTextReplacemntsFromGraphData","circleData","allYearsSorted","FROM","TO","SERIES","DataSeparator","CATEGORIES","getTextReplacementsFromText","text","categories","xAxis","textReplacements","plotBands","filter","prognoseRegExp","test","label","every","pb","prognosePlotBands","START","END","catFiltered","reverse","texts","split","ReflectDataInText","keepDelimiters","k","tempData","all","DataDelimiter","trim","last","replace","english","swedish","DisplayPrognoseArea","addPlotBandBackground","addPlotBandLine","setHoverEffects","plotBand","color","pattern","path","width","height","backgroundColor","opacity","events","render","plotLinesAndBands","options","xPos","toPixels","yStart","plotTop","yEnd","plotHeight","attr","renderer","stroke","style","dashstyle","zIndex","class","add","plotOptions","states","inactive","brighten","mouseOver","target","brightenedColor","update","mouseOut","originalColor","alpha","values","hexToRGB","Math","round","rgbToHex","xr","xg","xb","parseInt","hex","charAt","props","React","Fragment","className","modelStyle","dangerouslySetInnerHTML","__html","onClick","sheetName","sanitizedSheetName","worksheet","XLSX","utils","aoa_to_sheet","workbook","book_new","book_append_sheet","writeFile","$","ready","getElementsByClassName","elstodsBlocks","currentBlock","titleConsumption","getAttribute","titleCost","titleCalculation","buttonTitle","resetButtonTitle","labelAnnualTurnover","labelPeriodYear2","labelPeriodYear1","labelFullYear1","labelQuota","labelEligibleUse","labelEligibleCost","explanationQuota","explanationEligibleUse","explanationEligibleCost","suffixCurrency","suffixElectricity","suffixQuota","showAsHorizontalString","showAsHorizontal","preSummary","postSummary","negativeSummary","hideQuotaString","hideEligibleCostString","hideEligibleUseString","hideQuota","hideEligibleCost","hideEligibleUse","toLocaleLowerCase","ReactDOM","initialValues","arsOmsattning","totAnvKWhOktDec2022","totAnvKWhOktDec2021","totAnvKWh2021","kostAnvSEKOktDec2022","kostAnvSEK2021","kvotElanvandningArsomsattning","stodberattigandeElAnvKWh","stodberattigandeElKost","calculationSummary","showCalculationResults","showResult","isNegativeResult","state","setState","useState","useEffect","addThousandSeparators","num","toString","removeNonNumeric","handleChange","propertyName","getText","parseNumeric","calculateElkostnadsstod","newState","quota","toFixed","oktDec2021Diff","oktDec2022Diff","minstastodberattigandeElAnv","minQuota","utrakning","utrakningString","clearAll","toggleResult","onChange","decodeHtmlEntities","encodedString","DOMParser","parseFromString","textContent","kalkylUrsprungsgatantier","chooseAnswerType","buttonCalculate","buttonReset","resultText","resultUnit","electricityProduction","estimatedAnnualProduction","estimatedAnnualProductionHelpText","estimatedAnnualProductionUnit","estimatedAnnualProductionDefaultValueString","installedEffect","installedEffectHelpText","installedEffectUnit","installedEffectDefaultValueString","compensation","compensationHelpText","addedCompensation","addedCompensationUnit","addedCompensationDefaultValueString","compensationUG","compensationUGUnit","compensationUGDefaultValueString","annualFee","annualFeeDescription","annualFeeUnit","annualFeeDefaultValueString","percentageSolar","ownUsage","ownUsageUnit","ownUsageHelpText","ownUsageDefaultValueString","addedCompensationDefaultValue","isNaN","annualFeeDefaultValue","compensationUGDefaultValue","estimatedAnnualProductionDefaultValue","installedEffectDefaultValue","ownUsageDefaultValue","ownUsageHelptText","isCleared","isCalculated","isValid","estimatedAnnualProductionMin","estimatedAnnualProductionMax","estimatedAnnualProductionIsValid","estimatedAnnualProductionIsFocused","installedEffectMin","installedEffectMax","installedEffectIsValid","installedEffectIsFocused","addedCompensationMin","addedCompensationMax","addedCompensationIsValid","addedCompensationIsFocused","compensationUGMin","compensationUGMax","compensationUGIsValid","compensationUGIsFocused","percentageSolarMin","percentageSolarMax","percentageSolarIsValid","percentageSolarIsFocused","inputRefs","estimatedAnnualProductionTextbox","useRef","installedEffectTextbox","addedCompensationTextbox","compensationUGTextbox","percentageSolarTextbox","focusedTextbox","setFocusedTextbox","parts","valueString","validateField","resultValue","undefined","allIsFilled","isQuestion1Alternative1","isQuestion2Alternative1","fieldName","minValue","maxValue","validateSingleField","doValidate","currentValue","validateAll","handleQuestionChange","getOptionsClasses","compareTo","inputValue","classes","handleFocus","select","handleBlur","getInputContainerClasses","isFocused","handleContainerClick","textboxName","current","focus","id","checked","htmlFor","helpText","alt","placeholder","onFocus","onBlur","ref","disabled","getResultClasses","question1","question2","helpTextRef","helpIconRef","wrapperRef","showHelpText","handleClickOutside","contains","prevState","handleKeyDown","activeElement","preventDefault","toggleHelpText","leftPosition","getBoundingClientRect","left","tabIndex","role","src","htmlString","innerWidth","asIntOrDefault","defaultValue","getAccordionFields","helpTitle","columnHeaders","invertTableAxis","columnSortOrder","Title","Text","ColumnHeaders","InvertTableAxis","ColumnSortOrder","ModelStyle","getRequestFields","fieldSuffix","catVariableDefault","divideBy","xAxisVariableIndexString","categoryVariableIndexString","divideValueByString","ApiUrl","RequestBody","XAxisVariableIndex","CategoryVariableIndex","DivideValueBy","getPrognoseFields","prognoseApiUrl","prognoseRequestBody","prognoseXAxisVariableIndexString","prognoseCategoryVariableIndexString","prognoseDivideValueByString","prognoseText","getBaseFields","typeString","headTitle","numberOfDecimals","blockId","lastPublished","Type","HeadTitle","NumberOfDecimals","BlockId","LastPublished","energipresentationBubbles","valuePrefix","valueSuffix","base","request","prognose","useCommonFilter","xAxisVariableIndex","categoryVariableIndex","divideValueBy","prognoseXAxisVariableIndex","prognoseCategoryVariableIndex","prognoseDivideValueBy","energipresentationDoubleBubbles","doCalculateQuota","request1","request2","apiUrl1","requestBody1","xAxisVariableIndex1","categoryVariableIndex1","divideValueBy1","apiUrl2","requestBody2","xAxisVariableIndex2","categoryVariableIndex2","divideValueBy2","energipresentationGraph","yAxisName","xAxisShowNthString","specialTypeString","help","specialType","xAxisShowNth","helpColumnHeaders","helpInvertTableAxis","helpColumnSortOrder","helpModelStyle","apiUrlOne","requestBodyOne","apiUrlTwo","requestBodyTwo","energipresentationScales","titleLeftSide","titleRightSide","requestA","requestB","requestC","apiUrlSourceAEltillforsel","requestBodySourceAEltillforsel","xAxisVariableIndexSourceA","categoryVariableIndexSourceA","divideBySourceA","apiUrlSourceBEnergianvandning","requestBodySourceBEnergianvandning","xAxisVariableIndexSourceB","categoryVariableIndexSourceB","divideBySourceB","apiUrlSourceCEnergianvandningBranslen","requestBodySourceCEnergianvandningBranslen","xAxisVariableIndexSourceC","categoryVariableIndexSourceC","divideBySourceC","energipresentationCircle","energipresentationSankey","contentId","cId","energipresentationFilter","bubblesBlocks","toUseCommon","doubleBubblesBlocks","textField","linkedBlockId","year1DefaultValueString","year2DefaultValueString","firstLoad","label1","label2","singleSelect","year1DefaultValue","year2DefaultValue","bubblesBlockCount","initialState","isLoading","firstYear","firstYearValue","secondYear","secondYearValue","delayed","setDelayed","setYears","updateSelectedYears","timeout","setTimeout","clearTimeout","async","years","prognoseStartYear","customNewYears","getGraphOverViewData","updateSelectedYearFromApi","isPrognose","initializeBubbles","objectKeys","minYearKey","maxYearKey","currentYears","minYear","maxYear","transformBubbleValue","doubleApiRequest","roundedValue","selectableYears","showFirstYearOptions","showSecondYearOptions","loadedBubbleBlocks","cbRef","setStateCallback","useCallback","useStateCallback","firstYearRef","secondYearRef","setShowFirstYearOptions","setShowSecondYearOptions","focusedOptionIndex","setFocusedOptionIndex","selectedYearIndex","setSelectedYearIndex","dropdownOptionsRef","selectedOption","querySelector","scrollIntoView","behavior","block","toggleFirstYearOptions","toggleSecondYearOptions","setFirstLoad","loadedBlock","toggleFilter","getFilterBlock","filterBlock","getElementById","HTMLElement","loadedBubblesBlocks","loadedBubblesCountString","loadedBubblesCount","getLoadedBubblesInMarkup","setAttribute","markupMinYear","getMinMaxYear","markupMaxYear","updatedYears","generateYears","getFirstLoad","useFirstLoad","updateBlockYears","setMinMaxYear","classList","year1DefaultExists","year2DefaultExists","savedState","selectedYears","isMinYear","year","attributeName","yearString","firstLoadString","yearOptions","toggleDropdownOptions","dropdown","changeFirstYear","newYear","index","changeSecondYear","createHandleKeyDown","dropdownId","prevIndex","newIndex","min","scrollFocusedOptionIntoView","max","selectedYear","optionElement","dropdownContainer","parentNode","element","clientHeight","scrollHeight","scrollParent","offsetHeight","offsetTop","parentOffsetHeight","scrollTop","isBelow","scrollTo","maintainScrollVisibility","bounding","top","bottom","innerHeight","right","clientWidth","isElementInView","onKeyDown","selectableYear","selectableYearIndex","el","Highcharts","getGraphData","initializeGraph","marginTop","getTableHeading","HighchartsReact","highcharts","cmsText","addSpecificHelpText","SortOrder","getCircleData","initializeCircle","hasValues","sankeyData","getSankeyData","updateState","list","availableYears","clip","minLinkWidth","link","fromNode","nodes","find","toNode","column","marginBottom","offsetVertical","dataLabels","allowOverlap","sankey","nodePadding","nodeWidth","Date","now","getFullYear","errorText","sourceAEltillforselValues","sourceBEnergianvandningValues","sourceCEnergianvandningBranslenValues","fetchScaleData","scaleApiRequest","initializeScale","mapValues","yearIndex","getTotal","sourceBAndCTotal","mapped","v","itemA","itemB","reduce","accumulator","currentItem","hasAllValues","itemIndex","getAsIntOrZero","parsed","fetchApiData","url","requestData","statusText","error","kalkylElefterfragan","mainText","helptextIndustryExisting","helptextIndustryUpcoming","helptextTransportLight","helptextTransportHeavy","helptextResidences","helptextService","currentLanguage","sumText","blockReference","productionApiUrl","productionApiRequest","culture","apiData","countyDefaultValue","counties","changeValue","setChangeValue","demandData","setDemandData","Rows","Name","originalDemandData","setOriginalDemandData","factorData","setFactorData","setUnit","productionData","setProductionData","populationData","setPopulationData","originalPopulationData","setOriginalPopulationData","county","selectedCountyId","setSelectedCountyId","selectedCountyName","setSelectedCountyName","helpTextMap","initialCounty","Id","convertProductionData","production","handleClick","selectedCounty","countyId","DemandData","FactorData","ProductionData","PopulationData","Cells","StringValue","getNewValue","factor","findFactor","factorRow","NumberValue","Number","handlePopulationInputChange","cell","originalPopulation","changeRate","newValue","originalDemand","rowIndex","cellIndex","calculateData","originalData","handleDemandInputChange","demand","helpTexts","combinedData","transportData","combinedTransport","acc","curr","housingAndServiceData","combinedHousingAndService","concat","combineData","firstCell","seriesObject","parseFloat","seriesObjectUpperRange","NumberValueUpperRange","getChartData","wb","Props","Subject","CreatedDate","demandSheetData","valueUpperRange","sumRow","minSum","maxSum","hasRange","numberValue","populationSheetData","combinedSheet","colors","seriesWithPatterns","seriesIndex","point","categoryIndex","strokeWidth","showInLegend","legend","allItems","legendGroup","legendItem","group","credits","enabled","align","fontSize","labels","step","yAxis","stackLabels","verticalAlign","floating","defaultOptions","borderColor","borderWidth","shadow","itemStyle","tooltip","formatter","currentSeriesIndex","combinedValue","shared","stacking","hover","legendItemClick","upperRange","visible","hide","show","setLocalData","localData","columnSums","columnSumsUpperRange","columnIndex","debouncedHandleInputChange","delay","timeoutRef","args","useDebounce","handleKeyPress","handlePaste","pasteData","clipboardData","getData","includesIndustrisektorn","isUpcoming","updatedRows","rIndex","updatedCells","cIndex","handleInputChange","onKeyUp","onPaste","sum","actualValue","formattedValue","mobileTopBar","langCode","logoLink","logoTitle","searchLink","searchTitle","searchBoxId","searchLabelId","searchTerm","searchTermForm","searchProxyUrl","searchTags","isMenuVisible","isSearchVisible","menu","CurrentPageId","Menu","CurrentDepth","menuLeftStyle","menuIsLoading","showSearchSuggestions","searchSuggestions","searchBoxRef","handleClickOutsideSuggestion","targetIsChild","targetElement","closestReference","closest","loadMenu","updatedState","fetchData","getFullMenu","setCurrentMenuDepth","newDepth","href","hideSearch","showSearch","hideMenu","showMenu","action","getSearchSuggestions","hits","suggestionItem","suggestionIndex","newSearchTerm","changeSearchTerm","query","currentPageId","updateActiveChain","encodeURIComponent","location","pathname","currentDepth","MobileMenuItem","IsActive","getClassesForLinkListItem","MenuDepth","IsInActiveChain","IsVisible","IsQuickLink","HaveChildren","getClassesForLinkAnchorItem","Children","childItem","childItemIndex","Url","currentChild","toggleVisible","nativeEvent"],"mappings":"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","file":"generalreact.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([13,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import * as React from 'react';\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\n\r\n\r\nconst EventBus = {\r\n on(event, callback) {\r\n document.addEventListener(event, (e) => callback(e.detail));\r\n },\r\n\r\n dispatch(event, data){\r\n document.dispatchEvent(new CustomEvent(event, { detail: data }));\r\n },\r\n\r\n remove(event, callback){\r\n document.removeEventListener(event, callback);\r\n }\r\n};\r\nexport default EventBus;\r\n","import iEnergipresentationScaleApiRequestModel from \"./RequestModels/iEnergipresentationScaleApiRequest\";\r\nimport iEnergipresentationCircleApiRequestModel from \"./RequestModels/iEnergipresentationCircleApiRequest\";\r\nimport iEnergipresentationSankeyApiRequestModel from \"./RequestModels/iEnergipresentationSankeyApiRequest\";\r\nimport iEnergipresentationBubbleApiRequestModel from \"./RequestModels/iEnergipresentationBubbleApiRequest\";\r\nimport iEnergipresentationDoubleSourceBubbleApiRequestModel from \"./RequestModels/iEnergipresentationDoubleSourceBubbleApiRequest\";\r\nimport iEnergipresentationRectangleGraphApiRequestModel from \"./RequestModels/iEnergipresentationRectangleGraphApiRequest\";\r\nimport iEnergipresentationDoubleSourceGraphApiRequestModel from \"./RequestModels/iEnergipresentationDoubleSourceGraphApiRequest\";\r\nimport iEnergipresentationYearsModel from \"./iEnergipresentationYears\";\r\n\r\nexport default class DataHelper {\r\n\r\n private constructor() { }\r\n\r\n public static async FetchGraphData(apiRequest: iEnergipresentationRectangleGraphApiRequestModel, callback): Promise {\r\n let fetchCallback = (response: any) => {\r\n if (!response) {\r\n callback(response);\r\n }\r\n else {\r\n let cleanedJson = this.removeUnusedProperties(response);\r\n callback(cleanedJson);\r\n }\r\n };\r\n await this.performFetch(apiRequest, 'GetChartDataAsync', fetchCallback);\r\n };\r\n\r\n public static async FetchDoubleGraphData(apiRequest: iEnergipresentationDoubleSourceGraphApiRequestModel, callback): Promise {\r\n let fetchCallback = (response: any) => {\r\n if (!response) {\r\n callback(response);\r\n }\r\n else {\r\n let cleanedJson = this.removeUnusedProperties(response);\r\n callback(cleanedJson);\r\n }\r\n };\r\n await this.performFetch(apiRequest, 'GetDoubleChartDataAsync', fetchCallback);\r\n };\r\n\r\n public static async FetchScaleData(apiRequest: iEnergipresentationScaleApiRequestModel, callback, newYears?: iEnergipresentationYearsModel): Promise {\r\n let fetchCallback = (response: any) => {\r\n if (!response) {\r\n callback(response);\r\n }\r\n else {\r\n let cleanedJson = this.removeUnusedProperties(response);\r\n callback(cleanedJson, newYears);\r\n }\r\n };\r\n await this.performFetch(apiRequest, 'GetScaleDataAsync', fetchCallback);\r\n };\r\n\r\n public static async FetchCircleData(apiRequest: iEnergipresentationCircleApiRequestModel, callback): Promise {\r\n await this.performFetch(apiRequest, 'GetCircleDataAsync', callback);\r\n };\r\n\r\n public static async FetchSankeyData(apiRequest: iEnergipresentationSankeyApiRequestModel, callback, newYears?: iEnergipresentationYearsModel): Promise {\r\n let fetchCallback = (response: any) => {\r\n if (!response) {\r\n callback(response);\r\n }\r\n else {\r\n let cleanedJson = this.removeUnusedProperties(response);\r\n callback(cleanedJson, newYears);\r\n }\r\n };\r\n await this.performFetch(apiRequest, 'GetSankeyDataAsync', fetchCallback);\r\n };\r\n\r\n public static async FetchGraphOverviewData(apiRequest: iEnergipresentationBubbleApiRequestModel, callback, newYears?: iEnergipresentationYearsModel): Promise {\r\n let fetchCallback = (response: any) => {\r\n if (!response) {\r\n callback(response);\r\n }\r\n else {\r\n callback(response, newYears);\r\n }\r\n };\r\n await this.performFetch(apiRequest, 'GetChartOverviewDataAsync', fetchCallback);\r\n };\r\n\r\n public static async FetchDoubleGraphOverviewData(apiRequest: iEnergipresentationDoubleSourceBubbleApiRequestModel, callback, newYears?: iEnergipresentationYearsModel): Promise {\r\n let fetchCallback = (response: any) => {\r\n if (!response) {\r\n callback(response);\r\n }\r\n else {\r\n callback(response, newYears);\r\n }\r\n };\r\n await this.performFetch(apiRequest, 'GetDoubleChartOverviewDataAsync', fetchCallback);\r\n };\r\n\r\n private static pascalToCamel(input: string): string {\r\n if (!input || input[0] === input[0].toLowerCase()) {\r\n return input;\r\n }\r\n\r\n let firstChar = input[0].toLowerCase();\r\n let rest = input.slice(1);\r\n return `${firstChar}${rest}`;\r\n };\r\n\r\n private static transformKeysToCamelCase(obj: any, call?:number): any {\r\n if (typeof obj !== \"object\" || obj == null) {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(i => this.transformKeysToCamelCase(i, (call??0)+1));\r\n }\r\n\r\n let newObj = {};\r\n\r\n for (let key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n let newKey = this.pascalToCamel(key);\r\n let value = obj[key];\r\n newObj[newKey] = this.transformKeysToCamelCase(value);\r\n }\r\n }\r\n\r\n return newObj;\r\n };\r\n\r\n private static removeUnusedProperties(obj: any): any {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(i => this.removeUnusedProperties(i));\r\n }\r\n\r\n let result: any = {};\r\n\r\n for (let key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n let value = this.removeUnusedProperties(obj[key]);\r\n\r\n if (value !== null && value !== undefined) {\r\n result[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n private static removeIndentFromJsonString(jsonString: string): string {\r\n const jsonObject = JSON.parse(jsonString);\r\n const compactJsonString = JSON.stringify(jsonObject);\r\n return compactJsonString;\r\n };\r\n\r\n private static async performFetch(apiRequest: any, endPoint: string, callback, debug?: boolean): Promise {\r\n try {\r\n if (apiRequest.requests) {\r\n for (let i = 0; i < apiRequest.requests.length; i++) {\r\n if (debug && apiRequest.requests[i].requestBody.length === 0) {\r\n console.log(\"requestBody is empty for request \" + i + \" to \", endPoint);\r\n }\r\n apiRequest.requests[i].requestBody = this.removeIndentFromJsonString(apiRequest.requests[i].requestBody);\r\n }\r\n }\r\n\r\n apiRequest['lang'] = document.getElementsByTagName('html')[0].lang;\r\n if (debug) { console.log('req', apiRequest); }\r\n await fetch(\"/api/EnergipresentationApi/\" + endPoint, {\r\n credentials: 'same-origin',\r\n method: \"POST\",\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n keepalive: true,\r\n body: JSON.stringify(apiRequest)\r\n }).then(response => response.json()\r\n .then((json) => {\r\n if (debug) {\r\n console.log(\"performFetch: \" + endPoint, \"json\", json);\r\n }\r\n if (!response.ok) {\r\n let domainStartIndex = apiRequest.requests[0].apiUrl.indexOf(\"//\") + 2;\r\n let domainEndIndex = apiRequest.requests[0].apiUrl.substring(domainStartIndex).indexOf(\"/\");\r\n let domain = apiRequest.requests[0].apiUrl.substring(domainStartIndex, domainEndIndex + domainStartIndex)\r\n throw Error(\"Något gick fel vid hämtning från \" + domain + \": \" + (json ? json.ExceptionMessage : json));\r\n }\r\n else {\r\n let newJson = this.transformKeysToCamelCase(json)\r\n callback(newJson);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(\"Något gick fel i \" + endPoint + \": \", err);\r\n callback();\r\n })\r\n );\r\n }\r\n catch (err) {\r\n console.error(\"Något gick fel i try-catch: \", err);\r\n callback(false)\r\n }\r\n };\r\n};","import iCircleData from './ResponseModels/iCircleData';\r\nimport iGraphData from './ResponseModels/iGraphData';\r\nimport iPlotBand from './ResponseModels/iPlotBand';\r\nimport iSeriesItem from './ResponseModels/iSeriesItem';\r\nimport iSankeySeriesItem from './ResponseModels/iSankeySeriesItem';\r\nimport iCircleDatapost from './ResponseModels/iCircleDatapost';\r\nimport iScaleData from './ResponseModels/iScaleData';\r\nimport iTextReplacements from './iTextReplacements';\r\nimport SortOrder from './SortOrderEnum';\r\n\r\nexport default class DisplayHelper {\r\n\r\n private constructor() { }\r\n private static get language():string { return document.documentElement.lang || navigator.language };\r\n\r\n public static ToHTMLTable(series: Array | iScaleData, type: string, title: string, heading: Array, decimals: number, unit: string, inverted: boolean = false, sortOrder?: SortOrder): string {\r\n let tableData = this.ToWorksheetData(series, type, title, heading, unit, inverted, sortOrder)\r\n .slice(2);// skipping title\r\n\r\n decimals = decimals === null ? (type !== 'pie' && unit === '%' ? 2 : type === 'sankey' ? 3 : 1) : decimals;\r\n const numberFormat = new Intl.NumberFormat(this.language, { maximumFractionDigits: decimals, minimumFractionDigits: decimals });\r\n const ttsUnit = (unit === 'TWh' ? this.LocaleText('Terawatt hours', 'Terawattimmar') :\r\n unit === 'GWh' ? this.LocaleText('Gigawatt hours', 'Gigawattimmar') :\r\n unit === 'MWh' ? this.LocaleText('Megawatt hours', 'Megawattimmar') :\r\n unit === 'kWh' ? this.LocaleText('Kilowatt hours', 'Kilowattimmar') : unit);\r\n\r\n const th = 'th',\r\n td = 'td',\r\n theadTh = !(type === 'sankey' || type === 'scale') || !inverted,\r\n rowTh = !(type === 'sankey' || type === 'scale') || inverted,\r\n toTr = function (tr: Array, isHeader: boolean = false): string {\r\n return tr.map((d, i) => {\r\n let tag = (isHeader || (i === 0 && rowTh) ? th : td);\r\n let data = (typeof d === 'number' ? numberFormat.format(d) : d);\r\n let text = tag === td && typeof d === 'number' ? `${data} ${ttsUnit}` : data;\r\n let cssClass = typeof d === 'number' ? ' class=\"value\"' : '';\r\n return `<${tag}${cssClass}>${text}`;\r\n }).join('');\r\n };\r\n\r\n const thead = `${toTr(tableData[0], theadTh)}`;\r\n const tbody = tableData.slice(1).map((tr) => { return `${toTr(tr)}`; }).join('');\r\n const tableScrollCSS = rowTh ? ' stick' : '';\r\n\r\n return `
${thead}${tbody}
`;\r\n };\r\n\r\n public static ToWorksheetData(series: Array | iScaleData, type: string, title: string, heading: Array, unit: string, inverted: boolean = false, sortOrder?: SortOrder):\r\n Array> {\r\n\r\n const workSheet = [[title + (unit ? ` (${unit})` : '')], []] as Array>;\r\n if (type === 'scale') {\r\n const scaleData = this.getScaleData(series as iScaleData, unit);\r\n workSheet.push(...(inverted ? this.SwapDataAxis(scaleData) : scaleData));\r\n }\r\n else {\r\n let localHeading = heading;\r\n if (type === 'sankey') {\r\n localHeading = [this.LocaleText('From', 'Från'), this.LocaleText('To', 'Till'), unit];\r\n }\r\n\r\n const seriesData = this.getSeriesData(series as Array, type);\r\n const worksheetData = sortOrder\r\n ? this.orderColumns(this.getWorksheetData(seriesData, localHeading), type, sortOrder)\r\n : this.getWorksheetData(seriesData, localHeading);\r\n workSheet.push(...(inverted ? this.SwapDataAxis(worksheetData) : worksheetData));\r\n }\r\n\r\n return workSheet;\r\n };\r\n private static getScaleData(data: iScaleData, unit: string):\r\n Array> {\r\n\r\n const seriesData = [] as Array>;\r\n const rightSideValues = [...data.sourceCValues, ...data.sourceBValues];\r\n const leftSide = this.LocaleText('Energy supply', 'Tillförd energi');\r\n const rightSide = this.LocaleText('Energy consumption', 'Energianvändning');\r\n const totalText = this.LocaleText('Total', 'Totalt');\r\n seriesData.push([leftSide, unit, rightSide, unit]);\r\n seriesData.push([totalText, data.sourceAEltillforselTotal, totalText, data.sourceRightSideTotal]);\r\n data.sourceAValues.forEach((item, i) => seriesData.push([item.key, item.value[0], rightSideValues[i].key, rightSideValues[i].value[0]]));\r\n seriesData.push(['', '', data.descriptionDifference, data.statisticDifference]);\r\n seriesData.push(['', '', data.resultTextSourceC, data.sourceCEnergianvandningBranslenTotal]);\r\n seriesData.push(['', '', data.resultTextSourceB, data.sourceBEnergianvandningTotal]);\r\n\r\n return seriesData;\r\n };\r\n private static getSeriesData(series: Array, type: string):\r\n Array> {\r\n\r\n const seriesData = [] as Array>;\r\n\r\n series.forEach(serie => {\r\n if (type === 'pie') {\r\n (serie as iCircleDatapost).data.forEach(item => {\r\n seriesData.push([item.name, item.y]);\r\n });\r\n }\r\n else if (type === 'sankey') {\r\n (serie as iSankeySeriesItem).data.forEach(item => {\r\n seriesData.push([item.from, item.to, item.weight]);\r\n });\r\n }\r\n else {// area || spline || column\r\n serie = serie as iSeriesItem;\r\n seriesData.push([serie.name, ...serie.data]);\r\n }\r\n });\r\n\r\n return seriesData;\r\n };\r\n private static getWorksheetData(seriesData: Array>, heading: Array): Array> {\r\n const chartHeading = heading.length === (seriesData[0]?.length ?? -1) ? heading : ['', ...heading];\r\n const worksheetData = [];\r\n\r\n if (heading?.length > 0) {\r\n worksheetData.push(chartHeading);\r\n }\r\n worksheetData.push(...seriesData);\r\n return worksheetData;\r\n };\r\n private static SwapDataAxis(data: Array>): Array> {\r\n const transposedData = data[0].map((_, colIndex) => data.map(row => row[colIndex]));\r\n return transposedData;\r\n };\r\n private static orderColumns(seriesData: Array>, type: string, order: SortOrder): Array> {\r\n if (type === 'sankey' || type === 'scale') {\r\n return seriesData;\r\n }\r\n\r\n const data = type === 'pie' ? this.SwapDataAxis(seriesData) : seriesData;\r\n const rows = data.map(row => row.map((col, i) => { return { key: i, val: col }; }));\r\n const map = [0, ...this.orderArray(rows[0].slice(1), order, 'val').map(kv => kv.key)];\r\n const sorted = rows.map(row => row.map((_, i) => row[map[i]].val));\r\n\r\n if (type === 'pie') {\r\n return this.SwapDataAxis(sorted);\r\n }\r\n\r\n //type === 'area' || type === 'spline' || type === 'column'\r\n return sorted;\r\n };\r\n\r\n public static OrderByDescending(arr: Array, key?: string): Array {\r\n return this.orderArray(arr, SortOrder.Descending, key);\r\n };\r\n public static OrderBy(arr: Array, key?: string): Array {\r\n return this.orderArray(arr, SortOrder.Ascending, key);\r\n };\r\n private static orderArray(arr: Array, sortOrder: SortOrder, key?: string): Array {\r\n if (key && arr.some(x => !Object.keys(x).includes(key))) {\r\n throw Error(`Not all array items have the key: '${key}'`);\r\n }\r\n const collator = new Intl.Collator(this.language, { usage: 'sort' });\r\n return arr.sort((key\r\n ? (\r\n sortOrder === SortOrder.Descending\r\n ? (a, b) => { return collator.compare(b[key], a[key]); }\r\n : (a, b) => { return collator.compare(a[key], b[key]); }\r\n )\r\n : (\r\n sortOrder === SortOrder.Descending\r\n ? (a, b) => { return collator.compare(b, a); }\r\n : (a, b) => { return collator.compare(a, b); }\r\n )));\r\n };\r\n\r\n public static GetTextReplacementsFromData(graphData: iGraphData | iCircleData, hasPrognose: boolean = false): iTextReplacements {\r\n\r\n if (graphData?.chart?.type === 'pie') {\r\n return this.getTextReplacemntsFromCircleData(graphData as iCircleData, hasPrognose);\r\n }\r\n\r\n return this.getTextReplacemntsFromGraphData(graphData as iGraphData, hasPrognose);\r\n };\r\n private static getTextReplacemntsFromCircleData(circleData: iCircleData, hasPrognose: boolean = false): iTextReplacements {\r\n\r\n let allYears = circleData?.series.map(s => s.name);\r\n let allYearsSorted = allYears.sort();\r\n return {\r\n FROM: allYearsSorted[0] ?? null,\r\n TO: allYearsSorted[allYearsSorted.length - 1] ?? null,\r\n SERIES: circleData?.series.map(s => s.name).join(this.DataSeparator) ?? null,\r\n CATEGORIES: circleData?.series.map((s) => s.data.map(d => d.name).join(this.DataSeparator)).join(this.DataSeparator) ?? null,\r\n ...this.getTextReplacementsFromText(circleData?.title?.text || \"\")\r\n } as iTextReplacements;\r\n };\r\n private static getTextReplacemntsFromGraphData(graphData: iGraphData, hasPrognose: boolean = false): iTextReplacements {\r\n\r\n let categories = [...graphData?.xAxis?.categories];\r\n let textReplacements = {\r\n SERIES: graphData?.series?.map(s => s.name).join(this.DataSeparator),\r\n CATEGORIES: categories?.join(this.DataSeparator),\r\n } as iTextReplacements;\r\n\r\n if (hasPrognose) {\r\n graphData?.xAxis?.plotBands?.filter(p => this.prognoseRegExp.test(p.label?.text ?? '')).every(pb => console.log(pb.label.text));\r\n let prognosePlotBands = graphData?.xAxis?.plotBands?.filter(p => this.prognoseRegExp.test(p.label?.text ?? ''));\r\n textReplacements.START = prognosePlotBands?.length ? categories[prognosePlotBands[0]['startIndex']] : null;\r\n textReplacements.END = prognosePlotBands?.length ? categories[prognosePlotBands[0]['endIndex']] : null;\r\n let catFiltered = [...(textReplacements.START ? categories.filter(c => c < textReplacements.START) : categories)];\r\n textReplacements.FROM = categories?.length ? catFiltered[0] : null;\r\n textReplacements.TO = categories?.length ? catFiltered.reverse()[0] : null;\r\n }\r\n textReplacements.FROM = textReplacements.FROM || (categories?.length ? categories[0] : null);\r\n textReplacements.TO = textReplacements.TO || (categories?.length ? categories[categories.length - 1] : null);\r\n\r\n return {\r\n ...textReplacements,\r\n ...this.getTextReplacementsFromText(graphData?.title?.text || \"\")\r\n } as iTextReplacements;\r\n };\r\n private static getTextReplacementsFromText(text: string): iTextReplacements {\r\n\r\n const regexp: RegExp = /^\\w+\\s\\d{4};\\w+\\s\\d{4}$/;\r\n if (!regexp.test(text)) {\r\n return {};\r\n }\r\n let texts = text.split(';');\r\n let from = texts[0];\r\n let to = texts[1];\r\n return { FROM: from, TO: to } as iTextReplacements;\r\n };\r\n\r\n public static DataDelimiter: RegExp = /\\s?\\|\\s?/;\r\n public static DataSeparator: string = '|';\r\n private static prognoseRegExp: RegExp = /([Ff]orecast)|([Pp]rognos)/;\r\n\r\n public static ReflectDataInText(text: string, data: iTextReplacements, keepDelimiters:boolean = false): string {\r\n if (!text) {\r\n return null;\r\n }\r\n if (!data || Object.keys(data).every((k) => { return !data[k]; })) {\r\n return text;\r\n }\r\n\r\n let tempData = { ...data } as iTextReplacements;\r\n let result = text;\r\n\r\n if (!keepDelimiters) {\r\n if (data?.SERIES) {\r\n let all = data.SERIES.split(this.DataDelimiter)\r\n .map(s => s.trim())\r\n .filter(s => !s.toLowerCase().includes('total'));\r\n let last = all[all.length - 1];\r\n tempData.SERIES = all.join(', ').replace(`, ${last}`, this.LocaleText(` and also ${last}`, ` samt ${last}`));\r\n }\r\n if (data?.CATEGORIES) {\r\n let all = data.CATEGORIES.split(this.DataDelimiter)\r\n .map(s => s.trim())\r\n .filter(s => !s.toLowerCase().includes('total'));;\r\n let last = all[all.length - 1];\r\n tempData.CATEGORIES = all.join(', ').replace(`, ${last}`, this.LocaleText(` and also ${last}`, ` samt ${last}`));\r\n }\r\n }\r\n\r\n Object.keys(tempData).forEach((key) => {\r\n if (!tempData[key]) { return; }\r\n result = result.replace(`[${key}]`, tempData[key]);\r\n });\r\n return result;\r\n };\r\n\r\n public static LocaleText(english: string, swedish: string): string {\r\n return this.language === 'en' ? english : swedish;\r\n };\r\n\r\n public static DisplayPrognoseArea(graphData: iGraphData) {\r\n\r\n if (!graphData.xAxis.plotBands) {\r\n return;\r\n }\r\n\r\n let prognosePlotBands = graphData?.xAxis?.plotBands?.filter(p => this.prognoseRegExp.test(p.label?.text ?? ''));\r\n for (let i = 0; i < prognosePlotBands.length; i++) {\r\n graphData.xAxis.plotBands[i]['startIndex'] = graphData.xAxis.plotBands[i].from;\r\n graphData.xAxis.plotBands[i]['endIndex'] = graphData.xAxis.plotBands[i].to;\r\n\r\n graphData.xAxis.plotBands[i].from -= 0.5;\r\n if (graphData.chart.type !== 'area') {\r\n graphData.xAxis.plotBands[i].to += 0.5;\r\n }\r\n\r\n this.addPlotBandBackground(graphData.xAxis.plotBands[i]);\r\n this.addPlotBandLine(graphData);\r\n\r\n this.setHoverEffects(graphData);\r\n }\r\n };\r\n private static addPlotBandBackground(plotBand: iPlotBand) {\r\n plotBand.color = {\r\n pattern: {\r\n path: 'M0,10 L10,0 M-1,1 L1,-1 M9,11 L11,9',\r\n width: 10,\r\n height: 10,\r\n color: '#666666',\r\n backgroundColor: '#E0E0DF',\r\n opacity: 1\r\n },\r\n };\r\n };\r\n private static addPlotBandLine(graphData: iGraphData) {\r\n graphData.chart.events = graphData.chart.events || {};\r\n graphData.chart.events.render = function () {\r\n const chart = this;\r\n const xAxis = chart.xAxis[0];\r\n const plotBand = xAxis.plotLinesAndBands[0].options;\r\n\r\n if (!plotBand) {\r\n return;\r\n }\r\n\r\n // Calculate the position for the dashed line\r\n const xPos = xAxis.toPixels(plotBand.from);\r\n const yStart = chart.plotTop - 10;\r\n const yEnd = chart.plotTop + chart.plotHeight + 10;\r\n\r\n // Draw a dashed line for the left border\r\n if (!graphData.chart['prognoseLine']) {\r\n graphData.chart['prognoseLine'] = chart.renderer.path(['M', xPos, yStart, 'L', xPos, yEnd])\r\n .attr({\r\n 'stroke-width': 2,\r\n stroke: (plotBand?.label?.style?.color ?? 'black'),\r\n dashstyle: 'Dash',\r\n zIndex: 6,\r\n class: 'prognose-line'\r\n });\r\n graphData.chart['prognoseLine'].add();\r\n }\r\n else {\r\n graphData.chart['prognoseLine'].attr({ d: ['M', xPos, yStart, 'L', xPos, yEnd] });\r\n }\r\n };\r\n };\r\n private static setHoverEffects(graphData: iGraphData) {\r\n if (graphData.chart.type !== 'area') {\r\n return;\r\n }\r\n let plotOptions = graphData.plotOptions[graphData.chart.type];\r\n plotOptions.states = plotOptions.states || {};\r\n plotOptions.states.inactive = { opacity: 1 };\r\n plotOptions.events = plotOptions.events || {};\r\n plotOptions['inactiveOtherPoints'] = false;\r\n plotOptions['stickyTracking'] = true;\r\n\r\n graphData.series.forEach((s) => {\r\n s['originalColor'] = s.color;\r\n s['brightenedColor'] = this.brighten(s.color, 0.3);\r\n });\r\n\r\n plotOptions.events.mouseOver = (e) => {\r\n e.target['chart'].series.forEach((s) => {\r\n if (s !== e.target && s.color !== s.options.brightenedColor) {\r\n s.update({ color: s.options.brightenedColor });\r\n }\r\n });\r\n };\r\n plotOptions.events.mouseOut = (e) => {\r\n e.target['chart'].series.forEach((s) => {\r\n if (s !== e.target) {\r\n s.update({ color: s.options.originalColor || s.color });\r\n }\r\n });\r\n };\r\n };\r\n\r\n private static brighten(color: string, alpha: number): string {\r\n var values = this.hexToRGB(color);\r\n for (var i = 0; i < values.length; i++) {\r\n values[i] = Math.round((alpha * values[i]) + (1 - alpha) * 255);\r\n }\r\n return this.rgbToHex(values);\r\n };\r\n private static hexToRGB(color: string): number[] {\r\n var xr = color.substring(1, 3);\r\n var xg = color.substring(3, 5);\r\n var xb = color.substring(5, 7);\r\n var r = parseInt(xr, 16);\r\n var g = parseInt(xg, 16);\r\n var b = parseInt(xb, 16);\r\n return [r, g, b];\r\n };\r\n private static rgbToHex(values: number[]): string {\r\n var hex = \"#\";\r\n for (var i = 0; i < values.length; i++) {\r\n var p1 = \"0123456789ABCDEF\".charAt((values[i] - values[i] % 16) / 16);\r\n var p2 = \"0123456789ABCDEF\".charAt(values[i] % 16);\r\n hex += (p1 + p2);\r\n }\r\n return hex;\r\n };\r\n};","import * as React from 'react';\r\n\r\ninterface iEnergipresentationAccordion {\r\n title: string;\r\n text: string;\r\n modelStyle?: string | \"\";\r\n};\r\n\r\nconst EnergipresentationAccordion = (props: iEnergipresentationAccordion) => {\r\n\r\n return (\r\n \r\n
\r\n
\r\n
+
\r\n
\r\n

{props.title}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\nexport default EnergipresentationAccordion;","import React from 'react';\r\nimport SortOrder from './SortOrderEnum';\r\nimport iSeriesItem from './ResponseModels/iSeriesItem';\r\nimport iSankeySeriesItem from './ResponseModels/iSankeySeriesItem';\r\nimport iCircleDataPost from './ResponseModels/iCircleDataPost';\r\nimport iScaleData from './ResponseModels/iScaleData';\r\nimport DisplayHelper from './DisplayHelper';\r\nimport * as XLSX from 'xlsx';\r\n\r\nconst EnergipresentationExportButton = ({ series, type, title, heading, unit, sortOrder }:\r\n { series: Array | iScaleData, type: string, title: string, heading: Array, unit: string, sortOrder?: SortOrder }) => {\r\n const exportToExcel = () => {\r\n const sheetName = DisplayHelper.LocaleText('Graph data export', 'Grafdata export');\r\n const chartTitle = title || sheetName;\r\n\r\n const sanitizedSheetName = chartTitle.substring(0, 31).replace(/[\\[\\]:*?/\\\\]/g, '');\r\n\r\n var worksheetData = DisplayHelper.ToWorksheetData(series, type, title, heading, unit, null, sortOrder);\r\n\r\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\r\n const workbook = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(workbook, worksheet, sanitizedSheetName);\r\n\r\n XLSX.writeFile(workbook, `${sanitizedSheetName || sheetName}.xlsx`);\r\n };\r\n const buttonText = ():string => {\r\n return DisplayHelper.LocaleText('Export', 'Exportera');\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default EnergipresentationExportButton;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport ElstodsFormular from './ElstodsFormular';\r\n\r\n$(document).ready(function () {\r\n if (document.getElementsByClassName('elstodsformular-block-react-container')) {\r\n let elstodsBlocks = document.getElementsByClassName('elstodsformular-block-react-container');\r\n\r\n for (let i = 0; i < elstodsBlocks.length; i++) {\r\n let currentBlock = elstodsBlocks[i];\r\n let titleConsumption = currentBlock.getAttribute(\"data-title-consumption\");\r\n let titleCost = currentBlock.getAttribute(\"data-title-cost\");\r\n let titleCalculation = currentBlock.getAttribute(\"data-title-calculation\");\r\n let buttonTitle = currentBlock.getAttribute(\"data-button-title\");\r\n let resetButtonTitle = currentBlock.getAttribute(\"data-reset-button-title\");\r\n let labelAnnualTurnover = currentBlock.getAttribute(\"data-label-annual-turnover\");\r\n let labelPeriodYear2 = currentBlock.getAttribute(\"data-label-period-year2\");\r\n let labelPeriodYear1 = currentBlock.getAttribute(\"data-label-period-year1\");\r\n let labelFullYear1 = currentBlock.getAttribute(\"data-label-full-year1\");\r\n let labelQuota = currentBlock.getAttribute(\"data-label-quota\");\r\n let labelEligibleUse = currentBlock.getAttribute(\"data-label-eligible-use\");\r\n let labelEligibleCost = currentBlock.getAttribute(\"data-label-eligible-cost\");\r\n let explanationQuota = currentBlock.getAttribute(\"data-explanation-quota\");\r\n let explanationEligibleUse = currentBlock.getAttribute(\"data-explanation-eligible-use\");\r\n let explanationEligibleCost = currentBlock.getAttribute(\"data-explanation-eligible-cost\");\r\n let suffixCurrency = currentBlock.getAttribute(\"data-suffix-currency\");\r\n let suffixElectricity = currentBlock.getAttribute(\"data-suffix-electricity\");\r\n let suffixQuota = currentBlock.getAttribute(\"data-suffix-quota\");\r\n let showAsHorizontalString = currentBlock.getAttribute(\"data-show-as-horizontal\");\r\n let showAsHorizontal = false;\r\n let preSummary = currentBlock.getAttribute(\"data-presummary\");\r\n let postSummary = currentBlock.getAttribute(\"data-postsummary\");\r\n let negativeSummary = currentBlock.getAttribute(\"data-negativesummary\");\r\n let hideQuotaString = currentBlock.getAttribute(\"data-hide-quota\");\r\n let hideEligibleCostString = currentBlock.getAttribute(\"data-hide-eligible-cost\");\r\n let hideEligibleUseString = currentBlock.getAttribute(\"data-hide-eligible-use\");\r\n\r\n let hideQuota = false;\r\n let hideEligibleCost = false;\r\n let hideEligibleUse = false;\r\n\r\n\r\n if (showAsHorizontalString !== null && showAsHorizontalString !== undefined && showAsHorizontalString.toLocaleLowerCase() === \"true\") {\r\n showAsHorizontal = true;\r\n }\r\n\r\n if (hideQuotaString !== null && hideQuotaString !== undefined && hideQuotaString.toLocaleLowerCase() === \"true\") {\r\n hideQuota = true;\r\n }\r\n\r\n if (hideEligibleCostString !== null && hideEligibleCostString !== undefined && hideEligibleCostString.toLocaleLowerCase() === \"true\") {\r\n hideEligibleCost = true;\r\n }\r\n\r\n if (hideEligibleUseString !== null && hideEligibleUseString !== undefined && hideEligibleUseString.toLocaleLowerCase() === \"true\") {\r\n hideEligibleUse = true;\r\n }\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n});","import * as React from 'react';\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport iElstodsFormularModel from './iElstodsFormular';\r\n\r\nconst initialValues: iElstodsFormularModel = {\r\n //Årsomsättning\r\n arsOmsattning: \"\",\r\n\r\n //Total elanvändning exkl. uppvärmning\r\n totAnvKWhOktDec2022: \"\",\r\n totAnvKWhOktDec2021: \"\",\r\n totAnvKWh2021: \"\",\r\n\r\n //Kostnad elanvändning exkl. uppvärmning\r\n kostAnvSEKOktDec2022: \"\",\r\n kostAnvSEK2021: \"\",\r\n\r\n //Uträkningar\r\n kvotElanvandningArsomsattning: \"0\",\r\n stodberattigandeElAnvKWh: \"0\",\r\n stodberattigandeElKost: \"0\",\r\n calculationSummary: \"\",\r\n\r\n //Visa resultat\r\n showCalculationResults: false,\r\n showResult: false,\r\n isNegativeResult: false\r\n}\r\n\r\ninterface iFormularProps {\r\n showAsHorizontal: boolean,\r\n titleConsumption: string,\r\n titleCost: string,\r\n buttonTitle: string,\r\n resetButtonTitle: string,\r\n labelAnnualTurnover: string,\r\n labelPeriodYear2: string,\r\n labelPeriodYear1: string,\r\n labelFullYear1: string,\r\n labelQuota: string,\r\n labelEligibleUse: string,\r\n labelEligibleCost: string,\r\n explanationQuota: string,\r\n explanationEligibleUse: string,\r\n explanationEligibleCost: string,\r\n suffixCurrency: string,\r\n suffixElectricity: string,\r\n suffixQuota: string,\r\n preSummary: string,\r\n postSummary: string,\r\n negativeSummary: string,\r\n titleCalculation: string,\r\n hideQuota: boolean,\r\n hideEligibleUse: boolean,\r\n hideEligibleCost: boolean\r\n\r\n}\r\n\r\nconst ElstodsFormular = (props: iFormularProps) => {\r\n const [state, setState] = useState(initialValues);\r\n\r\n useEffect(() => {\r\n }, []);\r\n\r\n const addThousandSeparators = (num) => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \" \");\r\n const removeNonNumeric = (num) => num.toString().replace(/[^0-9]/g, \"\");\r\n\r\n const setDefaultValues = () => {\r\n let newState = { ...initialValues };\r\n setState(newState);\r\n };\r\n\r\n const handleChange = (event) => {\r\n let value = event.target.value;\r\n let propertyName = event.target.name;\r\n\r\n setState({\r\n ...state,\r\n [propertyName]: addThousandSeparators(removeNonNumeric(value))\r\n });\r\n }\r\n\r\n const getText = (text) => {\r\n if (text === null || text === undefined || text === \"\") {\r\n return \"\"\r\n }\r\n\r\n return text;\r\n }\r\n\r\n const parseNumeric = (num) => {\r\n return parseInt(removeNonNumeric(num));\r\n }\r\n\r\n const calculateElkostnadsstod = () => {\r\n if (state.arsOmsattning !== null && state.arsOmsattning != \"\"\r\n && state.totAnvKWhOktDec2022 !== null && state.totAnvKWhOktDec2022 != \"\"\r\n && state.totAnvKWhOktDec2021 !== null && state.totAnvKWhOktDec2021 != \"\"\r\n && state.totAnvKWh2021 !== null && state.totAnvKWh2021 != \"\"\r\n && state.kostAnvSEKOktDec2022 !== null && state.kostAnvSEKOktDec2022 != \"\"\r\n && state.kostAnvSEK2021 !== null && state.kostAnvSEK2021 != \"\") {\r\n let newState = { ...state };\r\n let quota = parseNumeric(state.totAnvKWh2021) / parseNumeric(state.arsOmsattning);\r\n newState.kvotElanvandningArsomsattning = (quota).toFixed(3);\r\n\r\n let oktDec2021Diff = parseNumeric(state.totAnvKWhOktDec2021) * 0.7;\r\n let oktDec2022Diff = parseNumeric(state.totAnvKWhOktDec2022);\r\n newState.stodberattigandeElAnvKWh = addThousandSeparators(Math.round(oktDec2021Diff < oktDec2022Diff ? oktDec2021Diff : oktDec2022Diff).toString());\r\n\r\n let stodberattigandeElAnvKWh = parseNumeric(newState.stodberattigandeElAnvKWh);\r\n let kostAnvSEKOktDec2022 = parseNumeric(newState.kostAnvSEKOktDec2022);\r\n let totAnvKWhOktDec2022 = parseNumeric(newState.totAnvKWhOktDec2022);\r\n let kostAnvSEK2021 = parseNumeric(newState.kostAnvSEK2021);\r\n let totAnvKWh2021 = parseNumeric(newState.totAnvKWh2021);\r\n let avgElCostOktDec2022 = kostAnvSEKOktDec2022 / totAnvKWhOktDec2022;\r\n let avgElCost2021 = kostAnvSEK2021 / totAnvKWh2021;\r\n\r\n const minstastodberattigandeElAnv = 50000;\r\n const minQuota = 0.015;\r\n\r\n let utrakning = stodberattigandeElAnvKWh * (avgElCostOktDec2022 - (avgElCost2021 * 1.5)) * 0.5;\r\n utrakning = Math.round(utrakning);\r\n let utrakningString = utrakning < 0 ? \"0\" : utrakning.toString()\r\n newState.stodberattigandeElKost = addThousandSeparators(utrakningString);\r\n newState.calculationSummary = addThousandSeparators(parseNumeric(utrakningString));\r\n newState.showCalculationResults = true;\r\n newState.isNegativeResult = (utrakning < minstastodberattigandeElAnv) || (quota < minQuota);\r\n\r\n setState(newState);\r\n }\r\n }\r\n\r\n const clearAll = () => {\r\n setState(initialValues);\r\n }\r\n\r\n const toggleResult = () => {\r\n let newState = { ...state };\r\n newState.showResult = !newState.showResult;\r\n setState(newState);\r\n }\r\n\r\n return (\r\n \r\n {props.showAsHorizontal && (\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixCurrency)}\r\n
\r\n
\r\n\r\n
\r\n

{getText(props.titleConsumption)}

\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixElectricity)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixElectricity)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixElectricity)}\r\n
\r\n
\r\n\r\n
\r\n

{getText(props.titleCost)}

\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixCurrency)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixCurrency)}\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n {!state.showCalculationResults && (\r\n
\r\n
\r\n )}\r\n {state.showCalculationResults && (\r\n
\r\n
\r\n {(state.showCalculationResults && !state.isNegativeResult) && (\r\n
\r\n
\r\n
{getText(props.preSummary)} {state.calculationSummary} {getText(props.postSummary)}
\r\n
\r\n )}\r\n {(state.showCalculationResults && state.isNegativeResult) && (\r\n
\r\n
\r\n
{getText(props.negativeSummary)}
\r\n
\r\n )}\r\n
\r\n
\r\n

{getText(props.titleCalculation)}

\r\n
\r\n
\r\n {!props.hideQuota && (\r\n \r\n
\r\n \r\n
\r\n
\r\n {state.kvotElanvandningArsomsattning}{getText(props.suffixQuota)}\r\n
\r\n
\r\n )}\r\n\r\n {!props.hideEligibleUse && (\r\n \r\n
\r\n \r\n
\r\n
\r\n {state.stodberattigandeElAnvKWh}{getText(props.suffixElectricity)}\r\n
\r\n
\r\n )}\r\n\r\n {!props.hideEligibleCost && (\r\n \r\n
\r\n \r\n
\r\n
\r\n {state.stodberattigandeElKost}{getText(props.suffixCurrency)}\r\n
\r\n
\r\n )}\r\n
\r\n
\r\n )}\r\n\r\n\r\n\r\n
\r\n\r\n )}\r\n {\r\n !props.showAsHorizontal && (\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixCurrency)}\r\n
\r\n
\r\n\r\n
\r\n

{getText(props.titleConsumption)}

\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixElectricity)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixElectricity)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixElectricity)}\r\n
\r\n
\r\n\r\n
\r\n

{getText(props.titleCost)}

\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixCurrency)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {getText(props.suffixCurrency)}\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n {(state.showCalculationResults && !state.isNegativeResult) && (\r\n
\r\n
\r\n
{getText(props.preSummary)} {state.calculationSummary} {getText(props.postSummary)}
\r\n
\r\n )}\r\n {(state.showCalculationResults && state.isNegativeResult) && (\r\n
\r\n
\r\n
{getText(props.negativeSummary)}
\r\n
\r\n )}\r\n
\r\n\r\n
\r\n

{getText(props.titleCalculation)}

\r\n
\r\n
\r\n\r\n {!props.hideQuota && (\r\n \r\n
\r\n \r\n
\r\n
\r\n {state.kvotElanvandningArsomsattning}{getText(props.suffixQuota)}\r\n
\r\n
\r\n )}\r\n\r\n {!props.hideEligibleUse && (\r\n \r\n
\r\n \r\n
\r\n
\r\n {state.stodberattigandeElAnvKWh}{getText(props.suffixElectricity)}\r\n
\r\n
\r\n )}\r\n\r\n {!props.hideEligibleCost && (\r\n \r\n
\r\n \r\n
\r\n
\r\n {state.stodberattigandeElKost}{getText(props.suffixCurrency)}\r\n
\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n )\r\n }\r\n\r\n\r\n\r\n\r\n
\r\n );\r\n};\r\nexport default ElstodsFormular;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport KalkylUrsprungsgarantier from './KalkylUrsprungsgarantier';\r\n\r\n$(document).ready(function () {\r\n if (document.getElementsByClassName('kalkyl-ursprungsgarantier-block-react-container')) {\r\n let kalkylUrsprungsgatantier = document.getElementsByClassName('kalkyl-ursprungsgarantier-block-react-container');\r\n\r\n for (let i = 0; i < kalkylUrsprungsgatantier.length; i++) {\r\n let currentBlock = kalkylUrsprungsgatantier[i];\r\n let chooseAnswerType = currentBlock.getAttribute(\"data-choose-answer-type\");\r\n let buttonCalculate = currentBlock.getAttribute(\"data-button-calculate\");\r\n let buttonReset = currentBlock.getAttribute(\"data-button-reset\");\r\n let resultText = currentBlock.getAttribute(\"data-result-text\");\r\n let resultUnit = currentBlock.getAttribute(\"data-result-unit\");\r\n let electricityProduction = currentBlock.getAttribute(\"data-electricity-production\");\r\n let estimatedAnnualProduction = currentBlock.getAttribute(\"data-estimated-annual-production\");\r\n let estimatedAnnualProductionHelpText = currentBlock.getAttribute(\"data-estimated-annual-production-helptext\");\r\n let estimatedAnnualProductionUnit = currentBlock.getAttribute(\"data-estimated-annual-production-unit\");\r\n let estimatedAnnualProductionDefaultValueString = currentBlock.getAttribute(\"data-estimated-annual-production-default-value\");\r\n let installedEffect = currentBlock.getAttribute(\"data-installed-effect\");\r\n let installedEffectHelpText = currentBlock.getAttribute(\"data-installed-effect-helptext\");\r\n let installedEffectUnit = currentBlock.getAttribute(\"data-installed-effect-unit\");\r\n let installedEffectDefaultValueString = currentBlock.getAttribute(\"data-installed-effect-default-value\");\r\n let compensation = currentBlock.getAttribute(\"data-compensation\");\r\n let compensationHelpText = currentBlock.getAttribute(\"data-compensation-helptext\");\r\n let addedCompensation = currentBlock.getAttribute(\"data-added-compensation\");\r\n let addedCompensationUnit = currentBlock.getAttribute(\"data-added-compensation-unit\");\r\n let addedCompensationDefaultValueString = currentBlock.getAttribute(\"data-added-compensation-default-value\");\r\n let compensationUG = currentBlock.getAttribute(\"data-compensation-ug\");\r\n let compensationUGUnit = currentBlock.getAttribute(\"data-compensation-ug-unit\");\r\n let compensationUGDefaultValueString = currentBlock.getAttribute(\"data-compensation-ug-default-value\");\r\n let annualFee = currentBlock.getAttribute(\"data-annual-fee\");\r\n let annualFeeDescription = currentBlock.getAttribute(\"data-annual-fee-description\");\r\n let annualFeeUnit = currentBlock.getAttribute(\"data-annual-fee-unit\");\r\n let annualFeeDefaultValueString = currentBlock.getAttribute(\"data-annual-fee-default-value\");\r\n let percentageSolar = currentBlock.getAttribute(\"data-percentage-solar\");\r\n let ownUsage = currentBlock.getAttribute(\"data-own-usage\");\r\n let ownUsageUnit = currentBlock.getAttribute(\"data-own-usage-unit\");\r\n let ownUsageHelpText = currentBlock.getAttribute(\"data-own-usage-helptext\");\r\n let ownUsageDefaultValueString = currentBlock.getAttribute(\"data-own-usage-default-value\");\r\n\r\n let addedCompensationDefaultValue = parseInt(addedCompensationDefaultValueString);\r\n\r\n if (isNaN(addedCompensationDefaultValue)) {\r\n addedCompensationDefaultValue = 0;\r\n }\r\n\r\n let annualFeeDefaultValue = parseInt(annualFeeDefaultValueString);\r\n\r\n if (isNaN(annualFeeDefaultValue)) {\r\n annualFeeDefaultValue = 0;\r\n }\r\n\r\n let compensationUGDefaultValue = parseInt(compensationUGDefaultValueString);\r\n\r\n if (isNaN(compensationUGDefaultValue)) {\r\n compensationUGDefaultValue = 0;\r\n }\r\n\r\n let estimatedAnnualProductionDefaultValue = parseInt(estimatedAnnualProductionDefaultValueString);\r\n\r\n if (isNaN(estimatedAnnualProductionDefaultValue)) {\r\n estimatedAnnualProductionDefaultValue = 0;\r\n }\r\n\r\n let installedEffectDefaultValue = parseInt(installedEffectDefaultValueString);\r\n\r\n if (isNaN(installedEffectDefaultValue)) {\r\n installedEffectDefaultValue = 0;\r\n }\r\n\r\n let ownUsageDefaultValue = parseInt(ownUsageDefaultValueString);\r\n\r\n if (isNaN(ownUsageDefaultValue)) {\r\n ownUsageDefaultValue = 0;\r\n }\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n});\r\n\r\nfunction decodeHtmlEntities(encodedString: string): string {\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(`
${encodedString}
`, 'text/html');\r\n return dom.body.textContent || \"\";\r\n}","import * as React from 'react';\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport iKalkylUrsprungsgarantier from './iKalkylUrsprungsgarantier';\r\nimport iKalkylUrsprungsgarantierProps from './iKalkylUrsprungsgarantierProps';\r\nimport HelpText from './HelpText';\r\n\r\nconst KalkylUrsprungsgarantier = (props: iKalkylUrsprungsgarantierProps) => {\r\n let initialValues: iKalkylUrsprungsgarantier = {\r\n props: props,\r\n showResult: false,\r\n isCleared: true,\r\n isCalculated: false,\r\n isValid: false,\r\n annualFee: props.annualFeeDefaultValue,\r\n estimatedAnnualProductionMin: 1,\r\n estimatedAnnualProductionMax: 999,\r\n estimatedAnnualProductionIsValid: false,\r\n estimatedAnnualProductionIsFocused: false,\r\n installedEffectMin: 1,\r\n installedEffectMax: 999,\r\n installedEffectIsValid: false,\r\n installedEffectIsFocused: false,\r\n addedCompensationMin: 0,\r\n addedCompensationMax: 25,\r\n addedCompensationIsValid: false,\r\n addedCompensationIsFocused: false,\r\n compensationUGMin: 0,\r\n compensationUGMax: 250,\r\n compensationUGIsValid: false,\r\n compensationUGIsFocused: false,\r\n percentageSolarMin: 0,\r\n percentageSolarMax: 100,\r\n percentageSolarIsValid: false,\r\n percentageSolarIsFocused: false\r\n };\r\n\r\n const inputRefs: { [key: string]: React.RefObject } = {\r\n estimatedAnnualProductionTextbox: useRef(null),\r\n installedEffectTextbox: useRef(null),\r\n addedCompensationTextbox: useRef(null),\r\n compensationUGTextbox: useRef(null),\r\n percentageSolarTextbox: useRef(null)\r\n }\r\n\r\n const [state, setState] = useState(initialValues);\r\n const [focusedTextbox, setFocusedTextbox] = useState(null);\r\n\r\n useEffect(() => {\r\n }, []);\r\n\r\n const addThousandSeparators = (num: number): string => {\r\n const parts = num.toFixed(2).toString().split('.');\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n\r\n return parts.join(',');\r\n };\r\n\r\n const handleChange = (event) => {\r\n let valueString = event.target.value;\r\n let value = parseInt(valueString);\r\n let propertyName = event.target.name;\r\n\r\n if (isNaN(value)) {\r\n setState({\r\n ...state,\r\n [propertyName + \"IsValid\"]: false,\r\n [propertyName]: valueString,\r\n isCleared: false,\r\n isCalculated: false\r\n });\r\n\r\n return;\r\n }\r\n\r\n let isValid = validateField(propertyName, value);\r\n\r\n setState({\r\n ...state,\r\n [propertyName + \"IsValid\"]: isValid,\r\n [propertyName]: value,\r\n isCleared: false,\r\n isCalculated: false,\r\n resultValue: undefined\r\n });\r\n\r\n }\r\n\r\n const getText = (text) => {\r\n if (text === null || text === undefined || text === \"\") {\r\n return \"\"\r\n }\r\n\r\n return text;\r\n }\r\n\r\n const calculateUG = () => {\r\n if (!allIsFilled() || !validateAll()) {\r\n let newState = { ...state };\r\n newState.showResult = true;\r\n newState.resultValue = undefined;\r\n setState(newState);\r\n return;\r\n }\r\n\r\n let question1 = state.isQuestion1Alternative1 ? state.estimatedAnnualProduction : state.installedEffect * 0.9;\r\n let question2 = state.isQuestion2Alternative1 ? state.addedCompensation * 10 : state.compensationUG;\r\n\r\n let result = ((100 - state.percentageSolar) / 100) * question1 * question2 - state.annualFee;\r\n\r\n let newState = { ...state };\r\n newState.resultValue = result;\r\n newState.showResult = true;\r\n newState.isCalculated = true;\r\n setState(newState);\r\n }\r\n\r\n const allIsFilled = () => {\r\n if (state.isQuestion1Alternative1 === undefined || state.isQuestion1Alternative1 === null) {\r\n return false;\r\n }\r\n\r\n if (state.isQuestion1Alternative1 && (!state.estimatedAnnualProduction || state.estimatedAnnualProduction === undefined || state.estimatedAnnualProduction === null || isNaN(state.estimatedAnnualProduction))) {\r\n return false;\r\n }\r\n\r\n if (!state.isQuestion1Alternative1 && (!state.installedEffect || state.installedEffect === undefined || state.installedEffect === null || isNaN(state.installedEffect))) {\r\n return false;\r\n }\r\n\r\n if (state.isQuestion2Alternative1 === undefined || state.isQuestion2Alternative1 === null) {\r\n return false;\r\n }\r\n if (state.isQuestion2Alternative1 && (!state.addedCompensation || state.addedCompensation === undefined || state.addedCompensation === null || isNaN(state.addedCompensation))) {\r\n return false;\r\n }\r\n\r\n if (!state.isQuestion2Alternative1 && (!state.compensationUG || state.compensationUG === undefined || state.compensationUG === null || isNaN(state.compensationUG))) {\r\n return false;\r\n }\r\n\r\n if (state.annualFee === undefined || state.annualFee === null) {\r\n return false;\r\n }\r\n\r\n if ((!state.percentageSolar && state.percentageSolar !== 0) || state.percentageSolar === undefined || state.percentageSolar === null) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const validateField = (fieldName: string, value: number) => {\r\n let minValue: number = state[fieldName + \"Min\"];\r\n let maxValue: number = state[fieldName + \"Max\"];\r\n let isValid = value >= minValue && value <= maxValue;\r\n\r\n return isValid;\r\n }\r\n\r\n const validateSingleField = (fieldName: string, doValidate: boolean = true, value: number = -1) => {\r\n if (!doValidate) {\r\n return true;\r\n }\r\n\r\n let minValue: number = state[fieldName + \"Min\"];\r\n let maxValue: number = state[fieldName + \"Max\"];\r\n let currentValue: number = state[fieldName];\r\n let isValid = currentValue >= minValue && currentValue <= maxValue;\r\n\r\n return isValid;\r\n }\r\n\r\n const validateAll = () => {\r\n let isValid = true;\r\n\r\n if (state.isQuestion1Alternative1 === true && !validateSingleField(\"estimatedAnnualProduction\", true)) {\r\n isValid = false;\r\n }\r\n\r\n if (state.isQuestion1Alternative1 === false && !validateSingleField(\"installedEffect\", true)) {\r\n isValid = false;\r\n }\r\n\r\n if (state.isQuestion2Alternative1 === true && !validateSingleField(\"addedCompensation\", true)) {\r\n isValid = false;\r\n }\r\n\r\n if (state.isQuestion2Alternative1 === false && !validateSingleField(\"compensationUG\", true)) {\r\n isValid = false;\r\n }\r\n\r\n if (!validateSingleField(\"percentageSolar\", true)) {\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n const clearAll = () => {\r\n setState(initialValues);\r\n }\r\n\r\n const handleQuestionChange = (event: React.ChangeEvent) => {\r\n let newState = { ...state };\r\n\r\n if (event.target.name === \"electricityProduction\") {\r\n if (event.target.value === \"1\") {\r\n newState.isQuestion1Alternative1 = true;\r\n } else if (event.target.value === \"2\") {\r\n newState.isQuestion1Alternative1 = false;\r\n }\r\n }\r\n else if (event.target.name === \"compensation\") {\r\n if (event.target.value === \"1\") {\r\n newState.isQuestion2Alternative1 = true;\r\n } else if (event.target.value === \"2\") {\r\n newState.isQuestion2Alternative1 = false;\r\n }\r\n }\r\n\r\n newState.isCalculated = false;\r\n newState.resultValue = undefined;\r\n newState.isCleared = false;\r\n setState(newState);\r\n }\r\n\r\n const getOptionsClasses = (compareTo: boolean, inputValue?: boolean) => {\r\n let classes = \"row options-container\";\r\n\r\n if (inputValue === null || inputValue === undefined) {\r\n classes += \" no-choice-made\";\r\n }\r\n\r\n if (compareTo === inputValue) {\r\n classes += \" is-disabled\"\r\n }\r\n\r\n return classes;\r\n }\r\n\r\n const getResultClasses = () => {\r\n let classes = \"result-value\";\r\n\r\n if (state.resultValue === undefined || state.resultValue === null) {\r\n return classes;\r\n }\r\n\r\n if (state.resultValue > 0) {\r\n classes += \" positive\";\r\n } else if (state.resultValue < 0) {\r\n classes += \" negative\";\r\n } else {\r\n classes += \" zero\";\r\n }\r\n\r\n return classes;\r\n }\r\n\r\n const getValue = () => {\r\n if (state.resultValue === undefined || state.resultValue === null) {\r\n return \"-\";\r\n }\r\n\r\n if (state.resultValue > 0) {\r\n return \"+\" + addThousandSeparators(state.resultValue);\r\n }\r\n\r\n return addThousandSeparators(state.resultValue);\r\n }\r\n\r\n const handleFocus = (event: React.FocusEvent) => {\r\n event.target.select();\r\n let fieldName = event.target.name;\r\n let newState = { ...state };\r\n newState[fieldName + \"IsFocused\"] = true;\r\n setState(newState);\r\n setFocusedTextbox(fieldName);\r\n }\r\n\r\n const handleBlur = (event: React.ChangeEvent) => {\r\n let fieldName = event.target.name;\r\n let newState = { ...state };\r\n newState[fieldName + \"IsFocused\"] = false;\r\n setState(newState);\r\n setFocusedTextbox(null);\r\n }\r\n\r\n const getInputContainerClasses = (isValid: boolean, isFocused: boolean) => {\r\n let classes = \"textbox-with-suffix-container\";\r\n\r\n if (!isValid && state.showResult) {\r\n classes += \" not-valid\";\r\n }\r\n\r\n if (isFocused) {\r\n classes += \" is-focused\";\r\n }\r\n\r\n return classes;\r\n }\r\n const handleContainerClick = (textboxName: string) => {\r\n if (textboxName && textboxName !== focusedTextbox && inputRefs[textboxName + \"Textbox\"].current) {\r\n inputRefs[textboxName + \"Textbox\"].current.focus();\r\n inputRefs[textboxName + \"Textbox\"].current.select();\r\n setFocusedTextbox(textboxName);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {/*Produktion*/}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{getText(state.props.electricityProduction)}

\r\n
\r\n
\r\n
\r\n
\r\n {getText(state.props.chooseAnswerType)}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
handleContainerClick(\"estimatedAnnualProduction\")} className={getInputContainerClasses(!(state.isQuestion1Alternative1 === true && !state.estimatedAnnualProductionIsValid), state.estimatedAnnualProductionIsFocused)} >\r\n {getText(state.props.estimatedAnnualProductionUnit)}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
handleContainerClick(\"installedEffect\")} className={getInputContainerClasses(!(state.isQuestion1Alternative1 === false && !state.installedEffectIsValid), state.installedEffectIsFocused)}>\r\n {getText(state.props.installedEffectUnit)}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n {/*Egenanvändning/Solel*/}\r\n
\r\n
\r\n
\r\n
\r\n

{getText(state.props.percentageSolar)}

\r\n
\r\n
\r\n
\r\n
\r\n {getText(state.props.ownUsage)}\r\n \r\n
\r\n
\r\n
handleContainerClick(\"percentageSolar\")} className={getInputContainerClasses(!(((!state.percentageSolar && state.percentageSolar !== 0) || state.percentageSolar === undefined) || !state.percentageSolarIsValid), state.percentageSolarIsFocused)}>\r\n {getText(state.props.ownUsageUnit)}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n {/*Ersättning*/}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

\r\n \r\n {getText(state.props.compensation)}\r\n \r\n \r\n

\r\n
\r\n
\r\n
\r\n
\r\n {getText(state.props.chooseAnswerType)}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
handleContainerClick(\"addedCompensation\")} className={getInputContainerClasses(!(state.isQuestion2Alternative1 === true && !state.addedCompensationIsValid), state.addedCompensationIsFocused)}>\r\n {getText(state.props.addedCompensationUnit)}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
handleContainerClick(\"compensationUG\")} className={getInputContainerClasses(!(state.isQuestion2Alternative1 === false && !state.compensationUGIsValid), state.compensationUGIsFocused)}>\r\n {getText(state.props.compensationUGUnit)}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n {/*Årsavgift/Fast avgift*/}\r\n
\r\n
\r\n
\r\n
\r\n

{getText(state.props.annualFee)}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {getText(state.props.annualFeeUnit)}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n {state.props.resultText}\r\n
\r\n
\r\n {getValue()} \r\n {state.props.resultUnit}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\nexport default KalkylUrsprungsgarantier;\r\n","import * as React from 'react';\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport iHelpText from './iHelpText';\r\n\r\nconst HelpText = (props: { helpText: string }) => {\r\n const helpTextRef = useRef(null);\r\n const helpIconRef = useRef(null);\r\n const wrapperRef = useRef(null);\r\n\r\n const initialValues: iHelpText = {\r\n helpText: props.helpText,\r\n showHelpText: false\r\n }\r\n const [state, setState] = useState(initialValues);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n state.showHelpText &&\r\n wrapperRef.current &&\r\n !wrapperRef.current.contains(event.target as Node)\r\n ) {\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n showHelpText: false,\r\n }));\r\n }\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if ((event.key === \"Enter\" || event.key === \" \") && document.activeElement === wrapperRef.current) {\r\n event.preventDefault();\r\n toggleHelpText();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n document.addEventListener(\"click\", handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener(\"click\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleKeyDown);\r\n };\r\n }, [state.showHelpText]);\r\n\r\n useEffect(() => {\r\n if (helpIconRef.current) {\r\n let iconRect = helpIconRef.current.getBoundingClientRect();\r\n let leftPosition = iconRect.left;\r\n\r\n let newState = { ...state };\r\n newState.left = leftPosition - 30;\r\n setState(newState);\r\n }\r\n }, [])\r\n\r\n const toggleHelpText = () => {\r\n let newState = { ...state };\r\n newState.showHelpText = !newState.showHelpText;\r\n setState(newState);\r\n }\r\n\r\n const getTextFromHtmlString = (htmlString: string): string => {\r\n const doc = new DOMParser().parseFromString(htmlString, \"text/html\");\r\n return doc.body.textContent || \"\";\r\n }\r\n\r\n return (\r\n \r\n \"Hjälpikon\"\r\n {state.showHelpText && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default HelpText;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\nimport EnergipresentationBubbles from './EnergipresentationBubbles';\r\nimport EnergipresentationDoubleBubbles from './EnergipresentationDoubleBubbles';\r\nimport EnergipresentationFilter from './EnergipresentationFilter';\r\nimport EnergipresentationGraph from './EnergipresentationGraph';\r\nimport EnergipresentationDoubleGraph from './EnergipresentationDoubleGraph';\r\nimport EnergipresentationCircle from './EnergipresentationCircle';\r\nimport EnergipresentationSankey from './EnergipresentationSankey';\r\nimport EnergipresentationScales from './EnergipresentationScales';\r\nimport SortOrder from \"./SortOrderEnum\";\r\n\r\n$(document).ready(function () {\r\n\r\n const asIntOrDefault = (value: string, defaultValue?: number | undefined | null): number => {\r\n let val = parseInt(value);\r\n\r\n if (isNaN(val)) {\r\n val = defaultValue ?? (defaultValue === undefined ? 0 : null);\r\n }\r\n return val;\r\n };\r\n\r\n const getAccordionFields = (currentBlock: Element):\r\n { Title: string, Text: string, ColumnHeaders: string, InvertTableAxis: boolean, ColumnSortOrder: SortOrder, ModelStyle: string } => {\r\n\r\n let helpTitle = currentBlock.getAttribute(\"data-help-title\");\r\n let helpText = currentBlock.getAttribute(\"data-help-text\");\r\n let columnHeaders = currentBlock.getAttribute(\"data-column-headers\");\r\n let invertTableAxis = currentBlock.getAttribute(\"data-table-invert-axis\")?.toLowerCase() === \"true\";\r\n let columnSortOrder = asIntOrDefault(currentBlock.getAttribute(\"data-table-column-order\"));\r\n let helpModelStyle = currentBlock.getAttribute(\"data-help-model-style\");\r\n\r\n return {\r\n Title: helpTitle,\r\n Text: helpText,\r\n ColumnHeaders: columnHeaders,\r\n InvertTableAxis: invertTableAxis,\r\n ColumnSortOrder: columnSortOrder ? columnSortOrder : null,\r\n ModelStyle: helpModelStyle\r\n };\r\n };\r\n const getRequestFields = (currentBlock: Element, fieldSuffix?: string, catVariableDefault?: number, divideBy?: number):\r\n { ApiUrl: string, RequestBody: string, XAxisVariableIndex: number, CategoryVariableIndex: number, DivideValueBy: number } => {\r\n fieldSuffix = fieldSuffix ?? \"\";\r\n let apiUrl = currentBlock.getAttribute(\"data-api-url\" + fieldSuffix);\r\n let requestBody = currentBlock.getAttribute(\"data-request-body\" + fieldSuffix);\r\n let xAxisVariableIndexString = currentBlock.getAttribute(\"data-x-axis-variable-index\" + fieldSuffix);\r\n let categoryVariableIndexString = currentBlock.getAttribute(\"data-category-variable-index\" + fieldSuffix);\r\n let divideValueByString = currentBlock.getAttribute(\"data-divide-value-by\" + fieldSuffix);\r\n\r\n return {\r\n ApiUrl: apiUrl,\r\n RequestBody: requestBody,\r\n XAxisVariableIndex: asIntOrDefault(xAxisVariableIndexString),\r\n CategoryVariableIndex: asIntOrDefault(categoryVariableIndexString, catVariableDefault),\r\n DivideValueBy: asIntOrDefault(divideValueByString, divideBy ?? 1),\r\n };\r\n };\r\n const getPrognoseFields = (currentBlock: Element):\r\n { ApiUrl: string, RequestBody: string, XAxisVariableIndex: number, CategoryVariableIndex: number, DivideValueBy: number, Text: string } => {\r\n\r\n let prognoseApiUrl = currentBlock.getAttribute(\"data-prognose-api-url\");\r\n let prognoseRequestBody = currentBlock.getAttribute(\"data-prognose-request-body\");\r\n let prognoseXAxisVariableIndexString = currentBlock.getAttribute(\"data-prognose-x-axis-variable-index\");\r\n let prognoseCategoryVariableIndexString = currentBlock.getAttribute(\"data-prognose-category-variable-index\");\r\n let prognoseDivideValueByString = currentBlock.getAttribute(\"data-prognose-divide-value-by\");\r\n\r\n let prognoseText = currentBlock.getAttribute(\"data-prognose-text\");\r\n\r\n return {\r\n ApiUrl: prognoseApiUrl,\r\n RequestBody: prognoseRequestBody,\r\n XAxisVariableIndex: asIntOrDefault(prognoseXAxisVariableIndexString),\r\n CategoryVariableIndex: asIntOrDefault(prognoseCategoryVariableIndexString),\r\n DivideValueBy: asIntOrDefault(prognoseDivideValueByString, 1),\r\n Text: prognoseText\r\n };\r\n };\r\n const getBaseFields = (currentBlock: Element):\r\n { Type: number, HeadTitle: string, NumberOfDecimals: number, BlockId: string, LastPublished: string } => {\r\n\r\n let typeString = currentBlock.getAttribute(\"data-graph-type\");\r\n let headTitle = currentBlock.getAttribute(\"data-head-title\");\r\n let numberOfDecimals = currentBlock.getAttribute(\"data-no-decimals\");\r\n let blockId = currentBlock.getAttribute(\"data-block-id\");\r\n let lastPublished = currentBlock.getAttribute(\"data-last-published\");\r\n\r\n return {\r\n Type: asIntOrDefault(typeString),\r\n HeadTitle: headTitle,\r\n NumberOfDecimals: asIntOrDefault(numberOfDecimals, null),\r\n BlockId: blockId,\r\n LastPublished: lastPublished\r\n };\r\n };\r\n\r\n if (document.getElementsByClassName('energipresentation-bubbles-block-react-container').length) {\r\n let energipresentationBubbles = document.getElementsByClassName('energipresentation-bubbles-block-react-container');\r\n\r\n for (let i = 0; i < energipresentationBubbles.length; i++) {\r\n let currentBlock = energipresentationBubbles[i];\r\n\r\n let valuePrefix = currentBlock.getAttribute(\"data-value-prefix\");\r\n let valueSuffix = currentBlock.getAttribute(\"data-value-suffix\");\r\n\r\n let base = getBaseFields(currentBlock);\r\n let request = getRequestFields(currentBlock);\r\n let prognose = getPrognoseFields(currentBlock);\r\n\r\n let useCommonFilter = currentBlock.getAttribute(\"data-use-common-filter\").toLowerCase() === \"true\";\r\n\r\n ReactDOM.render(\r\n\r\n , currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName('energipresentation-double-bubbles-block-react-container').length) {\r\n let energipresentationDoubleBubbles = document.getElementsByClassName('energipresentation-double-bubbles-block-react-container');\r\n\r\n for (let i = 0; i < energipresentationDoubleBubbles.length; i++) {\r\n let currentBlock = energipresentationDoubleBubbles[i];\r\n\r\n let valuePrefix = currentBlock.getAttribute(\"data-value-prefix\");\r\n let valueSuffix = currentBlock.getAttribute(\"data-value-suffix\");\r\n\r\n let doCalculateQuotaString = currentBlock.getAttribute(\"data-do-calculate-quota\");\r\n let doCalculateQuota = doCalculateQuotaString.toLowerCase() === \"true\";\r\n\r\n let base = getBaseFields(currentBlock);\r\n let request1 = getRequestFields(currentBlock, \"-1\");\r\n let request2 = getRequestFields(currentBlock, \"-2\");\r\n let prognose = getPrognoseFields(currentBlock);\r\n\r\n let useCommonFilter = currentBlock.getAttribute(\"data-use-common-filter\").toLowerCase() === \"true\";\r\n\r\n ReactDOM.render(\r\n , currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName('energipresentation-graph-block-react-container').length) {\r\n let energipresentationGraph = document.getElementsByClassName('energipresentation-graph-block-react-container');\r\n\r\n for (let i = 0; i < energipresentationGraph.length; i++) {\r\n let currentBlock = energipresentationGraph[i];\r\n\r\n let yAxisName = currentBlock.getAttribute(\"data-y-axis-name\");\r\n let xAxisShowNthString = currentBlock.getAttribute(\"data-x-axis-show-nth\");\r\n let specialTypeString = currentBlock.getAttribute(\"data-special-type\");\r\n\r\n let base = getBaseFields(currentBlock);\r\n let request = getRequestFields(currentBlock);\r\n let prognose = getPrognoseFields(currentBlock);\r\n let help = getAccordionFields(currentBlock);\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName('energipresentation-double-graph-block-react-container').length) {\r\n let energipresentationGraph = document.getElementsByClassName('energipresentation-double-graph-block-react-container');\r\n\r\n for (let i = 0; i < energipresentationGraph.length; i++) {\r\n let currentBlock = energipresentationGraph[i];\r\n\r\n let yAxisName = currentBlock.getAttribute(\"data-y-axis-name\");\r\n\r\n let xAxisShowNthString = currentBlock.getAttribute(\"data-x-axis-show-nth\");\r\n let doCalculateQuotaString = currentBlock.getAttribute(\"data-do-calculate-quota\");\r\n let doCalculateQuota = doCalculateQuotaString.toLowerCase() === \"true\";\r\n let specialTypeString = currentBlock.getAttribute(\"data-special-type\");\r\n let specialType = asIntOrDefault(specialTypeString);\r\n\r\n let base = getBaseFields(currentBlock);\r\n let request1 = getRequestFields(currentBlock, \"-one\");\r\n let request2 = getRequestFields(currentBlock, \"-two\");\r\n let prognose = getPrognoseFields(currentBlock);\r\n let help = getAccordionFields(currentBlock);\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName(\"energipresentation-scales-block-react-container\").length) {\r\n let energipresentationScales = document.getElementsByClassName(\"energipresentation-scales-block-react-container\");\r\n\r\n for (let i = 0; i < energipresentationScales.length; i++) {\r\n let currentBlock = energipresentationScales[i];\r\n\r\n let resultTextSourceB = currentBlock.getAttribute(\"data-result-text-source-b\");\r\n let resultTextSourceC = currentBlock.getAttribute(\"data-result-text-source-c\");\r\n let descriptionDifference = currentBlock.getAttribute(\"data-description-difference\");\r\n let titleLeftSide = currentBlock.getAttribute(\"data-title-left-side\");\r\n let titleRightSide = currentBlock.getAttribute(\"data-title-right-side\");\r\n\r\n let base = getBaseFields(currentBlock);\r\n let requestA = getRequestFields(currentBlock, \"-source-a\", 1, 1000);\r\n let requestB = getRequestFields(currentBlock, \"-source-b\", 1, 1000);\r\n let requestC = getRequestFields(currentBlock, \"-source-c\", 1, 1000);\r\n let help = getAccordionFields(currentBlock);\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName('energipresentation-circle-block-react-container').length) {\r\n let energipresentationCircle = document.getElementsByClassName('energipresentation-circle-block-react-container');\r\n\r\n for (let i = 0; i < energipresentationCircle.length; i++) {\r\n let currentBlock = energipresentationCircle[i];\r\n\r\n let xAxisVariableIndex = 0;\r\n let categoryVariableIndex = 0;\r\n\r\n let yAxisName = \"yAxisName\";\r\n let xAxisShowNth = 1;\r\n\r\n let base = getBaseFields(currentBlock);\r\n let request = getRequestFields(currentBlock);\r\n let help = getAccordionFields(currentBlock);\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName('energipresentation-sankey-block-react-container').length) {\r\n let energipresentationSankey = document.getElementsByClassName('energipresentation-sankey-block-react-container');\r\n\r\n for (let i = 0; i < energipresentationSankey.length; i++) {\r\n let currentBlock = energipresentationSankey[i];\r\n\r\n let valueSuffix = currentBlock.getAttribute(\"data-value-suffix\");\r\n var contentId = currentBlock.getAttribute(\"aria-labelledby\").split(\"_\")[1];\r\n\r\n let base = getBaseFields(currentBlock);\r\n let help = getAccordionFields(currentBlock);\r\n\r\n ReactDOM.render(, currentBlock);\r\n }\r\n }\r\n\r\n if (document.getElementsByClassName('energipresentation-filter-block-react-container').length) {\r\n let energipresentationFilter = document.getElementsByClassName('energipresentation-filter-block-react-container');\r\n let bubblesBlocks = document.getElementsByClassName(\"energipresentation-bubbles-block-react-container\");\r\n let toUseCommon = 0;\r\n for (let i = 0; i < bubblesBlocks.length; i++) {\r\n if (bubblesBlocks[i].getAttribute(\"data-use-common-filter\").toLowerCase() == \"true\") {\r\n toUseCommon++;\r\n }\r\n }\r\n let doubleBubblesBlocks = document.getElementsByClassName(\"energipresentation-double-bubbles-block-react-container\");\r\n for (let i = 0; i < doubleBubblesBlocks.length; i++) {\r\n if (doubleBubblesBlocks[i].getAttribute(\"data-use-common-filter\").toLowerCase() == \"true\") {\r\n toUseCommon++;\r\n }\r\n }\r\n\r\n for (let i = 0; i < energipresentationFilter.length; i++) {\r\n let currentBlock = energipresentationFilter[i];\r\n let title = currentBlock.getAttribute(\"data-title\");\r\n let textField = currentBlock.getAttribute(\"data-text\");\r\n let linkedBlockId = currentBlock.getAttribute(\"data-linked-block-id\");\r\n let year1DefaultValueString = currentBlock.getAttribute(\"data-year1-default\");\r\n let year2DefaultValueString = currentBlock.getAttribute(\"data-year2-default\");\r\n let firstLoadString = currentBlock.getAttribute(\"data-first-load\");\r\n let firstLoad = firstLoadString.toLowerCase() === \"true\";\r\n let label1 = currentBlock.getAttribute(\"data-label1\");\r\n let label2 = currentBlock.getAttribute(\"data-label2\");\r\n let singleSelectString = currentBlock.getAttribute(\"data-single-select\");\r\n let singleSelect = singleSelectString.toLowerCase() === \"true\";\r\n\r\n let year1DefaultValue: number = 0;\r\n year1DefaultValue = asIntOrDefault(year1DefaultValueString, null);\r\n\r\n let year2DefaultValue: number = 0;\r\n year2DefaultValue = asIntOrDefault(year2DefaultValueString, null);\r\n\r\n ReactDOM.render(\r\n , currentBlock);\r\n }\r\n }\r\n});","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport EventBus from '../EventBus';\r\nimport iEnergipresentationBubbleApiRequestModel from './RequestModels/iEnergipresentationBubbleApiRequest';\r\nimport iEnergipresentationRequestModel from './RequestModels/iEnergipresentationRequest';\r\nimport iEnergipresentationBubblesModel from './iEnergipresentationBubbles';\r\nimport iEnergipresentationBubblesPropsModel from './iEnergipresentationBubblesProps';\r\nimport iEnergipresentationYearsModel from './iEnergipresentationYears';\r\nimport DataHelper from './DataHelper';\r\nimport iGraphDataOverview from './ResponseModels/iGraphDataOverview';\r\nimport { iEnergipresentationMinMaxYearsModel } from './iEnergipresentationMinMaxYears';\r\nimport iXAxisDictionary from './ResponseModels/iXAxisDictionary';\r\n\r\n\r\nconst EnergipresentationBubbles = (props: iEnergipresentationBubblesPropsModel) => {\r\n const initialState: iEnergipresentationBubblesModel = {\r\n headTitle: props.headTitle,\r\n\r\n apiUrl: props.apiUrl,\r\n requestBody: props.requestBody,\r\n xAxisVariableIndex: props.xAxisVariableIndex,\r\n categoryVariableIndex: props.categoryVariableIndex,\r\n\r\n prognoseApiUrl: props.prognoseApiUrl,\r\n prognoseRequestBody: props.prognoseRequestBody,\r\n prognoseXAxisVariableIndex: props.prognoseXAxisVariableIndex,\r\n prognoseCategoryVariableIndex: props.prognoseCategoryVariableIndex,\r\n prognoseDivideValueBy: props.prognoseDivideValueBy,\r\n prognoseText: props.prognoseText,\r\n\r\n isLoading: true,\r\n firstYear: -1,\r\n firstYearValue: 0,\r\n secondYear: -1,\r\n secondYearValue: 0,\r\n valuePrefix: props.valuePrefix,\r\n values: null,\r\n valueSuffix: props.valueSuffix,\r\n divideValueBy: props.divideValueBy,\r\n blockId: props.blockId,\r\n lastPublished: props.lastPublished,\r\n useCommonFilter: props.useCommonFilter\r\n };\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(initialState);\r\n\r\n useEffect(() => {\r\n setYears();\r\n\r\n if (state.useCommonFilter) {\r\n EventBus.on(\"UpdateBlockYears_\", updateSelectedYears);\r\n return;\r\n }\r\n EventBus.on(\"UpdateBlockYears_\" + state.blockId, updateSelectedYears);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const updateSelectedYears = async (years: iEnergipresentationYearsModel, values: iXAxisDictionary = null, prognoseStartYear: number = 0) => {\r\n let newState = { ...state };\r\n newState.prognoseStartYear = prognoseStartYear;\r\n\r\n if (newState.values === null && values === null) {\r\n let customNewYears: iEnergipresentationYearsModel = { firstYear: years.firstYear, secondYear: years.secondYear };\r\n await getGraphOverViewData(customNewYears, updateSelectedYearFromApi);\r\n return;\r\n } else if (newState.values === null && values !== null) {\r\n newState.values = values;\r\n }\r\n\r\n newState.firstYear = years.firstYear;\r\n newState.secondYear = years.secondYear;\r\n\r\n if (newState.values.hasOwnProperty(newState.firstYear)) {\r\n newState.firstYearValue = newState.values[newState.firstYear];\r\n } else {\r\n newState.firstYearValue = null;\r\n }\r\n\r\n if (newState.values.hasOwnProperty(newState.secondYear)) {\r\n newState.secondYearValue = newState.values[newState.secondYear];\r\n } else {\r\n newState.secondYearValue = null;\r\n }\r\n\r\n newState.isLoading = false;\r\n setState(newState);\r\n };\r\n\r\n const updateSelectedYearFromApi = async (data: iGraphDataOverview, years: iEnergipresentationYearsModel) => {\r\n await updateSelectedYears(years, data.values, data.prognoseStartYear);\r\n };\r\n\r\n const getGraphOverViewData = async (newYears: iEnergipresentationYearsModel, callback) => {\r\n let apiRequest1: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrl,\r\n requestBody: state.requestBody,\r\n xAxisVariableIndex: state.xAxisVariableIndex,\r\n categoryVariableIndex: state.categoryVariableIndex,\r\n divideValueBy: 1,\r\n isPrognose: false,\r\n };\r\n let apiRequest2: iEnergipresentationRequestModel = {\r\n apiUrl: state.prognoseApiUrl,\r\n requestBody: state.prognoseRequestBody,\r\n xAxisVariableIndex: state.prognoseXAxisVariableIndex,\r\n categoryVariableIndex: state.prognoseCategoryVariableIndex,\r\n divideValueBy: state.prognoseDivideValueBy,\r\n isPrognose: true,\r\n };\r\n let apiRequest: iEnergipresentationBubbleApiRequestModel = {\r\n requests: [apiRequest1, apiRequest2].filter((r) => r.apiUrl.length !== 0),\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n };\r\n\r\n await DataHelper.FetchGraphOverviewData(apiRequest, callback, newYears);\r\n };\r\n\r\n const initializeBubbles = (data: iGraphDataOverview, newYears?: iEnergipresentationYearsModel) => {\r\n if (!data) {\r\n EventBus.dispatch(\"ToggleBlock_\" + state.blockId, null);\r\n return;\r\n }\r\n\r\n let newState = { ...state };\r\n newState.values = data.values;\r\n newState.prognoseStartYear = data.prognoseStartYear;\r\n\r\n newState.firstYearValue = newState.values[newYears.firstYear];\r\n newState.secondYearValue = newState.values[newYears.secondYear];\r\n newState.firstYear = newYears.firstYear;\r\n newState.secondYear = newYears.secondYear;\r\n newState.isLoading = false;\r\n\r\n setState(newState);\r\n\r\n let objectKeys = Object.keys(newState.values);\r\n let minYearKey = objectKeys[0];\r\n let maxYearKey = objectKeys[objectKeys.length - 1];\r\n let minYear: number = minYearKey !== undefined && minYearKey !== null ? parseInt(minYearKey) : -1;\r\n let maxYear: number = maxYearKey !== undefined && maxYearKey !== null ? parseInt(maxYearKey) : -1;\r\n let currentYears: iEnergipresentationMinMaxYearsModel = { minYear: minYear, maxYear: maxYear };\r\n\r\n if (newState.useCommonFilter) {\r\n EventBus.dispatch(\"LoadedBubblesBlock\", currentYears);\r\n return;\r\n }\r\n EventBus.dispatch(\"LoadedBlock_\" + newState.blockId, currentYears);\r\n };\r\n\r\n const setYears = async (newYears?: iEnergipresentationYearsModel) => {\r\n if (newYears === undefined || newYears === null) {\r\n newYears = { firstYear: -1, secondYear: -1 };\r\n }\r\n\r\n await getGraphOverViewData(newYears, initializeBubbles);\r\n };\r\n\r\n const transformBubbleValue = (value: number): string => {\r\n let divideValueBy = state.divideValueBy;\r\n\r\n if (divideValueBy === null || divideValueBy === undefined || divideValueBy === 0) {\r\n divideValueBy = 1;\r\n }\r\n\r\n let roundedValue = Math.round(value / divideValueBy).toString();\r\n return roundedValue;\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n {state.values == null && !delayed && (\r\n
\r\n

Fel vid rendering av bubbelblock

\r\n

URL: {state.apiUrl}

\r\n

RequestBody: {state.requestBody}

\r\n

URL2: {state.prognoseApiUrl}

\r\n

RequestBody2: {state.prognoseRequestBody}

\r\n
\r\n )}\r\n {state.isLoading && state.values != null && (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )}\r\n {!state.isLoading && state.values != null && (\r\n
\r\n
state.secondYearValue ? \"first-bubble is-highest\" : \"first-bubble\"}>\r\n
\r\n {state.firstYear}\r\n
\r\n {state.firstYearValue !== null && (\r\n
\r\n {state.valuePrefix} {transformBubbleValue(state.firstYearValue)} {state.valueSuffix}\r\n
\r\n )}\r\n {state.firstYearValue === null && (\r\n
\r\n -\r\n
\r\n )}\r\n {state.firstYearValue !== null && state.prognoseStartYear != 0 && state.firstYear >= state.prognoseStartYear && (\r\n
\r\n {state.prognoseText}\r\n
\r\n )}\r\n
\r\n
state.firstYearValue ? \"second-bubble is-highest\" : \"second-bubble\"}>\r\n
\r\n {state.secondYear}\r\n
\r\n {state.secondYearValue !== null && (\r\n
\r\n {state.valuePrefix} {transformBubbleValue(state.secondYearValue)} {state.valueSuffix}\r\n
\r\n )}\r\n {state.secondYearValue === null && (\r\n
\r\n -\r\n
\r\n )}\r\n {state.secondYearValue !== null && state.prognoseStartYear != 0 && state.secondYear >= state.prognoseStartYear && (\r\n
\r\n {state.prognoseText}\r\n
\r\n )}\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\nexport default EnergipresentationBubbles;\r\n","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport EventBus from '../EventBus';\r\nimport iEnergipresentationRequestModel from './RequestModels/iEnergipresentationRequest';\r\nimport iEnergipresentationDoubleBubblesModel from './iEnergipresentationDoubleBubbles';\r\nimport iEnergipresentationDoubleBubblesPropsModel from './iEnergipresentationDoubleBubblesProps';\r\nimport iEnergipresentationYearsModel from './iEnergipresentationYears';\r\nimport DataHelper from './DataHelper';\r\nimport iGraphDataOverview from './ResponseModels/iGraphDataOverview';\r\nimport { iEnergipresentationMinMaxYearsModel } from './iEnergipresentationMinMaxYears';\r\nimport iXAxisDictionary from './ResponseModels/iXAxisDictionary';\r\nimport iEnergipresentationDoubleSourceBubbleApiRequestModel from './RequestModels/iEnergipresentationDoubleSourceBubbleApiRequest';\r\n\r\n\r\nconst EnergipresentationDoubleBubbles = (props: iEnergipresentationDoubleBubblesPropsModel) => {\r\n const initialState: iEnergipresentationDoubleBubblesModel = {\r\n headTitle: props.headTitle,\r\n\r\n apiUrl1: props.apiUrl1,\r\n requestBody1: props.requestBody1,\r\n xAxisVariableIndex1: props.xAxisVariableIndex1,\r\n categoryVariableIndex1: props.categoryVariableIndex1,\r\n divideValueBy1: props.divideValueBy1,\r\n\r\n apiUrl2: props.apiUrl2,\r\n requestBody2: props.requestBody2,\r\n xAxisVariableIndex2: props.xAxisVariableIndex2,\r\n categoryVariableIndex2: props.categoryVariableIndex2,\r\n divideValueBy2: props.divideValueBy2,\r\n\r\n prognoseApiUrl: props.prognoseApiUrl,\r\n prognoseRequestBody: props.prognoseRequestBody,\r\n prognoseXAxisVariableIndex: props.prognoseXAxisVariableIndex,\r\n prognoseCategoryVariableIndex: props.prognoseCategoryVariableIndex,\r\n prognoseDivideValueBy: props.prognoseDivideValueBy,\r\n prognoseText: props.prognoseText,\r\n\r\n isLoading: true,\r\n firstYear: -1,\r\n firstYearValue: 0,\r\n secondYear: -1,\r\n secondYearValue: 0,\r\n valuePrefix: props.valuePrefix,\r\n values: null,\r\n valueSuffix: props.valueSuffix,\r\n doCalculateQuota: props.doCalculateQuota,\r\n blockId: props.blockId,\r\n lastPublished: props.lastPublished,\r\n useCommonFilter: props.useCommonFilter\r\n };\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(initialState);\r\n\r\n useEffect(() => {\r\n setYears();\r\n\r\n if (state.useCommonFilter) {\r\n EventBus.on(\"UpdateBlockYears_\", updateSelectedYears);\r\n return;\r\n }\r\n EventBus.on(\"UpdateBlockYears_\" + state.blockId, updateSelectedYears);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const updateSelectedYears = async (years: iEnergipresentationYearsModel, values: iXAxisDictionary = null, prognoseStartYear: number = 0) => {\r\n let newState = { ...state };\r\n newState.prognoseStartYear = prognoseStartYear;\r\n\r\n if (newState.values === null && values === null) {\r\n let customNewYears: iEnergipresentationYearsModel = { firstYear: years.firstYear, secondYear: years.secondYear };\r\n await getGraphOverViewData(customNewYears, updateSelectedYearFromApi);\r\n return;\r\n } else if (newState.values === null && values !== null) {\r\n newState.values = values;\r\n }\r\n\r\n newState.firstYear = years.firstYear;\r\n newState.secondYear = years.secondYear;\r\n\r\n if (newState.values.hasOwnProperty(newState.firstYear)) {\r\n newState.firstYearValue = newState.values[newState.firstYear];\r\n } else {\r\n newState.firstYearValue = null;\r\n }\r\n\r\n if (newState.values.hasOwnProperty(newState.secondYear)) {\r\n newState.secondYearValue = newState.values[newState.secondYear];\r\n } else {\r\n newState.secondYearValue = null;\r\n }\r\n\r\n newState.isLoading = false;\r\n setState(newState);\r\n };\r\n\r\n const updateSelectedYearFromApi = async (data: iGraphDataOverview, years: iEnergipresentationYearsModel) => {\r\n await updateSelectedYears(years, data.values, data.prognoseStartYear);\r\n };\r\n\r\n const getGraphOverViewData = async (newYears: iEnergipresentationYearsModel, callback) => {\r\n let apiRequest1: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrl1,\r\n requestBody: state.requestBody1,\r\n xAxisVariableIndex: state.xAxisVariableIndex1,\r\n categoryVariableIndex: state.categoryVariableIndex1,\r\n divideValueBy: state.divideValueBy1 || 1,\r\n isPrognose: false,\r\n };\r\n\r\n let apiRequest2: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrl2,\r\n requestBody: state.requestBody2,\r\n xAxisVariableIndex: state.xAxisVariableIndex2,\r\n categoryVariableIndex: state.categoryVariableIndex2,\r\n divideValueBy: state.divideValueBy2 || 1,\r\n isPrognose: false,\r\n };\r\n\r\n let apiRequest3: iEnergipresentationRequestModel = {\r\n apiUrl: state.prognoseApiUrl,\r\n requestBody: state.prognoseRequestBody,\r\n xAxisVariableIndex: state.prognoseXAxisVariableIndex,\r\n categoryVariableIndex: state.prognoseCategoryVariableIndex,\r\n divideValueBy: state.prognoseDivideValueBy,\r\n isPrognose: true,\r\n };\r\n\r\n let doubleApiRequest: iEnergipresentationDoubleSourceBubbleApiRequestModel = {\r\n requests: [apiRequest1, apiRequest2, apiRequest3].filter((r) => r.apiUrl.length !== 0),\r\n doCalculateQuota: state.doCalculateQuota,\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n }\r\n\r\n await DataHelper.FetchDoubleGraphOverviewData(doubleApiRequest, callback, newYears);\r\n };\r\n\r\n const initializeBubbles = (data: iGraphDataOverview, newYears?: iEnergipresentationYearsModel) => {\r\n if (!data) {\r\n EventBus.dispatch(\"ToggleBlock_\" + state.blockId, null);\r\n return;\r\n }\r\n\r\n let newState = { ...state };\r\n newState.values = data.values;\r\n newState.prognoseStartYear = data.prognoseStartYear;\r\n\r\n newState.firstYearValue = newState.values[newYears.firstYear];\r\n newState.secondYearValue = newState.values[newYears.secondYear];\r\n newState.firstYear = newYears.firstYear;\r\n newState.secondYear = newYears.secondYear;\r\n newState.isLoading = false;\r\n\r\n setState(newState);\r\n\r\n let objectKeys = Object.keys(newState.values);\r\n let minYearKey = objectKeys[0];\r\n let maxYearKey = objectKeys[objectKeys.length - 1];\r\n let minYear: number = minYearKey !== undefined && minYearKey !== null ? parseInt(minYearKey) : -1;\r\n let maxYear: number = maxYearKey !== undefined && maxYearKey !== null ? parseInt(maxYearKey) : -1;\r\n let currentYears: iEnergipresentationMinMaxYearsModel = { minYear: minYear, maxYear: maxYear };\r\n\r\n if (newState.useCommonFilter) {\r\n EventBus.dispatch(\"LoadedBubblesBlock\", currentYears);\r\n return;\r\n }\r\n EventBus.dispatch(\"LoadedBlock_\" + newState.blockId, currentYears);\r\n };\r\n\r\n const setYears = async (newYears?: iEnergipresentationYearsModel) => {\r\n if (newYears === undefined || newYears === null) {\r\n newYears = { firstYear: -1, secondYear: -1 };\r\n }\r\n\r\n await getGraphOverViewData(newYears, initializeBubbles);\r\n };\r\n\r\n const transformBubbleValue = (value: number): string => {\r\n let divideValueBy = state.divideValueBy1;\r\n\r\n if (divideValueBy === null || divideValueBy === undefined || divideValueBy === 0) {\r\n divideValueBy = 1;\r\n }\r\n\r\n let roundedValue;\r\n if (state.doCalculateQuota) {\r\n roundedValue = (Math.round(value * 100) / 100).toFixed(1);\r\n } else {\r\n roundedValue = Math.round(value / divideValueBy).toString();\r\n }\r\n\r\n return roundedValue;\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n {state.values == null && !delayed &&\r\n
\r\n

Fel vid rendering av bubbelblock

\r\n

URL 1: {state.apiUrl1}

\r\n

RequestBody 1: {state.requestBody1}

\r\n

URL 2: {state.apiUrl2}

\r\n

RequestBody 2: {state.requestBody2}

\r\n

URL 3: {state.prognoseApiUrl}

\r\n

RequestBody 3: {state.prognoseRequestBody}

\r\n
\r\n }\r\n {state.isLoading && state.values != null &&\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n }\r\n {!state.isLoading && state.values != null &&\r\n
\r\n
state.secondYearValue ? \"first-bubble is-highest\" : \"first-bubble\"}>\r\n
\r\n {state.firstYear}\r\n
\r\n {state.firstYearValue !== null &&\r\n (\r\n
\r\n {state.valuePrefix} {transformBubbleValue(state.firstYearValue)} {state.valueSuffix}\r\n
\r\n )\r\n }\r\n {state.firstYearValue === null &&\r\n (\r\n
\r\n -\r\n
\r\n )\r\n }\r\n {state.firstYearValue !== null && state.prognoseStartYear != 0 && state.firstYear >= state.prognoseStartYear &&\r\n (\r\n
\r\n {state.prognoseText}\r\n
\r\n )\r\n }\r\n
\r\n
state.firstYearValue ? \"second-bubble is-highest\" : \"second-bubble\"}>\r\n
\r\n {state.secondYear}\r\n
\r\n {state.secondYearValue !== null &&\r\n (\r\n
\r\n {state.valuePrefix} {transformBubbleValue(state.secondYearValue)} {state.valueSuffix}\r\n
\r\n )\r\n }\r\n {state.secondYearValue === null &&\r\n (\r\n
\r\n -\r\n
\r\n )\r\n }\r\n {state.secondYearValue !== null && state.prognoseStartYear != 0 && state.secondYear >= state.prognoseStartYear &&\r\n (\r\n
\r\n {state.prognoseText}\r\n
\r\n )\r\n }\r\n
\r\n
\r\n }\r\n
\r\n );\r\n};\r\nexport default EnergipresentationDoubleBubbles;\r\n","import * as React from 'react';\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport iEnergipresentationFilterModel from './iEnergipresentationFilter';\r\nimport iEnergipresentationYearsModel from './iEnergipresentationYears';\r\nimport iEnergipresentationMinMaxYearsModel from './iEnergipresentationMinMaxYears';\r\nimport EventBus from '../EventBus';\r\n\r\nfunction useStateCallback(initialState) {\r\n const [state, setState] = useState(initialState);\r\n const cbRef = useRef(null);\r\n\r\n const setStateCallback = useCallback((state, callback) => {\r\n cbRef.current = callback;\r\n setState(state);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (cbRef.current) {\r\n cbRef.current(state);\r\n cbRef.current = null;\r\n }\r\n }, [state]);\r\n\r\n return [state, setStateCallback];\r\n};\r\n\r\ninterface iProps {\r\n title: string;\r\n textField: string;\r\n bubblesBlockCount: number;\r\n linkedBlockId: string;\r\n year1DefaultValue: number;\r\n year2DefaultValue: number;\r\n firstLoad: boolean;\r\n label1: string;\r\n label2: string;\r\n singleSelect: boolean;\r\n};\r\n\r\nfunction isElementInView(element) {\r\n const bounding = element.getBoundingClientRect();\r\n return (\r\n bounding.top >= 0 &&\r\n bounding.left >= 0 &&\r\n bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n bounding.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n};\r\n\r\nfunction isScrollable(element) {\r\n return element && element.clientHeight < element.scrollHeight;\r\n};\r\n\r\nfunction maintainScrollVisibility(activeElement, scrollParent) {\r\n const { offsetHeight, offsetTop } = activeElement;\r\n const { offsetHeight: parentOffsetHeight, scrollTop } = scrollParent;\r\n\r\n const isAbove = offsetTop < scrollTop;\r\n const isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\r\n\r\n if (isAbove) {\r\n scrollParent.scrollTo(0, offsetTop);\r\n } else if (isBelow) {\r\n scrollParent.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight);\r\n }\r\n};\r\n\r\n\r\nconst EnergipresentationFilter = (props: iProps) => {\r\n const initialValues: iEnergipresentationFilterModel = {\r\n title: props.title,\r\n textField: props.textField,\r\n firstYear: -1,\r\n secondYear: -1,\r\n selectableYears: [],\r\n showFirstYearOptions: false,\r\n showSecondYearOptions: false,\r\n bubblesBlockCount: props.bubblesBlockCount,\r\n loadedBubbleBlocks: 0,\r\n linkedBlockId: props.linkedBlockId,\r\n maxYear: -1,\r\n minYear: -1,\r\n isLoading: true,\r\n year1DefaultValue: props.year1DefaultValue,\r\n year2DefaultValue: props.year2DefaultValue,\r\n firstLoad: props.firstLoad,\r\n label1: props.label1,\r\n label2: props.label2,\r\n singleSelect: props.singleSelect\r\n };\r\n\r\n const [state, setState] = useStateCallback(initialValues);\r\n const firstYearRef = useRef(null);\r\n const secondYearRef = useRef(null);\r\n const [showFirstYearOptions, setShowFirstYearOptions] = useState(false);\r\n const [showSecondYearOptions, setShowSecondYearOptions] = useState(false);\r\n const [focusedOptionIndex, setFocusedOptionIndex] = useState(0);\r\n const [selectedYearIndex, setSelectedYearIndex] = useState(null);\r\n const dropdownOptionsRef = useRef([]);\r\n\r\n\r\n useEffect(() => {\r\n if (showFirstYearOptions && selectedYearIndex !== null) {\r\n const selectedOption = document.querySelector(`#option-${selectedYearIndex}`);\r\n if (selectedOption) {\r\n selectedOption.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }\r\n }, [showFirstYearOptions, selectedYearIndex]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event) => {\r\n if (state.showFirstYearOptions && firstYearRef.current && !firstYearRef.current.contains(event.target)) {\r\n toggleFirstYearOptions();\r\n }\r\n if (state.showSecondYearOptions && secondYearRef.current && !secondYearRef.current.contains(event.target)) {\r\n toggleSecondYearOptions();\r\n }\r\n };\r\n\r\n document.addEventListener(\"click\", handleClickOutside, true);\r\n\r\n return () => {\r\n document.removeEventListener(\"click\", handleClickOutside, true);\r\n };\r\n }, [state.showFirstYearOptions, state.showSecondYearOptions]);\r\n\r\n useEffect(() => {\r\n setFirstLoad(state.firstLoad);\r\n\r\n if (state.linkedBlockId === \"\") {\r\n EventBus.on(\"LoadedBubblesBlock\", loadedBlock);\r\n return;\r\n }\r\n EventBus.on(\"LoadedBlock_\" + state.linkedBlockId, loadedBlock);\r\n EventBus.on(\"ToggleBlock_\" + state.linkedBlockId, toggleFilter);\r\n }, []);\r\n\r\n const getFilterBlock = (): HTMLElement => {\r\n let filterBlock: HTMLElement = document.getElementById(\"EnergipresentationFilterBlock_\" + state.linkedBlockId);\r\n return filterBlock ?? new HTMLElement();\r\n };\r\n\r\n const setLoadedBubblesInMarkup = (loadedBubblesCount: number): void => {\r\n let filterBlock = getFilterBlock();\r\n filterBlock.setAttribute(\"data-loaded-bubbles-count\", loadedBubblesCount.toString());\r\n };\r\n const getLoadedBubblesInMarkup = (): number => {\r\n let filterBlock = getFilterBlock();\r\n let loadedBubblesCountString = filterBlock.getAttribute(\"data-loaded-bubbles-count\");\r\n\r\n if (loadedBubblesCountString === null\r\n || loadedBubblesCountString === undefined\r\n || loadedBubblesCountString === \"\") {\r\n return 0;\r\n }\r\n\r\n let loadedBubblesCount = parseInt(loadedBubblesCountString);\r\n\r\n if (isNaN(loadedBubblesCount)) {\r\n return 0;\r\n }\r\n\r\n return loadedBubblesCount;\r\n };\r\n\r\n const loadedBlock = (years: iEnergipresentationMinMaxYearsModel): void => {\r\n let newState = { ...state };\r\n\r\n if (state.linkedBlockId === \"\") {\r\n let loadedBubblesBlocks = getLoadedBubblesInMarkup();\r\n loadedBubblesBlocks = loadedBubblesBlocks + 1;\r\n newState.loadedBubbleBlocks = loadedBubblesBlocks;\r\n setLoadedBubblesInMarkup(newState.loadedBubbleBlocks);\r\n }\r\n\r\n let markupMinYear = getMinMaxYear(true);\r\n let markupMaxYear = getMinMaxYear(false);\r\n\r\n if (newState.minYear > markupMinYear || newState.minYear === -1) {\r\n newState.minYear = markupMinYear;\r\n }\r\n\r\n if (newState.maxYear < markupMaxYear || newState.maxYear === -1) {\r\n newState.maxYear = markupMaxYear;\r\n }\r\n\r\n if (years !== null && years !== undefined && years.minYear > -1 && years.maxYear > -1) {\r\n let updatedYears = false;\r\n\r\n if (years.minYear < newState.minYear || (newState.minYear === -1)) {\r\n newState.minYear = years.minYear;\r\n updatedYears = true;\r\n }\r\n\r\n if (years.maxYear > newState.maxYear) {\r\n newState.maxYear = years.maxYear;\r\n updatedYears = true;\r\n }\r\n\r\n if (updatedYears) {\r\n newState.selectableYears = generateYears(newState.minYear, newState.maxYear);\r\n }\r\n }\r\n\r\n if (newState.selectableYears === undefined || newState.selectableYears === null || newState.selectableYears.length === 0) {\r\n newState.selectableYears = generateYears(newState.minYear, newState.maxYear);\r\n }\r\n\r\n if (state.linkedBlockId !== \"\" || newState.loadedBubbleBlocks === newState.bubblesBlockCount) {\r\n newState.isLoading = false;\r\n newState.firstYear = newState.minYear;\r\n if (!state.singleSelect) {\r\n newState.secondYear = newState.maxYear;\r\n }\r\n newState.firstLoad = getFirstLoad();\r\n\r\n if (useFirstLoad(newState)) {\r\n newState.firstYear = newState.year1DefaultValue;\r\n if (!state.singleSelect) {\r\n newState.secondYear = newState.year2DefaultValue;\r\n }\r\n }\r\n else if (newState.selectableYears.length >= 2) {\r\n newState.firstYear = newState.selectableYears[newState.selectableYears.length - 1];\r\n if (!state.singleSelect) {\r\n newState.secondYear = newState.selectableYears[newState.selectableYears.length - 2];\r\n }\r\n }\r\n\r\n newState.firstLoad = false;\r\n setFirstLoad(newState.firstLoad);\r\n setState(newState, updateBlockYears);\r\n }\r\n else {\r\n setState(newState);\r\n }\r\n\r\n setMinMaxYear(true, newState.minYear);\r\n setMinMaxYear(false, newState.maxYear);\r\n\r\n //if (newState.selectableYears.length === 1 && newState.selectableYears[0] === -1) {\r\n // hideFilter();\r\n //}\r\n };\r\n\r\n const toggleFilter = (d:any): void => {\r\n let filterBlock = getFilterBlock();\r\n if (d == null) {\r\n filterBlock.classList.add(\"hidden\");\r\n }\r\n else {\r\n filterBlock.classList.remove(\"hidden\");\r\n }\r\n };\r\n\r\n const useFirstLoad = (newState: iEnergipresentationFilterModel): boolean => {\r\n let year1DefaultExists = newState.year1DefaultValue !== null && newState.selectableYears.includes(newState.year1DefaultValue);\r\n let year2DefaultExists = newState.year2DefaultValue !== null && newState.selectableYears.includes(newState.year2DefaultValue);\r\n let useFirstLoad = newState.firstLoad &&\r\n newState.year1DefaultValue !== null && year1DefaultExists &&\r\n (state.singleSelect || (newState.year2DefaultValue !== null && year2DefaultExists));\r\n return useFirstLoad;\r\n };\r\n\r\n const updateBlockYears = (savedState: iEnergipresentationFilterModel): void => {\r\n let selectedYears: iEnergipresentationYearsModel = { firstYear: savedState.firstYear };\r\n if (!savedState.singleSelect) {\r\n selectedYears.secondYear = savedState.secondYear;\r\n }\r\n EventBus.dispatch(\"UpdateBlockYears_\" + savedState.linkedBlockId, selectedYears);\r\n };\r\n\r\n const setMinMaxYear = (isMinYear: boolean, year: number): void => {\r\n let attributeName = isMinYear ? \"data-min-year\" : \"data-max-year\";\r\n let filterBlock = getFilterBlock();\r\n filterBlock.setAttribute(attributeName, year.toString());\r\n };\r\n\r\n const getMinMaxYear = (isMinYear: boolean): number => {\r\n let attributeName = isMinYear ? \"data-min-year\" : \"data-max-year\";\r\n let filterBlock = getFilterBlock();\r\n let yearString = filterBlock.getAttribute(attributeName);\r\n\r\n if (yearString === null\r\n || yearString === undefined\r\n || yearString === \"\") {\r\n return -1;\r\n }\r\n\r\n let year = parseInt(yearString);\r\n if (isNaN(year)) {\r\n return -1;\r\n }\r\n\r\n return year;\r\n };\r\n\r\n const setFirstLoad = (firstLoad: boolean): void => {\r\n let filterBlock = getFilterBlock();\r\n filterBlock.setAttribute(\"data-first-load\", firstLoad.toString());\r\n };\r\n\r\n const getFirstLoad = (): boolean => {\r\n let filterBlock = getFilterBlock();\r\n let firstLoadString = filterBlock.getAttribute(\"data-first-load\");\r\n let firstLoad = firstLoadString == null || firstLoadString.toLowerCase() === \"true\";\r\n return firstLoad;\r\n };\r\n\r\n const generateYears = (minYear: number, maxYear: number): number[] => {\r\n let yearOptions: number[] = [];\r\n\r\n for (let year = minYear; year <= maxYear; year++) {\r\n yearOptions.push(year);\r\n }\r\n\r\n yearOptions.sort((a, b) => b - a);\r\n\r\n return yearOptions;\r\n };\r\n\r\n const toggleFirstYearOptions = (): void => {\r\n setState((prevState) => {\r\n const newState = { ...prevState, showFirstYearOptions: !prevState.showFirstYearOptions };\r\n\r\n if (prevState.showFirstYearOptions) {\r\n return newState;\r\n }\r\n\r\n setTimeout(() => {\r\n if (dropdownOptionsRef.current[focusedOptionIndex]) {\r\n dropdownOptionsRef.current[focusedOptionIndex].scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, 0);\r\n return newState;\r\n });\r\n };\r\n\r\n const toggleSecondYearOptions = (): void => {\r\n setState((prevState) => {\r\n const newState = { ...prevState, showSecondYearOptions: !prevState.showSecondYearOptions };\r\n\r\n if (prevState.showSecondYearOptions) {\r\n return newState;\r\n }\r\n\r\n setTimeout(() => {\r\n if (dropdownOptionsRef.current[focusedOptionIndex]) {\r\n dropdownOptionsRef.current[focusedOptionIndex].scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, 0);\r\n return newState;\r\n });\r\n };\r\n\r\n const toggleDropdownOptions = (dropdown): void => {\r\n setState((prevState) => {\r\n const newState = { ...prevState, [dropdown]: !prevState[dropdown] };\r\n\r\n if (prevState[dropdown]) {\r\n return newState;\r\n }\r\n\r\n setTimeout(() => {\r\n if (dropdownOptionsRef.current[focusedOptionIndex]) {\r\n dropdownOptionsRef.current[focusedOptionIndex].scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, 0);\r\n return newState;\r\n });\r\n };\r\n\r\n const changeFirstYear = (newYear, index = -1): void => {\r\n setSelectedYearIndex(index);\r\n let newState = { ...state };\r\n newState.showFirstYearOptions = false;\r\n newState.firstYear = newYear;\r\n setState(newState);\r\n if (index !== -1) {\r\n setFocusedOptionIndex(index);\r\n }\r\n updateBlockYears(newState);\r\n };\r\n\r\n const changeSecondYear = (newYear, index = -1): void => {\r\n setSelectedYearIndex(index);\r\n let newState = { ...state };\r\n newState.showSecondYearOptions = false;\r\n newState.secondYear = newYear;\r\n if (index !== -1) {\r\n setFocusedOptionIndex(index);\r\n }\r\n setState(newState);\r\n updateBlockYears(newState);\r\n };\r\n\r\n const createHandleKeyDown = (dropdownId: 'showFirstYearOptions' | 'showSecondYearOptions'): ((e: React.KeyboardEvent) => void) => {\r\n return (e: React.KeyboardEvent) => {\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (!state[dropdownId]) {\r\n toggleDropdownOptions(dropdownId);\r\n } else {\r\n setFocusedOptionIndex((prevIndex) => {\r\n const newIndex = Math.min(prevIndex + 1, state.selectableYears.length - 1);\r\n scrollFocusedOptionIntoView(newIndex);\r\n return newIndex;\r\n });\r\n }\r\n break;\r\n\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (!state[dropdownId]) {\r\n toggleDropdownOptions(dropdownId);\r\n } else {\r\n setFocusedOptionIndex((prevIndex) => {\r\n const newIndex = Math.max(prevIndex - 1, 0);\r\n scrollFocusedOptionIntoView(newIndex);\r\n return newIndex;\r\n });\r\n }\r\n break;\r\n\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n if (!state[dropdownId]) {\r\n toggleDropdownOptions(dropdownId);\r\n } else {\r\n const selectedYear = state.selectableYears[focusedOptionIndex];\r\n dropdownId === \"showFirstYearOptions\"\r\n ? changeFirstYear(selectedYear, focusedOptionIndex)\r\n : changeSecondYear(selectedYear);\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n [dropdownId]: false,\r\n }));\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n e.preventDefault();\r\n if (state[dropdownId]) {\r\n toggleDropdownOptions(dropdownId);\r\n }\r\n break;\r\n\r\n case 'Home':\r\n e.preventDefault();\r\n if (state[dropdownId]) {\r\n setFocusedOptionIndex(0);\r\n }\r\n break;\r\n\r\n case 'End':\r\n e.preventDefault();\r\n if (state[dropdownId]) {\r\n setFocusedOptionIndex(state.selectableYears.length - 1);\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n };\r\n\r\n const scrollFocusedOptionIntoView = (index: number): void => {\r\n const optionElement = dropdownOptionsRef.current[index];\r\n const dropdownContainer = optionElement?.parentNode;\r\n\r\n if (optionElement && dropdownContainer) {\r\n if (isScrollable(dropdownContainer)) {\r\n maintainScrollVisibility(optionElement, dropdownContainer);\r\n }\r\n if (!isElementInView(optionElement)) {\r\n optionElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n

{state.title}

\r\n
\r\n
\r\n
\r\n
\r\n {state.isLoading && (\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n
{state.label1}
\r\n {state.isLoading && (\r\n
\r\n
\r\n
\r\n
\r\n )}\r\n {!state.isLoading && (\r\n
\r\n\r\n\r\n
{ toggleFirstYearOptions() }}>\r\n
{state.firstYear}
\r\n \r\n
\r\n\r\n\r\n {state.showFirstYearOptions && (\r\n
\r\n {\r\n state.selectableYears.map((selectableYear, selectableYearIndex) => {\r\n return (\r\n (dropdownOptionsRef.current[selectableYearIndex] = el)}\r\n id={`option-${selectableYearIndex}`}\r\n className={`dropdown-option-item ${selectableYearIndex === focusedOptionIndex ? 'focused' : ''}`}\r\n aria-selected={selectableYearIndex === focusedOptionIndex}\r\n onKeyDown={createHandleKeyDown('showFirstYearOptions')}\r\n onClick={() => changeFirstYear(selectableYear, selectableYearIndex)}\r\n >\r\n {selectableYear}\r\n
\r\n )\r\n })\r\n }\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n {!state.singleSelect && (\r\n
\r\n
{state.label2}
\r\n {state.isLoading && (\r\n
\r\n
\r\n
\r\n
\r\n )}\r\n {!state.isLoading && (\r\n
\r\n
{ toggleSecondYearOptions() }}>\r\n
{state.secondYear}
\r\n \r\n
\r\n {state.showSecondYearOptions && (\r\n
\r\n {\r\n state.selectableYears.map((selectableYear, selectableYearIndex) => {\r\n return (\r\n (dropdownOptionsRef.current[selectableYearIndex] = el)}\r\n id={`option-${selectableYearIndex}`}\r\n className={`dropdown-option-item ${selectableYearIndex === focusedOptionIndex ? 'focused' : ''}`}\r\n aria-selected={selectableYearIndex === focusedOptionIndex}\r\n onKeyDown={createHandleKeyDown('showSecondYearOptions')}\r\n onClick={() => changeSecondYear(selectableYear)}\r\n >\r\n {selectableYear}\r\n
\r\n )\r\n })\r\n }\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n )}\r\n \r\n
\r\n );\r\n};\r\nexport default EnergipresentationFilter;","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport EnergipresentationAccordion from './EnergipresentationAccordion';\r\nimport iEnergipresentationGraphModel from './iEnergipresentationGraph';\r\nimport iEnergipresentationGraphPropsModel from './iEnergipresentationGraphProps';\r\nimport iEnergipresentationRectangleGraphApiRequestModel from './RequestModels/iEnergipresentationRectangleGraphApiRequest';\r\nimport iEnergipresentationRequestModel from './RequestModels/iEnergipresentationRequest';\r\nimport DataHelper from './DataHelper';\r\nimport DisplayHelper from './DisplayHelper';\r\nimport iGraphData from './ResponseModels/iGraphData';\r\nimport * as Highcharts from 'highcharts';\r\nimport { HighchartsReact } from 'highcharts-react-official';\r\nimport patternFill from 'highcharts/modules/pattern-fill';\r\nimport highchartsAccessibility from \"highcharts/modules/accessibility\";\r\nimport EnergipresentationExportButton from './EnergipresentationExportButton';\r\nimport EventBus from '../EventBus';\r\n\r\nconst EnergipresentationGraph = (props: iEnergipresentationGraphPropsModel) => {\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(props);\r\n\r\n useEffect(() => {\r\n patternFill(Highcharts);\r\n highchartsAccessibility(Highcharts);\r\n getGraphData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const getGraphData = async () => {\r\n let apiRequest1: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrl,\r\n requestBody: state.requestBody,\r\n xAxisVariableIndex: state.xAxisVariableIndex,\r\n categoryVariableIndex: state.categoryVariableIndex,\r\n divideValueBy: state.divideValueBy,\r\n isPrognose: false,\r\n };\r\n\r\n let prognoseRequest: iEnergipresentationRequestModel = {\r\n apiUrl: state.prognoseApiUrl,\r\n requestBody: state.prognoseRequestBody,\r\n xAxisVariableIndex: state.prognoseXAxisVariableIndex,\r\n categoryVariableIndex: state.prognoseCategoryVariableIndex,\r\n divideValueBy: state.prognoseDivideValueBy,\r\n isPrognose: true,\r\n };\r\n\r\n let apiRequest: iEnergipresentationRectangleGraphApiRequestModel = {\r\n requests: [apiRequest1, prognoseRequest].filter((r) => r.apiUrl.length !== 0),\r\n type: state.type,\r\n yAxisName: state.yAxisName,\r\n xAxisShowNth: state.xAxisShowNth,\r\n decimals: state.decimals,\r\n specialType: state.specialType,\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n };\r\n\r\n await DataHelper.FetchGraphData(apiRequest, initializeGraph);\r\n }\r\n\r\n const initializeGraph = (graphData: iGraphData) => {\r\n if (!graphData) {\r\n return;\r\n }\r\n\r\n let newState = { ...state };\r\n let hasPrognose = newState.prognoseApiUrl.length > 0;\r\n if (hasPrognose) {\r\n DisplayHelper.DisplayPrognoseArea(graphData);\r\n }\r\n\r\n newState.textReplacements = DisplayHelper.GetTextReplacementsFromData(graphData, hasPrognose);\r\n newState.headTitle = DisplayHelper.ReflectDataInText(newState.headTitle, newState.textReplacements);\r\n graphData.title.text = null;\r\n graphData.chart.marginTop = 20;\r\n\r\n newState.graphData = graphData;\r\n setState(newState);\r\n if (newState.graphData != null) {\r\n EventBus.dispatch(\"GraphDataLoaded\", newState.blockId);\r\n }\r\n };\r\n\r\n const addSpecificHelpText = (cmsText: string): string => {\r\n if (!state.graphData?.series?.length) {\r\n return cmsText;\r\n }\r\n let type = state.graphData.chart.type;\r\n let heading = getTableHeading();\r\n let result = DisplayHelper.ReflectDataInText(cmsText, state.textReplacements);\r\n result += DisplayHelper.ToHTMLTable(state.graphData?.series, type, state.headTitle, heading, state.decimals, state.valueSuffix, state.helpInvertTableAxis, state.helpColumnSortOrder);\r\n return result;\r\n };\r\n\r\n const getTableHeading = () => {\r\n return (DisplayHelper.ReflectDataInText(state.helpColumnHeaders, state.textReplacements, true)?.split(DisplayHelper.DataDelimiter) || state.graphData?.xAxis?.categories) ?? [];\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n
\r\n
\r\n {(state.graphData != null || delayed) ?\r\n \r\n :\r\n
\r\n

Fel vid rendering av graf

\r\n

URL: {state.apiUrl}

\r\n

RequestBody: {state.requestBody}

\r\n

URL2: {state.prognoseApiUrl}

\r\n

RequestBody2: {state.prognoseRequestBody}

\r\n
\r\n }\r\n
\r\n
\r\n {(state.graphData != null || delayed) && (\r\n \r\n )}\r\n {(state.graphData != null || delayed) && state.helpText && state.helpText != \"\" && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nexport default EnergipresentationGraph;","enum SortOrder {\r\n //Values must be same as in Business\\Energipresentation\\Enums\\SortOrderEnum.cs\r\n //None = 0 // we don't need to handle this, it'd be null instead.\r\n Ascending = 1,\r\n Descending\r\n};\r\n\r\nexport default SortOrder;","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport EnergipresentationAccordion from './EnergipresentationAccordion';\r\nimport iEnergipresentationDoubleGraphModel from './iEnergipresentationDoubleGraph';\r\nimport iEnergipresentationDoubleGraphPropsModel from './iEnergipresentationDoubleGraphProps';\r\nimport iEnergipresentationDoubleSourceGraphApiRequestModel from './RequestModels/iEnergipresentationDoubleSourceGraphApiRequest';\r\nimport iEnergipresentationRequestModel from './RequestModels/iEnergipresentationRequest';\r\nimport DataHelper from './DataHelper';\r\nimport DisplayHelper from './DisplayHelper';\r\nimport iGraphData from './ResponseModels/iGraphData';\r\nimport * as Highcharts from 'highcharts';\r\nimport { HighchartsReact } from 'highcharts-react-official';\r\nimport patternFill from 'highcharts/modules/pattern-fill';\r\nimport highchartsAccessibility from \"highcharts/modules/accessibility\";\r\nimport EnergipresentationExportButton from './EnergipresentationExportButton';\r\nimport EventBus from '../EventBus';\r\n\r\nconst EnergipresentationDoubleGraph = (props: iEnergipresentationDoubleGraphPropsModel) => {\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(props);\r\n\r\n useEffect(() => {\r\n patternFill(Highcharts);\r\n highchartsAccessibility(Highcharts);\r\n getGraphData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const getGraphData = async () => {\r\n let partApiRequest1: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrlOne,\r\n requestBody: state.requestBodyOne,\r\n xAxisVariableIndex: state.xAxisVariableIndex,\r\n categoryVariableIndex: state.categoryVariableIndex,\r\n isPrognose: false,\r\n };\r\n\r\n let partApiRequest2: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrlTwo,\r\n requestBody: state.requestBodyTwo,\r\n xAxisVariableIndex: state.xAxisVariableIndex,\r\n categoryVariableIndex: state.categoryVariableIndex,\r\n isPrognose: false,\r\n };\r\n\r\n let partApiRequest3: iEnergipresentationRequestModel = {\r\n apiUrl: state.prognoseApiUrl,\r\n requestBody: state.prognoseRequestBody,\r\n xAxisVariableIndex: state.prognoseXAxisVariableIndex,\r\n categoryVariableIndex: state.prognoseCategoryVariableIndex,\r\n isPrognose: true,\r\n };\r\n\r\n let apiRequest: iEnergipresentationDoubleSourceGraphApiRequestModel = {\r\n requests: [partApiRequest1, partApiRequest2, partApiRequest3].filter((r) => r.apiUrl.length !== 0),\r\n type: state.type,\r\n yAxisName: state.yAxisName,\r\n xAxisShowNth: state.xAxisShowNth,\r\n decimals: state.decimals,\r\n doCalculateQuota: state.doCalculateQuota,\r\n specialType: state.specialType,\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n };\r\n\r\n await DataHelper.FetchDoubleGraphData(apiRequest, initializeGraph);\r\n }\r\n\r\n const initializeGraph = (graphData: iGraphData) => {\r\n if (!graphData) {\r\n return;\r\n }\r\n let newState = { ...state };\r\n let hasPrognose = newState.prognoseApiUrl.length > 0;\r\n if (hasPrognose) {\r\n DisplayHelper.DisplayPrognoseArea(graphData);\r\n }\r\n\r\n newState.textReplacements = DisplayHelper.GetTextReplacementsFromData(graphData, hasPrognose);\r\n newState.headTitle = DisplayHelper.ReflectDataInText(newState.headTitle, newState.textReplacements);\r\n graphData.title.text = null;\r\n graphData.chart.marginTop = 20;\r\n\r\n newState.graphData = graphData;\r\n setState(newState);\r\n if (newState.graphData != null) {\r\n EventBus.dispatch(\"GraphDataLoaded\", newState.blockId);\r\n }\r\n }\r\n\r\n const addSpecificHelpText = (cmsText: string): string => {\r\n if (!state.graphData?.series?.length) {\r\n return cmsText;\r\n }\r\n let type = state.graphData.chart.type;\r\n let heading = getTableHeading();\r\n let unit = state.specialType === 1 ? '%' : state.valueSuffix;\r\n let result = DisplayHelper.ReflectDataInText(cmsText, state.textReplacements);\r\n result += DisplayHelper.ToHTMLTable(state.graphData?.series, type, state.headTitle, heading, state.decimals, unit, state.helpInvertTableAxis, state.helpColumnSortOrder);\r\n return result;\r\n };\r\n\r\n const getTableHeading = () => {\r\n return (DisplayHelper.ReflectDataInText(state.helpColumnHeaders, state.textReplacements, true)?.split(DisplayHelper.DataDelimiter) || state.graphData?.xAxis?.categories) ?? [];\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n
\r\n
\r\n {(state.graphData != null || delayed) ?\r\n \r\n :\r\n
\r\n

Fel vid rendering av dubbel graf

\r\n

URL 1: {state.apiUrlOne}

\r\n

RequestBody 1: {state.requestBodyOne}

\r\n

URL 2: {state.apiUrlTwo}

\r\n

RequestBody 2: {state.requestBodyTwo}

\r\n

URL 3: {state.prognoseApiUrl}

\r\n

RequestBody 3: {state.prognoseRequestBody}

\r\n
\r\n }\r\n
\r\n
\r\n {(state.graphData != null || delayed) && (\r\n \r\n )}\r\n {(state.graphData != null || delayed) && state.helpText && state.helpText != \"\" && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nexport default EnergipresentationDoubleGraph;","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport EnergipresentationAccordion from './EnergipresentationAccordion';\r\nimport iEnergipresentationCircleModel from './iEnergipresentationCircle';\r\nimport iEnergipresentationCirclePropsModel from './iEnergipresentationCircleProps';\r\nimport DataHelper from './DataHelper';\r\nimport DisplayHelper from './DisplayHelper';\r\nimport iCircleData from './ResponseModels/iCircleData';\r\nimport iEnergipresentationRequestModel from './RequestModels/iEnergipresentationRequest';\r\nimport iEnergipresentationCircleApiRequestModel from './RequestModels/iEnergipresentationCircleApiRequest';\r\nimport * as Highcharts from 'highcharts';\r\nimport { HighchartsReact } from 'highcharts-react-official';\r\nimport highchartsAccessibility from \"highcharts/modules/accessibility\";\r\nimport EnergipresentationExportButton from './EnergipresentationExportButton';\r\nimport EventBus from '../EventBus';\r\n\r\nconst EnergipresentationCircle = (props: iEnergipresentationCirclePropsModel) => {\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(props);\r\n\r\n useEffect(() => {\r\n highchartsAccessibility(Highcharts);\r\n getCircleData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const getCircleData = async () => {\r\n let request: iEnergipresentationRequestModel = {\r\n apiUrl: state.apiUrl,\r\n requestBody: state.requestBody,\r\n xAxisVariableIndex: state.xAxisVariableIndex,\r\n categoryVariableIndex: state.categoryVariableIndex,\r\n divideValueBy: 1,\r\n };\r\n let apiRequest: iEnergipresentationCircleApiRequestModel = {\r\n requests: [request],\r\n type: state.type,\r\n yAxisName: state.yAxisName,\r\n xAxisShowNth: state.xAxisShowNth,\r\n decimals: state.decimals,\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n };\r\n\r\n await DataHelper.FetchCircleData(apiRequest, initializeCircle);\r\n };\r\n\r\n const initializeCircle = (circleData: iCircleData) => {\r\n let newState = { ...state };\r\n\r\n newState.textReplacements = DisplayHelper.GetTextReplacementsFromData(circleData);\r\n newState.headTitle = DisplayHelper.ReflectDataInText(newState.headTitle, newState.textReplacements);\r\n circleData.title.text = null;\r\n circleData.chart.marginTop = 20;\r\n\r\n newState.circleData = circleData;\r\n setState(newState);\r\n if (newState.circleData != null) {\r\n EventBus.dispatch(\"GraphDataLoaded\", newState.blockId);\r\n }\r\n };\r\n\r\n const addSpecificHelpText = (cmsText: string): string => {\r\n if (!state.circleData?.series) {\r\n return cmsText;\r\n }\r\n let heading = getTableHeading();\r\n let result = DisplayHelper.ReflectDataInText(cmsText, state.textReplacements);\r\n result += DisplayHelper.ToHTMLTable(state.circleData.series, state.circleData.chart.type, state.headTitle, heading, state.decimals, '%', state.helpInvertTableAxis, state.helpColumnSortOrder);\r\n return result;\r\n };\r\n\r\n const getTableHeading = () => {\r\n return (DisplayHelper.ReflectDataInText(state.helpColumnHeaders, state.textReplacements, true)?.split(DisplayHelper.DataDelimiter) || ['','%']) ?? [];\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n
\r\n
\r\n {(state.circleData != null || delayed) ?\r\n \r\n :\r\n
\r\n

Fel vid rendering av cirkeldiagram

\r\n

URL: {state.apiUrl}

\r\n

RequestBody: {state.requestBody}

\r\n
\r\n }\r\n
\r\n
\r\n {(state.circleData != null || delayed) && (\r\n \r\n )}\r\n {(state.circleData != null || delayed) && state.helpText && state.helpText != \"\" && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nexport default EnergipresentationCircle;","import * as React from 'react';\r\nimport EventBus from '../EventBus';\r\nimport { useState, useEffect } from 'react';\r\nimport EnergipresentationAccordion from './EnergipresentationAccordion';\r\nimport iEnergipresentationSankeyModel from './iEnergipresentationSankey';\r\nimport iEnergipresentationSankeyPropsModel from './iEnergipresentationSankeyProps';\r\nimport iEnergipresentationSankeyApiRequestModel from './RequestModels/iEnergipresentationSankeyApiRequest';\r\nimport iSankeyData from './ResponseModels/iSankeyData';\r\nimport iSankeySeriesItem from './ResponseModels/iSankeySeriesItem';\r\nimport iEnergipresentationYearsModel from './iEnergipresentationYears';\r\nimport { iEnergipresentationMinMaxYearsModel } from './iEnergipresentationMinMaxYears';\r\nimport DataHelper from './DataHelper';\r\nimport DisplayHelper from './DisplayHelper';\r\nimport * as Highcharts from 'highcharts';\r\nimport { HighchartsReact } from 'highcharts-react-official';\r\nimport patternFill from 'highcharts/modules/pattern-fill';\r\nimport sankey from 'highcharts/modules/sankey';\r\nimport highchartsAccessibility from \"highcharts/modules/accessibility\";\r\nimport EnergipresentationExportButton from './EnergipresentationExportButton';\r\n\r\nconst EnergipresentationSankey = (props: iEnergipresentationSankeyPropsModel) => {\r\n const initialState: iEnergipresentationSankeyModel = {\r\n ...props,\r\n isLoading: true,\r\n year: \"0\",\r\n };\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(initialState);\r\n\r\n useEffect(() => {\r\n sankey(Highcharts);\r\n patternFill(Highcharts);\r\n highchartsAccessibility(Highcharts);\r\n setYears();\r\n\r\n EventBus.on(\"UpdateBlockYears_\" + state.blockId, updateSelectedYears);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const updateSelectedYears = async (years: iEnergipresentationYearsModel, data: iSankeyData = null) => {\r\n if (!hasValues(state.sankeyData?.series) && !hasValues(data?.series)) {\r\n let customNewYears: iEnergipresentationYearsModel = { firstYear: years.firstYear };\r\n await getSankeyData(customNewYears, updateSelectedYearFromApi);\r\n return;\r\n }\r\n\r\n let isLoading = false;\r\n if (!hasValues(state.sankeyData?.series) && hasValues(data?.series)) {\r\n updateState(data, years, isLoading);\r\n return;\r\n }\r\n\r\n let newState = { ...state };\r\n newState.isLoading = isLoading;\r\n setState(newState);\r\n };\r\n\r\n const hasValues = (list: Array): boolean => {\r\n return list !== undefined && list !== null && list.length > 0;\r\n };\r\n\r\n const updateSelectedYearFromApi = async (data: iSankeyData, years: iEnergipresentationYearsModel) => {\r\n await updateSelectedYears(years, data);\r\n };\r\n\r\n const getSankeyData = async (newYears: iEnergipresentationYearsModel, callback) => {\r\n let apiRequest: iEnergipresentationSankeyApiRequestModel = {\r\n cId: state.cId,\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n };\r\n\r\n await DataHelper.FetchSankeyData(apiRequest, callback, newYears);\r\n }\r\n\r\n const initializeGraph = (sankeyData: iSankeyData, years: iEnergipresentationYearsModel) => {\r\n let newState = updateState(sankeyData, years);\r\n\r\n let minYearKey = newState.availableYears[0];\r\n let maxYearKey = newState.availableYears[newState.availableYears.length - 1];\r\n let minYear: number = minYearKey !== undefined && minYearKey !== null ? parseInt(minYearKey) : -1;\r\n let maxYear: number = maxYearKey !== undefined && maxYearKey !== null ? parseInt(maxYearKey) : -1;\r\n let currentYears: iEnergipresentationMinMaxYearsModel = { minYear: minYear, maxYear: maxYear };\r\n EventBus.dispatch(\"LoadedBlock_\" + newState.blockId, currentYears);\r\n };\r\n\r\n const updateState = (sankeyData: iSankeyData, years: iEnergipresentationYearsModel, isLoading: boolean = true): iEnergipresentationSankeyModel => {\r\n var newState = { ...state };\r\n\r\n if (!sankeyData || !sankeyData.series || sankeyData.series.length === 0) {\r\n EventBus.dispatch(\"ToggleBlock_\" + state.blockId, null);\r\n newState.year = (new Date(Date.now()).getFullYear() - 1) + \"\";\r\n newState.availableYears = [newState.year];\r\n newState.errorText = DisplayHelper.LocaleText('No data', 'Ingen data');\r\n setState(newState);\r\n return newState;\r\n }\r\n\r\n newState.year = years.firstYear.toString();\r\n newState.availableYears = sankeyData.series.map(s => s.name);\r\n\r\n newState.textReplacements = { FROM: newState.year };\r\n newState.headTitle = DisplayHelper.ReflectDataInText(newState.headTitle, newState.textReplacements);\r\n sankeyData.title.text = null;\r\n sankeyData.chart.marginTop = 20;\r\n\r\n newState.series = [...sankeyData.series];\r\n sankeyData.series = sankeyData.series.filter(s => s.name === newState.year);\r\n\r\n sankeyData.series.forEach((serie) => {\r\n serie.clip = false;\r\n serie.minLinkWidth = 2;\r\n\r\n let hasBackwardLinks = serie.data.some(link => {\r\n const fromNode = serie.nodes.find(n => n.name === link.from);\r\n const toNode = serie.nodes.find(n => n.name === link.to);\r\n\r\n return fromNode && toNode && toNode.column < fromNode.column;\r\n });\r\n if (hasBackwardLinks) {\r\n sankeyData.chart.marginBottom = 60;\r\n }\r\n\r\n serie.nodes.forEach((n) => {\r\n var base = n.offsetVertical ?? 0;\r\n n.offsetVertical = !n.height ? n.offsetVertical : base - 7;\r\n n.dataLabels.allowOverlap = true;\r\n });\r\n });\r\n sankeyData.plotOptions.sankey.nodePadding = 5;\r\n sankeyData.plotOptions.sankey.nodeWidth = 40;\r\n sankeyData.plotOptions.sankey['curveFactor'] = 0.66;\r\n sankeyData.chart.height = 550;\r\n\r\n newState.sankeyData = sankeyData;\r\n newState.isLoading = isLoading;\r\n\r\n setState(newState);\r\n if (delayed && newState.sankeyData.series.length) {\r\n EventBus.dispatch(\"GraphDataLoaded\", newState.blockId);\r\n }\r\n return newState;\r\n };\r\n\r\n const setYears = async (newYears?: iEnergipresentationYearsModel) => {\r\n if (newYears === undefined || newYears === null) {\r\n newYears = { firstYear: -1, secondYear: -1 };\r\n }\r\n\r\n await getSankeyData(newYears, initializeGraph);\r\n };\r\n\r\n const addSpecificHelpText = (cmsText: string): string => {\r\n if (!state.sankeyData?.series?.length) {\r\n return cmsText;\r\n }\r\n let heading = getTableHeading();\r\n let result = DisplayHelper.ReflectDataInText(cmsText, state.textReplacements);\r\n result += DisplayHelper.ToHTMLTable(state.sankeyData?.series, state.sankeyData.chart.type, state.headTitle, heading, state.decimals, state.valueSuffix, state.helpInvertTableAxis)\r\n return result;\r\n };\r\n\r\n const getTableHeading = () => {\r\n return DisplayHelper.ReflectDataInText(state.helpColumnHeaders, state.textReplacements, true)?.split(DisplayHelper.DataDelimiter) ?? [];\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n
\r\n
\r\n {(state.sankeyData != null || delayed) ?\r\n \r\n :\r\n
\r\n

Fel vid rendering av sankey

\r\n

{state.errorText}

\r\n
\r\n }\r\n
\r\n
\r\n {(state.sankeyData != null || delayed) && (\r\n \r\n )}\r\n {(state.sankeyData != null || delayed) && state.helpText && state.helpText != \"\" && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nexport default EnergipresentationSankey;","import * as React from 'react';\r\nimport EventBus from '../EventBus';\r\nimport { useState, useEffect } from 'react';\r\nimport EnergipresentationAccordion from './EnergipresentationAccordion';\r\nimport DataHelper from './DataHelper';\r\nimport DisplayHelper from './DisplayHelper';\r\nimport iEnergipresentationRequestModel from './RequestModels/iEnergipresentationRequest';\r\nimport iEnergipresentationScaleApiRequestModel from './RequestModels/iEnergipresentationScaleApiRequest';\r\nimport iEnergipresentationScalesModel from './iEnergipresentationScales';\r\nimport iEnergipresentationScalesPropsModel from './iEnergipresentationScalesProps';\r\nimport iEnergipresentationScalesResponse from './iEnergipresentationScalesResponse';\r\nimport iEnergipresentationYearsModel from './iEnergipresentationYears';\r\nimport iEnergipresentationMinMaxYearsModel from './iEnergipresentationMinMaxYears';\r\nimport iScalesItemModel from './ResponseModels/iScalesItem';\r\nimport iScaleData from './ResponseModels/iScaleData';\r\nimport EnergipresentationExportButton from './EnergipresentationExportButton';\r\n\r\n\r\nconst EnergipresentationScales = (props: iEnergipresentationScalesPropsModel) => {\r\n const initialState: iEnergipresentationScalesModel = {\r\n ...props,\r\n isLoading: true,\r\n year: \"0\",\r\n scaleData: {} as iScaleData,\r\n };\r\n\r\n const [delayed, setDelayed] = useState(true);\r\n const [state, setState] = useState(initialState);\r\n\r\n useEffect(() => {\r\n setYears();\r\n\r\n EventBus.on(\"UpdateBlockYears_\" + state.blockId, updateSelectedYears);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const timeout = setTimeout(() => setDelayed(false), 3000);\r\n return () => clearTimeout(timeout);\r\n }, []);\r\n\r\n const updateSelectedYears = async (years: iEnergipresentationYearsModel, data: iEnergipresentationScalesResponse = null) => {\r\n if (!hasValues(state.sourceAEltillforselValues) && !hasValues(data?.sourceAEltillforselValues) &&\r\n !hasValues(state.sourceBEnergianvandningValues) && !hasValues(data?.sourceBEnergianvandningValues) &&\r\n !hasValues(state.sourceCEnergianvandningBranslenValues) && !hasValues(data?.sourceCEnergianvandningBranslenValues)) {\r\n\r\n let customNewYears: iEnergipresentationYearsModel = { firstYear: years.firstYear };\r\n await fetchScaleData(customNewYears, updateSelectedYearFromApi);\r\n return;\r\n }\r\n\r\n let isLoading = false;\r\n if (!hasValues(state.sourceAEltillforselValues) && hasValues(data?.sourceAEltillforselValues) &&\r\n !hasValues(state.sourceBEnergianvandningValues) && hasValues(data?.sourceBEnergianvandningValues) &&\r\n !hasValues(state.sourceCEnergianvandningBranslenValues) && hasValues(data?.sourceCEnergianvandningBranslenValues)) {\r\n\r\n data.year = years.firstYear.toString();\r\n updateState(data, isLoading);\r\n return;\r\n }\r\n\r\n let newState = { ...state };\r\n newState.isLoading = isLoading;\r\n setState(newState);\r\n };\r\n\r\n const hasValues = (list: Array): boolean => {\r\n return list !== undefined && list !== null && list.length > 0;\r\n };\r\n\r\n const updateSelectedYearFromApi = async (data: iEnergipresentationScalesResponse, years: iEnergipresentationYearsModel) => {\r\n await updateSelectedYears(years, data);\r\n };\r\n\r\n const fetchScaleData = async (newYears: iEnergipresentationYearsModel, callback) => {\r\n let sourceAEltillforsel: iEnergipresentationRequestModel = {\r\n name: 'A',\r\n apiUrl: state.apiUrlSourceAEltillforsel,\r\n categoryVariableIndex: state.categoryVariableIndexSourceA,\r\n requestBody: state.requestBodySourceAEltillforsel,\r\n xAxisVariableIndex: state.xAxisVariableIndexSourceA,\r\n divideValueBy: 1,\r\n };\r\n\r\n let sourceBEnergianvandning: iEnergipresentationRequestModel = {\r\n name: 'B',\r\n apiUrl: state.apiUrlSourceBEnergianvandning,\r\n categoryVariableIndex: state.categoryVariableIndexSourceB,\r\n requestBody: state.requestBodySourceBEnergianvandning,\r\n xAxisVariableIndex: state.xAxisVariableIndexSourceB,\r\n divideValueBy: 1,\r\n };\r\n\r\n let sourceCEnergianvandningBranslen: iEnergipresentationRequestModel = {\r\n name: 'C',\r\n apiUrl: state.apiUrlSourceCEnergianvandningBranslen,\r\n categoryVariableIndex: state.categoryVariableIndexSourceC,\r\n requestBody: state.requestBodySourceCEnergianvandningBranslen,\r\n xAxisVariableIndex: state.xAxisVariableIndexSourceC,\r\n divideValueBy: 1,\r\n };\r\n\r\n let scaleApiRequest: iEnergipresentationScaleApiRequestModel = {\r\n requests: [sourceAEltillforsel, sourceBEnergianvandning, sourceCEnergianvandningBranslen],\r\n blockId: state.blockId,\r\n lastPublished: state.lastPublished\r\n };\r\n\r\n await DataHelper.FetchScaleData(scaleApiRequest, callback, newYears);\r\n };\r\n\r\n const initializeScale = (data: iEnergipresentationScalesResponse) => {\r\n if (!hasValues(data?.sourceAEltillforselValues) || !hasValues(data?.sourceBEnergianvandningValues) || !hasValues(data?.sourceCEnergianvandningBranslenValues)) {\r\n EventBus.dispatch(\"ToggleBlock_\" + state.blockId, null);\r\n }\r\n\r\n let newState = updateState(data);\r\n newState.scaleData.descriptionDifference = newState.descriptionDifference;\r\n newState.scaleData.titleLeftSide = newState.titleLeftSide;\r\n newState.scaleData.titleRightSide = newState.titleRightSide;\r\n newState.scaleData.resultTextSourceB = newState.resultTextSourceB;\r\n newState.scaleData.resultTextSourceC = newState.resultTextSourceC;\r\n\r\n let minYearKey = newState.availableYears[0];\r\n let maxYearKey = newState.availableYears[newState.availableYears.length - 1];\r\n let minYear: number = minYearKey !== undefined && minYearKey !== null ? parseInt(minYearKey) : -1;\r\n let maxYear: number = maxYearKey !== undefined && maxYearKey !== null ? parseInt(maxYearKey) : -1;\r\n let currentYears: iEnergipresentationMinMaxYearsModel = { minYear: minYear, maxYear: maxYear };\r\n EventBus.dispatch(\"LoadedBlock_\" + newState.blockId, currentYears);\r\n };\r\n\r\n const updateState = (data: iEnergipresentationScalesResponse, isLoading: boolean = true): iEnergipresentationScalesModel => {\r\n var newState = { ...state };\r\n\r\n newState.sourceAEltillforselValues = mapValues(data.sourceAEltillforselValues, state.divideBySourceA, true);\r\n newState.sourceBEnergianvandningValues = mapValues(data.sourceBEnergianvandningValues, state.divideBySourceB);\r\n newState.sourceCEnergianvandningBranslenValues = mapValues(data.sourceCEnergianvandningBranslenValues, state.divideBySourceC);\r\n\r\n newState.yearIndex = data.availableYears.indexOf(data.year);\r\n\r\n newState.scaleData.sourceAValues = newState.sourceAEltillforselValues.map((a) => { return { key: a.key, value: [a.value[newState.yearIndex]] }; });\r\n newState.scaleData.sourceBValues = newState.sourceBEnergianvandningValues.map((a) => { return { key: a.key, value: [a.value[newState.yearIndex]] }; });\r\n newState.scaleData.sourceCValues = newState.sourceCEnergianvandningBranslenValues.map((a) => { return { key: a.key, value: [a.value[newState.yearIndex]] }; });\r\n newState.scaleData.sourceAEltillforselTotal = getTotal(newState.sourceAEltillforselValues, newState.yearIndex);\r\n newState.scaleData.sourceBEnergianvandningTotal = getTotal(newState.sourceBEnergianvandningValues, newState.yearIndex);\r\n newState.scaleData.sourceCEnergianvandningBranslenTotal = getTotal(newState.sourceCEnergianvandningBranslenValues, newState.yearIndex);\r\n\r\n newState.scaleData.sourceBAndCTotal = newState.scaleData.sourceBEnergianvandningTotal + newState.scaleData.sourceCEnergianvandningBranslenTotal;\r\n newState.scaleData.statisticDifference = newState.scaleData.sourceAEltillforselTotal - (newState.scaleData.sourceBAndCTotal);\r\n newState.scaleData.sourceRightSideTotal = newState.scaleData.sourceBAndCTotal + newState.scaleData.statisticDifference;\r\n\r\n newState.year = data.year;\r\n newState.availableYears = data.availableYears;\r\n\r\n newState.textReplacements = { FROM: newState.year };\r\n\r\n newState.headTitle = DisplayHelper.ReflectDataInText(newState.headTitle, newState.textReplacements);\r\n\r\n newState.isLoading = isLoading;\r\n setState(newState);\r\n if (delayed && newState.scaleData.sourceRightSideTotal) {\r\n EventBus.dispatch(\"GraphDataLoaded\", newState.blockId);\r\n }\r\n return newState;\r\n };\r\n\r\n const mapValues = (values: iScalesItemModel[], divideBy: number, sort: boolean = false): iScalesItemModel[] => {\r\n var mapped = values.map((item: iScalesItemModel) => {\r\n return { ...item, value: item.value.map(v => Math.round(v / divideBy)) };\r\n });\r\n\r\n if (!sort) {\r\n return mapped;\r\n }\r\n\r\n return mapped.sort((itemA, itemB) => {\r\n if (itemA.key === \"Solkraft\") {\r\n return -1;\r\n } else if (itemB.key === \"Solkraft\") {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n };\r\n const getTotal = (values: iScalesItemModel[], yearIndex: number): number => {\r\n if (yearIndex < 0) {\r\n return 0;\r\n }\r\n\r\n return values.reduce((accumulator, currentItem) => {\r\n return accumulator + currentItem.value[yearIndex];\r\n }, 0);\r\n };\r\n\r\n const setYears = async (newYears?: iEnergipresentationYearsModel) => {\r\n if (newYears === undefined || newYears === null) {\r\n newYears = { firstYear: -1, secondYear: -1 };\r\n }\r\n\r\n await fetchScaleData(newYears, initializeScale);\r\n };\r\n\r\n const hasAllValues = (data: any): boolean => {\r\n if (!data) { return false; }\r\n if (typeof data === 'number') { return true; }\r\n if (typeof data === 'string') { return data.length > 0; }\r\n if (Array.isArray(data)) {\r\n if (!data.length) { return false; }\r\n let i = 0;\r\n for (let item in data) {\r\n if (!hasAllValues(item,)) { return false; };\r\n }\r\n return true;\r\n }\r\n\r\n if (!hasValues(Object.keys(data))) { return false; }\r\n for (let key of Object.keys(data)) {\r\n if (!hasAllValues(data[key])) { return false; }\r\n }\r\n return true;\r\n };\r\n\r\n const addSpecificHelpText = (cmsText: string): string => {\r\n if (!hasAllValues(state.scaleData)) {\r\n return cmsText;\r\n }\r\n const heading = getTableHeading();\r\n const decimals = 0;\r\n const unit = 'TWh';\r\n let result = DisplayHelper.ReflectDataInText(cmsText, state.textReplacements);\r\n result += DisplayHelper.ToHTMLTable(state.scaleData, 'scale', state.headTitle, heading, decimals, unit, state.helpInvertTableAxis);\r\n return result;\r\n };\r\n\r\n const getTableHeading = () => {\r\n return DisplayHelper.ReflectDataInText(state.helpColumnHeaders, state.textReplacements, true)?.split(DisplayHelper.DataDelimiter) ?? [];\r\n };\r\n\r\n return (\r\n \r\n

{state.headTitle}

\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
{state.titleLeftSide}
\r\n {hasValues(state.sourceAEltillforselValues) && (\r\n \r\n {state.sourceAEltillforselValues.map((item, itemIndex) => {\r\n return (\r\n
{item.key} {item.value[state.yearIndex]}
\r\n )\r\n })}\r\n
\r\n )}\r\n

{state.scaleData.sourceAEltillforselTotal}

\r\n
\r\n
\r\n
{state.titleRightSide}
\r\n
{state.scaleData.statisticDifference}*
\r\n {hasValues(state.sourceCEnergianvandningBranslenValues) && (\r\n \r\n {state.sourceCEnergianvandningBranslenValues.map((item, itemIndex) => {\r\n return (\r\n
{item.key} {item.value[state.yearIndex]}
\r\n )\r\n })}\r\n
\r\n )}\r\n {hasValues(state.sourceBEnergianvandningValues) && (\r\n \r\n {state.sourceBEnergianvandningValues.map((item, itemIndex) => {\r\n return (\r\n
{item.key} {item.value[state.yearIndex]}
\r\n )\r\n })}\r\n
\r\n )}\r\n

{state.scaleData.sourceRightSideTotal}

\r\n
\r\n

{state.year}

\r\n

{state.descriptionDifference}

\r\n
\r\n
\r\n
\r\n
\r\n {state.resultTextSourceC}\r\n
{state.scaleData.sourceCEnergianvandningBranslenTotal} TWh
\r\n
\r\n
\r\n
\r\n
\r\n {state.resultTextSourceB}\r\n
{state.scaleData.sourceBEnergianvandningTotal} TWh
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {((hasValues(state.sourceAEltillforselValues) && hasValues(state.sourceCEnergianvandningBranslenValues) && hasValues(state.sourceBEnergianvandningValues)) || delayed) && (\r\n \r\n )}\r\n {((hasValues(state.sourceAEltillforselValues) && hasValues(state.sourceCEnergianvandningBranslenValues) && hasValues(state.sourceBEnergianvandningValues)) || delayed) &&\r\n state.helpText && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nexport default EnergipresentationScales;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\nimport KalkylElefterfragan from './KalkylElefterfragan';\r\n\r\n$(document).ready(function () {\r\n if (document.getElementsByClassName('kalkyl-elefterfragan-block-react-container')) {\r\n let kalkylElefterfragan = document.getElementsByClassName('kalkyl-elefterfragan-block-react-container');\r\n\r\n for (let i = 0; i < kalkylElefterfragan.length; i++) {\r\n let currentBlock = kalkylElefterfragan[i];\r\n\r\n let mainText = currentBlock.getAttribute(\"data-main-text\");\r\n let helptextIndustryExisting = currentBlock.getAttribute(\"data-helptext-industry-existing\");\r\n let helptextIndustryUpcoming = currentBlock.getAttribute(\"data-helptext-industry-upcoming\");\r\n let helptextTransportLight = currentBlock.getAttribute(\"data-helptext-transport-light\");\r\n let helptextTransportHeavy = currentBlock.getAttribute(\"data-helptext-transport-heavy\");\r\n let helptextResidences = currentBlock.getAttribute(\"data-helptext-residences\");\r\n let helptextService = currentBlock.getAttribute(\"data-helptext-service\");\r\n\r\n let currentLanguage = currentBlock.getAttribute(\"data-current-language\");\r\n\r\n let buttonCalculate = currentBlock.getAttribute(\"data-button-calculate\");\r\n let buttonReset = currentBlock.getAttribute(\"data-button-reset\");\r\n\r\n let sumText = currentBlock.getAttribute(\"data-sum-text\");\r\n\r\n let blockReference = getAsIntOrZero(currentBlock.getAttribute(\"data-block-reference\"));\r\n\r\n let productionApiUrl = currentBlock.getAttribute(\"data-api-url\");\r\n let productionApiRequest = currentBlock.getAttribute(\"data-api-request\");\r\n\r\n fetchApiData('/api/ElectricityDemandApi/GetCounties', { id: blockReference, culture: currentLanguage })\r\n .then(apiData => {\r\n\r\n ReactDOM.render(, currentBlock);\r\n });\r\n }\r\n }\r\n});\r\n\r\nfunction getAsIntOrZero(valueString: string): number {\r\n let parsed = parseInt(valueString);\r\n return isNaN(parsed) ? 0 : parsed;\r\n}\r\n\r\nfunction decodeHtmlEntities(encodedString: string): string {\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(`
${encodedString}
`, 'text/html');\r\n return dom.body.textContent || \"\";\r\n}\r\n\r\nasync function fetchApiData(url: string, requestData: object) {\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(requestData)\r\n });\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok ' + response.statusText);\r\n }\r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('There was a problem with the fetch operation:', error);\r\n return null;\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport * as XLSX from 'xlsx';\r\nimport iKalkylElefterfragan from './iKalkylElefterfragan';\r\nimport iKalkylElefterfraganProps from './iKalkylElefterfraganProps';\r\nimport KalkylElefterfraganGraph from './KalkylElefterfraganGraph';\r\nimport KalkylElefterfraganTable from './KalkylElefterfraganTable';\r\nimport KalkylElefterfraganPopulationTable from './KalkylElefterfraganPopulationTable';\r\n\r\ninterface PopulationData {\r\n Rows: any[];\r\n Name: string;\r\n}\r\n\r\ninterface DemandData {\r\n Rows: any[];\r\n Name: string;\r\n}\r\n\r\nconst KalkylElefterfragan: React.FC = (props) => {\r\n const [changeValue, setChangeValue] = useState(1);\r\n const [demandData, setDemandData] = useState({ Rows: [], Name: '' });\r\n const [originalDemandData, setOriginalDemandData] = useState({ Rows: [], Name: '' });\r\n const [factorData, setFactorData] = useState({});\r\n const [unit, setUnit] = useState('GWh');\r\n const [productionData, setProductionData] = useState('');\r\n const [populationData, setPopulationData] = useState({ Rows: [], Name: '' });\r\n const [originalPopulationData, setOriginalPopulationData] = useState({ Rows: [], Name: '' });\r\n\r\n let initialValues: iKalkylElefterfragan = {\r\n props: props,\r\n showResult: false,\r\n isCleared: true,\r\n isCalculated: false,\r\n isValid: false,\r\n\r\n county: props.countyDefaultValue,\r\n\r\n installedEffectMin: 1,\r\n installedEffectMax: 999,\r\n installedEffectIsValid: false,\r\n installedEffectIsFocused: false,\r\n isLoading: false,\r\n };\r\n\r\n const [state, setState] = useState(initialValues);\r\n const [selectedCountyId, setSelectedCountyId] = useState(state.county);\r\n const [selectedCountyName, setSelectedCountyName] = useState(\"\");\r\n\r\n const helpTextMap = {\r\n 'Industri, befintlig': props.helptextIndustryExisting,\r\n 'Industri, utökad och kommande etableringar': props.helptextIndustryUpcoming,\r\n 'Lätta vägtransporter': props.helptextTransportLight,\r\n 'Tunga vägtransporter': props.helptextTransportHeavy,\r\n 'Bostäder': props.helptextResidences,\r\n 'Service': props.helptextService,\r\n };\r\n\r\n useEffect(() => {\r\n const initialCounty = props.counties.find(county => county.Id === state.county);\r\n if (initialCounty) {\r\n setSelectedCountyName(initialCounty.Text);\r\n }\r\n }, [props.counties, state.county]);\r\n\r\n\r\n const convertProductionData = (production) => {\r\n if (unit.toLowerCase() === 'gwh') {\r\n return parseInt(production) / 1000;\r\n } else if (unit.toLowerCase() === 'twh') {\r\n return parseInt(production) / 1000000;\r\n }\r\n\r\n return parseInt(production);\r\n }\r\n\r\n const getChartData = (production, demand) => {\r\n let seriesObject2;\r\n const series: { name: string, data: number[] }[] = [];\r\n const productionData = {\r\n name: 'Elproduktion i länet, 2022',\r\n data: [convertProductionData(production)],\r\n }\r\n series.push(productionData);\r\n\r\n demand.Rows.forEach(row => {\r\n const lastCell = row.Cells[row.Cells.length - 1];\r\n const firstCell = row.Cells[0];\r\n\r\n if (firstCell.StringValue) {\r\n const name = firstCell.StringValue;\r\n const values = row.Cells.slice(1, 4).map(cell => {\r\n const value = parseFloat(cell.NumberValue);\r\n return value;\r\n });\r\n\r\n const valuesUpperRange = row.Cells.slice(1, 4).map(cell => {\r\n let value = parseFloat(cell.NumberValueUpperRange);\r\n if (value) {\r\n value = (parseFloat(cell.NumberValueUpperRange) - parseFloat(cell.NumberValue));\r\n }\r\n return value;\r\n \r\n });\r\n\r\n\r\n const seriesObject = {\r\n name: name,\r\n data: [0, ...values]\r\n };\r\n\r\n const seriesObjectUpperRange = {\r\n name: `${name} spann övre`,\r\n data: [0, ...valuesUpperRange]\r\n };\r\n\r\n series.push(seriesObject);\r\n series.push(seriesObjectUpperRange);\r\n\r\n }\r\n });\r\n return series;\r\n };\r\n\r\n const combineData = data => {\r\n let combinedData = [];\r\n\r\n combinedData.push(data.find(item => item.name === \"Elproduktion i länet, 2022\"));\r\n combinedData.push(data.find(item => item.name === \"Industri, befintlig spann övre\"));\r\n combinedData.push(data.find(item => item.name === \"Industri, befintlig\"));\r\n combinedData.push(data.find(item => item.name === \"Industri, utökad och kommande etableringar\"));\r\n\r\n let transportData = data.filter(item => item.name.includes(\"vägtransporter\"));\r\n if (transportData.length > 0) {\r\n let combinedTransport = {\r\n name: \"Vägtransporter\",\r\n data: transportData.reduce((acc, curr) => {\r\n curr.data.forEach((value, index) => {\r\n acc[index] = (acc[index] || 0) + value;\r\n });\r\n return acc;\r\n }, [0, 0, 0, 0])\r\n };\r\n combinedData.push(combinedTransport);\r\n }\r\n\r\n let housingAndServiceData = data.filter(item => item.name.includes(\"Bostäder\") || item.name.includes(\"Service\"));\r\n if (housingAndServiceData.length > 0) {\r\n let combinedHousingAndService = {\r\n name: \"Bostäder och Service\",\r\n data: housingAndServiceData.reduce((acc, curr) => {\r\n curr.data.forEach((value, index) => {\r\n acc[index] = (acc[index] || 0) + value;\r\n });\r\n return acc;\r\n }, [0, 0, 0, 0])\r\n };\r\n combinedData.push(combinedHousingAndService);\r\n }\r\n\r\n return combinedData.concat(data.filter(item => !item.name.includes(\"Transportsektorn\") && item.name.includes(\"Bostäder\") && item.name.includes(\"Service\")));\r\n };\r\n\r\n const handleExport = () => {\r\n const wb = XLSX.utils.book_new();\r\n wb.Props = {\r\n Title: \"Framtida elefterfrågan\",\r\n Subject: \"Elanvändning\",\r\n CreatedDate: new Date()\r\n };\r\n\r\n const demandSheetData = demandData.Rows.map(row => row.Cells.map(cell => {\r\n let value = cell.NumberValue;\r\n let valueUpperRange = cell.NumberValueUpperRange;\r\n if (value === 0) {\r\n value = '';\r\n }\r\n if (valueUpperRange && valueUpperRange > value) {\r\n value = `${value}-${valueUpperRange}`;\r\n }\r\n\r\n return cell.StringValue || value;\r\n }));\r\n\r\n const sumRow = [\"Summa\"];\r\n for (let colIndex = 1; colIndex < demandSheetData[0].length - 1; colIndex++) {\r\n let minSum = 0, maxSum = 0;\r\n let hasRange = false;\r\n\r\n demandSheetData.slice(1).forEach(row => {\r\n const value = row[colIndex];\r\n\r\n if (value) {\r\n if (typeof value === \"string\" && value.includes(\"-\")) {\r\n const [min, max] = value.split(\"-\").map(parseFloat);\r\n minSum += min;\r\n maxSum += max;\r\n hasRange = true;\r\n } else {\r\n const numberValue = parseFloat(value) || 0;\r\n minSum += numberValue;\r\n maxSum += numberValue;\r\n }\r\n }\r\n });\r\n\r\n sumRow.push(hasRange ? `${minSum}-${maxSum}` : (minSum === 0 ? \"\" : minSum.toString()));\r\n }\r\n sumRow.push(unit);\r\n demandSheetData.push(sumRow);\r\n\r\n const populationSheetData = populationData.Rows.map(row => row.Cells.map(cell => {\r\n let value = cell.NumberValue;\r\n if (value === 0) {\r\n value = '';\r\n } else {\r\n value = Math.round(cell.NumberValue);\r\n }\r\n return cell.StringValue || value;\r\n }));\r\n\r\n const combinedData = [\r\n [\"Län\", selectedCountyName],\r\n [],\r\n [\"Befolkningsmängd\"],\r\n ...populationSheetData,\r\n [],\r\n [\"Efterfrågan på el\"],\r\n ...demandSheetData,\r\n [],\r\n [\"Elproduktion i länet\"],\r\n [convertProductionData(productionData), unit]\r\n ];\r\n const combinedSheet = XLSX.utils.aoa_to_sheet(combinedData);\r\n\r\n XLSX.utils.book_append_sheet(wb, combinedSheet, \"Framtida elefterfrågan\");\r\n\r\n XLSX.writeFile(wb, 'kalkyl_elefterfragan_export.xlsx');\r\n };\r\n\r\n const handleClick = async () => {\r\n const selectedCounty = props.counties.find(county => county.Id === selectedCountyId);\r\n if (selectedCounty) {\r\n setSelectedCountyName(selectedCounty.Text);\r\n setState(prevState => ({\r\n ...prevState,\r\n county: selectedCountyId,\r\n isLoading: true,\r\n }));\r\n\r\n try {\r\n const apiData = await props.fetchApiData(\"/api/ElectricityDemandApi/GetCountyData\", { countyId: selectedCountyId, id: props.blockReference, culture: props.currentLanguage });\r\n setDemandData(apiData.DemandData);\r\n setOriginalDemandData(apiData.DemandData);\r\n setFactorData(apiData.FactorData);\r\n setProductionData(apiData.ProductionData);\r\n setPopulationData(apiData.PopulationData);\r\n setOriginalPopulationData(apiData.PopulationData);\r\n setChangeValue(1);\r\n setUnit(apiData.DemandData.Rows[1].Cells[4].StringValue);\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n }));\r\n\r\n\r\n } catch (error) {\r\n console.error('Error fetching data on county change:', error);\r\n }\r\n }\r\n };\r\n\r\n const getText = (text) => {\r\n if (text === null || text === undefined || text === \"\") {\r\n return \"\"\r\n }\r\n\r\n return text;\r\n }\r\n\r\n const getNewValue = (changeValue, factor, value) => {\r\n return ((changeValue - 1) * value * factor) + value;\r\n }\r\n\r\n const findFactor = (name, year, factorData) => {\r\n const factorRow = factorData.Rows.find(row => row.Cells[0].StringValue === name);\r\n if (!factorRow) return 1;\r\n switch (year) {\r\n case '2022':\r\n return factorRow.Cells[1].NumberValue;\r\n case '2030':\r\n return factorRow.Cells[2].NumberValue;\r\n case '2045':\r\n return factorRow.Cells[3].NumberValue;\r\n default:\r\n return 1;\r\n }\r\n }\r\n\r\n const calculateData = (changeRate, newValue, index) => {\r\n const originalDemand = JSON.parse(JSON.stringify(originalDemandData));\r\n\r\n originalDemand.Rows.forEach((row, rowIndex) => {\r\n row.Cells.forEach((cell, cellIndex) => {\r\n if (cell.NumberValue && cellIndex > 1) {\r\n const name = row.Cells[0].StringValue;\r\n if (!name.includes('Industri')) {\r\n const year = originalDemand.Rows[0].Cells[cellIndex].StringValue;\r\n\r\n if (index === 2) {\r\n const factor = findFactor(name, year, factorData);\r\n originalDemand.Rows[rowIndex].Cells[cellIndex].NumberValue = getNewValue(changeRate, factor, cell.NumberValue);\r\n originalDemand.Rows[rowIndex].Cells[3].NumberValue = demandData.Rows[rowIndex].Cells[3].NumberValue;\r\n } else if (index === 3) {\r\n const factor = findFactor(name, year, factorData);\r\n originalDemand.Rows[rowIndex].Cells[cellIndex].NumberValue = getNewValue(changeRate, factor, cell.NumberValue);\r\n originalDemand.Rows[rowIndex].Cells[2].NumberValue = demandData.Rows[rowIndex].Cells[2].NumberValue;\r\n } else {\r\n const factor = findFactor(name, year, factorData);\r\n originalDemand.Rows[rowIndex].Cells[cellIndex].NumberValue = getNewValue(changeRate, factor, cell.NumberValue);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n const originalPopulation = JSON.parse(JSON.stringify(originalPopulationData));\r\n\r\n originalPopulation.Rows[1].Cells.forEach((cell, cellIndex) => {\r\n if (cell.NumberValue && cellIndex > 1) {\r\n const year = originalDemand.Rows[0].Cells[cellIndex].StringValue;\r\n\r\n if (index === 2) {\r\n originalPopulation.Rows[1].Cells[cellIndex].NumberValue = newValue;\r\n originalPopulation.Rows[1].Cells[3].NumberValue = populationData.Rows[1].Cells[3].NumberValue;\r\n } else if (index === 3) {\r\n originalPopulation.Rows[1].Cells[cellIndex].NumberValue = newValue;\r\n originalPopulation.Rows[1].Cells[2].NumberValue = populationData.Rows[1].Cells[2].NumberValue;\r\n } else {\r\n originalPopulation.Rows[1].Cells[cellIndex].NumberValue = newValue;\r\n }\r\n }\r\n });\r\n\r\n setDemandData(originalDemand);\r\n setPopulationData(originalPopulation);\r\n\r\n };\r\n\r\n const handlePopulationInputChange = (value: string, cell: number) => {\r\n const originalPopulation = JSON.parse(JSON.stringify(originalPopulationData)).Rows[1].Cells[cell].NumberValue;\r\n const changeRate = Math.round(parseInt(value)) / originalPopulation;\r\n\r\n calculateData(changeRate, value, cell);\r\n };\r\n\r\n const handleDemandInputChange = (value: string, cell: number, row: number) => {\r\n const demand = JSON.parse(JSON.stringify(demandData));\r\n demand.Rows[row + 1].Cells[cell].NumberValue = value;\r\n setDemandData(demand);\r\n\r\n const originalDemand = JSON.parse(JSON.stringify(originalDemandData));\r\n originalDemand.Rows[row + 1].Cells[cell].NumberValue = value;\r\n setOriginalDemandData(originalDemand);\r\n };\r\n\r\n const handleCountyChange = (event: React.ChangeEvent) => {\r\n setSelectedCountyId(Number(event.target.value));\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n {state.isLoading && (\r\n
\r\n
\r\n
\r\n )}\r\n {populationData && populationData.Rows.length > 0 && (\r\n
\r\n

Befolkningsmängd

\r\n
\r\n \r\n
\r\n
\r\n )}\r\n {demandData && demandData.Rows.length > 0 && (\r\n
\r\n

{demandData.Name}

\r\n
\r\n \r\n
\r\n
\r\n )}\r\n {demandData && demandData.Rows.length > 0 && (\r\n
\r\n

Diagram

\r\n
\r\n \r\n
\r\n
\r\n )}\r\n\r\n {demandData && demandData.Rows.length > 0 && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n\r\n {demandData.Rows.length === 0 && demandData.Rows.length === 0 && (\r\n
\r\n

Välj ett län i listan ovan för att hämta data om framtida elefterfrågan

\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default KalkylElefterfragan;\r\n","import * as React from 'react';\r\nimport Highcharts from 'highcharts';\r\nimport HighchartsReact from 'highcharts-react-official';\r\nimport patternFill from 'highcharts/modules/pattern-fill';\r\n\r\npatternFill(Highcharts);\r\n\r\ninterface SeriesData {\r\n name: string;\r\n data: number[];\r\n color?: string;\r\n}\r\n\r\ninterface KalkylElefterfraganGraphProps {\r\n series: SeriesData[];\r\n unit: string;\r\n}\r\n\r\nconst KalkylElefterfraganGraph: React.FC = ({ series, unit }) => {\r\n const colors = [\r\n \"#BBB5AB\", // Lera alt 3\r\n \"#C1DEBA\", // Grönska alt 1\r\n \"#C1DEBA\", // Grönska alt 1\r\n \"#7F1F10\", // Tegel alt 4\r\n \"#F6AA72\", // Tegel alt 3\r\n \"#006875\", // Hav\r\n \"#EF7B44\", // Tegel alt 2\r\n ];\r\n\r\n const seriesWithPatterns = series.map((item, seriesIndex) => ({\r\n ...item,\r\n data: item.data.map((point, categoryIndex) => {\r\n if (seriesIndex === 1) { \r\n return {\r\n y: point,\r\n color: {\r\n pattern: {\r\n path: {\r\n d: 'M 0 0 L 10 10 M 9 -1 L 11 1 M -1 9 L 1 11',\r\n strokeWidth: 2,\r\n backgroundColor: \"#C1DEBA\",\r\n stroke: \"#50B26C\",\r\n },\r\n width: 8,\r\n height: 8,\r\n backgroundColor: \"#C1DEBA\",\r\n color: item.color || colors[seriesIndex % colors.length],\r\n }\r\n },\r\n };\r\n }\r\n return { y: point, color: item.color || colors[seriesIndex % colors.length] };\r\n }),\r\n color: item.color || colors[seriesIndex % colors.length],\r\n showInLegend: item.name === 'Industri, befintlig spann övre' ? false : true,\r\n }));\r\n\r\n const options = {\r\n chart: {\r\n type: 'column',\r\n height: 500,\r\n events: {\r\n render: function () {\r\n const chart = this;\r\n\r\n chart.legend.allItems.forEach((series) => {\r\n const legendGroup = series.legendItem.group?.element;\r\n\r\n if (legendGroup) {\r\n legendGroup.addEventListener('mouseenter', () => {\r\n series.setState('hover');\r\n if (series.name != 'Industri, befintlig') {\r\n chart.series.find(s => s.name === 'Industri, befintlig spann övre').setState('inactive');\r\n } else {\r\n chart.series.find(s => s.name === 'Industri, befintlig spann övre').setState('hover');\r\n }\r\n });\r\n\r\n legendGroup.addEventListener('mouseleave', () => {\r\n series.setState('normal');\r\n chart.series.find(s => s.name === 'Industri, befintlig spann övre').setState('normal');\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n },\r\n credits: {\r\n enabled: false,\r\n },\r\n title: {\r\n text: '',\r\n align: 'left',\r\n style: {\r\n fontSize: \"1.7em\",\r\n },\r\n },\r\n xAxis: {\r\n labels: {\r\n style: {\r\n fontSize: \"1.7em\",\r\n },\r\n step: 1,\r\n },\r\n categories: ['Elproduktion i länet, 2022', 'Efterfrågan på el, 2022', 'Efterfrågan på el, 2030', 'Efterfrågan på el, 2045']\r\n },\r\n yAxis: {\r\n min: 0,\r\n title: {\r\n text: unit,\r\n style: {\r\n fontSize: \"1.7em\",\r\n }\r\n },\r\n labels: {\r\n format: '{value}',\r\n style: {\r\n fontSize: \"1.7em\",\r\n }\r\n },\r\n stackLabels: {\r\n enabled: false,\r\n style: {\r\n fontSize: \"1.7em\",\r\n }\r\n }\r\n },\r\n legend: {\r\n align: 'center',\r\n x: 0,\r\n verticalAlign: 'bottom',\r\n y: 0,\r\n floating: false,\r\n backgroundColor: Highcharts.defaultOptions.legend.backgroundColor || 'white',\r\n borderColor: '#CCC',\r\n borderWidth: 0,\r\n shadow: false,\r\n itemStyle: {\r\n fontSize: \"1.7em\",\r\n }\r\n },\r\n tooltip: {\r\n style: {\r\n fontSize: \"1.7rem\",\r\n },\r\n formatter: function () {\r\n const seriesNamesToCombine = ['Industri, befintlig', 'Industri, befintlig spann övre'];\r\n const currentSeriesIndex = this.point.index; \r\n const chart = this.series.chart;\r\n\r\n if (seriesNamesToCombine.includes(this.series.name)) {\r\n const value = chart.series.find(s => s.name === 'Industri, befintlig')?.data[currentSeriesIndex]?.y || 0;\r\n const valueUpperRange = chart.series.find(s => s.name === 'Industri, befintlig spann övre')?.data[currentSeriesIndex]?.y || 0;\r\n const combinedValue = value + valueUpperRange;\r\n\r\n chart.series.find(s => s.name === 'Industri, befintlig spann övre').setState('hover');\r\n chart.series.find(s => s.name === 'Industri, befintlig').setState('hover');\r\n\r\n return `\\u25CF Industri, befintlig: ${value}${combinedValue > value ? `- ${combinedValue}` : ''} ${unit}`;\r\n } else {\r\n return `\\u25CF ${this.series.name}: ${parseFloat(this.y).toFixed(2)} ${unit}`;\r\n }\r\n },\r\n shared: false\r\n },\r\n plotOptions: {\r\n column: {\r\n stacking: 'normal',\r\n borderColor: '#332E24',\r\n borderWidth: 1,\r\n dataLabels: {\r\n enabled: false\r\n },\r\n states: {\r\n hover: {\r\n enabled: true,\r\n }\r\n }\r\n },\r\n series: {\r\n events: {\r\n legendItemClick: function () {\r\n const chart = this.chart;\r\n const upperRange = chart.series.find(s => s.name === 'Industri, befintlig spann övre');\r\n if (this.name === 'Industri, befintlig') {\r\n if (this.visible) {\r\n upperRange?.hide();\r\n } else {\r\n upperRange?.show();\r\n }\r\n }\r\n },\r\n }\r\n }\r\n },\r\n series: seriesWithPatterns\r\n };\r\n\r\n return ;\r\n};\r\n\r\nexport default KalkylElefterfraganGraph;\r\n","import React, { useState, useEffect } from 'react';\r\nimport HelpText from './HelpText';\r\n\r\ninterface Cell {\r\n StringValue?: string;\r\n NumberValue?: string;\r\n}\r\n\r\ninterface Row {\r\n Cells: Cell[];\r\n}\r\n\r\ninterface KalkylElefterfraganTableProps {\r\n data: { Rows: any[]; Name: string };\r\n handleDemandInputChange: (value: string, cell: number, row: number) => void;\r\n helpTexts: any;\r\n unit: string;\r\n}\r\n\r\nconst KalkylElefterfraganTable: React.FC = ({ data, handleDemandInputChange, helpTexts, unit }) => {\r\n useEffect(() => {\r\n setLocalData(data);\r\n }, [data]);\r\n\r\n const [localData, setLocalData] = useState(data);\r\n\r\n const rows = localData.Rows;\r\n const name = localData.Name;\r\n const [thead, ...tbody] = rows;\r\n\r\n const columnSums = Array.from({ length: thead.Cells.length }, () => 0);\r\n const columnSumsUpperRange = Array.from({ length: thead.Cells.length }, () => 0);\r\n tbody.forEach(row => {\r\n row.Cells.slice(1).forEach((cell, columnIndex) => {\r\n if (cell.NumberValue) {\r\n columnSums[columnIndex + 1] += parseFloat(cell.NumberValue);\r\n if (cell.NumberValueUpperRange && cell.NumberValueUpperRange != cell.NumberValue) {\r\n columnSumsUpperRange[columnIndex + 1] += parseFloat(cell.NumberValueUpperRange);\r\n } else {\r\n columnSumsUpperRange[columnIndex + 1] += parseFloat(cell.NumberValue);\r\n }\r\n }\r\n });\r\n });\r\n\r\n function useDebounce(callback: Function, delay: number) {\r\n const timeoutRef = React.useRef | null>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedCallback = (...args: any[]) => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n timeoutRef.current = setTimeout(() => {\r\n callback(...args);\r\n }, delay);\r\n };\r\n\r\n return debouncedCallback;\r\n }\r\n\r\n const debouncedHandleInputChange = useDebounce((newValue, cellIndex, rowIndex) => {\r\n handleDemandInputChange(newValue.replace(',', '.'), cellIndex, rowIndex)\r\n }, 600);\r\n\r\n\r\n const handleInputChange = (newValue: string, cellIndex: number, rowIndex: number) => {\r\n const updatedRows = rows.map((row, rIndex) => {\r\n if (rIndex === rowIndex + 1) {\r\n const updatedCells = row.Cells.map((cell, cIndex) => {\r\n if (cIndex === cellIndex) {\r\n return { ...cell, NumberValue: newValue };\r\n }\r\n return cell;\r\n });\r\n return { ...row, Cells: updatedCells };\r\n }\r\n return row;\r\n });\r\n setLocalData({ ...localData, Rows: updatedRows }); \r\n debouncedHandleInputChange(newValue, cellIndex, rowIndex);\r\n };\r\n\r\n const addThousandSeparators = (num: number): string => {\r\n const parts = num.toString().split('.');\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n if (parts.length > 1) {\r\n return parts.join('.');\r\n }\r\n return parts[0];\r\n };\r\n\r\n const hasHelpText = (key) => {\r\n return (key in helpTexts) && helpTexts[key].length > 0;\r\n };\r\n\r\n const handleClick = (e) => {\r\n e.target.select();\r\n };\r\n\r\n const handleKeyPress = (e) => {\r\n if (!/[0-9.,\\s]/.test(e.key)) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const handlePaste = (e) => {\r\n const pasteData = e.clipboardData.getData('text');\r\n if (!/^[0-9.,\\s]*$/.test(pasteData)) {\r\n e.preventDefault();\r\n }\r\n };\r\n return (\r\n
\r\n \r\n \r\n \r\n {thead.Cells.map((cell, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {tbody.map((row, rowIndex) => {\r\n const includesIndustrisektorn = row.Cells.some(cell => cell.StringValue && cell.StringValue.includes('Industri'));\r\n const isUpcoming = row.Cells.some(cell => cell.StringValue && cell.StringValue.includes('kommande'));\r\n\r\n return (\r\n \r\n {row.Cells.map((cell, cellIndex) => (\r\n \r\n ))}\r\n \r\n );\r\n })}\r\n \r\n \r\n {columnSums.slice(1).map((sum, index) => (\r\n \r\n ))}\r\n \r\n \r\n
\r\n {cell.StringValue ? cell.StringValue : ''}\r\n
\r\n \r\n {thead.Cells[cellIndex].StringValue}:\r\n \r\n {includesIndustrisektorn && isUpcoming && (cellIndex === 2 || cellIndex === 3) ? (\r\n handleInputChange(e.target.value, cellIndex, rowIndex)}\r\n onClick={handleClick}\r\n onKeyUp={handleKeyPress}\r\n onPaste={handlePaste}\r\n />\r\n ) : (\r\n <>\r\n {cell.StringValue ? cell.StringValue : addThousandSeparators(parseFloat(cell.NumberValue.toFixed(2)))}\r\n {cell.NumberValueUpperRange && parseFloat(cell.NumberValueUpperRange) !== parseFloat(cell.NumberValue) ? <>-
{addThousandSeparators(parseFloat(cell.NumberValueUpperRange.toFixed(2)))}\r\n : ''\r\n }\r\n
\r\n {hasHelpText(cell.StringValue) &&\r\n \r\n }\r\n \r\n )}\r\n {unit}\r\n
Summa\r\n \r\n {thead.Cells[index + 1].StringValue}:\r\n \r\n {index === columnSums.length - 2 ? unit : sum !== 0 ? addThousandSeparators(parseFloat(sum.toFixed(2))) : ''}\r\n {parseFloat(columnSumsUpperRange[index + 1].toFixed(2)) === parseFloat(sum.toFixed(2))\r\n ? ''\r\n : <>-
{addThousandSeparators(parseFloat(columnSumsUpperRange[index + 1].toFixed(2)))}\r\n }\r\n {\r\n\r\n {unit}\r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default KalkylElefterfraganTable;\r\n","import * as React from 'react';\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport iHelpText from './iHelpText';\r\n\r\nconst HelpText = (props: { helpText: string }) => {\r\n const helpTextRef = useRef(null);\r\n const helpIconRef = useRef(null);\r\n const wrapperRef = useRef(null);\r\n\r\n const initialValues: iHelpText = {\r\n helpText: props.helpText,\r\n showHelpText: false\r\n }\r\n const [state, setState] = useState(initialValues);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n state.showHelpText &&\r\n wrapperRef.current &&\r\n !wrapperRef.current.contains(event.target as Node)\r\n ) {\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n showHelpText: false,\r\n }));\r\n }\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if ((event.key === \"Enter\" || event.key === \" \") && document.activeElement === wrapperRef.current) {\r\n event.preventDefault();\r\n toggleHelpText();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n document.addEventListener(\"click\", handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener(\"click\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleKeyDown);\r\n };\r\n }, [state.showHelpText]);\r\n\r\n useEffect(() => {\r\n if (helpIconRef.current) {\r\n let iconRect = helpIconRef.current.getBoundingClientRect();\r\n let leftPosition = iconRect.left;\r\n\r\n let newState = { ...state };\r\n newState.left = leftPosition - 30;\r\n setState(newState);\r\n }\r\n }, [])\r\n\r\n const toggleHelpText = () => {\r\n let newState = { ...state };\r\n newState.showHelpText = !newState.showHelpText;\r\n setState(newState);\r\n }\r\n\r\n const getTextFromHtmlString = (htmlString: string): string => {\r\n const doc = new DOMParser().parseFromString(htmlString, \"text/html\");\r\n return doc.body.textContent || \"\";\r\n }\r\n\r\n return (\r\n \r\n \"Hjälpikon\"\r\n {state.showHelpText && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default HelpText;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\ninterface Cell {\r\n StringValue?: string;\r\n NumberValue?: string;\r\n}\r\n\r\ninterface Row {\r\n Cells: Cell[];\r\n}\r\n\r\ninterface TableData {\r\n Rows: Row[];\r\n Name: string;\r\n}\r\n\r\ninterface KalkylElefterfraganPopulationTableProps {\r\n data: { Rows: any[]; Name: string };\r\n originalData: { Rows: any[]; Name: string };\r\n value: number;\r\n handlePopulationInputChange: (value: string, cell: number) => void;\r\n}\r\n\r\nconst KalkylElefterfraganPopulationTable: React.FC = ({ data, handlePopulationInputChange, originalData }) => {\r\n useEffect(() => {\r\n setLocalData(data);\r\n }, [data]);\r\n\r\n const [localData, setLocalData] = useState(data);\r\n\r\n const rows = localData.Rows;\r\n const name = localData.Name;\r\n const [thead, ...tbody] = rows;\r\n\r\n function useDebounce(callback: Function, delay: number) {\r\n const timeoutRef = React.useRef | null>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedCallback = (...args: any[]) => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n timeoutRef.current = setTimeout(() => {\r\n callback(...args);\r\n }, delay);\r\n };\r\n\r\n return debouncedCallback;\r\n }\r\n\r\n const debouncedHandleInputChange = useDebounce((newValue, cellIndex) => {\r\n handlePopulationInputChange(newValue, cellIndex);\r\n }, 600);\r\n\r\n const parseThousandSeparatedValue = (formattedValue) => {\r\n if (formattedValue.trim() === '') {\r\n return ''; \r\n }\r\n return parseFloat(formattedValue.replace(/ /g, ''));\r\n };\r\n\r\n const handleInputChange = (newValue: string, cellIndex: number, rowIndex: number) => {\r\n const actualValue = parseThousandSeparatedValue(newValue);\r\n const updatedRows = rows.map((row, rIndex) => {\r\n if (rIndex === rowIndex + 1) {\r\n const updatedCells = row.Cells.map((cell, cIndex) => {\r\n if (cIndex === cellIndex) {\r\n return { ...cell, NumberValue: actualValue };\r\n }\r\n return cell;\r\n });\r\n return { ...row, Cells: updatedCells };\r\n }\r\n return row;\r\n });\r\n setLocalData({ ...localData, Rows: updatedRows });\r\n debouncedHandleInputChange(actualValue, cellIndex);\r\n };\r\n\r\n const addThousandSeparators = (num: number): string => {\r\n const parts = num.toString().split('.');\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n if (parts.length > 1) {\r\n return parts.join(',');\r\n }\r\n return parts[0];\r\n };\r\n\r\n const handleClick = (e) => {\r\n e.target.select();\r\n };\r\n\r\n const handleKeyPress = (e) => {\r\n if (!/[0-9.,\\s]/.test(e.key)) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const handlePaste = (e) => {\r\n const pasteData = e.clipboardData.getData('text');\r\n if (!/^[0-9.,\\s]*$/.test(pasteData)) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n return (\r\n
\r\n Angiven befolkningsmängd nedan är enligt prognos. Det finns dock en möjlighet att justera befolkningsmängd för 2030 respektive 2045 utifrån eget önskemål.\r\n \r\n \r\n \r\n {thead.Cells.map((cell, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n\r\n \r\n {tbody.map((row, rowIndex) => (\r\n \r\n {row.Cells.map((cell, cellIndex) => (\r\n \r\n ))}\r\n \r\n \r\n ))}\r\n \r\n
\r\n {cell.StringValue ? cell.StringValue : ''}\r\n
\r\n \r\n {thead.Cells[cellIndex].StringValue}:\r\n \r\n {originalData.Rows.length > 0 && (cellIndex === 2 || cellIndex === 3) ? (\r\n handleInputChange(e.target.value, cellIndex, rowIndex)}\r\n onClick={handleClick}\r\n onKeyUp={handleKeyPress}\r\n onPaste={handlePaste}\r\n />\r\n\r\n ) : (\r\n \r\n {cell.StringValue || addThousandSeparators(parseInt(cell.NumberValue || '0'))}\r\n \r\n )}\r\n invånare\r\n Invånare
\r\n
\r\n );\r\n};\r\n\r\nexport default KalkylElefterfraganPopulationTable;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport MobileTopBar from './MobileTopBar';\r\n\r\n$(document).ready(function () {\r\n if (document.getElementById('MobileTopBar')) {\r\n let mobileTopBar = document.getElementById('MobileTopBar');\r\n let langCode = mobileTopBar.getAttribute(\"data-lang-code\");\r\n let logoLink = mobileTopBar.getAttribute(\"data-logo-link\");\r\n let logoTitle = mobileTopBar.getAttribute(\"data-logo-title\");\r\n let searchLink = mobileTopBar.getAttribute(\"data-search-link\");\r\n let searchTitle = mobileTopBar.getAttribute(\"data-search-title\");\r\n let searchBoxId = mobileTopBar.getAttribute(\"data-search-box-id\");\r\n let searchLabelId = mobileTopBar.getAttribute(\"data-search-label-id\");\r\n let searchTerm = mobileTopBar.getAttribute(\"data-search-term\");\r\n let searchTermForm = mobileTopBar.getAttribute(\"data-search-term-form\");\r\n let searchProxyUrl = mobileTopBar.getAttribute(\"data-search-proxy-url\");\r\n let searchTags = mobileTopBar.getAttribute(\"data-search-tags\");\r\n\r\n ReactDOM.render(\r\n , document.getElementById(\"MobileTopBar\"));\r\n }\r\n});","import * as React from 'react';\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { getFullMenu, getSearchSuggestions } from './DataHelper';\r\nimport iMobileMenu, { iMobileMenuItem } from './iMobileMenu';\r\nimport { iMobileTopBar } from './iMobileTopBar';\r\nimport { iMobileTopBarProps } from './iMobileTopBarProps';\r\nimport MobileMenuItem from './MobileMenuItem';\r\nimport iAutocompleteResponse, { iAutocompleteHit } from './iAutocompleteResponse';\r\n\r\n\r\nconst initialValues: iMobileTopBar = {\r\n isMenuVisible: false,\r\n isSearchVisible: false,\r\n menu: {\r\n CurrentPageId: -1,\r\n //Items: [] as Array,\r\n Menu: {} as iMobileMenuItem,\r\n CurrentDepth: 0,\r\n menuLeftStyle: {\r\n left: \"0%\"\r\n }\r\n },\r\n menuIsLoading: false,\r\n showSearchSuggestions: false,\r\n searchSuggestions: null,\r\n searchTerm: \"\"\r\n}\r\n\r\nfunction useStateCallback(initialState) {\r\n const [state, setState] = useState(initialState);\r\n const cbRef = useRef(null);\r\n\r\n const setStateCallback = useCallback((state, callback) => {\r\n cbRef.current = callback;\r\n setState(state);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (cbRef.current) {\r\n cbRef.current(state);\r\n cbRef.current = null;\r\n }\r\n }, [state]);\r\n\r\n return [state, setStateCallback];\r\n}\r\n\r\nconst MobileTopBar = (props: iMobileTopBarProps) => {\r\n const [state, setState] = useStateCallback(initialValues);\r\n const ref = useRef(null);\r\n const searchBoxRef = useRef(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutsideSuggestion = (event) => {\r\n if (state.isSearchVisible && state.showSearchSuggestions) {\r\n let targetIsChild = false;\r\n\r\n if (event.target.id !== undefined && event.target.id !== \"\" && ref.current) {\r\n let targetElement = document.getElementById(event.target.id);\r\n\r\n if (!targetElement) {\r\n return;\r\n }\r\n\r\n let closestReference = targetElement.closest(\"#\" + ref.current.id);\r\n targetIsChild = closestReference !== undefined && closestReference !== null;\r\n }\r\n\r\n if (!targetIsChild) {\r\n let newState: iMobileTopBar = { ...state };\r\n newState.showSearchSuggestions = false;\r\n setState(newState);\r\n }\r\n }\r\n }\r\n\r\n document.addEventListener(\"click\", handleClickOutsideSuggestion);\r\n\r\n return () => {\r\n document.removeEventListener(\"click\", handleClickOutsideSuggestion);\r\n };\r\n }, [ref, state])\r\n\r\n const showMenu = () => {\r\n let newState = { ...state };\r\n newState.isMenuVisible = true;\r\n newState.isSearchVisible = false;\r\n loadMenu(newState);\r\n document.body.classList.add(\"mobile-menu-open\");\r\n }\r\n\r\n const hideMenu = () => {\r\n let newState = { ...state };\r\n newState.isMenuVisible = false;\r\n setState(newState);\r\n document.body.classList.remove(\"mobile-menu-open\");\r\n }\r\n\r\n const showSearch = () => {\r\n let newState: iMobileTopBar = { ...state };\r\n newState.isSearchVisible = true;\r\n newState.isMenuVisible = false;\r\n setState(newState);\r\n\r\n setTimeout(() => {\r\n searchBoxRef.current.focus();\r\n }, 150);\r\n }\r\n\r\n const hideSearch = () => {\r\n let newState = { ...state };\r\n newState.isSearchVisible = false;\r\n setState(newState);\r\n }\r\n\r\n const loadMenu = (newState) => {\r\n newState.menuIsLoading = true;\r\n setState(newState, (updatedState) => fetchData(updatedState));\r\n }\r\n\r\n const fetchData = (updatedState) => {\r\n getFullMenu((data: iMobileMenu) => {\r\n let newState = { ...updatedState };\r\n\r\n if (typeof data !== \"undefined\" && data !== null) {\r\n newState.menu.CurrentPageId = data.CurrentPageId;\r\n newState.menu.Menu = data.Menu;\r\n newState = setCurrentMenuDepth(newState, data.CurrentDepth);\r\n }\r\n\r\n newState.menuIsLoading = false;\r\n setState(newState);\r\n });\r\n };\r\n\r\n const setCurrentMenuDepth = (newState: iMobileTopBar, newDepth: number) => {\r\n newState.menu.CurrentDepth = newDepth;\r\n newState.menu.menuLeftStyle = {\r\n ...newState.menu.menuLeftStyle,\r\n left: (-(newDepth) * 100).toString() + \"%\"\r\n };\r\n\r\n return newState;\r\n }\r\n\r\n const updateActiveChain = (event: MouseEvent, currentPageId: number) => {\r\n }\r\n\r\n const showSuggestions = (event) => {\r\n let searchTerm = event.target.value;\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n searchTerm: searchTerm\r\n };\r\n });\r\n\r\n getSearchSuggestions(searchTerm, props.searchProxyUrl, props.searchTags, (data: iAutocompleteResponse) => {\r\n if (data && data.hits.length > 0) {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n searchSuggestions: data.hits,\r\n showSearchSuggestions: true\r\n };\r\n });\r\n } else {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n searchSuggestions: null,\r\n showSearchSuggestions: false\r\n };\r\n });\r\n }\r\n });\r\n }\r\n\r\n const changeSearchTerm = (newSearchTerm: string) => {\r\n let newState = { ...state };\r\n\r\n newState.showSearchSuggestions = false;\r\n newState.searchTerm = newSearchTerm;\r\n\r\n setState(newState);\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
{ state.isSearchVisible ? hideSearch() : showSearch() }}>\r\n
\r\n
\r\n
\r\n Sök\r\n
\r\n
\r\n
{ state.isMenuVisible ? hideMenu() : showMenu() }}>\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n Meny\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n {state.showSearchSuggestions && (\r\n
\r\n
    \r\n {state.searchSuggestions.map((suggestionItem: iAutocompleteHit, suggestionIndex: number) => {\r\n return (\r\n changeSearchTerm(suggestionItem.query)}>\r\n {suggestionItem.query}\r\n \r\n )\r\n })\r\n }\r\n
\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n );\r\n};\r\nexport default MobileTopBar;\r\n","import { iMobileTopBar } from \"./iMobileTopBar\";\r\n\r\n//export const getCurrentMenuItems = (callback) => {\r\n// try {\r\n// let ajax = fetch(\"/MobileMenu/GetCurrentMenuItems?url=\" + window.location.pathname, {\r\n// method: \"GET\",\r\n// headers: {\r\n// 'Accept': 'application/json',\r\n// 'Content-Type': 'application/json',\r\n// }\r\n// })\r\n// .then(response => response.json()\r\n// .then((json) => {\r\n\r\n// if (!response.ok) {\r\n// throw Error(\"Något gick fel: \" + json.ExceptionMessage);\r\n// }\r\n// else {\r\n// callback(json);\r\n// }\r\n// })\r\n// .catch((err) => {\r\n// console.error(\"Något gick fel: \", err);\r\n// callback();\r\n// })\r\n// )\r\n// }\r\n// catch (err) {\r\n// console.error(\"Något gick fel: \", err);\r\n// callback();\r\n// }\r\n//}\r\n\r\n//export const getChildMenuItems = (pageId, callback) => {\r\n// try {\r\n// let ajax = fetch(\"/MobileMenu/GetChildren?pageId=\" + pageId, {\r\n// method: \"GET\",\r\n// headers: {\r\n// 'Accept': 'application/json',\r\n// 'Content-Type': 'application/json',\r\n// }\r\n// })\r\n// .then(response => response.json()\r\n// .then((json) => {\r\n\r\n// if (!response.ok) {\r\n// throw Error(\"Något gick fel: \" + json.ExceptionMessage);\r\n// }\r\n// else {\r\n// callback(json);\r\n// }\r\n// })\r\n// .catch((err) => {\r\n// console.error(\"Något gick fel: \", err);\r\n// callback();\r\n// })\r\n// )\r\n// }\r\n// catch (err) {\r\n// console.error(\"Något gick fel: \", err);\r\n// callback();\r\n// }\r\n//}\r\n\r\n//export const getParentMenuItems = (pageId, callback) => {\r\n// try {\r\n// let ajax = fetch(\"/MobileMenu/GetParents?pageId=\" + pageId, {\r\n// method: \"GET\",\r\n// headers: {\r\n// 'Accept': 'application/json',\r\n// 'Content-Type': 'application/json',\r\n// }\r\n// })\r\n// .then(response => response.json()\r\n// .then((json) => {\r\n\r\n// if (!response.ok) {\r\n// throw Error(\"Något gick fel: \" + json.ExceptionMessage);\r\n// }\r\n// else {\r\n// callback(json);\r\n// }\r\n// })\r\n// .catch((err) => {\r\n// console.error(\"Något gick fel: \", err);\r\n// callback();\r\n// })\r\n// )\r\n// }\r\n// catch (err) {\r\n// console.error(\"Något gick fel: \", err);\r\n// callback();\r\n// }\r\n//}\r\n\r\nexport const getSearchSuggestions = (searchTerm, searchProxyUrl, searchTags, callback) => {\r\n try {\r\n let ajax = fetch(searchProxyUrl + \"/_autocomplete?prefix=\" + encodeURIComponent(searchTerm) + \"&size=10&tags=\" + encodeURIComponent(searchTags),\r\n {\r\n method: \"GET\",\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n }\r\n })\r\n .then(response => response.json()\r\n .then((json) => {\r\n if (!response.ok) {\r\n throw Error(\"Något gick fel: \" + json.ExceptionMessage);\r\n }\r\n else {\r\n callback(json);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(\"Något gick fel: \", err);\r\n callback();\r\n })\r\n )\r\n }\r\n catch (err) {\r\n console.error(\"Något gick fel: \", err);\r\n callback();\r\n }\r\n}\r\n\r\nexport const getFullMenu = (callback) => {\r\n try {\r\n let ajax = fetch(\"/MobileMenu/GetFullMenu?url=\" + window.location.pathname, {\r\n method: \"GET\",\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n }\r\n })\r\n .then(response => response.json()\r\n .then((json) => {\r\n if (!response.ok) {\r\n throw Error(\"Något gick fel: \" + json.ExceptionMessage);\r\n }\r\n else {\r\n callback(json);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(\"Något gick fel: \", err);\r\n callback();\r\n })\r\n )\r\n }\r\n catch (err) {\r\n console.error(\"Något gick fel: \", err);\r\n callback();\r\n }\r\n}","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport { iMobileMenuItem } from './iMobileMenu';\r\n\r\nconst initialValues = {\r\n isLoading: false,\r\n currentItem: {} as iMobileMenuItem,\r\n currentDepth: 0\r\n}\r\n\r\ninterface iMobileMenuItemProps {\r\n currentItem: iMobileMenuItem,\r\n currentPageId: number\r\n updateActiveChain: (event: MouseEvent, currentPageId: number) => void\r\n}\r\n\r\nconst MobileMenuItem = (props: iMobileMenuItemProps) => {\r\n const [state, setState] = useState(initialValues);\r\n\r\n useEffect(() => {\r\n let newState = { ...initialValues };\r\n newState.currentItem = props.currentItem;\r\n newState.isLoading = false;\r\n\r\n if (newState.currentItem.Id === props.currentPageId) {\r\n newState.currentItem.IsActive = true;\r\n props.updateActiveChain(null, props.currentPageId);\r\n }\r\n\r\n setState(newState);\r\n }, [props.currentItem]);\r\n\r\n const getIdForSubmenu = (item: iMobileMenuItem) => {\r\n return \"\";\r\n }\r\n\r\n const getClassesForLinkListItem = (item: iMobileMenuItem) => {\r\n let classes = \"forward _\" + item.MenuDepth;\r\n\r\n if (item.IsInActiveChain && !item.IsActive) {\r\n classes += \" active-chain\";\r\n }\r\n\r\n if (item.IsInActiveChain || item.IsVisible) {\r\n classes += \" mobileVisible\";\r\n }\r\n\r\n if (item.IsActive) {\r\n classes += \" active\";\r\n }\r\n\r\n if (item.IsQuickLink) {\r\n classes += \" quicklink\";\r\n }\r\n\r\n if (item.HaveChildren) {\r\n classes += \" collapseable\"\r\n }\r\n \r\n return classes\r\n }\r\n\r\n const getClassesForLinkAnchorItem = (item: iMobileMenuItem) => {\r\n let classes = \"\";\r\n\r\n if (item.IsInActiveChain) {\r\n classes += \" active-chain\";\r\n }\r\n\r\n if (item.HaveChildren) {\r\n classes += \" collapseable\"\r\n }\r\n\r\n return classes;\r\n }\r\n\r\n const toggleVisible = (event: MouseEvent, item: iMobileMenuItem) => {\r\n let newState = { ...state };\r\n let currentChild = newState.currentItem.Children.find((obj: iMobileMenuItem) => {\r\n return obj.Id === item.Id;\r\n });\r\n currentChild.IsVisible = !currentChild.IsVisible;\r\n\r\n setState(newState);\r\n }\r\n\r\n const updateActiveChain = (event: MouseEvent, currentPageId: number) => {\r\n let newState = { ...state };\r\n newState.currentItem.IsVisible = true;\r\n newState.currentItem.IsInActiveChain = true;\r\n setState(newState);\r\n\r\n props.updateActiveChain(event, currentPageId);\r\n }\r\n\r\n return (\r\n \r\n {state.currentItem.HaveChildren && (\r\n
    \r\n {\r\n state.currentItem.Children.map((childItem, childItemIndex) => {\r\n return (\r\n
  • \r\n \r\n {childItem.Name}\r\n \r\n {childItem.HaveChildren && (\r\n toggleVisible(event.nativeEvent, childItem)}>\r\n )}\r\n\r\n \r\n
  • \r\n );\r\n })\r\n }\r\n
\r\n )}\r\n
\r\n );\r\n};\r\nexport default MobileMenuItem;\r\n"],"sourceRoot":""}