@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,298 @@
|
|
|
1
|
+
import { trimArray } from "../../core-table/index.js"
|
|
2
|
+
import { imemo, isPresent } from "../../utils/index.js"
|
|
3
|
+
|
|
4
|
+
import { didYouMean, isBlankLine, isEmpty } from "./GrammarUtils.js"
|
|
5
|
+
import {
|
|
6
|
+
CellPosition,
|
|
7
|
+
CellDef,
|
|
8
|
+
CellHasErrorsClass,
|
|
9
|
+
MatrixLine,
|
|
10
|
+
MatrixProgram,
|
|
11
|
+
Grammar,
|
|
12
|
+
FrontierCellClass,
|
|
13
|
+
ParsedCell,
|
|
14
|
+
CommentCellDef,
|
|
15
|
+
SubTableValueCellDef,
|
|
16
|
+
WorkInProgressCellDef,
|
|
17
|
+
NothingGoesThereCellDef,
|
|
18
|
+
} from "./GridLangConstants.js"
|
|
19
|
+
|
|
20
|
+
export class GridCell implements ParsedCell {
|
|
21
|
+
private position: CellPosition
|
|
22
|
+
private matrix: MatrixProgram
|
|
23
|
+
private rootDefinition: CellDef
|
|
24
|
+
constructor(
|
|
25
|
+
matrix: MatrixProgram,
|
|
26
|
+
position: CellPosition,
|
|
27
|
+
rootDefinition: CellDef
|
|
28
|
+
) {
|
|
29
|
+
this.position = position
|
|
30
|
+
this.matrix = matrix
|
|
31
|
+
this.rootDefinition = rootDefinition
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private get row() {
|
|
35
|
+
return this.position.row
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private get column() {
|
|
39
|
+
return this.position.column
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private get line(): MatrixLine | undefined {
|
|
43
|
+
return this.matrix[this.row]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private get isCommentCell() {
|
|
47
|
+
const { contents } = this
|
|
48
|
+
return contents && CommentCellDef.regex!.test(contents)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private get cellTerminalTypeDefinition(): CellDef | undefined {
|
|
52
|
+
const { rootDefinition } = this
|
|
53
|
+
if (this.isCommentCell) return CommentCellDef
|
|
54
|
+
const grammar = rootDefinition.grammar as unknown as Grammar
|
|
55
|
+
if (this.column === 0) return rootDefinition as unknown as CellDef
|
|
56
|
+
const firstWordOnLine = this.line ? this.line[0] : undefined
|
|
57
|
+
const isFirstWordAKeyword =
|
|
58
|
+
firstWordOnLine && grammar[firstWordOnLine] !== undefined
|
|
59
|
+
if (this.column === 1 && firstWordOnLine && isFirstWordAKeyword)
|
|
60
|
+
return grammar[firstWordOnLine]
|
|
61
|
+
|
|
62
|
+
if (!isFirstWordAKeyword) return undefined
|
|
63
|
+
|
|
64
|
+
// It has a keyword but it is column >1
|
|
65
|
+
const def = grammar[firstWordOnLine!]
|
|
66
|
+
const positionalCellTypeDef =
|
|
67
|
+
def.positionalCellDefs && def.positionalCellDefs[this.column - 2]
|
|
68
|
+
if (positionalCellTypeDef) return positionalCellTypeDef
|
|
69
|
+
if (def.isHorizontalList && this.contents) return def // For now only return a def for lists if it is non-empty
|
|
70
|
+
return NothingGoesThereCellDef
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private get parentSubTableInfo() {
|
|
74
|
+
const { row, matrix } = this
|
|
75
|
+
let pointerRow = row
|
|
76
|
+
let subTableHeaderRow = -1
|
|
77
|
+
while (pointerRow >= 0) {
|
|
78
|
+
const line = matrix[pointerRow]
|
|
79
|
+
if (!line) break
|
|
80
|
+
const parentKeyword = line[0]
|
|
81
|
+
if (parentKeyword) {
|
|
82
|
+
if (subTableHeaderRow === -1) return undefined
|
|
83
|
+
return {
|
|
84
|
+
parentKeyword,
|
|
85
|
+
parentRow: pointerRow,
|
|
86
|
+
subTableHeaderRow,
|
|
87
|
+
isCellInHeader: row === subTableHeaderRow,
|
|
88
|
+
headerKeyword: matrix[subTableHeaderRow][this.column],
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!isBlankLine(line)) subTableHeaderRow = pointerRow
|
|
93
|
+
pointerRow--
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return undefined
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@imemo private get subTableParseResults() {
|
|
100
|
+
const { cellTerminalTypeDefinition } = this
|
|
101
|
+
if (cellTerminalTypeDefinition) return undefined
|
|
102
|
+
|
|
103
|
+
const info = this.parentSubTableInfo
|
|
104
|
+
|
|
105
|
+
if (!info) return undefined
|
|
106
|
+
|
|
107
|
+
const {
|
|
108
|
+
parentKeyword,
|
|
109
|
+
isCellInHeader,
|
|
110
|
+
subTableHeaderRow,
|
|
111
|
+
headerKeyword,
|
|
112
|
+
} = info
|
|
113
|
+
|
|
114
|
+
const subTableDef = this.rootDefinition.grammar![parentKeyword]
|
|
115
|
+
|
|
116
|
+
const headerCellDef = subTableDef && subTableDef.headerCellDef
|
|
117
|
+
|
|
118
|
+
if (!headerCellDef) return undefined
|
|
119
|
+
|
|
120
|
+
const headerGrammar = headerCellDef.grammar
|
|
121
|
+
const valueCellDef =
|
|
122
|
+
!isCellInHeader && headerGrammar
|
|
123
|
+
? headerGrammar[headerKeyword]
|
|
124
|
+
: undefined
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
isFrontierCell: this.isSubTableFrontierCell(
|
|
128
|
+
subTableHeaderRow,
|
|
129
|
+
subTableDef
|
|
130
|
+
),
|
|
131
|
+
def: isCellInHeader
|
|
132
|
+
? headerCellDef
|
|
133
|
+
: (valueCellDef ?? SubTableValueCellDef),
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* If a cell is:
|
|
139
|
+
* - to the right of the last filled cell in a line
|
|
140
|
+
* - and that line is indented to be part of a subtable, with options
|
|
141
|
+
* - and it is the first non-blank line in the subtabel
|
|
142
|
+
*
|
|
143
|
+
* Then consider is a "frontier cell"
|
|
144
|
+
*
|
|
145
|
+
*/
|
|
146
|
+
private isSubTableFrontierCell(headerRow: number, subTableDef: CellDef) {
|
|
147
|
+
const { line, column, row } = this
|
|
148
|
+
const grammar = subTableDef.headerCellDef!.grammar
|
|
149
|
+
const isToTheImmediateRightOfLastFullCell =
|
|
150
|
+
line && trimArray(line).length === column
|
|
151
|
+
return (
|
|
152
|
+
row === headerRow &&
|
|
153
|
+
!isBlankLine(line) &&
|
|
154
|
+
isToTheImmediateRightOfLastFullCell &&
|
|
155
|
+
grammar &&
|
|
156
|
+
Object.keys(grammar).length
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// If true show a +
|
|
161
|
+
private get isFirstCellOnFrontierRow() {
|
|
162
|
+
const { row, column } = this
|
|
163
|
+
const numRows = this.matrix.length
|
|
164
|
+
if (column) return false // Only first column should have a +
|
|
165
|
+
if (!isBlankLine(this.line)) return false // Only blank lines can be frontier
|
|
166
|
+
if (numRows === 1) {
|
|
167
|
+
if (row === 1) return !isBlankLine(this.matrix[0])
|
|
168
|
+
return row === 0
|
|
169
|
+
}
|
|
170
|
+
return row === numRows
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private get suggestions() {
|
|
174
|
+
return []
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private get definitionLinks(): CellPosition[] {
|
|
178
|
+
return []
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private get implementationLinks(): CellPosition[] {
|
|
182
|
+
return []
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
@imemo get cellDef(): CellDef {
|
|
186
|
+
const def = this.cellTerminalTypeDefinition
|
|
187
|
+
if (def) return def
|
|
188
|
+
|
|
189
|
+
const subTable = this.subTableParseResults?.def
|
|
190
|
+
if (subTable) return subTable as unknown as CellDef
|
|
191
|
+
|
|
192
|
+
return WorkInProgressCellDef
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
get errorMessage() {
|
|
196
|
+
if (!this.line) return ""
|
|
197
|
+
const { cellDef, contents, optionKeywords } = this
|
|
198
|
+
const { regex, requirementsDescription, catchAllCellDef } = cellDef
|
|
199
|
+
const catchAllKeywordRegex = catchAllCellDef?.regex
|
|
200
|
+
|
|
201
|
+
if (contents === undefined || contents === "") return ""
|
|
202
|
+
|
|
203
|
+
const regexResult = regex
|
|
204
|
+
? validate(contents, regex, requirementsDescription)
|
|
205
|
+
: undefined
|
|
206
|
+
const catchAllRegexResult = catchAllKeywordRegex
|
|
207
|
+
? validate(
|
|
208
|
+
contents,
|
|
209
|
+
catchAllKeywordRegex,
|
|
210
|
+
catchAllCellDef!.requirementsDescription
|
|
211
|
+
)
|
|
212
|
+
: undefined
|
|
213
|
+
|
|
214
|
+
if (optionKeywords) {
|
|
215
|
+
if (optionKeywords.includes(contents)) return ""
|
|
216
|
+
|
|
217
|
+
if (regex) return regexResult
|
|
218
|
+
if (catchAllKeywordRegex) return catchAllRegexResult
|
|
219
|
+
|
|
220
|
+
const guess = didYouMean(contents, optionKeywords)
|
|
221
|
+
if (guess) return `Did you mean '${guess}'?`
|
|
222
|
+
|
|
223
|
+
return `Error: '${contents}' is not a valid option. Valid options are ${optionKeywords
|
|
224
|
+
.map((opt) => `'${opt}'`)
|
|
225
|
+
.join(", ")}`
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (regex) return regexResult
|
|
229
|
+
if (catchAllKeywordRegex) return catchAllRegexResult
|
|
230
|
+
|
|
231
|
+
return ""
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
get contents() {
|
|
235
|
+
return this.line ? this.line[this.column] : undefined
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
get comment() {
|
|
239
|
+
const { contents, errorMessage, cellDef } = this
|
|
240
|
+
if (isEmpty(contents)) return undefined
|
|
241
|
+
if (errorMessage) return errorMessage
|
|
242
|
+
|
|
243
|
+
if (cellDef.grammar) {
|
|
244
|
+
const def = cellDef.grammar[contents!] ?? cellDef.catchAllCellDef
|
|
245
|
+
return def.description
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return [cellDef.description].join("\n")
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
get cssClasses() {
|
|
252
|
+
const { errorMessage, cellDef } = this
|
|
253
|
+
if (errorMessage) return [CellHasErrorsClass]
|
|
254
|
+
const showArrow =
|
|
255
|
+
this.isFirstCellOnFrontierRow ||
|
|
256
|
+
this.subTableParseResults?.isFrontierCell
|
|
257
|
+
? FrontierCellClass
|
|
258
|
+
: undefined
|
|
259
|
+
const hasSuggestions =
|
|
260
|
+
this.cellDef.keyword === "table" ? "HasSuggestions" : null // todo: switch from strings to constants
|
|
261
|
+
return [cellDef.cssClass, hasSuggestions, showArrow].filter(isPresent)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
get placeholder() {
|
|
265
|
+
const { contents, cellDef } = this
|
|
266
|
+
const { terminalOptions } = cellDef
|
|
267
|
+
const firstOption = terminalOptions && terminalOptions[0]
|
|
268
|
+
const firstOptionName = firstOption && firstOption.keyword
|
|
269
|
+
const placeholder = cellDef.valuePlaceholder ?? firstOptionName
|
|
270
|
+
return isEmpty(contents) && placeholder
|
|
271
|
+
? `eg "${placeholder}"`
|
|
272
|
+
: undefined
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
get optionKeywords() {
|
|
276
|
+
const { cellDef } = this
|
|
277
|
+
const { grammar, headerCellDef, terminalOptions } = cellDef
|
|
278
|
+
return terminalOptions
|
|
279
|
+
? terminalOptions.map((def) => def.keyword)
|
|
280
|
+
: grammar
|
|
281
|
+
? Object.keys(grammar)
|
|
282
|
+
: headerCellDef
|
|
283
|
+
? Object.keys(headerCellDef.grammar!)
|
|
284
|
+
: undefined
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const validate = (value: any, regex: RegExp, requirements?: string) => {
|
|
289
|
+
if (typeof value !== "string") return ""
|
|
290
|
+
if (!regex.test(value)) {
|
|
291
|
+
return `Error: ${
|
|
292
|
+
requirements
|
|
293
|
+
? requirements
|
|
294
|
+
: `'${value}' did not validate against ${regex}`
|
|
295
|
+
}`
|
|
296
|
+
}
|
|
297
|
+
return ""
|
|
298
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { GrapherInterface } from "../../types/index.js"
|
|
2
|
+
|
|
3
|
+
export const CellHasErrorsClass = "CellHasErrorsClass"
|
|
4
|
+
|
|
5
|
+
export enum GridBoolean {
|
|
6
|
+
true = "true",
|
|
7
|
+
false = "false",
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const GRID_NODE_DELIMITER = "\n"
|
|
11
|
+
export const GRID_CELL_DELIMITER = "\t"
|
|
12
|
+
export const GRID_EDGE_DELIMITER = "\t"
|
|
13
|
+
|
|
14
|
+
export type CellCoordinate = number // An integer >= 0
|
|
15
|
+
|
|
16
|
+
export type Grammar<TCellDef extends CellDef = CellDef> = {
|
|
17
|
+
[keywordSlug: string]: TCellDef
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// A CellDef is a tuple: part keyword and the other half is the contents. The contents can be 1 cell, a list of cells, and/or a subtable.
|
|
21
|
+
export interface CellDef {
|
|
22
|
+
keyword: string
|
|
23
|
+
cssClass: string
|
|
24
|
+
description: string
|
|
25
|
+
grammar?: Grammar
|
|
26
|
+
headerCellDef?: CellDef
|
|
27
|
+
terminalOptions?: CellDef[]
|
|
28
|
+
catchAllCellDef?: CellDef // Only used by vertical grammars, this cell def, if present, will be used if a keyword is unrecognized during parsing.
|
|
29
|
+
regex?: RegExp // A validation regex a value must pass. todo: seems like this is overloaded and used for testing keywords and contents.
|
|
30
|
+
requirementsDescription?: string
|
|
31
|
+
valuePlaceholder?: string
|
|
32
|
+
positionalCellDefs?: readonly CellDef[] // Additional cell types as positional arguments.
|
|
33
|
+
isHorizontalList?: boolean // a list type, such as "colors\tred\torange\tgreen"
|
|
34
|
+
parse?: (value: any) => any
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface GrapherCellDef extends CellDef {
|
|
38
|
+
toGrapherObject: (value: any) => GrapherInterface // map to a partial config that is a valid GrapherInterface
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ColumnCellDef extends CellDef {
|
|
42
|
+
display?: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ParsedCell {
|
|
46
|
+
errorMessage?: string
|
|
47
|
+
cssClasses?: string[]
|
|
48
|
+
optionKeywords?: string[]
|
|
49
|
+
comment?: string
|
|
50
|
+
cellDef?: CellDef
|
|
51
|
+
placeholder?: string
|
|
52
|
+
contents?: any
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface CellPosition {
|
|
56
|
+
row: CellCoordinate
|
|
57
|
+
column: CellCoordinate
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const Origin: CellPosition = {
|
|
61
|
+
row: 0,
|
|
62
|
+
column: 0,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const BooleanCellDef: CellDef = {
|
|
66
|
+
keyword: "",
|
|
67
|
+
terminalOptions: [
|
|
68
|
+
{ keyword: GridBoolean.true, cssClass: "", description: "" },
|
|
69
|
+
{ keyword: GridBoolean.false, cssClass: "", description: "" },
|
|
70
|
+
],
|
|
71
|
+
cssClass: "BooleanCellDef",
|
|
72
|
+
description: "Boolean",
|
|
73
|
+
parse: (value: any) => {
|
|
74
|
+
// Handle already parsed boolean values (to avoid double parsing)
|
|
75
|
+
if (typeof value === "boolean") return value
|
|
76
|
+
return value === GridBoolean.true
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const StringCellDef: CellDef = {
|
|
81
|
+
keyword: "",
|
|
82
|
+
cssClass: "StringCellDef",
|
|
83
|
+
description: "",
|
|
84
|
+
parse: (value: any) => `${value}`.replace(/\\n/g, "\n"),
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const StringDeclarationDef: CellDef = {
|
|
88
|
+
keyword: "",
|
|
89
|
+
cssClass: "StringDeclarationDef",
|
|
90
|
+
description: "",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export const EnumCellDef: CellDef = {
|
|
94
|
+
keyword: "",
|
|
95
|
+
cssClass: "EnumCellDef",
|
|
96
|
+
description: "",
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export const RootKeywordCellDef: CellDef = {
|
|
100
|
+
keyword: "",
|
|
101
|
+
cssClass: "KeywordCellDef",
|
|
102
|
+
description: "Keyword",
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const NumericCellDef: CellDef = {
|
|
106
|
+
keyword: "",
|
|
107
|
+
cssClass: "NumericCellDef",
|
|
108
|
+
description: "",
|
|
109
|
+
regex: /^-?\d+\.?\d*$/,
|
|
110
|
+
requirementsDescription: `Must be a number`,
|
|
111
|
+
valuePlaceholder: "98.6",
|
|
112
|
+
parse: (value: any) => parseFloat(value),
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const NumericOrAutoCellDef: CellDef = {
|
|
116
|
+
keyword: "",
|
|
117
|
+
cssClass: "NumericCellDef",
|
|
118
|
+
description: "",
|
|
119
|
+
regex: /^(-?\d+\.?\d*|auto)$/,
|
|
120
|
+
requirementsDescription: `Must be a number or "auto"`,
|
|
121
|
+
valuePlaceholder: "98.6",
|
|
122
|
+
parse: (value: any) => {
|
|
123
|
+
if (value === "auto") return "auto"
|
|
124
|
+
return parseFloat(value)
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export const IntegerCellDef: CellDef = {
|
|
129
|
+
keyword: "",
|
|
130
|
+
cssClass: "IntegerCellDef",
|
|
131
|
+
description: "",
|
|
132
|
+
regex: /^-?[0-9]+$/,
|
|
133
|
+
requirementsDescription: `Must be an integer`,
|
|
134
|
+
valuePlaceholder: "12345",
|
|
135
|
+
parse: (value: any) => parseInt(value),
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export const PositiveIntegersCellDef: CellDef = {
|
|
139
|
+
keyword: "",
|
|
140
|
+
cssClass: "IntegerCellDef",
|
|
141
|
+
description: "",
|
|
142
|
+
regex: /^[0-9 ]+$/,
|
|
143
|
+
requirementsDescription: `Must be a positive integer or a list of positive integers`,
|
|
144
|
+
valuePlaceholder: "12345 23456",
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const SubTableHeaderCellDef: CellDef = {
|
|
148
|
+
keyword: "",
|
|
149
|
+
cssClass: "SubTableHeaderCellDef",
|
|
150
|
+
description: "",
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export const SubTableValueCellDef: CellDef = {
|
|
154
|
+
keyword: "",
|
|
155
|
+
cssClass: "SubTableValueCellDef",
|
|
156
|
+
description: "",
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const MatchUrlsOnlyRegex =
|
|
160
|
+
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/
|
|
161
|
+
|
|
162
|
+
export const UrlCellDef: CellDef = {
|
|
163
|
+
keyword: "",
|
|
164
|
+
cssClass: "UrlCellDef",
|
|
165
|
+
description: "",
|
|
166
|
+
regex: MatchUrlsOnlyRegex,
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export const QueryStringCellDef: CellDef = {
|
|
170
|
+
keyword: "",
|
|
171
|
+
cssClass: "QueryStringCellDef",
|
|
172
|
+
description: "",
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export const NothingGoesThereCellDef: CellDef = {
|
|
176
|
+
keyword: "",
|
|
177
|
+
cssClass: "NothingGoesThereType",
|
|
178
|
+
description:
|
|
179
|
+
"Nothing should be here. You can make this a comment by prepending a ##",
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export const CommentCellDef: CellDef = {
|
|
183
|
+
keyword: "",
|
|
184
|
+
cssClass: "CommentType",
|
|
185
|
+
description: "Just a comment.",
|
|
186
|
+
regex: /^(##|💬)/,
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export const WorkInProgressCellDef: CellDef = {
|
|
190
|
+
keyword: "",
|
|
191
|
+
cssClass: "WorkInProgressCellDef",
|
|
192
|
+
description: "Not a recognized statement. Treating as a work in progress.",
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export const SlugDeclarationCellDef: CellDef = {
|
|
196
|
+
keyword: "",
|
|
197
|
+
cssClass: "SlugDeclarationType",
|
|
198
|
+
description: "A unique URL-friendly name.",
|
|
199
|
+
regex: /^[a-zA-Z0-9-_]+$/,
|
|
200
|
+
requirementsDescription: `Can only contain the characters a-zA-Z0-9-_`,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// This is the name for a cell that is on the "frontier", where the next user input is expected to go. Okay to rename if you have a better word.
|
|
204
|
+
export const FrontierCellClass = "ShowDropdownArrow"
|
|
205
|
+
|
|
206
|
+
export const SlugsDeclarationCellDef: CellDef = {
|
|
207
|
+
keyword: "",
|
|
208
|
+
cssClass: "SlugDeclarationType",
|
|
209
|
+
description: "Unique URL-friendly names.",
|
|
210
|
+
regex: /^[a-zA-Z0-9-_ ]+$/,
|
|
211
|
+
requirementsDescription: `Can only contain the characters a-zA-Z0-9-_ `,
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export const EtlPathCellDef: CellDef = {
|
|
215
|
+
keyword: "",
|
|
216
|
+
cssClass: "IndicatorIdOrEtlPath",
|
|
217
|
+
description: "Path to an ETL indicator.",
|
|
218
|
+
regex: /^$|^[\w\d_/-]+#[\w\d_/-]+$/,
|
|
219
|
+
requirementsDescription: `Can only contain the characters a-zA-Z0-9-_/#`,
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export const IndicatorIdOrEtlPathCellDef: CellDef = {
|
|
223
|
+
keyword: "",
|
|
224
|
+
cssClass: "IndicatorIdOrEtlPath",
|
|
225
|
+
description: "A single indicator ID or a path to an ETL indicator.",
|
|
226
|
+
regex: /^\d+|[\w\d_/-]+#[\w\d_/-]+$/,
|
|
227
|
+
requirementsDescription: `Can only contain the characters a-zA-Z0-9-_/#`,
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export const SlugOrIndicatorIdOrEtlPathCellDef: CellDef = {
|
|
231
|
+
keyword: "",
|
|
232
|
+
cssClass: "SlugOrIndicatorIdOrEtlPath",
|
|
233
|
+
description: "A column slug, indicator ID, or catalog path.",
|
|
234
|
+
regex: /^[a-zA-Z0-9-_]+$|^\d+$|^[\w\d_/-]+#[\w\d_/-]+$/,
|
|
235
|
+
requirementsDescription: `Can be a slug (a-zA-Z0-9-_), an indicator ID (digits), or a catalog path (a-zA-Z0-9-_/#)`,
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export const IndicatorIdsOrEtlPathsCellDef: CellDef = {
|
|
239
|
+
keyword: "",
|
|
240
|
+
cssClass: "IndicatorIdOrEtlPath",
|
|
241
|
+
description: "One or more indicator IDs or paths to an ETL indicator.",
|
|
242
|
+
regex: /^((\d+|[\w\d_/-]*#[\w\d_/-]+)( +|$))+$/,
|
|
243
|
+
requirementsDescription: `Can only contain the characters a-zA-Z0-9-_/# `,
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export const JSONObjectCellDef: CellDef = {
|
|
247
|
+
keyword: "",
|
|
248
|
+
cssClass: "JSONObjectCellDef",
|
|
249
|
+
description: "JSON object",
|
|
250
|
+
regex: /^\{.*\}$/, // very basic validation that expression starts with { and ends with }
|
|
251
|
+
requirementsDescription: "Must contain a valid JSON object",
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export type MatrixLine = string[]
|
|
255
|
+
export type MatrixProgram = MatrixLine[]
|