{"version":3,"sources":["helpers/colors.js","helpers/consts.js","helpers/formatters.js","helpers/sqlHelper.js","actions/DataAction.js","reducers/initialStateData.js","reducers/DataReducer.js","actions/SettingsAction.js","reducers/SettingsReducer.js","reducers/RootReducer.js","store.js","helpers/d3plus.js","helpers/security.js","components/svg/MKLogo.js","components/Loading.js","components/svg/SVGIcon.js","components/nav/Nav.js","components/items/ContactUs.js","helpers/baseMapLayer.js","components/map/MapLegend.js","components/map/MapButton.js","components/map/MapControls.js","components/map/Map.js","components/search/Select.js","components/switch/SwitchControl.js","components/search/Search.js","components/map/InfoBox.js","components/map/StatsItem.js","components/map/StatsBox.js","components/items/RegionHeading.js","components/items/DatumSmall.js","components/map/MapTooltip.js","components/items/Source.js","components/items/SelectedItem.js","components/blocks/CarouselItem.js","components/nav/SubNavTabs.js","components/blocks/Introduction.js","components/items/ClearD3PlusContext.js","components/items/MiniScaleLegend.js","components/slides/regional-cluster/intro/AverageValuesPerClusters.js","components/blocks/ClusterGroupTabs.js","components/slides/regional-cluster/intro/ClustersProfile.js","components/items/MiniLegend.js","components/slides/regional-cluster/today/cluster/LaborMarketOutcomes.js","components/slides/regional-cluster/today/cluster/LaborMarketSupply.js","components/slides/regional-cluster/today/cluster/LaborMarketDemand.js","components/slides/regional-cluster/today/region/LaborMarketOutcomesRegion.js","components/slides/regional-cluster/today/region/CurrentSectorMix.js","components/slides/regional-cluster/outlook/cluster/LaborMarketDemand.js","components/slides/regional-cluster/outlook/cluster/LaborSkillShifts.js","components/slides/regional-cluster/outlook/cluster/ProjectedOccupationalChanges.js","components/slides/regional-cluster/outlook/region/LaborMarketDevelopment.js","components/slides/regional-cluster/outlook/region/ProjectedOccupational.js","views/map/RegionalCluster.js","components/slides/euwide/today/EUWideLaborDemand.js","components/slides/euwide/today/EUWideEmpRates.js","components/svg/SVGImage.js","components/slides/euwide/today/GeoConcentrationToday.js","components/slides/euwide/outlook/JobDelta.js","views/map/Employment.js","components/slides/occupational/OccEmploymentShare.js","views/map/Occupational.js","layouts/MapViewLayout.js","components/items/ExploreBtn.js","components/blocks/HomeSection.js","components/slides/home/CommunitiesPriorities.js","components/slides/home/EmployersPriorities.js","views/page/Home.js","views/page/About.js","layouts/PageViewLayout.js","layouts/LoginViewLayout.js","App.js","serviceWorker.js","index.js"],"names":["clusters_colors","choropleth_blue","choropleth_red","job_growth_colors","job_growth_short_colors","colorMapToArray","employment_rate_colors","employment_rate_short_colors","occupational_change_colors","occupational_change_short_colors","occupational_relative_colors","occupational_relative_short_colors","occupational_absolute_colors","occupational_absolute_short_colors","colorMap","Object","keys","map","c","matrixColors","occupational_tertiary_education","module","exports","CLUSTERS_COLORS_MAP","CLUSTERS_COLORS_ARRAY","EMPLOYMENT_RATE_COLORS_MAP","EMPLOYMENT_RATE_COLORS_ARRAY","JOB_GROWTH_COLORS_MAP","JOB_GROWTH_COLORS_ARRAY","OCCUPATIONAL_CHANGE_COLORS_MAP","OCCUPATIONAL_CHANGE_COLORS_ARRAY","OCCUPATIONAL_RELATIVE_COLORS_MAP","OCCUPATIONAL_RELATIVE_COLORS_ARRAY","OCCUPATIONAL_ABSOLUTE_COLORS_MAP","OCCUPATIONAL_ABSOLUTE_COLORS_ARRAY","MATRIX_COLORS","OCCUPATIONAL_CHANGE_COLORS_SHORT_ARRAY","EMPLOYMENT_RATE_COLORS_SHORT_ARRAY","OCCUPATIONAL_ABSOLUTE_COLORS_SHORT_ARRAY","JOB_GROWTH_COLORS_SHORT_ARRAY","OCCUPATIONAL_RELATIVE_COLORS_SHORT_ARRAY","TERTIARY_EDUCATION_MAP","TERTIARY_EDUCATION_ARRAY","LABOR_DEMAND_SUPPLY_ARRAY","views","REGIONAL_CLUSTER","EMPLOYMENT","OCCUPATIONAL","HOME","ABOUT","DATA","VIEWS","FILE_KEYS","CLUSTERS_REFERENCE","NACE_REFERENCE","ISCO_REFERENCE","NUTS3_SHAPES","COUNTRIES_REFERENCE","URBAN_REFERENCE","EMPLOYMENT_DATA","OCCUPATIONAL_DATA","OCCUPATIONAL_TOP10_CHANGES","OCCUPATIONAL_TOP10_SHARE","OCCUPATIONAL_EU","OCCUPATIONAL_CLUSTERS","METRO_STATS","NUTS3_PRESENT","NUTS3_FUTURE","CLUSTERS_AVG_PRESENT","NUTS3_TOP_OCCUPATIONS_FUTURE","MAPBOX_TOKEN","NAV","main","name","slug","icon","type","link","filter","isMap","largeName","subnav","IGNORE_SHAPES_IDS","FEATURED_REGIONS","NAV_FIXED_WHERE_SCROLL","EMPLOYMENT_FIELDS","today_job_growth","future_job_growth","today_employment_rate","future_employment_rate","OCCUPATIONAL_FIELDS","today_absolute","future_absolute","today_relative","future_relative","delta","EMPLOYMENT_NAMES","FUTURE_DISCLAIMER","escapeRegexCharacters","str","replace","normalizeString","normalize","toLowerCase","numberWithCommas","x","toString","removeDecimalsIfNotNeeded","parseFloat","toFixed","getMapLegendLabels","view","field","selected","resp","title","subtitle","split","shift","join","toPercentage","number","decimal","Math","round","getMapColorScale","colorPalette","indexOf","getLegendColorScale","defaultScale","cloneAndRenameObj","obj","renameFieldList","forEach","calculateSide","n","gap","abs","calculateDomain","min","max","isVertical","ratio","gapMin","gapMax","biggerGap","axisMin","getPropertiesNUTS3Object","d","t","geometry","centroid_x","centroid_y","id","cluster_id","metro_name","cluster_name","urban_name","country_name","hydrateLoadedData","state","hydratedQuery","fields","hydrated","data","toJoin","nuts3","nuts3_present","dimensions","clusters","urbans","metro_stats","countries","alaSQL","it","facts","properties","geojsonShapes","features","wellknown","parse","error","console","push","geojsonOptions","employment_data","isco","occupational_data","occupationalFields","rawJoin","f","buildSQLArrayString","items","item","isco_2_id","occupational_shares","occupational_clusters","occupational_eu","nuts3_top_occupations_future","clusters_avg","changed","updateSearch","key","temp","itemTemp","searchUpdated","isco_2_name","meta","isco_1_name","search","options","default","lat","lng","name_trans","metro_name_trans","i","setMapDataAction","entity","dispatch","payload","BASE_URL","window","FOW_BASE_URL","files_available","file","parser","group","cluster","color","r","trend","indicator","parseInt","occupation","loadDataAction","db","config","log","promise","getAlaSQLPromise","then","catch","defaultViewport","latitude","longitude","zoom","bearing","pitch","altitude","maxZoom","minZoom","maxPitch","minPitch","scrollZoom","touchRotate","transitionInterpolator","LinearInterpolator","transitionDuration","dragPan","touchAction","dataInitialState","geojson","style","styleOptions","paint","property","stops","OCCUPATIONAL_COLORS_ARRAY","viewport","legend","loading","loadingList","loadingMax","baseUrl","initialStateData","action","groupObject","newLoadingList","newState","length","mapStyle","legendItems","newZoom","zoomIn","centerParams","setTooltipDataAction","setSelectMapControlAction","clearGroup","setMapCenterAction","getBreakpoint","breakpoint","matchMedia","matches","isBigHeight","innerHeight","initialState","tooltipData","tooltipMetadata","width","innerWidth","height","isIE11","test","navigator","userAgent","hash","hashParts","section","legendOpen","statsOpen","switch","nav","open","settings","fixed","scrollY","openValue","parts","tempMap","createRootReducer","combineReducers","middlewares","thunk","labelConfig","fontColor","fontFamily","fontSize","fontWeight","axisConfig","duration","barConfig","stroke","strokeWidth","gridConfig","shapeConfig","tickSize","titleConfig","xConfig","yConfig","scale","y2Config","Bar","labelBounds","ix","s","value","diff","y","textAnchor","legendTooltip","body","footer","on","keyName","MKLogo","props","fill","fillRule","viewBox","className","xmlns","xmlnsXlink","ReactProgressCircle","appliedRadius","appliedStroke","percentage","size","normalizedRadius","circumference","PI","strokeDashoffset","cx","cy","strokeDasharray","Loading","this","list","progress","Component","connect","getViewBox","SVGIcon","getPath","Nav","hidden","onClickView","bind","onClickToggle","setNavOpen","e","preventDefault","history","info","setNavOpenAction","isMobile","isNotMap","linkHome","href","onClick","to","getButtonTypeClass","target","rel","withRouter","ContactUs","onClickLogout","cb","LocalForage","setItem","baseStyle","fromJS","MAP_STYLE","countryLabelStyle","LABEL_STYLE","country","cityLabelStyle","city","placeLabelStyle","place","MapLegend","toggleOpen","setLegendState","legendOptions","lo","backgroundColor","setLegendStateAction","MapButton","getIcon","onClickMapControl","setMapZoom","startOverMap","iconName","iconParams","MapControls","Map","mapRef","React","createRef","boundsLimits","minLat","minLng","maxLat","maxLng","hoverFilter","dataFormat","getGeoGLConfig","onMapHover","onViewportChange","calculateMapSizes","shapes","setTimeout","setDefaultViewportAction","sizes","results","GeoViewport","w","h","center","newViewport","setMapViewportAction","event","srcEvent","offsetX","offsetY","setTooltipData","direction","finalX","finalY","feature","find","source","mapData","selectedCluster","selectedRegion","selectedItem","isSelection","selectedFilter","mapSizes","mapLeftMargin","regularMapStyle","selectedMapStyle","marginLeft","ref","mapboxApiAccessToken","onHover","getSuggestionValue","suggestion","renderSuggestion","Select","getSuggestions","searchList","optionsKey","escapedValue","trim","cat","onChange","newValue","setState","onBlur","highlightedSuggestion","selectedItems","showSelect","suggestions","onSuggestionsFetchRequested","reason","onSuggestionsClearRequested","onSuggestionSelected","suggestionValue","suggestionIndex","sectionIndex","method","clearOnClick","inputProps","placeholder","onKeyPress","alwaysRenderSuggestions","focusInputOnSuggestionClick","highlightFirstSuggestion","SwitchControl","onOptionSelected","option","setSwitchMapControlAction","label","disabled","getSectionSuggestions","renderSectionTitle","Search","searchDefaultList","score","a","b","startsWith","kind","sort","selectedName","multiSection","InfoBox","setSettingsOpen","setSettingsOpenAction","occupationMeasure","measure_occ","StatsItem","StatsBox","setStatsState","selectedOccupation","iscoData","occ","employment_2018","employment_share_2018","net_job_change_2018_30_in_percent","clustersData","regionData","cd","number_of_regions_within_cluster","share_of_eu_population_within_cluster_2018_in_share","share_of_positive_job_growth_2018_30","region","nuts_3_region_population_2018_in_thousands","net_job_change_2018_30","setStatsStateAction","RegionHeading","metro","DatumSmall","MapTooltip","timeoutID","getExtraFieldSelected","prevProps","prevState","clearTimeout","datum","unit","extraFieldSelected","perspective_occ","share_occ","perspective","measure","left","top","Source","text","SelectedItem","getLabel","selectedRegional","CarouselItem","children","showSelected","SubNavTabs","navFixed","activeTab","Introduction","ClearD3PlusContext","d3plus","childContextTypes","PropTypes","object","MiniScaleLegend","labelLess","labelMore","colors","AverageValuesPerClusters","clusterData","fieldList","prepareData","scales","back","d3Max","d3Min","scaleQuantize","domain","range","createMatrixScale","createTextColorScale","formattedData","d3Nest","cluster_group_name","entries","cl","cluster_group_id","values","colSpan","rowSpan","share_EU_total","total_population_within_cluster_2018_in_m","description_of_cluster","ClusterGroupTabs","img","onClickTab","ClustersProfile","alt","src","MiniLegend","secondTitle","LaborMarketOutcomes","config1","config2","config3","config4","config5","createConfigs","nextProps","nextState","delayMS","clustersIds","filteredData","varFormatters","longerNames","longestStr","xMaxes","xMins","dataSets","idx","ceil","textWidth","finalData","fd","configs","dataSet","myDomain","chartConfigTemplate","groupBy","discrete","discreteCutoff","tooltipConfig","minSize","tickFormat","tick","labels","groupPadding","barPadding","BarChart","LaborMarketSupply","LaborMarketDemand","xMax","xMin","chartConfig","detectVisible","LaborMarketOutcomesRegion","config6","config7","config8","nuts3Data","selectedRegionID","nuts3Datum","n3","avgData","smallNuts3Data","CurrentSectorMix","barW","sign","LaborSkillShifts","reverse","ProjectedOccupationalChanges","LaborMarketDevelopment","nuts3_id","nuts3_future","ProjectedOccupational","net_job_growth_18_30_in_percent","trends","gMax","growing","dMin","declining","getChartConfig","RegionalCluster","EUWideLaborDemand","numEmp","year","annotations","Line","LinePlot","EUWideEmpRates","empRate","SVGImage","GeoConcentrationToday","JobDelta","metric","subtitle1","subtitle2","paragraph","mode","colorScale","scaleThreshold","occData","share","region_aggregated_jobs_gained_isco4","share_no_tertiary_education","tbody","sum","Treemap","Employment","launchDataAction","fieldSelected","OccEmploymentShare","selectedShare","mySubtitle","selectedOccId","targetYear","metricName","formatter","row","maxValue","ySort","Occupational","getFieldKey","getSelectedField","getSelectedFilter","MapViewLayout","ExploreBtn","HomeSection","explore","note","noteCmps","Array","isArray","CommunitiesPriorities","EmployersPriorities","onClickNext","onClickPrev","next","prev","Home","workersChart","colorsTertiaryEducation","homeBtns","noteTxt","btn","About","PageViewLayout","LoginViewLayout","password","handleChange","onSubmit","App","updateWindowDimensions","updateHash","handleScroll","isPageChange","getPageFromParams","page","addEventListener","location","URLSearchParams","get","setWindowSizeAction","setHashAction","scrollTo","oldHash","newHash","partsOld","partsNew","mustBeFixed","setNavStateAction","removeEventListener","Boolean","hostname","match","ReactGA","initialize","pageview","pathname","store","preloadedState","createStore","compose","applyMiddleware","configureStore","rendered","document","getElementById","ReactDOM","render","warn","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.f0f90c57.chunk.js","sourcesContent":["\n\nconst clusters_colors = {\n \"Aging population regions\": \"#e74d6a\",\n \"Agriculture-based regions\": \"#959595\",\n \"Diversified metros\": \"#3e98b2\",\n \"Diversified non-metros\": \"#b2c0fd\",\n \"Educated and emigrating areas\": \"#fd9e86\",\n \"High tech manufacturing centers\": \"#ade6ef\",\n \"Industrial bases\": \"#d8a1c1\",\n \"Megacities\": \"#0a1c2a\",\n \"Public sector-led regions\": \"#dbdbdb\",\n \"Service-based economies\": \"#1641e5\",\n \"Superstar hubs\": \"#00a8fa\",\n \"Tourism havens\": \"#b2c0fd\",\n \"Trailing opportunity regions\": \"#ebebeb\",\n \"\": \"rgba(255,255,255,0)\"\n};\n\nconst choropleth_blue = [\n '#71d2f1',\n '#69c4e3',\n '#60b7d5',\n '#58aac7',\n '#509db9',\n '#4890ac',\n '#40849e',\n '#397791',\n '#316b84',\n '#295f78',\n '#22546b',\n '#1b485f',\n '#133d53',\n '#0c3247',\n '#05283c',\n '#001e31'\n];\n\nconst choropleth_red = [\n '#fcedef',\n '#fcdde0',\n '#fbcdd0',\n '#fabcc1',\n '#f8acb2',\n '#f59ca4',\n '#f28b95',\n '#ee7987',\n '#ea6779',\n '#e5546c'\n];\n\nconst job_growth_colors = {\n '<=-15': choropleth_blue[0],\n '-15 to -10': choropleth_blue[2],\n '-10 to -5': choropleth_blue[4],\n '-5 to 0': choropleth_blue[5],\n '0 to 5': choropleth_blue[6],\n '5 to 10': choropleth_blue[8],\n '>=10': choropleth_blue[9]\n}\n\nconst job_growth_short_colors = colorMapToArray({\n '<-20%': choropleth_blue[0],\n '-20 to -10%': choropleth_blue[2],\n '-10 to 0%': choropleth_blue[5],\n '0 to 10%': choropleth_blue[7],\n '>10%': choropleth_blue[9]\n});\n\nconst employment_rate_colors = {\n '<=50': choropleth_blue[0],\n '50 to 55': choropleth_blue[1],\n '55 to 60': choropleth_blue[2],\n '60 to 65': choropleth_blue[4],\n '65 to 70': choropleth_blue[5],\n '70 to 75': choropleth_blue[6],\n '75 to 80': choropleth_blue[7],\n '80 to 85': choropleth_blue[8],\n '>=85': choropleth_blue[9]\n};\n\nconst employment_rate_short_colors = colorMapToArray({\n '<50%': choropleth_blue[0],\n '50 to 60%': choropleth_blue[1],\n '60 to 70%': choropleth_blue[4],\n '70 to 80%': choropleth_blue[6],\n '80 to 90%': choropleth_blue[8],\n '>=90%': choropleth_blue[9]\n});\n\nconst occupational_change_colors = {\n '<=-50': choropleth_red[7],\n '-50 to -25': choropleth_red[6],\n '-25 to -20': choropleth_red[5],\n '-20 to -15': choropleth_red[4],\n '-15 to -10': choropleth_red[3],\n '-10 to -5': choropleth_red[2],\n '-5 to 0': choropleth_red[1],\n '0 to 2.5': choropleth_blue[2],\n '2.5 to 5': choropleth_blue[3],\n '5 to 7.5': choropleth_blue[4],\n '7.5 to 10': choropleth_blue[5],\n '10 to 15': choropleth_blue[6],\n '15 to 20': choropleth_blue[7],\n '20 to 25': choropleth_blue[8],\n '25 to 50': choropleth_blue[9],\n '>=50': choropleth_blue[10]\n}\n\nconst occupational_change_short_colors = colorMapToArray({\n '<=-50': choropleth_red[7],\n '-50 to -10': choropleth_red[4],\n '-10 to 0': choropleth_red[2],\n '0 to 10': choropleth_blue[3],\n '10 to 50': choropleth_blue[7],\n '>=50': choropleth_blue[10]\n});\n\nconst occupational_relative_colors = {\n '<=0.25': choropleth_blue[0],\n '0.25 to 0.5': choropleth_blue[1],\n '0.5 to 0.75': choropleth_blue[2],\n '0.75 to 1': choropleth_blue[3],\n '1 to 1.5': choropleth_blue[4],\n '1.5 to 2': choropleth_blue[5],\n '3 to 4': choropleth_blue[6],\n '4 to 5': choropleth_blue[7],\n '2 to 3': choropleth_blue[8],\n '5 to 7.5': choropleth_blue[9],\n '7.5 to 10': choropleth_blue[10],\n '10 to 12.5': choropleth_blue[11],\n '12.5 to 15': choropleth_blue[12],\n '15 to 17.5': choropleth_blue[13],\n '17.5 to 20': choropleth_blue[14],\n '>=20': choropleth_blue[15]\n};\n\nconst occupational_relative_short_colors = colorMapToArray({\n '<=0.25': choropleth_blue[0],\n '0.25 to 0.5': choropleth_blue[2],\n '0.5 to 1': choropleth_blue[5],\n '1 to 5': choropleth_blue[7],\n '5 to 10': choropleth_blue[9],\n '10 to 20': choropleth_blue[12],\n '>=20': choropleth_blue[15]\n});\n\nconst occupational_absolute_colors = {\n '<=0.5': choropleth_blue[0],\n '0.5 to 1': choropleth_blue[1],\n '1 to 2.5': choropleth_blue[2],\n '2.5 to 5': choropleth_blue[3],\n '5 to 7.5': choropleth_blue[4],\n '7.5 to 10': choropleth_blue[5],\n '10 to 12.5': choropleth_blue[6],\n '12.5 to 15': choropleth_blue[7],\n '15 to 17.5': choropleth_blue[8],\n '17.5 to 20': choropleth_blue[9],\n '20 to 30': choropleth_blue[10],\n '30 to 40': choropleth_blue[11],\n '40 to 50': choropleth_blue[12],\n '50 to 60': choropleth_blue[13],\n '60 to 70': choropleth_blue[14],\n '>=70': choropleth_blue[15]\n};\n\nconst occupational_absolute_short_colors = colorMapToArray({\n '<10': choropleth_blue[3],\n '10 to 30': choropleth_blue[7],\n '30 to 50': choropleth_blue[11],\n '50 to 70': choropleth_blue[13],\n '>=70': choropleth_blue[15]\n});\n\nfunction colorMapToArray(colorMap){\n return Object.keys(colorMap).map(c => [c,colorMap[c]])\n}\n\nconst matrixColors = [\n \"#ddd\",\n choropleth_blue[0],\n choropleth_blue[3],\n choropleth_blue[7],\n choropleth_blue[11]\n];\n\nconst occupational_tertiary_education = {\n '≥90': choropleth_blue[11],\n '60 to 90': choropleth_blue[6],\n '30 to 60': choropleth_blue[3],\n '≤30': choropleth_blue[0]\n};\n\nconst laborDemandSupply = {\n 'Job lost': \"#051C2C\",\n 'Jobs gained': \"#00A9F4\",\n 'Net change': \"#1F40E6\",\n 'Expected change in working age gap': \"#A9E5EF\"\n};\n\n\n\nmodule.exports = {\n CLUSTERS_COLORS_MAP: clusters_colors,\n CLUSTERS_COLORS_ARRAY: colorMapToArray(clusters_colors),\n EMPLOYMENT_RATE_COLORS_MAP: employment_rate_colors,\n EMPLOYMENT_RATE_COLORS_ARRAY: colorMapToArray(employment_rate_colors),\n JOB_GROWTH_COLORS_MAP: job_growth_colors,\n JOB_GROWTH_COLORS_ARRAY: colorMapToArray(job_growth_colors),\n OCCUPATIONAL_CHANGE_COLORS_MAP: occupational_change_colors,\n OCCUPATIONAL_CHANGE_COLORS_ARRAY: colorMapToArray(occupational_change_colors),\n OCCUPATIONAL_RELATIVE_COLORS_MAP: occupational_relative_colors,\n OCCUPATIONAL_RELATIVE_COLORS_ARRAY: colorMapToArray(occupational_relative_colors),\n OCCUPATIONAL_ABSOLUTE_COLORS_MAP: occupational_absolute_colors,\n OCCUPATIONAL_ABSOLUTE_COLORS_ARRAY: colorMapToArray(occupational_absolute_colors),\n MATRIX_COLORS: matrixColors,\n\n OCCUPATIONAL_CHANGE_COLORS_SHORT_ARRAY: occupational_change_short_colors,\n EMPLOYMENT_RATE_COLORS_SHORT_ARRAY: employment_rate_short_colors,\n OCCUPATIONAL_ABSOLUTE_COLORS_SHORT_ARRAY: occupational_absolute_short_colors,\n JOB_GROWTH_COLORS_SHORT_ARRAY: job_growth_short_colors,\n OCCUPATIONAL_RELATIVE_COLORS_SHORT_ARRAY: occupational_relative_short_colors,\n\n TERTIARY_EDUCATION_MAP: occupational_tertiary_education,\n TERTIARY_EDUCATION_ARRAY: colorMapToArray(occupational_tertiary_education),\n LABOR_DEMAND_SUPPLY_ARRAY: colorMapToArray(laborDemandSupply)\n}\n","const views = {\n REGIONAL_CLUSTER: 'regional-cluster',\n EMPLOYMENT: 'employment',\n OCCUPATIONAL: 'occupational',\n HOME: 'home',\n ABOUT: 'about',\n DATA: 'data'\n}\nmodule.exports = {\n VIEWS: views,\n FILE_KEYS: {\n CLUSTERS_REFERENCE: 'clusters',\n NACE_REFERENCE: 'nace',\n ISCO_REFERENCE: 'isco',\n NUTS3_SHAPES: 'nuts3',\n COUNTRIES_REFERENCE: 'countries',\n URBAN_REFERENCE: 'urbans',\n EMPLOYMENT_DATA: 'employment_data',\n OCCUPATIONAL_DATA: 'occupational_data',\n OCCUPATIONAL_TOP10_CHANGES: 'occupational_changes',\n OCCUPATIONAL_TOP10_SHARE: 'occupational_shares',\n OCCUPATIONAL_EU: 'occupational_eu',\n OCCUPATIONAL_CLUSTERS: 'occupational_clusters',\n METRO_STATS: 'metro_stats',\n NUTS3_PRESENT: 'nuts3_present',\n NUTS3_FUTURE: 'nuts3_future',\n CLUSTERS_AVG_PRESENT: 'clusters_avg',\n NUTS3_TOP_OCCUPATIONS_FUTURE: 'nuts3_top_occupations_future',\n },\n MAPBOX_TOKEN: \"pk.eyJ1IjoicGFsYW1hZ28iLCJhIjoiY2s2Y2xicmNnMGxvNjNsczB0bnN5cnhzYSJ9.yIahM0bJCM7kAjuKt061Og\",\n NAV:{\n main: [\n {\n name: \"Introduction\",\n slug: \"home\",\n icon: false,\n type: \"view\",\n link: `/page/${views.HOME}`\n },\n {\n name: \"EU-wide perspective\",\n slug: views.EMPLOYMENT,\n icon: false,\n type: \"view\",\n link: `/map/${views.EMPLOYMENT}/intro`,\n filter: false,\n isMap: true,\n largeName: \"EU-wide perspectives\"\n },\n {\n name: \"Labor Markets\",\n slug: views.REGIONAL_CLUSTER,\n icon: false,\n type: \"view\",\n link: `/map/${views.REGIONAL_CLUSTER}/intro`,\n filter: false,\n isMap: true,\n largeName: \"Labor market clusters\"\n },\n {\n name: \"Occupations\",\n slug: views.OCCUPATIONAL,\n icon: false,\n type: \"view\",\n link: `/map/${views.OCCUPATIONAL}/intro`,\n filter: false,\n isMap: true,\n largeName: \"Specific occupations\"\n },\n {\n name: \"About\",\n slug: views.ABOUT,\n icon: false,\n type: \"view\",\n link: `/page/${views.ABOUT}`\n }/*,\n {\n name: \"Read Report\",\n slug: 'repot',\n icon: false,\n type: \"external\",\n link: \"https://www.mckinsey.com/featured-insights/future-of-work/the-future-of-work-in-europe\"\n }*/\n ],\n subnav: [\n {\n name: \"Description\",\n slug: \"intro\"\n },\n {\n name: \"Today\",\n slug: \"today\"\n },\n {\n name: \"Outlook 2030\",\n slug: \"outlook\"\n }\n ],\n },\n IGNORE_SHAPES_IDS:[\n \"FRY30\",\n \"FRY20\",\n \"FRY10\",\n \"FRY40\",\n \"FRY50\"\n ],\n FEATURED_REGIONS: [\n \"FR101\",\n \"ITI43\",\n \"DE300\"\n ],\n NAV_FIXED_WHERE_SCROLL: 120,\n EMPLOYMENT_FIELDS: {\n today_job_growth: \"net_job_growth_2011_18_in_share\",\n future_job_growth: \"net_job_growth_2018_30_in_share\",\n today_employment_rate: \"employment_rate_2018\",\n future_employment_rate: \"employment_rate_2030_in_share\"\n },\n OCCUPATIONAL_FIELDS: {\n today_absolute: \"employment_absolute_2018_thousands\",\n future_absolute: \"employment_absolute_2030_thousands\",\n today_relative: \"employment_share_of_region_2018_percent\",\n future_relative: \"employment_share_of_region_2030_percent\",\n delta: \"jobs_change_18_30_percent\"\n },\n EMPLOYMENT_NAMES: {\n today_job_growth: \"Job growth 2011-18\",\n future_job_growth: \"Job growth 2018-30\",\n today_employment_rate: \"Employment rate 2018\",\n future_employment_rate: \"Employment rate 2030\"\n },\n FUTURE_DISCLAIMER: \"Note: Projections for the EU-27 countries plus the United Kingdom and Switzerland; Analysis of long-term labor market trends and impact of automation was conducted before COVID-19 pandemic. Displacement due to automation and net job growth figures were estimated based on midpoint automation scenario. For discussion of the assumptions, sensitivities, and limitations of our automation scenarios, see A future that works: Automation, employment, and productivity, McKinsey Global Institute, January 2017.\"\n}\n","import {NAV, VIEWS} from \"./consts\";\nimport {scaleQuantize, scaleThreshold} from \"d3-scale\";\nimport {MATRIX_COLORS,\n EMPLOYMENT_RATE_COLORS_ARRAY,\n OCCUPATIONAL_ABSOLUTE_COLORS_ARRAY,\n JOB_GROWTH_COLORS_ARRAY,\n OCCUPATIONAL_RELATIVE_COLORS_ARRAY,\n\n EMPLOYMENT_RATE_COLORS_SHORT_ARRAY,\n OCCUPATIONAL_ABSOLUTE_COLORS_SHORT_ARRAY,\n JOB_GROWTH_COLORS_SHORT_ARRAY,\n OCCUPATIONAL_RELATIVE_COLORS_SHORT_ARRAY,\n\n OCCUPATIONAL_CHANGE_COLORS_ARRAY,\n OCCUPATIONAL_CHANGE_COLORS_SHORT_ARRAY,\n\n TERTIARY_EDUCATION_ARRAY\n\n} from \"./colors\"\n\n/*\nexport function pathToViewSection(path){\n const parts = path.split('/');\n return {\n type: parts[1],\n view: parts[2] ? parts[2] : parts[1],\n section: parts[4] ? parts[4] : false\n }\n};*/\n\nexport function getViewBySlug(slug) {\n return NAV.find((item) => item.slug === slug)\n};\n\nexport function escapeRegexCharacters(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function normalizeString(str) {\n return str.normalize(\"NFD\").toLowerCase().replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\nexport function numberWithCommas(x) {\n return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\nexport function removeDecimalsIfNotNeeded(x) {\n x = parseFloat(x);\n return x % 1 === 0 ? x : x.toFixed(2);\n}\n\nexport function removeId(field){\n if(!field) return \"\";\n\n}\n\nexport function getMapLegendLabels(view, field, selected){\n const resp = {\n title: \"\",\n subtitle: \"\"\n };\n\n switch (view) {\n case \"regional-cluster\":\n resp.title = \"Labor Market Clusters\";\n break;\n case \"employment\":\n resp.title = \"Labor Market Development\";\n break;\n case \"occupational\":\n resp.title = selected.name;\n field = field.split('_');\n field.shift();\n field = field.join('_');\n break;\n\n default:\n break;\n }\n switch (field) {\n case \"net_job_growth_2011_18_in_share\":\n resp.subtitle = \"Net job growth 2011-18, in %\"\n break;\n case \"net_job_growth_2018_30_in_share\":\n resp.subtitle = \"Net job growth 2018-30, in %\"\n break;\n case \"employment_rate_2018\":\n resp.subtitle = \"Employment rate 2018, in %\"\n break;\n case \"employment_rate_2030_in_share\":\n resp.subtitle = \"Employment rate 2030, in %\"\n break;\n\n case \"employment_absolute_2018_thousands\":\n resp.subtitle = \"employees 2018 in thousands\";\n break;\n case \"employment_absolute_2030_thousands\":\n resp.subtitle = \"employees 2030 in thousands\";\n break;\n case \"employment_share_of_region_2018_percent\":\n resp.subtitle = \"2018 in %\";\n break;\n case \"employment_share_of_region_2030_percent\":\n resp.subtitle = \"2030 in %\";\n break;\n case \"jobs_change_18_30_percent\":\n resp.subtitle = \"2018-30 job change %\";\n break;\n\n default:\n break;\n }\n return resp;\n}\n\nexport function buildSQLArrayString(fields) {\n return `{${fields.map(f=>`${f}:${f}`).join(',')}}`;\n}\n\nexport function buildSQLFirstSelectString(fields) {\n return ` ${fields.map(f => `FIRST(${f}) as ${f}`).join(',')} `;\n}\n\nexport function toMillions(number) {\n return Math.round(number/1000000);\n}\n\nexport function toPercentage(number, decimal) {\n number = number * 100;\n return decimal === 0 ? Math.round(number):number.toFixed(decimal);\n}\n\nexport function createMatrixScale(min, max) {\n return scaleQuantize()\n .domain([min, max])\n .range(MATRIX_COLORS);\n}\n\nexport function createTextColorScale(min, max) {\n return scaleQuantize()\n .domain([min, max])\n .range(['#000','#fff']);\n}\n\nexport function getMapColorScale(view, field) {\n let colorPalette;\n if (view === VIEWS.EMPLOYMENT) {\n colorPalette = field.indexOf('employment_rate') > -1 ? EMPLOYMENT_RATE_COLORS_ARRAY : JOB_GROWTH_COLORS_ARRAY;\n }\n if (view === VIEWS.OCCUPATIONAL) {\n colorPalette = field.indexOf('jobs_change_18_30_percent') > -1 ? OCCUPATIONAL_CHANGE_COLORS_ARRAY : field.indexOf('absolute') > -1 ? OCCUPATIONAL_ABSOLUTE_COLORS_ARRAY : OCCUPATIONAL_RELATIVE_COLORS_ARRAY;\n }\n return colorPalette;\n}\n\nexport function getLegendColorScale(view, field, defaultScale) {\n let colorPalette = defaultScale;\n if (view === VIEWS.EMPLOYMENT) {\n colorPalette = field.indexOf('employment_rate') > -1 ? EMPLOYMENT_RATE_COLORS_SHORT_ARRAY : JOB_GROWTH_COLORS_SHORT_ARRAY;\n }\n if (view === VIEWS.OCCUPATIONAL) {\n colorPalette = field.indexOf('jobs_change_18_30_percent') > -1 ? OCCUPATIONAL_CHANGE_COLORS_SHORT_ARRAY : field.indexOf('absolute') > -1 ? OCCUPATIONAL_ABSOLUTE_COLORS_SHORT_ARRAY : OCCUPATIONAL_RELATIVE_COLORS_SHORT_ARRAY;\n }\n return colorPalette;\n}\n\nexport function createTertiaryEducationScale() {\n return scaleThreshold()\n .domain([0.3,0.6,0.9])\n .range([...TERTIARY_EDUCATION_ARRAY].reverse().map(d=>d[1]));\n}\n\nexport function cloneAndRenameObj(obj, renameFieldList) {\n const resp = {};\n Object.keys(renameFieldList).forEach((field) => {\n resp[renameFieldList[field]] = obj[field];\n })\n return resp;\n}\n\nexport function calculateLabelBounds(d, i, s) {\n return {\n width: s.width,\n height: s.height,\n x: this._x1 !== null ? this._getX(d, i) : -s.width / 2,\n y: this._x1 === null ? this._getY(d, i) : -s.height / 2\n }\n};\n\nexport function calculateSide(n, gap) {\n n = Math.abs(n);\n if (n === 0) return 0;\n return n + gap;\n}\n\nexport function calculateDomain(min, max, isVertical) {\n //console.log(min, max);\n const ratio = isVertical?0.5:0.1;\n const gapMin = Math.abs(min) * ratio;\n const gapMax = Math.abs(max) * ratio;\n //console.log(gapMin, gapMax);\n let biggerGap = gapMax > gapMin ? gapMax : gapMin;\n //biggerGap = biggerGap < 0.01 ? biggerGap*2:biggerGap;\n let axisMin = calculateSide(min, biggerGap);\n let axisMax = calculateSide(max, biggerGap);\n //console.log(axisMin, axisMax);\n return [min < 0 ? -1*axisMin : axisMin, axisMax];\n}\n","import alaSQL from \"alasql\";\nimport wellknown from \"wellknown\";\nimport {normalizeString, buildSQLArrayString, buildSQLFirstSelectString} from \"./formatters\";\nimport {FILE_KEYS, FEATURED_REGIONS, VIEWS} from \"./consts\";\n\nexport function getAlaSQLPromise(config) {\n const parser = config.parser === 'csv' ? `CSV(\"${config.file}\")` : `TXT(\"${config.file}\")`;\n return alaSQL.promise(`SELECT * FROM ${parser}`)\n}\n\nfunction getPropertiesNUTS3Object(d, view){\n const t = {...d};\n delete t.geometry;\n delete t.centroid_x;\n delete t.centroid_y;\n switch (view) {\n case 'cluster':\n return {\n id: t.id,\n name: t.name,\n cluster_id: t.cluster_id,\n metro_name: t.metro_name,\n cluster_name: t.cluster_name,\n urban_name: t.urban_name,\n country_name: t.country_name\n };\n case 'occupations':\n return t;\n case 'europe':\n return t;\n default:\n return t;\n };\n}\n\nexport function hydrateLoadedData(state) {\n let hydrated = false;\n let hydratedQuery;\n\n //NUTS3\n if (\n state.data.toJoin.nuts3 &&\n state.data.toJoin.nuts3_present &&\n state.data.dimensions.clusters &&\n state.data.dimensions.urbans &&\n state.data.dimensions.metro_stats &&\n state.data.dimensions.countries) {\n\n hydrated = true;\n hydratedQuery = alaSQL(`\n WITH clustersJoin as (SELECT cluster_id,cluster_name from ?)\n SELECT * FROM ? as nuts3\n LEFT JOIN clustersJoin AS clusters ON nuts3.cluster_id = clusters.cluster_id\n LEFT JOIN ? AS urbans ON nuts3.urban_id = urbans.urban_id\n LEFT JOIN ? AS countries ON nuts3.country_id = countries.country_id\n LEFT JOIN ? AS metro_stats ON nuts3.metro_id = metro_stats.metro_id\n LEFT JOIN ? AS nuts3_present ON nuts3.id = nuts3_present.nuts3_id\n `,\n [\n state.data.dimensions.clusters,\n state.data.toJoin.nuts3,\n state.data.dimensions.urbans,\n state.data.dimensions.countries,\n state.data.dimensions.metro_stats,\n state.data.toJoin.nuts3_present\n ]);\n\n hydratedQuery = hydratedQuery.filter(it => it.metro_name!==0);\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'nuts3': hydratedQuery\n }\n\n //Empty geoJSON shapes\n const geojsonShapes = {\n name: \"NUTS3-shapes\",\n type: \"FeatureCollection\",\n features: []\n };\n\n // Fill geoJSON files\n let geometry, properties;\n hydratedQuery.forEach(d => {\n //Parse shape\n try {\n if (d.geometry) {\n geometry = wellknown.parse(d.geometry);\n } else {\n geometry = false;\n }\n } catch (error) {\n console.error('ERROR wellknown.parse', error);\n }\n\n //Copy & remove geo properties\n properties = getPropertiesNUTS3Object(d,'cluster');\n\n //Fill shapes geojson\n geojsonShapes.features.push({\n type: \"Feature\",\n geometry,\n properties\n });\n\n });\n\n //Add to geojsons options\n state.map.geojsonOptions[VIEWS.REGIONAL_CLUSTER] = geojsonShapes;\n\n //Remove from toJoin\n delete state.data.toJoin.nuts3;\n delete state.data.toJoin.nuts3_present;\n }\n\n\n //Employment_data\n if (\n state.data.facts.nuts3 &&\n state.data.toJoin.employment_data\n ) {\n\n hydrated = true;\n hydratedQuery = alaSQL(`\n SELECT * FROM ? as nuts3\n LEFT JOIN ? AS employment_data ON nuts3.id = employment_data.id\n `,\n [\n state.data.facts.nuts3,\n state.data.toJoin.employment_data\n ]);\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'employment_data': hydratedQuery\n }\n\n //Empty geoJSON shapes\n const geojsonShapes = {\n name: \"employment-shapes\",\n type: \"FeatureCollection\",\n features: []\n };\n\n // Fill geoJSON files\n let geometry, properties;\n hydratedQuery.forEach(d => {\n //Parse shape & point\n try {\n if(d.geometry){\n geometry = wellknown.parse(d.geometry);\n } else {\n geometry = false;\n }\n } catch (error) {\n console.error('ERROR wellknown.parse',error);\n }\n\n //Copy & remove geo properties\n properties = getPropertiesNUTS3Object(d,'europe');\n\n //Fill shapes geojson\n if (geometry){\n geojsonShapes.features.push({\n type: \"Feature\",\n geometry,\n properties\n });\n }\n\n });\n\n //Add to geojsons options\n state.map.geojsonOptions[VIEWS.EMPLOYMENT] = geojsonShapes;\n\n //Remove from toJoin\n delete state.data.toJoin.employment_data;\n }\n\n //occupational_data\n if (\n state.data.facts.nuts3 &&\n state.data.dimensions.isco &&\n state.data.toJoin.occupational_data\n ) {\n\n const occupationalFields = [\n \"employment_absolute_2018_thousands\",\n \"employment_share_of_region_2018_percent\",\n \"employment_absolute_2030_thousands\",\n \"employment_share_of_region_2030_percent\",\n \"jobs_change_18_30_percent\",\n \"isco_1_id\",\n \"isco_1_name\",\n \"isco_2_name\",\n \"isco_2_id\"\n ];\n\n\n const nuts3Fields = [\n \"id\",\n \"name\",\n \"cluster_id\",\n \"urban_id\",\n \"metro_id\",\n \"metro_name\",\n \"country_id\",\n /*\"centroid_x\",\n \"centroid_y\",*/\n \"geometry\",\n \"cluster_name\",\n \"urban_name\",\n \"country_name\"\n ];\n\n const rawJoin = alaSQL(`\n SELECT * FROM ? as occupational_data\n LEFT JOIN ? AS nuts3 ON nuts3.id = occupational_data.nuts3_id\n LEFT JOIN ? AS isco ON isco.isco_2_id = occupational_data.isco_2_id\n `,\n [\n state.data.toJoin.occupational_data,\n state.data.facts.nuts3,\n state.data.dimensions.isco\n ]);\n\n hydrated = true;\n hydratedQuery = alaSQL(`\n SELECT ${buildSQLFirstSelectString(nuts3Fields)} , ARRAY(${buildSQLArrayString(occupationalFields)}) AS items\n FROM ? as joined\n GROUP BY id`,\n [\n rawJoin\n ]);\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'occupational_data': rawJoin\n }\n\n //Empty geoJSON shapes\n const geojsonShapes = {\n name: \"occupational-shapes\",\n type: \"FeatureCollection\",\n features: []\n };\n\n // Fill geoJSON files\n let geometry, properties;\n\n hydratedQuery.forEach(d => {\n //Parse shape\n try {\n if (d.geometry) {\n geometry = wellknown.parse(d.geometry);\n } else {\n geometry = false;\n }\n } catch (error) {\n console.error('ERROR wellknown.parse', error);\n }\n\n //Copy & remove geo properties\n properties = getPropertiesNUTS3Object(d, 'occupations');\n\n properties.items.forEach(item => {\n occupationalFields.forEach(field => {\n properties[`${item.isco_2_id}_${field}`] = item[field];\n });\n });\n\n delete properties.items;\n delete properties.geometry;\n\n //Fill shapes geojson\n if (geometry) {\n geojsonShapes.features.push({\n type: \"Feature\",\n geometry,\n properties\n });\n }\n\n });\n\n //Add to geojsons options\n state.map.geojsonOptions[VIEWS.OCCUPATIONAL] = geojsonShapes;\n\n //Remove from toJoin\n delete state.data.toJoin.occupational_data;\n }\n\n //Employment shares top10\n if (\n state.data.facts.nuts3 &&\n state.data.toJoin.occupational_shares\n ) {\n\n hydrated = true;\n try {\n hydratedQuery = alaSQL(`\n WITH nuts3Join as (SELECT DISTINCT(metro_id) as metro_id, metro_name from ?)\n SELECT * FROM ? as occupational_shares\n LEFT JOIN nuts3Join AS metros ON metros.metro_id = occupational_shares.metro_id\n `,\n [\n state.data.facts.nuts3,\n state.data.toJoin.occupational_shares,\n ]);\n } catch (error) {\n console.error(error);\n }\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'occupational_shares': hydratedQuery\n }\n\n //Remove from toJoin\n delete state.data.toJoin.occupational_shares;\n }\n\n //Occupations clusters\n if (\n state.data.dimensions.isco &&\n state.data.dimensions.clusters &&\n state.data.toJoin.occupational_clusters\n ) {\n\n hydrated = true;\n try {\n hydratedQuery = alaSQL(`\n WITH iscoJoin as (SELECT isco_2_id, isco_2_name from ?),\n clusterJoin as (SELECT cluster_id, cluster_name from ?)\n SELECT * FROM ? as occupational_clusters\n LEFT JOIN iscoJoin AS iscos ON iscos.isco_2_id = occupational_clusters.isco_2_id\n LEFT JOIN clusterJoin AS clusters ON clusters.cluster_id = occupational_clusters.cluster_id\n `,\n [\n state.data.dimensions.isco,\n state.data.dimensions.clusters,\n state.data.toJoin.occupational_clusters\n ]);\n } catch (error) {\n console.error(error);\n }\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'occupational_clusters': hydratedQuery\n }\n\n //Remove from toJoin\n delete state.data.toJoin.occupational_clusters;\n }\n\n //Occupations EU\n if (\n state.data.dimensions.isco &&\n state.data.toJoin.occupational_eu\n ) {\n\n hydrated = true;\n try {\n hydratedQuery = alaSQL(`\n WITH iscoJoin as (SELECT isco_2_id, isco_2_name from ?)\n SELECT * FROM ? as occupational_eu\n LEFT JOIN iscoJoin AS iscos ON iscos.isco_2_id = occupational_eu.isco_2_id\n `,\n [\n state.data.dimensions.isco,\n state.data.toJoin.occupational_eu\n ]);\n } catch (error) {\n console.error(error);\n }\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'occupational_eu': hydratedQuery\n }\n\n //Remove from toJoin\n delete state.data.toJoin.occupational_eu;\n }\n\n //Top Occupations future\n if (\n state.data.dimensions.isco &&\n state.data.toJoin.nuts3_top_occupations_future\n ) {\n\n hydrated = true;\n try {\n hydratedQuery = alaSQL(`\n WITH iscoJoin as (SELECT isco_2_id, isco_2_name from ?)\n SELECT * FROM ? as top_occupations\n LEFT JOIN iscoJoin AS iscos ON iscos.isco_2_id = top_occupations.isco_2_id\n `,\n [\n state.data.dimensions.isco,\n state.data.toJoin.nuts3_top_occupations_future\n ]);\n } catch (error) {\n console.error(error);\n }\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'nuts3_top_occupations_future': hydratedQuery\n }\n\n //Remove from toJoin\n delete state.data.toJoin.nuts3_top_occupations_future;\n }\n\n //\n if (\n state.data.dimensions.clusters &&\n state.data.toJoin.clusters_avg\n ) {\n\n hydrated = true;\n try {\n hydratedQuery = alaSQL(`\n WITH clusterJoin as (SELECT cluster_id, cluster_name from ?)\n SELECT * FROM ? as clusters_avg\n LEFT JOIN clusterJoin AS clusters ON clusters.cluster_id = clusters_avg.cluster_id\n `,\n [\n state.data.dimensions.clusters,\n state.data.toJoin.clusters_avg\n ]);\n } catch (error) {\n console.error(error);\n }\n\n //Add in facts\n state.data.facts = {\n ...state.data.facts,\n 'clusters_avg': hydratedQuery\n }\n\n //Remove from toJoin\n delete state.data.toJoin.clusters_avg;\n }\n\n\n return {changed:hydrated, state:state};\n}\n\nexport function updateSearch(key, state) {\n let searchUpdated = false;\n let temp, itemTemp;\n switch (key) {\n\n //Fill search index with occupations\n case FILE_KEYS.ISCO_REFERENCE:\n searchUpdated = true;\n\n temp = state.data.dimensions.isco.map(c => {\n return {\n id: c.isco_2_id,\n name: c.isco_2_name,\n type: 'ISCO',\n meta: normalizeString(`${c.isco_1_name} ${c.isco_2_name}`.replace(',',''))\n };\n });\n\n state.search.options[2].items = temp;\n\n break;\n\n //Fill search index with clusters\n case FILE_KEYS.CLUSTERS_REFERENCE:\n searchUpdated = true;\n\n temp = state.data.dimensions.clusters.map(c => {\n return {\n id: c.cluster_id,\n name: c.cluster_name,\n type: 'Cluster',\n meta: normalizeString(c.cluster_name)\n };\n });\n\n state.search.default[0].items = temp;\n state.search.options[0].items = temp;\n\n break;\n\n //Fill search index with NUTS3\n case FILE_KEYS.NUTS3_SHAPES:\n case FILE_KEYS.NUTS3_PRESENT:\n case FILE_KEYS.URBAN_REFERENCE:\n case FILE_KEYS.METRO_STATS:\n case FILE_KEYS.COUNTRIES_REFERENCE:\n\n if (state.data.facts.nuts3){\n\n searchUpdated = true;\n\n state.search.default[1].items = [];\n\n temp = state.data.facts.nuts3.map(n => {\n itemTemp = {\n id: n.id,\n name: `${n.name}, ${n.country_name}`,\n lat: n.centroid_y,\n lng: n.centroid_x,\n type: 'Region',\n meta: normalizeString(`${n.name} ${n.name_trans} ${n.metro_name} ${n.metro_name_trans} ${n.country_name}`)\n };\n if (FEATURED_REGIONS.indexOf(itemTemp.id)>-1){\n state.search.default[1].items.push(itemTemp);\n }\n return itemTemp;\n });\n\n state.search.options[1].items = temp.filter(i => (i.name !== 0));\n\n }\n\n\n break;\n\n default:\n searchUpdated = false;\n break;\n }\n return {changed: searchUpdated, state: state};\n}\n","import {FILE_KEYS} from \"../helpers/consts\";\nimport {CLUSTERS_COLORS_MAP} from \"../helpers/colors\";\nimport {getAlaSQLPromise} from \"../helpers/sqlHelper\";\n\nexport const DATA_REQUEST_ACTION = \"DATA_REQUEST\";\nexport const DATA_RECEIVED_ACTION = \"DATA_RECEIVED\";\nexport const DATA_FAIL_ACTION = \"DATA_FAIL\";\n\nexport const SET_MAP_DATA_ACTION = \"SET_MAP_DATA\";\nexport const SET_MAP_VIEWPORT_ACTION = \"SET_MAP_VIEWPORT\"\n\nexport const START_OVER_MAP = \"START_OVER_MAP\";\nexport const SET_MAP_ZOOM = \"SET_MAP_ZOOM\";\nexport const SET_MAP_CENTER = \"SET_MAP_CENTER\";\nexport const SET_DEFAULT_VIEWPORT_MAP = \"SET_DEFAULT_VIEWPORT_MAP\";\n\n\nexport const setMapDataAction = (view, filter, field, entity) => dispatch => {\n return dispatch({\n type: SET_MAP_DATA_ACTION,\n payload: {view, filter, field, entity}\n });\n};\n\nexport const setMapViewportAction = (viewport) => dispatch => {\n return dispatch({\n type: SET_MAP_VIEWPORT_ACTION,\n payload: {viewport}\n });\n};\n\nconst BASE_URL = window.FOW_BASE_URL && window.FOW_BASE_URL !== '<FOW_BASE_URL>' ? window.FOW_BASE_URL : \"./\";\n\nconst files_available = {\n [FILE_KEYS.ISCO_REFERENCE]:{\n name: 'ISCO References',\n file: `${BASE_URL}data/0-isco-reference.csv`,\n parser: 'csv',\n group: 'dimensions',\n parse: (data) => data\n },\n [FILE_KEYS.NACE_REFERENCE]: {\n name: 'NACE References',\n file: `${BASE_URL}data/0-nace-reference.csv`,\n parser: 'csv',\n group: 'dimensions',\n parse: (data) => data\n },\n [FILE_KEYS.CLUSTERS_REFERENCE]: {\n name: 'Regional Clusters',\n file: `${BASE_URL}data/1-regional-clusters-metadata.csv`,\n parser: 'csv',\n group: 'dimensions',\n parse: (data) => data.map(cluster => {\n cluster.color = CLUSTERS_COLORS_MAP[cluster.cluster_name] ? CLUSTERS_COLORS_MAP[cluster.cluster_name]:\"#ccc\";\n return cluster;\n })\n },\n [FILE_KEYS.COUNTRIES_REFERENCE]: {\n name: 'Countries',\n file: `${BASE_URL}data/3-country-codes-reference.csv`,\n parser: 'csv',\n group: 'dimensions',\n parse: (data) => data\n },\n [FILE_KEYS.URBAN_REFERENCE]: {\n name: 'Urban Typologies',\n file: `${BASE_URL}data/3-urban-typology-reference.csv`,\n parser: 'csv',\n group: 'dimensions',\n parse: (data) => data\n },\n [FILE_KEYS.NUTS3_SHAPES]: {\n name: 'NUTS3 Geo shapes',\n file: `${BASE_URL}data/1-nuts3-shapes-metro-cluster.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.EMPLOYMENT_DATA]: {\n name: 'Employment data',\n file: `${BASE_URL}data/2-employment-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.OCCUPATIONAL_DATA]: {\n name: 'Occupational data',\n file: `${BASE_URL}data/4-occupational-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.OCCUPATIONAL_TOP10_CHANGES]: {\n name: 'Occupational changes data',\n file: `${BASE_URL}data/4-top10-occupations-changes-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.OCCUPATIONAL_TOP10_SHARE]: {\n name: 'Occupational shares data',\n file: `${BASE_URL}data/4-top10-occupations-share-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.OCCUPATIONAL_EU]: {\n name: 'Occupational change EU wide',\n file: `${BASE_URL}data/2-eu-occupations-growth-decline.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.OCCUPATIONAL_CLUSTERS]: {\n name: 'Occupational change by clusters',\n file: `${BASE_URL}data/1-occupation-growth-by-cluster.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.METRO_STATS]: {\n name: 'Metro statistics',\n file: `${BASE_URL}data/3-metro-stats-data.csv`,\n parser: 'csv',\n group: 'dimensions',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.NUTS3_PRESENT]: {\n name: 'NUTS3 present data',\n file: `${BASE_URL}data/3-labor-nuts3-present-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data.map(r=>{\n delete r.id;\n delete r.cluster_id;\n return r;\n });\n }\n },\n [FILE_KEYS.CLUSTERS_AVG_PRESENT]: {\n name: 'Clusters AVG Present data',\n file: `${BASE_URL}data/3-labor-cluster-averages-present-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.NUTS3_FUTURE]: {\n name: 'NUTS3 future data',\n file: `${BASE_URL}data/3-labor-nuts3-future-data.csv`,\n parser: 'csv',\n group: 'facts',\n parse: (data, dispatch) => {\n return data;\n }\n },\n [FILE_KEYS.NUTS3_TOP_OCCUPATIONS_FUTURE]: {\n name: 'Top occupations future',\n file: `${BASE_URL}data/3-top-occupations-2018-30-future-data.csv`,\n parser: 'csv',\n group: 'toJoin',\n parse: (data, dispatch) => {\n return data.map(r => {\n r.trend = r.indicator.split('-')[1];\n r.indicator = parseInt(r.indicator.split('-')[0]);\n r.isco_2_id = r.occupation;\n delete r.occupation;\n return r;\n });\n }\n }\n}\n\nexport const loadDataAction = (keys, db) => dispatch => {\n //Load data by ALA\n keys.forEach(key => {\n if (files_available[key]) {\n const config = files_available[key];\n\n if (!(db.data.dimensions[key] || db.data.facts[key] || db.data.toJoin[key])){\n dispatch({\n type: DATA_REQUEST_ACTION,\n payload: {key, name: config.name}\n });\n\n const getQueryToLoad = getAlaSQLPromise(config);\n\n getQueryToLoad\n .then(function (data) {\n dispatch({\n type: DATA_RECEIVED_ACTION,\n payload: {\n data: config.parse(data, dispatch),\n group: config.group,\n key: key\n }\n });\n }).catch(function (error) {\n console.error('3. Error loading '+key, error)\n dispatch({\n type: DATA_FAIL_ACTION,\n payload: error\n });\n });\n } else {\n console.log(key+' already loaded!');\n }\n\n } else {\n console.error('Trying to load wrong dataset key:' + key);\n }\n });\n};\n\nexport const startOverMapAction = () => dispatch => {\n return dispatch({\n type: START_OVER_MAP\n });\n};\n\nexport const setMapZoomAction = (zoomIn) => dispatch => {\n return dispatch({\n type: SET_MAP_ZOOM,\n payload: {zoomIn}\n });\n};\n\n\nexport const setMapCenterAction = (item) => dispatch => {\n return dispatch({\n type: SET_MAP_CENTER,\n payload: {item}\n });\n};\n\nexport const setDefaultViewportAction = (viewport) => dispatch => {\n return dispatch({\n type: SET_DEFAULT_VIEWPORT_MAP,\n payload: {viewport}\n });\n};\n\n","import {CLUSTERS_COLORS_ARRAY, EMPLOYMENT_RATE_COLORS_ARRAY, OCCUPATIONAL_COLORS_ARRAY} from \"../helpers/colors\";\nimport {VIEWS} from \"../helpers/consts\";\nimport {LinearInterpolator} from 'react-map-gl';\n\nconst defaultViewport = {\n latitude: 54,\n longitude: 11,\n zoom: 3,\n bearing: 0,\n pitch: 0,\n altitude: 1.5,\n maxZoom: 6,\n minZoom: 2,\n maxPitch: 60,\n minPitch: 0,\n scrollZoom: false,\n touchRotate: true,\n transitionInterpolator: new LinearInterpolator(),\n transitionDuration: 500,\n dragPan:false,\n touchAction: 'pan-y'\n};\n\n//-11.6228210926, 32.9381165115, 49.3293273449, 71.2731528453\n\nconst dataInitialState = {\n data: {\n toJoin: {},\n facts: {},\n dimensions: {}\n },\n search: {\n default: [\n {title: 'Clusters', items: []},\n {title: 'Regions', items: []}\n ],\n options: [\n {title: 'Clusters', items: []},\n {title: 'Regions', items: []},\n {title: 'Occupations', items: []}\n ]\n },\n map: {\n geojson: false,\n style: false,\n geojsonOptions: {\n [VIEWS.REGIONAL_CLUSTER]: false,\n [VIEWS.EMPLOYMENT]: false,\n [VIEWS.OCCUPATIONAL]: false\n },\n styleOptions: {\n [VIEWS.REGIONAL_CLUSTER]: {\n id: 'data',\n type: 'fill',\n paint: {\n 'fill-outline-color': \"rgba(255,255,255,0.5)\",\n 'fill-opacity': 0.8,\n 'fill-color': {\n property: 'cluster_name',\n type: \"categorical\",\n stops: CLUSTERS_COLORS_ARRAY\n }\n }\n },\n [VIEWS.EMPLOYMENT]: {\n id: 'data',\n type: 'fill',\n paint: {\n 'fill-outline-color': \"rgba(255,255,255,0.5)\",\n 'fill-opacity': 0.8,\n 'fill-color': {\n property: 'employment_rate_2018',\n type: \"categorical\",\n stops: EMPLOYMENT_RATE_COLORS_ARRAY\n }\n }\n },\n [VIEWS.OCCUPATIONAL]: {\n id: 'data',\n type: 'fill',\n paint: {\n 'fill-outline-color': \"rgba(255,255,255,0.5)\",\n 'fill-opacity': 0.8,\n 'fill-color': {\n property: 'none',\n type: \"categorical\",\n stops: OCCUPATIONAL_COLORS_ARRAY\n }\n }\n }\n },\n defaultViewport: defaultViewport,\n viewport: defaultViewport,\n legend:{\n title:'',\n subtitle:'',\n items: []\n }\n },\n loading: false,\n loadingList: [],\n loadingMax: 0,\n error: \"\",\n baseUrl: window.FOW_BASE_URL && window.FOW_BASE_URL !== '<FOW_BASE_URL>' ? window.FOW_BASE_URL : \"./\"\n }\n\n\nexport default dataInitialState;\n","import {DATA_REQUEST_ACTION, DATA_RECEIVED_ACTION, DATA_FAIL_ACTION, SET_MAP_DATA_ACTION, SET_MAP_VIEWPORT_ACTION, START_OVER_MAP, SET_MAP_ZOOM, SET_MAP_CENTER, SET_DEFAULT_VIEWPORT_MAP} from \"../actions/DataAction\";\nimport {hydrateLoadedData, updateSearch} from \"../helpers/sqlHelper\";\nimport {getMapLegendLabels, getMapColorScale, getLegendColorScale} from \"../helpers/formatters\";\n\nimport initialStateData from \"./initialStateData\";\n\nexport default (state = initialStateData, action) => {\n switch (action.type) {\n\n case DATA_REQUEST_ACTION:\n state.loadingList.push(action.payload);\n return {\n ...state,\n loadingList: [...state.loadingList],\n loadingMax: state.loadingMax + 1,\n loading: true\n };\n\n case DATA_RECEIVED_ACTION:\n\n // Create/Update group\n let groupObject = state.data[action.payload.group] ? state.data[action.payload.group] : {};\n groupObject[action.payload.key] = action.payload.data;\n\n // Calculate loading List\n let newLoadingList = state.loadingList.filter(function (obj) {\n return obj.key !== action.payload.key;\n });\n\n // Update State\n let newState = {\n ...state,\n loading: newLoadingList.length === 0 ? false : true,\n loadingMax: newLoadingList.length === 0 ? 0 : state.loadingMax,\n loadingList: [...newLoadingList],\n data: {\n ...state.data,\n [action.payload.group]: groupObject\n },\n error: \"\"\n };\n\n // Hydrate if needed\n let hydrated = hydrateLoadedData(newState);\n if (hydrated.changed){\n newState = hydrated.state;\n //console.log('Something hydrated!', newState);\n }\n\n // Fill search table if needed\n let searchUpdated = updateSearch(action.payload.key, newState);\n if (hydrated.searchUpdated) {\n newState = searchUpdated.state;\n //console.log('Search updated!', newState);\n }\n\n return newState\n\n case DATA_FAIL_ACTION:\n return {\n ...state,\n loading: false,\n loadingMax:0,\n error: action.payload.error\n };\n\n case SET_MAP_DATA_ACTION:\n //Geojson\n let geojson = state.map.geojsonOptions[action.payload.view];\n if (!geojson){\n return state; //Not ready\n }\n //Map style\n const mapStyle = {...state.map.styleOptions[action.payload.view]};\n\n //Override filter\n if (action.payload.filter){\n mapStyle.filter = action.payload.filter;\n } else {\n delete mapStyle.filter;\n }\n\n let type;\n if (mapStyle.paint['fill-color']){\n type = 'fill-color';\n }\n if (mapStyle.paint['circle-color']){\n type = 'circle-color';\n }\n\n if (action.payload.field){\n let colorPalette = getMapColorScale(action.payload.view, action.payload.field);\n\n mapStyle.paint = {\n ...mapStyle.paint,\n [type]: {\n ...mapStyle.paint[type],\n property: action.payload.field,\n stops: colorPalette\n }\n }\n }\n\n let legendItems = getLegendColorScale(action.payload.view, action.payload.field, mapStyle.paint[type].stops);\n\n return {\n ...state,\n map:{\n ...state.map,\n geojson: geojson,\n style: mapStyle,\n legend: {\n ...getMapLegendLabels(action.payload.view, action.payload.field, action.payload.entity),\n items: legendItems\n }\n }\n };\n\n case SET_MAP_VIEWPORT_ACTION:\n return {\n ...state,\n map: {\n ...state.map,\n viewport: action.payload.viewport\n }\n };\n\n\n case START_OVER_MAP:\n return {\n ...state,\n map:{\n ...state.map,\n viewport: {...state.map.defaultViewport}\n }\n };\n\n case SET_DEFAULT_VIEWPORT_MAP:\n return {\n ...state,\n map: {\n ...state.map,\n defaultViewport: {...action.payload.viewport},\n viewport: {...action.payload.viewport}\n }\n };\n\n case SET_MAP_ZOOM:\n let newZoom = (action.payload.zoomIn) ? state.map.viewport.zoom + .25 : state.map.viewport.zoom - .25\n if (newZoom < state.map.viewport.minZoom){\n newZoom = state.map.viewport.minZoom;\n }\n if (newZoom > state.map.viewport.maxZoom) {\n newZoom = state.map.viewport.maxZoom;\n }\n return {\n ...state,\n map: {\n ...state.map,\n viewport: {\n ...state.map.viewport,\n zoom: newZoom\n }\n }\n };\n\n case SET_MAP_CENTER:\n const item = action.payload.item;\n const centerParams = item.type === \"Cluster\" || item.type === \"ISCO\" ? state.map.defaultViewport : {latitude: item.lat, longitude:item.lng, zoom:6};\n return {\n ...state,\n map: {\n ...state.map,\n viewport: {\n ...state.map.viewport,\n zoom: centerParams.zoom,\n latitude: centerParams.latitude,\n longitude: centerParams.longitude\n }\n }\n };\n\n default:\n return state;\n }\n};\n","import {setMapCenterAction} from \"./DataAction\"\n\nexport const MAP_TOOLTIP_DATA = \"MAP_TOOLTIP_DATA\";\nexport const WINDOW_SIZE = \"WINDOW_SIZE\";\nexport const HASH_CHANGE = \"HASH_CHANGE\";\nexport const SELECTED_ITEM = \"SELECTED_ITEM\";\nexport const SET_LEGEND_STATE = \"SET_LEGEND_STATE\";\nexport const SET_NAV_STATE = \"SET_NAV_STATE\";\nexport const SET_SELECTED_MAP_CONTROL = \"SET_SELECTED_MAP_CONTROL\";\nexport const SET_SWITCH_MAP_CONTROL = \"SET_SWITCH_MAP_CONTROL\";\nexport const SET_NAV_OPEN = \"SET_MENU_OPEN\";\nexport const SET_SETTINGS_OPEN = \"SET_SETTINGS_OPEN\";\nexport const SET_STATS_OPEN = \"SET_STATS_OPEN\";\n\nexport const setTooltipDataAction = (data) => dispatch => {\n return dispatch({\n type: MAP_TOOLTIP_DATA,\n payload: {data}\n });\n};\n\nexport const setWindowSizeAction = dimensions => dispatch => {\n return dispatch({\n type: WINDOW_SIZE,\n payload: dimensions\n });\n};\n\nexport const setHashAction = hash => dispatch => {\n return dispatch({\n type: HASH_CHANGE,\n payload: hash\n });\n};\n\nexport const setSelectedItemAction = item => dispatch => {\n return dispatch({\n type: SELECTED_ITEM,\n payload: item\n });\n};\n\nexport const setLegendStateAction = open => dispatch => {\n return dispatch({\n type: SET_LEGEND_STATE,\n payload: {open}\n });\n};\n\nexport const setNavStateAction = fixed => dispatch => {\n return dispatch({\n type: SET_NAV_STATE,\n payload: {fixed}\n });\n};\n\nexport const setSelectMapControlAction = (item, group, clearGroup) => dispatch => {\n setMapCenterAction(item)(dispatch);\n return dispatch({\n type: SET_SELECTED_MAP_CONTROL,\n payload: {item, group, clearGroup}\n });\n};\n\nexport const setSwitchMapControlAction = (item, group) => dispatch => {\n return dispatch({\n type: SET_SWITCH_MAP_CONTROL,\n payload: {item, group}\n });\n};\n\nexport const setNavOpenAction = (open) => dispatch => {\n return dispatch({\n type: SET_NAV_OPEN,\n payload: {open}\n });\n};\n\nexport const setSettingsOpenAction = (open) => dispatch => {\n return dispatch({\n type: SET_SETTINGS_OPEN,\n payload: {open}\n });\n};\n\nexport const setStatsStateAction = open => dispatch => {\n return dispatch({\n type: SET_STATS_OPEN,\n payload: {open}\n });\n};\n\n\n","import {MAP_TOOLTIP_DATA, WINDOW_SIZE, HASH_CHANGE, SELECTED_ITEM, SET_LEGEND_STATE, SET_NAV_STATE, SET_SELECTED_MAP_CONTROL, SET_SWITCH_MAP_CONTROL, SET_NAV_OPEN, SET_SETTINGS_OPEN, SET_STATS_OPEN} from \"../actions/SettingsAction\";\nimport {NAV_FIXED_WHERE_SCROLL} from \"../helpers/consts\";\n\nfunction getBreakpoint(){\n let breakpoint = 'sm';\n if (window.matchMedia('(max-width: 572px)').matches) {\n breakpoint = 'sm';\n } else if (window.matchMedia('(max-width: 768px)').matches) {\n breakpoint = 'md';\n } else if (window.matchMedia('(max-width: 992px)').matches) {\n breakpoint = 'lg';\n } else if (window.matchMedia('(min-width: 992px)').matches) {\n breakpoint = 'xl';\n }\n\n return breakpoint;\n}\n\nconst isBigHeight = window.innerHeight > 712;\n\nconst initialState = {\n tooltipData:null,\n tooltipMetadata:null,\n window: {\n width: window.innerWidth,\n height: window.innerHeight,\n breakpoint: getBreakpoint()\n },\n isIE11: /Trident.*rv[ :]*11\\./.test(navigator.userAgent),\n selected: null,\n hash:'',\n hashParts:{\n type: '',\n view: '',\n section: ''\n },\n legendOpen: window.innerWidth > 768,\n statsOpen: isBigHeight,\n map:{\n \"Clusters\": {id: 14, name: \"Average EU Cluster\", type: \"Cluster\"},\n \"Regions\": false,\n \"Occupations\": {id: 840, name: \"Health professionals\", type: \"ISCO\"}\n },\n switch:{\n \"perspective\":false,\n \"measure\":false,\n \"measure_occ\": false,\n \"perspective_occ\": false,\n \"share_occ\": false,\n \"workers_chart\": false\n },\n nav:{\n open:false,\n settings: false,\n fixed: window.scrollY > NAV_FIXED_WHERE_SCROLL ? true : false\n },\n baseUrl: window.FOW_BASE_URL && window.FOW_BASE_URL !== '<FOW_BASE_URL>' ? window.FOW_BASE_URL : \"./\"\n};\nexport default (state = initialState, action) => {\n let openValue;\n switch (action.type) {\n case MAP_TOOLTIP_DATA:\n return {\n ...state,\n tooltipData: action.payload.data\n };\n\n case WINDOW_SIZE:\n return {\n ...state,\n window: {...action.payload, breakpoint: getBreakpoint()}\n };\n\n case HASH_CHANGE:\n const parts = action.payload.split('/');\n return {\n ...state,\n hash: action.payload,\n hashParts: {\n type: parts[1],\n view: parts[2],\n section: parts[3] ? parts[3]:''\n },\n nav: {\n ...state.nav,\n open: false,\n settings: false\n }\n };\n\n case SELECTED_ITEM:\n return {\n ...state,\n selected: action.payload\n };\n\n case SET_LEGEND_STATE:\n openValue = state.statsOpen;\n if (!isBigHeight) {\n openValue = action.payload.open ? false : state.statsOpen;\n }\n return {\n ...state,\n legendOpen: action.payload.open,\n statsOpen: openValue\n };\n\n case SET_NAV_STATE:\n return {\n ...state,\n nav:{\n ...state.nav,\n fixed: action.payload.fixed\n }\n }\n\n case SET_SELECTED_MAP_CONTROL:\n let tempMap = {\n ...state.map,\n [action.payload.group]: action.payload.item\n };\n if (action.payload.clearGroup){\n tempMap[action.payload.clearGroup] = false;\n }\n return {\n ...state,\n map:tempMap,\n }\n\n case SET_SWITCH_MAP_CONTROL:\n return {\n ...state,\n switch: {\n ...state.switch,\n [action.payload.group]: action.payload.item\n },\n nav: {\n ...state.nav,\n settings: false\n }\n }\n\n case SET_NAV_OPEN:\n return {\n ...state,\n nav: {\n ...state.nav,\n open: action.payload.open\n }\n }\n\n case SET_SETTINGS_OPEN:\n return {\n ...state,\n nav: {\n ...state.nav,\n settings: action.payload.open\n }\n }\n\n case SET_STATS_OPEN:\n openValue = state.legendOpen;\n if (!isBigHeight){\n openValue = action.payload.open ? false : state.legendOpen;\n }\n return {\n ...state,\n statsOpen: action.payload.open,\n legendOpen: openValue\n };\n\n default:\n return state;\n }\n};\n","import {combineReducers} from \"redux\";\nimport db from \"./DataReducer\";\nimport settings from \"./SettingsReducer\";\n\nconst createRootReducer = () => combineReducers({\n db,\n settings\n})\n\nexport default createRootReducer;\n","import {compose, createStore, applyMiddleware} from \"redux\";\nimport thunk from 'redux-thunk';\nimport createRootReducer from \"./reducers/RootReducer\";\n//import analyticsMiddleware from \"./middlewares/AnalyticsEvents\";\n\nexport const middlewares = [thunk];\n\nexport default function configureStore(preloadedState={}) {\n return createStore(\n createRootReducer(),\n preloadedState,\n compose(\n applyMiddleware(\n ...middlewares\n ),\n )\n );\n}\n","const labelConfig = {\n fontColor: () => \"#000\",\n fontFamily: () => \"'FOW Theinhardt', sans-serif\",\n fontSize: () => 10,\n fontWeight: () => 400\n};\n\nconst axisConfig = {\n duration: 0,\n barConfig: {\n stroke: \"transparent\",\n strokeWidth: 1\n },\n gridConfig: {\n stroke: d => Math.abs(d.id) === 0 ? \"#666\" : \"#fff\",\n strokeWidth: 1\n },\n labelConfig: labelConfig,\n shapeConfig: {\n labelConfig: labelConfig,\n stroke: \"#efefef\",\n strokeWidth: 1\n },\n tickSize: 5,\n titleConfig: {\n fontColor: () => \"#666\",\n fontFamily: () => \"'FOW Theinhardt', sans-serif\",\n fontSize: () => 14,\n fontWeight: () => 400\n }\n};\n\nexport default {\n xConfig: {\n ...axisConfig,\n barConfig: {\n stroke: \"#666\",\n strokeWidth: 1\n }\n },\n duration: 0,\n yConfig: {\n ...axisConfig,\n scale: \"auto\"\n },\n y2Config: {\n ...axisConfig,\n scale: \"auto\"\n },\n labelConfig: {\n fontFamily: () => \"'FOW Theinhardt', sans-serif\"\n },\n shapeConfig: {\n duration: 0,\n Bar: {\n height: 20,\n width: 20,\n duration: 0,\n labelBounds: (d, ix, s) => { // It works great with horizontal barCharts\n const width = s.width < 100 ? 100 : s.width;\n let x = d.value < 0 ? -width * 2 : width;\n const diff = s.width < 100? 100 - s.width:0;\n x = d.value < 0?x+diff:x-diff;\n const resp = {\n width: width,\n height: 40,\n x: x,\n y: -38 / 2\n };\n return resp;\n },\n labelConfig: {\n textAnchor: (d) => { return d.value < 0 ? \"end\" : \"start\"},\n fontColor: () => \"#000\",\n fontFamily: () => \"'FOW Theinhardt', sans-serif\",\n fontSize: () => 12,\n fontWeight: () => 400\n },\n }\n },\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n on: {\"click.legend\": () => {}}\n};\n","import LocalForage from 'localforage';\n\nconst keyName = 'fow-logged-in';\n\nexport function setLogIn(cb) {\n LocalForage.setItem(keyName, true).then(cb());\n};\n\nexport function setLogOut(cb) {\n LocalForage.setItem(keyName, false).then(cb());\n};\n\nexport async function isLoggedIn(cb) {\n let isLogged = false;\n try {\n const value = await LocalForage.getItem(keyName);\n // This code runs once the value has been loaded\n // from the offline store.\n isLogged = value ? true:false;\n } catch (err) {\n // This code runs if there were any errors.\n console.error(err);\n }\n return isLogged;\n};\n","import React from \"react\";\n\nconst getViewBox = () => {\n return \"0 0 283.4 90.2\";\n};\n\nconst getPath = (props) => {\n return (\n <g {...props} ><path d=\"M5.7 5.7c0-.7-1.9-2.5-2.5-2.5H1.6V1.6h9.5l9.8 24.6h.2L31.4 1.6h8.5v1.6h-1.6c-.6 0-2.5 1.8-2.5 2.5v24.5c0 .7 1.9 2.5 2.5 2.5h1.6v1.6H27.3v-1.6h1.6c.6 0 2.5-1.8 2.5-2.5V6.4L19.5 34.8 7.7 5.9v24.2c0 .7 1.9 2.5 2.5 2.5h1.6v1.6H1.6v-1.6h1.6c.6 0 2.5-1.8 2.5-2.5V5.7zM53.6 20.3c.6-3.3 0-6.2-3.6-6.2-4.2 0-6.3 3.4-6.3 8.3 0 4.7 3 8.6 7.8 8.6 3.7 0 5.2-1.3 6.7-3.8h1.3c-1.4 4.6-4.2 7.5-9.5 7.5-5.9 0-9.7-5-9.7-11 0-6.8 4.5-11.3 10.1-11.3 3.3 0 5.6 1 7.5 3l-3.1 4.8-1.2.1zM96.3 8.1C97.8 8.1 99 7 99 5.3c0-1.7-1.2-2.7-2.7-2.7s-2.8 1-2.8 2.7c0 1.7 1.2 2.8 2.8 2.8z\" /><path d=\"M126.3 32.6c-.6 0-2.3-1.5-2.3-2.2V18.6c0-3.6-2.6-6-5.9-6-3.8 0-5.8 2.2-8.3 4.8L109 13h-6.7v1.6h1.3c.6 0 2.3 1.6 2.3 2.2v13.5c0 .7-1.7 2.2-2.3 2.2H101c-.6 0-2.3-1.5-2.3-2.2V13h-7.6v1.6h1.3c.6 0 2.3 1.6 2.3 2.2v13.5c0 .7-1.7 2.2-2.3 2.2H90c-.7 0-3.3-2-3.9-2.7L74.7 14.7l7.9-8.5c.4-.5 3.5-3 4.2-3h1.6V1.6H76.6v1.6h1.6c.6 0 2.5 2.2 2 2.8L68.5 19V5.7c0-.7 1.9-2.5 2.5-2.5h1.6V1.6H59.9v1.6h1.6c.6 0 2.5 1.8 2.5 2.5v24.5c0 .7-1.9 2.5-2.5 2.5h-1.6v1.6h12.7v-1.6H71c-.6 0-2.5-1.8-2.5-2.5v-8.6l3.3-3.6 11.3 16.3H113.4v-1.6h-1.2c-.6 0-2.3-1.5-2.3-2.2V19.6c0-1.4 3.9-4.4 6.9-4.4 2.3 0 3.4 1.6 3.4 3.6v11.6c0 .7-1.7 2.2-2.3 2.2h-1.2v1.6h10.8v-1.6h-1.2zM130.2 26.8c0 2 2.9 6.2 7.4 6.2 2.6 0 4.1-.9 4.1-2.9 0-2.4-2.1-3.2-4-4-1.5-.6-2.7-1.1-4.4-1.9-2.6-1.2-4.5-2.9-4.5-5.8 0-3.8 2.3-6 6.4-6 2.3 0 3.6 1.1 5.2 1.1.6 0 1-.1 1.2-.6h1.2v6.5h-1.3c0-1.7-2.5-5.5-6.4-5.5-2.5 0-3.6 1.1-3.6 2.8 0 1.8 1.3 2.5 3.4 3.4 1.6.7 2.8 1.2 4.6 1.9 2.3.9 4.9 2.7 4.9 6.1 0 4-2.8 6.4-6.8 6.4-2.7 0-4.3-1.3-6.1-1.3-.9 0-1.1.2-1.6.7h-1v-7.4h1.3zM145.7 23.6c0-6.3 4.3-11.2 9.7-11.1 4.8 0 7.5 3.3 7.7 7.4l.1 1.5-14.1 1.1c0 4.3 3 8.5 7.7 8.5 3.6 0 5.3-1.4 6.6-3.8h1.3c-1.4 4.6-4 7.5-9.2 7.5-5.9 0-9.8-5.1-9.8-11.1zm13.9-3.4c.4-3-.1-6-4.3-6-4.4 0-6.1 3.6-6.3 6.9l10.6-.9zM166.9 17c-.3-.7-2.2-2.4-2.7-2.4h-.9V13h11.2v1.6h-1.3c-.6 0-1.9 1.5-1.9 2.3l4.9 11.3 4.8-11.3c0-.9-1.3-2.3-1.8-2.3h-1.3V13h8.5v1.6h-1c-.5 0-2 1.6-2.5 2.3l-7.2 16.3-5.3 11.7-1.9-.9 5.6-11.6-7.2-15.4zM64.6 51.1c0 2.6 1.8 4.7 4.6 5.8 4.2 4.5 9.3 9.3 13.7 13.3 1.3-2.1 1.7-4.3 1.7-6.9 0-3-2-4.8-5.2-4.9v-1.6H91v1.6h-1.3c-.6 0-2.9 2.6-2.9 3.5 0 2.7-.8 6.1-2.8 9.1 2.4 2.1 4.7 4 6.6 5.3h2v1.6H89c-3.2 0-5.4-.9-8.1-3.3-2.6 2.5-5.9 3.9-10.7 3.9-5.3 0-10.3-3.9-10.3-9.6 0-4.5 2.3-7.8 5.2-9.9-1.6-2-2.6-3.9-2.6-6.8 0-4.7 3-7.3 7.8-7.3 3 0 4.6 1 6 1 .7 0 1.2 0 1.5-.6h1.4V53h-1.4c0-2.2-3.2-6.6-7.6-6.6-3.5 0-5.6 1.7-5.6 4.7zm-1.4 15.6c0 4.7 5 9.1 9.6 9.1 2.9 0 5.2-.8 7.1-2.2-4.7-4.1-10-9.2-14.1-13.8-1.7 1.8-2.6 3.6-2.6 6.9zM126 56.8c0-3.4-3.8-10.2-9.9-10.2-5.6 0-9 3.1-9.6 10.5-.2 2.9-.1 5.4.1 8.3.5 5.7 4.5 10.4 11.1 10.4 5.6 0 8.4-2.4 10.5-6.7h1.7c-2.1 5.8-6.7 9.3-13.2 9.3-9.4 0-15.4-7.7-15.4-17s5.5-16.8 14.6-16.8c3.5 0 5.7 1.4 8.2 1.4 1 0 1.5-.3 2-.9h1.2v11.6H126zM132.1 67.3c0-6.9 4.9-11.2 10.5-11.2s10.5 4.3 10.5 11.2c0 6.9-4.9 11.2-10.5 11.2s-10.5-4.4-10.5-11.2zm16.8 3.5c.3-2.2.3-5.1 0-7.2-.4-3.4-2.3-5.7-6.2-5.7-3.8 0-5.7 2.3-6.2 5.6-.3 2.1-.3 5.1 0 7.2.5 3.3 2.3 5.7 6.2 5.7 4 .1 5.8-2.3 6.2-5.6z\" /><path d=\"M187.5 74c0 .7 1.6 2.2 2.2 2.2h1v1.6h-10.6v-1.6h1.2c.6 0 2.2-1.5 2.2-2.2V62.3c0-2.1-1-3.5-3.3-3.5-2.8 0-6.2 2.7-6.2 4.1V74c0 .7 1.6 2.2 2.2 2.2h1.2v1.6h-10.8v-1.6h1.2c.6 0 2.2-1.5 2.2-2.2V62.3c0-2.1-1.1-3.5-3.4-3.5-2.8 0-6.2 2.8-6.2 4.3v11c0 .7 1.6 2.2 2.2 2.2h1.2v1.6H153v-1.6h1.2c.6 0 2.2-1.5 2.2-2.2V60.5c0-.7-1.6-2.2-2.2-2.2H153v-1.6h6.5l.9 4.1c2.4-2.6 4-4.5 7.7-4.5 2.8 0 5.2 1.5 5.6 4.5 2.6-2.6 4.3-4.4 7.8-4.4 3.2 0 5.8 2.2 5.8 6V74z\" /><path d=\"M197 56.7l.7 4.3c1.8-3.4 4.2-4.9 7.7-4.9 5.2 0 8.3 4.3 8.3 10.8 0 6.5-3.6 11.4-8.7 11.4-3.7 0-5.7-1.4-7.2-4.2v10.1c0 .7 1.7 2.2 2.2 2.2h1.4V88h-11.2v-1.6h1.4c.6 0 2.2-1.5 2.2-2.2V60.5c0-.7-1.6-2.2-2.2-2.2h-1.4v-1.6h6.8zm.7 7.7V70c0 3.3 2.6 6.1 6.1 6.1 3.6 0 5.3-2.3 5.8-5.6.3-2 .3-4.3 0-6.3-.4-3.4-2.3-5.5-5.3-5.5-3.6-.1-5.6 2.4-6.6 5.7zM259.7 76.3c-.6 0-2.3-1.5-2.3-2.2V62.3c0-3.6-2.6-6-5.9-6-3.8 0-5.8 2.2-8.3 4.8l-.8-4.3h-6.7v1.6h1.3c.6 0 2.3 1.6 2.3 2.2V74c0 .7-1.7 2.2-2.3 2.2h-2.6c-.6 0-2.3-1.5-2.3-2.2V62.5c0-4.2-3.4-6.3-7.9-6.3-4.3 0-6.8 1.5-8.5 3.3l2.8 4.3h1.5c-1.6-3.6-.4-6 3.2-6 3.8 0 5 1.7 5 4.7v2.6l-5.5 1.1c-3 .6-6.9 2.1-6.9 6.3 0 3.4 2.5 5.8 5.4 5.8 3.1 0 5.4-2.5 7.1-4.7l.5 4.3h18v-1.6h-1.2c-.6 0-2.3-1.5-2.3-2.2V63.2c0-1.4 3.9-4.4 6.9-4.4 2.3 0 3.4 1.6 3.4 3.6V74c0 .7-1.7 2.2-2.3 2.2h-1.2v1.6h10.8v-1.6h-1.2zm-31.5-4.6c-.9 1.6-3.1 3.7-5.2 3.7s-3.4-1.6-3.4-3.4c0-2.1.9-3.5 3.5-4.2l5.1-1.3v5.2zM262.3 60.7c-.3-.7-2.2-2.4-2.7-2.4h-.9v-1.6h11.2v1.6h-1.3c-.6 0-1.9 1.5-1.9 2.3l4.9 11.3 4.8-11.3c0-.9-1.3-2.3-1.8-2.3h-1.3v-1.6h8.5v1.6h-1c-.5 0-2 1.6-2.5 2.3l-7.2 16.3-5.3 11.7-1.9-.9 5.6-11.6-7.2-15.4z\" /></g>\n );\n};\n\nconst MKLogo = ({\n style = {},\n fill = \"#0a1725\",\n stroke = \"transparent\",\n strokeWidth = \"1\",\n fillRule = \"evenodd\",\n viewBox = \"0 0 283.4 90.2\",\n width = \"142\",\n className = \"fow-mk-logo\",\n height = \"45\"\n}) => (\n <svg\n width={width}\n style={style}\n height={height}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox || getViewBox()}\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {getPath({fill,stroke,strokeWidth,fillRule})}\n </svg>\n );\n\nexport default MKLogo;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport MKLogo from \"./svg/MKLogo\";\n\nimport \"./Loading.css\";\n\nconst ReactProgressCircle = ({percentage, size}) => {\n let appliedRadius;\n let appliedStroke;\n switch (size) {\n case 'xs':\n appliedRadius = 10;\n appliedStroke = 1;\n break;\n case 'sm':\n appliedRadius = 25;\n appliedStroke = 1;\n break;\n case 'md':\n appliedRadius = 50;\n appliedStroke = 5;\n break;\n case 'lg':\n appliedRadius = 75;\n appliedStroke = 7.5;\n break;\n case 'xl':\n appliedRadius = 100;\n appliedStroke = 10;\n break;\n default:\n appliedRadius = 50;\n appliedStroke = 5;\n }\n const normalizedRadius = appliedRadius - appliedStroke * 2;\n const circumference = normalizedRadius * 2 * Math.PI;\n const strokeDashoffset =\n circumference - (percentage / 100) * circumference;\n return (\n <div id=\"fow-loading-circle\">\n <svg height={appliedRadius * 2} width={appliedRadius * 2}>\n <circle\n className='fow-loading-circle-back'\n strokeWidth={appliedStroke}\n style={{strokeDashoffset}}\n r={normalizedRadius}\n cx={appliedRadius}\n cy={appliedRadius}\n />\n <circle\n className='fow-loading-circle-circle'\n strokeWidth={appliedStroke}\n strokeDasharray={circumference + ' ' + circumference}\n style={{strokeDashoffset}}\n r={normalizedRadius}\n cx={appliedRadius}\n cy={appliedRadius}\n />\n </svg>\n </div>\n );\n};\n\nclass Loading extends Component {\n\n render() {\n const {loading, list, max} = this.props;\n\n const progress = 100 - (list.length * 100) / max;\n\n return (\n <div id=\"fow-loading\"\n className={loading ? \"show\" : \"hide\"}\n >\n {loading &&\n <div id=\"fow-loading-inner\">\n <ReactProgressCircle size=\"sm\" percentage={progress===0?15:progress} />\n <MKLogo width=\"100\" />\n <span className=\"fow-font-text fow-font-size-sm\">Loading...</span>\n <span className=\"fow-font-text fow-font-size-xs\">{list[0]?list[0].name:'test'}</span>\n </div>\n }\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n loading: state.db.loading,\n list: state.db.loadingList,\n max: state.db.loadingMax\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Loading);\n","import React from \"react\";\n\nconst getViewBox = name => {\n switch (name) {\n case \"world\":\n return \"0 0 36 36\";\n case \"suitcase\":\n return \"0 0 28 26\";\n case \"filter\":\n return \"0 0 25 25\";\n case \"stars\":\n return \"0 0 30 30\";\n case \"home\":\n return \"0 0 24 24\";\n case \"network\":\n return \"0 0 28 28\";\n case \"reference\":\n return \"0 0 78 78\";\n case \"collapse\":\n return \"0 0 70 65\";\n case \"close\":\n return \"0 0 15 15\";\n case \"eye\":\n return \"0 0 32 20\";\n case \"zoom-out\":\n case \"zoom-in\":\n case \"startover\":\n case \"settings\":\n return \"0 0 32 32\";\n case \"arrow-down\":\n return \"0 0 38 24\";\n case \"growth\":\n case \"portfolio\":\n case \"chart\":\n case \"lady\":\n case \"people\":\n return \"0 0 50 50\";\n case \"binoculars\":\n return \"0 10 50 30\";\n case \"marker\":\n return \"0 0 41 39\";\n case \"prev\":\n case \"next\":\n return \"0 0 12 20\";\n case \"up\":\n case \"down\":\n return \"0 0 20 12\";\n default:\n return \"0 0 36 36\";\n }\n};\n\nconst getPath = (name, props) => {\n switch (name) {\n case \"world\":\n return (\n <g {...props} ><path fill={props.fill} d=\"M7.3359 32.0439c.903-.672 1.637-2.408 1.637-2.408s.79-.56 1.072-1.232c.283-.672 0-1.68 0-1.68s.734-2.072.395-2.632c-.338-.56-1.75-.952-1.75-.952s-.564-1.064-1.806-1.288c-.79-.056-1.58-.616-1.58-1.736s1.129-2.912 1.129-2.912 1.185-.56 1.355-1.008c.169-.448.225-1.4.225-1.4s1.129-1.96.509-3.08c-.227-.336-1.13-.616-1.13-.616l-1.298-1.96M27.3188 29.0762c-1.411-.672-3.895-1.232-3.895-1.232s-1.806-2.016-2.992-1.848c-1.185.168-2.371 1.512-2.371 1.512s.057 2.464-.282 2.576c-.395.112-1.355-.56-1.976-.056s-.282 1.904-.282 1.904-1.355.448-1.524.896c-.169.448.508 1.456.621 1.848\" /><path d=\"M16 5.5h-.253C7.618 5.5 1.07 11.996 1.07 20.06s6.548 14.56 14.677 14.56c8.128 0 14.677-6.496 14.677-14.56 0-1.568-.226-3.08-.734-4.48\" /><path d=\"M29.2949 7.6279c0 4.032-6.774 10.248-6.774 10.248s-6.774-6.216-6.774-10.248c0-4.144 3.5-6.552 6.774-6.552s6.774 2.408 6.774 6.552z\" /><path d=\"M22.521 5.5562c1.247 0 2.258 1.003 2.258 2.24 0 1.237-1.011 2.24-2.258 2.24s-2.258-1.003-2.258-2.24c0-1.237 1.011-2.24 2.258-2.24z\" /></g>\n );\n case \"suitcase\":\n return (\n <g {...props}><path d=\"M10.1343 4.1079c0-.992.787-1.778 1.778-1.778h4.241c.992 0 1.778.786 1.778 1.778v1.984h1.881v-1.984c0-2.018-1.641-3.659-3.659-3.659h-4.241c-2.018 0-3.659 1.641-3.659 3.659v1.984h1.881v-1.984zM27.1313 12.7607l-10.123 3.42v1.642c0 .718-.582 1.299-1.3 1.299h-3.351c-.719 0-1.3-.581-1.3-1.299v-1.642l-10.123-3.42v12.791h26.231v-12.791h-.034z\" /><path d=\"M11.0576 14.4365c0-.718.581-1.3 1.299-1.3h3.352c.718 0 1.3.582 1.3 1.3v.376l10.123-3.42v-3.933H.9336v3.967l10.124 3.42v-.41z\" /><path d=\"M12.3569 14.4023c-.034 0-.034.034-.034.034v3.352c0 .034.034.034.034.034h3.352c.034 0 .034-.034.034-.034v-3.352c0-.034-.034-.034-.034-.034h-3.352z\" /></g>\n );\n case \"stars\":\n return (\n <g {...props}><path d=\"M15 .4595l.773 2.38h2.503l-2.025 1.472.774 2.38L15 5.2205l-2.025 1.471.774-2.38-2.025-1.472h2.503zM4.7183 4.7183l2.23 1.136 1.77-1.769-.392 2.471 2.23 1.137-2.472.391-.391 2.472-1.137-2.23-2.471.392 1.769-1.77zM.4595 15l2.38-.773v-2.503l1.472 2.025 2.38-.774L5.2205 15l1.471 2.025-2.38-.774-1.472 2.025v-2.503zM4.7183 25.2817l1.136-2.23-1.769-1.77 2.472.392 1.136-2.23.391 2.472 2.472.391-2.23 1.137.392 2.471-1.77-1.769zM15 29.5405l-.773-2.38h-2.503l2.025-1.472-.774-2.379 2.025 1.47 2.025-1.47-.774 2.379 2.025 1.472h-2.503zM25.2817 25.2817l-2.23-1.136-1.77 1.769.392-2.471-2.23-1.137 2.472-.391.391-2.472 1.137 2.23 2.471-.392-1.769 1.77zM29.5405 15l-2.38.773v2.503l-1.472-2.025-2.379.774L24.7805 15l-1.471-2.025 2.379.774 1.472-2.025v2.503zM25.2817 4.7183l-1.136 2.23 1.769 1.77-2.471-.392-1.137 2.23-.391-2.472-2.472-.391 2.23-1.137-.392-2.471 1.77 1.769z\" /></g>\n );\n case \"network\":\n return (\n <g fill=\"none\" fillRule=\"evenodd\"><path fill={props.fill} d=\"M5.4502.79c2.621 0 4.745 2.125 4.745 4.746 0 2.62-2.124 4.745-4.745 4.745S.7042 8.156.7042 5.536c0-2.621 2.125-4.746 4.746-4.746M21.4814 8.4424c3.211 0 5.814 2.603 5.814 5.814s-2.603 5.814-5.814 5.814-5.814-2.603-5.814-5.814 2.603-5.814 5.814-5.814M4.2959 20.0278c1.983 0 3.591 1.607 3.591 3.591 0 1.983-1.608 3.591-3.591 3.591s-3.591-1.608-3.591-3.591c0-1.984 1.608-3.591 3.591-3.591\" /><path stroke={props.stroke} strokeWidth={props.strokeWidth} d=\"M7.6304 22.165l9.063-4.574M16.1802 11.8623l-6.541-4.061M5.2788 10.2378l-1.368 9.79\" /></g>\n );\n case \"filter\":\n return (\n <g {...props} ><path d=\"M1.2998 1.2998h22.4l-8.8 12v10.4h-4.8v-10.4z\" /></g>\n );\n case \"home\":\n return (\n <g fill=\"none\" fillRule=\"evenodd\"><path fill={props.fill} d=\"M12 .2402l-11 11h2.64v12.52h5.72v-9.12H14.64v9.12h5.72v-12.52H23z\" /><path stroke={props.stroke} strokeWidth={props.strokeWidth} d=\"M12 .2402l-11 11h2.64v12.52h5.72v-9.12H14.64v9.12h5.72v-12.52H23z\" /></g>\n );\n case \"reference\":\n return (\n <g {...props}><path d=\"M13.6 22.6c6 0 10.9-5 10.7-11.1C24 6 19.5 1.5 14 1.3 7.9 1.1 2.9 5.9 2.9 11.9c0 0 0 0 0 0 0 5.9 4.8 10.7 10.7 10.7zm0-19.6c5.2 0 9.4 4.5 8.8 9.9-.4 4.1-3.8 7.4-7.8 7.8-5.4.6-9.9-3.6-9.9-8.8 0 0 0 0 0 0C4.7 7 8.7 3 13.6 3zM2.9 50.5H24v-21H2.9v21zm1.8-19.3h17.6v17.6H4.7V31.2zM2.1 76.9h22.6L13.4 57.3 2.1 76.9zm3-1.8l8.2-14.3 8.2 14.3H5.1zM70.4 11H32c-.5 0-.9.4-.9.9s.4.9.9.9h38.4c.5 0 .9-.4.9-.9s-.5-.9-.9-.9zM69.5 39.1H31.1c-.5 0-.9.4-.9.9s.4.9.9.9h38.4c.5 0 .9-.4.9-.9s-.4-.9-.9-.9zM69.5 66.3H31.1c-.5 0-.9.4-.9.9s.4.9.9.9h38.4c.5 0 .9-.4.9-.9s-.4-.9-.9-.9z\" /></g>\n );\n case \"collapse\":\n return (\n <g {...props}><path stroke={props.stroke} strokeWidth={props.strokeWidth} d=\"M29.9 61.6l1-25.8L6 35.2 5.6 44l9.5.2L.2 57.9l6.1 6.3 14.9-13.6-.3 9.6 8.9 1.4zM39.6 4.5l-1 24.8 24.9.6.4-8.8-9.5-.3 15-13.6L63.2.8 48.3 14.5l.3-10.8-9.6.8z\" /></g>\n );\n case \"close\":\n return (\n <g {...props}><path d=\"M7.5.9766c3.603 0 6.523 2.921 6.523 6.523 0 3.603-2.92 6.524-6.523 6.524-3.603 0-6.523-2.921-6.523-6.524 0-3.602 2.92-6.523 6.523-6.523zM4.2812 4.2812l6.437 6.437M10.7187 4.2812l-6.437 6.437\" /></g>\n );\n case \"eye\":\n return (\n <g {...props}><path d=\"M16 1.25C7.4 1.25 1.25 10 1.25 10S7.4 18.75 16 18.75 30.75 10 30.75 10 24.6 1.25 16 1.25z\" /><path d=\"M16 3.75c3.313 0 6 2.687 6 6s-2.687 6-6 6-6-2.687-6-6 2.687-6 6-6z\" /></g>\n )\n case \"zoom-out\":\n return (\n <g {...props}><circle fill=\"transparent\" cx=\"15.7\" cy=\"15.4\" r=\"11.2\" /><path d=\"M8.1 15.4h15.3\" /></g>\n )\n case \"zoom-in\":\n return (\n <g {...props}><circle fill=\"transparent\" cx=\"16.1\" cy=\"15.6\" r=\"10.7\" /><path d=\"M16.2 8.2v14.9M23.5 15.5H8.6\" /></g>\n )\n case \"startover\":\n return (\n <g {...props}><path d=\"M19.3 25.2l-3.1 3.1-3.1-3.2M24.9 13.3l3.2 3.2-3.1 3.2M13.1 7.7l3.1-3.1 3.1 3.2M7.5 19.6l-3.2-3.2 3.1-3.2m-3.1 3.3H28M16.2 4.5v23.8\" /></g>\n )\n case \"settings\":\n return (\n <g {...props}><path d=\"M12.7 10.2h-7M25.3 10.2h-3.5M16.9 6h4.9v8.4h-4.9zM18.3 22.8h7M5.7 22.8h3.5M9.2 18.6h4.9V27H9.2z\" /></g>\n )\n case \"arrow-down\":\n return (\n <g {...props}><path strokeWidth=\"1\" fill=\"none\" d=\"M9.4 7.2l9.6 9.6 9.6-9.6\" /></g>\n )\n case \"growth\":\n return (\n <g {...props}><path d=\"M6.7 6.5v36.7H44M28 17.4l9.9 5-.5-10.9z\" /><path d=\"M11.8 37.2l4.8-8.6H28l4.9-8.5\" /></g>\n )\n case \"portfolio\":\n return (\n <g {...props}><path d=\"M7 13.1h36.8v27.6H7zM18 13.1v-4h14.6v4\" /><path d=\"M23 22.1h4.9v4.1H23zM7 18.8l16 5.3M43.8 18.8l-15.9 5.3\" /></g>\n )\n case \"chart\":\n return(\n <g {...props}><path d=\"M4.9 9.8v32.4h40V9.8H24.5L21.7 7H10.5L7.7 9.7z\" /><path d=\"M8.6 12.7h32.7v25.8H8.6zM11.8 10.3h9.4M11.5 35.2h26.9\" /><path d=\"M27.4 35.2V17.1h6.4v18.1M27.4 21.5h-6v13.7M21.4 28.3h-5.3v6.9\" /></g>\n )\n case \"lady\":\n return(\n <g {...props} fill=\"transparent\"><circle cx=\"11.2\" cy=\"7.2\" r=\"4\" /><path d=\"M6.8 19.1L3.1 37.5h16.3l-3.6-18.2 10.6 4.8 1.6-3.3-12.8-7H6.3l-3.2 2.6v11.8h1.8M6.7 37.9v8.3h8.6v-8.3M11 37.9v7.9M29.7 12v33.8M21.5 28.9h25.9\" /><path d=\"M23.4 18.3c1.7-4 4.4-6.5 7.3-6.5 5.2 0 9.4 7.6 9.4 17.1S35.9 46 30.8 46s-9.4-7.6-9.4-17.1c0-2.2.2-4.5.7-6.7\" /><path d=\"M20.8 14.5c7.9-5.1 18.5-2.8 23.6 5.1s2.9 18.5-5 23.7c-6.8 4.4-15.8 3.4-21.5-2.3 1.4-1.9 6.5-3.2 12.2-3.2 5.6 0 10.4 1.3 12 3.2\" /><path d=\"M42.3 17c-1.4 1.9-6.3 3.4-12.2 3.4-1.1 0-2.1-.1-3.1-.1\" /></g>\n )\n case \"people\":\n return (\n <g {...props}><circle cx=\"26\" cy=\"8\" r=\"4.1\" /><path d=\"M19.9 27.3h-1.5V16.9c0-1.6 1.3-2.9 2.9-2.9h8.5c1.6 0 2.9 1.3 2.9 2.9v10.5h-1.6\" /><circle cx=\"15.4\" cy=\"9\" r=\"3.7\" /><path d=\"M10.5 29.9H7.2V17.6c0-1.6 1.3-2.9 2.9-2.9h5.7M21.7 17.9l-3.5 18.5H33l-3.6-18.5M21.3 36.4v9.3h8.4v-9.3M25.5 36.4v9.4\" /><path d=\"M10.5 19.5v24.9h8.2M15 29v15.4\" /><circle cx=\"36\" cy=\"9\" r=\"3.7\" /><path d=\"M40.8 29.9h3.3V17.6c0-1.6-1.3-2.9-2.9-2.9h-5.7\" /><path d=\"M40.8 19.5v24.9h-8.2M36.3 29v15.4\" /></g>\n )\n case \"marker\":\n return (\n <g {...props} fill=\"transparent\"><path d=\"M30.8 13.5c0 6.3-10.6 17.5-10.6 17.5S9.5 19.8 9.5 13.5C9.5 7.1 15 3.4 20.1 3.4s10.7 3.7 10.7 10.1z\" /><circle cx=\"20.1\" cy=\"14\" r=\"3.2\" /><path d=\"M12.7 27.4c-4.5.7-7.5 2.1-7.5 3.7 0 2.3 6.7 4.3 14.9 4.3S35 33.5 35 31.1c0-1.6-3-2.9-7.5-3.7\" /></g>\n )\n case \"next\":\n return (\n <g {...props}><path d=\"M1.5 19l9-9-9-9\" /></g>\n )\n case \"prev\":\n return (\n <g {...props}><path d=\"M10.5 1l-9 9 9 9\"/></g>\n )\n case \"up\":\n return (\n <g {...props}><path fill=\"transparent\" d=\"M19 10.5l-9-9-9 9\"/></g>\n )\n case \"down\":\n return (\n <g {...props}><path fill=\"transparent\" d=\"M1 1.5l9 9 9-9\"/></g>\n )\n case \"binoculars\":\n return (\n <g {...props}><circle cx=\"16.4\" cy=\"27.4\" r=\"6.4\" /><circle cx=\"25.4\" cy=\"27.5\" r=\".9\" /><path d=\"M13.5 28.5c-.2-.3-.2-.7-.2-1.1 0-1.7 1.4-3.1 3.2-3.1h.6\" /><circle cx=\"34.2\" cy=\"27.5\" r=\"6.4\" /><path d=\"M31.3 28.5c-.2-.3-.2-.7-.2-1.1 0-1.7 1.4-3.1 3.2-3.1h.6M21 23s3.6 3 8.7 0M21 31.9s3.5-3 8.4 0M23.3 20.6c-.1-.8-.3-1.6-.7-2.3-.9-1.5-2.7-1.9-4.3-1.4-1.7.5-3 1.9-4 3.2-.4.5-.8 1.1-1.1 1.7M27.1 20.6c.1-.8.3-1.6.7-2.3.9-1.5 2.7-1.9 4.3-1.4s3 1.9 4 3.2c.4.5.8 1.1 1.1 1.7M22.4 18h5.5\" /></g>\n )\n\n default:\n return <path />;\n }\n};\n\nconst SVGIcon = ({\n name = \"\",\n style = {},\n fill = \"#fff\",\n stroke = \"#fff\",\n strokeWidth = \".803\",\n fillRule = \"evenodd\",\n viewBox = \"\",\n width = \"100%\",\n className = \"\",\n height = \"100%\"\n}) => (\n <svg\n width={width}\n style={style}\n height={height}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox || getViewBox(name)}\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {getPath(name, {fill,stroke,strokeWidth,fillRule})}\n </svg>\n );\n\nexport default SVGIcon;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport SVGIcon from \"../svg/SVGIcon\";\nimport {NAV, VIEWS} from \"../../helpers/consts\";\nimport {withRouter, Link} from 'react-router-dom';\nimport {setNavOpenAction} from \"../../actions/SettingsAction\";\n\nimport \"./Nav.css\";\n\nclass Nav extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n hidden: false\n }\n this.onClickView = this.onClickView.bind(this);\n this.onClickToggle = this.onClickToggle.bind(this);\n this.setNavOpen = this.setNavOpen.bind(this);\n }\n\n componentDidMount() {\n\n }\n\n componentWillUnmount() {\n\n }\n\n onClickView(view,e){\n switch (view.type) {\n case 'view':\n e.preventDefault();\n this.props.history.push(view.link);\n break;\n case 'external':\n console.info('external link->', view.link)\n break;\n default:\n break;\n }\n this.setNavOpen(false);\n }\n\n onClickToggle(e) {\n e.preventDefault();\n const {nav} = this.props;\n this.setNavOpen(!nav.open);\n }\n\n setNavOpen(open){\n this.props.setNavOpenAction(open);\n }\n\n getButtonTypeClass(view){\n let className=\"fow-nav-item-full\";\n if (!view.name){\n className = \"fow-nav-item-icon\";\n }\n if(!view.icon){\n className=\"fow-nav-item-label\";\n }\n return className;\n }\n\n render() {\n const {nav, isMobile, hashParts} = this.props;\n const selected = hashParts\n const isNotMap = selected.type !== \"page\" ;\n const options = NAV.main;\n const linkHome = `/page/${VIEWS.HOME}`;\n\n return (\n <div id=\"fow-nav-placeholder\">\n <div id=\"fow-nav\" className={`fow-nav-${nav.fixed?'fixed':'static'}`}>\n <ul id=\"fow-view-nav\" className={`${isNotMap ? '' : 'fow-is-home'} ${nav.open ?'fow-view-nav-open':''}`}>\n <li>\n <a href={linkHome} className={`fow-nav-item-brand fow-nav-item-label`} onClick={(e) => isMobile ? this.onClickToggle(e) : this.onClickView({type: 'view', link: linkHome}, e)}>\n <span className=\"fow-nav-brand fow-font-text fow-font-size-md\">Future of Work in Europe</span>\n <span className=\"fow-collapse-btn\"><SVGIcon width=\"30\" name=\"eye\" fill=\"transparent\" /></span>\n </a>\n </li>\n {\n options.map((view)=>\n <li key={view.slug}>\n <Link to={`?page=${view.link}`} className={`fow-nav-item ${selected.view === view.slug ? 'fow-selected' : ''} ${this.getButtonTypeClass(view)}`}>\n {view.name &&\n <span className=\"fow-nav-label fow-font-text fow-font-size-md\">{view.name}</span>\n }\n </Link>\n </li>\n )\n }\n <li>\n <a href=\"https://www.mckinsey.com/featured-insights/future-of-work/the-future-of-work-in-europe\" className={`fow-nav-item fow-nav-item-label`} target=\"_blank\" rel=\"noopener noreferrer\" >\n <span className=\"fow-nav-label fow-font-text fow-font-size-md\">Read Report</span>\n </a>\n </li>\n </ul>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n nav: state.settings.nav,\n hashParts: state.settings.hashParts,\n hash: state.settings.hash,\n isMobile: state.settings.window.width < 768\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setNavOpenAction: open => dispatch(setNavOpenAction(open)),\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(Nav));\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport SVGIcon from \"../svg/SVGIcon\";\nimport {withRouter} from 'react-router-dom';\nimport {setLogOut} from '../../helpers/security';\n\nimport \"./ContactUs.css\";\n\nclass ContactUs extends Component {\n\n constructor(props) {\n super(props);\n\n this.onClickLogout = this.onClickLogout.bind(this);\n }\n\n onClickLogout() {\n const {history} = this.props;\n setLogOut(()=>{\n history.push('?page=/login');\n });\n }\n\n render() {\n const link = \"https://www.mckinsey.com/mgi/contact\";\n return (\n <div id=\"fow-contact-us\">\n <div className=\"fow-inner-container\">\n <div className=\"fow-row fow-row-to-col\">\n <div className=\"fow-col fow-col-1 fow-text-center\">\n <h4 className=\"fow-font-title fow-font-size-xl fow-text-center\">Connect with our Future of Work experts</h4>\n <div className=\"fow-contact-btn\">\n <a href={link} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fow-font-size-sm\">\n <SVGIcon name=\"world\" width=\"20\" height=\"20\" fill=\"transparent\" strokeWidth=\"2\" />\n <span className=\"fow-font-text fow-font-size-md fow-contact-label\">Contact Us</span>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default withRouter(connect(null, null)(ContactUs));\n","import {fromJS} from \"immutable\";\nimport MAP_STYLE from \"./map-style-basic-v8.json\";\nimport LABEL_STYLE from \"./map-style-basic-v8-labels.json\";\n\nexport const baseStyle = fromJS(MAP_STYLE);\nexport const countryLabelStyle = LABEL_STYLE.country;\nexport const cityLabelStyle = LABEL_STYLE.city;\nexport const placeLabelStyle = LABEL_STYLE.place;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport {setLegendStateAction} from \"./../../actions/SettingsAction\";\nimport SVGIcon from \"./../svg/SVGIcon\";\n\nimport \"./MapLegend.css\";\n\nclass MapLegend extends Component {\n\n constructor(props){\n super(props);\n this.toggleOpen = this.toggleOpen.bind(this);\n }\n\n toggleOpen(){\n const {open, setLegendState} = this.props;\n setLegendState(!open);\n }\n\n render() {\n const {open, legendOptions } = this.props;\n\n return (\n <div id=\"fow-legend\" className={open ? 'fow-legend-open' : 'fow-legend-closed'}>\n <div id=\"fow-legend-action\" onClick={this.toggleOpen}>\n {open &&\n <span><SVGIcon name=\"collapse\" height=\"20\" width=\"20\" fill=\"#444\"/></span>\n }\n {!open &&\n <span><SVGIcon name=\"reference\" strokeWidth=\"2\" height=\"25\" width=\"25\" stroke=\"#051C2C\" fill=\"#051C2C\" /></span>\n }\n </div>\n {open &&\n <div>\n <div id=\"fow-legend-title\" className=\"fow-font-text fow-font-size-md\">{legendOptions.title}</div>\n {legendOptions.subtitle &&\n <div id=\"fow-legend-subtitle\" className=\"fow-font-text fow-font-size-xs\">{legendOptions.subtitle}</div>\n }\n <div id=\"fow-legend-item-container\">\n {legendOptions.items.filter(lo => lo[0] !== '').map((c,ix) =>\n <div key={ix} className=\"fow-legend-item\">\n <div className=\"fow-legend-item-color\" style={{backgroundColor: c[1]}}></div>\n <div className=\"fow-legend-item-label fow-font-text fow-font-size-xs\">{c[0]}</div>\n </div>\n )}\n </div>\n </div>\n }\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n open: state.settings.legendOpen,\n legendOptions: state.db.map.legend,\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setLegendState: open => dispatch(setLegendStateAction(open)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MapLegend);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport SVGIcon from \"./../svg/SVGIcon\";\n\nimport {startOverMapAction, setMapZoomAction} from \"./../../actions/DataAction\";\n\nimport \"./MapButton.css\";\n\nclass MapButton extends Component {\n\n constructor(props) {\n super(props);\n this.getIcon = this.getIcon.bind(this);\n this.onClickMapControl = this.onClickMapControl.bind(this);\n }\n\n onClickMapControl(){\n const {action, setMapZoom, startOverMap} = this.props;\n switch (action) {\n case 'startOver':\n startOverMap();\n break;\n case 'zoomIn':\n setMapZoom(true);\n break;\n case 'zoomOut':\n setMapZoom(false);\n break;\n default:\n break;\n }\n }\n\n getIcon(){\n const {action} = this.props;\n let iconName, iconParams;\n switch (action) {\n case 'startOver':\n iconName = 'startover';\n iconParams = {\n strokeWidth: 1.68,\n stroke: \"#2048DD\"\n }\n break;\n case 'zoomIn':\n iconName = 'zoom-in';\n iconParams = {\n strokeWidth: 1.68,\n stroke: \"#2048DD\"\n }\n break;\n case 'zoomOut':\n iconName = 'zoom-out';\n iconParams = {\n strokeWidth: 1.68,\n stroke: \"#2048DD\"\n }\n break;\n default:\n break;\n }\n return <SVGIcon name={iconName} {...iconParams} />\n }\n\n render() {\n const icon = this.getIcon();\n return (\n <div className=\"fow-map-button\" onClick={this.onClickMapControl}>{icon}</div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n\n };\n};\nconst mapDispatchToProps = dispatch => ({\n startOverMap: () => dispatch(startOverMapAction()),\n setMapZoom: data => dispatch(setMapZoomAction(data)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MapButton);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport MapLegend from \"./MapLegend\";\nimport MapButton from \"./MapButton\";\n\nimport \"./MapControls.css\";\n\nclass MapControls extends Component {\n\n render() {\n return (\n <div id=\"fow-map-controls\">\n <MapButton action=\"zoomIn\" />\n <MapButton action=\"zoomOut\" />\n <MapButton action=\"startOver\" />\n <MapLegend />\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n\n };\n};\nconst mapDispatchToProps = dispatch => ({\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MapControls);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter} from 'react-router-dom';\nimport ReactMapGL, {Source, Layer} from 'react-map-gl';\n\nimport {MAPBOX_TOKEN} from \"./../../helpers/consts\";\nimport {baseStyle, countryLabelStyle, cityLabelStyle, placeLabelStyle} from \"./../../helpers/baseMapLayer\";\n\nimport {setMapViewportAction, setDefaultViewportAction} from \"./../../actions/DataAction\";\nimport {setTooltipDataAction} from \"./../../actions/SettingsAction\";\n\nimport {VIEWS} from \"../../helpers/consts\";\n\nimport MapControls from \"./MapControls\";\n\nimport GeoViewport from '@mapbox/geo-viewport';\n\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport \"./Map.css\";\n\nclass Map extends Component {\n constructor(props) {\n super(props);\n this.mapRef = React.createRef();\n this.boundsLimits = {minLat: 33, minLng: -10, maxLat: 75, maxLng: 33};\n this.state = {\n hoverFilter: ['in', 'id', '']\n }\n this.dataFormat = this.dataFormat.bind(this);\n this.getGeoGLConfig = this.getGeoGLConfig.bind(this);\n this.onMapHover = this.onMapHover.bind(this);\n this.onViewportChange = this.onViewportChange.bind(this);\n this.calculateMapSizes = this.calculateMapSizes.bind(this);\n }\n\n dataFormat(shapes) {\n return shapes;\n }\n\n componentDidMount() {\n setTimeout(() => {\n const {viewport, setDefaultViewportAction} = this.props;\n const sizes = this.calculateMapSizes();\n const results = GeoViewport.viewport(\n [\n this.boundsLimits.minLng,\n this.boundsLimits.minLat,\n this.boundsLimits.maxLng,\n this.boundsLimits.maxLat\n ],\n [\n sizes.w,\n sizes.h\n ]\n );\n const zoom = sizes.w < 800 ? 2.5 : results.zoom;\n setDefaultViewportAction(\n {\n ...viewport,\n longitude: results.center[0],\n latitude: results.center[1],\n zoom: zoom,\n minZoom: zoom\n });\n }, 1000);\n }\n\n componentWillUnmount() {\n\n }\n\n onViewportChange(newViewport) {\n const {setMapViewportAction} = this.props;\n\n if (newViewport.longitude < this.boundsLimits.minLng) {\n newViewport.longitude = this.boundsLimits.minLng;\n } else if (newViewport.longitude > this.boundsLimits.maxLng) {\n newViewport.longitude = this.boundsLimits.maxLng;\n }\n if (newViewport.latitude < this.boundsLimits.minLat) {\n newViewport.latitude = this.boundsLimits.minLat;\n } else if (newViewport.latitude > this.boundsLimits.maxLat) {\n newViewport.latitude = this.boundsLimits.maxLat;\n }\n\n setMapViewportAction(newViewport);\n }\n\n onMapHover(event) {\n const {features, srcEvent: {offsetX, offsetY}} = event;\n const {setTooltipData, width} = this.props;\n\n if(features){\n if (features.length === 0) {\n setTooltipData(null);\n } else {\n const feature = features.find(f=>f.source!=='mapbox');\n\n if (feature){\n //this.setState({hoverFilter: ['in', 'id', features[0].properties.id]});\n let direction, finalX, finalY;\n if(width>640){\n direction = offsetX + 25 + 320 < width ? 'R':'L';\n finalX = direction === 'R' ? offsetX + 10 : offsetX - 350;\n finalY = offsetY - 25;\n } else {\n direction = 'B';\n finalX = 0;\n finalY = offsetY + 10;\n }\n const hoveredFeature = {\n x: finalX,\n y: finalY,\n data: feature.properties,\n direction: direction\n };\n setTooltipData(hoveredFeature);\n } else {\n //this.setState({hoverFilter: ['in', 'id', '']});\n setTooltipData(null);\n }\n }\n }\n }\n\n getGeoGLConfig() {\n return baseStyle;\n }\n\n calculateMapSizes(){\n const {width, height} = this.props;\n return {\n w: width,\n h: height - 250\n }\n }\n\n render() {\n const {viewport, mapData, mapStyle, selectedCluster, selectedRegion, hashParts} = this.props;\n\n const selected = hashParts;\n\n const selectedItem = selectedCluster || selectedRegion;\n\n const isSelection = selectedItem.id !== 14 && selected.view === VIEWS.REGIONAL_CLUSTER;\n\n const selectedFilter = isSelection ? ['in', selectedItem.type===\"Cluster\"?'cluster_id':'id', selectedItem.id]:['in', 'id', ''];\n\n let mapSizes = this.calculateMapSizes();\n let mapLeftMargin = mapSizes.w < 1500 ? -30 : -(mapSizes.w - 1500)/2 - 15\n\n const regularMapStyle = {\n ...mapStyle,\n paint: {\n ...mapStyle.paint,\n \"fill-opacity\": isSelection?0.2:0.8,\n \"fill-outline-color\": \"rgba(255,255,255,0.5)\"\n }\n }\n\n const selectedMapStyle = {\n ...mapStyle,\n id: \"selected\",\n paint: {\n ...mapStyle.paint,\n \"fill-opacity\": 1,\n \"fill-outline-color\": \"rgba(0,0,0,1)\"\n }\n }\n\n return <div id=\"fow-map\" style={{marginLeft: mapLeftMargin}}>\n <MapControls />\n <ReactMapGL\n ref={map => this.mapRef = map}\n {...viewport}\n scrollZoom={false}\n mapStyle={this.getGeoGLConfig()}\n height={mapSizes.h}\n width={mapSizes.w}\n mapboxApiAccessToken={MAPBOX_TOKEN}\n onViewportChange={this.onViewportChange}\n onHover={this.onMapHover}\n >\n {mapData && mapStyle && regularMapStyle && mapStyle.type === 'fill' && (\n <>\n <Source type=\"geojson\" data={mapData}>\n <Layer {...regularMapStyle} />\n <Layer {...selectedMapStyle} filter={selectedFilter} />\n </Source>\n <Layer {...placeLabelStyle} />\n <Layer {...cityLabelStyle} />\n <Layer {...countryLabelStyle} />\n </>\n )}\n </ReactMapGL>\n </div>;\n }\n}\n\nconst mapStateToProps = state => {\n return {\n hashParts: state.settings.hashParts,\n mapData: state.db.map.geojson,\n mapStyle: state.db.map.style,\n viewport: state.db.map.viewport,\n width: state.settings.window.width,\n height: state.settings.window.height,\n breakpoint: state.settings.window.breakpoint,\n selectedCluster: state.settings.map[\"Clusters\"],\n selectedRegion: state.settings.map[\"Regions\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setTooltipData: data => dispatch(setTooltipDataAction(data)),\n setDefaultViewportAction: viewport => dispatch(setDefaultViewportAction(viewport)),\n setMapViewportAction: viewport => dispatch(setMapViewportAction(viewport))\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(Map));\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport Autosuggest from 'react-autosuggest';\nimport {escapeRegexCharacters, normalizeString} from \"./../../helpers/formatters\";\nimport {setSelectMapControlAction} from \"./../../actions/SettingsAction\";\nimport SVGIcon from \"./../svg/SVGIcon\";\n\nimport \"./Select.css\";\n\n// When suggestion is clicked, Autosuggest needs to populate the input\n// based on the clicked suggestion. Teach Autosuggest how to calculate the\n// input value for every given suggestion.\nconst getSuggestionValue = suggestion => suggestion.name;\n\n// Use your imagination to render suggestions.\nconst renderSuggestion = suggestion => (\n <div>{suggestion.name}</div>\n);\n\nclass Select extends Component {\n constructor(props) {\n super();\n // Autosuggest is a controlled component.\n // This means that you need to provide an input value\n // and an onChange handler that updates this value (see below).\n // Suggestions also need to be provided to the Autosuggest,\n // and they are initially empty because the Autosuggest is closed.\n this.state = {\n value: '',\n suggestions: [],\n showSelect: false\n };\n this.getSuggestions = this.getSuggestions.bind(this);\n this.onSuggestionSelected = this.onSuggestionSelected.bind(this);\n }\n\n // Teach Autosuggest how to calculate suggestions for any given input value.\n getSuggestions = value => {\n const {searchList, optionsKey} = this.props;\n const escapedValue = escapeRegexCharacters(normalizeString(value.trim()));\n const items = searchList.find(cat => cat.title === optionsKey).items;\n if (escapedValue === '' ) {\n return items;\n }\n return items.filter(item => item.meta.search(escapedValue) !== -1);\n };\n\n onChange = (event, {newValue}) => {\n this.setState({\n value: newValue\n });\n };\n\n onBlur = (event, {highlightedSuggestion}) => {\n const {optionsKey, setSelectMapControlAction, selectedItems} = this.props;\n const selectedItem = selectedItems[optionsKey];\n\n if (highlightedSuggestion){\n setSelectMapControlAction(highlightedSuggestion, optionsKey);\n } else if (selectedItem) {\n setSelectMapControlAction(selectedItem, optionsKey);\n }\n this.setState({\n value: '',\n showSelect:false,\n suggestions: []\n });\n };\n\n // Autosuggest will call this function every time you need to update suggestions.\n // You already implemented this logic above, so just use it.\n onSuggestionsFetchRequested = ({value, reason}) => {\n let showSelect = this.state.showSelect\n if (reason ==='suggestion-selected'){\n showSelect = false;\n }\n this.setState({\n showSelect: showSelect,\n suggestions: this.getSuggestions(value)\n });\n };\n\n // Autosuggest will call this function every time you need to clear suggestions.\n onSuggestionsClearRequested = () => {\n this.setState({\n suggestions: []\n });\n };\n\n onSuggestionSelected = (event, {suggestion, suggestionValue, suggestionIndex, sectionIndex, method}) => {\n const {optionsKey} = this.props;\n this.props.setSelectMapControlAction(suggestion, optionsKey);\n this.setState({\n value: '',\n suggestions: []\n });\n }\n\n clearOnClick = () =>{\n //const {optionsKey} = this.props;\n //this.props.setSelectMapControlAction(false, optionsKey);\n this.setState({\n showSelect: !this.state.showSelect,\n suggestions: this.getSuggestions('')\n });\n }\n\n render() {\n const {value, suggestions, showSelect} = this.state;\n const {selectedItems, optionsKey} = this.props;\n\n const selectedItem = selectedItems[optionsKey];\n\n // Autosuggest will pass through all these props to the input.\n const inputProps = {\n placeholder: `Search ${optionsKey}`,\n value,\n onChange: this.onChange,\n onBlur: this.onBlur,\n onKeyPress:(e) => {e.key === 'Enter' && e.preventDefault();}\n };\n\n // Finally, render it!\n return (\n <div className=\"fow-select\">\n {selectedItem &&\n <div className=\"fow-select-selected-block\" onClick={this.clearOnClick}>\n <span>{selectedItem.name}</span><SVGIcon name=\"arrow-down\" stroke=\"#000\" width={30} />\n </div>\n }\n <div className={`fow-select-container ${showSelect ? 'fow-select-show' : 'fow-select-hide'} `}>\n <Autosuggest\n id={`fow-select-${optionsKey}`}\n alwaysRenderSuggestions={true}\n suggestions={suggestions}\n focusInputOnSuggestionClick={false}\n highlightFirstSuggestion={true}\n onSuggestionSelected={this.onSuggestionSelected}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={renderSuggestion}\n inputProps={inputProps}\n />\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n searchList: state.db.search.options,\n selectedItems: state.settings.map\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setSelectMapControlAction: (data,group) => dispatch(setSelectMapControlAction(data,group)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Select);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport {setSwitchMapControlAction} from \"./../../actions/SettingsAction\";\n\nimport \"./SwitchControl.css\";\n\nclass SwitchControl extends Component {\n\n constructor(props) {\n super();\n this.onOptionSelected = this.onOptionSelected.bind(this);\n }\n\n componentDidMount() {\n const {options, selectedItems, optionsKey, setSwitchMapControlAction} = this.props;\n if (!selectedItems[optionsKey]){\n setSwitchMapControlAction(options[0], optionsKey);\n }\n }\n\n onOptionSelected = (option) => {\n const {optionsKey, selectedItems, setSwitchMapControlAction} = this.props;\n const selectedItem = selectedItems[optionsKey];\n if (selectedItem.key !== option.key){\n setSwitchMapControlAction(option, optionsKey);\n }\n }\n\n render() {\n const {label, options, optionsKey, selectedItems, disabled} = this.props;\n const selectedItem = selectedItems[optionsKey];\n return (\n <div className=\"fow-switch-control\">\n {disabled &&\n <div className=\"fow-switch-disabled\"></div>\n }\n {label &&\n <span className=\"fow-switch-label fow-font-text fow-font-size-sm\">{label}</span>\n }\n <div className=\"fow-switch-options\">\n {options.map(item =>\n <div key={item.key} className={`fow-switch-options-item fow-font-text fow-font-size-md ${selectedItem && selectedItem.key === item.key ? 'fow-switch-options-item-selected' : ''}`} onClick={() => this.onOptionSelected(item)}>{item.value}</div>\n )}\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n selectedItems: state.settings.switch\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setSwitchMapControlAction: (data, group) => dispatch(setSwitchMapControlAction(data, group))\n});\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SwitchControl);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport Autosuggest from 'react-autosuggest';\nimport {escapeRegexCharacters, normalizeString} from \"./../../helpers/formatters\";\nimport {CLUSTERS_COLORS_MAP} from \"./../../helpers/colors\";\nimport {setSelectMapControlAction} from \"./../../actions/SettingsAction\";\nimport SVGIcon from \"../svg/SVGIcon\";\n\nimport \"./Search.css\";\n\n// When suggestion is clicked, Autosuggest needs to populate the input\n// based on the clicked suggestion. Teach Autosuggest how to calculate the\n// input value for every given suggestion.\nconst getSuggestionValue = suggestion => suggestion.name;\n\n// Use your imagination to render suggestions.\nconst renderSuggestion = suggestion => (\n <div>\n {suggestion.type === \"Cluster\" &&\n <div className=\"fow-search-suggestion-item\">\n <span className=\"fow-search-legend-color\" style={{backgroundColor: CLUSTERS_COLORS_MAP[suggestion.name]}}></span>\n <span className=\"fow-search-legend-name\">{suggestion.name}</span>\n </div>\n }\n {suggestion.type === \"Region\" &&\n <div className=\"fow-search-suggestion-item fow-search-suggestion-item-region\">\n <span className=\"fow-search-legend-color\"><SVGIcon name=\"world\" fill=\"transparent\" /></span>\n <span className=\"fow-search-legend-name\">{suggestion.name}</span>\n </div>\n }\n </div>\n);\n\nconst getSectionSuggestions = section => {\n return section.items;\n}\n\nconst renderSectionTitle = section => {\n return (\n <strong>{section.title}</strong>\n );\n}\n\nclass Search extends Component {\n constructor(props) {\n super();\n // Autosuggest is a controlled component.\n // This means that you need to provide an input value\n // and an onChange handler that updates this value (see below).\n // Suggestions also need to be provided to the Autosuggest,\n // and they are initially empty because the Autosuggest is closed.\n this.state = {\n value: '',\n suggestions: [],\n showSelect: false\n };\n this.getSuggestions = this.getSuggestions.bind(this);\n this.onSuggestionSelected = this.onSuggestionSelected.bind(this);\n }\n\n // Teach Autosuggest how to calculate suggestions for any given input value.\n getSuggestions = value => {\n const {searchList, searchDefaultList} = this.props;\n\n const escapedValue = escapeRegexCharacters(normalizeString(value.trim()));\n if (escapedValue === '' ) {\n return searchDefaultList;\n }\n\n const score = (a, b) => {\n let score = 0;\n if (a.startsWith(b)) {\n score += 0.5;\n } else if (b.startsWith(a)) {\n score += 0.4;\n }\n score += (1.0 / Math.abs(a.length - b.length));\n return score;\n }\n\n const resp = searchList\n .map(section => {\n let items = section.items.filter(item => {\n return item.id !== 14 && item.meta.search(escapedValue) !== -1\n });\n return {\n title: section.title,\n items\n };\n })\n .filter(section => section.items.length > 0);\n\n for (let i=0; i < resp.length; i++) {\n let kind = resp[i];\n kind.items = kind.items.map(x => {\n return {...x, score: score(x.name, escapedValue)}\n }).sort((a,b) => b.score - a.score);\n }\n\n return resp;\n };\n\n onChange = (event, {newValue}) => {\n this.setState({\n value: newValue\n });\n };\n\n onBlur = (event, {newValue}) => {\n this.setState({\n value: '',\n suggestions: [],\n showSelect: false\n });\n };\n\n // Autosuggest will call this function every time you need to update suggestions.\n // You already implemented this logic above, so just use it.\n onSuggestionsFetchRequested = ({value, reason}) => {\n let showSelect = this.state.showSelect\n if (reason === 'suggestion-selected') {\n showSelect = false;\n }\n this.setState({\n showSelect: showSelect,\n suggestions: this.getSuggestions(value)\n });\n };\n\n // Autosuggest will call this function every time you need to clear suggestions.\n onSuggestionsClearRequested = () => {\n this.setState({\n suggestions: []\n });\n };\n\n onSuggestionSelected = (event, {suggestion, suggestionValue, suggestionIndex, sectionIndex, method}) => {\n this.props.setSelectMapControlAction(suggestion, suggestion.type === 'Cluster' ? 'Clusters' : 'Regions', suggestion.type === 'Cluster' ? 'Regions' : 'Clusters');\n this.setState({\n value: '',\n suggestions: []\n });\n }\n\n clearOnClick = () =>{\n //this.props.setSelectMapControlAction(null);\n this.setState({\n showSelect: !this.state.showSelect,\n suggestions: this.getSuggestions('')\n });\n }\n\n render() {\n const {value, suggestions, showSelect} = this.state;\n const {selectedCluster, selectedRegion} = this.props;\n\n const selectedItem = selectedCluster || selectedRegion;\n\n const selectedName = selectedItem.id === 14 && selectedItem.type === \"Cluster\" ? 'Select Market Cluster & Region' : selectedItem.name\n\n // Autosuggest will pass through all these props to the input.\n const inputProps = {\n placeholder: 'Search Clusters & Regions',\n value,\n onChange: this.onChange,\n onBlur: this.onBlur,\n onKeyPress:(e) => {e.key === 'Enter' && e.preventDefault();}\n };\n\n // Finally, render it!\n return (\n <div className=\"fow-search\">\n {selectedItem &&\n <div className=\"fow-search-selected-block\" onClick={this.clearOnClick}>\n <span>{selectedName}</span><SVGIcon name=\"arrow-down\" stroke=\"#000\" width={30} />\n </div>\n }\n <div className={`fow-search-container ${showSelect ? 'fow-search-show' : 'fow-search-hide'} `}>\n <Autosuggest\n alwaysRenderSuggestions={true}\n suggestions={suggestions}\n multiSection={true}\n focusInputOnSuggestionClick={false}\n onSuggestionSelected={this.onSuggestionSelected}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={renderSuggestion}\n renderSectionTitle={renderSectionTitle}\n getSectionSuggestions={getSectionSuggestions}\n inputProps={inputProps}\n />\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n searchDefaultList: state.db.search.default,\n searchList: state.db.search.options,\n selectedCluster: state.settings.map[\"Clusters\"],\n selectedRegion: state.settings.map[\"Regions\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setSelectMapControlAction: (data, group, clearGroup) => dispatch(setSelectMapControlAction(data, group, clearGroup)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Search);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter} from 'react-router-dom';\nimport {VIEWS} from \"../../helpers/consts\";\n\nimport Select from \"../search/Select\";\nimport SwitchControl from \"../switch/SwitchControl\";\nimport SVGIcon from \"../svg/SVGIcon\";\nimport Search from \"../search/Search\";\n\nimport {setSettingsOpenAction} from \"../../actions/SettingsAction\";\n\nimport \"./InfoBox.css\";\n\nclass InfoBox extends Component {\n\n constructor(props) {\n super(props);\n this.onClickToggle = this.onClickToggle.bind(this);\n this.setSettingsOpen = this.setSettingsOpen.bind(this);\n }\n\n onClickToggle(e) {\n e.preventDefault();\n const {nav} = this.props;\n this.setSettingsOpen(!nav.settings);\n }\n\n setSettingsOpen(open) {\n this.props.setSettingsOpenAction(open);\n }\n\n render() {\n const {occupationMeasure, nav, isMobile, hashParts} = this.props;\n const selected = hashParts;\n\n return (\n <div id=\"fow-info-box-placeholder\">\n <div id=\"fow-info-box\" className={`fow-info-box-${nav.fixed ? 'fixed' : 'static'}`}>\n <div className=\"fow-inner-container\">\n <div id=\"fow-info-box-content\" className={`fow-row ${isMobile && !nav.fixed ? 'fow-row-wrap' : 'fow-row-nowrap'}`}>\n {selected.view === VIEWS.OCCUPATIONAL &&\n <>\n <div className={`fow-col fow-col-1-4 fow-lg-col-1-3 fow-md-col-1-2 fow-sm-col-${isMobile && !nav.fixed ? '5-6' : '6-6'}`}>\n <div className=\"fow-info-box-single-title\">\n <SVGIcon stroke=\"#051C2C\" width=\"30\" strokeWidth=\"1.5\" name=\"binoculars\" /><span className=\"fow-info-box-title fow-font-text fow-font-size-sm\">Select an occupation</span>\n </div>\n <Select optionsKey=\"Occupations\" />\n </div>\n <div className={`fow-col-1-6 fow-info-box-settings-icon fow-info-box-${isMobile && !nav.fixed ? 'show' : 'hide'}`} onClick={(e) => this.onClickToggle(e)}>\n <SVGIcon stroke=\"#051C2C\" width=\"40\" strokeWidth=\"1.5\" name=\"settings\" />\n </div>\n </>\n }\n {selected.view === VIEWS.EMPLOYMENT &&\n <>\n <div className={`fow-col fow-col-5-6 fow-info-box-settings-icon fow-info-box-${isMobile && !nav.fixed ? 'show' : 'hide'}`} onClick={(e) => this.onClickToggle(e)}>\n <h3 className=\"fow-font-text fow-font-size-lg\">Labor Market Outcomes</h3>\n </div>\n <div className={`fow-col-1-6 fow-info-box-settings-icon fow-info-box-${isMobile && !nav.fixed ? 'show' : 'hide'}`} onClick={(e) => this.onClickToggle(e)}>\n <SVGIcon stroke=\"#051C2C\" width=\"40\" strokeWidth=\"1.5\" name=\"settings\" />\n </div>\n </>\n }\n {selected.view === VIEWS.REGIONAL_CLUSTER &&\n <>\n <div className=\"fow-col fow-col-1-4 fow-lg-col-1-3 fow-md-col-2-3 fow-sm-col-1\">\n <div className=\"fow-info-box-single-title\">\n <SVGIcon stroke=\"#051C2C\" width=\"30\" height=\"20\" name=\"binoculars\" /><span className=\"fow-info-box-title fow-font-text fow-font-size-sm\">Select a cluster or a region</span>\n </div>\n <Search />\n </div>\n </>\n }\n\n {selected.view === VIEWS.OCCUPATIONAL &&\n <div className={`fow-col-3-4 fow-md-col-1 fow-sm-col-1 fow-info-box-${nav.fixed || (isMobile && !nav.settings) ? 'hide' : 'show'}`}>\n <div className=\"fow-row fow-sm-row-to-col\">\n <div className={`fow-col fow-col-1-3 fow-sm-col-1`}>\n <SwitchControl label=\"Measure\" optionsKey=\"measure_occ\" options={[{key: \"values\", value: \"Values\"}, {key: \"delta\", value: \"Delta\"}]} />\n </div>\n <div className={`fow-col fow-col-1-3 fow-sm-col-1`}>\n <SwitchControl label=\"Perspective\" optionsKey=\"perspective_occ\" options={[{key: \"today\", value: \"Today\"}, {key: \"future\", value: \"Future\"}]} disabled={occupationMeasure.key === \"delta\"} />\n </div>\n <div className={`fow-col fow-col-1-3 fow-sm-col-1`}>\n <SwitchControl label=\"Share\" optionsKey=\"share_occ\" options={[{key: \"absolute\", value: \"Absolute\"}, {key: \"relative\", value: \"Relative\"}]} disabled={occupationMeasure.key === \"delta\"} />\n </div>\n </div>\n </div>\n }\n\n {selected.view === VIEWS.EMPLOYMENT &&\n <div className={`fow-col-1-2 fow-xl-col-2-3 fow-lg-col-1 fow-md-col-1 fow-sm-col-1 fow-info-box-${nav.fixed || (isMobile && !nav.settings) ? 'hide' : 'show'}`}>\n <div className=\"fow-row fow-sm-row-to-col\">\n <div className={`fow-col fow-col-1-2 fow-sm-col-1`}>\n <SwitchControl label=\"Perspective\" optionsKey=\"perspective\" options={[{key: \"today\", value: \"Today\"}, {key: \"future\", value: \"Future\"}]} />\n </div>\n <div className={`fow-col fow-col-1-2 fow-sm-col-1`}>\n <SwitchControl label=\"Measure\" optionsKey=\"measure\" options={[{key: \"job_growth\", value: \"Job Growth\"}, {key: \"employment_rate\", value: \"Employment Rate\"}]} />\n </div>\n </div>\n </div>\n }\n\n {selected.view === VIEWS.REGIONAL_CLUSTER &&\n <></>\n }\n\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n occupationMeasure: state.settings.switch.measure_occ,\n hashParts: state.settings.hashParts,\n nav: state.settings.nav,\n isMobile: state.settings.window.width < 768\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setSettingsOpenAction: open => dispatch(setSettingsOpenAction(open)),\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(InfoBox));\n","import React, {Component} from \"react\";\nimport SVGIcon from \"../svg/SVGIcon\";\n\nimport \"./StatsItem.css\";\n\nclass StatsItem extends Component {\n\n render() {\n const {title,subtitle,icon} = this.props;\n return (\n <div className=\"fow-stats-item\">\n <div className=\"fow-stats-item-icon\">\n <SVGIcon stroke=\"#051C2C\" name={icon} />\n </div>\n <div className=\"fow-stats-item-data\">\n <h4 className=\"fow-stats-item-title fow-font-title fow-font-size-lg\">{title}</h4>\n <p className=\"fow-stats-item-subtitle fow-font-text fow-font-size-xs\">{subtitle}</p>\n </div>\n </div>\n );\n }\n}\n\nexport default StatsItem;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter} from 'react-router-dom';\nimport {toPercentage, numberWithCommas} from \"../../helpers/formatters\";\nimport {VIEWS} from \"../../helpers/consts\";\nimport {setStatsStateAction} from \"./../../actions/SettingsAction\";\nimport StatsItem from \"./StatsItem\";\n\nimport \"./StatsBox.css\";\nimport SVGIcon from \"../svg/SVGIcon\";\n\nclass StatsBox extends Component {\n\n constructor(props) {\n super(props);\n this.toggleOpen = this.toggleOpen.bind(this);\n }\n\n toggleOpen() {\n const {open, setStatsState} = this.props;\n setStatsState(!open);\n }\n\n render() {\n const {open, hashParts} = this.props;\n const selected = hashParts;\n const items = [];\n\n //EU view\n if(selected.view === VIEWS.EMPLOYMENT){\n items.push({icon: 'growth', title: \"+2.7%\", subtitle: 'Potential net job growth'});\n items.push({icon: 'portfolio', title: \"75%\", subtitle: \"Employment rate 2030\"});\n items.push({icon: 'chart', title: \"5 p.p.\", subtitle: \"Employment rate change 2018-30\"});\n }\n\n //Occupations view\n if (selected.view === VIEWS.OCCUPATIONAL) {\n const {selectedOccupation, iscoData} = this.props;\n if (!selectedOccupation || !iscoData) {\n return '';\n } else {\n const occ = iscoData.find(isco => isco.isco_2_id === selectedOccupation.id);\n items.push({icon: 'people', title: numberWithCommas(Math.round(occ.employment_2018)), subtitle: 'Total employment 2018'});\n items.push({icon: 'lady', title: toPercentage(occ.employment_share_2018, 1) + '%', subtitle: \"Occupational share 2018\"});\n items.push({icon: 'portfolio', title: toPercentage(occ.net_job_change_2018_30_in_percent, 1) + '%', subtitle: \"Net job growth 2018 - 30\"});\n }\n }\n\n //Cluster view\n if(selected.view === VIEWS.REGIONAL_CLUSTER){\n const {clustersData, regionData, selectedCluster, selectedRegion} = this.props;\n if (selectedCluster){\n if (!clustersData){\n return '';\n } else {\n const cluster = clustersData.find(cd => cd.cluster_id === selectedCluster.id);\n const isAvgCluster = selectedCluster.id===14;\n if (isAvgCluster){\n return '';\n }\n items.push({icon: 'marker', title: cluster.number_of_regions_within_cluster, subtitle: 'of 1095 regions'});\n items.push({icon: 'people', title: toPercentage(cluster.share_of_eu_population_within_cluster_2018_in_share, 1) + '%', subtitle: 'Share of EU population in the cluster'});\n items.push({icon: 'portfolio', title: toPercentage(cluster.share_of_positive_job_growth_2018_30, 1) + '%', subtitle:'Share of positive job growth (2018-30)'});\n }\n } else if (selectedRegion){\n if (!regionData) {\n return '';\n } else {\n const region = regionData.find(cd => cd.id === selectedRegion.id);\n items.push({icon: 'marker', title: region.cluster_name, subtitle: 'Respective cluster'});\n items.push({icon: 'people', title: numberWithCommas(region.nuts_3_region_population_2018_in_thousands), subtitle: 'Population in thousands, 2018'});\n items.push({icon: 'portfolio', title: toPercentage(region.net_job_change_2018_30,1)+'%', subtitle: 'Net job growth, 2018-30'});\n }\n }\n }\n\n //No items, no box\n if (items.length === 0){\n return '';\n }\n\n const title = open?\"Statistical data\":\"Click to see statistical data\";\n\n const iconName = open?\"down\":\"up\";\n\n return (\n <div id=\"fow-stats-box\" className={open ? 'fow-stats-box-open' : 'fow-stats-box-closed'}>\n <div id=\"fow-stats-box-inner\">\n <div className=\"fow-stats-box-title-items\">\n <h3 onClick={this.toggleOpen} className=\"fow-stats-box-title fow-font-text fow-font-size-md\">\n <div id=\"fow-stats-action\">\n <span><SVGIcon name={iconName} strokeWidth=\"3\" height=\"20\" width=\"20\" stroke=\"#000\" fill=\"transparent\" /></span>\n </div>\n <SVGIcon className=\"fow-mobile-arrows\" name=\"down\" width=\"20\" stroke=\"#000\" />\n {title}\n <SVGIcon className=\"fow-mobile-arrows\" name=\"down\" width=\"20\" stroke=\"#000\" />\n </h3>\n </div>\n <div className=\"fow-stats-box-items\">\n {items.map((d,ix) =>\n <StatsItem key={ix} icon={d.icon} title={d.title} subtitle={d.subtitle} />\n )}\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n hashParts: state.settings.hashParts,\n iscoData: state.db.data.dimensions.isco ? state.db.data.dimensions.isco : false,\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : false,\n regionData: state.db.data.facts.nuts3 ? state.db.data.facts.nuts3 : false,\n selectedCluster: state.settings.map[\"Clusters\"],\n selectedOccupation: state.settings.map[\"Occupations\"],\n selectedRegion: state.settings.map[\"Regions\"],\n open: state.settings.statsOpen\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setStatsState: open => dispatch(setStatsStateAction(open)),\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(StatsBox));\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {CLUSTERS_COLORS_MAP} from \"./../../helpers/colors\";\nimport SVGIcon from \"../svg/SVGIcon\";\n\nimport \"./RegionHeading.css\";\n\nclass RegionHeading extends Component {\n\n render() {\n const {nuts3, cluster, country, metro} = this.props;\n const subtitle = nuts3 === metro ? `${cluster}, ${country}` : `${cluster}, ${metro}, ${country}`;\n return (\n <div className=\"fow-region-heading\">\n <span className=\"fow-region-heading-icon\" style={{backgroundColor: CLUSTERS_COLORS_MAP[cluster]}}><SVGIcon name=\"stars\" /></span>\n <div className=\"fow-region-heading-text\">\n <div className=\"fow-region-heading-title fow-font-title fow-font-size-xl\">{nuts3}</div>\n <div className=\"fow-region-heading-subtitle fow-font-text fow-font-size-sm\">{subtitle}</div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n };\n};\nconst mapDispatchToProps = dispatch => ({\n});\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RegionHeading);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\n\nimport \"./DatumSmall.css\";\n\nclass DatumSmall extends Component {\n\n render() {\n const {label, value} = this.props;\n return (\n <div className=\"fow-datum-small\">\n <div className=\"fow-datum-small-label fow-font-text fow-font-size-sm\">{label}</div>\n <div className=\"fow-datum-small-value fow-font-text fow-font-size-md\">{value}</div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n };\n};\nconst mapDispatchToProps = dispatch => ({\n});\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DatumSmall);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter} from 'react-router-dom';\nimport RegionHeading from \"./../items/RegionHeading\";\nimport DatumSmall from \"./../items/DatumSmall\";\nimport {EMPLOYMENT_NAMES, EMPLOYMENT_FIELDS, OCCUPATIONAL_FIELDS, VIEWS} from \"./../../helpers/consts\";\nimport {setTooltipDataAction} from \"./../../actions/SettingsAction\";\n\nimport \"./MapTooltip.css\";\n\nclass MapTooltip extends Component {\n\n constructor(props) {\n super(props);\n this.timeoutID = null;\n this.getExtraFieldSelected = this.getExtraFieldSelected.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (\n prevProps.tooltipData && !this.props.tooltipData\n ){\n clearTimeout(this.timeoutID);\n } else if (\n (!prevProps.tooltipData && this.props.tooltipData)\n ||\n (prevProps.tooltipData && this.props.tooltipData &&\n prevProps.tooltipData.data.name !== this.props.tooltipData.data.name)\n ) {\n clearTimeout(this.timeoutID);\n this.timeoutID = setTimeout(()=>{\n this.props.setTooltipData(null);\n },2000);\n }\n }\n\n getExtraFieldSelected(datum){\n const {options, selectedOccupation, hashParts} = this.props;\n const selected = hashParts;\n let extraFieldSelected = false;\n let field, unit, label;\n switch (selected.view) {\n case VIEWS.OCCUPATIONAL:\n field = OCCUPATIONAL_FIELDS[options.measure_occ.key === \"delta\" ? `delta` : `${options.perspective_occ.key}_${options.share_occ.key}`];\n field = `${selectedOccupation.id}_${field}`;\n unit = options.measure_occ.key === \"delta\"? \"%\":options.share_occ.key === 'absolute'?'thousand':'%';\n label = options.measure_occ.key === \"delta\" ? \"2018-30 Job change\" : `${options.perspective_occ.value} occupation (${options.share_occ.key})`;\n if (field && datum[field]) {\n extraFieldSelected = {label: label, value: `${datum[field]} ${unit}`}\n }\n break;\n case VIEWS.EMPLOYMENT:\n field = EMPLOYMENT_FIELDS[`${options.perspective.key}_${options.measure.key}`];\n label = EMPLOYMENT_NAMES[`${options.perspective.key}_${options.measure.key}`];\n if (field && datum[field]) {\n extraFieldSelected = {label: `${label}`, value: `${datum[field]}%`}\n }\n break;\n case VIEWS.REGIONAL_CLUSTER:\n extraFieldSelected = {label: `Cluster Name`, value: `${datum.cluster_name}`};\n break;\n\n default:\n break;\n }\n return extraFieldSelected;\n }\n\n render() {\n const {tooltipData} = this.props;\n\n if (!tooltipData) return null;\n\n const extraFieldSelected = this.getExtraFieldSelected(tooltipData.data);\n\n return (\n <div id=\"fow-tooltip\" style={{left: tooltipData.x, top: tooltipData.y}}>\n <div className=\"fow-row\">\n <div className=\"fow-col-1 fow-heading-col\">\n {tooltipData.direction === 'L' &&\n <div className=\"fow-tooltip-arrow-l\">\n <div className=\"fow-tooltip-arrow-inner-l\" />\n </div>\n }\n {tooltipData.direction === 'R' &&\n <div className=\"fow-tooltip-arrow-r\">\n <div className=\"fow-tooltip-arrow-inner-r\" />\n </div>\n }\n <RegionHeading\n nuts3={tooltipData.data.name}\n cluster={tooltipData.data.cluster_name}\n metro={tooltipData.data.metro_name}\n country={tooltipData.data.country_name} />\n </div>\n </div>\n <div className=\"fow-row\">\n <div className=\"fow-col-1-2\">\n {extraFieldSelected && extraFieldSelected.value &&\n <DatumSmall label={extraFieldSelected.label} value={extraFieldSelected.value} />\n }\n </div>\n <div className=\"fow-col-1-2\">\n <DatumSmall label=\"Region Type\" value={tooltipData.data.urban_name} />\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n hashParts: state.settings.hashParts,\n tooltipData: state.settings.tooltipData,\n options: state.settings.switch,\n selectedOccupation: state.settings.map[\"Occupations\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setTooltipData: data => dispatch(setTooltipDataAction(data)),\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(MapTooltip));\n","import React, {Component} from \"react\";\n\nimport \"./Source.css\";\n\nclass Source extends Component {\n\n render() {\n const {text} = this.props;\n return (\n <div className=\"fow-source\">\n <span className=\"fow-source-label fow-font-text fow-font-size-sm\">{text}</span>\n </div>\n );\n }\n}\n\nexport default Source;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport {VIEWS} from \"./../../helpers/consts\";\n\nimport SVGIcon from \"../svg/SVGIcon\";\n\nimport \"./SelectedItem.css\";\n\nclass SelectedItem extends Component {\n\n constructor(props) {\n super();\n this.getLabel = this.getLabel.bind(this);\n }\n\n getLabel(){\n const {selectedCluster, selectedOccupation, selectedRegion, hashParts} = this.props;\n const selectedRegional = selectedCluster || selectedRegion;\n const selected = hashParts;\n let label = false;\n if (selected.view === VIEWS.EMPLOYMENT){\n } else if (selected.view === VIEWS.REGIONAL_CLUSTER) {\n label = selectedRegional.name;\n } else if (selected.view === VIEWS.OCCUPATIONAL) {\n label = selectedOccupation.name;\n }\n return label;\n }\n\n render() {\n const {hash} = this.props;\n if (!hash){\n return '';\n }\n const label = this.getLabel();\n return (\n <div className=\"fow-chart-selected-item\">\n {label &&\n <>\n <SVGIcon name=\"eye\" width=\"30\" height=\"20\" stroke=\"#888\" fill=\"transparent\" /><div className=\"fow-chart-selected-item-label fow-font-text fow-font-size-md\">{label}</div>\n </>\n }\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n hash: state.settings.hash,\n hashParts: state.settings.hashParts,\n selectedRegion: state.settings.map[\"Regions\"],\n selectedCluster: state.settings.map[\"Clusters\"],\n selectedOccupation: state.settings.map[\"Occupations\"],\n };\n};\nconst mapDispatchToProps = dispatch => ({\n});\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SelectedItem);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport SelectedItem from \"../items/SelectedItem\";\n\nimport \"./CarouselItem.css\";\n\nclass CarouselItem extends Component {\n\n render() {\n const {title, subtitle, children, showSelected} = this.props;\n\n return (\n <div className=\"fow-carousel-item-block\">\n <div className=\"fow-inner-container\">\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n {showSelected!==false &&\n <SelectedItem />\n }\n {title &&\n <h1 className=\"fow-font-title fow-font-size-xl fow-carousel-item-block-title\">{title}</h1>\n }\n </div>\n </div>\n {subtitle &&\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n <h2 className=\"fow-font-text fow-font-size-lg fow-carousel-item-block-subtitle\">{subtitle}</h2>\n </div>\n </div>\n }\n <div className=\"fow-row fow-md-row-to-col fow-carousel-item-block-children\">\n {children}\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CarouselItem);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport SVGIcon from \"../svg/SVGIcon\";\nimport {NAV, FUTURE_DISCLAIMER} from \"../../helpers/consts\";\nimport {withRouter, Link} from 'react-router-dom';\n\nimport \"./SubNavTabs.css\";\nimport Source from \"../items/Source\";\nimport CarouselItem from \"../blocks/CarouselItem\";\n\nclass SubNavTabs extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n hidden: false\n }\n }\n\n componentDidMount() {\n\n }\n\n componentWillUnmount() {\n\n }\n\n render() {\n const {navFixed, children, baseUrl, hashParts} = this.props;\n const activeTab = hashParts.section;\n const options = NAV.subnav ? NAV.subnav:[];\n return (\n <div>\n <div id=\"fow-subnav-placeholder\">\n <div id=\"fow-subnav\" className={`fow-subnav-${navFixed ? 'fixed' : 'static'}`}>\n <div className=\"fow-inner-container\">\n <ul id=\"fow-view-subnav\" className=\"fow-row\">\n {\n options.map((view)=>\n <li key={view.slug}>\n <Link to={`?page=${baseUrl}/${view.slug}`} className={`fow-subnav-item fow-subnav-item-full ${(activeTab === view.slug) ? 'fow-subnav-item-selected' : ''}`}>\n {view.icon &&\n <span className=\"fow-subnav-logo\"><SVGIcon name={view.icon} stroke={\"#000\"} /></span>\n }\n {view.name &&\n <span className=\"fow-subnav-label fow-font-text fow-font-size-md\">{view.name}</span>\n }\n </Link>\n </li>\n )\n }\n </ul>\n </div>\n </div>\n </div>\n <div className=\"fow-inner-container\">\n <div className=\"fow-row fow-subnav-content-container\">\n {\n NAV.subnav[0].slug === activeTab &&\n <>{children[0]}</>\n }\n {\n NAV.subnav[1].slug === activeTab &&\n <>{children[1]}</>\n }\n {\n NAV.subnav[2].slug === activeTab &&\n <>\n {children[2]}\n <CarouselItem title={false} subtitle={false} showSelected={false}>\n <div className=\"fow-col fow-col-1\">\n <Source text={FUTURE_DISCLAIMER} />\n </div>\n </CarouselItem>\n </>\n }\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n navFixed: state.settings.navFixed,\n hashParts: state.settings.hashParts\n };\n};\nconst mapDispatchToProps = dispatch => ({\n\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubNavTabs));\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport \"./Introduction.css\";\n\nclass Introduction extends Component {\n\n render() {\n const {title, subtitle, children} = this.props;\n\n return (\n <div className=\"fow-introduction-block\">\n <div className=\"fow-inner-container\">\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n <h1 className=\"fow-font-title fow-font-size-xl fow-introduction-block-title\">{title}</h1>\n </div>\n </div>\n {subtitle &&\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n <h2 className=\"fow-font-text fow-font-size-md fow-introduction-block-subtitle\">{subtitle}</h2>\n </div>\n </div>\n }\n <div className=\"fow-row fow-md-row-to-col\">\n {children}\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Introduction);\n","import React, {Component} from \"react\";\nimport PropTypes from 'prop-types';\n\nclass ClearD3PlusContext extends Component {\n\n getChildContext() {\n return {d3plus:{}};\n }\n\n render() {\n return (<>{this.props.children}</>);\n }\n}\n\nClearD3PlusContext.childContextTypes = {\n d3plus: PropTypes.object\n};\n\nexport default ClearD3PlusContext;\n","import React, {Component} from \"react\";\n\nimport \"./MiniScaleLegend.css\";\n\nclass MiniScaleLegend extends Component {\n\n render() {\n const {labelLess,labelMore,colors} = this.props;\n return (\n <div className=\"fow-mini-scale-legend\">\n <span className=\"fow-mini-scale-legend-label fow-font-text fow-font-size-sm\">{labelLess}</span>\n {colors.map((c,ix)=>\n <span key={`color-${ix}`} className=\"fow-mini-scale-legend-color\" style={{backgroundColor:c}}></span>\n )}\n <span className=\"fow-mini-scale-legend-label fow-font-text fow-font-size-sm\">{labelMore}</span>\n </div>\n );\n }\n}\n\nexport default MiniScaleLegend;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {nest as d3Nest} from \"d3-collection\";\nimport {max as d3Max, min as d3Min} from \"d3-array\";\nimport Source from \"./../../../items/Source\";\nimport MiniScaleLegend from \"./../../../items/MiniScaleLegend\";\nimport {MATRIX_COLORS} from \"./../../../../helpers/colors\";\nimport {toMillions, toPercentage, createMatrixScale, createTextColorScale} from \"./../../../../helpers/formatters\";\n\nimport \"./AverageValuesPerClusters.css\";\n\nclass AverageValuesPerClusters extends Component {\n\n constructor(props) {\n super();\n this.state = {\n clusterData: false\n }\n //Field list\n this.fieldList = {\n 'gdp_per_capita_eur': x => x.toFixed(1),\n 'gdp_per_capita_cagr_2007_2018_in_share': x => toPercentage(x, 1),\n 'unemployment_rate_share': x => x.toFixed(1),\n 'net_migration_rate_2018': x => x.toFixed(1),\n 'share_of_employment_in_high_growth_industries_share': x => toPercentage(x, 1),\n 'population_with_tertiary_education_2018_in_share': x => x.toFixed(1),\n 'old_age_dependency_ratio_2018': x => x.toFixed(1)\n };\n this.prepareData = this.prepareData.bind(this);\n }\n\n componentDidMount() {\n if(this.props.clusters){\n this.prepareData(this.props.clusters);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (!prevProps.clusters && this.props.clusters) {\n this.prepareData(this.props.clusters);\n }\n }\n\n prepareData(clusters){\n //Calculate scales\n const scales = {\n back:{},\n color:{}\n };\n Object.keys(this.fieldList).forEach(field => {\n if (this.fieldList[field]){\n const max = d3Max(clusters, r => r[field]);\n const min = d3Min(clusters, r => r[field]);\n scales.back[field] = createMatrixScale(min, max);\n scales.color[field] = createTextColorScale(min, max);\n }\n });\n\n //Calculate style & formatted values just once\n const formattedData = d3Nest()\n .key(function (d) {return d.cluster_group_name;})\n .entries(clusters.filter(cl => cl.cluster_group_id!==0).map(item=>{\n Object.keys(this.fieldList).forEach(field => {\n item[`${field}_formatted`] = this.fieldList[field]?this.fieldList[field](item[field]):'-';\n item[`${field}_style`] = {\n backgroundColor: this.fieldList[field] ? scales.back[field](item[field]):'#ddd',\n color: this.fieldList[field] ? scales.color[field](item[field]):'grey',\n }\n item[`share_EU_total`] = Math.round(item.number_of_regions_within_cluster * 100 / 1095); //Total of regions\n item[`share_EU_total`] = item[`share_EU_total`] === 0 ? '<1' : item[`share_EU_total`];\n });\n return item;\n }))\n .sort((a, b) => a.values[0].cluster_group_id > b.values[0].cluster_group_id ? 1 : -1);\n\n //Change state\n this.setState({clusterData: formattedData})\n }\n\n render() {\n const {clusterData} = this.state;\n\n if (!clusterData){\n return null;\n }\n\n return (\n <div id=\"fow-heatmap-grid\">\n <MiniScaleLegend labelLess=\"Less economically favorable\" labelMore=\"More economically favorable\" colors={MATRIX_COLORS} />\n <table className=\"fow-table fow-font-text\">\n <thead>\n <tr>\n <th colSpan=\"2\"></th>\n <th className=\"fow-th-title-1 fow-font-size-sm\">Regions</th>\n <th className=\"fow-th-title-1 fow-font-size-sm\">Population</th>\n <th className=\"fow-th-title-1 fow-font-size-sm\" colSpan=\"4\">Economic indicator</th>\n <th className=\"fow-th-title-1 fow-font-size-sm\">Industry mix</th>\n <th className=\"fow-th-title-1 fow-font-size-sm\" colSpan=\"2\">Labor market</th>\n </tr>\n <tr>\n <th className=\"fow-font-size-sm\" colSpan=\"2\"></th>\n <th className=\"fow-th-datum fow-font-size-sm\"># (Share of EU total, %)</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Millions (share of EU total, %)</th>\n <th className=\"fow-th-datum fow-font-size-sm\">GDP per capita, thousands, EUR</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Real GDP CARG, 2013-18</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Unemployment rate, %</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Net migration rate</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Share of employment in high-growth industries, %</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Share of population with tertiary education, %</th>\n <th className=\"fow-th-datum fow-font-size-sm\">Old-age dependency ratio</th>\n </tr>\n </thead>\n <tbody>\n {\n clusterData.map(group => {\n return group.values.map((cluster, ix) => (\n <tr key={ix}>\n {ix===0 &&\n <td className=\"fow-td-group fow-td-rotate fow-font-size-sm\" rowSpan={group.values.length}><div><span>{cluster.cluster_group_name}</span></div></td>\n }\n <td className=\"fow-td-cluster fow-font-size-sm\">{cluster.cluster_name}</td>\n <td className=\"fow-td-data fow-font-size-sm\">{cluster.number_of_regions_within_cluster} ({cluster.share_EU_total}%)</td>\n <td className=\"fow-td-data fow-font-size-sm\">{toMillions(cluster.total_population_within_cluster_2018_in_m)} ({toPercentage(cluster.share_of_eu_population_within_cluster_2018_in_share,0)}%)</td>\n {\n Object.keys(this.fieldList).map(field =>\n <td key={field} className=\"fow-td-datum fow-font-size-sm\" style={cluster[`${field}_style`]}>\n {cluster[`${field}_formatted`]}\n </td>\n )}\n </tr>\n ));\n })\n }\n </tbody>\n </table>\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clusters: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters.filter(c => c.description_of_cluster !== '') : false,\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AverageValuesPerClusters);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport \"./ClusterGroupTabs.css\";\n\nclass ClusterGroupTabs extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n hidden: false,\n activeTab: 'dgh',\n options: [\n {slug: 'dgh', name: 'Dynamic growth hubs', img:''},\n {slug: 'se', name: 'Stable Economies', img:''},\n {slug: 'sr', name: 'Shrinking regions', img:''}\n ]\n }\n this.onClickTab = this.onClickTab.bind(this);\n }\n\n componentDidMount() {\n\n }\n\n componentWillUnmount() {\n\n }\n\n onClickTab(view, e){\n e.preventDefault();\n this.setState({activeTab: view.slug});\n //this.props.history.push(tabUrl);\n }\n\n render() {\n const {children} = this.props;\n const {activeTab, options} = this.state;\n return (\n <div>\n <div className=\"fow-cluster-group-tabs-placeholder\">\n <div className=\"fow-cluster-group-tabs\">\n <div className=\"fow-inner-container\">\n <ul className=\"fow-view-subnav fow-row\">\n {\n options.map((view)=>\n <li key={view.slug}>\n <a href={`#${view.slug}`} className={`fow-cluster-group-tabs-item fow-cluster-group-tabs-item-full ${(activeTab === view.slug) ? 'fow-cluster-group-tabs-item-selected' : ''}`} onClick={(e) => this.onClickTab(view, e)}>\n <span className=\"fow-cluster-group-tabs-label fow-font-text fow-font-size-md\">{view.name}</span>\n </a>\n </li>\n )\n }\n </ul>\n </div>\n </div>\n </div>\n <div className=\"fow-inner-container\">\n <div className=\"fow-row fow-cluster-group-tabs-content-container\">\n {\n options[0].slug === activeTab &&\n <>{children[0]}</>\n }\n {\n options[1].slug === activeTab &&\n <>{children[1]}</>\n }\n {\n options[2].slug === activeTab &&\n <>{children[2]}</>\n }\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n\n };\n};\nconst mapDispatchToProps = dispatch => ({\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ClusterGroupTabs);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {nest as d3Nest} from \"d3-collection\";\nimport Source from \"./../../../items/Source\";\nimport ClusterGroupTabs from \"./../../../blocks/ClusterGroupTabs\";\nimport {CLUSTERS_COLORS_MAP} from \"./../../../../helpers/colors\";\n\nimport \"./ClustersProfile.css\";\nimport MKLogo from \"../../../svg/MKLogo\";\n\nclass ClustersProfile extends Component {\n\n render() {\n const {clusters, baseUrl} = this.props;\n\n if (!clusters){\n return null;\n }\n\n return (\n <div id=\"fow-profile-clusters\" className=\"fow-col fow-col-2-3 fow-md-col-1 fow-introduction-block-children\">\n <ClusterGroupTabs>\n {clusters.map(group =>\n <div key={group.key} className=\"fow-row fow-lg-row-to-col-reverse fow-md-row-to-col-reverse\">\n <div className=\"fow-col-1-2 fow-lg-col-1 fow-md-col-1\">\n <img className=\"fow-img-responsive\" alt=\"nuts3 map\" src={`${baseUrl}home/map-clusters-${group.key}.svg`} />\n </div>\n <div className=\"fow-col-1-2 fow-lg-col-1 fow-md-col-1\">\n {group.values.map(c =>\n <div key={c.cluster_id}>\n <div className=\"fow-font-text fow-font-size-lg\">\n <span className=\"fow-square-legend\" style={{backgroundColor: CLUSTERS_COLORS_MAP[c.cluster_name]}}></span>{c.cluster_name}\n </div>\n <p className=\"fow-font-text fow-font-size-sm\">{c.description_of_cluster}</p>\n </div>\n )}\n </div>\n </div>\n )}\n </ClusterGroupTabs>\n <MKLogo/>\n <Source text=\"Source: McKinsey Global Institute analysis\" />\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n const clusters = state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters.filter(c => c.description_of_cluster !== '') : [];\n return {\n baseUrl: state.settings.baseUrl,\n clusters: d3Nest().key(i => i.cluster_group_id).entries(clusters.filter(c => c.cluster_group_id>0)).sort((a,b)=>a.key>b.key?1:-1)\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ClustersProfile);\n","import React, {Component} from \"react\";\n\nimport \"./MiniLegend.css\";\n\nclass MiniLegend extends Component {\n\n render() {\n const {colors, title, secondTitle} = this.props;\n return (\n <div className=\"fow-mini-legend\">\n {secondTitle &&\n <span className=\"fow-mini-legend-title fow-font-text fow-font-size-md\">{secondTitle}</span>\n }\n {title &&\n <span className=\"fow-mini-legend-title fow-font-text fow-font-size-md\">{title}</span>\n }\n {colors.map((c,ix)=>\n <div key= {`color-${ix}`}>\n <span className=\"fow-mini-legend-color\" style={{backgroundColor:c.color}}></span>\n <span className=\"fow-mini-legend-label fow-font-text fow-font-size-md\">{c.label}</span>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default MiniLegend;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport Source from \"../../../../items/Source\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\n\nimport {BarChart} from \"d3plus-react\";\nimport {textWidth} from \"d3plus-text\";\nimport {calculateDomain} from \"../../../../../helpers/formatters\";\n\nclass LaborMarketOutcomes extends Component {\n\n constructor(props) {\n super();\n this.state = {\n config1: {},\n config2: {},\n config3: {},\n config4: {},\n config5: {},\n colors: []\n };\n this.createConfigs = this.createConfigs.bind(this);\n }\n\n componentDidMount() {\n this.createConfigs(this.props.clustersData, this.props.selectedCluster,0);\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (this.props.clustersData.length !== nextProps.clustersData.length){\n this.createConfigs(nextProps.clustersData, nextProps.selectedCluster, 0);\n }\n if (\n this.props.selectedCluster.id !== nextProps.selectedCluster.id\n ){\n this.createConfigs(nextProps.clustersData, nextProps.selectedCluster,300);\n }\n if (\n this.state.config1 !== nextState.config1 ||\n this.state.config2 !== nextState.config2 ||\n this.state.config3 !== nextState.config3 ||\n this.state.config4 !== nextState.config4 ||\n this.state.config5 !== nextState.config5\n ) {\n return true;\n }\n return false;\n }\n\n createConfigs(clustersData, selectedCluster, delayMS){\n\n const selectedClusterID = selectedCluster.id;\n const averageClusterID = 14;\n const clustersIds = [selectedClusterID, averageClusterID];\n\n const filteredData = clustersData.filter(cd => clustersIds.indexOf(cd.cluster_id) > -1);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.cluster_name}));\n\n const varFormatters = [\n x => `${(x * 100).toFixed(1)}%`,\n x => `${(x * 100).toFixed(1)}%`,\n x => `${x.toFixed(0)}`,\n x => `${(x * 100).toFixed(0)}%`,\n x => `${x.toFixed(1)}%`,\n ];\n\n const longerNames = [\n \"Net job growth 2007-18\",\n \"GDP per capita compound annual growth rate, 2007-18\",\n \"GDP per capita in Euros, thousands, 2013-18\",\n \"Employment rate 2018\",\n \"Unemployment rate 2018\"\n ];\n\n const fields = {\n 'net_job_growth_2011_18_in_percent': '<b>Net job growth</b>, 2011-18, %',\n 'gdp_cagr_2013_2017': '<b>GDP CAGR</b>, 2013-17',\n 'gdp_per_capita_eur': '<b>GDP per capita</b>, avg 2013-18, in thousands',\n 'employment_rate_2018_share': '<b>Employment rate</b>, 2018, %',\n 'unemployment_rate_2018_share': '<b>Unemployment rate</b>, avg 2013-18, %'\n };\n let longestStr = 0;\n let xMaxes = [0, 0, 0, 0, 0];\n let xMins = [0, 0, 0, 0, 0];\n let dataSets = Object.keys(fields).map((f, idx) => {\n if (fields[f].length > longestStr) {\n longestStr = Math.ceil(textWidth(fields[f]));\n }\n const finalData = [];\n let value;\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({cluster_id: fd.cluster_id, cluster_name: fd.cluster_name, property: fields[f], value: value, color: fd.color});\n xMaxes[idx] = xMaxes[idx] < value ? value : xMaxes[idx];\n xMins[idx] = xMins[idx] > value ? value : xMins[idx];\n });\n return finalData;\n });\n let vizHeight = 78;\n let configs = dataSets.map((dataSet, idx) => {\n let myDomain = calculateDomain(xMins[idx], xMaxes[idx]);\n\n const chartConfigTemplate = {\n data: dataSet,\n groupBy: \"cluster_name\",\n discrete: \"y\",\n discreteCutoff: 0,\n legend: false,\n height: vizHeight,\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${longerNames[idx]}: ${varFormatters[idx](d.value)}</div>`\n },\n yConfig: {\n title: false,\n minSize: 200,\n tickSize: 0\n },\n xConfig: {\n title: false,\n tickFormat: tick => `${varFormatters[idx](tick)}`,\n tickSize: 0,\n labels: myDomain.length > 0 ? [0] : [],\n domain: myDomain\n },\n shapeConfig: {\n Bar: {\n fill: d => d.color,\n duration: 0,\n label: (d) => (`${varFormatters[idx](d.value)}`)\n }\n },\n groupPadding: 0,\n barPadding: 2\n };\n if(delayMS>0){\n setTimeout(() => {\n this.setState({[`config${idx + 1}`]: chartConfigTemplate, colors:colors});\n }, delayMS * (idx + 1));\n }\n return chartConfigTemplate;\n\n });\n if (delayMS === 0) {\n this.setState({\n config1: configs[0],\n config2: configs[1],\n config3: configs[2],\n config4: configs[3],\n config5: configs[4],\n colors: colors\n });\n }\n }\n\n render() {\n const {clustersData} = this.props;\n if (clustersData.length === 0) {\n return '';\n }\n const {config1,config2,config3,config4,config5,colors} = this.state;\n return (\n <CarouselItem title=\"Labor market outcomes\">\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <BarChart config={config1} />\n <BarChart config={config2} />\n <BarChart config={config3} />\n <BarChart config={config4} />\n <BarChart config={config5} />\n <Source text=\"Source: Oxford Economics, Eurostat; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : [],\n selectedCluster: state.settings.map[\"Clusters\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborMarketOutcomes);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport Source from \"../../../../items/Source\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\n\nimport {BarChart} from \"d3plus-react\";\nimport {numberWithCommas, calculateDomain} from \"../../../../../helpers/formatters\";\n\n\nclass LaborMarketSupply extends Component {\n\n constructor(props) {\n super();\n this.state = {\n config1: {},\n config2: {},\n config3: {},\n config4: {},\n config5: {},\n colors: []\n };\n this.createConfigs = this.createConfigs.bind(this);\n }\n\n componentDidMount() {\n this.createConfigs(this.props.clustersData, this.props.selectedCluster, 0);\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (this.props.clustersData.length !== nextProps.clustersData.length) {\n this.createConfigs(nextProps.clustersData, nextProps.selectedCluster, 0);\n }\n if (\n this.props.selectedCluster.id !== nextProps.selectedCluster.id\n ) {\n this.createConfigs(nextProps.clustersData, nextProps.selectedCluster, 300);\n }\n if (\n this.state.config1 !== nextState.config1 ||\n this.state.config2 !== nextState.config2 ||\n this.state.config3 !== nextState.config3 ||\n this.state.config4 !== nextState.config4 ||\n this.state.config5 !== nextState.config5\n ) {\n return true;\n }\n return false;\n }\n\n createConfigs(clustersData, selectedCluster, delayMS) {\n const selectedClusterID = selectedCluster.id;\n const averageClusterID = 14;\n const clustersIds = [selectedClusterID, averageClusterID];\n\n const filteredData = clustersData.filter(cd => clustersIds.indexOf(cd.cluster_id) > -1);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.cluster_name}));\n\n const varFormatters = [\n x => `${x.toFixed(1)}%`,\n x => `${x.toFixed(1)}`,\n x => `${x.toFixed(1)}`,\n x => `${x.toFixed(1)}%`,\n x => `${numberWithCommas(Math.round(x))}`,\n ];\n\n const longerNames = [\n \"Working-age population growth\",\n \"Net migration rate\",\n \"Old-age dependency ratio\",\n \"Residents with tertiary education\",\n \"Average annual STEM graduate output\"\n ];\n\n const fields = {\n 'working_age_population_growth_2007_18_in_share': '<b>Working-age population change</b>, 2018, %',\n 'net_migration_rate_2018': '<b>Net migration rate¹</b>, 2018',\n 'old_age_dependency_ratio_2018': '<b>Old-age dependency ratio²</b>, 2018',\n 'population_with_tertiary_education_2018_in_share': '<b>Residents with tertiary education</b>, 2018, %',\n 'average_annual_stem_graduate_output_2013_2018': '<b>Average STEM graduates</b> 2018'\n };\n let longestStr = \"\";\n let xMaxes = [0, 0, 0, 0, 0];\n let xMins = [0, 0, 0, 0, 0];\n let dataSets = Object.keys(fields).map((f, idx) => {\n if (fields[f].length > longestStr) {\n longestStr = fields[f];\n }\n const finalData = [];\n let value;\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({cluster_id: fd.cluster_id, cluster_name: fd.cluster_name, property: fields[f], value: value, color: fd.color});\n xMaxes[idx] = xMaxes[idx] < value ? value : xMaxes[idx];\n xMins[idx] = xMins[idx] > value ? value : xMins[idx];\n });\n return finalData;\n });\n let vizHeight = 78;\n let configs = dataSets.map((dataSet, idx) => {\n let myDomain = calculateDomain(xMins[idx], xMaxes[idx]);\n const chartConfigTemplate = {\n data: dataSet,\n groupBy: \"cluster_name\",\n discrete: \"y\",\n discreteCutoff: 0,\n // we want bars to appear evenly sized, but only show legend once\n legend: false,\n //legendConfig: idx === 0 ? {select: `#${slideId}`} : {},\n height: vizHeight,\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${longerNames[idx]}: ${varFormatters[idx](d.value)}</div>`\n },\n yConfig: {\n title: false,\n minSize: 200, //textWidth(longestStr) + 10,\n tickSize: 0\n },\n xConfig: {\n title: false,\n tickFormat: tick => `${varFormatters[idx](tick)}`,\n tickSize: 0,\n labels: myDomain.length > 0 ? [0] : [],\n domain: myDomain\n },\n shapeConfig: {\n Bar: {\n fill: d => d.color,\n duration: 0,\n label: (d) => (`${varFormatters[idx](d.value)}`)\n }\n },\n groupPadding: 0,\n barPadding: 2,\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n on: {\"click.legend\": () => {}}\n };\n if (delayMS > 0) {\n setTimeout(() => {\n this.setState({[`config${idx + 1}`]: chartConfigTemplate, colors: colors});\n }, delayMS * (idx + 1));\n }\n return chartConfigTemplate;\n\n });\n if (delayMS === 0) {\n this.setState({\n config1: configs[0],\n config2: configs[1],\n config3: configs[2],\n config4: configs[3],\n config5: configs[4],\n colors: colors\n });\n }\n }\n\n render() {\n const {clustersData} = this.props;\n if (clustersData.length === 0) {\n return '';\n }\n const {config1, config2, config3, config4, config5, colors} = this.state;\n\n\n return (\n <CarouselItem title=\"Labor supply\">\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <BarChart config={config1} />\n <BarChart config={config2} />\n <BarChart config={config3} />\n <BarChart config={config4} />\n <BarChart config={config5} />\n <Source text=\"1. Ratio of the population change per year (the difference between the population sizes on January 1 of two consecutive years) to the average population in that year. The value is expressed per 1,000 persons. 2018 data.\" />\n <Source text=\"2. Old-age-dependency ratio is the ratio between the number of persons aged 65 and over and the number of persons aged between 15 and 64. The value is expressed per 100 persons of working age (15-64)\"/>\n <Source text=\"Source: Oxford Economics, Eurostat; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : [],\n selectedCluster: state.settings.map[\"Clusters\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborMarketSupply);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\nimport Source from \"../../../../items/Source\";\n\nimport {BarChart} from \"d3plus-react\";\n\nimport {calculateDomain} from \"../../../../../helpers/formatters\";\n\n\nclass LaborMarketDemand extends Component {\n\n render() {\n const {clustersData, selectedCluster} = this.props;\n\n const selectedClusterID = selectedCluster.id;\n const averageClusterID = 14;\n const clustersIds = [selectedClusterID, averageClusterID];\n\n const filteredData = clustersData.filter(cd => clustersIds.indexOf(cd.cluster_id) > -1);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.cluster_name}));\n\n // share of EU startups?? no data..\n // share of EU high tech?? no data..\n const fields = {\n 'employment_share_in_knowledge_intensive_services_2018_in_share': '<b>Knowledge intensive services</b>',\n 'employment_share_in_non_techincal_services_2018_in_share': '<b>Non-technical services</b>',\n 'employment_share_in_public_sector_and_healthcare_2018_in_share': '<b>Public sector & healthcare</b>',\n 'employment_share_in_construction_2018_in_share': '<b>Construction</b>',\n 'employment_share_in_industry_2018_in_share': '<b>Manufacturing</b>',\n 'employment_share_in_agriculture_2018_in_share': '<b>Agriculture</b>'\n };\n\n const finalData = [];\n let xMax = 0;\n let xMin = 0;\n let value;\n Object.keys(fields).forEach(f => {\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({cluster_id: fd.cluster_id, cluster_name: fd.cluster_name, property: fields[f], value: value, color: fd.color});\n xMax = xMax < value ? value : xMax;\n xMin = xMin > value ? value : xMin;\n });\n });\n\n const chartConfig = {\n data: finalData,\n detectVisible: true,\n groupBy: \"cluster_name\",\n height: 450,\n legend:false,\n discrete: \"y\",\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${d.property} employment share: ${(d.value * 100).toFixed(1)}%</div>`\n },\n yConfig: {\n title: false,\n minSize: 150,\n },\n xConfig: {\n // labels: [0, Math.floor(xMax)],\n title: false,\n tickFormat: x => `${Math.round(x*100)}%`,\n domain: calculateDomain(xMin, xMax)\n },\n shapeConfig: {\n fill: d => d.color,\n label: d => false,\n duration: 0,\n Bar: {\n height: 20,\n label: (d) => (`${(d.value * 100).toFixed(1)}%`)\n }\n },\n groupPadding: 25,\n barPadding: 2,\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n on: {\"click.legend\": () => {}}\n };\n return (\n <CarouselItem title=\"Labor demands\" subtitle={<><b>Employment share by sector,</b> 2018, %</>}>\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <BarChart config={chartConfig} />\n <Source text=\"Source: Oxford Economics, Eurostat; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : [],\n selectedCluster: state.settings.map[\"Clusters\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborMarketDemand);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport Source from \"../../../../items/Source\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\nimport {cloneAndRenameObj, calculateDomain, removeDecimalsIfNotNeeded, numberWithCommas} from \"../../../../../helpers/formatters\";\n\nimport {BarChart} from \"d3plus-react\";\nimport {textWidth} from \"d3plus-text\";\n\nclass LaborMarketOutcomesRegion extends Component {\n\n constructor(props) {\n super();\n this.state = {\n config1: {},\n config2: {},\n config3: {},\n config4: {},\n config5: {},\n config6: {},\n config7: {},\n config8: {},\n colors: []\n };\n this.createConfigs = this.createConfigs.bind(this);\n }\n\n componentDidMount() {\n this.createConfigs(this.props.nuts3Data, this.props.clustersData, this.props.selectedRegion, 0);\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (this.props.clustersData.length !== nextProps.clustersData.length || this.props.nuts3Data.length !== nextProps.nuts3Data.length) {\n this.createConfigs(nextProps.nuts3Data, nextProps.clustersData, nextProps.selectedRegion, 0);\n }\n if (\n this.props.selectedRegion.id !== nextProps.selectedRegion.id\n ) {\n this.createConfigs(nextProps.nuts3Data, nextProps.clustersData, nextProps.selectedRegion, 300);\n }\n if (\n this.state.config1 !== nextState.config1 ||\n this.state.config2 !== nextState.config2 ||\n this.state.config3 !== nextState.config3 ||\n this.state.config4 !== nextState.config4 ||\n this.state.config5 !== nextState.config5 ||\n this.state.config6 !== nextState.config6 ||\n this.state.config7 !== nextState.config7 ||\n this.state.config8 !== nextState.config8\n ) {\n return true;\n }\n return false;\n }\n\n createConfigs(nuts3Data, clustersData, selectedRegion, delayMS) {\n const selectedRegionID = selectedRegion.id;\n const nuts3Datum = nuts3Data.find(n3 => n3.id === selectedRegionID);\n\n if (!nuts3Datum) {\n return '';\n }\n const avgData = clustersData.find(cd => cd.cluster_id === nuts3Datum.cluster_id);\n\n if (!avgData) {\n return '';\n }\n avgData.color = \"#cccccc\";\n avgData.name = `${avgData.cluster_name} Cluster average`;\n\n //avgData.net_job_growth_2011_18 = avgData.net_job_growth_2011_18 / 100;\n //avgData.working_age_population_2018_in_thousands = avgData.working_age_population_2018_in_thousands / 100;\n\n //console.log(Object.keys(avgData));\n //console.log(Object.keys(nuts3Datum));\n\n const renameFields = {\n 'nuts_3_region_net_job_growth_2011_18_percent': 'net_job_growth_2011_18_in_percent',\n 'nuts_3_region_gdp_per_capita_2013_17': 'gdp_per_capita_2013_17_in_thousands',\n 'nuts_3_region_employment_rate_2018': 'employment_rate_2018_share',\n 'nuts_3_region_unemployment_rate_2014_18': 'unemployment_rate_2018_share',\n 'nuts_3_region_working_age_population_2018_in_thousands': 'working_age_population_2018_in_thousands',\n 'nuts_3_region_working_age_population_growth_2011_18_in_share': 'working_age_population_growth_2011_18_in_share',\n 'nuts_3_region_net_migration_2018': 'net_migration_2018',\n 'nuts_3_region_old_age_dependency_ratio_2014_18': 'old_age_dependency_ratio_2014_18',\n 'name': 'name'\n };\n\n const smallNuts3Data = cloneAndRenameObj(nuts3Datum, renameFields);\n smallNuts3Data.color = \"#38bdf3\";\n\n const filteredData = [\n avgData,\n smallNuts3Data\n ];\n\n //console.log(filteredData);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.name}));\n\n const varFormatters = [\n x => `${removeDecimalsIfNotNeeded((x * 100).toFixed(1))}%`,\n x => `${x.toFixed(0)}`,\n x => `${removeDecimalsIfNotNeeded((x * 100).toFixed(1))}%`,\n x => `${removeDecimalsIfNotNeeded(x.toFixed(1))}%`,\n x => `${numberWithCommas(x.toFixed(0))}`,\n x => `${(x * 100).toFixed(1)}%`,\n x => `${removeDecimalsIfNotNeeded(x.toFixed(1))}`,\n x => `${removeDecimalsIfNotNeeded(x.toFixed(1))}`\n ];\n\n const longerNames = [\n \"Net job growth 2007-18\",\n \"GDP per capita in Euros, thousands, 2013-18\",\n \"Employment rate 2018\",\n \"Unemployment rate 2018\",\n \"Working-age population\",\n \"Working-age population growth\",\n \"Net migration rate\",\n \"Old-age dependency ratio\"\n ];\n\n const fields = {\n 'net_job_growth_2011_18_in_percent': '<b>Net job growth</b>, 2007-18',\n 'gdp_per_capita_2013_17_in_thousands': '<b>GDP per capita</b>, 2013-18',\n 'employment_rate_2018_share': '<b>Employment rate</b>, 2018',\n 'unemployment_rate_2018_share': '<b>Unemployment rate</b>, 2018',\n 'working_age_population_2018_in_thousands': 'Working age population, 2018, thousands',\n 'working_age_population_growth_2011_18_in_share': '<b>Working age population growth, 2007-18</b>',\n 'net_migration_2018': '<b>Net migration rate</b>, 2018',\n 'old_age_dependency_ratio_2014_18': '<b>Old-age dependency</b>, 2018'\n };\n\n let longestStr = 0;\n let xMaxes = [0, 0, 0, 0, 0, 0, 0, 0];\n let xMins = [0, 0, 0, 0, 0, 0, 0, 0];\n let dataSets = Object.keys(fields).map((f, idx) => {\n if (fields[f].length > longestStr) {\n longestStr = Math.ceil(textWidth(fields[f]));\n }\n const finalData = [];\n let value;\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({name: fd.name, property: fields[f], value: value, color: fd.color});\n xMaxes[idx] = xMaxes[idx] < value ? value : xMaxes[idx];\n xMins[idx] = xMins[idx] > value ? value : xMins[idx];\n });\n return finalData;\n });\n let vizHeight = 78;\n let configs = dataSets.map((dataSet, idx) => {\n const myDomain = calculateDomain(xMins[idx], xMaxes[idx]);\n\n const chartConfigTemplate = {\n data: dataSet,\n groupBy: \"name\",\n discrete: \"y\",\n discreteCutoff: 0,\n // we want bars to appear evenly sized, but only show legend once\n legend: false,\n height: vizHeight,\n // 22.5 is a magic number.. it seems like the legend height takes up about 22.5 pixels\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${longerNames[idx]}: ${varFormatters[idx](d.value)}</div>`\n },\n yConfig: {\n title: false,\n width: 120,\n minSize: 125,\n tickSize: 0,\n shapeConfig: {\n labelConfig: {\n fontColor: () => \"#000\",\n fontFamily: () => \"'FOW Theinhardt', sans-serif\",\n fontSize: () => 10,\n fontWeight: () => 700\n },\n stroke: \"#efefef\",\n strokeWidth: 1\n },\n },\n xConfig: {\n title: false,\n tickFormat: tick => `${varFormatters[idx](tick)}`,\n tickSize: 0,\n labels: myDomain.length > 0 ? [0] : [],\n domain: myDomain\n },\n shapeConfig: {\n fill: d => d.color,\n duration: 0,\n Bar: {\n label: (d) => (`${varFormatters[idx](d.value)}`)\n }\n },\n groupPadding: 0,\n barPadding: 2\n };\n if (delayMS > 0) {\n setTimeout(() => {\n this.setState({[`config${idx + 1}`]: chartConfigTemplate, colors: colors});\n }, delayMS * (idx + 1));\n }\n return chartConfigTemplate;\n\n });\n if (delayMS === 0) {\n this.setState({\n config1: configs[0],\n config2: configs[1],\n config3: configs[2],\n config4: configs[3],\n config5: configs[4],\n config6: configs[5],\n config7: configs[6],\n config8: configs[7],\n colors: colors\n });\n }\n }\n\n render() {\n const {clustersData, nuts3Data} = this.props;\n if (clustersData.length === 0 || nuts3Data.length === 0 ) {\n return '';\n }\n const {config1, config2, config3, config4, config5, config6, config7, config8, colors} = this.state;\n\n return (\n <CarouselItem title=\"Labor market outcomes\">\n <>\n <div className=\"fow-col fow-col-1-2 fow-lg-col-1\">\n <h2 className=\"fow-font-text fow-font-size-lg fow-carousel-item-block-subtitle\"><b>Employment,</b> 2018</h2>\n <MiniLegend colors={colors} />\n <BarChart config={config1} />\n <BarChart config={config2} />\n <BarChart config={config3} />\n <BarChart config={config4} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n <div className=\"fow-col fow-col-1-2 fow-lg-col-1\">\n <h2 className=\"fow-font-text fow-font-size-lg fow-carousel-item-block-subtitle\"><b>Population statistics,</b> 2018</h2>\n <MiniLegend colors={colors} />\n\n <BarChart config={config6} />\n <BarChart config={config7} />\n <BarChart config={config8} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n nuts3Data: state.db.data.facts.nuts3 ? state.db.data.facts.nuts3 : [],\n clustersData: state.db.data.facts.clusters_avg ? state.db.data.facts.clusters_avg : [],\n selectedRegion: state.settings.map[\"Regions\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborMarketOutcomesRegion);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\nimport Source from \"../../../../items/Source\";\n\nimport {BarChart} from \"d3plus-react\";\n\nimport {removeDecimalsIfNotNeeded, cloneAndRenameObj, calculateDomain} from \"../../../../../helpers/formatters\";\n\n\nclass CurrentSectorMix extends Component {\n\n render() {\n const {clustersData, selectedRegion, nuts3Data} = this.props;\n\n const selectedRegionID = selectedRegion.id;\n const nuts3Datum = nuts3Data.find(n3 => n3.id === selectedRegionID);\n\n if (!nuts3Datum) {\n return '';\n }\n const avgData = clustersData.find(cd => cd.cluster_id === nuts3Datum.cluster_id);\n\n if (!avgData) {\n return '';\n }\n avgData.color = \"#cccccc\";\n avgData.name = `${avgData.cluster_name} Cluster average`;\n\n const renameFields = {\n 'nuts_3_region_employment_share_in_knowledge_intensive_services_2018_in_share': 'employment_share_in_knowledge_intensive_services_2018_in_share',\n 'nuts_3_region_employment_share_in_non_techincal_services_2018_in_share': 'employment_share_in_non_techincal_services_2018_in_share',\n 'nuts_3_region_employment_share_in_public_sector_and_healthcare_2018_in_share': 'employment_share_in_public_sector_and_healthcare_2018_in_share',\n 'nuts_3_region_employment_share_in_construction_2018_in_share': 'employment_share_in_construction_2018_in_share',\n 'nuts_3_region_employment_share_in_industry_2018_in_share': 'employment_share_in_industry_2018_in_share',\n 'nuts_3_region_employment_share_in_agriculture_2018_in_share': 'employment_share_in_agriculture_2018_in_share',\n 'name': 'name'\n };\n\n const smallNuts3Data = cloneAndRenameObj(nuts3Datum, renameFields);\n smallNuts3Data.color = \"#38bdf3\";\n\n const filteredData = [\n avgData,\n smallNuts3Data\n ];\n\n const colors = filteredData.map(d => ({color: d.color, label: d.name}));\n\n // share of EU startups?? no data..\n // share of EU high tech?? no data..\n const fields = {\n 'employment_share_in_knowledge_intensive_services_2018_in_share': '<b>Knowledge intensive services</b>',\n 'employment_share_in_non_techincal_services_2018_in_share': '<b>Non-technical services</b>',\n 'employment_share_in_public_sector_and_healthcare_2018_in_share': '<b>Public sector & healthcare</b>',\n 'employment_share_in_construction_2018_in_share': '<b>Construction</b>',\n 'employment_share_in_industry_2018_in_share': '<b>Manufacturing</b>',\n 'employment_share_in_agriculture_2018_in_share': '<b>Agriculture</b>'\n };\n\n const finalData = [];\n let xMax = 0;\n let xMin = 0;\n let value;\n Object.keys(fields).forEach(f => {\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({name: fd.name, property: fields[f], value: value, color: fd.color});\n xMax = xMax < value ? value : xMax;\n xMin = xMin > value ? value:xMin;\n });\n });\n\n const chartConfig = {\n data: finalData,\n detectVisible: true,\n groupBy: \"name\",\n height: 450,\n legend:false,\n discrete: \"y\",\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${d.property} employment share: ${removeDecimalsIfNotNeeded(d.value * 100)}%</div>`\n },\n yConfig: {\n title: false,\n minSize: 150\n },\n xConfig: {\n // labels: [0, Math.floor(xMax)],\n title: false,\n tickFormat: x => `${Math.round(x*100)}%`,\n domain: calculateDomain(xMin, xMax)\n },\n shapeConfig: {\n fill: d => d.color,\n label: d => false,\n duration: 0,\n Bar: {\n label: (d) => (`${removeDecimalsIfNotNeeded(d.value * 100)}%`)\n }\n },\n groupPadding: 25,\n barPadding: 2,\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n on: {\"click.legend\": () => {}}\n };\n return (\n <CarouselItem title=\"Current sector mix\" subtitle={<><b>Prevailing sector mix,</b> 2018, %</>}>\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <BarChart config={chartConfig} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n nuts3Data: state.db.data.facts.nuts3 ? state.db.data.facts.nuts3 : [],\n clustersData: state.db.data.facts.clusters_avg ? state.db.data.facts.clusters_avg : [],\n selectedRegion: state.settings.map[\"Regions\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CurrentSectorMix);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\n\nimport {BarChart} from \"d3plus-react\";\nimport {removeDecimalsIfNotNeeded, calculateDomain} from \"../../../../../helpers/formatters\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\nimport Source from \"../../../../items/Source\";\n\nclass LaborMarketDemand extends Component {\n\n render() {\n const {clustersData, selectedCluster, width} = this.props;\n\n const selectedClusterID = selectedCluster.id;\n const averageClusterID = 14;\n const clustersIds = [selectedClusterID, averageClusterID];\n\n if (!clustersData){\n return '';\n }\n\n const filteredData = clustersData.filter(cd => clustersIds.indexOf(cd.cluster_id) > -1);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.cluster_name}));\n\n const fields = {\n 'share_of_positive_job_growth_2018_30': 'Net job growth, %',\n 'employment_rate_change_2018_30_in_share': 'Employment rate change, p.p.',\n 'working_age_population_change_2018_30_in_thousands': 'Working-age population change, 2018-30, %',\n };\n\n let barW = width < 1000 ? 30 : 50;\n barW = width < 768 ? 20 : 50;\n\n const finalData = [];\n let xMax = 0;\n let xMin = 0;\n let value;\n Object.keys(fields).forEach(f => {\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({cluster_id: fd.cluster_id, cluster_name: fd.cluster_name, property: fields[f], value: value.toFixed(4), color: fd.color});\n xMax = xMax < value ? value : xMax;\n xMin = xMin > value ? value:xMin;\n });\n });\n\n const chartConfig = {\n data: finalData,\n groupBy: [\"cluster_name\"],\n legend: false,\n height: 400,\n discrete: \"x\",\n duration: 0,\n x: \"property\",\n y: \"value\",\n tooltipConfig: {\n body: d => `<div>${d.property}: ${removeDecimalsIfNotNeeded(d.value * 100)}%</div>`\n },\n xConfig: {\n title: false,\n tickSize: 0,\n barConfig: {\n stroke: \"#666\",\n strokeWidth: 1\n }\n },\n yConfig: {\n title: false,\n tickSize: 0,\n tickFormat: x => `${Math.round(x*100)}%`,\n domain: calculateDomain(xMin, xMax, true),\n gridConfig: {\n stroke: d => Math.abs(d.id) === 0 ? \"#666\" : \"#fff\",\n strokeWidth: 1\n },\n barConfig: {\n stroke: \"#666\",\n strokeWidth: 1\n },\n shapeConfig: {\n stroke: \"#efefef\",\n strokeWidth: 1\n }\n },\n shapeConfig: {\n fill: d => d.color,\n Bar: {\n width: barW,\n label: d => {\n const sign = (d.property === \"Employment rate change, p.p.\")?'p.p.':'%';\n return `${removeDecimalsIfNotNeeded(d.value * 100)}${sign}`;\n },\n labelBounds: (d, ix, s) => {\n const w = 100;\n const h = !s.height ? 50 : s.height;\n let y = d.value < 0 ? h : -h-25;\n return {\n width: w,\n height: 50,\n x: -w/2,\n y: y,\n value: d.value\n };\n },\n labelConfig: {\n textAnchor: (d) => \"middle\",\n fontColor: () => \"#000\",\n fontFamily: () => \"'FOW Theinhardt', sans-serif\",\n fontSize: () => 12,\n fontWeight: () => 400\n }\n }\n },\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n groupPadding: 5,\n barPadding: 2,\n on: {\"click.legend\": () => {}}\n };\n return (\n <CarouselItem title=\"Potential labor demand changes 2018-2030\">\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <div className=\"fow-col-1-2-center-chart\">\n <BarChart config={chartConfig} />\n </div>\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : false,\n selectedCluster: state.settings.map[\"Clusters\"],\n width: state.settings.window.width\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborMarketDemand);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport {numberWithCommas, removeDecimalsIfNotNeeded, calculateDomain} from \"../../../../../helpers/formatters\";\nimport Source from \"../../../../items/Source\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\n\nimport {BarChart} from \"d3plus-react\";\n\nclass LaborSkillShifts extends Component {\n\n render() {\n const {clustersData, selectedCluster} = this.props;\n\n const selectedClusterID = selectedCluster.id;\n const averageClusterID = 14;\n const clustersIds = [selectedClusterID, averageClusterID];\n\n const filteredData = clustersData.filter(cd => clustersIds.indexOf(cd.cluster_id) > -1);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.cluster_name}));\n\n const fields = {\n 'net_job_growth_knowledge_intensive_services_2018_30_in_thousands': '<b>Knowledge intensive services</b>',\n 'net_job_growth_non_technical_services_2018_30_in_thousands': '<b>Non-technical services</b>',\n 'net_job_growth_public_sector_and_healthcare_2018_30_in_thousands': '<b>Public sector & healthcare</b>',\n 'net_job_growth_construction_2018_30_in_thousands': '<b>Construction</b>',\n 'net_job_growth_industry_2018_30_in_thousands': '<b>Manufacturing</b>',\n 'net_job_growth_agriculture_2018_30_in_thousands': '<b>Agriculture</b>'\n };\n\n const finalData = [];\n let xMax = 0;\n let xMin = 0;\n let value;\n Object.keys(fields).forEach(f => {\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({cluster_id: fd.cluster_id, cluster_name: fd.cluster_name, property: fields[f], value: value, color: fd.color});\n xMax = xMax < value ? value : xMax;\n xMin = xMin > value ? value : xMin;\n });\n });\n\n const chartConfig = {\n data: finalData.reverse(),\n detectVisible: true,\n groupBy: \"cluster_name\",\n height: 380,\n discrete: \"y\",\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${d.property} job growth, thousands: ${removeDecimalsIfNotNeeded(d.value)}</div>`\n },\n yConfig: {\n title: false,\n tickSize: 0,\n minSize: 150,\n },\n legend:false,\n xConfig: {\n title: false,\n tickFormat: tick => `${numberWithCommas(tick)}`,\n domain: calculateDomain(xMin, xMax)\n },\n shapeConfig: {\n fill: d => d.color,\n duration: 0,\n Bar: {\n label: (d) => (`${removeDecimalsIfNotNeeded(d.value)}`)\n }\n },\n groupPadding: 15,\n barPadding: 2,\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n on: {\"click.legend\": () => {}}\n };\n return (\n <CarouselItem title=\"Projected sector shifts\" subtitle={<><b>Net change of jobs,</b> 2018-30, in thousands</>}>\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <BarChart config={chartConfig} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : [],\n selectedCluster: state.settings.map[\"Clusters\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborSkillShifts);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport {numberWithCommas, removeDecimalsIfNotNeeded, calculateDomain} from \"../../../../../helpers/formatters\";\nimport Source from \"../../../../items/Source\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\n\nimport {BarChart} from \"d3plus-react\";\n\nclass ProjectedOccupationalChanges extends Component {\n\n render() {\n const {clustersData, selectedCluster} = this.props;\n\n const selectedClusterID = selectedCluster.id;\n const clustersIds = [selectedClusterID];\n\n const filteredData = clustersData.filter(cd => clustersIds.indexOf(cd.cluster_id) > -1);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.cluster_name}));\n\n const fields = {\n 'net_job_growth_business_legal_professionals_2018_30_in_thousands':'Business/Legal',\n 'net_job_growth_stem_professionals_2018_30_in_thousands':'STEAM professionals',\n 'net_job_growth_managers_2018_30_in_thousands':'Managers',\n 'net_job_growth_creatives_and_arts_management_2018_30_in_thousands':'Creatives & Arts',\n 'net_job_growth_educator_and_workforce_training_2018_30_in_thousands':'Educators & Workforce training',\n 'net_job_growth_health_aides_technicians_and_wellness_2018_30_in_thousands':'Health aides & technicians',\n 'net_job_growth_health_professionals_2018_30_in_thousands':'Health professionals',\n 'net_job_growth_property_maintenance_and_agriculture_2018_30_in_thousands':'Property maintence & agriculture',\n 'net_job_growth_transportation_services_2018_30_in_thousands':'Transportation services',\n 'net_job_growth_customer_service_and_sales_2018_30_in_thousands':'Customer services & sales',\n 'net_job_growth_mechanical_installation_repair_2018_30_in_thousands':'Mechanical installation & repair',\n 'net_job_growth_builders_2018_30_in_thousands':'Builders',\n 'net_job_growth_food_services_2018_30_in_thousands':'Food Services',\n 'net_job_growth_production_work_2018_30_in_thousands':'Production work',\n 'net_job_growth_community_services_2018_30_in_thousands':'Community services',\n 'net_job_growth_office_support_2018_30_in_thousands':'Office Support',\n };\n\n const finalData = [];\n let xMax = 0;\n let xMin = 0;\n let value;\n Object.keys(fields).forEach(f => {\n filteredData.forEach(fd => {\n value = fd[f];\n finalData.push({cluster_id: fd.cluster_id, cluster_name: fd.cluster_name, property: fields[f], value: value, color: fd.color});\n xMax = xMax < value ? value : xMax;\n xMin = xMin > value ? value : xMin;\n });\n });\n\n const chartConfig = {\n data: finalData.sort((a,b) => a.value>b.value?1:-1),\n detectVisible: true,\n groupBy: \"cluster_name\",\n height: 440,\n discrete: \"y\",\n legend:false,\n y: \"property\",\n x: \"value\",\n tooltipConfig: {\n body: d => `<div>${d.property} job growth, thousands: ${removeDecimalsIfNotNeeded(d.value)}</div>`\n },\n yConfig: {\n title: false,\n tickSize: 0\n },\n xConfig: {\n tickFormat: tick => `${numberWithCommas(tick)}`,\n domain: calculateDomain(xMin, xMax)\n },\n shapeConfig: {\n fill: d => d.color,\n duration: 0,\n Bar: {\n label: (d) => (`${removeDecimalsIfNotNeeded(d.value)}`)\n }\n },\n groupPadding: 10,\n barPadding: 5\n };\n return (\n <CarouselItem title=\"Projected occupational shifts\" subtitle={<><b>Net change of jobs,</b> 2018-30, in thousands</>}>\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <BarChart config={chartConfig} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : [],\n selectedCluster: state.settings.map[\"Clusters\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProjectedOccupationalChanges);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\n\nimport {BarChart} from \"d3plus-react\";\nimport {removeDecimalsIfNotNeeded, cloneAndRenameObj, calculateDomain} from \"../../../../../helpers/formatters\";\nimport MiniLegend from \"../../../../items/MiniLegend\";\nimport Source from \"../../../../items/Source\";\n\nclass LaborMarketDevelopment extends Component {\n\n render() {\n const {clustersData, selectedRegion, nuts3Data, width} = this.props;\n\n if (!clustersData || !nuts3Data || !selectedRegion) {\n return '';\n }\n\n const selectedRegionID = selectedRegion.id;\n const nuts3Datum = nuts3Data.find(n3 => n3.nuts3_id === selectedRegionID);\n nuts3Datum.name = selectedRegion.name;\n\n const avgData = clustersData.find(cd => cd.cluster_id === nuts3Datum.cluster_id);\n\n avgData.color = \"#cccccc\";\n avgData.name = `${avgData.cluster_name} Cluster average`;\n\n //console.log(Object.keys(avgData));\n //console.log(Object.keys(nuts3Datum));\n\n const renameFields = {\n 'nuts_3_region_net_job_growth_18_30_in_share': 'share_of_positive_job_growth_2018_30',\n 'nuts_3_region_employment_rate_change_2018_30_in_p_p': 'employment_rate_change_2018_30_in_share',\n 'nuts_3_region_working_age_population_change_2018_30_in_share': 'working_age_population_change_2018_30_in_thousands',\n 'name': 'name'\n };\n\n const smallNuts3Data = cloneAndRenameObj(nuts3Datum, renameFields);\n smallNuts3Data.color = \"#38bdf3\";\n\n const filteredData = [\n avgData,\n smallNuts3Data\n ];\n\n console.log(filteredData);\n\n const colors = filteredData.map(d => ({color: d.color, label: d.name}));\n\n const fields = {\n 'share_of_positive_job_growth_2018_30': 'Net job growth, %',\n 'employment_rate_change_2018_30_in_share': 'Employment rate change, p.p.',\n 'working_age_population_change_2018_30_in_thousands': 'Working-age population change, 2018-30, %',\n };\n\n let barW = width < 1000 ? 30 : 50;\n barW = width < 768 ? 20 : 50;\n\n const finalData = [];\n let xMax = 0;\n let xMin = 0;\n let value;\n Object.keys(fields).forEach(f => {\n filteredData.forEach(fd => {\n value = fd[f]*100;\n finalData.push({cluster_id: fd.cluster_id, name: fd.name, cluster_name: fd.cluster_name, property: fields[f], value: value, color: fd.color});\n xMax = xMax < value ? value : xMax;\n xMin = xMin > value ? value : xMin;\n });\n });\n\n const chartConfig = {\n data: finalData,\n groupBy: [\"name\"],\n legend: false,\n height: 400,\n discrete: \"x\",\n duration: 0,\n x: \"property\",\n y: \"value\",\n tooltipConfig: {\n body: d => `<div>${d.property}: ${removeDecimalsIfNotNeeded(d.value)}%</div>`\n },\n xConfig: {\n title: false,\n tickSize: 0,\n barConfig: {\n stroke: \"#666\",\n strokeWidth: 1\n }\n },\n yConfig: {\n title: false,\n tickSize: 0,\n tickFormat: x => `${Math.round(x)}%`,\n domain: calculateDomain(xMin, xMax, true),\n gridConfig: {\n stroke: d => Math.abs(d.id) === 0 ? \"#666\" : \"#fff\",\n strokeWidth: 1\n },\n barConfig: {\n stroke: \"#666\",\n strokeWidth: 1\n },\n shapeConfig: {\n stroke: \"#efefef\",\n strokeWidth: 1\n }\n },\n shapeConfig: {\n fill: d => d.color,\n Bar: {\n width: barW,\n label: d => {\n const sign = (d.property === \"Employment rate change, p.p.\") ? 'p.p.' : '%';\n return `${removeDecimalsIfNotNeeded(d.value)}${sign}`;\n },\n labelBounds: (d, ix, s) => {\n const w = 100;\n const h = !s.height ? 50 : s.height;\n let y = d.value < 0 ? h : -h - 25;\n return {\n width: w,\n height: 50,\n x: -w / 2,\n y: y,\n value: d.value\n };\n },\n labelConfig: {\n textAnchor: (d) => \"middle\",\n fontColor: () => \"#000\",\n fontFamily: () => \"'FOW Theinhardt', sans-serif\",\n fontSize: () => 12,\n fontWeight: () => 400\n }\n }\n },\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n groupPadding: 5,\n barPadding: 2,\n on: {\"click.legend\": () => {}}\n };\n return (\n <CarouselItem title=\"Potential labor demand changes 2018-2030\">\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <div className=\"fow-col-1-2-center-chart\">\n <BarChart config={chartConfig} />\n </div>\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n nuts3Data: state.db.data.facts.nuts3_future ? state.db.data.facts.nuts3_future : false,\n clustersData: state.db.data.dimensions.clusters ? state.db.data.dimensions.clusters : false,\n //clustersData: state.db.data.facts.clusters_avg ? state.db.data.facts.clusters_avg : false,\n selectedRegion: state.settings.map[\"Regions\"],\n width: state.settings.window.width\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LaborMarketDevelopment);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../../blocks/CarouselItem\";\nimport Source from \"../../../../items/Source\";\n\nimport {BarChart} from \"d3plus-react\";\n\nimport {calculateDomain} from \"../../../../../helpers/formatters\";\n\n\nclass ProjectedOccupational extends Component {\n\n getChartConfig(data, xMin, xMax){\n return {\n data: data,\n detectVisible: true,\n groupBy: \"isco_2_name\",\n height: 250,\n legend: false,\n discrete: \"y\",\n y: \"isco_2_name\",\n x: \"net_job_growth_18_30_in_percent\",\n tooltipConfig: {\n body: d => `<div>${d.isco_2_name} net job growth: ${(d.net_job_growth_18_30_in_percent * 100).toFixed(1)}%</div>`\n },\n yConfig: {\n title: false,\n width: 100,\n },\n xConfig: {\n domain: calculateDomain(xMin, xMax),\n title: false,\n tickFormat: x => `${(x*100).toFixed(0)}%`\n },\n shapeConfig: {\n fill: d => d.color,\n duration: 0,\n Bar: {\n label: (d) => (`${(d.net_job_growth_18_30_in_percent * 100).toFixed(1)}%`)\n }\n },\n barPadding: 5,\n legendTooltip: {\n body: \"\",\n footer: \"\",\n },\n on: {\"click.legend\": () => {}}\n };\n }\n\n render() {\n const {selectedRegion, nuts3Data} = this.props;\n\n if (!nuts3Data || !selectedRegion) {\n return '';\n }\n\n const selectedRegionID = selectedRegion.id;\n const trends = nuts3Data.filter(n3 => n3.nuts3_id === selectedRegionID);\n\n let gMax = 0;\n const growing = [...trends.filter(n3 => n3.trend === 'G').map(r => {\n gMax = gMax < r.net_job_growth_18_30_in_percent ? r.net_job_growth_18_30_in_percent:gMax;\n r.value = r.net_job_growth_18_30_in_percent * 100;\n r.color =\"#38bdf3\";\n return r;\n })].sort((a,b)=>a.value<b.value?-1:1);\n\n let dMin = 0;\n const declining = [...trends.filter(n3 => n3.trend === 'D').map(r => {\n dMin = dMin > r.net_job_growth_18_30_in_percent ? r.net_job_growth_18_30_in_percent : dMin;\n r.value = r.net_job_growth_18_30_in_percent * 100;\n r.color = \"#e5546c\";\n return r;\n })].sort((a, b) => a.value < b.value ? 1 : -1);\n\n return (\n <CarouselItem title=\"Projected occupational shifts in %\" subtitle={false}>\n <div className=\"fow-col fow-col-1-2 fow-lg-col-1\">\n <h2 className=\"fow-font-text fow-font-size-lg fow-carousel-item-block-subtitle\"><b>Top five growing occupations, growth rate 2018-30,</b> by ISCO2 category</h2>\n <BarChart config={this.getChartConfig(growing,0,gMax)} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n <div className=\"fow-col fow-col-1-2 fow-lg-col-1\">\n <h2 className=\"fow-font-text fow-font-size-lg fow-carousel-item-block-subtitle\"><b>Top five declining occupations, growth rate 2018-30,</b> by ISCO2 category</h2>\n <BarChart config={this.getChartConfig(declining,dMin,0)} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n nuts3Data: state.db.data.facts.nuts3_top_occupations_future ? state.db.data.facts.nuts3_top_occupations_future : false,\n selectedRegion: state.settings.map[\"Regions\"]\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProjectedOccupational);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport SubNavTabs from \"./../../components/nav/SubNavTabs\";\n\nimport Introduction from \"./../../components/blocks/Introduction\";\nimport ClearD3PlusContext from \"./../../components/items/ClearD3PlusContext\";\n\n//Intro slide\nimport AverageValuesPerClusters from \"./../../components/slides/regional-cluster/intro/AverageValuesPerClusters\";\nimport ClustersProfile from \"./../../components/slides/regional-cluster/intro/ClustersProfile\";\n\n//TODAY Slides cluster\nimport LaborMarketOutcomes from \"./../../components/slides/regional-cluster/today/cluster/LaborMarketOutcomes\";\nimport LaborMarketSupply from \"../../components/slides/regional-cluster/today/cluster/LaborMarketSupply\";\nimport LaborMarketDemand from \"../../components/slides/regional-cluster/today/cluster/LaborMarketDemand\";\n\n//TODAY Slides region\nimport LaborMarketOutcomesRegion from \"./../../components/slides/regional-cluster/today/region/LaborMarketOutcomesRegion\";\nimport CurrentSectorMix from \"../../components/slides/regional-cluster/today/region/CurrentSectorMix\";\n//import CurrentOccupationalMix from \"../../components/slides/regional-cluster/today/region/CurrentOccupationalMix\";\n\n\n//2030 Slides cluster\nimport DemandOutlook from \"../../components/slides/regional-cluster/outlook/cluster/LaborMarketDemand\";\nimport LaborSkillShifts from \"../../components/slides/regional-cluster/outlook/cluster/LaborSkillShifts\";\nimport ProjectedOccupationalChanges from \"../../components/slides/regional-cluster/outlook/cluster/ProjectedOccupationalChanges\";\n\n//2030 slides regions\nimport LaborMarketDevelopment from \"../../components/slides/regional-cluster/outlook/region/LaborMarketDevelopment\";\nimport ProjectedOccupational from \"../../components/slides/regional-cluster/outlook/region/ProjectedOccupational\";\n\n\n\nimport {loadDataAction, setMapDataAction, startOverMapAction} from \"./../../actions/DataAction\";\n\nimport {VIEWS, FILE_KEYS} from \"./../../helpers/consts\";\n\nimport \"./RegionalCluster.css\";\n\n\nclass RegionalCluster extends Component {\n\n componentDidMount() {\n this.props.setMapDataAction(VIEWS.REGIONAL_CLUSTER);\n this.props.loadDataAction([\n FILE_KEYS.OCCUPATIONAL_CLUSTERS,\n FILE_KEYS.OCCUPATIONAL_EU,\n FILE_KEYS.CLUSTERS_AVG_PRESENT,\n FILE_KEYS.NUTS3_FUTURE,\n FILE_KEYS.NUTS3_TOP_OCCUPATIONS_FUTURE,\n FILE_KEYS.OCCUPATIONAL_DATA\n ], this.props.db);\n this.props.startOverMap();\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.geojson !== this.props.geojson) {\n this.props.setMapDataAction(VIEWS.REGIONAL_CLUSTER);\n }\n }\n\n render() {\n const {selectedRegion, selectedCluster, width} = this.props;\n const selectedItem = selectedRegion || selectedCluster;\n\n return (\n <div id=\"fow-view-regional-cluster\">\n <SubNavTabs baseUrl={`/map/${VIEWS.REGIONAL_CLUSTER}`}>\n <>\n <Introduction title=\"Applying a local lens\">\n <div className=\"fow-col fow-col-1-3 fow-md-col-1 fow-introduction-block-children\">\n <p className=\"fow-font-text fow-font-size-md\">The labor market that matters to most people is the one where they live. Even within a single country, local economies vary significantly.</p>\n <p className=\"fow-font-text fow-font-size-md\">With this in mind, we gathered extensive data on 1,095 local labor markets across Europe and sorted them using a mathematical clustering technique. The locations within each of the resulting 13 clusters share commonalities in demographics, growth trends, skill levels, industry mix, business dynamism, innovation capabilities, and other characteristics.</p>\n <p className=\"fow-font-text fow-font-size-md\">These 13 clusters broadly fit into three sets: dynamic growth hubs, stable economies, and shrinking regions. This perspective allows us to understand differences between local economies today and map the potential effects of automation in the future.</p>\n </div>\n <ClustersProfile/>\n </Introduction>\n {width > 1120 &&\n <Introduction title=\"Each cluster has a distinct economic and labor market profile\" subtitle=\"Average values per clusters (2013-18)\">\n <div className=\"fow-col fow-col-1\">\n <AverageValuesPerClusters />\n </div>\n </Introduction>\n }\n </>\n <>\n {selectedItem.type === 'Cluster' &&\n <>\n <LaborMarketOutcomes />\n <LaborMarketSupply />\n <LaborMarketDemand />\n </>\n }\n {selectedItem.type === 'Region' &&\n <>\n <LaborMarketOutcomesRegion/>\n <CurrentSectorMix />\n </>\n }\n </>\n <>\n {selectedItem.type === 'Cluster' &&\n <>\n <ClearD3PlusContext>\n <DemandOutlook />\n </ClearD3PlusContext>\n <LaborSkillShifts />\n <ProjectedOccupationalChanges />\n </>\n }\n {selectedItem.type === 'Region' &&\n <>\n <ClearD3PlusContext>\n <LaborMarketDevelopment />\n </ClearD3PlusContext>\n <ProjectedOccupational />\n </>\n }\n </>\n </SubNavTabs>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n geojson: state.db.map.geojsonOptions[VIEWS.REGIONAL_CLUSTER],\n db: state.db,\n selectedRegion: state.settings.map[\"Regions\"],\n selectedCluster: state.settings.map[\"Clusters\"],\n width: state.settings.window.width\n };\n};\nconst mapDispatchToProps = dispatch => ({\n startOverMap: () => dispatch(startOverMapAction()),\n loadDataAction: (keys, db) => dispatch(loadDataAction(keys, db)),\n setMapDataAction: (view) => dispatch(setMapDataAction(view)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RegionalCluster);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"./../../../blocks/CarouselItem\";\nimport MiniLegend from \"./../../../items/MiniLegend\";\nimport Source from \"./../../../items/Source\";\n\nimport {LinePlot} from \"d3plus-react\";\n\nimport {numberWithCommas} from \"./../../../../helpers/formatters\";\n\n\nclass EUWideLaborDemand extends Component {\n\n constructor(props) {\n super(props);\n // we should move this data to a separate file outside the build\n let data = [\n {numEmp: 221030.918220479, kind: \"2011 - 20\", year: 2011},\n {numEmp: 221592.186766756, kind: \"2011 - 20\", year: 2012},\n {numEmp: 220945.398305823, kind: \"2011 - 20\", year: 2013},\n {numEmp: 220407.262106156, kind: \"2011 - 20\", year: 2014},\n {numEmp: 222599.782736798, kind: \"2011 - 20\", year: 2015},\n {numEmp: 228333.752071914, kind: \"2011 - 20\", year: 2016},\n {numEmp: 231491.842797958, kind: \"2011 - 20\", year: 2017},\n {numEmp: 234583.517785412, kind: \"2011 - 20\", year: 2018},\n {numEmp: 235110.240785266, kind: \"2011 - 20\", year: 2019},\n {numEmp: 235638.146464624, kind: \"2011 - 20\", year: 2020},\n {numEmp: 235638.146464624, kind: \"2020 - 30\", year: 2020},\n {numEmp: 236167.237479021, kind: \"2020 - 30\", year: 2021},\n {numEmp: 236697.516489952, kind: \"2020 - 30\", year: 2022},\n {numEmp: 237228.986164892, kind: \"2020 - 30\", year: 2023},\n {numEmp: 237761.6491773, kind: \"2020 - 30\", year: 2024},\n {numEmp: 238295.508206644, kind: \"2020 - 30\", year: 2025},\n {numEmp: 238830.565938403, kind: \"2020 - 30\", year: 2026},\n {numEmp: 239366.825064088, kind: \"2020 - 30\", year: 2027},\n {numEmp: 239904.288281255, kind: \"2020 - 30\", year: 2028},\n {numEmp: 240442.958293514, kind: \"2020 - 30\", year: 2029},\n {numEmp: 240982.837810548, kind: \"2020 - 30\", year: 2030}\n ];\n\n const config = {\n data,\n height: 310,\n groupBy: \"kind\",\n x: \"year\",\n discrete: \"x\",\n y: \"numEmp\",\n annotations: [\n // TODO\n ],\n xConfig: {\n gridConfig: {\n \"stroke\": \"rgb(164, 164, 164)\",\n \"stroke-width\": d => {\n return d.id === 2020 ? 1 : 0;\n },\n barConfig: {\n stroke: \"rgb(164, 164, 164)\",\n \"stroke-width\": 1\n }\n },\n\n },\n yConfig: {\n title: \"Employment, thousands 2011-30\",\n gridConfig: {\n \"stroke\": \"rgb(164, 164, 164)\",\n \"stroke-width\": 1\n },\n barConfig: {\n stroke: \"rgb(164, 164, 164)\",\n \"stroke-width\": 1\n }\n },\n legend: false,\n shapeConfig: {\n Line: {\n stroke: function(d) {\n return d.kind !== \"2020 - 30\" ? \"rgb(0, 21, 34)\" : \"rgb(43, 173, 240)\";\n },\n strokeWidth: 2.5\n }\n },\n tooltipConfig: {\n body: d => `<div>Employment, thousands ${d.year}: ${numberWithCommas(d.numEmp.toFixed(2))}</div>`\n },\n }\n this.state = {\n config,\n colors: [\n {color: \"rgb(0, 21, 34)\", label: \"2011 - 20\"},\n {color: \"rgb(43, 173, 240)\", label: \"2020 - 30\"}\n ]\n };\n }\n\n render() {\n const {colors,config} = this.state;\n\n return (\n <CarouselItem title=\"Increasing labor demand in Europe\" subtitle={<>European employment enjoyed a strong recovery after 2014<sup>1</sup></>}>\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <LinePlot config={config} />\n <Source text=\"1.- Linear projection of estimated employment in 2030.\" />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis.\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {};\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EUWideLaborDemand);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"./../../../blocks/CarouselItem\";\nimport MiniLegend from \"./../../../items/MiniLegend\";\nimport Source from \"./../../../items/Source\";\n\n\nimport {LinePlot} from \"d3plus-react\";\n\nimport {removeDecimalsIfNotNeeded} from \"./../../../../helpers/formatters\";\n\n\nclass EUWideEmpRates extends Component {\n\n constructor(props) {\n super(props);\n // we should move this data to a separate file outside the build\n let data = [\n {empRate: .651, kind: \"2011 - 20\", year: 2011},\n {empRate: .651, kind: \"2011 - 20\", year: 2012},\n {empRate: .649, kind: \"2011 - 20\", year: 2013},\n {empRate: .656, kind: \"2011 - 20\", year: 2014},\n {empRate: .665, kind: \"2011 - 20\", year: 2015},\n {empRate: .675, kind: \"2011 - 20\", year: 2016},\n {empRate: .686, kind: \"2011 - 20\", year: 2017},\n {empRate: .698, kind: \"2011 - 20\", year: 2018},\n {empRate: .707, kind: \"2011 - 20\", year: 2019},\n {empRate: .710, kind: \"2011 - 20\", year: 2020},\n {empRate: .710, kind: \"2020 - 30\", year: 2020},\n {empRate: .714, kind: \"2020 - 30\", year: 2021},\n {empRate: .718, kind: \"2020 - 30\", year: 2022},\n {empRate: .722, kind: \"2020 - 30\", year: 2023},\n {empRate: .725, kind: \"2020 - 30\", year: 2024},\n {empRate: .729, kind: \"2020 - 30\", year: 2025},\n {empRate: .733, kind: \"2020 - 30\", year: 2026},\n {empRate: .737, kind: \"2020 - 30\", year: 2027},\n {empRate: .741, kind: \"2020 - 30\", year: 2028},\n {empRate: .744, kind: \"2020 - 30\", year: 2029},\n {empRate: .748, kind: \"2020 - 30\", year: 2030},\n ];\n\n const config = {\n data,\n height: 310,\n groupBy: \"kind\",\n x: \"year\",\n discrete: \"x\",\n y: \"empRate\",\n legend: false,\n tooltipConfig: {\n body: d => `<div>Employment rate, % ${d.year}: ${removeDecimalsIfNotNeeded(d.empRate * 100)}%</div>`\n },\n annotations: [\n // TODO\n ],\n xConfig: {\n gridConfig: {\n \"stroke\": \"rgb(164, 164, 164)\",\n \"stroke-width\": d => {\n return d.id === 2020 ? 1 : 0;\n },\n },\n barConfig: {\n stroke: \"rgb(164, 164, 164)\",\n \"stroke-width\": 1\n }\n },\n yConfig: {\n tickFormat: tick => `${removeDecimalsIfNotNeeded(tick * 100)}`,\n title: \"Employment rate, % 2011-30\",\n gridConfig: {\n \"stroke\": \"rgb(164, 164, 164)\",\n \"stroke-width\": 1\n },\n barConfig: {\n stroke: \"rgb(164, 164, 164)\",\n \"stroke-width\": 1\n }\n },\n shapeConfig: {\n Line: {\n stroke: function(d) {\n return d.kind !== \"2020 - 30\" ? \"rgb(0, 21, 34)\" : \"rgb(43, 173, 240)\";\n },\n strokeWidth: 2.5\n }\n }\n }\n this.state = {\n config,\n colors: [\n {color: \"rgb(0, 21, 34)\", label: \"2011 - 20\"},\n {color: \"rgb(43, 173, 240)\", label: \"2020 - 30\"}\n ]\n };\n }\n\n render() {\n const {colors, config} = this.state;\n\n return (\n <CarouselItem title=\"Rising employment rates\" subtitle={<>Europe’s employment rate has been rising steadily since 2014 — and that trend needs to continue to fill the jobs of the future<sup>1</sup></>}>\n <div className=\"fow-col fow-col-1\">\n <MiniLegend colors={colors} />\n <LinePlot config={config} />\n <Source text=\"1.- Linear projection of estimated employment in 2030.\" />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis.\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {};\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EUWideEmpRates);\n","import React, {Component} from \"react\";\nimport SVGImageLib from 'react-inlinesvg';\nimport \"./SVGImage.css\";\n\nclass SVGImage extends Component {\n\n render() {\n const {src} = this.props;\n return (\n <div className=\"fow-svg-image\">\n <div className=\"fow-svg-image-inner\">\n <SVGImageLib src={src} />\n </div>\n </div>\n );\n }\n}\n\nexport default SVGImage;\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"./../../../blocks/CarouselItem\";\nimport Source from \"./../../../items/Source\";\nimport SVGImage from \"./../../../svg/SVGImage\";\n\n\nclass GeoConcentrationToday extends Component {\n\n render() {\n\n const {baseUrl} = this.props;\n\n return (\n <CarouselItem title=\"Increasing geographic concentration\">\n <div className=\"fow-col fow-col-1-2 fow-md-col-1\">\n <p className=\"fow-font-text fow-font-size-md\">In our midpoint automation adoption scenario, technology begins to handle work activities equivalent to 53 million jobs by 2030. But Europe could add many new jobs in the next decade. At the same time, the working-age population will likely shrink by 13.5 million (or 4 percent) due to aging.</p>\n <p className=\"fow-font-text fow-font-size-md\">Growth will likely continue to be uneven geographically. Looking forward to 2030, the same 48 megacities and superstar hubs that generated 35 percent of the EU’s net job growth in the past decade could account for roughly half of it in the next, based on estimates made before the pandemic.</p>\n <p className=\"fow-font-text fow-font-size-md\">The outlook is tougher for many shrinking regions. The post-2008 recovery largely passed them by, and now many could be facing another decade of low potential job growth. Stable economies should continue to generate modest job growth once they recover from the pandemic, just as they did in the past decade. Around 40 percent of Europe’s population lives in regions that could have fewer jobs in 2030 than they do today in absolute terms. However, aging and emigration are shrinking the workforce in these regions, which lessens the likelihood of high unemployment.</p>\n </div>\n <div className=\"fow-col fow-col-1-2 fow-md-col-1\">\n <h2 className=\"fow-font-text fow-font-size-lg fow-carousel-item-block-subtitle\">Disparities between clusters are widening, with just 48 dynamic growth hubs generating more than one-third of Europe’s job growth since 2007.</h2>\n <SVGImage src={`${baseUrl}home/increasing-geographic-concentration-today.svg`} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis.\" />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n baseUrl: state.settings.baseUrl\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GeoConcentrationToday);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../../blocks/CarouselItem\";\nimport MiniLegend from \"./../../../items/MiniLegend\";\nimport {TERTIARY_EDUCATION_ARRAY} from \"./../../../../helpers/colors\";\nimport {createTertiaryEducationScale} from \"./../../../../helpers/formatters\";\nimport {Treemap} from \"d3plus-react\";\nimport {numberWithCommas, toPercentage} from \"../../../../helpers/formatters\";\n\n\nclass JobDelta extends Component {\n constructor(props) {\n super(props);\n\n let metric, title, subtitle1, subtitle2, paragraph;\n if (props.mode === \"growth\") {\n title = \"Employers may find it difficult to fill new positions in growing categories\";\n subtitle1 = \"Many jobs that employers might need to fill require a higher level of skills\";\n subtitle2 = \"Total gross job growth by 2030, declining ISCO2 occupation groups only, thousands.\";\n paragraph = <p>Employers, too, may have challenges finding new workers with the skills needed. Many of the fastest-growing occupations, such as software and application developers and nursing professionals, require specialized skills. Today only about 40 percent of Europe’s workforce has a tertiary education, but nearly 60 percent of growing occupations require it. Two exceptions are cleaners and helpers, as well as professional care workers—typically low-wage roles. Filling these jobs may be particularly challenging in megacities and superstar hubs, where potential job growth will be highest but housing is in short supply and infrastructure capacity is limited.</p>;\n metric = \"region_aggregated_jobs_gained_isco4\";\n }\n else {\n title = \"Some 21 million people may need to change occupations\";\n subtitle1 = \"Some of the largest occupational categories in Europe have the highest potential for displacement\";\n subtitle2 = \"\";\n metric = \"region_aggregated_jobs_lost_isco4_negative\";\n paragraph = <><p>In our midpoint automation adoption scenario, almost 22 percent of current work activities (equivalent to 53 million jobs) could be automated by 2030. Yet the economy should continue to grow and generate jobs at the same time.</p><p>Many of the jobs that are lost will match up with jobs that are added, which means that many displaced workers may be able to find similar positions. But 21 million people, most of whom lack tertiary education, may need to change occupations by 2030, moving from declining to growing categories.</p></>;\n }\n this.state = {\n data: [],\n metric,\n title,\n subtitle1,\n subtitle2,\n paragraph,\n colorScale: createTertiaryEducationScale()\n };\n }\n\n render() {\n const {metric, title, subtitle1, colorScale, paragraph} = this.state;\n const {occData, mode} = this.props;\n let data = occData;\n\n data = occData.map(x => ({...x, color: colorScale(x[\"share_no_tertiary_education\"])}));\n\n const colors = TERTIARY_EDUCATION_ARRAY.map(c => ({label: c[0], color: c[1]}));\n\n const chartConfig = {\n data,\n id: \"isco_2_name\",\n legend: false,\n share: false,\n tooltipConfig: {\n body: d => `<div>Total gross job ${mode} by 2030 (thousands): ${numberWithCommas(d.region_aggregated_jobs_gained_isco4.toFixed(1))}<br/>Share without tertiary education: ${toPercentage(d.share_no_tertiary_education, 1)}%</div>`,\n tbody: []\n },\n height: 400,\n groupBy: [\"isco_2_name\", \"isco_2_name\"],\n sum: metric,\n shapeConfig: {\n fill: d => d.color,\n label: d => {\n return [d.isco_2_name, numberWithCommas(Math.round(d[metric]))];\n },\n },\n sort: (a, b) => {\n return b.value - a.value;\n }\n };\n\n return (\n <CarouselItem title={title} subtitle={subtitle1}>\n <div className=\"fow-col fow-col-1-3 fow-lg-col-1-2 fow-md-col-1\">\n {paragraph}\n </div>\n <div className=\"fow-col fow-col-2-3 fow-lg-col-1-2 fow-md-col-1\">\n <MiniLegend colors={colors} title=\"Share of workers without tertiary education, %\" secondTitle={`Total gross job ${mode} by 2030, declining ISCO2 occupation groups only, thousands.`} />\n <Treemap config={chartConfig} />\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n occData: state.db.data.facts.occupational_eu ? state.db.data.facts.occupational_eu : [],\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(JobDelta);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport {loadDataAction, setMapDataAction, startOverMapAction} from \"./../../actions/DataAction\";\n\nimport SubNavTabs from \"./../../components/nav/SubNavTabs\";\nimport Introduction from \"./../../components/blocks/Introduction\";\nimport EUWideLaborDemand from \"../../components/slides/euwide/today/EUWideLaborDemand\";\nimport EUWideEmpRates from \"../../components/slides/euwide/today/EUWideEmpRates\";\nimport GeoConcentrationToday from \"../../components/slides/euwide/today/GeoConcentrationToday\";\n\nimport {VIEWS, FILE_KEYS, EMPLOYMENT_FIELDS} from \"./../../helpers/consts\";\n\nimport \"./Employment.css\";\nimport JobDelta from \"../../components/slides/euwide/outlook/JobDelta\";\n\nclass Employment extends Component {\n\n constructor(props) {\n super();\n this.launchDataAction = this.launchDataAction.bind(this);\n }\n\n componentDidMount() {\n this.props.loadDataAction([FILE_KEYS.EMPLOYMENT_DATA, FILE_KEYS.OCCUPATIONAL_EU], this.props.db);\n this.props.startOverMap();\n this.launchDataAction();\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (\n prevProps.geojson !== this.props.geojson ||\n prevProps.options.perspective !== this.props.options.perspective ||\n prevProps.options.measure !== this.props.options.measure\n ) {\n this.launchDataAction();\n }\n }\n\n launchDataAction() {\n const {options} = this.props;\n const fieldSelected = EMPLOYMENT_FIELDS[`${options.perspective.key}_${options.measure.key}`];\n if (fieldSelected){\n this.props.setMapDataAction(VIEWS.EMPLOYMENT, fieldSelected);\n }\n }\n\n render() {\n return (\n <div id=\"fow-view-employment\">\n <SubNavTabs baseUrl={`/map/${VIEWS.EMPLOYMENT}`}>\n <div>\n <Introduction title=\"A patchwork of varying outcomes\">\n <div className=\"fow-col fow-col-1 fow-col-count-2 fow-md-col-count-1\">\n <p>Beneath the overall European and national employment numbers are many nuanced stories. We have\nbuilt an extensive data set covering almost 1,100 local labor markets. The results show that job and\npopulation growth are increasingly concentrated in a small number of dynamic cities—and the gap\nbetween those cities and hundreds of shrinking regions is widening.</p>\n <p>Our research looks at the trends of the past decade, since the starting point in each local economy today\nwill determine its ability to adapt in the years ahead as more work activities are automated. Then we\ntake a forward-looking view that combines the potential for displacement, the potential for job growth,\nand demographic trends. Together they paint a picture of how the future of work might play out across\nEurope after the COVID-19 crisis abates.</p>\n </div>\n </Introduction>\n </div>\n <div>\n <EUWideLaborDemand />\n <EUWideEmpRates />\n <GeoConcentrationToday />\n </div>\n <div>\n <JobDelta mode=\"decline\"/>\n <JobDelta mode=\"growth\"/>\n </div>\n </SubNavTabs>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n geojson: state.db.map.geojsonOptions[VIEWS.EMPLOYMENT],\n db: state.db,\n options: state.settings.switch\n };\n};\nconst mapDispatchToProps = dispatch => ({\n startOverMap: () => dispatch(startOverMapAction()),\n loadDataAction: (keys, db) => dispatch(loadDataAction(keys, db)),\n setMapDataAction: (view, field) => dispatch(setMapDataAction(view, false, field, false))\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Employment);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport CarouselItem from \"../../blocks/CarouselItem\";\nimport Source from \"../../items/Source\";\nimport SwitchControl from \"../../switch/SwitchControl\";\n\nimport {BarChart} from \"d3plus-react\";\n\nimport {numberWithCommas, removeDecimalsIfNotNeeded} from \"../../../helpers/formatters\";\n\n\nclass OccEmploymentShare extends Component {\n\n render() {\n const {occData, year, title, selectedOccupation, selectedShare} = this.props;\n const mode = selectedShare.key;\n const mySubtitle = mode === 'absolute' ? `Occupations employment, ${year === 2018 ? 2018 : '2018-30'}, in thousands` : `Occupations employment share, ${year === 2018 ? 2018 : '2018-30'}, %`;\n const subtitle = this.props.subtitle || mySubtitle;\n const selectedOccId = selectedOccupation.id;\n const targetYear = year || '2018';\n let descending = true;\n let metricName = mode === 'absolute' ? `${selectedOccupation.name} employment in ${targetYear} (thousands)` : `${selectedOccupation.name} share of employment in ${targetYear} (percent)`;\n let metric = mode === 'absolute' ? `employment_in_occupation_${targetYear}_thousands` : `share_of_employment_in_occupation_${targetYear}_percent`;\n let formatter = mode === 'absolute' ? numberWithCommas : x => `${removeDecimalsIfNotNeeded(x*100)}%`;\n\n let filteredData = occData.filter(row => row.isco_2_id === selectedOccId);\n filteredData = filteredData.sort((a, b) => descending ? b[metric] - a[metric] : a[metric] - b[metric]);\n\n if (filteredData.length === 0){\n return '';\n }\n\n let maxValue = filteredData[0][metric];\n maxValue = mode === 'absolute' ? Math.ceil(maxValue) + 10 : Math.round(Math.ceil(maxValue*100))/100;\n\n const chartConfig = {\n data: filteredData,\n detectVisible: true,\n height: 300,\n discrete: \"y\",\n groupBy: \"metro_name\",\n shapeConfig: {\n Bar: {\n label: (d) => (`${formatter(d[metric])}`),\n duration: 500,\n fill: d => \"rgb(0, 28, 45)\"\n }\n },\n tooltipConfig: {\n body: d => `<div>${metricName}: ${formatter(d[metric])}</div>`\n },\n x: metric,\n xConfig: {\n tickFormat: tick => `${formatter(tick)}`,\n domain: [0, maxValue]\n },\n y: \"metro_name\",\n ySort: descending ? (a, b) => a[metric] - b[metric] : (a, b) => b[metric] - a[metric],\n };\n\n return (\n <CarouselItem title={title} subtitle={subtitle} >\n <div className=\"fow-col fow-col-1\">\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1-4 fow-lg-col-1-3 fow-md-col-1-2 fow-sm-col-1\">\n <SwitchControl label={false} optionsKey=\"share_occ\" options={[{key: \"absolute\", value: \"Absolute\"}, {key: \"relative\", value: \"Relative\"}]} />\n </div>\n </div>\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n <BarChart config={chartConfig} />\n <Source text=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" />\n </div>\n </div>\n </div>\n </CarouselItem>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n occData: state.db.data.facts.occupational_shares ? state.db.data.facts.occupational_shares : [],\n selectedOccupation: state.settings.map[\"Occupations\"],\n selectedShare: state.settings.switch.share_occ\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(OccEmploymentShare);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport {loadDataAction, setMapDataAction, startOverMapAction} from \"./../../actions/DataAction\";\n\nimport SubNavTabs from \"./../../components/nav/SubNavTabs\";\nimport Introduction from \"./../../components/blocks/Introduction\";\n\nimport {VIEWS, FILE_KEYS, OCCUPATIONAL_FIELDS} from \"./../../helpers/consts\";\n\nimport OccEmploymentShare from \"../../components/slides/occupational/OccEmploymentShare\";\n\nimport \"./Occupational.css\";\n\nclass Occupational extends Component {\n\n constructor(props) {\n super();\n this.getFieldKey = this.getFieldKey.bind(this);\n this.getSelectedField = this.getSelectedField.bind(this);\n this.launchDataAction = this.launchDataAction.bind(this);\n }\n\n getFieldKey(){\n const {options} = this.props;\n return OCCUPATIONAL_FIELDS[options.measure_occ.key === \"delta\" ? `delta` : `${options.perspective_occ.key}_${options.share_occ.key}`];\n }\n\n getSelectedField(){\n const {selectedOccupation} = this.props;\n return `${selectedOccupation.id}_${this.getFieldKey()}`;\n }\n\n getSelectedFilter(){\n const field = this.getSelectedField();\n return ['has', field];\n }\n\n componentDidMount() {\n this.props.loadDataAction([\n FILE_KEYS.OCCUPATIONAL_DATA,\n FILE_KEYS.OCCUPATIONAL_TOP10_SHARE\n ], this.props.db);\n this.props.startOverMap();\n this.launchDataAction();\n }\n\n componentDidUpdate(prevProps, prevState) {\n const {selectedOccupation} = this.props;\n if (\n prevProps.geojson !== this.props.geojson ||\n prevProps.selectedOccupation.id !== selectedOccupation.id ||\n prevProps.options.perspective_occ !== this.props.options.perspective_occ ||\n prevProps.options.measure_occ !== this.props.options.measure_occ ||\n prevProps.options.share_occ !== this.props.options.share_occ\n ) {\n this.launchDataAction();\n }\n }\n\n launchDataAction() {\n const {options, setMapDataAction, selectedOccupation} = this.props;\n if (options.perspective_occ && options.share_occ && options.measure_occ){\n const fieldSelected = this.getFieldKey();\n if (fieldSelected) {\n setMapDataAction(VIEWS.OCCUPATIONAL, this.getSelectedFilter(), this.getSelectedField(), selectedOccupation);\n }\n }\n }\n\n render() {\n return (\n <div id=\"fow-view-regional-cluster\">\n <SubNavTabs baseUrl={`/map/${VIEWS.OCCUPATIONAL}`}>\n <div>\n <Introduction title=\"A shifting mix\">\n <div className=\"fow-col fow-col-1 fow-col-count-2 fow-md-col-count-1\">\n <p>The Internet disrupted many industries and eliminated many jobs. But it also gave rise to new roles such as web developers, app developers, social media marketers, search engine optimization consultants, and user experience designers.</p>\n <p>Our research suggests that the mix of jobs will not look the same in 2030 as it does today. Even as employment declines for administrative assistants and manufacturing production workers, for instance, we anticipate strong growth for software developer and nurses.</p>\n <p>Furthermore, occupational shifts will not play out exactly the same way across different local economies. Here we map these trends at the local level, showing where specific occupations are concentrated today and where they are likely to grow or decline in the future.</p>\n </div>\n </Introduction>\n </div>\n <div>\n <OccEmploymentShare year={2018} title=\"Where were these occupations concentrated in 2018?\" />\n </div>\n <div>\n <OccEmploymentShare year={2030} title=\"Where are these occupations expected to grow by 2030?\" subtitle=\"Occupational employment growth 2018-30\" />\n </div>\n </SubNavTabs>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n geojson: state.db.map.geojsonOptions[VIEWS.OCCUPATIONAL],\n db: state.db,\n selectedOccupation: state.settings.map[\"Occupations\"],\n options: state.settings.switch\n };\n};\nconst mapDispatchToProps = dispatch => ({\n startOverMap: () => dispatch(startOverMapAction()),\n loadDataAction: (keys, db) => dispatch(loadDataAction(keys, db)),\n setMapDataAction: (view, filter, field, entity) => dispatch(setMapDataAction(view, filter, field, entity))\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Occupational);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport Map from \"./../components/map/Map\";\nimport InfoBox from \"../components/map/InfoBox\";\nimport StatsBox from \"../components/map/StatsBox\";\nimport MapTooltip from \"./../components/map/MapTooltip\";\n\nimport {FILE_KEYS} from \"./../helpers/consts\";\nimport {loadDataAction} from \"./../actions/DataAction\";\n\n//Views\nimport RegionalCluster from \"../views/map/RegionalCluster\";\nimport Employment from \"../views/map/Employment\";\nimport Occupational from \"../views/map/Occupational\";\n\nimport \"./MapViewLayout.css\";\n\nclass MapViewLayout extends Component {\n\n componentDidMount() {\n this.props.loadDataAction([\n FILE_KEYS.CLUSTERS_REFERENCE,\n FILE_KEYS.COUNTRIES_REFERENCE,\n FILE_KEYS.URBAN_REFERENCE,\n FILE_KEYS.NUTS3_SHAPES,\n FILE_KEYS.METRO_STATS,\n FILE_KEYS.NUTS3_PRESENT,\n FILE_KEYS.ISCO_REFERENCE\n ], this.props.db);\n }\n\n render() {\n const {hashParts} = this.props;\n return (\n <div id=\"fow-map-view-layout\">\n <InfoBox />\n <div id=\"fow-map-row\">\n <div className=\"fow-inner-container\">\n <div id=\"fow-map-layout-row\" className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n <MapTooltip />\n <Map />\n <StatsBox />\n </div>\n </div>\n </div>\n </div>\n {hashParts.view === \"regional-cluster\" && <RegionalCluster />}\n {hashParts.view === \"employment\" && <Employment />}\n {hashParts.view === \"occupational\" && <Occupational />}\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n db: state.db,\n hashParts: state.settings.hashParts\n };\n};\nconst mapDispatchToProps = dispatch => ({\n loadDataAction: (keys, db) => dispatch(loadDataAction(keys, db)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MapViewLayout);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter, Link} from 'react-router-dom';\nimport \"./ExploreBtn.css\";\n\nclass ExploreBtn extends Component {\n\n render() {\n const {link} = this.props;\n if(!link){\n return '';\n }\n return (\n <div className=\"fow-explore-btn\">\n <Link to={`?page=${link}`} className=\"fow-font-text fow-font-size-md\">\n <span>Explore this topic in detail</span>\n </Link>\n </div>\n );\n }\n}\n\nexport default withRouter(connect()(ExploreBtn));\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport Source from \"../items/Source\";\n\nimport \"./HomeSection.css\";\nimport ExploreBtn from \"../items/ExploreBtn\";\n\nclass HomeSection extends Component {\n\n render() {\n const {title, source, children, explore, note} = this.props;\n let noteCmps = null;\n if (note && Array.isArray(note)) {\n noteCmps = note.map((x,ix) => <Source key={ix} text={x}/>);\n } else if (note) {\n noteCmps = <Source text={note}/>;\n }\n\n return (\n <div className=\"fow-home-section\">\n <div className=\"fow-inner-container\">\n <div className=\"fow-row fow-md-row-to-col\">\n <div className=\"fow-col fow-col-1-3 fow-lg-col-1-2 fow-md-col-1 fow-home-section-title\">\n <h2 className=\"fow-font-title fow-font-size-xxl\">{title}</h2>\n {children[0]}\n <ExploreBtn link={explore} />\n </div>\n <div className=\"fow-col fow-col-2-3 fow-lg-col-1-2 fow-md-col-1 fow-home-section-children\">\n {children[1]}\n {source &&\n <Source text={source}/>\n }\n {noteCmps}\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(HomeSection);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport ClusterGroupTabs from \"../../blocks/ClusterGroupTabs\";\nimport SVGImage from \"../../svg/SVGImage\";\n\nclass CommunitiesPriorities extends Component {\n\n render() {\n const {baseUrl} = this.props;\n return (\n <div className=\"fow-row\">\n <div className=\"fow-col-1\">\n <ClusterGroupTabs>\n <div style={{height: \"100%\"}}>\n <SVGImage src={`${baseUrl}home/local-communities-dgh.svg`} />\n </div>\n <div style={{height: \"100%\"}}>\n <SVGImage src={`${baseUrl}home/local-communities-se.svg`} />\n </div>\n <div style={{height: \"100%\"}}>\n <SVGImage src={`${baseUrl}home/local-communities-sr.svg`} />\n </div>\n </ClusterGroupTabs>\n <div style={{height:60}}>\n <SVGImage src={`${baseUrl}home/local-communities-legend.svg`} />\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n baseUrl: state.settings.baseUrl,\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CommunitiesPriorities);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport SVGIcon from \"../../svg/SVGIcon\";\nimport SVGImage from \"../../svg/SVGImage\";\n\nimport \"./EmployersPriorities.css\";\n\nclass EmployersPriorities extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n activeTab: 0\n }\n this.onClickNext = this.onClickNext.bind(this);\n this.onClickPrev = this.onClickPrev.bind(this);\n }\n\n onClickNext() {\n const {activeTab} = this.state;\n const next = (activeTab === 3)?0:activeTab+1;\n this.setState({activeTab:next});\n }\n\n onClickPrev() {\n const {activeTab} = this.state;\n const prev = (activeTab === 0) ? 3 : activeTab - 1;\n this.setState({activeTab: prev});\n }\n\n render() {\n const {baseUrl} = this.props;\n const {activeTab} = this.state;\n return (\n <div id=\"fow-employers-priorities\" className=\"fow-row\">\n <div className=\"fow-col-1\">\n <div className=\"fow-employers-priorities-controls\">\n <div className=\"fow-employers-priorities-control fow-employers-priorities-control-prev fow-font-text\" onClick={this.onClickPrev}><SVGIcon name=\"prev\" height=\"13\" width=\"13\" stroke=\"#000\"/><span>Prev</span></div>\n <span className=\"fow-employers-priorities-current fow-font-text\">{activeTab+1} - 4</span>\n <div className=\"fow-employers-priorities-control fow-employers-priorities-control-next fow-font-text\" onClick={this.onClickNext}><span>Next</span><SVGIcon name=\"next\" height=\"13\" width=\"13\" stroke=\"#000\" /></div>\n </div>\n <div className=\"fow-employers-priorities-container\">\n <SVGImage src={`${baseUrl}home/employers-${activeTab+1}.svg`} />\n </div>\n <div className=\"fow-employers-priorities-legend-container\">\n <SVGImage src={`${baseUrl}home/employers-legend.svg`} />\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n baseUrl: state.settings.baseUrl,\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmployersPriorities);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter, Link} from 'react-router-dom';\n\nimport MiniLegend from \"./../../components/items/MiniLegend\";\nimport HomeSection from \"./../../components/blocks/HomeSection\";\nimport SwitchControl from \"./../../components/switch/SwitchControl\";\n\nimport {TERTIARY_EDUCATION_ARRAY} from \"./../../helpers/colors\";\nimport {VIEWS, NAV, FUTURE_DISCLAIMER} from \"./../../helpers/consts\";\n\nimport \"./Home.css\";\nimport CommunitiesPriorities from \"../../components/slides/home/CommunitiesPriorities\";\nimport EmployersPriorities from \"../../components/slides/home/EmployersPriorities\";\nimport SVGIcon from \"../../components/svg/SVGIcon\";\nimport SVGImage from \"../../components/svg/SVGImage\";\n\nclass Home extends Component {\n\n render() {\n const {baseUrl, workersChart} = this.props;\n\n const colorsTertiaryEducation = TERTIARY_EDUCATION_ARRAY.map(c => ({label: c[0], color: c[1]}));\n\n const homeBtns = NAV.main.filter(d=>d.isMap);\n const noteTxt = \"Note: This research covers the EU 27 countries, plus Switzerland and the United Kingdom.\";\n return (\n <div id=\"fow-view-home\">\n <div id=\"fow-home-splash\">\n <div className=\"fow-home-splash-inner\">\n <h1 className=\"fow-col fow-col-5-6 fow-lg-col-1 fow-font-title fow-font-size-xxxl fow-font-color-snow fow-text-center\">Explore the future of work in Europe</h1>\n <p className=\"fow-col fow-col-2-3 fow-lg-col-3-4 fow-md-col-1 fow-font-text fow-font-size-lg fow-font-color-snow fow-text-center\">Technology and structural shifts in the economy are reshaping the workplace and will continue to do so after the COVID-19 crisis abates. What does this look like across Europe today? And what will be the result as these trends continue over the next decade? Explore the data to gain a perspective for the continent as a whole—or go deeper for a close-up view that spans almost 1,100 local labor markets.</p>\n <div className=\"fow-col fow-col-1 fow-home-btns\">\n {homeBtns.map(btn=>\n <Link key={btn.slug} to={`?page=${btn.link}`} className={`fow-font-text fow-font-size-md`}>\n {btn.largeName}\n </Link>\n )}\n </div>\n <div className=\"fow-home-arrow\"><SVGIcon name=\"down\" height=\"15\" strokeWidth=\"1.5\"/></div>\n </div>\n </div>\n <HomeSection title=\"How do local labor markets differ across Europe?\" source=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis.\" note={noteTxt} explore={`/map/${VIEWS.REGIONAL_CLUSTER}/intro`}>\n <>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Europe is a patchwork of local labor markets with striking variations in sector mix, workforce skills, innovation capabilities, and business dynamism. We used a mathematical clustering technique to group almost 1,100 local economies across Europe into 13 clusters. These clusters fall into three broad categories.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Forty-eight dynamic cities, including Amsterdam, Copenhagen, London, Madrid, Munich, and Paris, are home to 20 percent of Europe’s population. They account for more than half of its high-tech patents, three-quarters of its startups, and 83 percent of its STEM graduates.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">By contrast, 438 shrinking regions with 30 percent of the population, mostly in Eastern and Southern Europe, have declining workforces, older populations, and lower educational attainment. The remaining half of Europe’s population lives in a wide range of largely stable economies.</p>\n </>\n <>\n <SVGImage src={`${baseUrl}home/map-colors.svg`} />\n </>\n </HomeSection>\n <HomeSection title=\"What are the recent patterns of job growth across Europe?\" source=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis\" explore={`/map/${VIEWS.EMPLOYMENT}/intro`} note={noteTxt}>\n <>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Growth has become geographically concentrated in recent years. Since 2007, just 48 dynamic cities have generated 35 percent of Europe’s net job growth, 42 percent of its GDP growth, and 40 percent of its population growth. During the same period, job growth has been modest in stable economies, and stagnant or even negative in shrinking regions.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Before the coronavirus pandemic, employment rates rose in 85 percent of local economies across the continent as the workforce shrank.</p>\n </>\n <>\n <h3 className=\"fow-font-text fow-font-size-lg fow-font-bold\">Disparities between clusters are widening, with just 48 dynamic growth hubs generating more than one-third of Europe’s job growth since 2007.</h3>\n <SVGImage src={`${baseUrl}home/job-growth-across-europe.svg`} />\n </>\n </HomeSection>\n <HomeSection title=\"How will European workers be affected by automation?\" source=\"Source: Eurostat, Oxford Economics; McKinsey Global Institute analysis.\" note={[noteTxt, \"1.- Jobs that do not yet exist, often created as a result of new technology (e.g., AI ethicists), education unknown.\", FUTURE_DISCLAIMER]} explore={`/map/${VIEWS.EMPLOYMENT}/intro`}>\n <>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">More than half of Europe’s workforce can expect signicant change.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Work activities equivalent to about 53 million jobs could potentially be displaced by automation. There is some overlap between these jobs at risk from automation and those at risk in the short term from the impact of the COVID-19 crisis.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Many of the largest occupational categories in Europe today have the highest potential for displacement. About 21 million workers, most of whom lack tertiary education, may need to change occupations by 2030.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">At the same time, we see a continuing rise in demand for workers in technology, science, and engineering fields as well as business and legal professionals. Human workers will also increasingly concentrate in roles that require personal interaction, caregiving, teaching and training, and managing others—activities for which machines are not good substitutes.</p>\n </>\n <>\n <h3 className=\"fow-font-text fow-font-size-lg fow-font-bold\">Millions of Europeans will need to transition from declining to growing occupations.</h3>\n <h3 className=\"fow-font-text fow-font-size-md fow-font-bold\">Total gross jobs change by 2030 (summing all regions), changing ISCO2 occupation groups only, millions</h3>\n <div className=\"fow-row fow-sm-row-to-col\">\n <div className=\"fow-col-3-4 fow-lg-col-1-2 fow-md-col-1-2 fow-sm-col-1\">\n <MiniLegend colors={colorsTertiaryEducation} title=\"Share of workers without tertiary education, %\" />\n </div>\n <div className=\"fow-col-1-4 fow-lg-col-1-2 fow-md-col-1-2 fow-sm-col-1\">\n <SwitchControl label={false} optionsKey=\"workers_chart\" options={[{key: \"growth\", value: \"Growing\"}, {key: \"decline\", value: \"Declining\"}]} />\n </div>\n </div>\n <SVGImage src={`${baseUrl}home/job-chart-${workersChart.key}.svg`} />\n <div>\n <MiniLegend colors={colorsTertiaryEducation} title=\"Share of workers without tertiary education, %\" />\n </div>\n </>\n </HomeSection>\n <HomeSection title=\"How might Europe’s geography of job growth evolve by 2030?\" note={[noteTxt, FUTURE_DISCLAIMER]} source=\"Source: McKinsey Global Institute analysis.\" explore={`/map/${VIEWS.EMPLOYMENT}/intro`}>\n <>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Automation could intensify regional concentration in the years to come.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">The 48 dynamic cities that outperformed in the past decade could capture more than 50 percent of Europe’s potential job growth in the next.</p>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Meanwhile, stable economies should continue to add jobs at a modest pace, just as they did in the past decade. Within the shrinking regions category, the outcomes could range from small increases to negative growth. Around 40 percent of Europe’s population lives in regions that could have fewer jobs in 2030 than they do today in absolute terms. However, even places facing job losses will need to boost employment to compensate as aging and outmigration shrink the working-age population.</p>\n </>\n <>\n <h3 className=\"fow-font-text fow-font-size-lg fow-font-bold\">Potential net job growth by 2030 in midpoint automation scenario, %</h3>\n <SVGImage src={`${baseUrl}home/job-growth-2030.svg`} />\n </>\n </HomeSection>\n <HomeSection title=\"What are the priorities for employers?\" source=\"Source: McKinsey Global Institute analysis.\" explore={false}>\n <>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Employers will need to make adept decisions about strategy, skills, and social responsibility. Companies may need to respond as consumer purchasing power shifts. To address the need for new types of skills, they may need to change recruiting processes, establish learning programs, and redesign organizational structures. Their choices have to reflect the skills, occupational mix, and geographic footprint of their workforces today. A retail chain with a distributed customer-facing workforce, for example, faces different questions than a geographically concentrated tech firm. Employers will also need to consider how their workforce decisions affect the communities in which they operate.</p>\n </>\n <>\n <h3 className=\"fow-font-text fow-font-size-lg fow-font-bold\">Based on the characteristics of their workforces, most European employers fit into nine categories, with different challenges and choices.</h3>\n <EmployersPriorities />\n </>\n </HomeSection>\n <HomeSection title=\"What are the priorities for local communities?\" source=\"Source: McKinsey Global Institute analysis.\" explore={false}>\n <>\n <p className=\"fow-font-text fow-font-size-sm fow-font-color-space\">Each community has its own current and future priorities to overcome labor market mismatches. But four broad imperatives stand out: creating viable training and career pathways to address skills shortages, improving access to jobs in dynamic growth hubs, revitalizing and supporting shrinking labor markets, and increasing labor participation rates.</p>\n </>\n <>\n <h3 className=\"fow-font-text fow-font-size-lg fow-font-bold\">The challenges and priorities vary across different types of local labor markets.</h3>\n <CommunitiesPriorities />\n </>\n </HomeSection>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n baseUrl: state.settings.baseUrl,\n workersChart: state.settings.switch['workers_chart']\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(Home));\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport \"./About.css\";\n\nclass About extends Component {\n\n render() {\n return (\n <div id=\"fow-view-about\">\n <div id=\"fow-about-splash\">\n <div className=\"fow-about-splash-inner\">\n <div className=\"fow-inner-container\">\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1 fow-col-about\">\n <h1 className=\"fow-font-title fow-font-size-xxxl fow-font-color-snow\">The future of work in Europe: Automation, workforce transitions, and the shifting geography of employment</h1>\n <p className=\"fow-font-text fow-font-size-lg fow-font-color-snow\">Filling jobs in a shifting geography of employment.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"fow-inner-about\">\n <div className=\"fow-inner-container\">\n <div className=\"fow-row fow-md-row-to-col\">\n <div className=\"fow-col fow-col-1-2 fow-md-col-1\">\n <p className=\"fow-font-text fow-font-size-md\">This data visualization is based on the McKinsey Global Institute discussion paper <a href=\"https://www.mckinsey.com/featured-insights/future-of-work/the-future-of-work-in-europe\" target=\"_blank\" rel=\"noopener noreferrer\">\"The future of work in Europe: Automation, workforce transitions, and the shifting geography of employment\"</a>. It continues our multiyear body of research into labor markets and the potential effects of automation technologies. We have built a unique data set and employed economic modeling to explore how European labor markets are evolving.</p>\n\n </div>\n <div className=\"fow-col fow-col-1-2 fow-md-col-1\">\n <p className=\"fow-font-text fow-font-size-md\">Like the research on which it is based, this interactive tool delves beneath the headline numbers to analyze almost 1,100 local economies across the 27 EU countries plus Switzerland and the United Kingdom.</p>\n <p className=\"fow-font-text fow-font-size-md\">We look at both past trends and prospects for the decade ahead. Our analysis shows that, beyond the short- and medium-term impact of the COVID-19 crisis, the future of work is already unfolding in Europe—and the trends we see today will grow more pronounced as automation gains ground.</p>\n </div>\n </div>\n <div className=\"fow-row\">\n <div className=\"fow-col fow-col-1\">\n <h1 className=\"fow-font-text fow-font-size-xl\">Data and methodology</h1>\n </div>\n </div>\n <div className=\"fow-row fow-md-row-to-col\">\n <div className=\"fow-col fow-col-1-2 fow-md-col-1\">\n <p className=\"fow-font-text fow-font-size-md\">Most analyses of Europe’s regional labor trends use Eurostat’s Nomenclature des unités territoriales statistiques (NUTS) 2 classification, which focuses on 281 regions. To gain a more nuanced perspective, we go deeper and construct a database at the more detailed NUTS 3 level. For 285 metropolitan regions, we combined all NUTS 3 regions belonging to the same commuting zone, defined by Eurostat as zones containing the surrounding travel-to-work areas of a city where at least 15 percent of employed residents are working in that city. For the 810 non-metropolitan regions, we used NUTS 3 borders. The database includes more than 115 variables per region from public and private data sources, including Eurostat and Oxford Economics. For variables available only at the NUTS 2 level, we used modeling to disaggregate the data to the more granular NUTS 3 level. Our data set offers a unique, comprehensive view of employment by industry and occupation for each of the 1,095 regions, from 2011 to 2018.</p>\n <p className=\"fow-font-text fow-font-size-md\">We group these local economies into 13 key clusters, using a statistical technique known as K-means clustering. It is based on 15 of the key variables reflecting each location’s demographics, growth trends, skill levels, industry mix, business dynamism, innovation capabilities, and other characteristics.</p>\n <p className=\"fow-font-text fow-font-size-md\">To understand the impact of automation and estimate future job creation in each location, we adapted MGI’s existing models for <a href=\"https://www.mckinsey.com/featured-insights/future-of-work/jobs-lost-jobs-gained-what-the-future-of-work-will-mean-for-jobs-skills-and-wages\" target=\"_blank\" rel=\"noopener noreferrer\">automation</a>, job growth through 2030, and AI readiness. </p>\n </div>\n <div className=\"fow-col fow-col-1-2 fow-md-col-1\">\n <p className=\"fow-font-text fow-font-size-md\">The result is a localized view of jobs at risk of automation, potential job growth through 2030, and technology diffusion across Europe. We assume that geographic mobility will continue on its recent trajectory. While we ran multiple scenarios regarding the pace of automation in Europe, the results in both the report and this data tool reflect the midpoint adoption scenario—that is, midway between the most rapid and the slowest potential paths. This visualization does not include the short- and medium-term impact on employment of the coronavirus pandemic, although we note considerable overlap between the jobs most likely to be displaced by automation in the longer term and those at risk because of the COVID-19 crisis.</p>\n <p className=\"fow-font-text fow-font-size-md\">We caution that the estimates from our model are not forecasts; they are meant to illustrate how trends may play out over the next decade. Note that we considered only automation-related job losses, although other structural shifts, shocks, and technological developments could have substantial impact on job growth estimates. Our modeling also does not account for Brexit and any related restrictions on trade and mobility, nor unforeseen cyclical events such as the coronavirus pandemic. But these types of events can amplify long-term structural trends such as automation.</p>\n <p className=\"fow-font-text fow-font-size-md\">The boundaries and names shown on maps do not imply official endorsement or acceptance by McKinsey & Company.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(About);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\n\nimport Home from \"../views/page/Home\";\nimport About from \"../views/page/About\";\n\nimport \"./PageViewLayout.css\";\n\nclass PageViewLayout extends Component {\n\n render() {\n const {hashParts} = this.props;\n return (\n <div id=\"fow-page-view-layout\">\n {hashParts.view === \"home\" && <Home />}\n {hashParts.view === \"about\" && <About />}\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n hashParts: state.settings.hashParts\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PageViewLayout);\n","import React, {Component} from \"react\";\nimport {connect} from \"react-redux\";\nimport {withRouter} from 'react-router-dom';\nimport {setLogIn} from '../helpers/security';\n\nimport \"./LoginViewLayout.css\";\n\nclass LoginViewLayout extends Component {\n\n constructor(props) {\n super(props);\n\n this.state = {\n password: '',\n error: false,\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n componentDidMount() {\n\n }\n\n onSubmit(e) {\n e.preventDefault();\n\n const {password} = this.state;\n const {history} = this.props;\n\n //ClearError\n this.setState({error: false});\n\n //Validate\n if (!(password === 'Futureofwork2030')) {\n console.log('error!');\n return this.setState({error: true});\n }\n\n //Save to localstorage\n setLogIn(() => history.push('?page=/page/home'));\n }\n\n handleChange(e) {\n this.setState({password: e.target.value, error:false});\n }\n\n render() {\n const {error,password} = this.state;\n return (\n <div id=\"fow-login-view-layout\">\n <div className=\"fow-login-form\">\n <form onSubmit={this.onSubmit}>\n <h3>Access restriction</h3>\n <p>Please enter the password to continue.</p>\n <input\n label=\"Password\"\n type=\"password\"\n name=\"password\"\n value={password}\n placeholder=\"Enter password here...\"\n onChange={this.handleChange}\n />\n <span className=\"fow-error\">{error && <>Wrong password, please try again.</>}</span>\n <input type=\"submit\" value=\"Login\" />\n </form>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n hashParts: state.settings.hashParts\n };\n};\nconst mapDispatchToProps = dispatch => ({});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(LoginViewLayout));\n","import React, {Component} from 'react';\nimport {connect} from \"react-redux\";\nimport PropTypes from 'prop-types';\n\nimport {setWindowSizeAction, setHashAction, setNavStateAction} from \"./actions/SettingsAction\";\n\nimport {NAV_FIXED_WHERE_SCROLL} from \"./helpers/consts\";\nimport d3plus from \"./helpers/d3plus\";\nimport {isLoggedIn} from './helpers/security';\n\nimport Loading from \"./components/Loading\";\nimport Nav from \"./components/nav/Nav\";\nimport ContactUs from \"./components/items/ContactUs\";\n\nimport MapViewLayout from './layouts/MapViewLayout';\nimport PageViewLayout from './layouts/PageViewLayout';\nimport LoginViewLayout from './layouts/LoginViewLayout';\n\nimport {withRouter} from 'react-router-dom';\n\nimport './App.css';\n\nclass App extends Component {\n\n constructor(props) {\n super(props);\n this.updateWindowDimensions = this.updateWindowDimensions.bind(this);\n this.updateHash = this.updateHash.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n this.isPageChange = this.isPageChange.bind(this);\n this.getPageFromParams = this.getPageFromParams.bind(this);\n }\n\n getChildContext() {\n return {d3plus};\n }\n\n async componentDidMount() {\n const {history} = this.props;\n //Save initial hash\n const page = this.getPageFromParams();\n //const canSee = await isLoggedIn();\n const canSee = true;\n if (page && canSee){\n if(page===\"/login\"){\n history.push('?page=/page/home');\n } else {\n this.updateHash(page);\n }\n } else {\n if(canSee){\n history.push('?page=/page/home');\n }else {\n history.push('?page=/login');\n }\n }\n\n //Add listeners\n window.addEventListener(\"resize\", this.updateWindowDimensions);\n window.addEventListener('scroll', this.handleScroll);\n\n }\n\n getPageFromParams() {\n const {search} = this.props.location;\n return new URLSearchParams(search.replace('?','')).get(\"page\");\n }\n\n componentDidUpdate(prevProps) {\n const page = this.getPageFromParams();\n this.updateHash(page);\n }\n\n updateWindowDimensions() {\n const {setWindowSizeAction} = this.props;\n setWindowSizeAction({width: window.innerWidth, height: window.innerHeight});\n }\n\n updateHash(page) {\n const {setHashAction, hash} = this.props;\n if (this.isPageChange(hash, page)){\n window.scrollTo(0, 0); //move to top\n }\n if(hash !== page){\n setHashAction(page);\n }\n }\n\n isPageChange(oldHash, newHash){\n if (!oldHash || !newHash){\n return true;\n }\n const partsOld = oldHash.split('/');\n const partsNew = newHash.split('/');\n return partsOld[2] !== partsNew[2];\n }\n\n handleScroll(event) {\n const mustBeFixed = window.scrollY > NAV_FIXED_WHERE_SCROLL;\n const {navFixed, setNavStateAction} = this.props;\n if (mustBeFixed !== navFixed){\n setNavStateAction(mustBeFixed);\n }\n }\n\n componentWillUnmount (){\n window.removeEventListener(\"resize\", this.updateWindowDimensions);\n window.removeEventListener('scroll', this.handleScroll);\n }\n\n render() {\n const {hashParts} = this.props;\n return (\n <div id=\"fow-app\" className={`fow-app-${hashParts.type}`}>\n <div id=\"fow-container\">\n <Loading />\n {hashParts.type === \"login\" &&\n <>\n <LoginViewLayout />\n </>\n }\n {hashParts.type !== \"login\" &&\n <>\n <Nav />\n {hashParts.type === \"page\" && <PageViewLayout />}\n {hashParts.type === \"map\" && <MapViewLayout />}\n <ContactUs />\n </>\n }\n </div>\n </div>\n );\n }\n}\n\nApp.childContextTypes = {\n d3plus: PropTypes.object\n};\n\nconst mapStateToProps = state => {\n return {\n hash: state.settings.hash,\n hashParts: state.settings.hashParts,\n loading: state.db.loading,\n db: state.db,\n navFixed: state.settings.navFixed\n };\n};\nconst mapDispatchToProps = dispatch => ({\n setWindowSizeAction: (dimensions) => dispatch(setWindowSizeAction(dimensions)),\n setHashAction: (hash) => dispatch(setHashAction(hash)),\n setNavStateAction: (fixed) => dispatch(setNavStateAction(fixed))\n});\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(App));\n\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport 'unorm';\nimport 'url-search-params-polyfill';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {Provider} from \"react-redux\";\nimport {BrowserRouter as Router} from \"react-router-dom\";\nimport configureStore from \"./store\";\nimport ReactGA from \"react-ga\";\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactGA.initialize(\"UA-xxxxxx-x\");\nReactGA.pageview(window.location.pathname + window.location.search);\n\nconst store = configureStore(/* provide initial state if any */)\n\nlet rendered = false;\nwhile (!rendered) {\n const rootElement = document.getElementById('interactive-bespoke-interactive-mckinseyfowghpages');\n if (rootElement){\n rendered = true;\n //console.info('interactive-bespoke-interactive-mckinseyfowghpages element is present. Rendering...');\n ReactDOM.render(\n <Provider store={store}>\n <Router>\n <App />\n </Router>\n </Provider>\n , document.getElementById('interactive-bespoke-interactive-mckinseyfowghpages'));\n } else {\n console.warn('interactive-bespoke-interactive-mckinseyfowghpages element is NOT present. Retrying...');\n }\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}