@sis-cc/dotstatsuite-components 22.0.1 → 22.0.3
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/bridge-d3-react/src/index.js +18 -0
- package/dist/bridge-d3-react/src/index.js.map +1 -0
- package/dist/bridge-d3-react/src/react-chart-factory.js +44 -0
- package/dist/bridge-d3-react/src/react-chart-factory.js.map +1 -0
- package/dist/rules/src/chart/getAxisOptions.js +256 -0
- package/dist/rules/src/chart/getAxisOptions.js.map +1 -0
- package/dist/rules/src/chart/getBaseOptions.js +77 -0
- package/dist/rules/src/chart/getBaseOptions.js.map +1 -0
- package/dist/rules/src/chart/getChartOptions.js +120 -0
- package/dist/rules/src/chart/getChartOptions.js.map +1 -0
- package/dist/rules/src/chart/getGridOptions.js +46 -0
- package/dist/rules/src/chart/getGridOptions.js.map +1 -0
- package/dist/rules/src/chart/getTooltipOptions.js +223 -0
- package/dist/rules/src/chart/getTooltipOptions.js.map +1 -0
- package/dist/rules/src/constants.js +65 -0
- package/dist/rules/src/constants.js.map +1 -0
- package/dist/rules/src/date.js +121 -0
- package/dist/rules/src/date.js.map +1 -0
- package/dist/rules/src/dimension-utils.js +57 -0
- package/dist/rules/src/dimension-utils.js.map +1 -0
- package/dist/rules/src/factories/choro-series.js +68 -0
- package/dist/rules/src/factories/choro-series.js.map +1 -0
- package/dist/rules/src/factories/sample-focus.js +25 -0
- package/dist/rules/src/factories/sample-focus.js.map +1 -0
- package/dist/rules/src/factories/sample-series.js +53 -0
- package/dist/rules/src/factories/sample-series.js.map +1 -0
- package/dist/rules/src/factories/scatter-dimension.js +35 -0
- package/dist/rules/src/factories/scatter-dimension.js.map +1 -0
- package/dist/rules/src/factories/scatter-focus.js +42 -0
- package/dist/rules/src/factories/scatter-focus.js.map +1 -0
- package/dist/rules/src/factories/scatter-series.js +91 -0
- package/dist/rules/src/factories/scatter-series.js.map +1 -0
- package/dist/rules/src/factories/stacked-dimension.js +32 -0
- package/dist/rules/src/factories/stacked-dimension.js.map +1 -0
- package/dist/rules/src/factories/stacked-series.js +188 -0
- package/dist/rules/src/factories/stacked-series.js.map +1 -0
- package/dist/rules/src/factories/symbol-dimension.js +32 -0
- package/dist/rules/src/factories/symbol-dimension.js.map +1 -0
- package/dist/rules/src/factories/symbol-series.js +65 -0
- package/dist/rules/src/factories/symbol-series.js.map +1 -0
- package/dist/rules/src/factories/timeline-focus.js +21 -0
- package/dist/rules/src/factories/timeline-focus.js.map +1 -0
- package/dist/rules/src/factories/timeline-series.js +94 -0
- package/dist/rules/src/factories/timeline-series.js.map +1 -0
- package/dist/rules/src/get-values-enhanced.js +133 -0
- package/dist/rules/src/get-values-enhanced.js.map +1 -0
- package/dist/rules/src/header/getDefaultSubtitle.js +44 -0
- package/dist/rules/src/header/getDefaultSubtitle.js.map +1 -0
- package/dist/rules/src/header/getHeaderUnits.js +21 -0
- package/dist/rules/src/header/getHeaderUnits.js.map +1 -0
- package/dist/rules/src/header/getSubtitleFlags.js +47 -0
- package/dist/rules/src/header/getSubtitleFlags.js.map +1 -0
- package/dist/rules/src/header/getTitleFlags.js +12 -0
- package/dist/rules/src/header/getTitleFlags.js.map +1 -0
- package/dist/rules/src/index.js +379 -0
- package/dist/rules/src/index.js.map +1 -0
- package/dist/rules/src/layout.js +107 -0
- package/dist/rules/src/layout.js.map +1 -0
- package/dist/rules/src/observation-formater.js +86 -0
- package/dist/rules/src/observation-formater.js.map +1 -0
- package/dist/rules/src/preparators/formatValue.js +96 -0
- package/dist/rules/src/preparators/formatValue.js.map +1 -0
- package/dist/rules/src/preparators/getObservations.js +22 -0
- package/dist/rules/src/preparators/getObservations.js.map +1 -0
- package/dist/rules/src/preparators/getReportingYearStart.js +19 -0
- package/dist/rules/src/preparators/getReportingYearStart.js.map +1 -0
- package/dist/rules/src/properties/errors.js +22 -0
- package/dist/rules/src/properties/errors.js.map +1 -0
- package/dist/rules/src/properties/focus.js +72 -0
- package/dist/rules/src/properties/focus.js.map +1 -0
- package/dist/rules/src/properties/getAvailableChartTypes.js +31 -0
- package/dist/rules/src/properties/getAvailableChartTypes.js.map +1 -0
- package/dist/rules/src/properties/getHeaderProps.js +76 -0
- package/dist/rules/src/properties/getHeaderProps.js.map +1 -0
- package/dist/rules/src/properties/getInformationsStateFromNewProps.js +50 -0
- package/dist/rules/src/properties/getInformationsStateFromNewProps.js.map +1 -0
- package/dist/rules/src/properties/getObservationsType.js +28 -0
- package/dist/rules/src/properties/getObservationsType.js.map +1 -0
- package/dist/rules/src/properties/getStringifiedSubtitle.js +9 -0
- package/dist/rules/src/properties/getStringifiedSubtitle.js.map +1 -0
- package/dist/rules/src/properties/index.js +384 -0
- package/dist/rules/src/properties/index.js.map +1 -0
- package/dist/rules/src/properties/linear.js +123 -0
- package/dist/rules/src/properties/linear.js.map +1 -0
- package/dist/rules/src/properties/scatter.js +156 -0
- package/dist/rules/src/properties/scatter.js.map +1 -0
- package/dist/rules/src/properties/stacked.js +96 -0
- package/dist/rules/src/properties/stacked.js.map +1 -0
- package/dist/rules/src/properties/symbol.js +76 -0
- package/dist/rules/src/properties/symbol.js.map +1 -0
- package/dist/rules/src/properties/utils.js +86 -0
- package/dist/rules/src/properties/utils.js.map +1 -0
- package/dist/rules/src/sdmx-data/index.js +38 -0
- package/dist/rules/src/sdmx-data/index.js.map +1 -0
- package/dist/rules/src/table/factories/getCellValue.js +53 -0
- package/dist/rules/src/table/factories/getCellValue.js.map +1 -0
- package/dist/rules/src/v8-transformer.js +174 -0
- package/dist/rules/src/v8-transformer.js.map +1 -0
- package/dist/rules2/src/applyHierarchicalCodesToDim.js +126 -0
- package/dist/rules2/src/applyHierarchicalCodesToDim.js.map +1 -0
- package/dist/rules2/src/combinedValuesDisplay.js +77 -0
- package/dist/rules2/src/combinedValuesDisplay.js.map +1 -0
- package/dist/rules2/src/constants.js +9 -0
- package/dist/rules2/src/constants.js.map +1 -0
- package/dist/rules2/src/duplicateObservations.js +38 -0
- package/dist/rules2/src/duplicateObservations.js.map +1 -0
- package/dist/rules2/src/enhanceObservations.js +98 -0
- package/dist/rules2/src/enhanceObservations.js.map +1 -0
- package/dist/rules2/src/getAttributesSeries.js +39 -0
- package/dist/rules2/src/getAttributesSeries.js.map +1 -0
- package/dist/rules2/src/getCombinationDefinitions.js +50 -0
- package/dist/rules2/src/getCombinationDefinitions.js.map +1 -0
- package/dist/rules2/src/getDataflowAttributes.js +25 -0
- package/dist/rules2/src/getDataflowAttributes.js.map +1 -0
- package/dist/rules2/src/getDataflowTooltipAttributesIds.js +33 -0
- package/dist/rules2/src/getDataflowTooltipAttributesIds.js.map +1 -0
- package/dist/rules2/src/getDimensionValuesIndexes.js +16 -0
- package/dist/rules2/src/getDimensionValuesIndexes.js.map +1 -0
- package/dist/rules2/src/getHCodelistsRefsInData.js +35 -0
- package/dist/rules2/src/getHCodelistsRefsInData.js.map +1 -0
- package/dist/rules2/src/getHeaderCombinations.js +51 -0
- package/dist/rules2/src/getHeaderCombinations.js.map +1 -0
- package/dist/rules2/src/getHeaderCoordinates.js +10 -0
- package/dist/rules2/src/getHeaderCoordinates.js.map +1 -0
- package/dist/rules2/src/getHeaderSubtitle.js +37 -0
- package/dist/rules2/src/getHeaderSubtitle.js.map +1 -0
- package/dist/rules2/src/getHeaderTitle.js +18 -0
- package/dist/rules2/src/getHeaderTitle.js.map +1 -0
- package/dist/rules2/src/getMSDInformations.js +26 -0
- package/dist/rules2/src/getMSDInformations.js.map +1 -0
- package/dist/rules2/src/getManyValuesDimensions.js +37 -0
- package/dist/rules2/src/getManyValuesDimensions.js.map +1 -0
- package/dist/rules2/src/getMetadataCoordinates.js +40 -0
- package/dist/rules2/src/getMetadataCoordinates.js.map +1 -0
- package/dist/rules2/src/getNotDisplayedIds.js +56 -0
- package/dist/rules2/src/getNotDisplayedIds.js.map +1 -0
- package/dist/rules2/src/getOneValueDimensions.js +37 -0
- package/dist/rules2/src/getOneValueDimensions.js.map +1 -0
- package/dist/rules2/src/getSeriesCombinations.js +27 -0
- package/dist/rules2/src/getSeriesCombinations.js.map +1 -0
- package/dist/rules2/src/hasCellMetadata.js +17 -0
- package/dist/rules2/src/hasCellMetadata.js.map +1 -0
- package/dist/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js +60 -0
- package/dist/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js.map +1 -0
- package/dist/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js +38 -0
- package/dist/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js.map +1 -0
- package/dist/rules2/src/index.js +47 -0
- package/dist/rules2/src/index.js.map +1 -0
- package/dist/rules2/src/parseAttributes.js +44 -0
- package/dist/rules2/src/parseAttributes.js.map +1 -0
- package/dist/rules2/src/parseCombinations.js +105 -0
- package/dist/rules2/src/parseCombinations.js.map +1 -0
- package/dist/rules2/src/parseHierarchicalCodelist.js +34 -0
- package/dist/rules2/src/parseHierarchicalCodelist.js.map +1 -0
- package/dist/rules2/src/parseMetadataSeries.js +124 -0
- package/dist/rules2/src/parseMetadataSeries.js.map +1 -0
- package/dist/rules2/src/prepareData.js +78 -0
- package/dist/rules2/src/prepareData.js.map +1 -0
- package/dist/rules2/src/refineAttributes.js +19 -0
- package/dist/rules2/src/refineAttributes.js.map +1 -0
- package/dist/rules2/src/refineDimensions.js +21 -0
- package/dist/rules2/src/refineDimensions.js.map +1 -0
- package/dist/rules2/src/refineTimePeriod.js +130 -0
- package/dist/rules2/src/refineTimePeriod.js.map +1 -0
- package/dist/rules2/src/sdmx3.0DataFormatPatch.js +12 -0
- package/dist/rules2/src/sdmx3.0DataFormatPatch.js.map +1 -0
- package/dist/rules2/src/table/declineObservationsOverAttributes.js +35 -0
- package/dist/rules2/src/table/declineObservationsOverAttributes.js.map +1 -0
- package/dist/rules2/src/table/getCells.js +96 -0
- package/dist/rules2/src/table/getCells.js.map +1 -0
- package/dist/rules2/src/table/getCellsAttributesIds.js +41 -0
- package/dist/rules2/src/table/getCellsAttributesIds.js.map +1 -0
- package/dist/rules2/src/table/getCellsMetadataCoordinates.js +16 -0
- package/dist/rules2/src/table/getCellsMetadataCoordinates.js.map +1 -0
- package/dist/rules2/src/table/getCuratedCells.js +36 -0
- package/dist/rules2/src/table/getCuratedCells.js.map +1 -0
- package/dist/rules2/src/table/getFlagsAndNotes.js +26 -0
- package/dist/rules2/src/table/getFlagsAndNotes.js.map +1 -0
- package/dist/rules2/src/table/getIndexedCombinationsByDisplay.js +19 -0
- package/dist/rules2/src/table/getIndexedCombinationsByDisplay.js.map +1 -0
- package/dist/rules2/src/table/getLayout.js +87 -0
- package/dist/rules2/src/table/getLayout.js.map +1 -0
- package/dist/rules2/src/table/getLayoutData2.js +205 -0
- package/dist/rules2/src/table/getLayoutData2.js.map +1 -0
- package/dist/rules2/src/table/getSortedLayoutIndexes.js +141 -0
- package/dist/rules2/src/table/getSortedLayoutIndexes.js.map +1 -0
- package/dist/rules2/src/table/getTableLabelAccessor.js +11 -0
- package/dist/rules2/src/table/getTableLabelAccessor.js.map +1 -0
- package/dist/rules2/src/table/getTableLayoutIds.js +317 -0
- package/dist/rules2/src/table/getTableLayoutIds.js.map +1 -0
- package/dist/rules2/src/table/getTableProps.js +85 -0
- package/dist/rules2/src/table/getTableProps.js.map +1 -0
- package/dist/rules2/src/table/parseSeriesIndexesHierarchies.js +82 -0
- package/dist/rules2/src/table/parseSeriesIndexesHierarchies.js.map +1 -0
- package/dist/rules2/src/table/parseValueHierarchy.js +29 -0
- package/dist/rules2/src/table/parseValueHierarchy.js.map +1 -0
- package/dist/rules2/src/table/refineLayoutSize2.js +324 -0
- package/dist/rules2/src/table/refineLayoutSize2.js.map +1 -0
- package/dist/rules2/src/utils.js +29 -0
- package/dist/rules2/src/utils.js.map +1 -0
- package/dist/viewer/src/chart.js +50 -0
- package/dist/viewer/src/chart.js.map +1 -0
- package/dist/viewer/src/chartUtils/options.js +33 -0
- package/dist/viewer/src/chartUtils/options.js.map +1 -0
- package/dist/viewer/src/chartUtils/series.js +54 -0
- package/dist/viewer/src/chartUtils/series.js.map +1 -0
- package/dist/viewer/src/footer.js +39 -0
- package/dist/viewer/src/footer.js.map +1 -0
- package/dist/viewer/src/header.js +12 -0
- package/dist/viewer/src/header.js.map +1 -0
- package/dist/viewer/src/index.js +160 -0
- package/dist/viewer/src/index.js.map +1 -0
- package/dist/viewer/src/legends/AxisLegend.js +42 -0
- package/dist/viewer/src/legends/AxisLegend.js.map +1 -0
- package/dist/viewer/src/legends/ChartLegends.js +80 -0
- package/dist/viewer/src/legends/ChartLegends.js.map +1 -0
- package/dist/viewer/src/legends/FocusLegend.js +67 -0
- package/dist/viewer/src/legends/FocusLegend.js.map +1 -0
- package/dist/viewer/src/legends/Legend.js +51 -0
- package/dist/viewer/src/legends/Legend.js.map +1 -0
- package/dist/viewer/src/legends/SeriesLegend.js +77 -0
- package/dist/viewer/src/legends/SeriesLegend.js.map +1 -0
- package/dist/viewer/src/utils.js +24 -0
- package/dist/viewer/src/utils.js.map +1 -0
- package/package.json +1 -1
- package/src/app.js +13 -0
- package/src/bridge-d3-react/README.md +42 -0
- package/src/bridge-d3-react/src/app.js +64 -0
- package/src/bridge-d3-react/src/index.js +16 -0
- package/src/bridge-d3-react/src/mock-choro.js +394 -0
- package/src/bridge-d3-react/src/react-chart-factory.jsx +65 -0
- package/src/index.js +10 -0
- package/src/rules/README.md +23 -0
- package/src/rules/src/chart/getAxisOptions.js +263 -0
- package/src/rules/src/chart/getBaseOptions.js +84 -0
- package/src/rules/src/chart/getChartOptions.js +118 -0
- package/src/rules/src/chart/getGridOptions.js +52 -0
- package/src/rules/src/chart/getTooltipOptions.js +230 -0
- package/src/rules/src/constants.js +64 -0
- package/src/rules/src/date.js +118 -0
- package/src/rules/src/dimension-utils.js +54 -0
- package/src/rules/src/factories/choro-series.js +65 -0
- package/src/rules/src/factories/sample-focus.js +22 -0
- package/src/rules/src/factories/sample-series.js +50 -0
- package/src/rules/src/factories/scatter-dimension.js +32 -0
- package/src/rules/src/factories/scatter-focus.js +39 -0
- package/src/rules/src/factories/scatter-series.js +92 -0
- package/src/rules/src/factories/stacked-dimension.js +29 -0
- package/src/rules/src/factories/stacked-series.js +185 -0
- package/src/rules/src/factories/symbol-dimension.js +29 -0
- package/src/rules/src/factories/symbol-series.js +62 -0
- package/src/rules/src/factories/timeline-focus.js +18 -0
- package/src/rules/src/factories/timeline-series.js +91 -0
- package/src/rules/src/get-values-enhanced.js +134 -0
- package/src/rules/src/header/getDefaultSubtitle.js +40 -0
- package/src/rules/src/header/getHeaderUnits.js +17 -0
- package/src/rules/src/header/getSubtitleFlags.js +43 -0
- package/src/rules/src/header/getTitleFlags.js +8 -0
- package/src/rules/src/header/index.js +4 -0
- package/src/rules/src/index.js +400 -0
- package/src/rules/src/layout.js +113 -0
- package/src/rules/src/observation-formater.js +83 -0
- package/src/rules/src/preparators/enhanceObservations.js +152 -0
- package/src/rules/src/preparators/formatValue.js +93 -0
- package/src/rules/src/preparators/getObservations.js +19 -0
- package/src/rules/src/preparators/getReportingYearStart.js +16 -0
- package/src/rules/src/properties/errors.js +19 -0
- package/src/rules/src/properties/focus.js +69 -0
- package/src/rules/src/properties/getAvailableChartTypes.js +34 -0
- package/src/rules/src/properties/getHeaderProps.js +74 -0
- package/src/rules/src/properties/getInformationsStateFromNewProps.js +47 -0
- package/src/rules/src/properties/getObservationsType.js +29 -0
- package/src/rules/src/properties/getStringifiedSubtitle.js +6 -0
- package/src/rules/src/properties/index.js +424 -0
- package/src/rules/src/properties/information.js +84 -0
- package/src/rules/src/properties/linear.js +129 -0
- package/src/rules/src/properties/scatter.js +158 -0
- package/src/rules/src/properties/stacked.js +98 -0
- package/src/rules/src/properties/symbol.js +79 -0
- package/src/rules/src/properties/utils.js +110 -0
- package/src/rules/src/sdmx-data/index.js +39 -0
- package/src/rules/src/table/factories/getCellValue.js +50 -0
- package/src/rules/src/table/index.js +1 -0
- package/src/rules/src/v8-transformer.js +177 -0
- package/src/rules2/src/applyHierarchicalCodesToDim.js +123 -0
- package/src/rules2/src/combinedValuesDisplay.js +74 -0
- package/src/rules2/src/constants.js +6 -0
- package/src/rules2/src/duplicateObservations.js +35 -0
- package/src/rules2/src/enhanceObservations.js +95 -0
- package/src/rules2/src/getAdvAttrSeriesAtCoordinates.js +29 -0
- package/src/rules2/src/getAttributesSeries.js +36 -0
- package/src/rules2/src/getCombinationDefinitions.js +47 -0
- package/src/rules2/src/getDataflowAttributes.js +23 -0
- package/src/rules2/src/getDataflowTooltipAttributesIds.js +31 -0
- package/src/rules2/src/getDimensionValuesIndexes.js +13 -0
- package/src/rules2/src/getHCodelistsRefsInData.js +32 -0
- package/src/rules2/src/getHeaderCombinations.js +48 -0
- package/src/rules2/src/getHeaderCoordinates.js +7 -0
- package/src/rules2/src/getHeaderSubtitle.js +34 -0
- package/src/rules2/src/getHeaderTitle.js +15 -0
- package/src/rules2/src/getMSDInformations.js +23 -0
- package/src/rules2/src/getManyValuesDimensions.js +34 -0
- package/src/rules2/src/getMetadataCoordinates.js +37 -0
- package/src/rules2/src/getMetadataStructureFromData.js +17 -0
- package/src/rules2/src/getNotDisplayedIds.js +53 -0
- package/src/rules2/src/getOneValueDimensions.js +34 -0
- package/src/rules2/src/getSeriesCombinations.js +24 -0
- package/src/rules2/src/hasCellMetadata.js +14 -0
- package/src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js +57 -0
- package/src/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js +35 -0
- package/src/rules2/src/index.js +50 -0
- package/src/rules2/src/parseAttributes.js +41 -0
- package/src/rules2/src/parseCombinations.js +102 -0
- package/src/rules2/src/parseHierarchicalCodelist.js +48 -0
- package/src/rules2/src/parseMetadataSeries.js +121 -0
- package/src/rules2/src/prepareData.js +75 -0
- package/src/rules2/src/refineAttributes.js +16 -0
- package/src/rules2/src/refineDimensions.js +18 -0
- package/src/rules2/src/refineMetadataCoordinates.js +28 -0
- package/src/rules2/src/refineTimePeriod.js +127 -0
- package/src/rules2/src/sdmx3.0DataFormatPatch.js +9 -0
- package/src/rules2/src/table/declineObservationsOverAttributes.js +32 -0
- package/src/rules2/src/table/getCells.js +93 -0
- package/src/rules2/src/table/getCellsAttributesIds.js +38 -0
- package/src/rules2/src/table/getCellsMetadataCoordinates.js +13 -0
- package/src/rules2/src/table/getCombinationDimensionsData.js +39 -0
- package/src/rules2/src/table/getCuratedCells.js +33 -0
- package/src/rules2/src/table/getFlagsAndNotes.js +23 -0
- package/src/rules2/src/table/getIndexedCombinationsByDisplay.js +16 -0
- package/src/rules2/src/table/getLayout.js +84 -0
- package/src/rules2/src/table/getLayoutData2.js +202 -0
- package/src/rules2/src/table/getSortedLayoutIndexes.js +138 -0
- package/src/rules2/src/table/getTableLabelAccessor.js +9 -0
- package/src/rules2/src/table/getTableLayoutIds.js +314 -0
- package/src/rules2/src/table/getTableProps.js +82 -0
- package/src/rules2/src/table/parseSeriesIndexesHierarchies.js +79 -0
- package/src/rules2/src/table/parseValueHierarchy.js +33 -0
- package/src/rules2/src/table/refineLayoutSize2.js +321 -0
- package/src/rules2/src/utils.js +37 -0
- package/src/viewer/mocks/bar.js +33 -0
- package/src/viewer/mocks/gpp-symbol.js +93 -0
- package/src/viewer/mocks/gpp-time.js +1103 -0
- package/src/viewer/mocks/row.js +39 -0
- package/src/viewer/mocks/scatter.js +93 -0
- package/src/viewer/mocks/stack.js +161 -0
- package/src/viewer/src/app/leg.js +36 -0
- package/src/viewer/src/app/nodata-res.js +22 -0
- package/src/viewer/src/app/nodata-sized.js +23 -0
- package/src/viewer/src/app/one-table-cell.js +70 -0
- package/src/viewer/src/app/table.js +423 -0
- package/src/viewer/src/app/use-case-1.js +33 -0
- package/src/viewer/src/app/use-case-2.js +38 -0
- package/src/viewer/src/app/use-case-3.js +18 -0
- package/src/viewer/src/app.js +116 -0
- package/src/viewer/src/chart.jsx +52 -0
- package/src/viewer/src/chartUtils/options.js +30 -0
- package/src/viewer/src/chartUtils/series.js +51 -0
- package/src/viewer/src/footer.jsx +23 -0
- package/src/viewer/src/header.jsx +10 -0
- package/src/viewer/src/index.jsx +158 -0
- package/src/viewer/src/legends/AxisLegend.jsx +41 -0
- package/src/viewer/src/legends/ChartLegends.jsx +66 -0
- package/src/viewer/src/legends/FocusLegend.jsx +63 -0
- package/src/viewer/src/legends/Legend.jsx +46 -0
- package/src/viewer/src/legends/SeriesLegend.jsx +78 -0
- package/src/viewer/src/utils.js +21 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
import { getChartOptions } from '../../../rules/src/chart/getChartOptions';
|
|
3
|
+
import { getFontFromTheme, getOptionsFromFont } from '../utils';
|
|
4
|
+
|
|
5
|
+
export default (options, data, type, theme, timeFormats, locale) => {
|
|
6
|
+
const axisFontOptions = R.pipe(getFontFromTheme(['axis']), getOptionsFromFont)(theme);
|
|
7
|
+
const annotationFontOptions = R.pipe(getFontFromTheme(['annotation']), getOptionsFromFont)(theme);
|
|
8
|
+
const tooltipFonts = {
|
|
9
|
+
primary: getFontFromTheme(['tooltip', 'primary'])(theme),
|
|
10
|
+
secondary: getFontFromTheme(['tooltip', 'secondary'])(theme)
|
|
11
|
+
};
|
|
12
|
+
const optionsWithFonts = R.evolve({
|
|
13
|
+
axis: R.pipe(
|
|
14
|
+
R.over(
|
|
15
|
+
R.lensPath(['x', 'font']),
|
|
16
|
+
R.pipe(R.when(R.isNil, R.always({})), R.mergeRight(axisFontOptions))
|
|
17
|
+
),
|
|
18
|
+
R.over(
|
|
19
|
+
R.lensPath(['y', 'font']),
|
|
20
|
+
R.pipe(R.when(R.isNil, R.always({})), R.mergeRight(axisFontOptions))
|
|
21
|
+
)
|
|
22
|
+
),
|
|
23
|
+
serie: R.over(
|
|
24
|
+
R.lensPath(['annotation', 'font']),
|
|
25
|
+
R.pipe(R.when(R.isNil, R.always({})), R.mergeRight(annotationFontOptions))
|
|
26
|
+
)
|
|
27
|
+
})(options);
|
|
28
|
+
|
|
29
|
+
return getChartOptions(data, type, optionsWithFonts, tooltipFonts, timeFormats, locale);
|
|
30
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
import { H_SYMBOL, TIMELINE, V_SYMBOL } from '../../../rules/src/constants';
|
|
3
|
+
|
|
4
|
+
const isFocused = (obj) => {
|
|
5
|
+
const highlightIndex = R.propOr(-1, 'highlightIndex', obj);
|
|
6
|
+
const baselineIndex = R.propOr(-1, 'baselineIndex', obj);
|
|
7
|
+
return ((highlightIndex > -1) || (baselineIndex > -1));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const sampleFilterSeries = (series) => (
|
|
11
|
+
R.map(
|
|
12
|
+
serie => {
|
|
13
|
+
const _datapoints = R.filter(isFocused, serie.datapoints);
|
|
14
|
+
return { ...serie, datapoints: _datapoints };
|
|
15
|
+
},
|
|
16
|
+
series
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const lineFilterSeries = R.filter(isFocused);
|
|
21
|
+
|
|
22
|
+
export default (series, type, options) => {
|
|
23
|
+
const responsiveFocusFilter = R.pathOr(true, ['serie', 'responsiveFocusFilter'], options);
|
|
24
|
+
if (!responsiveFocusFilter) {
|
|
25
|
+
return series;
|
|
26
|
+
}
|
|
27
|
+
const height = R.path(['base', 'height'], options);
|
|
28
|
+
const width = R.path(['base', 'width'], options);
|
|
29
|
+
const minWidth = R.path(['base', 'minDisplayWidth'], options);
|
|
30
|
+
const minHeight = R.path(['base', 'minDisplayHeight'], options);
|
|
31
|
+
let filtered;
|
|
32
|
+
if (type === H_SYMBOL) {
|
|
33
|
+
if (height < minHeight) {
|
|
34
|
+
filtered = sampleFilterSeries(series);
|
|
35
|
+
return R.isEmpty(filtered[0].datapoints) ? series : filtered;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (type === TIMELINE) {
|
|
39
|
+
if (height < minHeight) {
|
|
40
|
+
filtered = lineFilterSeries(series);
|
|
41
|
+
return R.isEmpty(filtered) ? series : filtered;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (type === V_SYMBOL) {
|
|
45
|
+
if (width < minWidth) {
|
|
46
|
+
filtered = sampleFilterSeries(series);
|
|
47
|
+
return R.isEmpty(filtered[0].datapoints) ? series : filtered;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return series;
|
|
51
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DataFooter } from '@sis-cc/dotstatsuite-visions';
|
|
3
|
+
import ChartLegends from './legends/ChartLegends.jsx';
|
|
4
|
+
import { isChartNoData } from './utils';
|
|
5
|
+
|
|
6
|
+
const Footer = ({ type, chartData, source, logo, copyright, chartOptions, isSticky, target, width }) => {
|
|
7
|
+
const hasNoLegend = type === 'table' || isChartNoData({ data: chartData, type });
|
|
8
|
+
const legend = hasNoLegend ? null : <ChartLegends data={chartData} options={chartOptions} type={type} width={width} />;
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<div {...(target ? { ref: target } : {})}>
|
|
12
|
+
<DataFooter
|
|
13
|
+
source={source}
|
|
14
|
+
logo={logo}
|
|
15
|
+
copyright={copyright}
|
|
16
|
+
legend={legend}
|
|
17
|
+
isSticky={isSticky}
|
|
18
|
+
/>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export default Footer;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import * as R from 'ramda';
|
|
3
|
+
import useSize from '@react-hook/size';
|
|
4
|
+
import { Loading, NoData, TableHtml5 } from '@sis-cc/dotstatsuite-visions';
|
|
5
|
+
import { makeStyles, useTheme } from '@mui/styles';
|
|
6
|
+
import getChartOptions from './chartUtils/options.js';
|
|
7
|
+
import Header from './header.jsx';
|
|
8
|
+
import Chart from './chart.jsx';
|
|
9
|
+
import Footer from './footer.jsx';
|
|
10
|
+
import { isChartDataNotReady } from './utils.js';
|
|
11
|
+
|
|
12
|
+
const useStyles = makeStyles(() => ({
|
|
13
|
+
container: {
|
|
14
|
+
borderColor: '#007bc7',
|
|
15
|
+
borderBottomWidth: 1,
|
|
16
|
+
borderLeftWidth: 0,
|
|
17
|
+
borderTopWidth: 1,
|
|
18
|
+
borderRightWidth: 0,
|
|
19
|
+
borderStyle: 'solid',
|
|
20
|
+
'& svg text::selection': {
|
|
21
|
+
background: 'none'
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
tableContainer: {
|
|
25
|
+
minWidth: '100%',
|
|
26
|
+
minHeight: '100%',
|
|
27
|
+
willChange: 'transform, opacity'
|
|
28
|
+
},
|
|
29
|
+
chartContainer: {
|
|
30
|
+
width: ({ fixedWidth }) => fixedWidth || '100%',
|
|
31
|
+
height: ({ fixedHeight }) => fixedHeight || '100%',
|
|
32
|
+
overflow: 'hidden',
|
|
33
|
+
position: 'relative'
|
|
34
|
+
}
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
const ViewContent = ({ loading, loadingProps = {}, type, width, errorMessage, ...rest }) => {
|
|
38
|
+
if (loading)
|
|
39
|
+
return <Loading message={loading} {...loadingProps} />;
|
|
40
|
+
if (errorMessage)
|
|
41
|
+
return <NoData message={errorMessage} />;
|
|
42
|
+
|
|
43
|
+
if (type === 'table') {
|
|
44
|
+
const tableProps = R.propOr({}, 'tableProps', rest);
|
|
45
|
+
const hasNoObs = R.pipe(R.prop('cells'), R.anyPass([R.isNil, R.isEmpty]))(tableProps);
|
|
46
|
+
if (hasNoObs) return <Loading />;
|
|
47
|
+
|
|
48
|
+
return <TableHtml5 isRtl={R.prop('isRtl', rest)} {...tableProps} />;
|
|
49
|
+
}
|
|
50
|
+
if (isChartDataNotReady({ data: R.prop('chartData', rest) }) || !width) {
|
|
51
|
+
return <Loading />;
|
|
52
|
+
}
|
|
53
|
+
return (
|
|
54
|
+
<Chart
|
|
55
|
+
data={R.prop('chartData', rest)}
|
|
56
|
+
getAxisOptions={R.prop('getAxisOptions', rest)}
|
|
57
|
+
heightOffsets={R.prop('heightOffsets', rest)}
|
|
58
|
+
options={R.prop('chartOptions', rest)}
|
|
59
|
+
type={type}
|
|
60
|
+
width={width}
|
|
61
|
+
/>
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const Viewer = ({ type, targets = {}, width, ...rest }) => {
|
|
66
|
+
const classes = useStyles({
|
|
67
|
+
fixedWidth: rest.fixedWidth,
|
|
68
|
+
fixedHeight: rest.fixedHeight
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<div
|
|
73
|
+
{...(targets.viewer ? { ref: targets.viewer } : {})}
|
|
74
|
+
className={R.join(' ')(
|
|
75
|
+
[classes.container,
|
|
76
|
+
type === 'table' ? classes.tableContainer : classes.chartContainer]
|
|
77
|
+
)}
|
|
78
|
+
>
|
|
79
|
+
<Header
|
|
80
|
+
target={targets.header}
|
|
81
|
+
{...R.propOr({}, 'headerProps', rest)}
|
|
82
|
+
/>
|
|
83
|
+
<ViewContent type={type} width={width} {...rest} />
|
|
84
|
+
<Footer
|
|
85
|
+
width={width}
|
|
86
|
+
target={targets.footer}
|
|
87
|
+
type={type}
|
|
88
|
+
chartData={R.prop('chartData', rest)}
|
|
89
|
+
chartOptions={R.prop('chartOptions', rest)}
|
|
90
|
+
{...R.prop('footerProps', rest)}
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const defaultChartHeight = chartOptions => R.pipe(
|
|
97
|
+
R.path(['base', 'height']),
|
|
98
|
+
h => (R.isNil(h) || isNaN(h)) ? 0 : h
|
|
99
|
+
)(chartOptions);
|
|
100
|
+
|
|
101
|
+
const ViewerWrapper = ({ chartOptions, type, getResponsiveSize, ...props }) => {
|
|
102
|
+
const theme = useTheme();
|
|
103
|
+
const viewerTarget = React.useRef(null);
|
|
104
|
+
const headerTarget = React.useRef(null);
|
|
105
|
+
const footerTarget = React.useRef(null);
|
|
106
|
+
const [viewerWidth, viewerHeight] = useSize(viewerTarget);
|
|
107
|
+
const [_, headerHeight] = useSize(headerTarget, { initialHeight: -1 });
|
|
108
|
+
const [___, footerHeight] = useSize(footerTarget, { initialHeight: -1 });
|
|
109
|
+
const [chartSvgHeight, setChartSvgHeight] = useState(0);
|
|
110
|
+
const defChartHeight = defaultChartHeight(chartOptions);
|
|
111
|
+
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (R.is(Function, getResponsiveSize) && viewerWidth && headerHeight !== -1 && footerHeight !== -1) {
|
|
114
|
+
getResponsiveSize({
|
|
115
|
+
responsiveWidth: viewerWidth,
|
|
116
|
+
responsiveHeight: viewerHeight
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}, [viewerWidth, viewerHeight]);
|
|
120
|
+
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
if (headerHeight !== -1 && footerHeight !== -1 && !isNaN(headerHeight) && !isNaN(footerHeight)) {
|
|
123
|
+
const nextHeight = defChartHeight - headerHeight - footerHeight - 2;
|
|
124
|
+
setChartSvgHeight(nextHeight);
|
|
125
|
+
}
|
|
126
|
+
}, [headerHeight, footerHeight, defChartHeight]);
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if (type === 'table') {
|
|
130
|
+
return <Viewer
|
|
131
|
+
{...props}
|
|
132
|
+
width={viewerWidth}
|
|
133
|
+
type={type}
|
|
134
|
+
/>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const preparedChartOptions = R.pipe(
|
|
138
|
+
R.over(R.lensPath(['base', 'width']), R.when(R.anyPass([R.isNil, isNaN]), R.always(viewerWidth || 0))),
|
|
139
|
+
R.set(R.lensPath(['base', 'height']), chartSvgHeight),
|
|
140
|
+
chartOptions => getChartOptions(chartOptions, props.chartData, type, theme, props.timeFormats, props.locale),
|
|
141
|
+
)(chartOptions);
|
|
142
|
+
|
|
143
|
+
return <Viewer
|
|
144
|
+
{...props}
|
|
145
|
+
type={type}
|
|
146
|
+
chartOptions={preparedChartOptions}
|
|
147
|
+
fixedWidth={R.path(['base', 'width'], chartOptions)}
|
|
148
|
+
fixedHeight={defChartHeight}
|
|
149
|
+
targets={{
|
|
150
|
+
viewer: viewerTarget,
|
|
151
|
+
header: headerTarget,
|
|
152
|
+
footer: footerTarget
|
|
153
|
+
}}
|
|
154
|
+
width={viewerWidth}
|
|
155
|
+
/>;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export default ViewerWrapper;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as R from 'ramda';
|
|
3
|
+
import makeStyles from '@mui/styles/makeStyles';
|
|
4
|
+
import { SCATTER } from '../../../rules/src/constants';
|
|
5
|
+
import { getFontFromTheme } from '../utils';
|
|
6
|
+
|
|
7
|
+
const useStyles = makeStyles(theme => {
|
|
8
|
+
const legendFont = getFontFromTheme(['axisLegend'])(theme);
|
|
9
|
+
return ({
|
|
10
|
+
xLegend: legendFont,
|
|
11
|
+
yLegend: {
|
|
12
|
+
...legendFont,
|
|
13
|
+
left: 10,
|
|
14
|
+
position: 'absolute',
|
|
15
|
+
zIndex: 1,
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const getAxisLabel = axis => R.pipe(
|
|
21
|
+
R.propOr([], 'series'),
|
|
22
|
+
R.head,
|
|
23
|
+
R.when(R.isNil, R.always({})),
|
|
24
|
+
R.path(['dimensionValues', axis, 'name'])
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const AxisLegend = ({ axis, data, type }) => {
|
|
28
|
+
const classes = useStyles();
|
|
29
|
+
if (!R.equals(SCATTER, type))
|
|
30
|
+
return null;
|
|
31
|
+
switch (axis) {
|
|
32
|
+
case 'x':
|
|
33
|
+
return <span className={classes.xLegend}>→ {getAxisLabel('x')(data)}</span>;
|
|
34
|
+
case 'y':
|
|
35
|
+
return <span className={classes.yLegend}>↑ {getAxisLabel('y')(data)}</span>;
|
|
36
|
+
default:
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default AxisLegend;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as R from 'ramda';
|
|
3
|
+
import numeral from 'numeral';
|
|
4
|
+
import { computeOptions } from '@sis-cc/dotstatsuite-d3-charts';
|
|
5
|
+
import { ChoroplethLegend } from '../../../bridge-d3-react/src';
|
|
6
|
+
import { useTheme } from '@mui/material/styles';
|
|
7
|
+
import AxisLegend from './AxisLegend.jsx';
|
|
8
|
+
import FocusLegend from './FocusLegend.jsx';
|
|
9
|
+
import SeriesLegend from './SeriesLegend.jsx';
|
|
10
|
+
import { CHORO } from '../../../rules/src/constants';
|
|
11
|
+
import { getFontFromTheme, getOptionsFromFont } from '../utils';
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const ChoroLegend = ({ type, options, data }) => {
|
|
15
|
+
if (type !== CHORO) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const theme = useTheme();
|
|
19
|
+
const fontOptions = R.pipe(getFontFromTheme(['mapLegend']), getOptionsFromFont)(theme);
|
|
20
|
+
const legendOptions = R.mergeDeepLeft(
|
|
21
|
+
options,
|
|
22
|
+
{
|
|
23
|
+
legend: {
|
|
24
|
+
choropleth: {
|
|
25
|
+
width: 300,
|
|
26
|
+
height: 30,
|
|
27
|
+
margin: { left: 15, right: 15 },
|
|
28
|
+
axis: {
|
|
29
|
+
thickness: 0,
|
|
30
|
+
orient: 'bottom',
|
|
31
|
+
font: fontOptions,
|
|
32
|
+
tick: {
|
|
33
|
+
size: 5,
|
|
34
|
+
thickness: 0
|
|
35
|
+
},
|
|
36
|
+
format: {
|
|
37
|
+
proc: d => numeral(d).format('0,0.[00]')
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<ChoroplethLegend options={legendOptions} data={data.series} />
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const ChartLegends = ({ data, options, type, width }) => {
|
|
51
|
+
const engineOptions = R.pipe(
|
|
52
|
+
R.assocPath(['serie', 'stacked', 'layerSeries'], R.pathOr([], ['series', 0, 'layerSeries'], data)),
|
|
53
|
+
computeOptions
|
|
54
|
+
)(options);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<div>
|
|
58
|
+
<AxisLegend axis="x" data={data} type={type} />
|
|
59
|
+
<FocusLegend data={data} options ={engineOptions} type={type} width={width} />
|
|
60
|
+
<SeriesLegend data={data} options={engineOptions} type={type} />
|
|
61
|
+
<ChoroLegend data={data} options={options} type={type} />
|
|
62
|
+
</div>
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export default ChartLegends;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as R from 'ramda';
|
|
3
|
+
import Legend from './Legend.jsx';
|
|
4
|
+
import { SCATTER, TIMELINE } from '../../../rules/src/constants';
|
|
5
|
+
|
|
6
|
+
export const REDUCED_THRESHOLD = 160;
|
|
7
|
+
|
|
8
|
+
const scatterRenderer = ({ color }) => (
|
|
9
|
+
<svg width='12' height='14'>
|
|
10
|
+
<circle cx='7' cy='7' r='4' stroke={color} fill={color} />
|
|
11
|
+
</svg>
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
const lineRenderer = ({ color }) => (
|
|
15
|
+
<svg width='12' height='14'>
|
|
16
|
+
<line x1='0' y1='7' x2='11' y2='7' stroke={color} strokeWidth='2' />
|
|
17
|
+
</svg>
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const FocusLegend = ({ data, options, type, width }) => {
|
|
21
|
+
if (width < REDUCED_THRESHOLD) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const itemRenderer = R.pipe(
|
|
26
|
+
R.when(R.always(type === SCATTER), R.always(scatterRenderer)),
|
|
27
|
+
R.when(R.always(type === TIMELINE), R.always(lineRenderer)),
|
|
28
|
+
)(null);
|
|
29
|
+
|
|
30
|
+
const getItemLabel = R.ifElse(
|
|
31
|
+
R.equals(SCATTER),
|
|
32
|
+
R.always(R.pipe(R.prop('label'), R.split(' - '), R.last)),
|
|
33
|
+
R.always(R.prop('label'))
|
|
34
|
+
)(type);
|
|
35
|
+
|
|
36
|
+
const items = R.pipe(
|
|
37
|
+
R.pathOr({}, ['share', 'focused']),
|
|
38
|
+
R.mapObjIndexed((selection, key) => {
|
|
39
|
+
if (R.isNil(selection)) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const colors = R.pathOr([], ['serie', `${key}Colors`], options);
|
|
43
|
+
const nColors = R.length(colors);
|
|
44
|
+
return R.pipe(
|
|
45
|
+
R.addIndex(R.map)((entry, index) => {
|
|
46
|
+
if (entry.value === 'uniq-dp') {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const color = R.nth(index % nColors, colors);
|
|
50
|
+
return ({ color, label: getItemLabel(entry) });
|
|
51
|
+
}),
|
|
52
|
+
R.filter(R.identity)
|
|
53
|
+
)(selection);
|
|
54
|
+
}),
|
|
55
|
+
R.props(['baseline', 'highlight']),
|
|
56
|
+
R.filter(R.identity),
|
|
57
|
+
R.unnest
|
|
58
|
+
)(data)
|
|
59
|
+
|
|
60
|
+
return (<Legend items={items} itemRenderer={itemRenderer} />);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export default FocusLegend;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as R from 'ramda';
|
|
3
|
+
import makeStyles from '@mui/styles/makeStyles';
|
|
4
|
+
import { getFontFromTheme } from '../utils';
|
|
5
|
+
|
|
6
|
+
const useStyles = makeStyles(theme => ({
|
|
7
|
+
legend: {
|
|
8
|
+
...getFontFromTheme(['chartLegend'])(theme),
|
|
9
|
+
display: 'flex',
|
|
10
|
+
flexDirection: 'row',
|
|
11
|
+
flexWrap: 'wrap',
|
|
12
|
+
justifyContent: 'flex-start',
|
|
13
|
+
},
|
|
14
|
+
entry: {
|
|
15
|
+
alignItems: 'center',
|
|
16
|
+
display: 'flex',
|
|
17
|
+
flexDirection: 'row',
|
|
18
|
+
flexWrap: 'wrap',
|
|
19
|
+
marginLeft: 10,
|
|
20
|
+
},
|
|
21
|
+
text: { marginLeft: 5 }
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
const Legend = ({ items, itemRenderer }) => {
|
|
25
|
+
if (!R.is(Function, (itemRenderer)) || R.isNil(items) || R.isEmpty(items)) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const classes = useStyles();
|
|
30
|
+
|
|
31
|
+
const legendEntries = R.addIndex(R.map)(
|
|
32
|
+
(entry, index) => {
|
|
33
|
+
const style = R.isNil(entry.color) ? {} : { color: entry.color };
|
|
34
|
+
return (
|
|
35
|
+
<div className={classes.entry} style={style} key={index}>
|
|
36
|
+
{itemRenderer(entry)}
|
|
37
|
+
<div className={classes.text} >{R.prop('label', entry)}</div>
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
)(items);
|
|
42
|
+
|
|
43
|
+
return (<div className={classes.legend} >{legendEntries}</div>);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default Legend;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as R from 'ramda';
|
|
3
|
+
import Legend from './Legend.jsx';
|
|
4
|
+
import { H_SYMBOL, STACKED_BAR, STACKED_ROW, V_SYMBOL } from '../../../rules/src/constants';
|
|
5
|
+
|
|
6
|
+
const getSymbolSeriesItems = ({ data, options }) => {
|
|
7
|
+
const symbolMarkers = R.path(['serie', 'symbol', 'markers'], options);
|
|
8
|
+
const nMarkers = R.length(symbolMarkers);
|
|
9
|
+
const markerSize = Number(R.path(['serie', 'symbol', 'markerDefaultSize'], options));
|
|
10
|
+
const strokeWidth = R.path(['serie', 'symbol', 'markerDefaultStrokeWidth'], options);
|
|
11
|
+
const size = Math.round(Math.sqrt(markerSize)) + 8;
|
|
12
|
+
return R.pipe(
|
|
13
|
+
R.pathOr([], ['series', 0, 'symbolValues']),
|
|
14
|
+
R.addIndex(R.map)(
|
|
15
|
+
(label, serieIndex) => {
|
|
16
|
+
const marker = R.nth(serieIndex % nMarkers, symbolMarkers);
|
|
17
|
+
return ({
|
|
18
|
+
d: marker.path(markerSize),
|
|
19
|
+
transform: `translate(${size / 2}, ${size / 2}) rotate(${R.propOr(0, 'rotate', marker)})`,
|
|
20
|
+
style: R.pipe(
|
|
21
|
+
R.mergeRight({ strokeWidth }),
|
|
22
|
+
R.when(
|
|
23
|
+
s => s.fill !== s.stroke,
|
|
24
|
+
R.assoc('fill', 'white')
|
|
25
|
+
)
|
|
26
|
+
)(marker.style),
|
|
27
|
+
size,
|
|
28
|
+
label
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
)(data);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const getStackedSeriesItems = R.pipe(
|
|
36
|
+
R.pathOr([], ['options', 'serie', 'stacked', 'layerSeries']),
|
|
37
|
+
R.when(s => R.length(s) === 1, R.always([]))
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const stackedLayerRenderer = ({ baseColor }) => (
|
|
41
|
+
<svg width="21" height="14">
|
|
42
|
+
<rect x='0' y='0' width='21' height='14' fill={baseColor} />
|
|
43
|
+
</svg>
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const symbolRenderer = ({ d, size, style, transform }) => (
|
|
47
|
+
<svg width={size} height={size}>
|
|
48
|
+
<path
|
|
49
|
+
d={d}
|
|
50
|
+
transform={transform}
|
|
51
|
+
{...style}
|
|
52
|
+
/>
|
|
53
|
+
</svg>
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// stacked entries = [{ label, color }];
|
|
57
|
+
|
|
58
|
+
const SeriesLegend = ({ data, options, type }) => {
|
|
59
|
+
const itemRenderer = R.pipe(
|
|
60
|
+
R.when(R.always(type === H_SYMBOL || type === V_SYMBOL), R.always(symbolRenderer)),
|
|
61
|
+
R.when(R.always(type === STACKED_BAR || type === STACKED_ROW), R.always(stackedLayerRenderer))
|
|
62
|
+
)(null);
|
|
63
|
+
|
|
64
|
+
if (R.isNil(itemRenderer)) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const seriesItems = R.pipe(
|
|
69
|
+
R.when(R.always(type === H_SYMBOL || type === V_SYMBOL), getSymbolSeriesItems),
|
|
70
|
+
R.when(R.always(type === STACKED_BAR || type === STACKED_ROW), getStackedSeriesItems)
|
|
71
|
+
)({ data, options });
|
|
72
|
+
|
|
73
|
+
return (
|
|
74
|
+
<Legend items={seriesItems} itemRenderer={itemRenderer} />
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default SeriesLegend;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
|
|
3
|
+
export const isChartNoData = R.anyPass([
|
|
4
|
+
R.pipe(R.path(['data', 'series']), R.isEmpty),
|
|
5
|
+
R.allPass([
|
|
6
|
+
R.pipe(R.prop('type'), R.equals('ChoroplethChart'), R.not),
|
|
7
|
+
R.pipe(R.path(['data', 'series', 0, 'datapoints']), R.anyPass([R.isNil, R.isEmpty]))
|
|
8
|
+
])
|
|
9
|
+
]);
|
|
10
|
+
|
|
11
|
+
export const isChartDataNotReady = R.pipe(R.path(['data', 'series']), R.isNil);
|
|
12
|
+
|
|
13
|
+
export const getFontFromTheme = customPath => R.converge(
|
|
14
|
+
R.mergeRight,
|
|
15
|
+
[R.pathOr({}, ['mixins', 'chart', 'main']), R.pathOr({}, R.concat(['mixins', 'chart'], customPath))]
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
export const getOptionsFromFont = R.pipe(
|
|
19
|
+
R.props(['color', 'fontFamily', 'fontSize', 'fontWeight']),
|
|
20
|
+
([color, family, size, weight]) => ({ color, size, family, weight })
|
|
21
|
+
);
|