@hisptz/dhis2-analytics 2.0.0-alpha.1 → 2.0.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/dist/components/ChartAnalytics/ChartAnalytics.stories.js +43 -20
- package/dist/components/ChartAnalytics/DHIS2Chart.js +43 -17
- package/dist/components/ChartAnalytics/components/DownloadMenu/components/Menu.js +16 -14
- package/dist/components/ChartAnalytics/components/DownloadMenu/constants/menu.js +14 -8
- package/dist/components/ChartAnalytics/components/DownloadMenu/index.js +21 -19
- package/dist/components/ChartAnalytics/components/DownloadMenu/interfaces/menu.js +1 -0
- package/dist/components/ChartAnalytics/hooks/useChart.js +12 -10
- package/dist/components/ChartAnalytics/index.js +12 -1
- package/dist/components/ChartAnalytics/models/bar.js +6 -3
- package/dist/components/ChartAnalytics/models/column.js +9 -6
- package/dist/components/ChartAnalytics/models/index.js +3 -1
- package/dist/components/ChartAnalytics/models/line.js +8 -6
- package/dist/components/ChartAnalytics/models/multi-series.js +14 -12
- package/dist/components/ChartAnalytics/models/pie.js +7 -5
- package/dist/components/ChartAnalytics/services/export.js +20 -7
- package/dist/components/ChartAnalytics/types/props.js +1 -0
- package/dist/components/ChartAnalytics/utils/chart.js +31 -24
- package/dist/components/CircularProgressDashboard/CircularProgressIndicator.js +23 -14
- package/dist/components/CircularProgressDashboard/CircularProgressIndicator.stories.js +10 -3
- package/dist/components/CircularProgressDashboard/index.js +19 -2
- package/dist/components/CircularProgressDashboard/types/props.js +1 -0
- package/dist/components/DHIS2PivotTable/DHIS2PivotTable.js +15 -13
- package/dist/components/DHIS2PivotTable/DHIS2PivotTable.stories.js +14 -5
- package/dist/components/DHIS2PivotTable/components/Table/index.js +6 -4
- package/dist/components/DHIS2PivotTable/components/TableBody/index.js +31 -25
- package/dist/components/DHIS2PivotTable/components/TableHeaders/index.js +30 -24
- package/dist/components/DHIS2PivotTable/index.js +19 -2
- package/dist/components/DHIS2PivotTable/interfaces/index.js +1 -0
- package/dist/components/DHIS2PivotTable/services/engine.js +12 -10
- package/dist/components/DHIS2PivotTable/state/engine.js +9 -6
- package/dist/components/Map/DHIS2Map.js +20 -13
- package/dist/components/Map/DHIS2Map.stories.js +17 -3
- package/dist/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfigModal.js +21 -15
- package/dist/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfigModal.stories.js +15 -10
- package/dist/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfiguration.js +18 -16
- package/dist/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfiguration.stories.js +12 -7
- package/dist/components/Map/components/EarthEngineLayerConfiguration/components/AggregationSelector.js +30 -24
- package/dist/components/Map/components/EarthEngineLayerConfiguration/components/ColorConfig.js +49 -42
- package/dist/components/Map/components/EarthEngineLayerConfiguration/components/Name.js +22 -16
- package/dist/components/Map/components/EarthEngineLayerConfiguration/components/PeriodSelector.js +32 -26
- package/dist/components/Map/components/EarthEngineLayerConfiguration/components/StylesConfig.js +16 -10
- package/dist/components/Map/components/EarthEngineLayerConfiguration/components/TypeField.js +27 -21
- package/dist/components/Map/components/EarthEngineLayerConfiguration/hooks/data.js +18 -15
- package/dist/components/Map/components/EarthEngineLayerConfiguration/index.js +19 -2
- package/dist/components/Map/components/MapArea/index.js +41 -32
- package/dist/components/Map/components/MapArea/interfaces/index.js +1 -0
- package/dist/components/Map/components/MapControls/components/CustomControl/index.js +5 -3
- package/dist/components/Map/components/MapControls/components/DownloadControl/index.js +14 -8
- package/dist/components/Map/components/MapControls/components/FullscreenControl/index.js +9 -7
- package/dist/components/Map/components/MapControls/index.js +17 -10
- package/dist/components/Map/components/MapLayer/components/BoundaryLayer/hooks/useBoundaryData.js +5 -3
- package/dist/components/Map/components/MapLayer/components/BoundaryLayer/index.js +31 -21
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/components/EarthEngineLegend.js +31 -21
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/constants/index.js +88 -80
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/hooks/index.js +14 -9
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/index.js +69 -62
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/interfaces/index.js +1 -0
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/services/api.js +3 -1
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/services/engine.js +41 -19
- package/dist/components/Map/components/MapLayer/components/GoogleEngineLayer/utils/index.js +9 -1
- package/dist/components/Map/components/MapLayer/components/LegendArea/components/LegendCardHeader/index.js +8 -6
- package/dist/components/Map/components/MapLayer/components/LegendArea/index.js +57 -46
- package/dist/components/Map/components/MapLayer/components/PointLayer/components/PointLegend/index.js +31 -25
- package/dist/components/Map/components/MapLayer/components/PointLayer/hooks/index.js +7 -5
- package/dist/components/Map/components/MapLayer/components/PointLayer/index.js +28 -21
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubble.js +12 -10
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubbles.js +32 -21
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/index.js +20 -13
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/index.js +23 -17
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/Choropleth/components/ChoroplethLegend.js +27 -18
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/Choropleth/index.js +19 -13
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/components/CustomTooltip/index.js +21 -15
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/hooks/config.js +8 -6
- package/dist/components/Map/components/MapLayer/components/ThematicLayer/index.js +24 -16
- package/dist/components/Map/components/MapLayer/index.js +18 -10
- package/dist/components/Map/components/MapLayer/interfaces/index.js +3 -1
- package/dist/components/Map/components/MapProvider/components/MapLayerProvider/hooks/index.js +63 -59
- package/dist/components/Map/components/MapProvider/components/MapLayerProvider/index.js +36 -30
- package/dist/components/Map/components/MapProvider/hooks/index.js +10 -6
- package/dist/components/Map/components/MapProvider/index.js +31 -25
- package/dist/components/Map/components/MapUpdater/index.js +7 -5
- package/dist/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfigModal.js +21 -15
- package/dist/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfigModal.stories.js +10 -5
- package/dist/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfiguration.js +60 -53
- package/dist/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfiguration.stories.js +12 -7
- package/dist/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/components/ColorScale/index.js +15 -9
- package/dist/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/constants/colors.js +4 -1
- package/dist/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/index.js +30 -22
- package/dist/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/utils/colors.js +18 -7
- package/dist/components/Map/components/ThematicLayerConfiguration/components/CustomLegend/index.js +30 -23
- package/dist/components/Map/components/ThematicLayerConfiguration/components/IndicatorSelectorModal/index.js +22 -16
- package/dist/components/Map/components/ThematicLayerConfiguration/components/LegendSetSelector/index.js +22 -16
- package/dist/components/Map/components/ThematicLayerConfiguration/components/RadiusField.js +22 -16
- package/dist/components/Map/components/ThematicLayerConfiguration/components/TypeField.js +24 -18
- package/dist/components/Map/components/ThematicLayerConfiguration/index.js +26 -3
- package/dist/components/Map/components/ThematicLayerConfiguration/types/index.js +1 -0
- package/dist/components/Map/constants/colors.js +4 -1
- package/dist/components/Map/constants/legendSet.js +3 -1
- package/dist/components/Map/hooks/map.js +21 -17
- package/dist/components/Map/index.js +40 -5
- package/dist/components/Map/interfaces/index.js +1 -0
- package/dist/components/Map/state/index.js +9 -5
- package/dist/components/Map/utils/colors.js +19 -7
- package/dist/components/Map/utils/helpers.js +11 -3
- package/dist/components/Map/utils/map.js +23 -13
- package/dist/components/SingleValueContainer/SingleValueContainer.stories.js +11 -3
- package/dist/components/SingleValueContainer/SingleValueVisualizer.js +35 -17
- package/dist/components/SingleValueContainer/components/SingleValueItem/SingleValueItem.js +21 -14
- package/dist/components/SingleValueContainer/components/SingleValueItem/SingleValuePercentage.js +13 -7
- package/dist/components/SingleValueContainer/index.js +26 -3
- package/dist/components/SingleValueContainer/types/props.js +1 -0
- package/dist/components/Visualization/components/AnalyticsDataProvider/index.js +23 -20
- package/dist/components/Visualization/components/DimensionsProvider/index.js +18 -13
- package/dist/components/Visualization/components/LayoutProvider/index.js +11 -7
- package/dist/components/Visualization/components/VisualizationDimensionSelector/index.js +36 -30
- package/dist/components/Visualization/components/VisualizationProvider/index.js +9 -7
- package/dist/components/Visualization/components/VisualizationSelector/index.js +57 -46
- package/dist/components/Visualization/components/VisualizationTypeProvider/index.js +18 -11
- package/dist/components/Visualization/components/VisualizationTypeSelector/index.js +27 -21
- package/dist/components/Visualization/index.js +33 -27
- package/dist/esm/components/ChartAnalytics/ChartAnalytics.stories.js +254 -0
- package/dist/esm/components/ChartAnalytics/ChartAnalytics.stories.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/DHIS2Chart.js +36 -0
- package/dist/esm/components/ChartAnalytics/DHIS2Chart.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/components/Menu.js +52 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/components/Menu.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/constants/menu.js +42 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/constants/menu.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/index.js +65 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/index.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/interfaces/menu.js +3 -0
- package/dist/esm/components/ChartAnalytics/components/DownloadMenu/interfaces/menu.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/hooks/useChart.js +43 -0
- package/dist/esm/components/ChartAnalytics/hooks/useChart.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/index.js +3 -0
- package/dist/esm/components/ChartAnalytics/index.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/models/bar.js +21 -0
- package/dist/esm/components/ChartAnalytics/models/bar.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/models/column.js +48 -0
- package/dist/esm/components/ChartAnalytics/models/column.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/models/index.js +114 -0
- package/dist/esm/components/ChartAnalytics/models/index.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/models/line.js +31 -0
- package/dist/esm/components/ChartAnalytics/models/line.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/models/multi-series.js +112 -0
- package/dist/esm/components/ChartAnalytics/models/multi-series.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/models/pie.js +53 -0
- package/dist/esm/components/ChartAnalytics/models/pie.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/services/export.js +35 -0
- package/dist/esm/components/ChartAnalytics/services/export.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/styles/custom-highchart.css +40 -0
- package/dist/esm/components/ChartAnalytics/styles/custom-highchart.css.map +1 -0
- package/dist/esm/components/ChartAnalytics/types/props.js +3 -0
- package/dist/esm/components/ChartAnalytics/types/props.js.map +1 -0
- package/dist/esm/components/ChartAnalytics/utils/chart.js +130 -0
- package/dist/esm/components/ChartAnalytics/utils/chart.js.map +1 -0
- package/dist/esm/components/CircularProgressDashboard/CircularProgressIndicator.js +66 -0
- package/dist/esm/components/CircularProgressDashboard/CircularProgressIndicator.js.map +1 -0
- package/dist/esm/components/CircularProgressDashboard/CircularProgressIndicator.stories.js +42 -0
- package/dist/esm/components/CircularProgressDashboard/CircularProgressIndicator.stories.js.map +1 -0
- package/dist/esm/components/CircularProgressDashboard/index.js +4 -0
- package/dist/esm/components/CircularProgressDashboard/index.js.map +1 -0
- package/dist/esm/components/CircularProgressDashboard/types/props.js +3 -0
- package/dist/esm/components/CircularProgressDashboard/types/props.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/DHIS2PivotTable.js +26 -0
- package/dist/esm/components/DHIS2PivotTable/DHIS2PivotTable.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/DHIS2PivotTable.stories.js +30 -0
- package/dist/esm/components/DHIS2PivotTable/DHIS2PivotTable.stories.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/components/Table/index.js +10 -0
- package/dist/esm/components/DHIS2PivotTable/components/Table/index.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableBody/TableBody.module.css +11 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableBody/TableBody.module.css.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableBody/index.js +106 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableBody/index.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableHeaders/TableHeaders.module.css +10 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableHeaders/TableHeaders.module.css.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableHeaders/index.js +94 -0
- package/dist/esm/components/DHIS2PivotTable/components/TableHeaders/index.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/index.js +4 -0
- package/dist/esm/components/DHIS2PivotTable/index.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/interfaces/index.js +3 -0
- package/dist/esm/components/DHIS2PivotTable/interfaces/index.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/services/engine.js +87 -0
- package/dist/esm/components/DHIS2PivotTable/services/engine.js.map +1 -0
- package/dist/esm/components/DHIS2PivotTable/state/engine.js +17 -0
- package/dist/esm/components/DHIS2PivotTable/state/engine.js.map +1 -0
- package/dist/esm/components/Map/DHIS2Map.js +65 -0
- package/dist/esm/components/Map/DHIS2Map.js.map +1 -0
- package/dist/esm/components/Map/DHIS2Map.stories.js +366 -0
- package/dist/esm/components/Map/DHIS2Map.stories.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfigModal.js +41 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfigModal.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfigModal.stories.js +34 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfigModal.stories.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfiguration.js +26 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfiguration.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfiguration.stories.js +21 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/EarthEngineLayerConfiguration.stories.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/AggregationSelector.js +67 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/AggregationSelector.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/ColorConfig.js +134 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/ColorConfig.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/Name.js +44 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/Name.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/PeriodSelector.js +67 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/PeriodSelector.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/StylesConfig.js +24 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/StylesConfig.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/TypeField.js +67 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/components/TypeField.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/hooks/data.js +45 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/hooks/data.js.map +1 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/index.js +4 -0
- package/dist/esm/components/Map/components/EarthEngineLayerConfiguration/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapArea/index.js +100 -0
- package/dist/esm/components/Map/components/MapArea/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapArea/interfaces/index.js +3 -0
- package/dist/esm/components/Map/components/MapArea/interfaces/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapControls/components/CustomControl/index.js +16 -0
- package/dist/esm/components/Map/components/MapControls/components/CustomControl/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapControls/components/DownloadControl/index.js +15 -0
- package/dist/esm/components/Map/components/MapControls/components/DownloadControl/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapControls/components/FullscreenControl/index.js +13 -0
- package/dist/esm/components/Map/components/MapControls/components/FullscreenControl/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapControls/index.js +35 -0
- package/dist/esm/components/Map/components/MapControls/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/BoundaryLayer/hooks/useBoundaryData.js +10 -0
- package/dist/esm/components/Map/components/MapLayer/components/BoundaryLayer/hooks/useBoundaryData.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/BoundaryLayer/index.js +52 -0
- package/dist/esm/components/Map/components/MapLayer/components/BoundaryLayer/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/components/EarthEngineLegend.js +100 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/components/EarthEngineLegend.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/constants/index.js +457 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/constants/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/hooks/index.js +32 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/hooks/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/index.js +197 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/interfaces/index.js +3 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/interfaces/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/services/api.js +31466 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/services/api.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/services/engine.js +365 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/services/engine.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/utils/index.js +93 -0
- package/dist/esm/components/Map/components/MapLayer/components/GoogleEngineLayer/utils/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/LegendArea/LegendArea.module.css +10 -0
- package/dist/esm/components/Map/components/MapLayer/components/LegendArea/LegendArea.module.css.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/LegendArea/components/LegendCardHeader/index.js +17 -0
- package/dist/esm/components/Map/components/MapLayer/components/LegendArea/components/LegendCardHeader/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/LegendArea/index.js +179 -0
- package/dist/esm/components/Map/components/MapLayer/components/LegendArea/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/PointLayer/components/PointLegend/index.js +92 -0
- package/dist/esm/components/Map/components/MapLayer/components/PointLayer/components/PointLegend/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/PointLayer/hooks/index.js +11 -0
- package/dist/esm/components/Map/components/MapLayer/components/PointLayer/hooks/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/PointLayer/index.js +48 -0
- package/dist/esm/components/Map/components/MapLayer/components/PointLayer/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubble.js +64 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubble.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubbles.js +130 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubbles.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/index.js +41 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/index.js +50 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Choropleth/components/ChoroplethLegend.js +56 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Choropleth/components/ChoroplethLegend.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Choropleth/index.js +40 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/Choropleth/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/CustomTooltip/index.js +40 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/components/CustomTooltip/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/hooks/config.js +12 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/hooks/config.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/index.js +55 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/styles/legends.css +56 -0
- package/dist/esm/components/Map/components/MapLayer/components/ThematicLayer/styles/legends.css.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/index.js +32 -0
- package/dist/esm/components/Map/components/MapLayer/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapLayer/interfaces/index.js +10 -0
- package/dist/esm/components/Map/components/MapLayer/interfaces/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapProvider/components/MapLayerProvider/hooks/index.js +405 -0
- package/dist/esm/components/Map/components/MapProvider/components/MapLayerProvider/hooks/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapProvider/components/MapLayerProvider/index.js +115 -0
- package/dist/esm/components/Map/components/MapProvider/components/MapLayerProvider/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapProvider/hooks/index.js +16 -0
- package/dist/esm/components/Map/components/MapProvider/hooks/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapProvider/index.js +95 -0
- package/dist/esm/components/Map/components/MapProvider/index.js.map +1 -0
- package/dist/esm/components/Map/components/MapUpdater/index.js +11 -0
- package/dist/esm/components/Map/components/MapUpdater/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfigModal.js +41 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfigModal.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfigModal.stories.js +24 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfigModal.stories.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfiguration.js +174 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfiguration.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfiguration.stories.js +21 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/ThematicLayerConfiguration.stories.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/components/ColorScale/index.js +36 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/components/ColorScale/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/constants/colors.js +436 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/constants/colors.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/index.js +71 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/styles/ColorScale.module.css +15 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/styles/ColorScale.module.css.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/styles/ColorScaleSelect.module.css +12 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/styles/ColorScaleSelect.module.css.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/utils/colors.js +82 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/ColorScaleSelect/utils/colors.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/CustomLegend/index.js +57 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/CustomLegend/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/IndicatorSelectorModal/index.js +44 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/IndicatorSelectorModal/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/LegendSetSelector/index.js +60 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/LegendSetSelector/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/RadiusField.js +54 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/RadiusField.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/TypeField.js +63 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/components/TypeField.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/index.js +5 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/index.js.map +1 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/types/index.js +3 -0
- package/dist/esm/components/Map/components/ThematicLayerConfiguration/types/index.js.map +1 -0
- package/dist/esm/components/Map/constants/colors.js +436 -0
- package/dist/esm/components/Map/constants/colors.js.map +1 -0
- package/dist/esm/components/Map/constants/legendSet.js +23 -0
- package/dist/esm/components/Map/constants/legendSet.js.map +1 -0
- package/dist/esm/components/Map/hooks/map.js +44 -0
- package/dist/esm/components/Map/hooks/map.js.map +1 -0
- package/dist/esm/components/Map/index.js +7 -0
- package/dist/esm/components/Map/index.js.map +1 -0
- package/dist/esm/components/Map/interfaces/index.js +3 -0
- package/dist/esm/components/Map/interfaces/index.js.map +1 -0
- package/dist/esm/components/Map/state/index.js +18 -0
- package/dist/esm/components/Map/state/index.js.map +1 -0
- package/dist/esm/components/Map/utils/colors.js +85 -0
- package/dist/esm/components/Map/utils/colors.js.map +1 -0
- package/dist/esm/components/Map/utils/helpers.js +18 -0
- package/dist/esm/components/Map/utils/helpers.js.map +1 -0
- package/dist/esm/components/Map/utils/map.js +138 -0
- package/dist/esm/components/Map/utils/map.js.map +1 -0
- package/dist/esm/components/SingleValueContainer/SingleValueContainer.stories.js +145 -0
- package/dist/esm/components/SingleValueContainer/SingleValueContainer.stories.js.map +1 -0
- package/dist/esm/components/SingleValueContainer/SingleValueVisualizer.js +44 -0
- package/dist/esm/components/SingleValueContainer/SingleValueVisualizer.js.map +1 -0
- package/dist/esm/components/SingleValueContainer/components/SingleValueItem/SingleValueItem.js +49 -0
- package/dist/esm/components/SingleValueContainer/components/SingleValueItem/SingleValueItem.js.map +1 -0
- package/dist/esm/components/SingleValueContainer/components/SingleValueItem/SingleValuePercentage.js +22 -0
- package/dist/esm/components/SingleValueContainer/components/SingleValueItem/SingleValuePercentage.js.map +1 -0
- package/dist/esm/components/SingleValueContainer/index.js +5 -0
- package/dist/esm/components/SingleValueContainer/index.js.map +1 -0
- package/dist/esm/components/SingleValueContainer/styles/SingleValueContainer.module.css +32 -0
- package/dist/esm/components/SingleValueContainer/styles/SingleValueContainer.module.css.map +1 -0
- package/dist/esm/components/SingleValueContainer/types/props.js +3 -0
- package/dist/esm/components/SingleValueContainer/types/props.js.map +1 -0
- package/dist/esm/components/Visualization/components/AnalyticsDataProvider/index.js +94 -0
- package/dist/esm/components/Visualization/components/AnalyticsDataProvider/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/DimensionsProvider/index.js +35 -0
- package/dist/esm/components/Visualization/components/DimensionsProvider/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/LayoutProvider/index.js +18 -0
- package/dist/esm/components/Visualization/components/LayoutProvider/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/VisualizationDimensionSelector/index.js +85 -0
- package/dist/esm/components/Visualization/components/VisualizationDimensionSelector/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/VisualizationProvider/index.js +19 -0
- package/dist/esm/components/Visualization/components/VisualizationProvider/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/VisualizationSelector/index.js +167 -0
- package/dist/esm/components/Visualization/components/VisualizationSelector/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/VisualizationTypeProvider/index.js +27 -0
- package/dist/esm/components/Visualization/components/VisualizationTypeProvider/index.js.map +1 -0
- package/dist/esm/components/Visualization/components/VisualizationTypeSelector/index.js +55 -0
- package/dist/esm/components/Visualization/components/VisualizationTypeSelector/index.js.map +1 -0
- package/dist/esm/components/Visualization/index.js +113 -0
- package/dist/esm/components/Visualization/index.js.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/index.js +47 -6
- package/package.json +5 -6
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { IconLegend24, Portal, Popper, colors } from '@dhis2/ui';
|
|
3
|
+
import { compact, head } from 'lodash';
|
|
4
|
+
import React, { useState, useRef, useEffect } from 'react';
|
|
5
|
+
import { CustomControl } from '../../../MapControls/components/CustomControl/index.js';
|
|
6
|
+
import { SUPPORTED_EARTH_ENGINE_LAYERS } from '../../interfaces/index.js';
|
|
7
|
+
import PointLegend from '../PointLayer/components/PointLegend/index.js';
|
|
8
|
+
import BubbleLegend from '../ThematicLayer/components/Bubble/components/BubbleLegend/index.js';
|
|
9
|
+
import ChoroplethLegend from '../ThematicLayer/components/Choropleth/components/ChoroplethLegend.js';
|
|
10
|
+
import EarthEngineLegend from '../GoogleEngineLayer/components/EarthEngineLegend.js';
|
|
11
|
+
import classes from './LegendArea.module.css';
|
|
12
|
+
import { usePrintMedia } from '../../../../hooks/map.js';
|
|
13
|
+
|
|
14
|
+
const TOOLTIP_OFFSET = 4;
|
|
15
|
+
function getLegendComponent(layer) {
|
|
16
|
+
if (layer.type === "point") {
|
|
17
|
+
return /* @__PURE__ */ jsx(PointLegend, { name: layer.label });
|
|
18
|
+
}
|
|
19
|
+
if (SUPPORTED_EARTH_ENGINE_LAYERS.includes(layer.type)) {
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
EarthEngineLegend,
|
|
22
|
+
{
|
|
23
|
+
name: layer.name ?? "",
|
|
24
|
+
layer
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
const { type, enabled, control, dataItem, name, data, legends } = layer ?? {};
|
|
29
|
+
if (!enabled || !control) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
switch (type) {
|
|
33
|
+
case "bubble":
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
BubbleLegend,
|
|
36
|
+
{
|
|
37
|
+
radius: layer?.radius ?? {
|
|
38
|
+
min: 0,
|
|
39
|
+
max: 50
|
|
40
|
+
},
|
|
41
|
+
legends: legends ?? [],
|
|
42
|
+
name: name ?? dataItem.displayName,
|
|
43
|
+
data,
|
|
44
|
+
dataItem: head(data)?.dataItem ?? dataItem
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
case "choropleth":
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
ChoroplethLegend,
|
|
50
|
+
{
|
|
51
|
+
legends: legends ?? [],
|
|
52
|
+
name: name ?? dataItem.displayName,
|
|
53
|
+
data,
|
|
54
|
+
dataItem: head(data)?.dataItem ?? dataItem
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function CollapsedLegendIcon({
|
|
60
|
+
onCollapse,
|
|
61
|
+
name
|
|
62
|
+
}) {
|
|
63
|
+
const openDelay = 200;
|
|
64
|
+
const closeDelay = 200;
|
|
65
|
+
const [openTooltip, setOpenTooltip] = useState(false);
|
|
66
|
+
const openTimerRef = useRef(null);
|
|
67
|
+
const closeTimerRef = useRef(null);
|
|
68
|
+
const ref = useRef(null);
|
|
69
|
+
const hideModifier = { name: "hide" };
|
|
70
|
+
const offsetModifier = {
|
|
71
|
+
name: "offset",
|
|
72
|
+
options: {
|
|
73
|
+
offset: [0, TOOLTIP_OFFSET]
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const flipModifier = {
|
|
77
|
+
name: "flip",
|
|
78
|
+
options: { altBoundary: true }
|
|
79
|
+
};
|
|
80
|
+
const onMouseOver = () => {
|
|
81
|
+
clearTimeout(closeTimerRef.current);
|
|
82
|
+
openTimerRef.current = setTimeout(() => {
|
|
83
|
+
setOpenTooltip(true);
|
|
84
|
+
}, openDelay);
|
|
85
|
+
};
|
|
86
|
+
const onMouseOut = () => {
|
|
87
|
+
clearTimeout(openTimerRef.current);
|
|
88
|
+
closeTimerRef.current = setTimeout(() => {
|
|
89
|
+
setOpenTooltip(false);
|
|
90
|
+
}, closeDelay);
|
|
91
|
+
};
|
|
92
|
+
useEffect(
|
|
93
|
+
() => () => {
|
|
94
|
+
clearTimeout(openTimerRef.current);
|
|
95
|
+
clearTimeout(closeTimerRef.current);
|
|
96
|
+
},
|
|
97
|
+
[]
|
|
98
|
+
);
|
|
99
|
+
return /* @__PURE__ */ jsxs(
|
|
100
|
+
"div",
|
|
101
|
+
{
|
|
102
|
+
ref,
|
|
103
|
+
onMouseOver,
|
|
104
|
+
onMouseOut,
|
|
105
|
+
onClick: onCollapse,
|
|
106
|
+
style: { width: 28, height: 28 },
|
|
107
|
+
className: "legend-card collapsed",
|
|
108
|
+
children: [
|
|
109
|
+
/* @__PURE__ */ jsx(IconLegend24, {}),
|
|
110
|
+
openTooltip && /* @__PURE__ */ jsx(
|
|
111
|
+
Portal,
|
|
112
|
+
{
|
|
113
|
+
className: classes["map-tooltip"],
|
|
114
|
+
children: /* @__PURE__ */ jsx(
|
|
115
|
+
Popper,
|
|
116
|
+
{
|
|
117
|
+
className: classes["map-tooltip"],
|
|
118
|
+
reference: ref,
|
|
119
|
+
modifiers: [offsetModifier, flipModifier, hideModifier],
|
|
120
|
+
children: /* @__PURE__ */ jsx(
|
|
121
|
+
"div",
|
|
122
|
+
{
|
|
123
|
+
style: {
|
|
124
|
+
backgroundColor: `${colors.grey900}`,
|
|
125
|
+
borderRadius: 3,
|
|
126
|
+
color: `${colors.white}`,
|
|
127
|
+
padding: "4px 6px"
|
|
128
|
+
},
|
|
129
|
+
"data-test": `content`,
|
|
130
|
+
children: name
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function Legend({
|
|
142
|
+
children,
|
|
143
|
+
collapsible
|
|
144
|
+
}) {
|
|
145
|
+
const [collapsed, setCollapsed] = useState(collapsible);
|
|
146
|
+
const inPrintMode = usePrintMedia();
|
|
147
|
+
const onCollapse = () => {
|
|
148
|
+
if (collapsible) {
|
|
149
|
+
setCollapsed((prevState) => !prevState);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const name = head(React.Children.toArray(children))?.props.name;
|
|
153
|
+
const shouldCollapse = collapsed && !inPrintMode;
|
|
154
|
+
return /* @__PURE__ */ jsx("div", { className: "w-100", children: shouldCollapse ? /* @__PURE__ */ jsx(CollapsedLegendIcon, { name, onCollapse }) : React.Children.map(
|
|
155
|
+
children,
|
|
156
|
+
(child) => React.cloneElement(child, { collapsible, onCollapse })
|
|
157
|
+
) });
|
|
158
|
+
}
|
|
159
|
+
function LegendArea({
|
|
160
|
+
layers,
|
|
161
|
+
legends: legendConfig
|
|
162
|
+
}) {
|
|
163
|
+
const legends = compact(
|
|
164
|
+
layers.filter((layer) => layer.enabled).map(getLegendComponent)
|
|
165
|
+
);
|
|
166
|
+
const { position, collapsible } = legendConfig ?? {};
|
|
167
|
+
return /* @__PURE__ */ jsx(CustomControl, { position, children: /* @__PURE__ */ jsx("div", { className: "column gap-16 align-items-end", children: legends?.map((legend, index) => /* @__PURE__ */ jsx(
|
|
168
|
+
Legend,
|
|
169
|
+
{
|
|
170
|
+
collapsible: collapsible ?? true,
|
|
171
|
+
children: legend
|
|
172
|
+
},
|
|
173
|
+
`${index}-map-legend`
|
|
174
|
+
)) }) });
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { LegendArea as default };
|
|
178
|
+
//# sourceMappingURL=out.js.map
|
|
179
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/components/Map/components/MapLayer/components/LegendArea/index.tsx"],"names":[],"mappings":"AA0BS,cAkGP,YAlGO;AA1BT,SAAS,QAAQ,cAAc,QAAQ,cAAc;AAErD,SAAS,SAAS,YAAY;AAC9B,OAAO,SAAS,WAAW,QAAQ,gBAAgB;AAEnD,SAAS,qBAAqB;AAC9B;AAAA,EAKC;AAAA,OACM;AACP,OAAO,iBAAiB;AACxB,OAAO,kBAAkB;AACzB,OAAO,sBAAsB;AAC7B,OAAO,uBAAuB;AAC9B,OAAO,aAAa;AACpB,SAAS,qBAAqB;AAE9B,MAAM,iBAAiB;AAEvB,SAAS,mBACR,OACC;AACD,MAAI,MAAM,SAAS,SAAS;AAC3B,WAAO,oBAAC,eAAY,MAAM,MAAM,OAAO;AAAA,EACxC;AAEA,MAAI,8BAA8B,SAAS,MAAM,IAAI,GAAG;AACvD,WACC;AAAA,MAAC;AAAA;AAAA,QACA,MAAM,MAAM,QAAQ;AAAA,QACpB;AAAA;AAAA,IACD;AAAA,EAEF;AAEA,QAAM,EAAE,MAAM,SAAS,SAAS,UAAU,MAAM,MAAM,QAAQ,IAC5D,SAAiC,CAAC;AAEpC,MAAI,CAAC,WAAW,CAAC,SAAS;AACzB,WAAO;AAAA,EACR;AACA,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aACC;AAAA,QAAC;AAAA;AAAA,UACA,QACE,OAA6B,UAAU;AAAA,YACvC,KAAK;AAAA,YACL,KAAK;AAAA,UACN;AAAA,UAED,SAAS,WAAW,CAAC;AAAA,UACrB,MAAM,QAAQ,SAAS;AAAA,UACvB;AAAA,UACA,UAAU,KAAK,IAAI,GAAG,YAAY;AAAA;AAAA,MACnC;AAAA,IAEF,KAAK;AACJ,aACC;AAAA,QAAC;AAAA;AAAA,UACA,SAAS,WAAW,CAAC;AAAA,UACrB,MAAM,QAAQ,SAAS;AAAA,UACvB;AAAA,UACA,UAAU,KAAK,IAAI,GAAG,YAAY;AAAA;AAAA,MACnC;AAAA,EAEH;AACD;AAEA,SAAS,oBAAoB;AAAA,EAC5B;AAAA,EACA;AACD,GAGG;AACF,QAAM,YAAY;AAClB,QAAM,aAAa;AACnB,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,eAAe,OAAY,IAAI;AACrC,QAAM,gBAAgB,OAAY,IAAI;AACtC,QAAM,MAAM,OAAuB,IAAI;AAEvC,QAAM,eAAe,EAAE,MAAM,OAAO;AACpC,QAAM,iBAAiB;AAAA,IACtB,MAAM;AAAA,IACN,SAAS;AAAA,MACR,QAAQ,CAAC,GAAG,cAAc;AAAA,IAC3B;AAAA,EACD;AAEA,QAAM,eAAe;AAAA,IACpB,MAAM;AAAA,IACN,SAAS,EAAE,aAAa,KAAK;AAAA,EAC9B;AAEA,QAAM,cAAc,MAAM;AACzB,iBAAa,cAAc,OAAO;AAElC,iBAAa,UAAU,WAAW,MAAM;AACvC,qBAAe,IAAI;AAAA,IACpB,GAAG,SAAS;AAAA,EACb;AAEA,QAAM,aAAa,MAAM;AACxB,iBAAa,aAAa,OAAO;AAEjC,kBAAc,UAAU,WAAW,MAAM;AACxC,qBAAe,KAAK;AAAA,IACrB,GAAG,UAAU;AAAA,EACd;AAEA;AAAA,IACC,MAAM,MAAM;AACX,mBAAa,aAAa,OAAO;AACjC,mBAAa,cAAc,OAAO;AAAA,IACnC;AAAA,IACA,CAAC;AAAA,EACF;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,OAAO,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,MAC/B,WAAU;AAAA,MAEV;AAAA,4BAAC,gBAAa;AAAA,QACb,eACA;AAAA,UAAC;AAAA;AAAA,YAGA,WAAW,QAAQ,aAAa;AAAA,YAEhC;AAAA,cAAC;AAAA;AAAA,gBACA,WAAW,QAAQ,aAAa;AAAA,gBAChC,WAAW;AAAA,gBAGX,WAAW,CAAC,gBAAgB,cAAc,YAAY;AAAA,gBAEtD;AAAA,kBAAC;AAAA;AAAA,oBACA,OAAO;AAAA,sBACN,iBAAiB,GAAG,OAAO,OAAO;AAAA,sBAClC,cAAc;AAAA,sBACd,OAAO,GAAG,OAAO,KAAK;AAAA,sBACtB,SAAS;AAAA,oBACV;AAAA,oBACA,aAAW;AAAA,oBAEV;AAAA;AAAA,gBACF;AAAA;AAAA,YACD;AAAA;AAAA,QACD;AAAA;AAAA;AAAA,EAEF;AAEF;AAEA,SAAS,OAAO;AAAA,EACf;AAAA,EACA;AACD,GAGG;AACF,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,WAAW;AACtD,QAAM,cAAc,cAAc;AAClC,QAAM,aAAa,MAAM;AACxB,QAAI,aAAa;AAChB,mBAAa,CAAC,cAAc,CAAC,SAAS;AAAA,IACvC;AAAA,EACD;AAEA,QAAM,OAAO,KAAK,MAAM,SAAS,QAAQ,QAAQ,CAAyB,GACvE,MAAM;AAET,QAAM,iBAAiB,aAAa,CAAC;AAErC,SACC,oBAAC,SAAI,WAAU,SACb,2BACA,oBAAC,uBAAoB,MAAY,YAAwB,IAEzD,MAAM,SAAS;AAAA,IAAI;AAAA,IAAU,CAAC,UAC7B,MAAM,aAAa,OAAO,EAAE,aAAa,WAAW,CAAC;AAAA,EACtD,GAEF;AAEF;AAEe,SAAR,WAA4B;AAAA,EAClC;AAAA,EACA,SAAS;AACV,GAMG;AACF,QAAM,UAAyB;AAAA,IAC9B,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE,IAAI,kBAAkB;AAAA,EAC/D;AACA,QAAM,EAAE,UAAU,YAAY,IAAI,gBAAgB,CAAC;AAEnD,SACC,oBAAC,iBAAc,UACd,8BAAC,SAAI,WAAU,iCACb,mBAAS,IAAI,CAAC,QAAa,UAC3B;AAAA,IAAC;AAAA;AAAA,MACA,aAAa,eAAe;AAAA,MAG3B;AAAA;AAAA,IAFI,GAAG,KAAK;AAAA,EAGd,CACA,GACF,GACD;AAEF","sourcesContent":["import { colors, IconLegend24, Popper, Portal } from \"@dhis2/ui\";\nimport { ControlPosition } from \"leaflet\";\nimport { compact, head } from \"lodash\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { MapLegendConfig } from \"../../../MapArea/interfaces/index.js\";\nimport { CustomControl } from \"../../../MapControls/components/CustomControl/index.js\";\nimport {\n\tCustomBubbleLayer,\n\tCustomGoogleEngineLayer,\n\tCustomPointLayer,\n\tCustomThematicLayer,\n\tSUPPORTED_EARTH_ENGINE_LAYERS,\n} from \"../../interfaces/index.js\";\nimport PointLegend from \"../PointLayer/components/PointLegend/index.js\";\nimport BubbleLegend from \"../ThematicLayer/components/Bubble/components/BubbleLegend/index.js\";\nimport ChoroplethLegend from \"../ThematicLayer/components/Choropleth/components/ChoroplethLegend.js\";\nimport EarthEngineLegend from \"../GoogleEngineLayer/components/EarthEngineLegend.js\";\nimport classes from \"./LegendArea.module.css\";\nimport { usePrintMedia } from \"../../../../hooks/map.js\";\n\nconst TOOLTIP_OFFSET = 4;\n\nfunction getLegendComponent(\n\tlayer: CustomThematicLayer | CustomPointLayer | CustomGoogleEngineLayer,\n) {\n\tif (layer.type === \"point\") {\n\t\treturn <PointLegend name={layer.label} />;\n\t}\n\n\tif (SUPPORTED_EARTH_ENGINE_LAYERS.includes(layer.type)) {\n\t\treturn (\n\t\t\t<EarthEngineLegend\n\t\t\t\tname={layer.name ?? \"\"}\n\t\t\t\tlayer={layer as CustomGoogleEngineLayer}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst { type, enabled, control, dataItem, name, data, legends } =\n\t\t(layer as CustomThematicLayer) ?? {};\n\n\tif (!enabled || !control) {\n\t\treturn null;\n\t}\n\tswitch (type) {\n\t\tcase \"bubble\":\n\t\t\treturn (\n\t\t\t\t<BubbleLegend\n\t\t\t\t\tradius={\n\t\t\t\t\t\t(layer as CustomBubbleLayer)?.radius ?? {\n\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t\tmax: 50,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlegends={legends ?? []}\n\t\t\t\t\tname={name ?? dataItem.displayName}\n\t\t\t\t\tdata={data}\n\t\t\t\t\tdataItem={head(data)?.dataItem ?? dataItem}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"choropleth\":\n\t\t\treturn (\n\t\t\t\t<ChoroplethLegend\n\t\t\t\t\tlegends={legends ?? []}\n\t\t\t\t\tname={name ?? dataItem.displayName}\n\t\t\t\t\tdata={data}\n\t\t\t\t\tdataItem={head(data)?.dataItem ?? dataItem}\n\t\t\t\t/>\n\t\t\t);\n\t}\n}\n\nfunction CollapsedLegendIcon({\n\tonCollapse,\n\tname,\n}: {\n\tname: string;\n\tonCollapse: () => void;\n}) {\n\tconst openDelay = 200;\n\tconst closeDelay = 200;\n\tconst [openTooltip, setOpenTooltip] = useState(false);\n\tconst openTimerRef = useRef<any>(null);\n\tconst closeTimerRef = useRef<any>(null);\n\tconst ref = useRef<HTMLDivElement>(null);\n\n\tconst hideModifier = { name: \"hide\" };\n\tconst offsetModifier = {\n\t\tname: \"offset\",\n\t\toptions: {\n\t\t\toffset: [0, TOOLTIP_OFFSET],\n\t\t},\n\t};\n\n\tconst flipModifier = {\n\t\tname: \"flip\",\n\t\toptions: { altBoundary: true },\n\t};\n\n\tconst onMouseOver = () => {\n\t\tclearTimeout(closeTimerRef.current);\n\n\t\topenTimerRef.current = setTimeout(() => {\n\t\t\tsetOpenTooltip(true);\n\t\t}, openDelay);\n\t};\n\n\tconst onMouseOut = () => {\n\t\tclearTimeout(openTimerRef.current);\n\n\t\tcloseTimerRef.current = setTimeout(() => {\n\t\t\tsetOpenTooltip(false);\n\t\t}, closeDelay);\n\t};\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tclearTimeout(openTimerRef.current);\n\t\t\tclearTimeout(closeTimerRef.current);\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tonMouseOver={onMouseOver}\n\t\t\tonMouseOut={onMouseOut}\n\t\t\tonClick={onCollapse}\n\t\t\tstyle={{ width: 28, height: 28 }}\n\t\t\tclassName=\"legend-card collapsed\"\n\t\t>\n\t\t\t<IconLegend24 />\n\t\t\t{openTooltip && (\n\t\t\t\t<Portal\n\t\t\t\t\t/*\n\t\t\t // @ts-ignore */\n\t\t\t\t\tclassName={classes[\"map-tooltip\"]}\n\t\t\t\t>\n\t\t\t\t\t<Popper\n\t\t\t\t\t\tclassName={classes[\"map-tooltip\"]}\n\t\t\t\t\t\treference={ref}\n\t\t\t\t\t\t/*\n // @ts-ignore */\n\t\t\t\t\t\tmodifiers={[offsetModifier, flipModifier, hideModifier]}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tbackgroundColor: `${colors.grey900}`,\n\t\t\t\t\t\t\t\tborderRadius: 3,\n\t\t\t\t\t\t\t\tcolor: `${colors.white}`,\n\t\t\t\t\t\t\t\tpadding: \"4px 6px\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdata-test={`content`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popper>\n\t\t\t\t</Portal>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction Legend({\n\tchildren,\n\tcollapsible,\n}: {\n\tchildren: React.ReactElement;\n\tcollapsible: boolean;\n}) {\n\tconst [collapsed, setCollapsed] = useState(collapsible);\n\tconst inPrintMode = usePrintMedia();\n\tconst onCollapse = () => {\n\t\tif (collapsible) {\n\t\t\tsetCollapsed((prevState) => !prevState);\n\t\t}\n\t};\n\n\tconst name = head(React.Children.toArray(children) as React.ReactElement[])\n\t\t?.props.name;\n\n\tconst shouldCollapse = collapsed && !inPrintMode;\n\n\treturn (\n\t\t<div className=\"w-100\">\n\t\t\t{shouldCollapse ? (\n\t\t\t\t<CollapsedLegendIcon name={name} onCollapse={onCollapse} />\n\t\t\t) : (\n\t\t\t\tReact.Children.map(children, (child) =>\n\t\t\t\t\tReact.cloneElement(child, { collapsible, onCollapse }),\n\t\t\t\t)\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default function LegendArea({\n\tlayers,\n\tlegends: legendConfig,\n}: {\n\tlayers: Array<\n\t\tCustomThematicLayer | CustomPointLayer | CustomGoogleEngineLayer\n\t>;\n\tposition: ControlPosition;\n\tlegends?: MapLegendConfig;\n}) {\n\tconst legends: JSX.Element[] = compact(\n\t\tlayers.filter((layer) => layer.enabled).map(getLegendComponent),\n\t);\n\tconst { position, collapsible } = legendConfig ?? {};\n\n\treturn (\n\t\t<CustomControl position={position}>\n\t\t\t<div className=\"column gap-16 align-items-end\">\n\t\t\t\t{legends?.map((legend: any, index) => (\n\t\t\t\t\t<Legend\n\t\t\t\t\t\tcollapsible={collapsible ?? true}\n\t\t\t\t\t\tkey={`${index}-map-legend`}\n\t\t\t\t\t>\n\t\t\t\t\t\t{legend}\n\t\t\t\t\t</Legend>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</CustomControl>\n\t);\n}\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useConfig } from '@dhis2/app-runtime';
|
|
3
|
+
import { Divider } from '@dhis2/ui';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { getIconUrl } from '../../../../../../utils/helpers.js';
|
|
6
|
+
import LegendCardHeader from '../../../LegendArea/components/LegendCardHeader/index.js';
|
|
7
|
+
import { usePointLayer } from '../../hooks/index.js';
|
|
8
|
+
|
|
9
|
+
function PointLegends({
|
|
10
|
+
orgUnitGroups,
|
|
11
|
+
icon,
|
|
12
|
+
label
|
|
13
|
+
}) {
|
|
14
|
+
const { baseUrl } = useConfig();
|
|
15
|
+
return /* @__PURE__ */ jsxs(
|
|
16
|
+
"div",
|
|
17
|
+
{
|
|
18
|
+
style: { minWidth: 100, alignItems: "flex-start" },
|
|
19
|
+
className: "w-100 p-8 legend-list column",
|
|
20
|
+
children: [
|
|
21
|
+
icon && /* @__PURE__ */ jsxs(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
className: "row gap-16 align-items-center",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx(
|
|
27
|
+
"img",
|
|
28
|
+
{
|
|
29
|
+
height: 20,
|
|
30
|
+
width: 20,
|
|
31
|
+
alt: `${name}-icon`,
|
|
32
|
+
src: getIconUrl(icon, { baseUrl })
|
|
33
|
+
}
|
|
34
|
+
),
|
|
35
|
+
/* @__PURE__ */ jsx("p", { children: label })
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
`${icon}-legend`
|
|
39
|
+
),
|
|
40
|
+
orgUnitGroups.map(({ name: name2, symbol }) => {
|
|
41
|
+
return /* @__PURE__ */ jsxs(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
className: "row gap-16 align-items-center",
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsx(
|
|
47
|
+
"img",
|
|
48
|
+
{
|
|
49
|
+
height: 20,
|
|
50
|
+
width: 20,
|
|
51
|
+
alt: `${name2}-icon`,
|
|
52
|
+
src: getIconUrl(symbol ?? "", { baseUrl })
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
/* @__PURE__ */ jsx("p", { children: name2 })
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
`${name2}-legend`
|
|
59
|
+
);
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
function PointLegend({ collapsible, onCollapse }, ref) {
|
|
66
|
+
const pointLayer = usePointLayer();
|
|
67
|
+
const { label, style } = pointLayer ?? {};
|
|
68
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: "legend-card", children: [
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
LegendCardHeader,
|
|
71
|
+
{
|
|
72
|
+
collapsible,
|
|
73
|
+
onCollapse,
|
|
74
|
+
title: label ?? "Points"
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
/* @__PURE__ */ jsx(Divider, { margin: "0" }),
|
|
78
|
+
/* @__PURE__ */ jsx(
|
|
79
|
+
PointLegends,
|
|
80
|
+
{
|
|
81
|
+
label,
|
|
82
|
+
orgUnitGroups: style?.orgUnitGroups ?? [],
|
|
83
|
+
icon: style?.icon
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
] });
|
|
87
|
+
}
|
|
88
|
+
var PointLegend_default = forwardRef(PointLegend);
|
|
89
|
+
|
|
90
|
+
export { PointLegend_default as default };
|
|
91
|
+
//# sourceMappingURL=out.js.map
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../src/components/Map/components/MapLayer/components/PointLayer/components/PointLegend/index.tsx"],"names":["name"],"mappings":"AAwBI,SAIC,KAJD;AAxBJ,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAgB,kBAAkB;AAClC,SAAS,kBAAkB;AAC3B,OAAO,sBAAsB;AAC7B,SAAS,qBAAqB;AAE9B,SAAS,aAAa;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACD,GAIG;AACF,QAAM,EAAE,QAAQ,IAAI,UAAU;AAE9B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,OAAO,EAAE,UAAU,KAAK,YAAY,aAAa;AAAA,MACjD,WAAU;AAAA,MAET;AAAA,gBACA;AAAA,UAAC;AAAA;AAAA,YAEA,WAAU;AAAA,YAEV;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACA,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,KAAK,GAAG,IAAI;AAAA,kBACZ,KAAK,WAAW,MAAM,EAAE,QAAQ,CAAC;AAAA;AAAA,cAClC;AAAA,cACA,oBAAC,OAAG,iBAAM;AAAA;AAAA;AAAA,UATL,GAAG,IAAI;AAAA,QAUb;AAAA,QAEA,cAAc,IAAI,CAAC,EAAE,MAAAA,OAAM,OAAO,MAAM;AACxC,iBACC;AAAA,YAAC;AAAA;AAAA,cAEA,WAAU;AAAA,cAEV;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACA,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,KAAK,GAAGA,KAAI;AAAA,oBACZ,KAAK,WAAW,UAAU,IAAI,EAAE,QAAQ,CAAC;AAAA;AAAA,gBAC1C;AAAA,gBACA,oBAAC,OAAG,UAAAA,OAAK;AAAA;AAAA;AAAA,YATJ,GAAGA,KAAI;AAAA,UAUb;AAAA,QAEF,CAAC;AAAA;AAAA;AAAA,EACF;AAEF;AAEA,SAAS,YACR,EAAE,aAAa,WAAW,GAC1B,KACC;AACD,QAAM,aAAa,cAAc;AACjC,QAAM,EAAE,OAAO,MAAM,IAAI,cAAc,CAAC;AAExC,SACC,qBAAC,SAAI,KAAU,WAAU,eACxB;AAAA;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,SAAS;AAAA;AAAA,IACjB;AAAA,IACA,oBAAC,WAAQ,QAAQ,KAAK;AAAA,IACtB;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA,eAAe,OAAO,iBAAiB,CAAC;AAAA,QACxC,MAAM,OAAO;AAAA;AAAA,IACd;AAAA,KACD;AAEF;AAEA,IAAO,sBAAQ,WAAW,WAAW","sourcesContent":["import { useConfig } from \"@dhis2/app-runtime\";\nimport { Divider } from \"@dhis2/ui\";\nimport React, { forwardRef } from \"react\";\nimport { getIconUrl } from \"../../../../../../utils/helpers.js\";\nimport LegendCardHeader from \"../../../LegendArea/components/LegendCardHeader/index.js\";\nimport { usePointLayer } from \"../../hooks/index.js\";\n\nfunction PointLegends({\n\torgUnitGroups,\n\ticon,\n\tlabel,\n}: {\n\torgUnitGroups: { name: string; symbol: string }[];\n\ticon?: string;\n\tlabel?: string;\n}) {\n\tconst { baseUrl } = useConfig();\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{ minWidth: 100, alignItems: \"flex-start\" }}\n\t\t\tclassName=\"w-100 p-8 legend-list column\"\n\t\t>\n\t\t\t{icon && (\n\t\t\t\t<div\n\t\t\t\t\tkey={`${icon}-legend`}\n\t\t\t\t\tclassName=\"row gap-16 align-items-center\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\theight={20}\n\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\talt={`${name}-icon`}\n\t\t\t\t\t\tsrc={getIconUrl(icon, { baseUrl })}\n\t\t\t\t\t/>\n\t\t\t\t\t<p>{label}</p>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{orgUnitGroups.map(({ name, symbol }) => {\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={`${name}-legend`}\n\t\t\t\t\t\tclassName=\"row gap-16 align-items-center\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\theight={20}\n\t\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\t\talt={`${name}-icon`}\n\t\t\t\t\t\t\tsrc={getIconUrl(symbol ?? \"\", { baseUrl })}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<p>{name}</p>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nfunction PointLegend(\n\t{ collapsible, onCollapse }: any,\n\tref: React.LegacyRef<HTMLDivElement>,\n) {\n\tconst pointLayer = usePointLayer();\n\tconst { label, style } = pointLayer ?? {};\n\n\treturn (\n\t\t<div ref={ref} className=\"legend-card\">\n\t\t\t<LegendCardHeader\n\t\t\t\tcollapsible={collapsible}\n\t\t\t\tonCollapse={onCollapse}\n\t\t\t\ttitle={label ?? \"Points\"}\n\t\t\t/>\n\t\t\t<Divider margin={\"0\"} />\n\t\t\t<PointLegends\n\t\t\t\tlabel={label}\n\t\t\t\torgUnitGroups={style?.orgUnitGroups ?? []}\n\t\t\t\ticon={style?.icon}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport default forwardRef(PointLegend);\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { find } from 'lodash';
|
|
2
|
+
import { useMapLayers } from '../../../../MapProvider/hooks/index.js';
|
|
3
|
+
|
|
4
|
+
function usePointLayer() {
|
|
5
|
+
const { layers } = useMapLayers();
|
|
6
|
+
return find(layers, ["type", "point"]);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export { usePointLayer };
|
|
10
|
+
//# sourceMappingURL=out.js.map
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/components/Map/components/MapLayer/components/PointLayer/hooks/index.ts"],"names":[],"mappings":"AAAA,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAGtB,SAAS,gBAAgB;AAC/B,QAAM,EAAE,OAAO,IAAI,aAAa;AAChC,SAAO,KAAK,QAAQ,CAAC,QAAQ,OAAO,CAAC;AACtC","sourcesContent":["import { find } from \"lodash\";\nimport { useMapLayers } from \"../../../../MapProvider/hooks/index.js\";\nimport { CustomPointLayer } from \"../../../interfaces/index.js\";\n\nexport function usePointLayer() {\n\tconst { layers } = useMapLayers();\n\treturn find(layers, [\"type\", \"point\"]) as CustomPointLayer;\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useConfig } from '@dhis2/app-runtime';
|
|
3
|
+
import i18n from '@dhis2/d2-i18n';
|
|
4
|
+
import L from 'leaflet';
|
|
5
|
+
import { LayersControl, LayerGroup, GeoJSON, Tooltip, Popup } from 'react-leaflet';
|
|
6
|
+
import { getIcon, getIconUrl } from '../../../../utils/helpers.js';
|
|
7
|
+
import { usePointLayer } from './hooks/index.js';
|
|
8
|
+
|
|
9
|
+
function PointLayer() {
|
|
10
|
+
const pointLayer = usePointLayer();
|
|
11
|
+
const { enabled, label, points: orgUnits, style } = pointLayer ?? {};
|
|
12
|
+
const { baseUrl } = useConfig();
|
|
13
|
+
return /* @__PURE__ */ jsx(
|
|
14
|
+
LayersControl.Overlay,
|
|
15
|
+
{
|
|
16
|
+
checked: enabled,
|
|
17
|
+
name: label ?? i18n.t("Points"),
|
|
18
|
+
children: /* @__PURE__ */ jsx(LayerGroup, { children: orgUnits?.map((area) => {
|
|
19
|
+
return /* @__PURE__ */ jsxs(
|
|
20
|
+
GeoJSON,
|
|
21
|
+
{
|
|
22
|
+
pointToLayer: (_, coordinates) => {
|
|
23
|
+
return L.marker(coordinates, {
|
|
24
|
+
icon: getIcon(
|
|
25
|
+
getIconUrl(
|
|
26
|
+
area.icon.icon ?? style?.icon,
|
|
27
|
+
{ baseUrl }
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
data: area.geoJSON,
|
|
33
|
+
interactive: true,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsx(Tooltip, { children: area.name }),
|
|
36
|
+
/* @__PURE__ */ jsx(Popup, { minWidth: 80, children: /* @__PURE__ */ jsx("h3", { children: area.name }) })
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
`${area.id}-polygon`
|
|
40
|
+
);
|
|
41
|
+
}) })
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { PointLayer };
|
|
47
|
+
//# sourceMappingURL=out.js.map
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/components/Map/components/MapLayer/components/PointLayer/index.tsx"],"names":[],"mappings":"AA2BM,SAeC,KAfD;AA3BN,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AACjB,OAAO,OAAO;AAEd;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,SAAS,kBAAkB;AACpC,SAAS,qBAAqB;AAEvB,SAAS,aAAa;AAC5B,QAAM,aAAa,cAAc;AACjC,QAAM,EAAE,SAAS,OAAO,QAAQ,UAAU,MAAM,IAAI,cAAc,CAAC;AACnE,QAAM,EAAE,QAAQ,IAAI,UAAU;AAC9B,SACC;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACA,SAAS;AAAA,MACT,MAAM,SAAS,KAAK,EAAE,QAAQ;AAAA,MAE9B,8BAAC,cACC,oBAAU,IAAI,CAAC,SAAuB;AACtC,eACC;AAAA,UAAC;AAAA;AAAA,YACA,cAAc,CAAC,GAAG,gBAAgB;AACjC,qBAAO,EAAE,OAAO,aAAa;AAAA,gBAC5B,MAAM;AAAA,kBACL;AAAA,oBACC,KAAK,KAAK,QAAQ,OAAO;AAAA,oBACzB,EAAE,QAAQ;AAAA,kBACX;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF;AAAA,YACA,MAAM,KAAK;AAAA,YACX,aAAW;AAAA,YAGX;AAAA,kCAAC,WAAS,eAAK,MAAK;AAAA,cACpB,oBAAC,SAAM,UAAU,IAChB,8BAAC,QAAI,eAAK,MAAK,GAChB;AAAA;AAAA;AAAA,UALK,GAAG,KAAK,EAAE;AAAA,QAMhB;AAAA,MAEF,CAAC,GACF;AAAA;AAAA,EACD;AAEF","sourcesContent":["import { useConfig } from \"@dhis2/app-runtime\";\nimport i18n from \"@dhis2/d2-i18n\";\nimport L from \"leaflet\";\nimport React from \"react\";\nimport {\n\tGeoJSON,\n\tLayerGroup,\n\tLayersControl,\n\tPopup,\n\tTooltip,\n} from \"react-leaflet\";\nimport { PointOrgUnit } from \"../../../../interfaces/index.js\";\nimport { getIcon, getIconUrl } from \"../../../../utils/helpers.js\";\nimport { usePointLayer } from \"./hooks/index.js\";\n\nexport function PointLayer() {\n\tconst pointLayer = usePointLayer();\n\tconst { enabled, label, points: orgUnits, style } = pointLayer ?? {};\n\tconst { baseUrl } = useConfig();\n\treturn (\n\t\t<LayersControl.Overlay\n\t\t\tchecked={enabled}\n\t\t\tname={label ?? i18n.t(\"Points\")}\n\t\t>\n\t\t\t<LayerGroup>\n\t\t\t\t{orgUnits?.map((area: PointOrgUnit) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<GeoJSON\n\t\t\t\t\t\t\tpointToLayer={(_, coordinates) => {\n\t\t\t\t\t\t\t\treturn L.marker(coordinates, {\n\t\t\t\t\t\t\t\t\ticon: getIcon(\n\t\t\t\t\t\t\t\t\t\tgetIconUrl(\n\t\t\t\t\t\t\t\t\t\t\tarea.icon.icon ?? style?.icon,\n\t\t\t\t\t\t\t\t\t\t\t{ baseUrl },\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdata={area.geoJSON}\n\t\t\t\t\t\t\tinteractive\n\t\t\t\t\t\t\tkey={`${area.id}-polygon`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Tooltip>{area.name}</Tooltip>\n\t\t\t\t\t\t\t<Popup minWidth={80}>\n\t\t\t\t\t\t\t\t<h3>{area.name}</h3>\n\t\t\t\t\t\t\t</Popup>\n\t\t\t\t\t\t</GeoJSON>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</LayerGroup>\n\t\t</LayersControl.Overlay>\n\t);\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { guideLength, textPadding } from './Bubbles.js';
|
|
3
|
+
|
|
4
|
+
const Bubble = ({
|
|
5
|
+
radius,
|
|
6
|
+
maxRadius,
|
|
7
|
+
text,
|
|
8
|
+
textAlign,
|
|
9
|
+
color,
|
|
10
|
+
stroke,
|
|
11
|
+
pattern
|
|
12
|
+
}) => {
|
|
13
|
+
const leftAlign = textAlign === "left";
|
|
14
|
+
const x = maxRadius;
|
|
15
|
+
const y = maxRadius * 2 - radius;
|
|
16
|
+
const x2 = leftAlign ? x - maxRadius - guideLength : x + maxRadius + guideLength;
|
|
17
|
+
const y2 = maxRadius * 2 - radius * 2;
|
|
18
|
+
const textX = x2 + (leftAlign ? -textPadding : textPadding);
|
|
19
|
+
const textAnchor = leftAlign ? "end" : "start";
|
|
20
|
+
return /* @__PURE__ */ jsxs("g", { children: [
|
|
21
|
+
/* @__PURE__ */ jsx(
|
|
22
|
+
"circle",
|
|
23
|
+
{
|
|
24
|
+
cx: x,
|
|
25
|
+
cy: y,
|
|
26
|
+
r: radius,
|
|
27
|
+
stroke: stroke || "#000",
|
|
28
|
+
style: {
|
|
29
|
+
fill: pattern ? `url(#${pattern})` : color || "none",
|
|
30
|
+
strokeWidth: 0.5
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
),
|
|
34
|
+
text && /* @__PURE__ */ jsxs("g", { children: [
|
|
35
|
+
/* @__PURE__ */ jsx(
|
|
36
|
+
"line",
|
|
37
|
+
{
|
|
38
|
+
x1: x,
|
|
39
|
+
x2,
|
|
40
|
+
y1: y2,
|
|
41
|
+
y2,
|
|
42
|
+
stroke: "black",
|
|
43
|
+
style: { strokeDasharray: "2, 2", strokeWidth: 0.5 }
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ jsx(
|
|
47
|
+
"text",
|
|
48
|
+
{
|
|
49
|
+
x: textX,
|
|
50
|
+
y: y2,
|
|
51
|
+
textAnchor,
|
|
52
|
+
alignmentBaseline: "middle",
|
|
53
|
+
style: { fontSize: 12 },
|
|
54
|
+
children: text
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
] })
|
|
58
|
+
] });
|
|
59
|
+
};
|
|
60
|
+
var Bubble_default = Bubble;
|
|
61
|
+
|
|
62
|
+
export { Bubble_default as default };
|
|
63
|
+
//# sourceMappingURL=out.js.map
|
|
64
|
+
//# sourceMappingURL=Bubble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../../src/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubble.tsx"],"names":[],"mappings":"AAmCG,cAWC,YAXD;AAlCH,SAAS,aAAa,mBAAmB;AAazC,MAAM,SAAS,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,MAAmB;AAClB,QAAM,YAAY,cAAc;AAChC,QAAM,IAAI;AACV,QAAM,IAAI,YAAY,IAAI;AAC1B,QAAM,KAAK,YACR,IAAI,YAAY,cAChB,IAAI,YAAY;AACnB,QAAM,KAAK,YAAY,IAAI,SAAS;AACpC,QAAM,QAAQ,MAAM,YAAY,CAAC,cAAc;AAC/C,QAAM,aAAa,YAAY,QAAQ;AAEvC,SACC,qBAAC,OACA;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAG;AAAA,QACH,QAAQ,UAAU;AAAA,QAClB,OAAO;AAAA,UACN,MAAM,UAAU,QAAQ,OAAO,MAAM,SAAS;AAAA,UAC9C,aAAa;AAAA,QACd;AAAA;AAAA,IACD;AAAA,IACC,QACA,qBAAC,OACA;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,QAAO;AAAA,UACP,OAAO,EAAE,iBAAiB,QAAQ,aAAa,IAAI;AAAA;AAAA,MACpD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,GAAG;AAAA,UACH,GAAG;AAAA,UACH;AAAA,UACA,mBAAkB;AAAA,UAClB,OAAO,EAAE,UAAU,GAAG;AAAA,UAErB;AAAA;AAAA,MACF;AAAA,OACD;AAAA,KAEF;AAEF;AAEA,IAAO,iBAAQ","sourcesContent":["import React from \"react\";\nimport { guideLength, textPadding } from \"./Bubbles.js\";\n\nexport interface BubbleProps {\n\tradius: number;\n\tmaxRadius: number;\n\ttext?: string;\n\ttextAlign?: \"left\" | \"right\";\n\tcolor?: string;\n\tstroke?: string;\n\tpattern?: string;\n\tgap?: number;\n}\n\nconst Bubble = ({\n\tradius,\n\tmaxRadius,\n\ttext,\n\ttextAlign,\n\tcolor,\n\tstroke,\n\tpattern,\n}: BubbleProps) => {\n\tconst leftAlign = textAlign === \"left\";\n\tconst x = maxRadius;\n\tconst y = maxRadius * 2 - radius;\n\tconst x2 = leftAlign\n\t\t? x - maxRadius - guideLength\n\t\t: x + maxRadius + guideLength;\n\tconst y2 = maxRadius * 2 - radius * 2;\n\tconst textX = x2 + (leftAlign ? -textPadding : textPadding);\n\tconst textAnchor = leftAlign ? \"end\" : \"start\";\n\n\treturn (\n\t\t<g>\n\t\t\t<circle\n\t\t\t\tcx={x}\n\t\t\t\tcy={y}\n\t\t\t\tr={radius}\n\t\t\t\tstroke={stroke || \"#000\"}\n\t\t\t\tstyle={{\n\t\t\t\t\tfill: pattern ? `url(#${pattern})` : color || \"none\",\n\t\t\t\t\tstrokeWidth: 0.5,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{text && (\n\t\t\t\t<g>\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={x}\n\t\t\t\t\t\tx2={x2}\n\t\t\t\t\t\ty1={y2}\n\t\t\t\t\t\ty2={y2}\n\t\t\t\t\t\tstroke=\"black\"\n\t\t\t\t\t\tstyle={{ strokeDasharray: \"2, 2\", strokeWidth: 0.5 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={textX}\n\t\t\t\t\t\ty={y2}\n\t\t\t\t\t\ttextAnchor={textAnchor}\n\t\t\t\t\t\talignmentBaseline=\"middle\"\n\t\t\t\t\t\tstyle={{ fontSize: 12 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{text}\n\t\t\t\t\t</text>\n\t\t\t\t</g>\n\t\t\t)}\n\t\t</g>\n\t);\n};\n\nexport default Bubble;\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import i18n from '@dhis2/d2-i18n';
|
|
3
|
+
import { scaleSqrt } from 'd3-scale';
|
|
4
|
+
import { reduce } from 'lodash';
|
|
5
|
+
import { memo } from 'react';
|
|
6
|
+
import { getContrastColor } from '../../../../../../../../../utils/colors.js';
|
|
7
|
+
import { getLongestTextLength } from '../../../../../../../../../utils/helpers.js';
|
|
8
|
+
import Bubble from './Bubble.js';
|
|
9
|
+
|
|
10
|
+
const style = {
|
|
11
|
+
paddingTop: 10,
|
|
12
|
+
display: "flex",
|
|
13
|
+
alignItems: "center",
|
|
14
|
+
justifyContent: "center"
|
|
15
|
+
};
|
|
16
|
+
const legendWidth = 200;
|
|
17
|
+
const digitWidth = 6.8;
|
|
18
|
+
const guideLength = 16;
|
|
19
|
+
const textPadding = 4;
|
|
20
|
+
const Bubbles = ({
|
|
21
|
+
radiusLow,
|
|
22
|
+
radiusHigh,
|
|
23
|
+
color,
|
|
24
|
+
classes
|
|
25
|
+
}) => {
|
|
26
|
+
const height = radiusHigh * 2 + 4;
|
|
27
|
+
const scale = scaleSqrt().range([radiusLow, radiusHigh]);
|
|
28
|
+
const radiusMid = scale(0.5);
|
|
29
|
+
if (isNaN(radiusLow) || isNaN(radiusHigh)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
let bubbles = [];
|
|
33
|
+
if (Array.isArray(classes) && classes.length) {
|
|
34
|
+
const startValue = classes[0].startValue;
|
|
35
|
+
const endValue = classes[classes.length - 1].endValue;
|
|
36
|
+
const itemScale = scale.domain([startValue, endValue]);
|
|
37
|
+
bubbles = [...classes].reverse().map((c) => ({
|
|
38
|
+
radius: itemScale(c.endValue),
|
|
39
|
+
maxRadius: radiusHigh,
|
|
40
|
+
color: c.color,
|
|
41
|
+
text: String(c.endValue)
|
|
42
|
+
}));
|
|
43
|
+
bubbles.push({
|
|
44
|
+
radius: itemScale(startValue),
|
|
45
|
+
maxRadius: radiusHigh,
|
|
46
|
+
text: String(startValue)
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
const stroke = color && getContrastColor(color);
|
|
50
|
+
bubbles = [
|
|
51
|
+
{
|
|
52
|
+
radius: radiusHigh,
|
|
53
|
+
maxRadius: radiusHigh,
|
|
54
|
+
color,
|
|
55
|
+
stroke,
|
|
56
|
+
text: i18n.t("Max")
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
radius: radiusMid,
|
|
60
|
+
maxRadius: radiusHigh,
|
|
61
|
+
color,
|
|
62
|
+
stroke,
|
|
63
|
+
text: i18n.t("Mid")
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
radius: radiusLow,
|
|
67
|
+
maxRadius: radiusHigh,
|
|
68
|
+
color,
|
|
69
|
+
stroke,
|
|
70
|
+
text: i18n.t("Min")
|
|
71
|
+
}
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
let textLength = Math.ceil(
|
|
75
|
+
Math.max(
|
|
76
|
+
getLongestTextLength(classes, "startValue"),
|
|
77
|
+
getLongestTextLength(classes, "endValue")
|
|
78
|
+
) * digitWidth
|
|
79
|
+
);
|
|
80
|
+
const alternateLength = (radiusHigh + guideLength + textPadding + textLength) * 2;
|
|
81
|
+
let smallestGap = reduce(bubbles, (prev, curr, i) => {
|
|
82
|
+
const gap = prev.radius - curr.radius;
|
|
83
|
+
const smallestGap2 = prev.gap === void 0 || gap < prev.gap ? gap : prev.gap;
|
|
84
|
+
return i === bubbles.length - 1 ? Math.round(smallestGap2 * 2) : {
|
|
85
|
+
radius: curr.radius,
|
|
86
|
+
gap: smallestGap2
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
const alternateFit = alternateLength < legendWidth;
|
|
90
|
+
const alternate = alternateFit && smallestGap > 5 && smallestGap < 12;
|
|
91
|
+
if (!alternateFit) {
|
|
92
|
+
smallestGap = smallestGap / 2;
|
|
93
|
+
}
|
|
94
|
+
if (smallestGap < 4) {
|
|
95
|
+
const [maxBubble] = bubbles;
|
|
96
|
+
const minBubble = bubbles[bubbles.length - 1];
|
|
97
|
+
const gap = maxBubble.radius - minBubble.radius;
|
|
98
|
+
const showNumbers = [0];
|
|
99
|
+
if (gap > 4) {
|
|
100
|
+
showNumbers.push(bubbles.length - 1);
|
|
101
|
+
}
|
|
102
|
+
if (gap > 15) {
|
|
103
|
+
const midRadius = minBubble.radius + gap / 2;
|
|
104
|
+
const midBubble = bubbles.reduce(
|
|
105
|
+
(prev, curr) => curr.radius >= midRadius && curr.radius - midRadius < prev.radius - midRadius ? curr : prev
|
|
106
|
+
);
|
|
107
|
+
showNumbers.push(bubbles.indexOf(midBubble));
|
|
108
|
+
}
|
|
109
|
+
bubbles.forEach((b, i) => {
|
|
110
|
+
if (!showNumbers.includes(i)) {
|
|
111
|
+
delete b.text;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
textLength = Math.ceil(getLongestTextLength(bubbles, "text") * digitWidth);
|
|
116
|
+
const offset = textLength + guideLength + textPadding;
|
|
117
|
+
return /* @__PURE__ */ jsx("div", { style, children: /* @__PURE__ */ jsx("svg", { width: legendWidth, height: height + 50, children: /* @__PURE__ */ jsx("g", { transform: `translate(${alternate ? offset : "16"} 24)`, children: bubbles.map((bubble, i) => /* @__PURE__ */ jsx(
|
|
118
|
+
Bubble,
|
|
119
|
+
{
|
|
120
|
+
...bubble,
|
|
121
|
+
textAlign: alternate && i % 2 == 0 ? "left" : "right"
|
|
122
|
+
},
|
|
123
|
+
i
|
|
124
|
+
)) }) }) });
|
|
125
|
+
};
|
|
126
|
+
var Bubbles_default = memo(Bubbles);
|
|
127
|
+
|
|
128
|
+
export { Bubbles_default as default, guideLength, textPadding };
|
|
129
|
+
//# sourceMappingURL=out.js.map
|
|
130
|
+
//# sourceMappingURL=Bubbles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../../src/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/components/Bubbles.tsx"],"names":["smallestGap"],"mappings":"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","sourcesContent":["import i18n from \"@dhis2/d2-i18n\";\nimport { scaleSqrt } from \"d3-scale\";\nimport { reduce } from \"lodash\";\nimport React, { memo } from \"react\";\nimport { getContrastColor } from \"../../../../../../../../../utils/colors.js\";\nimport { getLongestTextLength } from \"../../../../../../../../../utils/helpers.js\";\nimport Bubble, { BubbleProps } from \"./Bubble.js\";\n\nconst style = {\n\tpaddingTop: 10,\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n};\n\nconst legendWidth = 200;\nconst digitWidth = 6.8;\nexport const guideLength = 16;\nexport const textPadding = 4;\n\nconst Bubbles = ({\n\tradiusLow,\n\tradiusHigh,\n\tcolor,\n\tclasses,\n}: {\n\tradiusLow: number;\n\tradiusHigh: number;\n\tcolor?: string;\n\tclasses: Array<any>;\n}) => {\n\tconst height = radiusHigh * 2 + 4;\n\tconst scale = scaleSqrt().range([radiusLow, radiusHigh]);\n\tconst radiusMid = scale(0.5);\n\n\tif (isNaN(radiusLow) || isNaN(radiusHigh)) {\n\t\treturn null;\n\t}\n\n\tlet bubbles: Array<BubbleProps> = [];\n\n\t// If color legend\n\tif (Array.isArray(classes) && classes.length) {\n\t\tconst startValue = classes[0].startValue;\n\t\tconst endValue = classes[classes.length - 1].endValue;\n\t\tconst itemScale = scale.domain([startValue, endValue]);\n\n\t\tbubbles = [...classes].reverse().map((c) => ({\n\t\t\tradius: itemScale(c.endValue),\n\t\t\tmaxRadius: radiusHigh,\n\t\t\tcolor: c.color,\n\t\t\ttext: String(c.endValue),\n\t\t}));\n\n\t\t// Add the smallest bubble for the lowest value\n\t\tbubbles.push({\n\t\t\tradius: itemScale(startValue),\n\t\t\tmaxRadius: radiusHigh,\n\t\t\ttext: String(startValue),\n\t\t});\n\t} else {\n\t\t// If single color\n\t\tconst stroke = color && getContrastColor(color);\n\n\t\tbubbles = [\n\t\t\t{\n\t\t\t\tradius: radiusHigh,\n\t\t\t\tmaxRadius: radiusHigh,\n\t\t\t\tcolor,\n\t\t\t\tstroke,\n\t\t\t\ttext: i18n.t(\"Max\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tradius: radiusMid,\n\t\t\t\tmaxRadius: radiusHigh,\n\t\t\t\tcolor,\n\t\t\t\tstroke,\n\t\t\t\ttext: i18n.t(\"Mid\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tradius: radiusLow,\n\t\t\t\tmaxRadius: radiusHigh,\n\t\t\t\tcolor,\n\t\t\t\tstroke,\n\t\t\t\ttext: i18n.t(\"Min\"),\n\t\t\t},\n\t\t];\n\t}\n\n\t// Calculate the pixel length of the longest number\n\tlet textLength = Math.ceil(\n\t\tMath.max(\n\t\t\tgetLongestTextLength(classes, \"startValue\"),\n\t\t\tgetLongestTextLength(classes, \"endValue\"),\n\t\t) * digitWidth,\n\t);\n\n\t// Calculate the total length if numbers are alternate on each side\n\tconst alternateLength =\n\t\t(radiusHigh + guideLength + textPadding + textLength) * 2;\n\n\tlet smallestGap = reduce(bubbles, (prev, curr: any, i) => {\n\t\tconst gap = prev.radius - curr.radius;\n\t\tconst smallestGap =\n\t\t\tprev.gap === undefined || gap < prev.gap ? gap : prev.gap;\n\n\t\treturn i === bubbles.length - 1\n\t\t\t? Math.round(smallestGap * 2)\n\t\t\t: {\n\t\t\t\t\tradius: curr.radius,\n\t\t\t\t\tgap: smallestGap,\n\t\t\t\t};\n\t});\n\n\tconst alternateFit = alternateLength < legendWidth;\n\n\tconst alternate = alternateFit && smallestGap > 5 && smallestGap < 12;\n\n\tif (!alternateFit) {\n\t\tsmallestGap = smallestGap / 2;\n\t}\n\n\t// Too cramped to show number for each bubble\n\tif (smallestGap < 4) {\n\t\tconst [maxBubble] = bubbles;\n\t\tconst minBubble = bubbles[bubbles.length - 1];\n\t\tconst gap = maxBubble.radius - minBubble.radius;\n\t\tconst showNumbers = [0]; // Always show the largest number\n\n\t\tif (gap > 4) {\n\t\t\tshowNumbers.push(bubbles.length - 1);\n\t\t}\n\n\t\tif (gap > 15) {\n\t\t\tconst midRadius = minBubble.radius + gap / 2;\n\n\t\t\t// Find the closest bubble above the mid-radius\n\t\t\tconst midBubble = bubbles.reduce((prev, curr) =>\n\t\t\t\tcurr.radius >= midRadius &&\n\t\t\t\tcurr.radius - midRadius < prev.radius - midRadius\n\t\t\t\t\t? curr\n\t\t\t\t\t: prev,\n\t\t\t);\n\n\t\t\tshowNumbers.push(bubbles.indexOf(midBubble));\n\t\t}\n\n\t\tbubbles.forEach((b, i) => {\n\t\t\tif (!showNumbers.includes(i)) {\n\t\t\t\tdelete b.text;\n\t\t\t}\n\t\t});\n\t}\n\n\ttextLength = Math.ceil(getLongestTextLength(bubbles, \"text\") * digitWidth);\n\n\tconst offset = textLength + guideLength + textPadding;\n\n\treturn (\n\t\t<div style={style}>\n\t\t\t<svg width={legendWidth} height={height + 50}>\n\t\t\t\t<g transform={`translate(${alternate ? offset : \"16\"} 24)`}>\n\t\t\t\t\t{bubbles.map((bubble, i) => (\n\t\t\t\t\t\t<Bubble\n\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t{...bubble}\n\t\t\t\t\t\t\ttextAlign={\n\t\t\t\t\t\t\t\talternate && i % 2 == 0 ? \"left\" : \"right\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</g>\n\t\t\t</svg>\n\t\t</div>\n\t);\n};\n\nexport default memo(Bubbles);\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Divider } from '@dhis2/ui';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import LegendCardHeader from '../../../../../LegendArea/components/LegendCardHeader/index.js';
|
|
5
|
+
import Bubbles from './components/Bubbles.js';
|
|
6
|
+
|
|
7
|
+
function BubbleLegend({
|
|
8
|
+
radius,
|
|
9
|
+
dataItem,
|
|
10
|
+
data,
|
|
11
|
+
name,
|
|
12
|
+
collapsible,
|
|
13
|
+
onCollapse,
|
|
14
|
+
legends
|
|
15
|
+
}, ref) {
|
|
16
|
+
return /* @__PURE__ */ jsxs("div", { className: "legend-card", ref, children: [
|
|
17
|
+
/* @__PURE__ */ jsx(
|
|
18
|
+
LegendCardHeader,
|
|
19
|
+
{
|
|
20
|
+
title: dataItem.displayName,
|
|
21
|
+
onCollapse,
|
|
22
|
+
collapsible
|
|
23
|
+
}
|
|
24
|
+
),
|
|
25
|
+
/* @__PURE__ */ jsx(Divider, { margin: "0" }),
|
|
26
|
+
/* @__PURE__ */ jsx("div", { className: "legend-list pt-8", children: /* @__PURE__ */ jsx(
|
|
27
|
+
Bubbles,
|
|
28
|
+
{
|
|
29
|
+
classes: legends.reverse(),
|
|
30
|
+
radiusHigh: radius.max,
|
|
31
|
+
radiusLow: radius.min,
|
|
32
|
+
color: "#FF0000"
|
|
33
|
+
}
|
|
34
|
+
) })
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
var BubbleLegend_default = forwardRef(BubbleLegend);
|
|
38
|
+
|
|
39
|
+
export { BubbleLegend_default as default };
|
|
40
|
+
//# sourceMappingURL=out.js.map
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../src/components/Map/components/MapLayer/components/ThematicLayer/components/Bubble/components/BubbleLegend/index.tsx"],"names":[],"mappings":"AA+BE,SACC,KADD;AA/BF,SAAS,eAAe;AAExB,SAAgB,kBAAkB;AAKlC,OAAO,sBAAsB;AAC7B,OAAO,aAAa;AAEpB,SAAS,aACR;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GASA,KACC;AACD,SACC,qBAAC,SAAI,WAAU,eAAc,KAC5B;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA;AAAA,IACD;AAAA,IACA,oBAAC,WAAQ,QAAQ,KAAK;AAAA,IACtB,oBAAC,SAAI,WAAU,oBACd;AAAA,MAAC;AAAA;AAAA,QACA,SAAS,QAAQ,QAAQ;AAAA,QACzB,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,OAAO;AAAA;AAAA,IACR,GACD;AAAA,KACD;AAEF;AAEA,IAAO,uBAAQ,WAAW,YAAY","sourcesContent":["import { Divider } from \"@dhis2/ui\";\nimport type { Legend } from \"@hisptz/dhis2-utils\";\nimport React, { forwardRef } from \"react\";\nimport {\n\tThematicLayerData,\n\tThematicLayerDataItem,\n} from \"../../../../../../interfaces/index.js\";\nimport LegendCardHeader from \"../../../../../LegendArea/components/LegendCardHeader/index.js\";\nimport Bubbles from \"./components/Bubbles.js\";\n\nfunction BubbleLegend(\n\t{\n\t\tradius,\n\t\tdataItem,\n\t\tdata,\n\t\tname,\n\t\tcollapsible,\n\t\tonCollapse,\n\t\tlegends,\n\t}: {\n\t\tradius: { min: number; max: number };\n\t\tdataItem: ThematicLayerDataItem;\n\t\tdata: ThematicLayerData[];\n\t\tname?: string;\n\t\tcollapsible?: boolean;\n\t\tonCollapse?: () => void;\n\t\tlegends: Legend[];\n\t},\n\tref: React.LegacyRef<HTMLDivElement> | undefined,\n) {\n\treturn (\n\t\t<div className=\"legend-card\" ref={ref}>\n\t\t\t<LegendCardHeader\n\t\t\t\ttitle={dataItem.displayName}\n\t\t\t\tonCollapse={onCollapse}\n\t\t\t\tcollapsible={collapsible}\n\t\t\t/>\n\t\t\t<Divider margin={\"0\"} />\n\t\t\t<div className=\"legend-list pt-8\">\n\t\t\t\t<Bubbles\n\t\t\t\t\tclasses={legends.reverse()}\n\t\t\t\t\tradiusHigh={radius.max}\n\t\t\t\t\tradiusLow={radius.min}\n\t\t\t\t\tcolor={\"#FF0000\"}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default forwardRef(BubbleLegend);\n"]}
|