@hisptz/dhis2-analytics 2.1.11 → 2.1.13

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.
@@ -57,7 +57,18 @@ function getColumnSeries(analytics, header, config, highchartsType) {
57
57
  return {
58
58
  id: seriesDimensionValue,
59
59
  name: items?.[seriesDimensionValue]?.name,
60
- data,
60
+ data: config.legendSet ? data.map((value, index2) => {
61
+ const color = getLegendColorFromValue({
62
+ legendSet: config.legendSet,
63
+ value: value ?? 0
64
+ });
65
+ return {
66
+ x: index2,
67
+ y: value,
68
+ value,
69
+ color
70
+ };
71
+ }) : data,
61
72
  type: highchartsType,
62
73
  color: colors[index % colors.length]
63
74
  };
@@ -111,6 +122,19 @@ function updateLayout(config, { type }) {
111
122
  }
112
123
  return updatedLayout;
113
124
  }
125
+ function getLegendColorFromValue({
126
+ legendSet,
127
+ value
128
+ }) {
129
+ if (!legendSet && !value) {
130
+ return null;
131
+ }
132
+ const legends = legendSet?.legends ?? [];
133
+ const legend = legends.find((l) => {
134
+ return l.startValue === value || l.endValue === value || l.startValue < value && value < l.endValue;
135
+ });
136
+ return legend?.color ?? null;
137
+ }
114
138
  function getChartInstance(id, analytics, config) {
115
139
  switch (config.type) {
116
140
  case "column":
@@ -146,6 +170,7 @@ exports.getAllCategories = getAllCategories;
146
170
  exports.getChartInstance = getChartInstance;
147
171
  exports.getColumnSeries = getColumnSeries;
148
172
  exports.getDimensionHeaderIndex = getDimensionHeaderIndex;
173
+ exports.getLegendColorFromValue = getLegendColorFromValue;
149
174
  exports.getPointSeries = getPointSeries;
150
175
  exports.updateLayout = updateLayout;
151
176
  //# sourceMappingURL=chart.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ChartAnalytics/utils/chart.ts"],"names":["findIndex","header","head","find","row","compact","set","isEmpty","DHIS2ColumnChart","DHIS2BarChart","DHIS2StackedBarChart","DHIS2StackedColumnChart","DHIS2PieChart","DHIS2LineChart","DHIS2AreaChart","DHISStackedAreaChart","DHIS2MultiSeriesChart","DHIS2GaugeChart","DHIS2RadarChart","DHIS2ScatterChart"],"mappings":"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","file":"chart.js","sourcesContent":["import type {\n\tAnalytics,\n\tAnalyticsHeader,\n\tAnalyticsMetadata,\n} from \"@hisptz/dhis2-utils\";\nimport { compact, find, findIndex, head, isEmpty, set } from \"lodash\";\nimport { DHIS2Chart } from \"../models\";\nimport { DHIS2ColumnChart, DHIS2StackedColumnChart } from \"../models/column.js\";\nimport { DHIS2LineChart } from \"../models/line.js\";\nimport { DHIS2MultiSeriesChart } from \"../models/multi-series.js\";\nimport { DHIS2PieChart } from \"../models/pie.js\";\nimport { ChartConfig, ChartType } from \"../types/props.js\";\nimport { DHIS2BarChart, DHIS2StackedBarChart } from \"../models/bar.js\";\nimport { DHIS2GaugeChart } from \"../models/gauge\";\nimport { DHIS2AreaChart, DHISStackedAreaChart } from \"../models/area\";\nimport { DHIS2RadarChart } from \"../models/radar\";\nimport { DHIS2ScatterChart } from \"../models/scatter\";\n\nexport function getDimensionHeaderIndex(\n\theaders: AnalyticsHeader[],\n\tname: string,\n): number {\n\treturn findIndex(headers, { name });\n}\n\nexport function getPointSeries(\n\tanalytics: Analytics,\n\tconfig: ChartConfig,\n\thighchartsType: string,\n) {\n\tconst series: string[] = config.layout.series;\n\n\treturn series.map((seriesName: string) => {\n\t\tconst header = analytics?.headers?.find(\n\t\t\t(header: any) => header.name === seriesName,\n\t\t);\n\t\tif (!header) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (analytics?.metaData) {\n\t\t\treturn getColumnSeries(analytics, header, config, highchartsType);\n\t\t}\n\t})[0];\n}\n\nexport function getColumnSeries(\n\tanalytics: Analytics,\n\theader: AnalyticsHeader,\n\tconfig: ChartConfig,\n\thighchartsType: string,\n): any {\n\tconst headerIndex = analytics?.headers?.findIndex(\n\t\t(h: { name: any }) => header.name === h.name,\n\t);\n\tconst valueIndex = analytics?.headers?.findIndex(\n\t\t(h: { name: string }) => h.name === \"value\",\n\t);\n\n\tconst colors = config.colors ?? [];\n\n\tconst { items, dimensions } = analytics?.metaData ?? {};\n\tconst categoriesDimension = config.layout.category;\n\n\tconst seriesDimensionValues: string[] =\n\t\tdimensions?.[header.name as \"dx\" | \"ou\" | \"pe\"] ?? [];\n\n\treturn head(\n\t\tcategoriesDimension?.map((categoryDimension: string) => {\n\t\t\tconst categories: string[] = dimensions?.[\n\t\t\t\tcategoryDimension as \"dx\" | \"ou\" | \"pe\"\n\t\t\t] as any;\n\t\t\tconst categoryDimensionIndex = analytics?.headers?.findIndex(\n\t\t\t\t(h: { name: string }) => h.name === categoryDimension,\n\t\t\t);\n\t\t\treturn seriesDimensionValues?.map(\n\t\t\t\t(seriesDimensionValue: string, index) => {\n\t\t\t\t\tconst data = categories?.map((category: string) => {\n\t\t\t\t\t\tconst row = find(\n\t\t\t\t\t\t\tanalytics?.rows,\n\t\t\t\t\t\t\t(row: any) =>\n\t\t\t\t\t\t\t\trow[headerIndex ?? -1] ===\n\t\t\t\t\t\t\t\t\tseriesDimensionValue &&\n\t\t\t\t\t\t\t\trow[categoryDimensionIndex ?? -1] === category,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn row?.[valueIndex ?? -1]\n\t\t\t\t\t\t\t? parseFloat(row?.[valueIndex ?? -1])\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: seriesDimensionValue,\n\t\t\t\t\t\tname: items?.[seriesDimensionValue as any]?.name,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\ttype: highchartsType,\n\t\t\t\t\t\tcolor: colors[index % colors.length],\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t);\n\t\t}),\n\t);\n}\n\nfunction getCategories(\n\t{ name }: AnalyticsHeader,\n\t{ items, dimensions }: AnalyticsMetadata,\n): string[] {\n\tconst categories: string[] = dimensions?.[\n\t\tname as \"dx\" | \"ou\" | \"pe\"\n\t] as any;\n\n\treturn categories?.map((category: string) => {\n\t\treturn items[category as any]?.name ?? \"\";\n\t}) as unknown as string[];\n}\n\nexport function getAllCategories(\n\tanalytics: Analytics,\n\tconfig: ChartConfig,\n): string[] {\n\tconst categories = config.layout.category;\n\n\treturn compact(\n\t\tcategories?.map((category: string) => {\n\t\t\tconst header = analytics?.headers?.find(\n\t\t\t\t(header: any) => header.name === category,\n\t\t\t);\n\t\t\tif (!header) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (analytics?.metaData) {\n\t\t\t\treturn getCategories(header, analytics?.metaData);\n\t\t\t}\n\t\t}),\n\t)[0];\n}\n\nexport function updateLayout(\n\tconfig: ChartConfig,\n\t{ type }: { type: ChartType },\n) {\n\tif (type === config.type) {\n\t\treturn config.layout;\n\t}\n\n\tconst updatedLayout = { ...config.layout };\n\n\tswitch (type) {\n\t\tcase \"pie\":\n\t\t\tset(updatedLayout, \"category\", []);\n\t\t\tif (isEmpty(updatedLayout.series)) {\n\t\t\t\tif (!isEmpty(config.layout.category)) {\n\t\t\t\t\tset(updatedLayout, \"series\", [\n\t\t\t\t\t\thead(config.layout.category),\n\t\t\t\t\t]);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Invalid layout for pie chart\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (updatedLayout.series.length > 1) {\n\t\t\t\tset(updatedLayout, \"series\", [head(updatedLayout.series)]);\n\t\t\t}\n\t}\n\n\treturn updatedLayout;\n}\n\nexport function getChartInstance(\n\tid: string,\n\tanalytics: Analytics,\n\tconfig: ChartConfig,\n): DHIS2Chart {\n\tswitch (config.type) {\n\t\tcase \"column\":\n\t\t\treturn new DHIS2ColumnChart(id, analytics, config);\n\t\tcase \"bar\":\n\t\t\treturn new DHIS2BarChart(id, analytics, config);\n\t\tcase \"stacked-bar\":\n\t\t\treturn new DHIS2StackedBarChart(id, analytics, config);\n\t\tcase \"stacked-column\":\n\t\t\treturn new DHIS2StackedColumnChart(id, analytics, config);\n\t\tcase \"pie\":\n\t\t\treturn new DHIS2PieChart(id, analytics, config);\n\t\tcase \"line\":\n\t\t\treturn new DHIS2LineChart(id, analytics, config);\n\t\tcase \"area\":\n\t\t\treturn new DHIS2AreaChart(id, analytics, config);\n\t\tcase \"stacked-area\":\n\t\t\treturn new DHISStackedAreaChart(id, analytics, config);\n\t\tcase \"multi-series\":\n\t\t\treturn new DHIS2MultiSeriesChart(id, analytics, config);\n\t\tcase \"gauge\":\n\t\t\treturn new DHIS2GaugeChart(id, analytics, config);\n\t\tcase \"radar\":\n\t\t\treturn new DHIS2RadarChart(id, analytics, config);\n\t\tcase \"scatter\":\n\t\t\treturn new DHIS2ScatterChart(id, analytics, config);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported chart type: ${config.type}`);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/components/ChartAnalytics/utils/chart.ts"],"names":["findIndex","header","head","find","row","index","compact","set","isEmpty","DHIS2ColumnChart","DHIS2BarChart","DHIS2StackedBarChart","DHIS2StackedColumnChart","DHIS2PieChart","DHIS2LineChart","DHIS2AreaChart","DHISStackedAreaChart","DHIS2MultiSeriesChart","DHIS2GaugeChart","DHIS2RadarChart","DHIS2ScatterChart"],"mappings":"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","file":"chart.js","sourcesContent":["import type {\n\tAnalytics,\n\tAnalyticsHeader,\n\tAnalyticsMetadata,\n\tLegendSet,\n} from \"@hisptz/dhis2-utils\";\nimport { compact, find, findIndex, head, isEmpty, set } from \"lodash\";\nimport { DHIS2Chart } from \"../models\";\nimport { DHIS2ColumnChart, DHIS2StackedColumnChart } from \"../models/column.js\";\nimport { DHIS2LineChart } from \"../models/line.js\";\nimport { DHIS2MultiSeriesChart } from \"../models/multi-series.js\";\nimport { DHIS2PieChart } from \"../models/pie.js\";\nimport { ChartConfig, ChartType } from \"../types/props.js\";\nimport { DHIS2BarChart, DHIS2StackedBarChart } from \"../models/bar.js\";\nimport { DHIS2GaugeChart } from \"../models/gauge\";\nimport { DHIS2AreaChart, DHISStackedAreaChart } from \"../models/area\";\nimport { DHIS2RadarChart } from \"../models/radar\";\nimport { DHIS2ScatterChart } from \"../models/scatter\";\n\nexport function getDimensionHeaderIndex(\n\theaders: AnalyticsHeader[],\n\tname: string,\n): number {\n\treturn findIndex(headers, { name });\n}\n\nexport function getPointSeries(\n\tanalytics: Analytics,\n\tconfig: ChartConfig,\n\thighchartsType: string,\n) {\n\tconst series: string[] = config.layout.series;\n\n\treturn series.map((seriesName: string) => {\n\t\tconst header = analytics?.headers?.find(\n\t\t\t(header: any) => header.name === seriesName,\n\t\t);\n\t\tif (!header) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (analytics?.metaData) {\n\t\t\treturn getColumnSeries(analytics, header, config, highchartsType);\n\t\t}\n\t})[0];\n}\n\nexport function getColumnSeries(\n\tanalytics: Analytics,\n\theader: AnalyticsHeader,\n\tconfig: ChartConfig,\n\thighchartsType: string,\n): any {\n\tconst headerIndex = analytics?.headers?.findIndex(\n\t\t(h: { name: any }) => header.name === h.name,\n\t);\n\tconst valueIndex = analytics?.headers?.findIndex(\n\t\t(h: { name: string }) => h.name === \"value\",\n\t);\n\n\tconst colors = config.colors ?? [];\n\n\tconst { items, dimensions } = analytics?.metaData ?? {};\n\tconst categoriesDimension = config.layout.category;\n\n\tconst seriesDimensionValues: string[] =\n\t\tdimensions?.[header.name as \"dx\" | \"ou\" | \"pe\"] ?? [];\n\n\treturn head(\n\t\tcategoriesDimension?.map((categoryDimension: string) => {\n\t\t\tconst categories: string[] = dimensions?.[\n\t\t\t\tcategoryDimension as \"dx\" | \"ou\" | \"pe\"\n\t\t\t] as any;\n\t\t\tconst categoryDimensionIndex = analytics?.headers?.findIndex(\n\t\t\t\t(h: { name: string }) => h.name === categoryDimension,\n\t\t\t);\n\t\t\treturn seriesDimensionValues?.map(\n\t\t\t\t(seriesDimensionValue: string, index) => {\n\t\t\t\t\tconst data = categories?.map((category: string) => {\n\t\t\t\t\t\tconst row = find(\n\t\t\t\t\t\t\tanalytics?.rows,\n\t\t\t\t\t\t\t(row: any) =>\n\t\t\t\t\t\t\t\trow[headerIndex ?? -1] ===\n\t\t\t\t\t\t\t\t\tseriesDimensionValue &&\n\t\t\t\t\t\t\t\trow[categoryDimensionIndex ?? -1] === category,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn row?.[valueIndex ?? -1]\n\t\t\t\t\t\t\t? parseFloat(row?.[valueIndex ?? -1])\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: seriesDimensionValue,\n\t\t\t\t\t\tname: items?.[seriesDimensionValue as any]?.name,\n\t\t\t\t\t\tdata: config.legendSet\n\t\t\t\t\t\t\t? data.map((value, index) => {\n\t\t\t\t\t\t\t\t\tconst color = getLegendColorFromValue({\n\t\t\t\t\t\t\t\t\t\tlegendSet: config.legendSet,\n\t\t\t\t\t\t\t\t\t\tvalue: value ?? 0,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tx: index,\n\t\t\t\t\t\t\t\t\t\ty: value,\n\t\t\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t\t\t\tcolor: color,\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: data,\n\t\t\t\t\t\ttype: highchartsType,\n\t\t\t\t\t\tcolor: colors[index % colors.length],\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t);\n\t\t}),\n\t);\n}\n\nfunction getCategories(\n\t{ name }: AnalyticsHeader,\n\t{ items, dimensions }: AnalyticsMetadata,\n): string[] {\n\tconst categories: string[] = dimensions?.[\n\t\tname as \"dx\" | \"ou\" | \"pe\"\n\t] as any;\n\n\treturn categories?.map((category: string) => {\n\t\treturn items[category as any]?.name ?? \"\";\n\t}) as unknown as string[];\n}\n\nexport function getAllCategories(\n\tanalytics: Analytics,\n\tconfig: ChartConfig,\n): string[] {\n\tconst categories = config.layout.category;\n\n\treturn compact(\n\t\tcategories?.map((category: string) => {\n\t\t\tconst header = analytics?.headers?.find(\n\t\t\t\t(header: any) => header.name === category,\n\t\t\t);\n\t\t\tif (!header) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (analytics?.metaData) {\n\t\t\t\treturn getCategories(header, analytics?.metaData);\n\t\t\t}\n\t\t}),\n\t)[0];\n}\n\nexport function updateLayout(\n\tconfig: ChartConfig,\n\t{ type }: { type: ChartType },\n) {\n\tif (type === config.type) {\n\t\treturn config.layout;\n\t}\n\n\tconst updatedLayout = { ...config.layout };\n\n\tswitch (type) {\n\t\tcase \"pie\":\n\t\t\tset(updatedLayout, \"category\", []);\n\t\t\tif (isEmpty(updatedLayout.series)) {\n\t\t\t\tif (!isEmpty(config.layout.category)) {\n\t\t\t\t\tset(updatedLayout, \"series\", [\n\t\t\t\t\t\thead(config.layout.category),\n\t\t\t\t\t]);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Invalid layout for pie chart\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (updatedLayout.series.length > 1) {\n\t\t\t\tset(updatedLayout, \"series\", [head(updatedLayout.series)]);\n\t\t\t}\n\t}\n\n\treturn updatedLayout;\n}\n\nexport function getLegendColorFromValue({\n\tlegendSet,\n\tvalue,\n}: {\n\tlegendSet?: LegendSet;\n\tvalue?: number;\n}): string | null {\n\tif (!legendSet && !value) {\n\t\treturn null;\n\t}\n\tconst legends = legendSet?.legends ?? [];\n\tconst legend = legends.find((l) => {\n\t\treturn (\n\t\t\tl.startValue === value ||\n\t\t\tl.endValue === value ||\n\t\t\t(l.startValue < value! && value! < l.endValue)\n\t\t);\n\t});\n\treturn legend?.color ?? null;\n}\n\nexport function getChartInstance(\n\tid: string,\n\tanalytics: Analytics,\n\tconfig: ChartConfig,\n): DHIS2Chart {\n\tswitch (config.type) {\n\t\tcase \"column\":\n\t\t\treturn new DHIS2ColumnChart(id, analytics, config);\n\t\tcase \"bar\":\n\t\t\treturn new DHIS2BarChart(id, analytics, config);\n\t\tcase \"stacked-bar\":\n\t\t\treturn new DHIS2StackedBarChart(id, analytics, config);\n\t\tcase \"stacked-column\":\n\t\t\treturn new DHIS2StackedColumnChart(id, analytics, config);\n\t\tcase \"pie\":\n\t\t\treturn new DHIS2PieChart(id, analytics, config);\n\t\tcase \"line\":\n\t\t\treturn new DHIS2LineChart(id, analytics, config);\n\t\tcase \"area\":\n\t\t\treturn new DHIS2AreaChart(id, analytics, config);\n\t\tcase \"stacked-area\":\n\t\t\treturn new DHISStackedAreaChart(id, analytics, config);\n\t\tcase \"multi-series\":\n\t\t\treturn new DHIS2MultiSeriesChart(id, analytics, config);\n\t\tcase \"gauge\":\n\t\t\treturn new DHIS2GaugeChart(id, analytics, config);\n\t\tcase \"radar\":\n\t\t\treturn new DHIS2RadarChart(id, analytics, config);\n\t\tcase \"scatter\":\n\t\t\treturn new DHIS2ScatterChart(id, analytics, config);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported chart type: ${config.type}`);\n\t}\n}\n"]}