@buildcanada/charts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/README.md +113 -0
- package/package.json +137 -0
- package/src/components/BodyPortal/BodyPortal.tsx +40 -0
- package/src/components/Button/Button.scss +110 -0
- package/src/components/Button/Button.tsx +101 -0
- package/src/components/Checkbox.scss +93 -0
- package/src/components/Checkbox.tsx +47 -0
- package/src/components/ExpandableToggle/ExpandableToggle.scss +123 -0
- package/src/components/ExpandableToggle/ExpandableToggle.tsx +60 -0
- package/src/components/GrapherTabIcon.tsx +156 -0
- package/src/components/GrapherTrendArrow.scss +16 -0
- package/src/components/GrapherTrendArrow.tsx +30 -0
- package/src/components/Halo/Halo.tsx +44 -0
- package/src/components/LabeledSwitch/LabeledSwitch.scss +109 -0
- package/src/components/LabeledSwitch/LabeledSwitch.tsx +62 -0
- package/src/components/MarkdownTextWrap/MarkdownTextWrap.tsx +1173 -0
- package/src/components/OverlayHeader.scss +18 -0
- package/src/components/OverlayHeader.tsx +29 -0
- package/src/components/RadioButton.scss +69 -0
- package/src/components/RadioButton.tsx +42 -0
- package/src/components/SimpleMarkdownText.tsx +89 -0
- package/src/components/TextInput.scss +17 -0
- package/src/components/TextInput.tsx +19 -0
- package/src/components/TextWrap/TextWrap.tsx +361 -0
- package/src/components/TextWrap/TextWrapUtils.ts +32 -0
- package/src/components/closeButton/CloseButton.scss +40 -0
- package/src/components/closeButton/CloseButton.tsx +27 -0
- package/src/components/index.ts +70 -0
- package/src/components/loadingIndicator/LoadingIndicator.scss +40 -0
- package/src/components/loadingIndicator/LoadingIndicator.tsx +28 -0
- package/src/components/markdown/remarkPlainLinks.ts +36 -0
- package/src/components/reactUtil.ts +20 -0
- package/src/components/stubs/CodeSnippet.tsx +19 -0
- package/src/components/stubs/DataCitation.tsx +16 -0
- package/src/components/stubs/IndicatorKeyData.tsx +45 -0
- package/src/components/stubs/IndicatorProcessing.tsx +15 -0
- package/src/components/stubs/IndicatorSources.tsx +15 -0
- package/src/components/styles/colors.scss +113 -0
- package/src/components/styles/mixins.scss +630 -0
- package/src/components/styles/typography.scss +579 -0
- package/src/components/styles/util.scss +89 -0
- package/src/components/styles/variables.scss +208 -0
- package/src/config/ChartsConfig.ts +163 -0
- package/src/config/ChartsProvider.tsx +157 -0
- package/src/config/index.ts +20 -0
- package/src/core-table/CoreTable.ts +1355 -0
- package/src/core-table/CoreTableColumns.ts +973 -0
- package/src/core-table/CoreTableUtils.ts +793 -0
- package/src/core-table/ErrorValues.ts +73 -0
- package/src/core-table/OwidTable.ts +1175 -0
- package/src/core-table/OwidTableSynthesizers.ts +272 -0
- package/src/core-table/OwidTableUtil.ts +76 -0
- package/src/core-table/Transforms.ts +484 -0
- package/src/core-table/index.ts +82 -0
- package/src/explorer/ColumnGrammar.ts +217 -0
- package/src/explorer/Explorer.sample.ts +212 -0
- package/src/explorer/Explorer.scss +148 -0
- package/src/explorer/Explorer.tsx +1283 -0
- package/src/explorer/ExplorerConstants.ts +85 -0
- package/src/explorer/ExplorerControls.scss +156 -0
- package/src/explorer/ExplorerControls.tsx +210 -0
- package/src/explorer/ExplorerDecisionMatrix.ts +471 -0
- package/src/explorer/ExplorerGrammar.ts +161 -0
- package/src/explorer/ExplorerProgram.ts +568 -0
- package/src/explorer/ExplorerUtils.ts +59 -0
- package/src/explorer/GrapherGrammar.ts +387 -0
- package/src/explorer/gridLang/GrammarUtils.ts +121 -0
- package/src/explorer/gridLang/GridCell.ts +298 -0
- package/src/explorer/gridLang/GridLangConstants.ts +255 -0
- package/src/explorer/gridLang/GridProgram.ts +311 -0
- package/src/explorer/gridLang/readme.md +17 -0
- package/src/explorer/index.ts +69 -0
- package/src/explorer/readme.md +19 -0
- package/src/explorer/urlMigrations/CO2UrlMigration.ts +46 -0
- package/src/explorer/urlMigrations/CovidUrlMigration.ts +37 -0
- package/src/explorer/urlMigrations/EnergyUrlMigration.ts +41 -0
- package/src/explorer/urlMigrations/ExplorerPageUrlMigrationSpec.ts +12 -0
- package/src/explorer/urlMigrations/ExplorerUrlMigrationUtils.ts +45 -0
- package/src/explorer/urlMigrations/ExplorerUrlMigrations.ts +33 -0
- package/src/explorer/urlMigrations/LegacyCovidUrlMigration.ts +144 -0
- package/src/explorer/urlMigrations/readme.md +39 -0
- package/src/grapher/axis/Axis.ts +973 -0
- package/src/grapher/axis/AxisConfig.ts +179 -0
- package/src/grapher/axis/AxisViews.tsx +597 -0
- package/src/grapher/barCharts/DiscreteBarChart.tsx +728 -0
- package/src/grapher/barCharts/DiscreteBarChartConstants.ts +60 -0
- package/src/grapher/barCharts/DiscreteBarChartHelpers.ts +338 -0
- package/src/grapher/barCharts/DiscreteBarChartState.ts +354 -0
- package/src/grapher/barCharts/DiscreteBarChartThumbnail.tsx +34 -0
- package/src/grapher/captionedChart/CaptionedChart.scss +61 -0
- package/src/grapher/captionedChart/CaptionedChart.tsx +523 -0
- package/src/grapher/captionedChart/Logos.tsx +141 -0
- package/src/grapher/captionedChart/LogosSVG.tsx +16 -0
- package/src/grapher/captionedChart/StaticChartRasterizer.tsx +178 -0
- package/src/grapher/captionedChart/assets/buildcanada-logo-square.svg +15 -0
- package/src/grapher/captionedChart/assets/buildcanada-logo.svg +15 -0
- package/src/grapher/captionedChart/assets/canadaspends.svg +7 -0
- package/src/grapher/captionedChart/readme.md +14 -0
- package/src/grapher/chart/Chart.tsx +62 -0
- package/src/grapher/chart/ChartAreaContent.tsx +172 -0
- package/src/grapher/chart/ChartDimension.ts +121 -0
- package/src/grapher/chart/ChartInterface.ts +83 -0
- package/src/grapher/chart/ChartManager.ts +113 -0
- package/src/grapher/chart/ChartTabs.ts +178 -0
- package/src/grapher/chart/ChartTypeMap.tsx +158 -0
- package/src/grapher/chart/ChartTypeSwitcher.tsx +26 -0
- package/src/grapher/chart/ChartUtils.tsx +364 -0
- package/src/grapher/chart/DimensionSlot.ts +45 -0
- package/src/grapher/chart/StaticChartWrapper.tsx +94 -0
- package/src/grapher/chart/guidedChartUtils.ts +82 -0
- package/src/grapher/color/BinningStrategies.ts +484 -0
- package/src/grapher/color/BinningStrategyEqualSizeBins.ts +132 -0
- package/src/grapher/color/BinningStrategyLogarithmic.ts +121 -0
- package/src/grapher/color/CategoricalColorAssigner.ts +97 -0
- package/src/grapher/color/ColorBrewerSchemes.ts +80 -0
- package/src/grapher/color/ColorConstants.ts +20 -0
- package/src/grapher/color/ColorScale.ts +339 -0
- package/src/grapher/color/ColorScaleBin.ts +147 -0
- package/src/grapher/color/ColorScaleConfig.ts +204 -0
- package/src/grapher/color/ColorScheme.ts +137 -0
- package/src/grapher/color/ColorSchemes.ts +149 -0
- package/src/grapher/color/ColorUtils.ts +86 -0
- package/src/grapher/color/CustomSchemes.ts +1772 -0
- package/src/grapher/color/readme.md +84 -0
- package/src/grapher/comparisonLine/ComparisonLine.tsx +31 -0
- package/src/grapher/comparisonLine/ComparisonLineConstants.ts +11 -0
- package/src/grapher/comparisonLine/ComparisonLineGenerator.ts +60 -0
- package/src/grapher/comparisonLine/ComparisonLineHelpers.ts +10 -0
- package/src/grapher/comparisonLine/CustomComparisonLine.tsx +159 -0
- package/src/grapher/comparisonLine/VerticalComparisonLine.tsx +208 -0
- package/src/grapher/controls/ActionButtons.scss +97 -0
- package/src/grapher/controls/ActionButtons.tsx +453 -0
- package/src/grapher/controls/CommandPalette.scss +50 -0
- package/src/grapher/controls/CommandPalette.tsx +74 -0
- package/src/grapher/controls/ContentSwitchers.scss +93 -0
- package/src/grapher/controls/ContentSwitchers.tsx +238 -0
- package/src/grapher/controls/Controls.scss +158 -0
- package/src/grapher/controls/DataTableFilterDropdown.scss +7 -0
- package/src/grapher/controls/DataTableFilterDropdown.tsx +168 -0
- package/src/grapher/controls/DataTableSearchField.scss +3 -0
- package/src/grapher/controls/DataTableSearchField.tsx +76 -0
- package/src/grapher/controls/Dropdown.scss +252 -0
- package/src/grapher/controls/Dropdown.tsx +235 -0
- package/src/grapher/controls/EntitySelectionToggle.tsx +135 -0
- package/src/grapher/controls/MapRegionDropdown.scss +3 -0
- package/src/grapher/controls/MapRegionDropdown.tsx +104 -0
- package/src/grapher/controls/MapResetButton.tsx +115 -0
- package/src/grapher/controls/MapZoomDropdown.scss +9 -0
- package/src/grapher/controls/MapZoomDropdown.tsx +270 -0
- package/src/grapher/controls/MapZoomToSelectionButton.tsx +87 -0
- package/src/grapher/controls/SearchField.scss +78 -0
- package/src/grapher/controls/SearchField.tsx +63 -0
- package/src/grapher/controls/SettingsMenu.scss +191 -0
- package/src/grapher/controls/SettingsMenu.tsx +399 -0
- package/src/grapher/controls/ShareMenu.scss +58 -0
- package/src/grapher/controls/ShareMenu.tsx +304 -0
- package/src/grapher/controls/SortIcon.tsx +39 -0
- package/src/grapher/controls/VerticalScrollContainer.tsx +263 -0
- package/src/grapher/controls/controlsRow/ControlsRow.tsx +168 -0
- package/src/grapher/controls/dropdown-icons.scss +4 -0
- package/src/grapher/controls/entityPicker/EntityPicker.scss +255 -0
- package/src/grapher/controls/entityPicker/EntityPicker.tsx +816 -0
- package/src/grapher/controls/entityPicker/EntityPickerConstants.ts +23 -0
- package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.scss +129 -0
- package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.tsx +463 -0
- package/src/grapher/controls/globalEntitySelector/GlobalEntitySelectorConstants.ts +3 -0
- package/src/grapher/controls/globalEntitySelector/readme.md +17 -0
- package/src/grapher/controls/settings/AbsRelToggle.tsx +64 -0
- package/src/grapher/controls/settings/AxisScaleToggle.tsx +53 -0
- package/src/grapher/controls/settings/FacetStrategySelector.tsx +110 -0
- package/src/grapher/controls/settings/FacetYDomainToggle.tsx +51 -0
- package/src/grapher/controls/settings/NoDataAreaToggle.tsx +38 -0
- package/src/grapher/controls/settings/ZoomToggle.tsx +36 -0
- package/src/grapher/core/EntitiesByRegionType.ts +174 -0
- package/src/grapher/core/EntityCodes.ts +19 -0
- package/src/grapher/core/EntityUrlBuilder.ts +200 -0
- package/src/grapher/core/FetchingGrapher.tsx +156 -0
- package/src/grapher/core/Grapher.tsx +760 -0
- package/src/grapher/core/GrapherAnalytics.ts +229 -0
- package/src/grapher/core/GrapherConstants.ts +173 -0
- package/src/grapher/core/GrapherState.tsx +3659 -0
- package/src/grapher/core/GrapherUrl.ts +184 -0
- package/src/grapher/core/GrapherUrlMigrations.ts +29 -0
- package/src/grapher/core/GrapherUseHelpers.tsx +147 -0
- package/src/grapher/core/LegacyToOwidTable.ts +841 -0
- package/src/grapher/core/grapher.entry.ts +5 -0
- package/src/grapher/core/grapher.scss +257 -0
- package/src/grapher/core/loadGrapherTableHelpers.ts +116 -0
- package/src/grapher/core/loadVariable.ts +104 -0
- package/src/grapher/core/relatedQuestion.ts +12 -0
- package/src/grapher/core/typography.scss +206 -0
- package/src/grapher/dataTable/DataTable.sample.ts +206 -0
- package/src/grapher/dataTable/DataTable.scss +249 -0
- package/src/grapher/dataTable/DataTable.tsx +1332 -0
- package/src/grapher/dataTable/DataTableConstants.ts +186 -0
- package/src/grapher/entitySelector/EntitySelector.scss +255 -0
- package/src/grapher/entitySelector/EntitySelector.tsx +1838 -0
- package/src/grapher/facet/FacetChart.tsx +943 -0
- package/src/grapher/facet/FacetChartConstants.ts +24 -0
- package/src/grapher/facet/FacetChartUtils.ts +51 -0
- package/src/grapher/facet/FacetMap.tsx +604 -0
- package/src/grapher/facet/FacetMapConstants.ts +23 -0
- package/src/grapher/facet/readme.md +13 -0
- package/src/grapher/focus/FocusArray.ts +79 -0
- package/src/grapher/footer/Footer.scss +63 -0
- package/src/grapher/footer/Footer.tsx +809 -0
- package/src/grapher/footer/FooterManager.ts +44 -0
- package/src/grapher/fullScreen/FullScreen.scss +11 -0
- package/src/grapher/fullScreen/FullScreen.tsx +61 -0
- package/src/grapher/header/Header.scss +35 -0
- package/src/grapher/header/Header.tsx +372 -0
- package/src/grapher/header/HeaderManager.ts +28 -0
- package/src/grapher/index.ts +157 -0
- package/src/grapher/interaction/InteractionState.ts +60 -0
- package/src/grapher/legend/HorizontalColorLegends.tsx +923 -0
- package/src/grapher/legend/LegendInteractionState.ts +40 -0
- package/src/grapher/legend/VerticalColorLegend.tsx +295 -0
- package/src/grapher/lineCharts/LineChart.tsx +968 -0
- package/src/grapher/lineCharts/LineChartConstants.ts +89 -0
- package/src/grapher/lineCharts/LineChartHelpers.ts +184 -0
- package/src/grapher/lineCharts/LineChartState.ts +394 -0
- package/src/grapher/lineCharts/LineChartThumbnail.tsx +437 -0
- package/src/grapher/lineCharts/Lines.tsx +258 -0
- package/src/grapher/lineLegend/LineLegend.tsx +723 -0
- package/src/grapher/lineLegend/LineLegendConstants.ts +9 -0
- package/src/grapher/lineLegend/LineLegendFilterAlgorithms.ts +143 -0
- package/src/grapher/lineLegend/LineLegendHelpers.ts +253 -0
- package/src/grapher/lineLegend/LineLegendTypes.ts +32 -0
- package/src/grapher/mapCharts/CanadaTopology.ts +17922 -0
- package/src/grapher/mapCharts/ChoroplethGlobe.tsx +949 -0
- package/src/grapher/mapCharts/ChoroplethMap.tsx +662 -0
- package/src/grapher/mapCharts/GeoFeatures.ts +184 -0
- package/src/grapher/mapCharts/GlobeController.ts +496 -0
- package/src/grapher/mapCharts/MapAnnotationPlacements.json +1040 -0
- package/src/grapher/mapCharts/MapAnnotationPlacements.ts +31 -0
- package/src/grapher/mapCharts/MapAnnotations.ts +723 -0
- package/src/grapher/mapCharts/MapChart.sample.ts +59 -0
- package/src/grapher/mapCharts/MapChart.scss +5 -0
- package/src/grapher/mapCharts/MapChart.tsx +720 -0
- package/src/grapher/mapCharts/MapChartConstants.ts +260 -0
- package/src/grapher/mapCharts/MapChartState.ts +416 -0
- package/src/grapher/mapCharts/MapChartThumbnail.tsx +25 -0
- package/src/grapher/mapCharts/MapComponents.tsx +338 -0
- package/src/grapher/mapCharts/MapConfig.ts +156 -0
- package/src/grapher/mapCharts/MapHelpers.ts +181 -0
- package/src/grapher/mapCharts/MapProjections.ts +49 -0
- package/src/grapher/mapCharts/MapSparkline.tsx +257 -0
- package/src/grapher/mapCharts/MapTooltip.scss +49 -0
- package/src/grapher/mapCharts/MapTooltip.tsx +409 -0
- package/src/grapher/mapCharts/MapTopology.ts +1766 -0
- package/src/grapher/mapCharts/d3-bboxCollide.js +204 -0
- package/src/grapher/mapCharts/d3-geo-projection.ts +198 -0
- package/src/grapher/modal/DownloadIcons.tsx +39 -0
- package/src/grapher/modal/DownloadModal.scss +300 -0
- package/src/grapher/modal/DownloadModal.tsx +1226 -0
- package/src/grapher/modal/EmbedModal.scss +40 -0
- package/src/grapher/modal/EmbedModal.tsx +160 -0
- package/src/grapher/modal/EntitySelectorModal.tsx +59 -0
- package/src/grapher/modal/Modal.scss +31 -0
- package/src/grapher/modal/Modal.tsx +90 -0
- package/src/grapher/modal/ModalHeader.scss +12 -0
- package/src/grapher/modal/ModalHeader.tsx +16 -0
- package/src/grapher/modal/SourcesDescriptions.scss +87 -0
- package/src/grapher/modal/SourcesDescriptions.tsx +89 -0
- package/src/grapher/modal/SourcesKeyDataTable.scss +49 -0
- package/src/grapher/modal/SourcesKeyDataTable.tsx +87 -0
- package/src/grapher/modal/SourcesModal.scss +301 -0
- package/src/grapher/modal/SourcesModal.tsx +568 -0
- package/src/grapher/noDataModal/NoDataModal.tsx +125 -0
- package/src/grapher/scatterCharts/ConnectedScatterLegend.tsx +143 -0
- package/src/grapher/scatterCharts/MultiColorPolyline.tsx +129 -0
- package/src/grapher/scatterCharts/NoDataSection.scss +14 -0
- package/src/grapher/scatterCharts/NoDataSection.tsx +56 -0
- package/src/grapher/scatterCharts/ScatterPlotChart.tsx +792 -0
- package/src/grapher/scatterCharts/ScatterPlotChartConstants.ts +157 -0
- package/src/grapher/scatterCharts/ScatterPlotChartState.ts +678 -0
- package/src/grapher/scatterCharts/ScatterPlotChartThumbnail.tsx +155 -0
- package/src/grapher/scatterCharts/ScatterPlotTooltip.tsx +560 -0
- package/src/grapher/scatterCharts/ScatterPoints.tsx +153 -0
- package/src/grapher/scatterCharts/ScatterPointsWithLabels.tsx +708 -0
- package/src/grapher/scatterCharts/ScatterSizeLegend.tsx +327 -0
- package/src/grapher/scatterCharts/ScatterUtils.ts +265 -0
- package/src/grapher/scatterCharts/Triangle.tsx +41 -0
- package/src/grapher/schema/README.md +33 -0
- package/src/grapher/schema/defaultGrapherConfig.ts +100 -0
- package/src/grapher/schema/grapher-schema.009.yaml +781 -0
- package/src/grapher/schema/migrations/helpers.ts +58 -0
- package/src/grapher/schema/migrations/migrate.ts +75 -0
- package/src/grapher/schema/migrations/migrations.ts +158 -0
- package/src/grapher/selection/MapSelectionArray.ts +99 -0
- package/src/grapher/selection/SelectionArray.ts +71 -0
- package/src/grapher/selection/readme.md +16 -0
- package/src/grapher/sidePanel/SidePanel.scss +10 -0
- package/src/grapher/sidePanel/SidePanel.tsx +23 -0
- package/src/grapher/slideInDrawer/SlideInDrawer.scss +57 -0
- package/src/grapher/slideInDrawer/SlideInDrawer.tsx +125 -0
- package/src/grapher/slideshowController/SlideShowController.tsx +43 -0
- package/src/grapher/slideshowController/readme.md +7 -0
- package/src/grapher/slopeCharts/MarkX.tsx +45 -0
- package/src/grapher/slopeCharts/Slope.tsx +102 -0
- package/src/grapher/slopeCharts/SlopeChart.tsx +1152 -0
- package/src/grapher/slopeCharts/SlopeChartConstants.ts +33 -0
- package/src/grapher/slopeCharts/SlopeChartHelpers.ts +73 -0
- package/src/grapher/slopeCharts/SlopeChartState.ts +392 -0
- package/src/grapher/slopeCharts/SlopeChartThumbnail.tsx +368 -0
- package/src/grapher/stackedCharts/AbstractStackedChartState.ts +370 -0
- package/src/grapher/stackedCharts/MarimekkoBars.tsx +190 -0
- package/src/grapher/stackedCharts/MarimekkoBarsForOneEntity.tsx +168 -0
- package/src/grapher/stackedCharts/MarimekkoChart.tsx +1144 -0
- package/src/grapher/stackedCharts/MarimekkoChartConstants.ts +112 -0
- package/src/grapher/stackedCharts/MarimekkoChartHelpers.ts +21 -0
- package/src/grapher/stackedCharts/MarimekkoChartState.ts +465 -0
- package/src/grapher/stackedCharts/MarimekkoChartThumbnail.tsx +168 -0
- package/src/grapher/stackedCharts/MarimekkoInternalLabels.tsx +124 -0
- package/src/grapher/stackedCharts/StackedAreaChart.tsx +678 -0
- package/src/grapher/stackedCharts/StackedAreaChartState.ts +34 -0
- package/src/grapher/stackedCharts/StackedAreaChartThumbnail.tsx +215 -0
- package/src/grapher/stackedCharts/StackedAreas.tsx +223 -0
- package/src/grapher/stackedCharts/StackedBarChart.tsx +619 -0
- package/src/grapher/stackedCharts/StackedBarChartState.ts +80 -0
- package/src/grapher/stackedCharts/StackedBarChartThumbnail.tsx +220 -0
- package/src/grapher/stackedCharts/StackedBarSegment.tsx +87 -0
- package/src/grapher/stackedCharts/StackedBars.tsx +102 -0
- package/src/grapher/stackedCharts/StackedConstants.ts +109 -0
- package/src/grapher/stackedCharts/StackedDiscreteBarChart.tsx +270 -0
- package/src/grapher/stackedCharts/StackedDiscreteBarChartState.ts +296 -0
- package/src/grapher/stackedCharts/StackedDiscreteBarChartThumbnail.tsx +27 -0
- package/src/grapher/stackedCharts/StackedDiscreteBars.tsx +648 -0
- package/src/grapher/stackedCharts/StackedUtils.ts +142 -0
- package/src/grapher/tabs/Tabs.scss +169 -0
- package/src/grapher/tabs/Tabs.tsx +54 -0
- package/src/grapher/tabs/TabsWithDropdown.scss +62 -0
- package/src/grapher/tabs/TabsWithDropdown.tsx +114 -0
- package/src/grapher/testData/OwidTestData.sample.ts +273 -0
- package/src/grapher/testData/OwidTestData.ts +64 -0
- package/src/grapher/timeline/TimelineComponent.scss +139 -0
- package/src/grapher/timeline/TimelineComponent.tsx +658 -0
- package/src/grapher/timeline/TimelineController.ts +368 -0
- package/src/grapher/timeline/readme.md +7 -0
- package/src/grapher/tooltip/Tooltip.scss +510 -0
- package/src/grapher/tooltip/Tooltip.tsx +294 -0
- package/src/grapher/tooltip/TooltipContents.tsx +383 -0
- package/src/grapher/tooltip/TooltipProps.ts +123 -0
- package/src/grapher/tooltip/TooltipState.ts +81 -0
- package/src/grapher/verticalLabels/VerticalLabels.tsx +31 -0
- package/src/grapher/verticalLabels/VerticalLabelsState.ts +154 -0
- package/src/index.ts +226 -0
- package/src/styles/charts.scss +15 -0
- package/src/types/NominalType.ts +30 -0
- package/src/types/OwidOrigin.ts +18 -0
- package/src/types/OwidSource.ts +9 -0
- package/src/types/OwidVariable.ts +133 -0
- package/src/types/OwidVariableDisplayConfigInterface.ts +49 -0
- package/src/types/analyticsTypes.ts +54 -0
- package/src/types/dbTypes/Tags.ts +11 -0
- package/src/types/domainTypes/Archive.ts +139 -0
- package/src/types/domainTypes/Author.ts +28 -0
- package/src/types/domainTypes/ContentGraph.ts +76 -0
- package/src/types/domainTypes/CoreTableTypes.ts +305 -0
- package/src/types/domainTypes/DeployStatus.ts +23 -0
- package/src/types/domainTypes/Layout.ts +34 -0
- package/src/types/domainTypes/Posts.ts +34 -0
- package/src/types/domainTypes/Search.ts +299 -0
- package/src/types/domainTypes/Site.ts +8 -0
- package/src/types/domainTypes/StaticViz.ts +64 -0
- package/src/types/domainTypes/Toc.ts +11 -0
- package/src/types/domainTypes/Tombstone.ts +19 -0
- package/src/types/domainTypes/Various.ts +79 -0
- package/src/types/gdocTypes/Gdoc.ts +280 -0
- package/src/types/grapherTypes/BinningStrategyTypes.ts +46 -0
- package/src/types/grapherTypes/GrapherConstants.ts +53 -0
- package/src/types/grapherTypes/GrapherTypes.ts +743 -0
- package/src/types/index.ts +316 -0
- package/src/types/wordpressTypes/WordpressTypes.ts +9 -0
- package/src/utils/Bounds.ts +439 -0
- package/src/utils/BrowserUtils.ts +12 -0
- package/src/utils/FuzzySearch.ts +74 -0
- package/src/utils/MultiDimDataPageConfig.ts +31 -0
- package/src/utils/OwidVariable.ts +82 -0
- package/src/utils/PointVector.ts +97 -0
- package/src/utils/PromiseCache.ts +36 -0
- package/src/utils/PromiseSwitcher.ts +52 -0
- package/src/utils/TimeBounds.ts +130 -0
- package/src/utils/Tippy.tsx +57 -0
- package/src/utils/Util.ts +2369 -0
- package/src/utils/archival/archivalDate.ts +48 -0
- package/src/utils/dayjs.ts +32 -0
- package/src/utils/formatValue.ts +242 -0
- package/src/utils/grapherConfigUtils.ts +81 -0
- package/src/utils/image.ts +225 -0
- package/src/utils/index.ts +318 -0
- package/src/utils/isPresent.ts +5 -0
- package/src/utils/metadataHelpers.ts +329 -0
- package/src/utils/persistable/Persistable.ts +82 -0
- package/src/utils/persistable/readme.md +50 -0
- package/src/utils/regions.json +5635 -0
- package/src/utils/regions.ts +463 -0
- package/src/utils/serializers.ts +16 -0
- package/src/utils/string.ts +42 -0
- package/src/utils/urls/Url.ts +195 -0
- package/src/utils/urls/UrlMigration.ts +10 -0
- package/src/utils/urls/UrlUtils.ts +54 -0
- package/src/utils/urls/readme.md +90 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { ChartManager } from "../chart/ChartManager"
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Color,
|
|
5
|
+
SortConfig,
|
|
6
|
+
Time,
|
|
7
|
+
Bounds,
|
|
8
|
+
EntityName,
|
|
9
|
+
ColumnSlug,
|
|
10
|
+
} from "../../utils/index.js"
|
|
11
|
+
import { OwidTable } from "../../core-table/index.js"
|
|
12
|
+
import { StackedPoint } from "./StackedConstants"
|
|
13
|
+
import { DualAxis } from "../axis/Axis"
|
|
14
|
+
import { InteractionState } from "../interaction/InteractionState.js"
|
|
15
|
+
|
|
16
|
+
export interface MarimekkoChartManager extends ChartManager {
|
|
17
|
+
endTime?: Time
|
|
18
|
+
matchingEntitiesOnly?: boolean
|
|
19
|
+
xOverrideTime?: number
|
|
20
|
+
tableAfterAuthorTimelineAndActiveChartTransform?: OwidTable
|
|
21
|
+
sortConfig?: SortConfig
|
|
22
|
+
hideNoDataArea?: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface EntityColorData {
|
|
26
|
+
color: Color
|
|
27
|
+
colorDomainValue: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Points used on the X axis
|
|
31
|
+
export interface SimplePoint {
|
|
32
|
+
value: number
|
|
33
|
+
entity: string
|
|
34
|
+
time: number
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface SimpleChartSeries {
|
|
38
|
+
seriesName: string
|
|
39
|
+
points: SimplePoint[]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export enum BarShape {
|
|
43
|
+
Bar,
|
|
44
|
+
BarPlaceholder,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface Bar {
|
|
48
|
+
kind: BarShape.Bar
|
|
49
|
+
color: Color // color from the variable
|
|
50
|
+
seriesName: string
|
|
51
|
+
yPoint: StackedPoint<EntityName>
|
|
52
|
+
columnSlug?: ColumnSlug
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface BarPlaceholder {
|
|
56
|
+
kind: BarShape.BarPlaceholder
|
|
57
|
+
seriesName: string
|
|
58
|
+
height: number
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type BarOrPlaceholder = Bar | BarPlaceholder
|
|
62
|
+
|
|
63
|
+
export interface Item {
|
|
64
|
+
entityName: string
|
|
65
|
+
shortEntityName?: string
|
|
66
|
+
entityColor: EntityColorData | undefined
|
|
67
|
+
bars: Bar[] // contains the y values for every y variable
|
|
68
|
+
xPoint: SimplePoint | undefined // contains the single x value
|
|
69
|
+
focus: InteractionState
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface PlacedItem extends Item {
|
|
73
|
+
xPosition: number // x value (in pixel space) when placed in final sorted order and including shifts due to one pixel entity minimum
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface EntityWithSize {
|
|
77
|
+
entityName: string
|
|
78
|
+
shortEntityName?: string
|
|
79
|
+
xValue: number
|
|
80
|
+
ySortValue: number | undefined
|
|
81
|
+
}
|
|
82
|
+
export interface LabelCandidate {
|
|
83
|
+
item: EntityWithSize
|
|
84
|
+
label: string
|
|
85
|
+
bounds: Bounds
|
|
86
|
+
isPicked: boolean
|
|
87
|
+
isSelected: boolean
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface LabelWithPlacement {
|
|
91
|
+
label: React.ReactElement
|
|
92
|
+
preferredPlacement: number
|
|
93
|
+
correctedPlacement: number
|
|
94
|
+
labelKey: string
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface LabelCandidateWithElement {
|
|
98
|
+
candidate: LabelCandidate
|
|
99
|
+
labelElement: React.ReactElement
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface MarimekkoBarProps {
|
|
103
|
+
bar: BarOrPlaceholder
|
|
104
|
+
barWidth: number
|
|
105
|
+
isHovered: boolean
|
|
106
|
+
isSelected: boolean
|
|
107
|
+
isFaint: boolean
|
|
108
|
+
focus: InteractionState
|
|
109
|
+
entityColor: string | undefined
|
|
110
|
+
y0: number
|
|
111
|
+
dualAxis: DualAxis
|
|
112
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DualAxis } from "../axis/Axis"
|
|
2
|
+
import { PlacedItem } from "./MarimekkoChartConstants"
|
|
3
|
+
import { MarimekkoChartState } from "./MarimekkoChartState"
|
|
4
|
+
|
|
5
|
+
export function toPlacedMarimekkoItems(
|
|
6
|
+
chartState: MarimekkoChartState,
|
|
7
|
+
{ dualAxis }: { dualAxis: DualAxis }
|
|
8
|
+
): PlacedItem[] {
|
|
9
|
+
const { x0, sortedItems } = chartState
|
|
10
|
+
const placedItems: PlacedItem[] = []
|
|
11
|
+
let currentX = 0
|
|
12
|
+
for (const item of sortedItems) {
|
|
13
|
+
placedItems.push({ ...item, xPosition: currentX })
|
|
14
|
+
const xValue = item.xPoint?.value ?? 1 // one is the default here because if no x dim is given we make all bars the same width
|
|
15
|
+
const preciseX =
|
|
16
|
+
dualAxis.horizontalAxis.place(xValue) -
|
|
17
|
+
dualAxis.horizontalAxis.place(x0)
|
|
18
|
+
currentX += preciseX
|
|
19
|
+
}
|
|
20
|
+
return placedItems
|
|
21
|
+
}
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import * as _ from "lodash-es"
|
|
2
|
+
import * as R from "remeda"
|
|
3
|
+
import { computed, makeObservable } from "mobx"
|
|
4
|
+
import { ChartState } from "../chart/ChartInterface"
|
|
5
|
+
import { ColorScale, ColorScaleManager } from "../color/ColorScale"
|
|
6
|
+
import {
|
|
7
|
+
Bar,
|
|
8
|
+
BarShape,
|
|
9
|
+
EntityColorData,
|
|
10
|
+
Item,
|
|
11
|
+
MarimekkoChartManager,
|
|
12
|
+
SimpleChartSeries,
|
|
13
|
+
SimplePoint,
|
|
14
|
+
} from "./MarimekkoChartConstants"
|
|
15
|
+
import { CoreColumn, OwidTable } from "../../core-table/index.js"
|
|
16
|
+
import {
|
|
17
|
+
autoDetectYColumnSlugs,
|
|
18
|
+
getShortNameForEntity,
|
|
19
|
+
makeSelectionArray,
|
|
20
|
+
} from "../chart/ChartUtils"
|
|
21
|
+
import { ColorScaleConfig } from "../color/ColorScaleConfig"
|
|
22
|
+
import {
|
|
23
|
+
ChartErrorInfo,
|
|
24
|
+
ColorSchemeName,
|
|
25
|
+
EntityName,
|
|
26
|
+
ColorScaleConfigInterface,
|
|
27
|
+
OwidVariableRow,
|
|
28
|
+
SortConfig,
|
|
29
|
+
SortBy,
|
|
30
|
+
SortOrder,
|
|
31
|
+
ScaleType,
|
|
32
|
+
} from "../../types/index.js"
|
|
33
|
+
import { OWID_NO_DATA_GRAY } from "../color/ColorConstants"
|
|
34
|
+
import { StackedPoint, StackedSeries } from "./StackedConstants"
|
|
35
|
+
import { ColorScheme } from "../color/ColorScheme"
|
|
36
|
+
import { ColorSchemes } from "../color/ColorSchemes"
|
|
37
|
+
import { excludeUndefined } from "../../utils/index.js"
|
|
38
|
+
import { SelectionArray } from "../selection/SelectionArray"
|
|
39
|
+
import { FocusArray } from "../focus/FocusArray"
|
|
40
|
+
import { AxisConfig } from "../axis/AxisConfig.js"
|
|
41
|
+
import { HorizontalAxis, VerticalAxis } from "../axis/Axis.js"
|
|
42
|
+
|
|
43
|
+
export class MarimekkoChartState implements ChartState, ColorScaleManager {
|
|
44
|
+
manager: MarimekkoChartManager
|
|
45
|
+
|
|
46
|
+
colorScale: ColorScale
|
|
47
|
+
defaultBaseColorScheme = ColorSchemeName.continents
|
|
48
|
+
defaultNoDataColor = OWID_NO_DATA_GRAY
|
|
49
|
+
|
|
50
|
+
constructor({ manager }: { manager: MarimekkoChartManager }) {
|
|
51
|
+
this.manager = manager
|
|
52
|
+
this.colorScale = manager.colorScaleOverride ?? new ColorScale(this)
|
|
53
|
+
makeObservable(this)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@computed get inputTable(): OwidTable {
|
|
57
|
+
return this.manager.table
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@computed get transformedTable(): OwidTable {
|
|
61
|
+
const { inputTable } = this
|
|
62
|
+
return this.manager.transformedTable ?? this.transformTable(inputTable)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
transformTable(table: OwidTable): OwidTable {
|
|
66
|
+
const { yColumnSlugs, manager, colorColumnSlug, xColumnSlug } = this
|
|
67
|
+
if (!this.yColumnSlugs.length) return table
|
|
68
|
+
|
|
69
|
+
// TODO: remove this filter once we don't have mixed type columns in datasets
|
|
70
|
+
table = table.replaceNonNumericCellsWithErrorValues(yColumnSlugs)
|
|
71
|
+
|
|
72
|
+
yColumnSlugs.forEach((slug) => {
|
|
73
|
+
table = table.interpolateColumnWithTolerance(slug)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
if (xColumnSlug)
|
|
77
|
+
table = table.interpolateColumnWithTolerance(xColumnSlug)
|
|
78
|
+
|
|
79
|
+
if (colorColumnSlug && manager.matchingEntitiesOnly)
|
|
80
|
+
table = table.dropRowsWithErrorValuesForColumn(colorColumnSlug)
|
|
81
|
+
|
|
82
|
+
if (!manager.showNoDataArea)
|
|
83
|
+
table = table.dropRowsWithErrorValuesForAllColumns(yColumnSlugs)
|
|
84
|
+
|
|
85
|
+
if (xColumnSlug)
|
|
86
|
+
table = table.dropRowsWithErrorValuesForColumn(xColumnSlug)
|
|
87
|
+
if (manager.isRelativeMode) {
|
|
88
|
+
// TODO: this should not be necessary but we sometimes get NoMatchingValuesAfterJoin if both relative and showNoDataArea are set
|
|
89
|
+
table = table.dropRowsWithErrorValuesForColumn(
|
|
90
|
+
table.timeColumn.slug
|
|
91
|
+
)
|
|
92
|
+
if (xColumnSlug) {
|
|
93
|
+
table = table.toPercentageFromEachEntityForEachTime(xColumnSlug)
|
|
94
|
+
|
|
95
|
+
// relativized columns ditch their units, making "Population %" hard to parse. Add a sensible replacement
|
|
96
|
+
Object.assign(table.get(xColumnSlug)?.def, {
|
|
97
|
+
unit: "share of total",
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return table
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@computed get selectionArray(): SelectionArray {
|
|
106
|
+
return makeSelectionArray(this.manager.selection)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@computed get focusArray(): FocusArray {
|
|
110
|
+
return this.manager.focusArray ?? new FocusArray()
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@computed get isFocusModeActive(): boolean {
|
|
114
|
+
return this.focusArray.hasFocusedSeries
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@computed get yColumnSlugs(): string[] {
|
|
118
|
+
return this.manager.yColumnSlugs ?? autoDetectYColumnSlugs(this.manager)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@computed get yColumns(): CoreColumn[] {
|
|
122
|
+
return this.transformedTable.getColumns(this.yColumnSlugs)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@computed get formatColumn(): CoreColumn {
|
|
126
|
+
return this.yColumns[0]
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@computed get xColumnSlug(): string | undefined {
|
|
130
|
+
return this.manager.xColumnSlug
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@computed get xColumn(): CoreColumn | undefined {
|
|
134
|
+
if (this.xColumnSlug === undefined) return undefined
|
|
135
|
+
const columnSlugs = this.xColumnSlug ? [this.xColumnSlug] : []
|
|
136
|
+
return this.transformedTable.getColumns(columnSlugs)[0]
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@computed get colorColumnSlug(): string | undefined {
|
|
140
|
+
// Marimekko charts only support categorical variables as color dimension
|
|
141
|
+
return this.manager.categoricalColorColumnSlug
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@computed get colorColumn(): CoreColumn {
|
|
145
|
+
return this.transformedTable.get(this.colorColumnSlug)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@computed get colorScaleConfig(): ColorScaleConfigInterface | undefined {
|
|
149
|
+
return (
|
|
150
|
+
ColorScaleConfig.fromDSL(this.colorColumn.def) ??
|
|
151
|
+
this.manager.colorScale
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@computed get colorScaleColumn(): CoreColumn {
|
|
156
|
+
const { manager, inputTable } = this
|
|
157
|
+
return (
|
|
158
|
+
// For faceted charts, we have to get the values of inputTable before it's filtered by
|
|
159
|
+
// the faceting logic.
|
|
160
|
+
manager.colorScaleColumnOverride ??
|
|
161
|
+
// We need to use filteredTable in order to get consistent coloring for a variable across
|
|
162
|
+
// charts, e.g. each continent being assigned to the same color.
|
|
163
|
+
// inputTable is unfiltered, so it contains every value that exists in the variable.
|
|
164
|
+
|
|
165
|
+
// 2022-05-25: I considered using the filtered table below to get rid of Antarctica automatically
|
|
166
|
+
// but the way things are currently done this leads to a shift in the colors assigned to continents
|
|
167
|
+
// (i.e. they are no longer consistent cross the site). I think this downside is heavier than the
|
|
168
|
+
// upside so I comment this out for now. Reconsider when we do colors differently.
|
|
169
|
+
|
|
170
|
+
// manager.tableAfterAuthorTimelineAndActiveChartTransform?.get(
|
|
171
|
+
// this.colorColumnSlug
|
|
172
|
+
// ) ??
|
|
173
|
+
inputTable.get(this.colorColumnSlug)
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@computed private get colorScheme(): ColorScheme {
|
|
178
|
+
return (
|
|
179
|
+
(this.manager.baseColorScheme
|
|
180
|
+
? ColorSchemes.get(this.manager.baseColorScheme)
|
|
181
|
+
: undefined) ??
|
|
182
|
+
ColorSchemes.get(ColorSchemeName["owid-distinct"])
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@computed private get sortConfig(): SortConfig {
|
|
187
|
+
return this.manager.sortConfig ?? {}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
@computed private get unstackedSeries(): StackedSeries<EntityName>[] {
|
|
191
|
+
const { colorScheme, yColumns } = this
|
|
192
|
+
return (
|
|
193
|
+
yColumns
|
|
194
|
+
.map((col, i) => {
|
|
195
|
+
return {
|
|
196
|
+
seriesName: col.displayName,
|
|
197
|
+
columnSlug: col.slug,
|
|
198
|
+
color:
|
|
199
|
+
col.def.color ??
|
|
200
|
+
colorScheme.getColors(yColumns.length)[i],
|
|
201
|
+
points: col.owidRows.map((row) => ({
|
|
202
|
+
time: row.originalTime,
|
|
203
|
+
position: row.entityName,
|
|
204
|
+
value: row.value,
|
|
205
|
+
valueOffset: 0,
|
|
206
|
+
})),
|
|
207
|
+
}
|
|
208
|
+
})
|
|
209
|
+
// Do not plot columns without data
|
|
210
|
+
.filter((series) => series.points.length > 0)
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@computed get series(): readonly StackedSeries<EntityName>[] {
|
|
215
|
+
const valueOffsets = new Map<string, number>()
|
|
216
|
+
return this.unstackedSeries.map((series) => ({
|
|
217
|
+
...series,
|
|
218
|
+
points: series.points.map((point) => {
|
|
219
|
+
const offset = valueOffsets.get(point.position) ?? 0
|
|
220
|
+
const newPoint = { ...point, valueOffset: offset }
|
|
221
|
+
valueOffsets.set(point.position, offset + point.value)
|
|
222
|
+
return newPoint
|
|
223
|
+
}),
|
|
224
|
+
}))
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@computed private get allPoints(): StackedPoint<EntityName>[] {
|
|
228
|
+
return this.series.flatMap((series) => series.points)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@computed get x0(): number {
|
|
232
|
+
return 0
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
@computed get y0(): number {
|
|
236
|
+
return 0
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@computed get xSeries(): SimpleChartSeries | undefined {
|
|
240
|
+
const createStackedXPoints = (
|
|
241
|
+
rows: OwidVariableRow<any>[]
|
|
242
|
+
): SimplePoint[] => {
|
|
243
|
+
const points: SimplePoint[] = []
|
|
244
|
+
for (const row of rows) {
|
|
245
|
+
points.push({
|
|
246
|
+
time: row.originalTime,
|
|
247
|
+
value: row.value,
|
|
248
|
+
entity: row.entityName,
|
|
249
|
+
})
|
|
250
|
+
}
|
|
251
|
+
return points
|
|
252
|
+
}
|
|
253
|
+
if (this.xColumn === undefined) return undefined
|
|
254
|
+
const column = this.xColumn
|
|
255
|
+
return {
|
|
256
|
+
seriesName: column.displayName,
|
|
257
|
+
points: createStackedXPoints(column.owidRows),
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
@computed get domainColorForEntityMap(): Map<string, EntityColorData> {
|
|
262
|
+
const { colorColumn, colorScale, uniqueEntityNames } = this
|
|
263
|
+
const hasColorColumn = !colorColumn.isMissing
|
|
264
|
+
const colorRowsByEntity = hasColorColumn
|
|
265
|
+
? colorColumn.owidRowsByEntityName
|
|
266
|
+
: undefined
|
|
267
|
+
const domainColorMap = new Map<string, EntityColorData>()
|
|
268
|
+
if (uniqueEntityNames !== undefined) {
|
|
269
|
+
for (const name of uniqueEntityNames) {
|
|
270
|
+
const colorDomainValue = colorRowsByEntity?.get(name)?.[0]
|
|
271
|
+
|
|
272
|
+
if (colorDomainValue) {
|
|
273
|
+
const color = colorScale.getColor(colorDomainValue.value)
|
|
274
|
+
if (color)
|
|
275
|
+
domainColorMap.set(name, {
|
|
276
|
+
color,
|
|
277
|
+
colorDomainValue: colorDomainValue.value,
|
|
278
|
+
})
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return domainColorMap
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
@computed private get uniqueEntityNames(): EntityName[] | undefined {
|
|
286
|
+
return this.xColumn?.uniqEntityNames ?? this.yColumns[0].uniqEntityNames
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@computed get items(): Item[] {
|
|
290
|
+
const { xSeries, series, domainColorForEntityMap, uniqueEntityNames } =
|
|
291
|
+
this
|
|
292
|
+
|
|
293
|
+
if (uniqueEntityNames === undefined) return []
|
|
294
|
+
|
|
295
|
+
const items: Item[] = uniqueEntityNames
|
|
296
|
+
.map((entityName) => {
|
|
297
|
+
const xPoint = xSeries
|
|
298
|
+
? xSeries.points.find(
|
|
299
|
+
(point) => point.entity === entityName
|
|
300
|
+
)
|
|
301
|
+
: undefined
|
|
302
|
+
if (xSeries && !xPoint) return undefined
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
entityName,
|
|
306
|
+
shortEntityName: getShortNameForEntity(entityName),
|
|
307
|
+
xPoint: xPoint,
|
|
308
|
+
entityColor: domainColorForEntityMap.get(entityName),
|
|
309
|
+
bars: excludeUndefined(
|
|
310
|
+
series.map((series): Bar | undefined => {
|
|
311
|
+
const point = series.points.find(
|
|
312
|
+
(point) => point.position === entityName
|
|
313
|
+
)
|
|
314
|
+
if (!point) return undefined
|
|
315
|
+
return {
|
|
316
|
+
kind: BarShape.Bar,
|
|
317
|
+
yPoint: point,
|
|
318
|
+
color: series.color,
|
|
319
|
+
seriesName: series.seriesName,
|
|
320
|
+
columnSlug: series.columnSlug,
|
|
321
|
+
}
|
|
322
|
+
})
|
|
323
|
+
),
|
|
324
|
+
focus: this.focusArray.state(entityName),
|
|
325
|
+
}
|
|
326
|
+
})
|
|
327
|
+
.filter((item) => item !== undefined) satisfies Item[]
|
|
328
|
+
|
|
329
|
+
return items
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
@computed get sortedItems(): Item[] {
|
|
333
|
+
const { items, sortConfig } = this
|
|
334
|
+
|
|
335
|
+
let sortByFuncs: ((item: Item) => number | string | undefined)[]
|
|
336
|
+
switch (sortConfig.sortBy) {
|
|
337
|
+
case SortBy.custom:
|
|
338
|
+
sortByFuncs = [(): undefined => undefined]
|
|
339
|
+
break
|
|
340
|
+
case SortBy.entityName:
|
|
341
|
+
sortByFuncs = [(item: Item): string => item.entityName]
|
|
342
|
+
break
|
|
343
|
+
case SortBy.column: {
|
|
344
|
+
const sortColumnSlug = sortConfig.sortColumnSlug
|
|
345
|
+
sortByFuncs = [
|
|
346
|
+
(item: Item): number =>
|
|
347
|
+
item.bars.find((b) => b.seriesName === sortColumnSlug)
|
|
348
|
+
?.yPoint.value ?? 0,
|
|
349
|
+
(item: Item): string => item.entityName,
|
|
350
|
+
]
|
|
351
|
+
break
|
|
352
|
+
}
|
|
353
|
+
default:
|
|
354
|
+
case SortBy.total:
|
|
355
|
+
sortByFuncs = [
|
|
356
|
+
(item: Item): number => {
|
|
357
|
+
const lastPoint = R.last(item.bars)?.yPoint
|
|
358
|
+
if (!lastPoint) return 0
|
|
359
|
+
return lastPoint.valueOffset + lastPoint.value
|
|
360
|
+
},
|
|
361
|
+
(item: Item): string => item.entityName,
|
|
362
|
+
]
|
|
363
|
+
}
|
|
364
|
+
const sortedItems = _.sortBy(items, sortByFuncs)
|
|
365
|
+
const sortOrder = sortConfig.sortOrder ?? SortOrder.desc
|
|
366
|
+
if (sortOrder === SortOrder.desc) sortedItems.reverse()
|
|
367
|
+
|
|
368
|
+
const [itemsWithValues, itemsWithoutValues] = _.partition(
|
|
369
|
+
sortedItems,
|
|
370
|
+
(item) => item.bars.length !== 0
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
return [...itemsWithValues, ...itemsWithoutValues]
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
@computed get selectedItems(): Item[] {
|
|
377
|
+
const selectedSet = this.selectionArray.selectedSet
|
|
378
|
+
if (selectedSet.size === 0) return []
|
|
379
|
+
return this.sortedItems.filter((item) =>
|
|
380
|
+
selectedSet.has(item.entityName)
|
|
381
|
+
)
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
@computed get yDomainDefault(): [number, number] {
|
|
385
|
+
const maxValues = this.allPoints.map(
|
|
386
|
+
(point) => point.value + point.valueOffset
|
|
387
|
+
)
|
|
388
|
+
return [
|
|
389
|
+
Math.min(this.y0, _.min(maxValues) as number),
|
|
390
|
+
Math.max(this.y0, _.max(maxValues) as number),
|
|
391
|
+
]
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
@computed get xDomainDefault(): [number, number] {
|
|
395
|
+
if (this.xSeries !== undefined) {
|
|
396
|
+
const sum = _.sumBy(this.xSeries.points, (point) => point.value)
|
|
397
|
+
|
|
398
|
+
return [this.x0, sum]
|
|
399
|
+
} else return [this.x0, this.items.length]
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
@computed private get xAxisLabelBase(): string {
|
|
403
|
+
const xDimName = this.defaultXAxisLabel
|
|
404
|
+
if (this.manager.xOverrideTime !== undefined)
|
|
405
|
+
return `${xDimName} in ${this.manager.xOverrideTime}`
|
|
406
|
+
return xDimName ?? "" // This sets the axis label to emtpy if we don't have an x column - not entirely sure this is what we want
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
@computed private get defaultXAxisLabel(): string | undefined {
|
|
410
|
+
return this.xColumn?.displayName
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
@computed get horizontalAxisLabel(): string {
|
|
414
|
+
const { xAxisLabelBase } = this
|
|
415
|
+
const config = this.manager.xAxisConfig
|
|
416
|
+
return config?.label || xAxisLabelBase
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
toHorizontalAxis(config: AxisConfig): HorizontalAxis {
|
|
420
|
+
let axis = config.toHorizontalAxis()
|
|
421
|
+
if (this.manager.isRelativeMode && this.xColumn) {
|
|
422
|
+
// MobX and classes interact in an annoying way here so we have to construct a new object via
|
|
423
|
+
// an object copy of the AxisConfig class instance to be able to set a property without
|
|
424
|
+
// making MobX unhappy about a mutation originating from a computed property
|
|
425
|
+
axis = new HorizontalAxis(
|
|
426
|
+
new AxisConfig(
|
|
427
|
+
{ ...config.toObject(), maxTicks: 10 },
|
|
428
|
+
config.axisManager
|
|
429
|
+
),
|
|
430
|
+
config.axisManager
|
|
431
|
+
)
|
|
432
|
+
axis.domain = [0, 100]
|
|
433
|
+
} else {
|
|
434
|
+
axis.updateDomainPreservingUserSettings(this.xDomainDefault)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
axis.formatColumn = this.xColumn
|
|
438
|
+
|
|
439
|
+
axis.label = this.horizontalAxisLabel
|
|
440
|
+
|
|
441
|
+
return axis
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
toVerticalAxis(config: AxisConfig): VerticalAxis {
|
|
445
|
+
const axis = config.toVerticalAxis()
|
|
446
|
+
axis.updateDomainPreservingUserSettings(this.yDomainDefault)
|
|
447
|
+
|
|
448
|
+
axis.scaleType = ScaleType.linear
|
|
449
|
+
axis.formatColumn = this.formatColumn
|
|
450
|
+
axis.label = ""
|
|
451
|
+
|
|
452
|
+
return axis
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
@computed get errorInfo(): ChartErrorInfo {
|
|
456
|
+
const column = this.yColumns[0]
|
|
457
|
+
const { yColumns } = this
|
|
458
|
+
|
|
459
|
+
if (!column) return { reason: "No Y column to chart" }
|
|
460
|
+
|
|
461
|
+
return yColumns.every((col) => col.isEmpty)
|
|
462
|
+
? { reason: "No matching data" }
|
|
463
|
+
: { reason: "" }
|
|
464
|
+
}
|
|
465
|
+
}
|