@hisptz/dhis2-analytics 2.0.10 → 2.0.12

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.
@@ -114,7 +114,7 @@ class DHIS2Chart {
114
114
  };
115
115
  }
116
116
  getFilterLabel() {
117
- const filters = this.config.layout.filter;
117
+ const filters = this.config.layout.filter ?? [];
118
118
  const labels = filters.map((filter) => {
119
119
  const dimensions = this.analytics.metaData?.dimensions[filter] ?? [];
120
120
  return dimensions.map((dimension) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ChartAnalytics/models/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Analytics } from \"@hisptz/dhis2-utils\";\nimport HighCharts from \"highcharts\";\nimport { ChartConfig } from \"../types/props.js\";\nimport { compact } from \"lodash\";\n\nexport abstract class DHIS2Chart {\n\tid: string;\n\tanalytics: Analytics;\n\tconfig: ChartConfig;\n\n\tconstructor(id: string, analytics: Analytics, config: ChartConfig) {\n\t\tthis.id = id;\n\t\tthis.analytics = analytics;\n\t\tthis.config = config;\n\t}\n\n\tabstract getHighchartsType(): string;\n\n\tgetChartConfig(): HighCharts.ChartOptions & any {\n\t\treturn {\n\t\t\trenderTo: this.id,\n\t\t\tzoomType: \"xy\",\n\t\t\ttype: this.getHighchartsType(),\n\t\t\theight: this.config?.height,\n\t\t\tstyledMode: false,\n\t\t};\n\t}\n\n\tgetOptions(): HighCharts.Options {\n\t\tconst options = {\n\t\t\tyAxis: this.getYAxis(),\n\t\t\tchart: this.getChartConfig(),\n\t\t\tcolors: this.config?.colors ?? [\n\t\t\t\t\"#a8bf24\",\n\t\t\t\t\"#518cc3\",\n\t\t\t\t\"#d74554\",\n\t\t\t\t\"#ff9e21\",\n\t\t\t\t\"#968f8f\",\n\t\t\t\t\"#ba3ba1\",\n\t\t\t\t\"#ffda54\",\n\t\t\t\t\"#45beae\",\n\t\t\t\t\"#b98037\",\n\t\t\t\t\"#676767\",\n\t\t\t\t\"#6b2dd4\",\n\t\t\t\t\"#47792c\",\n\t\t\t\t\"#fcbdbd\",\n\t\t\t\t\"#830000\",\n\t\t\t\t\"#a5ffc0\",\n\t\t\t\t\"#000078\",\n\t\t\t\t\"#817c00\",\n\t\t\t\t\"#bdf023\",\n\t\t\t\t\"#fffac4\",\n\t\t\t],\n\t\t\tseries: this.getSeries(),\n\t\t\tplotOptions: this.getPlotOptions(),\n\t\t\ttitle: {\n\t\t\t\ttext: this.config.showFilterAsTitle\n\t\t\t\t\t? this.getFilterLabel()\n\t\t\t\t\t: \"\",\n\t\t\t},\n\t\t\txAxis: this.getXAxis(),\n\t\t\texporting: this.getExporting(),\n\t\t\tlegend: { enabled: true },\n\t\t\tcredits: { enabled: false },\n\t\t};\n\n\t\tlet overrides = {};\n\n\t\tif (this.config?.highChartOverrides) {\n\t\t\toverrides = {\n\t\t\t\t...(typeof this.config?.highChartOverrides === \"object\"\n\t\t\t\t\t? this.config?.highChartOverrides ?? {}\n\t\t\t\t\t: this.config?.highChartOverrides(options)),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t...options,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\tabstract getSeries(): HighCharts.SeriesOptionsType[];\n\n\tabstract getPlotOptions(): HighCharts.PlotOptions;\n\n\tabstract getXAxis(): HighCharts.XAxisOptions | undefined;\n\n\tgetYAxis(): HighCharts.YAxisOptions[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttitle: {\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabels: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tplotLines: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#bbbbbb\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\t}\n\n\tgetExporting(): HighCharts.ExportingOptions {\n\t\tconst name = this.config?.name ?? \"chart\";\n\t\treturn {\n\t\t\tfilename: `${name}`,\n\t\t\tsourceWidth: 1200,\n\t\t\tbuttons: {\n\t\t\t\tcontextButton: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate getFilterLabel() {\n\t\tconst filters = this.config.layout.filter;\n\t\tconst labels = filters.map((filter) => {\n\t\t\tconst dimensions =\n\t\t\t\tthis.analytics.metaData?.dimensions[filter] ?? [];\n\t\t\treturn dimensions.map((dimension) => {\n\t\t\t\tconst filterItem = this.analytics.metaData?.items[dimension];\n\t\t\t\treturn filterItem?.name;\n\t\t\t});\n\t\t});\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/components/ChartAnalytics/models/index.ts"],"names":[],"mappings":"AAGA,SAAS,eAAe;AAEjB,MAAe,WAAW;AAAA,EAKhC,YAAY,IAAY,WAAsB,QAAqB;AAClE,SAAK,KAAK;AACV,SAAK,YAAY;AACjB,SAAK,SAAS;AAAA,EACf;AAAA,EAIA,iBAAgD;AAC/C,WAAO;AAAA,MACN,UAAU,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM,KAAK,kBAAkB;AAAA,MAC7B,QAAQ,KAAK,QAAQ;AAAA,MACrB,YAAY;AAAA,IACb;AAAA,EACD;AAAA,EAEA,aAAiC;AAChC,UAAM,UAAU;AAAA,MACf,OAAO,KAAK,SAAS;AAAA,MACrB,OAAO,KAAK,eAAe;AAAA,MAC3B,QAAQ,KAAK,QAAQ,UAAU;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA,QAAQ,KAAK,UAAU;AAAA,MACvB,aAAa,KAAK,eAAe;AAAA,MACjC,OAAO;AAAA,QACN,MAAM,KAAK,OAAO,oBACf,KAAK,eAAe,IACpB;AAAA,MACJ;AAAA,MACA,OAAO,KAAK,SAAS;AAAA,MACrB,WAAW,KAAK,aAAa;AAAA,MAC7B,QAAQ,EAAE,SAAS,KAAK;AAAA,MACxB,SAAS,EAAE,SAAS,MAAM;AAAA,IAC3B;AAEA,QAAI,YAAY,CAAC;AAEjB,QAAI,KAAK,QAAQ,oBAAoB;AACpC,kBAAY;AAAA,QACX,GAAI,OAAO,KAAK,QAAQ,uBAAuB,WAC5C,KAAK,QAAQ,sBAAsB,CAAC,IACpC,KAAK,QAAQ,mBAAmB,OAAO;AAAA,MAC3C;AAAA,IACD;AAEA,WAAO;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,IACJ;AAAA,EACD;AAAA,EAQA,WAAsC;AACrC,WAAO;AAAA,MACN;AAAA,QACC,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,UAAU;AAAA,UACX;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,UACP,SAAS;AAAA,UACT,OAAO;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,UAAU;AAAA,UACX;AAAA,QACD;AAAA,QACA,WAAW;AAAA,UACV;AAAA,YACC,OAAO;AAAA,YACP,WAAW;AAAA,YACX,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OAAO,EAAE,MAAM,GAAG;AAAA,UACnB;AAAA,UACA;AAAA,YACC,OAAO;AAAA,YACP,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,GAAG;AAAA,UACnB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,eAA4C;AAC3C,UAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,WAAO;AAAA,MACN,UAAU,GAAG,IAAI;AAAA,MACjB,aAAa;AAAA,MACb,SAAS;AAAA,QACR,eAAe;AAAA,UACd,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,iBAAiB;AACxB,UAAM,UAAU,KAAK,OAAO,OAAO,UAAU,CAAC;AAC9C,UAAM,SAAS,QAAQ,IAAI,CAAC,WAAW;AACtC,YAAM,aACL,KAAK,UAAU,UAAU,WAAW,MAAM,KAAK,CAAC;AACjD,aAAO,WAAW,IAAI,CAAC,cAAc;AACpC,cAAM,aAAa,KAAK,UAAU,UAAU,MAAM,SAAS;AAC3D,eAAO,YAAY;AAAA,MACpB,CAAC;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,EACxC;AACD","sourcesContent":["import type { Analytics } from \"@hisptz/dhis2-utils\";\nimport HighCharts from \"highcharts\";\nimport { ChartConfig } from \"../types/props.js\";\nimport { compact } from \"lodash\";\n\nexport abstract class DHIS2Chart {\n\tid: string;\n\tanalytics: Analytics;\n\tconfig: ChartConfig;\n\n\tconstructor(id: string, analytics: Analytics, config: ChartConfig) {\n\t\tthis.id = id;\n\t\tthis.analytics = analytics;\n\t\tthis.config = config;\n\t}\n\n\tabstract getHighchartsType(): string;\n\n\tgetChartConfig(): HighCharts.ChartOptions & any {\n\t\treturn {\n\t\t\trenderTo: this.id,\n\t\t\tzoomType: \"xy\",\n\t\t\ttype: this.getHighchartsType(),\n\t\t\theight: this.config?.height,\n\t\t\tstyledMode: false,\n\t\t};\n\t}\n\n\tgetOptions(): HighCharts.Options {\n\t\tconst options = {\n\t\t\tyAxis: this.getYAxis(),\n\t\t\tchart: this.getChartConfig(),\n\t\t\tcolors: this.config?.colors ?? [\n\t\t\t\t\"#a8bf24\",\n\t\t\t\t\"#518cc3\",\n\t\t\t\t\"#d74554\",\n\t\t\t\t\"#ff9e21\",\n\t\t\t\t\"#968f8f\",\n\t\t\t\t\"#ba3ba1\",\n\t\t\t\t\"#ffda54\",\n\t\t\t\t\"#45beae\",\n\t\t\t\t\"#b98037\",\n\t\t\t\t\"#676767\",\n\t\t\t\t\"#6b2dd4\",\n\t\t\t\t\"#47792c\",\n\t\t\t\t\"#fcbdbd\",\n\t\t\t\t\"#830000\",\n\t\t\t\t\"#a5ffc0\",\n\t\t\t\t\"#000078\",\n\t\t\t\t\"#817c00\",\n\t\t\t\t\"#bdf023\",\n\t\t\t\t\"#fffac4\",\n\t\t\t],\n\t\t\tseries: this.getSeries(),\n\t\t\tplotOptions: this.getPlotOptions(),\n\t\t\ttitle: {\n\t\t\t\ttext: this.config.showFilterAsTitle\n\t\t\t\t\t? this.getFilterLabel()\n\t\t\t\t\t: \"\",\n\t\t\t},\n\t\t\txAxis: this.getXAxis(),\n\t\t\texporting: this.getExporting(),\n\t\t\tlegend: { enabled: true },\n\t\t\tcredits: { enabled: false },\n\t\t};\n\n\t\tlet overrides = {};\n\n\t\tif (this.config?.highChartOverrides) {\n\t\t\toverrides = {\n\t\t\t\t...(typeof this.config?.highChartOverrides === \"object\"\n\t\t\t\t\t? this.config?.highChartOverrides ?? {}\n\t\t\t\t\t: this.config?.highChartOverrides(options)),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t...options,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\tabstract getSeries(): HighCharts.SeriesOptionsType[];\n\n\tabstract getPlotOptions(): HighCharts.PlotOptions;\n\n\tabstract getXAxis(): HighCharts.XAxisOptions | undefined;\n\n\tgetYAxis(): HighCharts.YAxisOptions[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttitle: {\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabels: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tplotLines: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#bbbbbb\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\t}\n\n\tgetExporting(): HighCharts.ExportingOptions {\n\t\tconst name = this.config?.name ?? \"chart\";\n\t\treturn {\n\t\t\tfilename: `${name}`,\n\t\t\tsourceWidth: 1200,\n\t\t\tbuttons: {\n\t\t\t\tcontextButton: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate getFilterLabel() {\n\t\tconst filters = this.config.layout.filter ?? [];\n\t\tconst labels = filters.map((filter) => {\n\t\t\tconst dimensions =\n\t\t\t\tthis.analytics.metaData?.dimensions[filter] ?? [];\n\t\t\treturn dimensions.map((dimension) => {\n\t\t\t\tconst filterItem = this.analytics.metaData?.items[dimension];\n\t\t\t\treturn filterItem?.name;\n\t\t\t});\n\t\t});\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n}\n"]}
@@ -25,10 +25,11 @@ Default.args = {
25
25
  { dimension: "ou" },
26
26
  { dimension: "pe", label: "Period" }
27
27
  ],
28
- rows: [{ dimension: "dx", label: "Services" }],
29
- filter: []
28
+ rows: [{ dimension: "dx", label: "Services" }]
30
29
  },
31
- options: {}
30
+ options: {
31
+ showFilterAsTitle: true
32
+ }
32
33
  },
33
34
  tableProps: {}
34
35
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/DHIS2PivotTable/DHIS2PivotTable.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB;AAEvB,SAAS,uBAAuB;AAEhC,MAAM,OAAqC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW;AACZ;AAEA,IAAO,kCAAQ;AAGR,MAAM,UAAiB;AAAA,EAC7B,MAAM;AACP;AACA,QAAQ,OAAO;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,IACP,QAAQ;AAAA,MACP,SAAS;AAAA,QACR,EAAE,WAAW,KAAK;AAAA,QAClB,EAAE,WAAW,MAAM,OAAO,SAAS;AAAA,MACpC;AAAA,MACA,MAAM,CAAC,EAAE,WAAW,MAAM,OAAO,WAAW,CAAC;AAAA,MAC7C,QAAQ,CAAC;AAAA,IACV;AAAA,IACA,SAAS,CAAC;AAAA,EACX;AAAA,EACA,YAAY,CAAC;AACd","sourcesContent":["import simpleData from \"../../shared/resources/simple-data.json\";\nimport { Meta, StoryObj } from \"@storybook/react\";\nimport { DHIS2PivotTable } from \"./DHIS2PivotTable\";\n\nconst meta: Meta<typeof DHIS2PivotTable> = {\n\ttitle: \"DHIS2 Pivot Table\",\n\tcomponent: DHIS2PivotTable,\n};\n\nexport default meta;\n\ntype Story = StoryObj<typeof DHIS2PivotTable>;\nexport const Default: Story = {\n\tname: \"Default\",\n};\nDefault.args = {\n\tanalytics: simpleData as any,\n\tconfig: {\n\t\tlayout: {\n\t\t\tcolumns: [\n\t\t\t\t{ dimension: \"ou\" },\n\t\t\t\t{ dimension: \"pe\", label: \"Period\" },\n\t\t\t],\n\t\t\trows: [{ dimension: \"dx\", label: \"Services\" }],\n\t\t\tfilter: [],\n\t\t},\n\t\toptions: {},\n\t},\n\ttableProps: {},\n};\n"]}
1
+ {"version":3,"sources":["../../../src/components/DHIS2PivotTable/DHIS2PivotTable.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB;AAEvB,SAAS,uBAAuB;AAEhC,MAAM,OAAqC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW;AACZ;AAEA,IAAO,kCAAQ;AAGR,MAAM,UAAiB;AAAA,EAC7B,MAAM;AACP;AACA,QAAQ,OAAO;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,IACP,QAAQ;AAAA,MACP,SAAS;AAAA,QACR,EAAE,WAAW,KAAK;AAAA,QAClB,EAAE,WAAW,MAAM,OAAO,SAAS;AAAA,MACpC;AAAA,MACA,MAAM,CAAC,EAAE,WAAW,MAAM,OAAO,WAAW,CAAC;AAAA,IAC9C;AAAA,IACA,SAAS;AAAA,MACR,mBAAmB;AAAA,IACpB;AAAA,EACD;AAAA,EACA,YAAY,CAAC;AACd","sourcesContent":["import simpleData from \"../../shared/resources/simple-data.json\";\nimport { Meta, StoryObj } from \"@storybook/react\";\nimport { DHIS2PivotTable } from \"./DHIS2PivotTable\";\n\nconst meta: Meta<typeof DHIS2PivotTable> = {\n\ttitle: \"DHIS2 Pivot Table\",\n\tcomponent: DHIS2PivotTable,\n};\n\nexport default meta;\n\ntype Story = StoryObj<typeof DHIS2PivotTable>;\nexport const Default: Story = {\n\tname: \"Default\",\n};\nDefault.args = {\n\tanalytics: simpleData as any,\n\tconfig: {\n\t\tlayout: {\n\t\t\tcolumns: [\n\t\t\t\t{ dimension: \"ou\" },\n\t\t\t\t{ dimension: \"pe\", label: \"Period\" },\n\t\t\t],\n\t\t\trows: [{ dimension: \"dx\", label: \"Services\" }],\n\t\t},\n\t\toptions: {\n\t\t\tshowFilterAsTitle: true,\n\t\t},\n\t},\n\ttableProps: {},\n};\n"]}
@@ -17,7 +17,7 @@ class DHIS2PivotTableEngine {
17
17
  this.getColumnMap();
18
18
  }
19
19
  get title() {
20
- const filters = this.config.layout.filter;
20
+ const filters = this.config.layout.filter ?? [];
21
21
  const labels = filters?.map(({ dimension }) => {
22
22
  const dimensions = this.analyticsData.metaData?.dimensions[dimension];
23
23
  return dimensions?.map((dimension2) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DHIS2PivotTable/services/engine.ts"],"names":["dimension"],"mappings":"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","sourcesContent":["import { Analytics, AnalyticsItem, LegendSet } from \"@hisptz/dhis2-utils\";\nimport { compact, findIndex, intersection, times, zip } from \"lodash\";\nimport { DHIS2Dimension } from \"../interfaces/index.js\";\n\nexport interface EngineConfig {\n\tlayout: {\n\t\tcolumns: { dimension: DHIS2Dimension; label?: string }[];\n\t\trows: { dimension: DHIS2Dimension; label?: string }[];\n\t\tfilter?: { dimension: DHIS2Dimension; label?: string }[];\n\t};\n\toptions?: {\n\t\tlegendSets?: LegendSet[];\n\t\thideEmptyColumns?: boolean;\n\t\thideEmptyRows?: boolean;\n\t\tshowRowTotals?: boolean;\n\t\tshowColumnTotals?: boolean;\n\t\tshowRowSubtotals?: boolean;\n\t\tshowColumnSubtotals?: boolean;\n\t\tshowFilterAsTitle?: boolean;\n\t\tfixColumnHeaders?: boolean;\n\t\tfixRowHeaders?: boolean;\n\t\t[key: string]: any;\n\t};\n}\n\nexport interface Header {\n\tdimension: DHIS2Dimension;\n\tlabel?: string;\n\titems?: AnalyticsItem[];\n}\n\nexport class DHIS2PivotTableEngine {\n\tanalyticsData: Analytics;\n\tvalueIndex: number;\n\tconfig: EngineConfig;\n\trowHeaders?: Header[];\n\tcolumnHeaders?: Header[];\n\n\tcolumnMap?: { [key: string]: any }[];\n\n\tconstructor({\n\t\tanalytics,\n\t\tconfig,\n\t}: {\n\t\tanalytics: Analytics;\n\t\tconfig: EngineConfig;\n\t}) {\n\t\tthis.config = config;\n\t\tthis.analyticsData = analytics;\n\t\tthis.valueIndex = findIndex(this.analyticsData.headers, [\n\t\t\t\"name\",\n\t\t\t\"value\",\n\t\t]);\n\t\tthis.getHeaders();\n\t\tthis.getColumnMap();\n\t}\n\n\tget title() {\n\t\tconst filters = this.config.layout.filter;\n\t\tconst labels =\n\t\t\tfilters?.map(({ dimension }) => {\n\t\t\t\tconst dimensions =\n\t\t\t\t\tthis.analyticsData.metaData?.dimensions[dimension];\n\n\t\t\t\treturn dimensions?.map((dimension) => {\n\t\t\t\t\tconst dimensionItem =\n\t\t\t\t\t\tthis.analyticsData.metaData?.items[dimension];\n\t\t\t\t\treturn dimensionItem?.name;\n\t\t\t\t});\n\t\t\t}) ?? [];\n\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n\n\tget titleSpan() {\n\t\tconst rowHeaders = this.rowHeaders?.length ?? 0;\n\t\tconst columnHeaders =\n\t\t\tthis.columnHeaders?.reduce(\n\t\t\t\t(acc, val) => acc + (val.items?.length ?? 0),\n\t\t\t\t0,\n\t\t\t) ?? 0;\n\n\t\treturn rowHeaders + columnHeaders;\n\t}\n\n\tget showTitle() {\n\t\treturn this.config?.options?.showFilterAsTitle;\n\t}\n\n\tget fixColumnHeaders() {\n\t\treturn this.config.options?.fixColumnHeaders ?? true;\n\t}\n\n\tget fixRowHeaders() {\n\t\treturn this.config.options?.fixRowHeaders ?? true;\n\t}\n\n\tgetDimensionItems(dimension: DHIS2Dimension) {\n\t\treturn this.analyticsData.metaData?.dimensions[dimension] ?? [];\n\t}\n\n\tgetItem(id: string) {\n\t\treturn this.analyticsData.metaData?.items[id as any];\n\t}\n\n\tgetValue(mapper: { [key: string]: any }) {\n\t\tconst dimensions = Object.values(mapper);\n\t\tconst data = this.analyticsData.rows?.filter(\n\t\t\t(row) => intersection(row, dimensions).length >= dimensions.length,\n\t\t);\n\t\treturn data?.reduce((acc, row) => {\n\t\t\treturn acc + parseFloat(row[this.valueIndex]);\n\t\t}, 0);\n\t}\n\n\tgetHeaders() {\n\t\tthis.rowHeaders = this.config.layout.rows.map((rowConfig) => {\n\t\t\treturn {\n\t\t\t\t...rowConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(rowConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t\tthis.columnHeaders = this.config.layout.columns.map((columnConfig) => {\n\t\t\treturn {\n\t\t\t\t...columnConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(columnConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t}\n\n\tgetColumnMap() {\n\t\tconst columns = this.columnHeaders;\n\t\tconst sanitizedColumns =\n\t\t\tcompact(\n\t\t\t\tcolumns?.map(\n\t\t\t\t\t(column) =>\n\t\t\t\t\t\tcolumn.items?.map((item) => ({\n\t\t\t\t\t\t\t[column.dimension]: item.uid,\n\t\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t) ?? [];\n\t\tconst size = sanitizedColumns.reduce((acc, items) => {\n\t\t\treturn acc * (items?.length ?? 1);\n\t\t}, 1);\n\t\tconst standardiseColumns = sanitizedColumns.map((items) => [\n\t\t\t...times(size / items.length, () => items).flat(),\n\t\t]);\n\t\tthis.columnMap = compact(\n\t\t\tzip(...standardiseColumns).map((arr) =>\n\t\t\t\tarr.reduce((obj, value) => {\n\t\t\t\t\treturn { ...obj, ...value };\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/components/DHIS2PivotTable/services/engine.ts"],"names":["dimension"],"mappings":"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","sourcesContent":["import { Analytics, AnalyticsItem, LegendSet } from \"@hisptz/dhis2-utils\";\nimport { compact, findIndex, intersection, times, zip } from \"lodash\";\nimport { DHIS2Dimension } from \"../interfaces/index.js\";\n\nexport interface EngineConfig {\n\tlayout: {\n\t\tcolumns: { dimension: DHIS2Dimension; label?: string }[];\n\t\trows: { dimension: DHIS2Dimension; label?: string }[];\n\t\tfilter?: { dimension: DHIS2Dimension; label?: string }[];\n\t};\n\toptions?: {\n\t\tlegendSets?: LegendSet[];\n\t\thideEmptyColumns?: boolean;\n\t\thideEmptyRows?: boolean;\n\t\tshowRowTotals?: boolean;\n\t\tshowColumnTotals?: boolean;\n\t\tshowRowSubtotals?: boolean;\n\t\tshowColumnSubtotals?: boolean;\n\t\tshowFilterAsTitle?: boolean;\n\t\tfixColumnHeaders?: boolean;\n\t\tfixRowHeaders?: boolean;\n\t\t[key: string]: any;\n\t};\n}\n\nexport interface Header {\n\tdimension: DHIS2Dimension;\n\tlabel?: string;\n\titems?: AnalyticsItem[];\n}\n\nexport class DHIS2PivotTableEngine {\n\tanalyticsData: Analytics;\n\tvalueIndex: number;\n\tconfig: EngineConfig;\n\trowHeaders?: Header[];\n\tcolumnHeaders?: Header[];\n\n\tcolumnMap?: { [key: string]: any }[];\n\n\tconstructor({\n\t\tanalytics,\n\t\tconfig,\n\t}: {\n\t\tanalytics: Analytics;\n\t\tconfig: EngineConfig;\n\t}) {\n\t\tthis.config = config;\n\t\tthis.analyticsData = analytics;\n\t\tthis.valueIndex = findIndex(this.analyticsData.headers, [\n\t\t\t\"name\",\n\t\t\t\"value\",\n\t\t]);\n\t\tthis.getHeaders();\n\t\tthis.getColumnMap();\n\t}\n\n\tget title() {\n\t\tconst filters = this.config.layout.filter ?? [];\n\t\tconst labels =\n\t\t\tfilters?.map(({ dimension }) => {\n\t\t\t\tconst dimensions =\n\t\t\t\t\tthis.analyticsData.metaData?.dimensions[dimension];\n\n\t\t\t\treturn dimensions?.map((dimension) => {\n\t\t\t\t\tconst dimensionItem =\n\t\t\t\t\t\tthis.analyticsData.metaData?.items[dimension];\n\t\t\t\t\treturn dimensionItem?.name;\n\t\t\t\t});\n\t\t\t}) ?? [];\n\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n\n\tget titleSpan() {\n\t\tconst rowHeaders = this.rowHeaders?.length ?? 0;\n\t\tconst columnHeaders =\n\t\t\tthis.columnHeaders?.reduce(\n\t\t\t\t(acc, val) => acc + (val.items?.length ?? 0),\n\t\t\t\t0,\n\t\t\t) ?? 0;\n\n\t\treturn rowHeaders + columnHeaders;\n\t}\n\n\tget showTitle() {\n\t\treturn this.config?.options?.showFilterAsTitle;\n\t}\n\n\tget fixColumnHeaders() {\n\t\treturn this.config.options?.fixColumnHeaders ?? true;\n\t}\n\n\tget fixRowHeaders() {\n\t\treturn this.config.options?.fixRowHeaders ?? true;\n\t}\n\n\tgetDimensionItems(dimension: DHIS2Dimension) {\n\t\treturn this.analyticsData.metaData?.dimensions[dimension] ?? [];\n\t}\n\n\tgetItem(id: string) {\n\t\treturn this.analyticsData.metaData?.items[id as any];\n\t}\n\n\tgetValue(mapper: { [key: string]: any }) {\n\t\tconst dimensions = Object.values(mapper);\n\t\tconst data = this.analyticsData.rows?.filter(\n\t\t\t(row) => intersection(row, dimensions).length >= dimensions.length,\n\t\t);\n\t\treturn data?.reduce((acc, row) => {\n\t\t\treturn acc + parseFloat(row[this.valueIndex]);\n\t\t}, 0);\n\t}\n\n\tgetHeaders() {\n\t\tthis.rowHeaders = this.config.layout.rows.map((rowConfig) => {\n\t\t\treturn {\n\t\t\t\t...rowConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(rowConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t\tthis.columnHeaders = this.config.layout.columns.map((columnConfig) => {\n\t\t\treturn {\n\t\t\t\t...columnConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(columnConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t}\n\n\tgetColumnMap() {\n\t\tconst columns = this.columnHeaders;\n\t\tconst sanitizedColumns =\n\t\t\tcompact(\n\t\t\t\tcolumns?.map(\n\t\t\t\t\t(column) =>\n\t\t\t\t\t\tcolumn.items?.map((item) => ({\n\t\t\t\t\t\t\t[column.dimension]: item.uid,\n\t\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t) ?? [];\n\t\tconst size = sanitizedColumns.reduce((acc, items) => {\n\t\t\treturn acc * (items?.length ?? 1);\n\t\t}, 1);\n\t\tconst standardiseColumns = sanitizedColumns.map((items) => [\n\t\t\t...times(size / items.length, () => items).flat(),\n\t\t]);\n\t\tthis.columnMap = compact(\n\t\t\tzip(...standardiseColumns).map((arr) =>\n\t\t\t\tarr.reduce((obj, value) => {\n\t\t\t\t\treturn { ...obj, ...value };\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n}\n"]}
@@ -112,7 +112,7 @@ class DHIS2Chart {
112
112
  };
113
113
  }
114
114
  getFilterLabel() {
115
- const filters = this.config.layout.filter;
115
+ const filters = this.config.layout.filter ?? [];
116
116
  const labels = filters.map((filter) => {
117
117
  const dimensions = this.analytics.metaData?.dimensions[filter] ?? [];
118
118
  return dimensions.map((dimension) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/ChartAnalytics/models/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Analytics } from \"@hisptz/dhis2-utils\";\nimport HighCharts from \"highcharts\";\nimport { ChartConfig } from \"../types/props.js\";\nimport { compact } from \"lodash\";\n\nexport abstract class DHIS2Chart {\n\tid: string;\n\tanalytics: Analytics;\n\tconfig: ChartConfig;\n\n\tconstructor(id: string, analytics: Analytics, config: ChartConfig) {\n\t\tthis.id = id;\n\t\tthis.analytics = analytics;\n\t\tthis.config = config;\n\t}\n\n\tabstract getHighchartsType(): string;\n\n\tgetChartConfig(): HighCharts.ChartOptions & any {\n\t\treturn {\n\t\t\trenderTo: this.id,\n\t\t\tzoomType: \"xy\",\n\t\t\ttype: this.getHighchartsType(),\n\t\t\theight: this.config?.height,\n\t\t\tstyledMode: false,\n\t\t};\n\t}\n\n\tgetOptions(): HighCharts.Options {\n\t\tconst options = {\n\t\t\tyAxis: this.getYAxis(),\n\t\t\tchart: this.getChartConfig(),\n\t\t\tcolors: this.config?.colors ?? [\n\t\t\t\t\"#a8bf24\",\n\t\t\t\t\"#518cc3\",\n\t\t\t\t\"#d74554\",\n\t\t\t\t\"#ff9e21\",\n\t\t\t\t\"#968f8f\",\n\t\t\t\t\"#ba3ba1\",\n\t\t\t\t\"#ffda54\",\n\t\t\t\t\"#45beae\",\n\t\t\t\t\"#b98037\",\n\t\t\t\t\"#676767\",\n\t\t\t\t\"#6b2dd4\",\n\t\t\t\t\"#47792c\",\n\t\t\t\t\"#fcbdbd\",\n\t\t\t\t\"#830000\",\n\t\t\t\t\"#a5ffc0\",\n\t\t\t\t\"#000078\",\n\t\t\t\t\"#817c00\",\n\t\t\t\t\"#bdf023\",\n\t\t\t\t\"#fffac4\",\n\t\t\t],\n\t\t\tseries: this.getSeries(),\n\t\t\tplotOptions: this.getPlotOptions(),\n\t\t\ttitle: {\n\t\t\t\ttext: this.config.showFilterAsTitle\n\t\t\t\t\t? this.getFilterLabel()\n\t\t\t\t\t: \"\",\n\t\t\t},\n\t\t\txAxis: this.getXAxis(),\n\t\t\texporting: this.getExporting(),\n\t\t\tlegend: { enabled: true },\n\t\t\tcredits: { enabled: false },\n\t\t};\n\n\t\tlet overrides = {};\n\n\t\tif (this.config?.highChartOverrides) {\n\t\t\toverrides = {\n\t\t\t\t...(typeof this.config?.highChartOverrides === \"object\"\n\t\t\t\t\t? this.config?.highChartOverrides ?? {}\n\t\t\t\t\t: this.config?.highChartOverrides(options)),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t...options,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\tabstract getSeries(): HighCharts.SeriesOptionsType[];\n\n\tabstract getPlotOptions(): HighCharts.PlotOptions;\n\n\tabstract getXAxis(): HighCharts.XAxisOptions | undefined;\n\n\tgetYAxis(): HighCharts.YAxisOptions[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttitle: {\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabels: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tplotLines: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#bbbbbb\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\t}\n\n\tgetExporting(): HighCharts.ExportingOptions {\n\t\tconst name = this.config?.name ?? \"chart\";\n\t\treturn {\n\t\t\tfilename: `${name}`,\n\t\t\tsourceWidth: 1200,\n\t\t\tbuttons: {\n\t\t\t\tcontextButton: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate getFilterLabel() {\n\t\tconst filters = this.config.layout.filter;\n\t\tconst labels = filters.map((filter) => {\n\t\t\tconst dimensions =\n\t\t\t\tthis.analytics.metaData?.dimensions[filter] ?? [];\n\t\t\treturn dimensions.map((dimension) => {\n\t\t\t\tconst filterItem = this.analytics.metaData?.items[dimension];\n\t\t\t\treturn filterItem?.name;\n\t\t\t});\n\t\t});\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/components/ChartAnalytics/models/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Analytics } from \"@hisptz/dhis2-utils\";\nimport HighCharts from \"highcharts\";\nimport { ChartConfig } from \"../types/props.js\";\nimport { compact } from \"lodash\";\n\nexport abstract class DHIS2Chart {\n\tid: string;\n\tanalytics: Analytics;\n\tconfig: ChartConfig;\n\n\tconstructor(id: string, analytics: Analytics, config: ChartConfig) {\n\t\tthis.id = id;\n\t\tthis.analytics = analytics;\n\t\tthis.config = config;\n\t}\n\n\tabstract getHighchartsType(): string;\n\n\tgetChartConfig(): HighCharts.ChartOptions & any {\n\t\treturn {\n\t\t\trenderTo: this.id,\n\t\t\tzoomType: \"xy\",\n\t\t\ttype: this.getHighchartsType(),\n\t\t\theight: this.config?.height,\n\t\t\tstyledMode: false,\n\t\t};\n\t}\n\n\tgetOptions(): HighCharts.Options {\n\t\tconst options = {\n\t\t\tyAxis: this.getYAxis(),\n\t\t\tchart: this.getChartConfig(),\n\t\t\tcolors: this.config?.colors ?? [\n\t\t\t\t\"#a8bf24\",\n\t\t\t\t\"#518cc3\",\n\t\t\t\t\"#d74554\",\n\t\t\t\t\"#ff9e21\",\n\t\t\t\t\"#968f8f\",\n\t\t\t\t\"#ba3ba1\",\n\t\t\t\t\"#ffda54\",\n\t\t\t\t\"#45beae\",\n\t\t\t\t\"#b98037\",\n\t\t\t\t\"#676767\",\n\t\t\t\t\"#6b2dd4\",\n\t\t\t\t\"#47792c\",\n\t\t\t\t\"#fcbdbd\",\n\t\t\t\t\"#830000\",\n\t\t\t\t\"#a5ffc0\",\n\t\t\t\t\"#000078\",\n\t\t\t\t\"#817c00\",\n\t\t\t\t\"#bdf023\",\n\t\t\t\t\"#fffac4\",\n\t\t\t],\n\t\t\tseries: this.getSeries(),\n\t\t\tplotOptions: this.getPlotOptions(),\n\t\t\ttitle: {\n\t\t\t\ttext: this.config.showFilterAsTitle\n\t\t\t\t\t? this.getFilterLabel()\n\t\t\t\t\t: \"\",\n\t\t\t},\n\t\t\txAxis: this.getXAxis(),\n\t\t\texporting: this.getExporting(),\n\t\t\tlegend: { enabled: true },\n\t\t\tcredits: { enabled: false },\n\t\t};\n\n\t\tlet overrides = {};\n\n\t\tif (this.config?.highChartOverrides) {\n\t\t\toverrides = {\n\t\t\t\t...(typeof this.config?.highChartOverrides === \"object\"\n\t\t\t\t\t? this.config?.highChartOverrides ?? {}\n\t\t\t\t\t: this.config?.highChartOverrides(options)),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t...options,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\tabstract getSeries(): HighCharts.SeriesOptionsType[];\n\n\tabstract getPlotOptions(): HighCharts.PlotOptions;\n\n\tabstract getXAxis(): HighCharts.XAxisOptions | undefined;\n\n\tgetYAxis(): HighCharts.YAxisOptions[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttitle: {\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabels: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tfontWeight: \"normal\",\n\t\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tplotLines: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#000000\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor: \"#bbbbbb\",\n\t\t\t\t\t\tdashStyle: \"Solid\",\n\t\t\t\t\t\tzIndex: 1000,\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\tlabel: { text: \"\" },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\t}\n\n\tgetExporting(): HighCharts.ExportingOptions {\n\t\tconst name = this.config?.name ?? \"chart\";\n\t\treturn {\n\t\t\tfilename: `${name}`,\n\t\t\tsourceWidth: 1200,\n\t\t\tbuttons: {\n\t\t\t\tcontextButton: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate getFilterLabel() {\n\t\tconst filters = this.config.layout.filter ?? [];\n\t\tconst labels = filters.map((filter) => {\n\t\t\tconst dimensions =\n\t\t\t\tthis.analytics.metaData?.dimensions[filter] ?? [];\n\t\t\treturn dimensions.map((dimension) => {\n\t\t\t\tconst filterItem = this.analytics.metaData?.items[dimension];\n\t\t\t\treturn filterItem?.name;\n\t\t\t});\n\t\t});\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n}\n"]}
@@ -17,10 +17,11 @@ Default.args = {
17
17
  { dimension: "ou" },
18
18
  { dimension: "pe", label: "Period" }
19
19
  ],
20
- rows: [{ dimension: "dx", label: "Services" }],
21
- filter: []
20
+ rows: [{ dimension: "dx", label: "Services" }]
22
21
  },
23
- options: {}
22
+ options: {
23
+ showFilterAsTitle: true
24
+ }
24
25
  },
25
26
  tableProps: {}
26
27
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DHIS2PivotTable/DHIS2PivotTable.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB;AAEvB,SAAS,uBAAuB;AAEhC,MAAM,OAAqC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW;AACZ;AAEA,IAAO,kCAAQ;AAGR,MAAM,UAAiB;AAAA,EAC7B,MAAM;AACP;AACA,QAAQ,OAAO;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,IACP,QAAQ;AAAA,MACP,SAAS;AAAA,QACR,EAAE,WAAW,KAAK;AAAA,QAClB,EAAE,WAAW,MAAM,OAAO,SAAS;AAAA,MACpC;AAAA,MACA,MAAM,CAAC,EAAE,WAAW,MAAM,OAAO,WAAW,CAAC;AAAA,MAC7C,QAAQ,CAAC;AAAA,IACV;AAAA,IACA,SAAS,CAAC;AAAA,EACX;AAAA,EACA,YAAY,CAAC;AACd","sourcesContent":["import simpleData from \"../../shared/resources/simple-data.json\";\nimport { Meta, StoryObj } from \"@storybook/react\";\nimport { DHIS2PivotTable } from \"./DHIS2PivotTable\";\n\nconst meta: Meta<typeof DHIS2PivotTable> = {\n\ttitle: \"DHIS2 Pivot Table\",\n\tcomponent: DHIS2PivotTable,\n};\n\nexport default meta;\n\ntype Story = StoryObj<typeof DHIS2PivotTable>;\nexport const Default: Story = {\n\tname: \"Default\",\n};\nDefault.args = {\n\tanalytics: simpleData as any,\n\tconfig: {\n\t\tlayout: {\n\t\t\tcolumns: [\n\t\t\t\t{ dimension: \"ou\" },\n\t\t\t\t{ dimension: \"pe\", label: \"Period\" },\n\t\t\t],\n\t\t\trows: [{ dimension: \"dx\", label: \"Services\" }],\n\t\t\tfilter: [],\n\t\t},\n\t\toptions: {},\n\t},\n\ttableProps: {},\n};\n"]}
1
+ {"version":3,"sources":["../../../../src/components/DHIS2PivotTable/DHIS2PivotTable.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB;AAEvB,SAAS,uBAAuB;AAEhC,MAAM,OAAqC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW;AACZ;AAEA,IAAO,kCAAQ;AAGR,MAAM,UAAiB;AAAA,EAC7B,MAAM;AACP;AACA,QAAQ,OAAO;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,IACP,QAAQ;AAAA,MACP,SAAS;AAAA,QACR,EAAE,WAAW,KAAK;AAAA,QAClB,EAAE,WAAW,MAAM,OAAO,SAAS;AAAA,MACpC;AAAA,MACA,MAAM,CAAC,EAAE,WAAW,MAAM,OAAO,WAAW,CAAC;AAAA,IAC9C;AAAA,IACA,SAAS;AAAA,MACR,mBAAmB;AAAA,IACpB;AAAA,EACD;AAAA,EACA,YAAY,CAAC;AACd","sourcesContent":["import simpleData from \"../../shared/resources/simple-data.json\";\nimport { Meta, StoryObj } from \"@storybook/react\";\nimport { DHIS2PivotTable } from \"./DHIS2PivotTable\";\n\nconst meta: Meta<typeof DHIS2PivotTable> = {\n\ttitle: \"DHIS2 Pivot Table\",\n\tcomponent: DHIS2PivotTable,\n};\n\nexport default meta;\n\ntype Story = StoryObj<typeof DHIS2PivotTable>;\nexport const Default: Story = {\n\tname: \"Default\",\n};\nDefault.args = {\n\tanalytics: simpleData as any,\n\tconfig: {\n\t\tlayout: {\n\t\t\tcolumns: [\n\t\t\t\t{ dimension: \"ou\" },\n\t\t\t\t{ dimension: \"pe\", label: \"Period\" },\n\t\t\t],\n\t\t\trows: [{ dimension: \"dx\", label: \"Services\" }],\n\t\t},\n\t\toptions: {\n\t\t\tshowFilterAsTitle: true,\n\t\t},\n\t},\n\ttableProps: {},\n};\n"]}
@@ -15,7 +15,7 @@ class DHIS2PivotTableEngine {
15
15
  this.getColumnMap();
16
16
  }
17
17
  get title() {
18
- const filters = this.config.layout.filter;
18
+ const filters = this.config.layout.filter ?? [];
19
19
  const labels = filters?.map(({ dimension }) => {
20
20
  const dimensions = this.analyticsData.metaData?.dimensions[dimension];
21
21
  return dimensions?.map((dimension2) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/DHIS2PivotTable/services/engine.ts"],"names":["dimension"],"mappings":"AACA,SAAS,SAAS,WAAW,cAAc,OAAO,WAAW;AA8BtD,MAAM,sBAAsB;AAAA,EASlC,YAAY;AAAA,IACX;AAAA,IACA;AAAA,EACD,GAGG;AACF,SAAK,SAAS;AACd,SAAK,gBAAgB;AACrB,SAAK,aAAa,UAAU,KAAK,cAAc,SAAS;AAAA,MACvD;AAAA,MACA;AAAA,IACD,CAAC;AACD,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACnB;AAAA,EAEA,IAAI,QAAQ;AACX,UAAM,UAAU,KAAK,OAAO,OAAO;AACnC,UAAM,SACL,SAAS,IAAI,CAAC,EAAE,UAAU,MAAM;AAC/B,YAAM,aACL,KAAK,cAAc,UAAU,WAAW,SAAS;AAElD,aAAO,YAAY,IAAI,CAACA,eAAc;AACrC,cAAM,gBACL,KAAK,cAAc,UAAU,MAAMA,UAAS;AAC7C,eAAO,eAAe;AAAA,MACvB,CAAC;AAAA,IACF,CAAC,KAAK,CAAC;AAER,WAAO,QAAQ,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,EACxC;AAAA,EAEA,IAAI,YAAY;AACf,UAAM,aAAa,KAAK,YAAY,UAAU;AAC9C,UAAM,gBACL,KAAK,eAAe;AAAA,MACnB,CAAC,KAAK,QAAQ,OAAO,IAAI,OAAO,UAAU;AAAA,MAC1C;AAAA,IACD,KAAK;AAEN,WAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,YAAY;AACf,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC9B;AAAA,EAEA,IAAI,mBAAmB;AACtB,WAAO,KAAK,OAAO,SAAS,oBAAoB;AAAA,EACjD;AAAA,EAEA,IAAI,gBAAgB;AACnB,WAAO,KAAK,OAAO,SAAS,iBAAiB;AAAA,EAC9C;AAAA,EAEA,kBAAkB,WAA2B;AAC5C,WAAO,KAAK,cAAc,UAAU,WAAW,SAAS,KAAK,CAAC;AAAA,EAC/D;AAAA,EAEA,QAAQ,IAAY;AACnB,WAAO,KAAK,cAAc,UAAU,MAAM,EAAS;AAAA,EACpD;AAAA,EAEA,SAAS,QAAgC;AACxC,UAAM,aAAa,OAAO,OAAO,MAAM;AACvC,UAAM,OAAO,KAAK,cAAc,MAAM;AAAA,MACrC,CAAC,QAAQ,aAAa,KAAK,UAAU,EAAE,UAAU,WAAW;AAAA,IAC7D;AACA,WAAO,MAAM,OAAO,CAAC,KAAK,QAAQ;AACjC,aAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC;AAAA,IAC7C,GAAG,CAAC;AAAA,EACL;AAAA,EAEA,aAAa;AACZ,SAAK,aAAa,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC,cAAc;AAC5D,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,KAAK,kBAAkB,UAAU,SAAS,EAAE;AAAA,YAC3C,CAAC,WAAmB,KAAK,QAAQ,MAAM;AAAA,UACxC;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AACD,SAAK,gBAAgB,KAAK,OAAO,OAAO,QAAQ,IAAI,CAAC,iBAAiB;AACrE,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO;AAAA,UACN,KAAK,kBAAkB,aAAa,SAAS,EAAE;AAAA,YAC9C,CAAC,WAAmB,KAAK,QAAQ,MAAM;AAAA,UACxC;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,eAAe;AACd,UAAM,UAAU,KAAK;AACrB,UAAM,mBACL;AAAA,MACC,SAAS;AAAA,QACR,CAAC,WACA,OAAO,OAAO,IAAI,CAAC,UAAU;AAAA,UAC5B,CAAC,OAAO,SAAS,GAAG,KAAK;AAAA,QAC1B,EAAE;AAAA,MACJ;AAAA,IACD,KAAK,CAAC;AACP,UAAM,OAAO,iBAAiB,OAAO,CAAC,KAAK,UAAU;AACpD,aAAO,OAAO,OAAO,UAAU;AAAA,IAChC,GAAG,CAAC;AACJ,UAAM,qBAAqB,iBAAiB,IAAI,CAAC,UAAU;AAAA,MAC1D,GAAG,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,KAAK;AAAA,IACjD,CAAC;AACD,SAAK,YAAY;AAAA,MAChB,IAAI,GAAG,kBAAkB,EAAE;AAAA,QAAI,CAAC,QAC/B,IAAI,OAAO,CAAC,KAAK,UAAU;AAC1B,iBAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAAA,QAC3B,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AACD","sourcesContent":["import { Analytics, AnalyticsItem, LegendSet } from \"@hisptz/dhis2-utils\";\nimport { compact, findIndex, intersection, times, zip } from \"lodash\";\nimport { DHIS2Dimension } from \"../interfaces/index.js\";\n\nexport interface EngineConfig {\n\tlayout: {\n\t\tcolumns: { dimension: DHIS2Dimension; label?: string }[];\n\t\trows: { dimension: DHIS2Dimension; label?: string }[];\n\t\tfilter?: { dimension: DHIS2Dimension; label?: string }[];\n\t};\n\toptions?: {\n\t\tlegendSets?: LegendSet[];\n\t\thideEmptyColumns?: boolean;\n\t\thideEmptyRows?: boolean;\n\t\tshowRowTotals?: boolean;\n\t\tshowColumnTotals?: boolean;\n\t\tshowRowSubtotals?: boolean;\n\t\tshowColumnSubtotals?: boolean;\n\t\tshowFilterAsTitle?: boolean;\n\t\tfixColumnHeaders?: boolean;\n\t\tfixRowHeaders?: boolean;\n\t\t[key: string]: any;\n\t};\n}\n\nexport interface Header {\n\tdimension: DHIS2Dimension;\n\tlabel?: string;\n\titems?: AnalyticsItem[];\n}\n\nexport class DHIS2PivotTableEngine {\n\tanalyticsData: Analytics;\n\tvalueIndex: number;\n\tconfig: EngineConfig;\n\trowHeaders?: Header[];\n\tcolumnHeaders?: Header[];\n\n\tcolumnMap?: { [key: string]: any }[];\n\n\tconstructor({\n\t\tanalytics,\n\t\tconfig,\n\t}: {\n\t\tanalytics: Analytics;\n\t\tconfig: EngineConfig;\n\t}) {\n\t\tthis.config = config;\n\t\tthis.analyticsData = analytics;\n\t\tthis.valueIndex = findIndex(this.analyticsData.headers, [\n\t\t\t\"name\",\n\t\t\t\"value\",\n\t\t]);\n\t\tthis.getHeaders();\n\t\tthis.getColumnMap();\n\t}\n\n\tget title() {\n\t\tconst filters = this.config.layout.filter;\n\t\tconst labels =\n\t\t\tfilters?.map(({ dimension }) => {\n\t\t\t\tconst dimensions =\n\t\t\t\t\tthis.analyticsData.metaData?.dimensions[dimension];\n\n\t\t\t\treturn dimensions?.map((dimension) => {\n\t\t\t\t\tconst dimensionItem =\n\t\t\t\t\t\tthis.analyticsData.metaData?.items[dimension];\n\t\t\t\t\treturn dimensionItem?.name;\n\t\t\t\t});\n\t\t\t}) ?? [];\n\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n\n\tget titleSpan() {\n\t\tconst rowHeaders = this.rowHeaders?.length ?? 0;\n\t\tconst columnHeaders =\n\t\t\tthis.columnHeaders?.reduce(\n\t\t\t\t(acc, val) => acc + (val.items?.length ?? 0),\n\t\t\t\t0,\n\t\t\t) ?? 0;\n\n\t\treturn rowHeaders + columnHeaders;\n\t}\n\n\tget showTitle() {\n\t\treturn this.config?.options?.showFilterAsTitle;\n\t}\n\n\tget fixColumnHeaders() {\n\t\treturn this.config.options?.fixColumnHeaders ?? true;\n\t}\n\n\tget fixRowHeaders() {\n\t\treturn this.config.options?.fixRowHeaders ?? true;\n\t}\n\n\tgetDimensionItems(dimension: DHIS2Dimension) {\n\t\treturn this.analyticsData.metaData?.dimensions[dimension] ?? [];\n\t}\n\n\tgetItem(id: string) {\n\t\treturn this.analyticsData.metaData?.items[id as any];\n\t}\n\n\tgetValue(mapper: { [key: string]: any }) {\n\t\tconst dimensions = Object.values(mapper);\n\t\tconst data = this.analyticsData.rows?.filter(\n\t\t\t(row) => intersection(row, dimensions).length >= dimensions.length,\n\t\t);\n\t\treturn data?.reduce((acc, row) => {\n\t\t\treturn acc + parseFloat(row[this.valueIndex]);\n\t\t}, 0);\n\t}\n\n\tgetHeaders() {\n\t\tthis.rowHeaders = this.config.layout.rows.map((rowConfig) => {\n\t\t\treturn {\n\t\t\t\t...rowConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(rowConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t\tthis.columnHeaders = this.config.layout.columns.map((columnConfig) => {\n\t\t\treturn {\n\t\t\t\t...columnConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(columnConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t}\n\n\tgetColumnMap() {\n\t\tconst columns = this.columnHeaders;\n\t\tconst sanitizedColumns =\n\t\t\tcompact(\n\t\t\t\tcolumns?.map(\n\t\t\t\t\t(column) =>\n\t\t\t\t\t\tcolumn.items?.map((item) => ({\n\t\t\t\t\t\t\t[column.dimension]: item.uid,\n\t\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t) ?? [];\n\t\tconst size = sanitizedColumns.reduce((acc, items) => {\n\t\t\treturn acc * (items?.length ?? 1);\n\t\t}, 1);\n\t\tconst standardiseColumns = sanitizedColumns.map((items) => [\n\t\t\t...times(size / items.length, () => items).flat(),\n\t\t]);\n\t\tthis.columnMap = compact(\n\t\t\tzip(...standardiseColumns).map((arr) =>\n\t\t\t\tarr.reduce((obj, value) => {\n\t\t\t\t\treturn { ...obj, ...value };\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/components/DHIS2PivotTable/services/engine.ts"],"names":["dimension"],"mappings":"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","sourcesContent":["import { Analytics, AnalyticsItem, LegendSet } from \"@hisptz/dhis2-utils\";\nimport { compact, findIndex, intersection, times, zip } from \"lodash\";\nimport { DHIS2Dimension } from \"../interfaces/index.js\";\n\nexport interface EngineConfig {\n\tlayout: {\n\t\tcolumns: { dimension: DHIS2Dimension; label?: string }[];\n\t\trows: { dimension: DHIS2Dimension; label?: string }[];\n\t\tfilter?: { dimension: DHIS2Dimension; label?: string }[];\n\t};\n\toptions?: {\n\t\tlegendSets?: LegendSet[];\n\t\thideEmptyColumns?: boolean;\n\t\thideEmptyRows?: boolean;\n\t\tshowRowTotals?: boolean;\n\t\tshowColumnTotals?: boolean;\n\t\tshowRowSubtotals?: boolean;\n\t\tshowColumnSubtotals?: boolean;\n\t\tshowFilterAsTitle?: boolean;\n\t\tfixColumnHeaders?: boolean;\n\t\tfixRowHeaders?: boolean;\n\t\t[key: string]: any;\n\t};\n}\n\nexport interface Header {\n\tdimension: DHIS2Dimension;\n\tlabel?: string;\n\titems?: AnalyticsItem[];\n}\n\nexport class DHIS2PivotTableEngine {\n\tanalyticsData: Analytics;\n\tvalueIndex: number;\n\tconfig: EngineConfig;\n\trowHeaders?: Header[];\n\tcolumnHeaders?: Header[];\n\n\tcolumnMap?: { [key: string]: any }[];\n\n\tconstructor({\n\t\tanalytics,\n\t\tconfig,\n\t}: {\n\t\tanalytics: Analytics;\n\t\tconfig: EngineConfig;\n\t}) {\n\t\tthis.config = config;\n\t\tthis.analyticsData = analytics;\n\t\tthis.valueIndex = findIndex(this.analyticsData.headers, [\n\t\t\t\"name\",\n\t\t\t\"value\",\n\t\t]);\n\t\tthis.getHeaders();\n\t\tthis.getColumnMap();\n\t}\n\n\tget title() {\n\t\tconst filters = this.config.layout.filter ?? [];\n\t\tconst labels =\n\t\t\tfilters?.map(({ dimension }) => {\n\t\t\t\tconst dimensions =\n\t\t\t\t\tthis.analyticsData.metaData?.dimensions[dimension];\n\n\t\t\t\treturn dimensions?.map((dimension) => {\n\t\t\t\t\tconst dimensionItem =\n\t\t\t\t\t\tthis.analyticsData.metaData?.items[dimension];\n\t\t\t\t\treturn dimensionItem?.name;\n\t\t\t\t});\n\t\t\t}) ?? [];\n\n\t\treturn compact(labels.flat()).join(\", \");\n\t}\n\n\tget titleSpan() {\n\t\tconst rowHeaders = this.rowHeaders?.length ?? 0;\n\t\tconst columnHeaders =\n\t\t\tthis.columnHeaders?.reduce(\n\t\t\t\t(acc, val) => acc + (val.items?.length ?? 0),\n\t\t\t\t0,\n\t\t\t) ?? 0;\n\n\t\treturn rowHeaders + columnHeaders;\n\t}\n\n\tget showTitle() {\n\t\treturn this.config?.options?.showFilterAsTitle;\n\t}\n\n\tget fixColumnHeaders() {\n\t\treturn this.config.options?.fixColumnHeaders ?? true;\n\t}\n\n\tget fixRowHeaders() {\n\t\treturn this.config.options?.fixRowHeaders ?? true;\n\t}\n\n\tgetDimensionItems(dimension: DHIS2Dimension) {\n\t\treturn this.analyticsData.metaData?.dimensions[dimension] ?? [];\n\t}\n\n\tgetItem(id: string) {\n\t\treturn this.analyticsData.metaData?.items[id as any];\n\t}\n\n\tgetValue(mapper: { [key: string]: any }) {\n\t\tconst dimensions = Object.values(mapper);\n\t\tconst data = this.analyticsData.rows?.filter(\n\t\t\t(row) => intersection(row, dimensions).length >= dimensions.length,\n\t\t);\n\t\treturn data?.reduce((acc, row) => {\n\t\t\treturn acc + parseFloat(row[this.valueIndex]);\n\t\t}, 0);\n\t}\n\n\tgetHeaders() {\n\t\tthis.rowHeaders = this.config.layout.rows.map((rowConfig) => {\n\t\t\treturn {\n\t\t\t\t...rowConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(rowConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t\tthis.columnHeaders = this.config.layout.columns.map((columnConfig) => {\n\t\t\treturn {\n\t\t\t\t...columnConfig,\n\t\t\t\titems: compact(\n\t\t\t\t\tthis.getDimensionItems(columnConfig.dimension).map(\n\t\t\t\t\t\t(itemId: string) => this.getItem(itemId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t}\n\n\tgetColumnMap() {\n\t\tconst columns = this.columnHeaders;\n\t\tconst sanitizedColumns =\n\t\t\tcompact(\n\t\t\t\tcolumns?.map(\n\t\t\t\t\t(column) =>\n\t\t\t\t\t\tcolumn.items?.map((item) => ({\n\t\t\t\t\t\t\t[column.dimension]: item.uid,\n\t\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t) ?? [];\n\t\tconst size = sanitizedColumns.reduce((acc, items) => {\n\t\t\treturn acc * (items?.length ?? 1);\n\t\t}, 1);\n\t\tconst standardiseColumns = sanitizedColumns.map((items) => [\n\t\t\t...times(size / items.length, () => items).flat(),\n\t\t]);\n\t\tthis.columnMap = compact(\n\t\t\tzip(...standardiseColumns).map((arr) =>\n\t\t\t\tarr.reduce((obj, value) => {\n\t\t\t\t\treturn { ...obj, ...value };\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hisptz/dhis2-analytics",
3
- "version": "2.0.10",
3
+ "version": "2.0.12",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/types/index.d.ts",
@@ -36,8 +36,8 @@
36
36
  "tsup": "^8.0.1",
37
37
  "typescript": "^5.3.3",
38
38
  "usehooks-ts": "^2.9.2",
39
- "@repo/typescript-config": "0.0.0",
40
- "@repo/eslint-config": "0.0.0"
39
+ "@repo/eslint-config": "0.0.0",
40
+ "@repo/typescript-config": "0.0.0"
41
41
  },
42
42
  "dependencies": {
43
43
  "@react-leaflet/core": "^2.1.0",
@@ -55,7 +55,7 @@
55
55
  "react-query": "^3.39.3",
56
56
  "react-spring": "^9.6.1",
57
57
  "screenfull": "^6.0.2",
58
- "@hisptz/dhis2-ui": "2.0.10",
58
+ "@hisptz/dhis2-ui": "2.0.12",
59
59
  "@hisptz/dhis2-utils": "2.0.4"
60
60
  },
61
61
  "peerDependencies": {