@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.
Files changed (404) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +113 -0
  3. package/package.json +137 -0
  4. package/src/components/BodyPortal/BodyPortal.tsx +40 -0
  5. package/src/components/Button/Button.scss +110 -0
  6. package/src/components/Button/Button.tsx +101 -0
  7. package/src/components/Checkbox.scss +93 -0
  8. package/src/components/Checkbox.tsx +47 -0
  9. package/src/components/ExpandableToggle/ExpandableToggle.scss +123 -0
  10. package/src/components/ExpandableToggle/ExpandableToggle.tsx +60 -0
  11. package/src/components/GrapherTabIcon.tsx +156 -0
  12. package/src/components/GrapherTrendArrow.scss +16 -0
  13. package/src/components/GrapherTrendArrow.tsx +30 -0
  14. package/src/components/Halo/Halo.tsx +44 -0
  15. package/src/components/LabeledSwitch/LabeledSwitch.scss +109 -0
  16. package/src/components/LabeledSwitch/LabeledSwitch.tsx +62 -0
  17. package/src/components/MarkdownTextWrap/MarkdownTextWrap.tsx +1173 -0
  18. package/src/components/OverlayHeader.scss +18 -0
  19. package/src/components/OverlayHeader.tsx +29 -0
  20. package/src/components/RadioButton.scss +69 -0
  21. package/src/components/RadioButton.tsx +42 -0
  22. package/src/components/SimpleMarkdownText.tsx +89 -0
  23. package/src/components/TextInput.scss +17 -0
  24. package/src/components/TextInput.tsx +19 -0
  25. package/src/components/TextWrap/TextWrap.tsx +361 -0
  26. package/src/components/TextWrap/TextWrapUtils.ts +32 -0
  27. package/src/components/closeButton/CloseButton.scss +40 -0
  28. package/src/components/closeButton/CloseButton.tsx +27 -0
  29. package/src/components/index.ts +70 -0
  30. package/src/components/loadingIndicator/LoadingIndicator.scss +40 -0
  31. package/src/components/loadingIndicator/LoadingIndicator.tsx +28 -0
  32. package/src/components/markdown/remarkPlainLinks.ts +36 -0
  33. package/src/components/reactUtil.ts +20 -0
  34. package/src/components/stubs/CodeSnippet.tsx +19 -0
  35. package/src/components/stubs/DataCitation.tsx +16 -0
  36. package/src/components/stubs/IndicatorKeyData.tsx +45 -0
  37. package/src/components/stubs/IndicatorProcessing.tsx +15 -0
  38. package/src/components/stubs/IndicatorSources.tsx +15 -0
  39. package/src/components/styles/colors.scss +113 -0
  40. package/src/components/styles/mixins.scss +630 -0
  41. package/src/components/styles/typography.scss +579 -0
  42. package/src/components/styles/util.scss +89 -0
  43. package/src/components/styles/variables.scss +208 -0
  44. package/src/config/ChartsConfig.ts +163 -0
  45. package/src/config/ChartsProvider.tsx +157 -0
  46. package/src/config/index.ts +20 -0
  47. package/src/core-table/CoreTable.ts +1355 -0
  48. package/src/core-table/CoreTableColumns.ts +973 -0
  49. package/src/core-table/CoreTableUtils.ts +793 -0
  50. package/src/core-table/ErrorValues.ts +73 -0
  51. package/src/core-table/OwidTable.ts +1175 -0
  52. package/src/core-table/OwidTableSynthesizers.ts +272 -0
  53. package/src/core-table/OwidTableUtil.ts +76 -0
  54. package/src/core-table/Transforms.ts +484 -0
  55. package/src/core-table/index.ts +82 -0
  56. package/src/explorer/ColumnGrammar.ts +217 -0
  57. package/src/explorer/Explorer.sample.ts +212 -0
  58. package/src/explorer/Explorer.scss +148 -0
  59. package/src/explorer/Explorer.tsx +1283 -0
  60. package/src/explorer/ExplorerConstants.ts +85 -0
  61. package/src/explorer/ExplorerControls.scss +156 -0
  62. package/src/explorer/ExplorerControls.tsx +210 -0
  63. package/src/explorer/ExplorerDecisionMatrix.ts +471 -0
  64. package/src/explorer/ExplorerGrammar.ts +161 -0
  65. package/src/explorer/ExplorerProgram.ts +568 -0
  66. package/src/explorer/ExplorerUtils.ts +59 -0
  67. package/src/explorer/GrapherGrammar.ts +387 -0
  68. package/src/explorer/gridLang/GrammarUtils.ts +121 -0
  69. package/src/explorer/gridLang/GridCell.ts +298 -0
  70. package/src/explorer/gridLang/GridLangConstants.ts +255 -0
  71. package/src/explorer/gridLang/GridProgram.ts +311 -0
  72. package/src/explorer/gridLang/readme.md +17 -0
  73. package/src/explorer/index.ts +69 -0
  74. package/src/explorer/readme.md +19 -0
  75. package/src/explorer/urlMigrations/CO2UrlMigration.ts +46 -0
  76. package/src/explorer/urlMigrations/CovidUrlMigration.ts +37 -0
  77. package/src/explorer/urlMigrations/EnergyUrlMigration.ts +41 -0
  78. package/src/explorer/urlMigrations/ExplorerPageUrlMigrationSpec.ts +12 -0
  79. package/src/explorer/urlMigrations/ExplorerUrlMigrationUtils.ts +45 -0
  80. package/src/explorer/urlMigrations/ExplorerUrlMigrations.ts +33 -0
  81. package/src/explorer/urlMigrations/LegacyCovidUrlMigration.ts +144 -0
  82. package/src/explorer/urlMigrations/readme.md +39 -0
  83. package/src/grapher/axis/Axis.ts +973 -0
  84. package/src/grapher/axis/AxisConfig.ts +179 -0
  85. package/src/grapher/axis/AxisViews.tsx +597 -0
  86. package/src/grapher/barCharts/DiscreteBarChart.tsx +728 -0
  87. package/src/grapher/barCharts/DiscreteBarChartConstants.ts +60 -0
  88. package/src/grapher/barCharts/DiscreteBarChartHelpers.ts +338 -0
  89. package/src/grapher/barCharts/DiscreteBarChartState.ts +354 -0
  90. package/src/grapher/barCharts/DiscreteBarChartThumbnail.tsx +34 -0
  91. package/src/grapher/captionedChart/CaptionedChart.scss +61 -0
  92. package/src/grapher/captionedChart/CaptionedChart.tsx +523 -0
  93. package/src/grapher/captionedChart/Logos.tsx +141 -0
  94. package/src/grapher/captionedChart/LogosSVG.tsx +16 -0
  95. package/src/grapher/captionedChart/StaticChartRasterizer.tsx +178 -0
  96. package/src/grapher/captionedChart/assets/buildcanada-logo-square.svg +15 -0
  97. package/src/grapher/captionedChart/assets/buildcanada-logo.svg +15 -0
  98. package/src/grapher/captionedChart/assets/canadaspends.svg +7 -0
  99. package/src/grapher/captionedChart/readme.md +14 -0
  100. package/src/grapher/chart/Chart.tsx +62 -0
  101. package/src/grapher/chart/ChartAreaContent.tsx +172 -0
  102. package/src/grapher/chart/ChartDimension.ts +121 -0
  103. package/src/grapher/chart/ChartInterface.ts +83 -0
  104. package/src/grapher/chart/ChartManager.ts +113 -0
  105. package/src/grapher/chart/ChartTabs.ts +178 -0
  106. package/src/grapher/chart/ChartTypeMap.tsx +158 -0
  107. package/src/grapher/chart/ChartTypeSwitcher.tsx +26 -0
  108. package/src/grapher/chart/ChartUtils.tsx +364 -0
  109. package/src/grapher/chart/DimensionSlot.ts +45 -0
  110. package/src/grapher/chart/StaticChartWrapper.tsx +94 -0
  111. package/src/grapher/chart/guidedChartUtils.ts +82 -0
  112. package/src/grapher/color/BinningStrategies.ts +484 -0
  113. package/src/grapher/color/BinningStrategyEqualSizeBins.ts +132 -0
  114. package/src/grapher/color/BinningStrategyLogarithmic.ts +121 -0
  115. package/src/grapher/color/CategoricalColorAssigner.ts +97 -0
  116. package/src/grapher/color/ColorBrewerSchemes.ts +80 -0
  117. package/src/grapher/color/ColorConstants.ts +20 -0
  118. package/src/grapher/color/ColorScale.ts +339 -0
  119. package/src/grapher/color/ColorScaleBin.ts +147 -0
  120. package/src/grapher/color/ColorScaleConfig.ts +204 -0
  121. package/src/grapher/color/ColorScheme.ts +137 -0
  122. package/src/grapher/color/ColorSchemes.ts +149 -0
  123. package/src/grapher/color/ColorUtils.ts +86 -0
  124. package/src/grapher/color/CustomSchemes.ts +1772 -0
  125. package/src/grapher/color/readme.md +84 -0
  126. package/src/grapher/comparisonLine/ComparisonLine.tsx +31 -0
  127. package/src/grapher/comparisonLine/ComparisonLineConstants.ts +11 -0
  128. package/src/grapher/comparisonLine/ComparisonLineGenerator.ts +60 -0
  129. package/src/grapher/comparisonLine/ComparisonLineHelpers.ts +10 -0
  130. package/src/grapher/comparisonLine/CustomComparisonLine.tsx +159 -0
  131. package/src/grapher/comparisonLine/VerticalComparisonLine.tsx +208 -0
  132. package/src/grapher/controls/ActionButtons.scss +97 -0
  133. package/src/grapher/controls/ActionButtons.tsx +453 -0
  134. package/src/grapher/controls/CommandPalette.scss +50 -0
  135. package/src/grapher/controls/CommandPalette.tsx +74 -0
  136. package/src/grapher/controls/ContentSwitchers.scss +93 -0
  137. package/src/grapher/controls/ContentSwitchers.tsx +238 -0
  138. package/src/grapher/controls/Controls.scss +158 -0
  139. package/src/grapher/controls/DataTableFilterDropdown.scss +7 -0
  140. package/src/grapher/controls/DataTableFilterDropdown.tsx +168 -0
  141. package/src/grapher/controls/DataTableSearchField.scss +3 -0
  142. package/src/grapher/controls/DataTableSearchField.tsx +76 -0
  143. package/src/grapher/controls/Dropdown.scss +252 -0
  144. package/src/grapher/controls/Dropdown.tsx +235 -0
  145. package/src/grapher/controls/EntitySelectionToggle.tsx +135 -0
  146. package/src/grapher/controls/MapRegionDropdown.scss +3 -0
  147. package/src/grapher/controls/MapRegionDropdown.tsx +104 -0
  148. package/src/grapher/controls/MapResetButton.tsx +115 -0
  149. package/src/grapher/controls/MapZoomDropdown.scss +9 -0
  150. package/src/grapher/controls/MapZoomDropdown.tsx +270 -0
  151. package/src/grapher/controls/MapZoomToSelectionButton.tsx +87 -0
  152. package/src/grapher/controls/SearchField.scss +78 -0
  153. package/src/grapher/controls/SearchField.tsx +63 -0
  154. package/src/grapher/controls/SettingsMenu.scss +191 -0
  155. package/src/grapher/controls/SettingsMenu.tsx +399 -0
  156. package/src/grapher/controls/ShareMenu.scss +58 -0
  157. package/src/grapher/controls/ShareMenu.tsx +304 -0
  158. package/src/grapher/controls/SortIcon.tsx +39 -0
  159. package/src/grapher/controls/VerticalScrollContainer.tsx +263 -0
  160. package/src/grapher/controls/controlsRow/ControlsRow.tsx +168 -0
  161. package/src/grapher/controls/dropdown-icons.scss +4 -0
  162. package/src/grapher/controls/entityPicker/EntityPicker.scss +255 -0
  163. package/src/grapher/controls/entityPicker/EntityPicker.tsx +816 -0
  164. package/src/grapher/controls/entityPicker/EntityPickerConstants.ts +23 -0
  165. package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.scss +129 -0
  166. package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.tsx +463 -0
  167. package/src/grapher/controls/globalEntitySelector/GlobalEntitySelectorConstants.ts +3 -0
  168. package/src/grapher/controls/globalEntitySelector/readme.md +17 -0
  169. package/src/grapher/controls/settings/AbsRelToggle.tsx +64 -0
  170. package/src/grapher/controls/settings/AxisScaleToggle.tsx +53 -0
  171. package/src/grapher/controls/settings/FacetStrategySelector.tsx +110 -0
  172. package/src/grapher/controls/settings/FacetYDomainToggle.tsx +51 -0
  173. package/src/grapher/controls/settings/NoDataAreaToggle.tsx +38 -0
  174. package/src/grapher/controls/settings/ZoomToggle.tsx +36 -0
  175. package/src/grapher/core/EntitiesByRegionType.ts +174 -0
  176. package/src/grapher/core/EntityCodes.ts +19 -0
  177. package/src/grapher/core/EntityUrlBuilder.ts +200 -0
  178. package/src/grapher/core/FetchingGrapher.tsx +156 -0
  179. package/src/grapher/core/Grapher.tsx +760 -0
  180. package/src/grapher/core/GrapherAnalytics.ts +229 -0
  181. package/src/grapher/core/GrapherConstants.ts +173 -0
  182. package/src/grapher/core/GrapherState.tsx +3659 -0
  183. package/src/grapher/core/GrapherUrl.ts +184 -0
  184. package/src/grapher/core/GrapherUrlMigrations.ts +29 -0
  185. package/src/grapher/core/GrapherUseHelpers.tsx +147 -0
  186. package/src/grapher/core/LegacyToOwidTable.ts +841 -0
  187. package/src/grapher/core/grapher.entry.ts +5 -0
  188. package/src/grapher/core/grapher.scss +257 -0
  189. package/src/grapher/core/loadGrapherTableHelpers.ts +116 -0
  190. package/src/grapher/core/loadVariable.ts +104 -0
  191. package/src/grapher/core/relatedQuestion.ts +12 -0
  192. package/src/grapher/core/typography.scss +206 -0
  193. package/src/grapher/dataTable/DataTable.sample.ts +206 -0
  194. package/src/grapher/dataTable/DataTable.scss +249 -0
  195. package/src/grapher/dataTable/DataTable.tsx +1332 -0
  196. package/src/grapher/dataTable/DataTableConstants.ts +186 -0
  197. package/src/grapher/entitySelector/EntitySelector.scss +255 -0
  198. package/src/grapher/entitySelector/EntitySelector.tsx +1838 -0
  199. package/src/grapher/facet/FacetChart.tsx +943 -0
  200. package/src/grapher/facet/FacetChartConstants.ts +24 -0
  201. package/src/grapher/facet/FacetChartUtils.ts +51 -0
  202. package/src/grapher/facet/FacetMap.tsx +604 -0
  203. package/src/grapher/facet/FacetMapConstants.ts +23 -0
  204. package/src/grapher/facet/readme.md +13 -0
  205. package/src/grapher/focus/FocusArray.ts +79 -0
  206. package/src/grapher/footer/Footer.scss +63 -0
  207. package/src/grapher/footer/Footer.tsx +809 -0
  208. package/src/grapher/footer/FooterManager.ts +44 -0
  209. package/src/grapher/fullScreen/FullScreen.scss +11 -0
  210. package/src/grapher/fullScreen/FullScreen.tsx +61 -0
  211. package/src/grapher/header/Header.scss +35 -0
  212. package/src/grapher/header/Header.tsx +372 -0
  213. package/src/grapher/header/HeaderManager.ts +28 -0
  214. package/src/grapher/index.ts +157 -0
  215. package/src/grapher/interaction/InteractionState.ts +60 -0
  216. package/src/grapher/legend/HorizontalColorLegends.tsx +923 -0
  217. package/src/grapher/legend/LegendInteractionState.ts +40 -0
  218. package/src/grapher/legend/VerticalColorLegend.tsx +295 -0
  219. package/src/grapher/lineCharts/LineChart.tsx +968 -0
  220. package/src/grapher/lineCharts/LineChartConstants.ts +89 -0
  221. package/src/grapher/lineCharts/LineChartHelpers.ts +184 -0
  222. package/src/grapher/lineCharts/LineChartState.ts +394 -0
  223. package/src/grapher/lineCharts/LineChartThumbnail.tsx +437 -0
  224. package/src/grapher/lineCharts/Lines.tsx +258 -0
  225. package/src/grapher/lineLegend/LineLegend.tsx +723 -0
  226. package/src/grapher/lineLegend/LineLegendConstants.ts +9 -0
  227. package/src/grapher/lineLegend/LineLegendFilterAlgorithms.ts +143 -0
  228. package/src/grapher/lineLegend/LineLegendHelpers.ts +253 -0
  229. package/src/grapher/lineLegend/LineLegendTypes.ts +32 -0
  230. package/src/grapher/mapCharts/CanadaTopology.ts +17922 -0
  231. package/src/grapher/mapCharts/ChoroplethGlobe.tsx +949 -0
  232. package/src/grapher/mapCharts/ChoroplethMap.tsx +662 -0
  233. package/src/grapher/mapCharts/GeoFeatures.ts +184 -0
  234. package/src/grapher/mapCharts/GlobeController.ts +496 -0
  235. package/src/grapher/mapCharts/MapAnnotationPlacements.json +1040 -0
  236. package/src/grapher/mapCharts/MapAnnotationPlacements.ts +31 -0
  237. package/src/grapher/mapCharts/MapAnnotations.ts +723 -0
  238. package/src/grapher/mapCharts/MapChart.sample.ts +59 -0
  239. package/src/grapher/mapCharts/MapChart.scss +5 -0
  240. package/src/grapher/mapCharts/MapChart.tsx +720 -0
  241. package/src/grapher/mapCharts/MapChartConstants.ts +260 -0
  242. package/src/grapher/mapCharts/MapChartState.ts +416 -0
  243. package/src/grapher/mapCharts/MapChartThumbnail.tsx +25 -0
  244. package/src/grapher/mapCharts/MapComponents.tsx +338 -0
  245. package/src/grapher/mapCharts/MapConfig.ts +156 -0
  246. package/src/grapher/mapCharts/MapHelpers.ts +181 -0
  247. package/src/grapher/mapCharts/MapProjections.ts +49 -0
  248. package/src/grapher/mapCharts/MapSparkline.tsx +257 -0
  249. package/src/grapher/mapCharts/MapTooltip.scss +49 -0
  250. package/src/grapher/mapCharts/MapTooltip.tsx +409 -0
  251. package/src/grapher/mapCharts/MapTopology.ts +1766 -0
  252. package/src/grapher/mapCharts/d3-bboxCollide.js +204 -0
  253. package/src/grapher/mapCharts/d3-geo-projection.ts +198 -0
  254. package/src/grapher/modal/DownloadIcons.tsx +39 -0
  255. package/src/grapher/modal/DownloadModal.scss +300 -0
  256. package/src/grapher/modal/DownloadModal.tsx +1226 -0
  257. package/src/grapher/modal/EmbedModal.scss +40 -0
  258. package/src/grapher/modal/EmbedModal.tsx +160 -0
  259. package/src/grapher/modal/EntitySelectorModal.tsx +59 -0
  260. package/src/grapher/modal/Modal.scss +31 -0
  261. package/src/grapher/modal/Modal.tsx +90 -0
  262. package/src/grapher/modal/ModalHeader.scss +12 -0
  263. package/src/grapher/modal/ModalHeader.tsx +16 -0
  264. package/src/grapher/modal/SourcesDescriptions.scss +87 -0
  265. package/src/grapher/modal/SourcesDescriptions.tsx +89 -0
  266. package/src/grapher/modal/SourcesKeyDataTable.scss +49 -0
  267. package/src/grapher/modal/SourcesKeyDataTable.tsx +87 -0
  268. package/src/grapher/modal/SourcesModal.scss +301 -0
  269. package/src/grapher/modal/SourcesModal.tsx +568 -0
  270. package/src/grapher/noDataModal/NoDataModal.tsx +125 -0
  271. package/src/grapher/scatterCharts/ConnectedScatterLegend.tsx +143 -0
  272. package/src/grapher/scatterCharts/MultiColorPolyline.tsx +129 -0
  273. package/src/grapher/scatterCharts/NoDataSection.scss +14 -0
  274. package/src/grapher/scatterCharts/NoDataSection.tsx +56 -0
  275. package/src/grapher/scatterCharts/ScatterPlotChart.tsx +792 -0
  276. package/src/grapher/scatterCharts/ScatterPlotChartConstants.ts +157 -0
  277. package/src/grapher/scatterCharts/ScatterPlotChartState.ts +678 -0
  278. package/src/grapher/scatterCharts/ScatterPlotChartThumbnail.tsx +155 -0
  279. package/src/grapher/scatterCharts/ScatterPlotTooltip.tsx +560 -0
  280. package/src/grapher/scatterCharts/ScatterPoints.tsx +153 -0
  281. package/src/grapher/scatterCharts/ScatterPointsWithLabels.tsx +708 -0
  282. package/src/grapher/scatterCharts/ScatterSizeLegend.tsx +327 -0
  283. package/src/grapher/scatterCharts/ScatterUtils.ts +265 -0
  284. package/src/grapher/scatterCharts/Triangle.tsx +41 -0
  285. package/src/grapher/schema/README.md +33 -0
  286. package/src/grapher/schema/defaultGrapherConfig.ts +100 -0
  287. package/src/grapher/schema/grapher-schema.009.yaml +781 -0
  288. package/src/grapher/schema/migrations/helpers.ts +58 -0
  289. package/src/grapher/schema/migrations/migrate.ts +75 -0
  290. package/src/grapher/schema/migrations/migrations.ts +158 -0
  291. package/src/grapher/selection/MapSelectionArray.ts +99 -0
  292. package/src/grapher/selection/SelectionArray.ts +71 -0
  293. package/src/grapher/selection/readme.md +16 -0
  294. package/src/grapher/sidePanel/SidePanel.scss +10 -0
  295. package/src/grapher/sidePanel/SidePanel.tsx +23 -0
  296. package/src/grapher/slideInDrawer/SlideInDrawer.scss +57 -0
  297. package/src/grapher/slideInDrawer/SlideInDrawer.tsx +125 -0
  298. package/src/grapher/slideshowController/SlideShowController.tsx +43 -0
  299. package/src/grapher/slideshowController/readme.md +7 -0
  300. package/src/grapher/slopeCharts/MarkX.tsx +45 -0
  301. package/src/grapher/slopeCharts/Slope.tsx +102 -0
  302. package/src/grapher/slopeCharts/SlopeChart.tsx +1152 -0
  303. package/src/grapher/slopeCharts/SlopeChartConstants.ts +33 -0
  304. package/src/grapher/slopeCharts/SlopeChartHelpers.ts +73 -0
  305. package/src/grapher/slopeCharts/SlopeChartState.ts +392 -0
  306. package/src/grapher/slopeCharts/SlopeChartThumbnail.tsx +368 -0
  307. package/src/grapher/stackedCharts/AbstractStackedChartState.ts +370 -0
  308. package/src/grapher/stackedCharts/MarimekkoBars.tsx +190 -0
  309. package/src/grapher/stackedCharts/MarimekkoBarsForOneEntity.tsx +168 -0
  310. package/src/grapher/stackedCharts/MarimekkoChart.tsx +1144 -0
  311. package/src/grapher/stackedCharts/MarimekkoChartConstants.ts +112 -0
  312. package/src/grapher/stackedCharts/MarimekkoChartHelpers.ts +21 -0
  313. package/src/grapher/stackedCharts/MarimekkoChartState.ts +465 -0
  314. package/src/grapher/stackedCharts/MarimekkoChartThumbnail.tsx +168 -0
  315. package/src/grapher/stackedCharts/MarimekkoInternalLabels.tsx +124 -0
  316. package/src/grapher/stackedCharts/StackedAreaChart.tsx +678 -0
  317. package/src/grapher/stackedCharts/StackedAreaChartState.ts +34 -0
  318. package/src/grapher/stackedCharts/StackedAreaChartThumbnail.tsx +215 -0
  319. package/src/grapher/stackedCharts/StackedAreas.tsx +223 -0
  320. package/src/grapher/stackedCharts/StackedBarChart.tsx +619 -0
  321. package/src/grapher/stackedCharts/StackedBarChartState.ts +80 -0
  322. package/src/grapher/stackedCharts/StackedBarChartThumbnail.tsx +220 -0
  323. package/src/grapher/stackedCharts/StackedBarSegment.tsx +87 -0
  324. package/src/grapher/stackedCharts/StackedBars.tsx +102 -0
  325. package/src/grapher/stackedCharts/StackedConstants.ts +109 -0
  326. package/src/grapher/stackedCharts/StackedDiscreteBarChart.tsx +270 -0
  327. package/src/grapher/stackedCharts/StackedDiscreteBarChartState.ts +296 -0
  328. package/src/grapher/stackedCharts/StackedDiscreteBarChartThumbnail.tsx +27 -0
  329. package/src/grapher/stackedCharts/StackedDiscreteBars.tsx +648 -0
  330. package/src/grapher/stackedCharts/StackedUtils.ts +142 -0
  331. package/src/grapher/tabs/Tabs.scss +169 -0
  332. package/src/grapher/tabs/Tabs.tsx +54 -0
  333. package/src/grapher/tabs/TabsWithDropdown.scss +62 -0
  334. package/src/grapher/tabs/TabsWithDropdown.tsx +114 -0
  335. package/src/grapher/testData/OwidTestData.sample.ts +273 -0
  336. package/src/grapher/testData/OwidTestData.ts +64 -0
  337. package/src/grapher/timeline/TimelineComponent.scss +139 -0
  338. package/src/grapher/timeline/TimelineComponent.tsx +658 -0
  339. package/src/grapher/timeline/TimelineController.ts +368 -0
  340. package/src/grapher/timeline/readme.md +7 -0
  341. package/src/grapher/tooltip/Tooltip.scss +510 -0
  342. package/src/grapher/tooltip/Tooltip.tsx +294 -0
  343. package/src/grapher/tooltip/TooltipContents.tsx +383 -0
  344. package/src/grapher/tooltip/TooltipProps.ts +123 -0
  345. package/src/grapher/tooltip/TooltipState.ts +81 -0
  346. package/src/grapher/verticalLabels/VerticalLabels.tsx +31 -0
  347. package/src/grapher/verticalLabels/VerticalLabelsState.ts +154 -0
  348. package/src/index.ts +226 -0
  349. package/src/styles/charts.scss +15 -0
  350. package/src/types/NominalType.ts +30 -0
  351. package/src/types/OwidOrigin.ts +18 -0
  352. package/src/types/OwidSource.ts +9 -0
  353. package/src/types/OwidVariable.ts +133 -0
  354. package/src/types/OwidVariableDisplayConfigInterface.ts +49 -0
  355. package/src/types/analyticsTypes.ts +54 -0
  356. package/src/types/dbTypes/Tags.ts +11 -0
  357. package/src/types/domainTypes/Archive.ts +139 -0
  358. package/src/types/domainTypes/Author.ts +28 -0
  359. package/src/types/domainTypes/ContentGraph.ts +76 -0
  360. package/src/types/domainTypes/CoreTableTypes.ts +305 -0
  361. package/src/types/domainTypes/DeployStatus.ts +23 -0
  362. package/src/types/domainTypes/Layout.ts +34 -0
  363. package/src/types/domainTypes/Posts.ts +34 -0
  364. package/src/types/domainTypes/Search.ts +299 -0
  365. package/src/types/domainTypes/Site.ts +8 -0
  366. package/src/types/domainTypes/StaticViz.ts +64 -0
  367. package/src/types/domainTypes/Toc.ts +11 -0
  368. package/src/types/domainTypes/Tombstone.ts +19 -0
  369. package/src/types/domainTypes/Various.ts +79 -0
  370. package/src/types/gdocTypes/Gdoc.ts +280 -0
  371. package/src/types/grapherTypes/BinningStrategyTypes.ts +46 -0
  372. package/src/types/grapherTypes/GrapherConstants.ts +53 -0
  373. package/src/types/grapherTypes/GrapherTypes.ts +743 -0
  374. package/src/types/index.ts +316 -0
  375. package/src/types/wordpressTypes/WordpressTypes.ts +9 -0
  376. package/src/utils/Bounds.ts +439 -0
  377. package/src/utils/BrowserUtils.ts +12 -0
  378. package/src/utils/FuzzySearch.ts +74 -0
  379. package/src/utils/MultiDimDataPageConfig.ts +31 -0
  380. package/src/utils/OwidVariable.ts +82 -0
  381. package/src/utils/PointVector.ts +97 -0
  382. package/src/utils/PromiseCache.ts +36 -0
  383. package/src/utils/PromiseSwitcher.ts +52 -0
  384. package/src/utils/TimeBounds.ts +130 -0
  385. package/src/utils/Tippy.tsx +57 -0
  386. package/src/utils/Util.ts +2369 -0
  387. package/src/utils/archival/archivalDate.ts +48 -0
  388. package/src/utils/dayjs.ts +32 -0
  389. package/src/utils/formatValue.ts +242 -0
  390. package/src/utils/grapherConfigUtils.ts +81 -0
  391. package/src/utils/image.ts +225 -0
  392. package/src/utils/index.ts +318 -0
  393. package/src/utils/isPresent.ts +5 -0
  394. package/src/utils/metadataHelpers.ts +329 -0
  395. package/src/utils/persistable/Persistable.ts +82 -0
  396. package/src/utils/persistable/readme.md +50 -0
  397. package/src/utils/regions.json +5635 -0
  398. package/src/utils/regions.ts +463 -0
  399. package/src/utils/serializers.ts +16 -0
  400. package/src/utils/string.ts +42 -0
  401. package/src/utils/urls/Url.ts +195 -0
  402. package/src/utils/urls/UrlMigration.ts +10 -0
  403. package/src/utils/urls/UrlUtils.ts +54 -0
  404. package/src/utils/urls/readme.md +90 -0
@@ -0,0 +1,238 @@
1
+ import * as React from "react"
2
+ import { action, computed, observable, makeObservable } from "mobx"
3
+ import cx from "classnames"
4
+ import { observer } from "mobx-react"
5
+ import { GrapherTabName } from "../../types/index.js"
6
+ import { TabItem, Tabs } from "../tabs/Tabs.js"
7
+ import { makeLabelForGrapherTab } from "../chart/ChartTabs"
8
+ import { Menu, MenuItem, Popover } from "react-aria-components"
9
+ import { GrapherTabIcon } from "../../components/index.js"
10
+
11
+ export interface ContentSwitchersManager {
12
+ availableTabs?: GrapherTabName[]
13
+ activeTab?: GrapherTabName
14
+ hasMultipleChartTypes?: boolean
15
+ setTab: (tab: GrapherTabName) => void
16
+ onTabChange: (oldTab: GrapherTabName, newTab: GrapherTabName) => void
17
+ isMedium?: boolean
18
+ }
19
+
20
+ const OVERFLOW_MENU_KEY = "More"
21
+
22
+ const MAX_VISIBLE_TABS = 4
23
+ const MAX_VISIBLE_TABS_BEFORE_OVERFLOW = 3
24
+
25
+ type TabKey = GrapherTabName | typeof OVERFLOW_MENU_KEY
26
+
27
+ @observer
28
+ export class ContentSwitchers extends React.Component<{
29
+ manager: ContentSwitchersManager
30
+ }> {
31
+ constructor(props: { manager: ContentSwitchersManager }) {
32
+ super(props)
33
+
34
+ makeObservable<ContentSwitchers, "isOverflowMenuOpen">(this, {
35
+ isOverflowMenuOpen: observable,
36
+ })
37
+ }
38
+
39
+ static shouldShow(manager: ContentSwitchersManager): boolean {
40
+ const test = new ContentSwitchers({ manager })
41
+ return test.shouldShow
42
+ }
43
+
44
+ private isOverflowMenuOpen = false
45
+ private overflowButtonRef = React.createRef<HTMLButtonElement>()
46
+
47
+ @computed private get manager(): ContentSwitchersManager {
48
+ return this.props.manager
49
+ }
50
+
51
+ @computed private get hasMultipleChartTypes(): boolean {
52
+ return !!this.manager.hasMultipleChartTypes
53
+ }
54
+
55
+ @computed private get availableTabs(): GrapherTabName[] {
56
+ return this.manager.availableTabs || []
57
+ }
58
+
59
+ @computed private get shouldShow(): boolean {
60
+ return this.availableTabs.length > 1
61
+ }
62
+
63
+ @computed private get visibleTabs(): GrapherTabName[] {
64
+ const { activeTab, availableTabs } = this
65
+
66
+ // If there are four or fewer tabs, show all of them
67
+ if (availableTabs.length <= MAX_VISIBLE_TABS) {
68
+ return availableTabs
69
+ }
70
+
71
+ // Otherwise, only show the first 3 tabs
72
+ const visibleTabs = availableTabs.slice(
73
+ 0,
74
+ MAX_VISIBLE_TABS_BEFORE_OVERFLOW
75
+ )
76
+
77
+ // If the active tab is not visible, replace the last visible tab with it
78
+ if (!visibleTabs.includes(activeTab)) {
79
+ visibleTabs[visibleTabs.length - 1] = activeTab
80
+ }
81
+
82
+ return visibleTabs
83
+ }
84
+
85
+ @computed private get hiddenTabs(): GrapherTabName[] {
86
+ return this.availableTabs.filter(
87
+ (tab) => !this.visibleTabs.includes(tab)
88
+ )
89
+ }
90
+
91
+ @computed private get activeTab(): GrapherTabName {
92
+ return this.manager.activeTab ?? this.availableTabs[0]
93
+ }
94
+
95
+ @computed private get selectedTabKey(): TabKey {
96
+ return this.isOverflowMenuOpen ? OVERFLOW_MENU_KEY : this.activeTab
97
+ }
98
+
99
+ @computed private get tabItems(): TabItem<TabKey>[] {
100
+ const { hasMultipleChartTypes } = this
101
+
102
+ const visibleTabItems: TabItem<TabKey>[] = this.visibleTabs.map(
103
+ (tab) => ({
104
+ key: tab,
105
+ element: (
106
+ <TabContent
107
+ key={tab}
108
+ tab={tab}
109
+ hasMultipleChartTypes={hasMultipleChartTypes}
110
+ />
111
+ ),
112
+ buttonProps: {
113
+ className: cx({ active: tab === this.activeTab }),
114
+ dataTrackNote: "chart_click_" + tab,
115
+ ariaLabel: makeLabelForGrapherTab(tab, {
116
+ useGenericChartLabel: !hasMultipleChartTypes,
117
+ }),
118
+ },
119
+ })
120
+ )
121
+
122
+ // Add overflow menu button if there are hidden tabs
123
+ if (this.hiddenTabs.length > 0) {
124
+ visibleTabItems.push({
125
+ key: OVERFLOW_MENU_KEY,
126
+ element: <>+&#8202;{this.hiddenTabs.length}</>,
127
+ buttonProps: {
128
+ className: "ContentSwitchers__OverflowMenuButton",
129
+ ariaLabel: "Show more chart types",
130
+ ref: this.overflowButtonRef,
131
+ },
132
+ })
133
+ }
134
+
135
+ return visibleTabItems
136
+ }
137
+
138
+ @action.bound private setTab(selectedTab: GrapherTabName): void {
139
+ const oldTab = this.manager.activeTab
140
+ const newTab = selectedTab
141
+ this.manager.setTab(newTab)
142
+ this.manager.onTabChange?.(oldTab!, newTab)
143
+ }
144
+
145
+ @action.bound private showOverflowMenu(): void {
146
+ this.isOverflowMenuOpen = true
147
+ }
148
+
149
+ @action.bound private hideOverflowMenu(): void {
150
+ this.isOverflowMenuOpen = false
151
+ }
152
+
153
+ @action.bound private onTabChange(selectedKey: TabKey): void {
154
+ if (selectedKey === OVERFLOW_MENU_KEY) {
155
+ this.showOverflowMenu()
156
+ } else {
157
+ this.setTab(selectedKey as GrapherTabName)
158
+ this.hideOverflowMenu()
159
+ }
160
+ }
161
+
162
+ @action.bound private onOverflowMenuSelect(tab: GrapherTabName): void {
163
+ this.setTab(tab)
164
+ this.hideOverflowMenu()
165
+ }
166
+
167
+ private renderOverflowMenu(): React.ReactElement {
168
+ const { hasMultipleChartTypes } = this
169
+
170
+ return (
171
+ <Popover
172
+ className="ContentSwitchers__OverflowMenu"
173
+ placement="bottom"
174
+ triggerRef={this.overflowButtonRef}
175
+ isOpen={this.isOverflowMenuOpen}
176
+ onOpenChange={(isOpen) => {
177
+ if (!isOpen) this.hideOverflowMenu()
178
+ else this.showOverflowMenu()
179
+ }}
180
+ >
181
+ <Menu
182
+ onAction={(key) =>
183
+ this.onOverflowMenuSelect(key as GrapherTabName)
184
+ }
185
+ >
186
+ {this.hiddenTabs.map((tab) => (
187
+ <MenuItem
188
+ key={tab}
189
+ id={tab}
190
+ className="ContentSwitchers__OverflowMenuItem"
191
+ >
192
+ <TabContent
193
+ tab={tab}
194
+ hasMultipleChartTypes={hasMultipleChartTypes}
195
+ />
196
+ </MenuItem>
197
+ ))}
198
+ </Menu>
199
+ </Popover>
200
+ )
201
+ }
202
+
203
+ override render(): React.ReactElement | null {
204
+ if (!this.shouldShow) return null
205
+
206
+ return (
207
+ <div className="ContentSwitchers__Container">
208
+ <Tabs
209
+ variant="slim"
210
+ className="ContentSwitchers"
211
+ items={this.tabItems}
212
+ selectedKey={this.selectedTabKey}
213
+ onChange={this.onTabChange}
214
+ />
215
+ {this.renderOverflowMenu()}
216
+ </div>
217
+ )
218
+ }
219
+ }
220
+
221
+ function TabContent({
222
+ tab,
223
+ hasMultipleChartTypes,
224
+ }: {
225
+ tab: GrapherTabName
226
+ hasMultipleChartTypes?: boolean
227
+ }): React.ReactElement {
228
+ return (
229
+ <span>
230
+ <GrapherTabIcon tab={tab} />
231
+ <span className="label">
232
+ {makeLabelForGrapherTab(tab, {
233
+ useGenericChartLabel: !hasMultipleChartTypes,
234
+ })}
235
+ </span>
236
+ </span>
237
+ )
238
+ }
@@ -0,0 +1,158 @@
1
+ $light-stroke: $gray-20;
2
+ $dark-stroke: #2d2d2d;
3
+ $active-stroke: $blue-30;
4
+
5
+ $light-fill: $gray-30;
6
+ $active-fill: $blue-20;
7
+ $hover-fill: $gray-10;
8
+ $selected-fill: #c7ced7;
9
+
10
+ $active-switch: $blue-50;
11
+
12
+ $medium: 400;
13
+ $bold: 700;
14
+ $lato: $sans-serif-font-stack;
15
+
16
+ $indent: 15px;
17
+ $control-row-height: 32px;
18
+
19
+ // Buttons in the main controls row of the grapher view
20
+ nav.controlsRow .controls {
21
+ display: flex;
22
+ justify-content: flex-end;
23
+ gap: 8px;
24
+
25
+ button.menu-toggle {
26
+ font: $medium 13px/16px $lato;
27
+ letter-spacing: 0.01em;
28
+ display: flex;
29
+ align-items: center;
30
+ border: 1px solid $light-stroke;
31
+ border-radius: 4px;
32
+ padding: 7px;
33
+ color: $dark-text;
34
+ white-space: nowrap;
35
+
36
+ &:hover {
37
+ background: $hover-fill;
38
+ cursor: pointer;
39
+ }
40
+
41
+ &.active,
42
+ &:active {
43
+ color: $active-text;
44
+ background: $active-fill;
45
+ border: 1px solid $active-fill;
46
+ }
47
+
48
+ svg {
49
+ height: 12px;
50
+ margin-right: 5px;
51
+ vertical-align: bottom;
52
+ }
53
+
54
+ label:hover {
55
+ cursor: pointer;
56
+ }
57
+ }
58
+ }
59
+
60
+ //
61
+ // Make buttons narrower by omitting their text labels as the viewport gets narrower
62
+ // use the .GrapherComponentSemiNarrow if necessary but allow container queries to
63
+ // collapse labels in two steps on browsers that support them
64
+ //
65
+ // TODO: the measurement and label-hiding logic will have to move to js anyway once the
66
+ // number of chart buttons becomes variable and the settings button can be replaced
67
+ // by a single control widget ‘promoted’ from within the drawer
68
+ //
69
+ @at-root {
70
+ // collapse both the settings and entity selector labels down at the semi-narrow breakpoint
71
+ .GrapherComponentSemiNarrow {
72
+ nav.controlsRow .settings-menu button.menu-toggle {
73
+ min-height: $control-row-height;
74
+ svg {
75
+ margin: 0 2px;
76
+ }
77
+ .label {
78
+ display: none;
79
+ }
80
+ }
81
+ nav.controlsRow .entity-selection-menu button.menu-toggle {
82
+ label span {
83
+ display: none;
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ @container grapher (max-width:575px) {
90
+ // collapse the Settings toggle down to just an icon on small screens
91
+ nav.controlsRow .settings-menu button.menu-toggle {
92
+ min-height: $control-row-height;
93
+ svg {
94
+ margin: 0 2px;
95
+ }
96
+ .label {
97
+ display: none;
98
+ }
99
+ }
100
+
101
+ // undo the .GrapherComponentSemiNarrow hiding until next container query
102
+ nav.controlsRow .entity-selection-menu button.menu-toggle {
103
+ label span {
104
+ display: inline;
105
+ }
106
+ }
107
+ }
108
+
109
+ @container grapher (max-width:675px) {
110
+ // hide the entity name in the Edit/Select/Switch button
111
+ nav.controlsRow .chart-controls .entity-selection-menu button.menu-toggle {
112
+ label span {
113
+ display: none;
114
+ }
115
+ }
116
+ }
117
+
118
+ @container grapher (max-width:725px) {
119
+ // hide the entity name in the Edit/Select/Switch button
120
+ nav.controlsRow .map-controls .entity-selection-menu button.menu-toggle {
121
+ label span {
122
+ display: none;
123
+ }
124
+ }
125
+ }
126
+
127
+ @container grapher (max-width:500px) {
128
+ // hide labels on smaller screens
129
+ .ContentSwitchers .Tabs__Tab .label {
130
+ display: none;
131
+ }
132
+ }
133
+
134
+ // reduce the horizontal padding of a content switcher tab based on grapher's size
135
+ @container grapher (max-width:725px) {
136
+ .ContentSwitchers .Tabs__Tab {
137
+ --tab-padding: 12px;
138
+ }
139
+ }
140
+ @container grapher (max-width:335px) {
141
+ .ContentSwitchers .Tabs__Tab {
142
+ --tab-padding: 8px;
143
+ }
144
+ }
145
+
146
+ //
147
+ // correct for style bleeds in admin
148
+ //
149
+ @at-root {
150
+ .AdminApp {
151
+ nav.controlsRow .controls button.menu-toggle label {
152
+ margin: 0;
153
+ }
154
+ .GrapherSettingsPopover section {
155
+ background: none;
156
+ }
157
+ }
158
+ }
@@ -0,0 +1,7 @@
1
+ .data-table-filter-dropdown {
2
+ width: 194px;
3
+ }
4
+
5
+ .data-table-filter-dropdown-menu {
6
+ min-width: 170px;
7
+ }
@@ -0,0 +1,168 @@
1
+ import * as React from "react"
2
+ import { computed, action, makeObservable } from "mobx"
3
+ import { observer } from "mobx-react"
4
+ import { Dropdown } from "./Dropdown"
5
+ import { EntityName } from "../../utils/index.js"
6
+ import { DataTableConfig } from "../dataTable/DataTableConstants"
7
+ import { OwidTable } from "../../core-table/index.js"
8
+ import { SelectionArray } from "../selection/SelectionArray"
9
+ import { makeSelectionArray } from "../chart/ChartUtils"
10
+ import {
11
+ EntityRegionTypeGroup,
12
+ entityRegionTypeLabels,
13
+ } from "../core/EntitiesByRegionType"
14
+
15
+ export interface DataTableFilterDropdownManager {
16
+ dataTableConfig: DataTableConfig
17
+ tableForDisplay: OwidTable
18
+ isOnTableTab?: boolean
19
+ dataTableSelection?: SelectionArray | EntityName[]
20
+ canChangeAddOrHighlightEntities?: boolean
21
+ shouldShowSelectionOnlyInDataTable?: boolean
22
+ entityRegionTypeGroups?: EntityRegionTypeGroup[]
23
+ isSemiNarrow?: boolean
24
+ }
25
+
26
+ interface DropdownOption {
27
+ label: string
28
+ value: DataTableConfig["filter"]
29
+ count: number
30
+ trackNote: "data_table_filter_by"
31
+ }
32
+
33
+ @observer
34
+ export class DataTableFilterDropdown extends React.Component<{
35
+ manager: DataTableFilterDropdownManager
36
+ }> {
37
+ constructor(props: { manager: DataTableFilterDropdownManager }) {
38
+ super(props)
39
+ makeObservable(this)
40
+ }
41
+
42
+ static shouldShow(manager: DataTableFilterDropdownManager): boolean {
43
+ const menu = new DataTableFilterDropdown({ manager })
44
+ return menu.shouldShow
45
+ }
46
+
47
+ @computed private get manager(): DataTableFilterDropdownManager {
48
+ return this.props.manager
49
+ }
50
+
51
+ @computed private get selectionArray(): SelectionArray {
52
+ return makeSelectionArray(this.manager.dataTableSelection)
53
+ }
54
+
55
+ @computed private get shouldShow(): boolean {
56
+ return (
57
+ !!this.manager.isOnTableTab &&
58
+ this.options.length > 1 &&
59
+ this.options[0].count !== this.options[1].count &&
60
+ !this.manager.isSemiNarrow
61
+ )
62
+ }
63
+
64
+ @computed private get availableEntityNameSet(): Set<EntityName> {
65
+ return this.manager.tableForDisplay.availableEntityNameSet
66
+ }
67
+
68
+ @action.bound private onChange(selected: DropdownOption | null): void {
69
+ if (selected?.value) {
70
+ this.manager.dataTableConfig.filter = selected.value
71
+ this.manager.dataTableConfig.search = ""
72
+ }
73
+ }
74
+
75
+ @computed
76
+ private get shouldShowSelectionOption(): boolean {
77
+ return (
78
+ !this.manager.shouldShowSelectionOnlyInDataTable &&
79
+ this.selectionArray.hasSelection &&
80
+ !!this.manager.canChangeAddOrHighlightEntities
81
+ )
82
+ }
83
+
84
+ @computed private get options(): DropdownOption[] {
85
+ const options: DropdownOption[] = [
86
+ {
87
+ value: "all",
88
+ label: "All",
89
+ count: this.availableEntityNameSet.size,
90
+ trackNote: "data_table_filter_by",
91
+ },
92
+ ]
93
+
94
+ if (this.shouldShowSelectionOption) {
95
+ options.push({
96
+ value: "selection",
97
+ label: "Selection",
98
+ count: this.selectionArray.numSelectedEntities,
99
+ trackNote: "data_table_filter_by",
100
+ })
101
+ }
102
+
103
+ if (this.manager.entityRegionTypeGroups) {
104
+ options.push(
105
+ ...this.manager.entityRegionTypeGroups
106
+ .map(
107
+ ({ regionType, entityNames }) =>
108
+ ({
109
+ value: regionType,
110
+ label: entityRegionTypeLabels[regionType],
111
+ count: entityNames.filter((entityName) =>
112
+ this.availableEntityNameSet.has(entityName)
113
+ ).length,
114
+ trackNote: "data_table_filter_by",
115
+ }) satisfies DropdownOption
116
+ )
117
+ .filter(({ count }) => count > 0)
118
+ )
119
+ }
120
+
121
+ return options
122
+ }
123
+
124
+ @computed private get value(): DropdownOption | null {
125
+ const { filter } = this.props.manager.dataTableConfig
126
+ return (
127
+ this.options.find((option) => filter === option.value) ??
128
+ this.options[0]
129
+ )
130
+ }
131
+
132
+ override render(): React.ReactElement | null {
133
+ if (!this.shouldShow) return null
134
+
135
+ return (
136
+ <Dropdown<DropdownOption>
137
+ className="data-table-filter-dropdown"
138
+ menuClassName="data-table-filter-dropdown-menu"
139
+ options={this.options}
140
+ onChange={this.onChange}
141
+ value={this.value}
142
+ renderTriggerValue={renderFilterTriggerValue}
143
+ renderMenuOption={renderFilterMenuOption}
144
+ aria-label="Filter by"
145
+ />
146
+ )
147
+ }
148
+ }
149
+
150
+ function renderFilterTriggerValue(
151
+ option: DropdownOption | null
152
+ ): React.ReactNode | undefined {
153
+ if (!option) return undefined
154
+ return (
155
+ <>
156
+ <span className="label">Filter by: </span>
157
+ {option.label} <span className="detail">({option.count})</span>
158
+ </>
159
+ )
160
+ }
161
+
162
+ function renderFilterMenuOption(option: DropdownOption): React.ReactNode {
163
+ return (
164
+ <>
165
+ {option.label} <span className="detail">({option.count})</span>
166
+ </>
167
+ )
168
+ }
@@ -0,0 +1,3 @@
1
+ .data-table-search-field {
2
+ flex: 0 1 208px;
3
+ }
@@ -0,0 +1,76 @@
1
+ import * as React from "react"
2
+ import { computed, makeObservable } from "mobx"
3
+ import { observer } from "mobx-react"
4
+ import a from "indefinite"
5
+ import { DataTableConfig } from "../dataTable/DataTableConstants"
6
+ import { SearchField } from "./SearchField"
7
+ import { DEFAULT_GRAPHER_ENTITY_TYPE } from "../core/GrapherConstants"
8
+ import { isAggregateSource } from "../core/EntitiesByRegionType"
9
+ import { match } from "ts-pattern"
10
+
11
+ export interface DataTableSearchFieldManager {
12
+ dataTableConfig: DataTableConfig
13
+ isOnTableTab?: boolean
14
+ entityType?: string
15
+ }
16
+
17
+ @observer
18
+ export class DataTableSearchField extends React.Component<{
19
+ manager: DataTableSearchFieldManager
20
+ }> {
21
+ constructor(props: { manager: DataTableSearchFieldManager }) {
22
+ super(props)
23
+ makeObservable(this)
24
+ }
25
+
26
+ static shouldShow(manager: DataTableSearchFieldManager): boolean {
27
+ const menu = new DataTableSearchField({ manager })
28
+ return menu.shouldShow
29
+ }
30
+
31
+ @computed private get manager(): DataTableSearchFieldManager {
32
+ return this.props.manager
33
+ }
34
+
35
+ @computed private get config(): DataTableConfig {
36
+ return this.manager.dataTableConfig
37
+ }
38
+
39
+ @computed private get shouldShow(): boolean {
40
+ return !!this.manager.isOnTableTab
41
+ }
42
+
43
+ @computed private get entityType(): string {
44
+ return this.manager.entityType ?? DEFAULT_GRAPHER_ENTITY_TYPE
45
+ }
46
+
47
+ @computed private get placeholderEntityType(): string {
48
+ if (isAggregateSource(this.config.filter)) return "region"
49
+
50
+ return match(this.config.filter)
51
+ .with("all", () => this.entityType)
52
+ .with("selection", () => this.entityType)
53
+ .with("countries", () => "country")
54
+ .with("continents", () => "continent")
55
+ .with("incomeGroups", () => "income group")
56
+ .with("historicalCountries", () => "country or region")
57
+ .exhaustive()
58
+ }
59
+
60
+ override render(): React.ReactElement | null {
61
+ if (!this.shouldShow) return null
62
+
63
+ return (
64
+ <SearchField
65
+ className="data-table-search-field"
66
+ value={this.manager.dataTableConfig.search}
67
+ onChange={(value) =>
68
+ (this.manager.dataTableConfig.search = value)
69
+ }
70
+ onClear={() => (this.manager.dataTableConfig.search = "")}
71
+ trackNote="data_table_search"
72
+ placeholder={`Search for ${a(this.placeholderEntityType)}`}
73
+ />
74
+ )
75
+ }
76
+ }