@hisptz/dhis2-scorecard 1.2.30 → 1.2.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/components/LoadingIndicator.js +3 -5
  2. package/dist/components/LoadingIndicator.js.map +1 -1
  3. package/dist/components/ScorecardLegendsView/components/LegendView.js +86 -56
  4. package/dist/components/ScorecardLegendsView/components/LegendView.js.map +1 -1
  5. package/dist/components/ScorecardLegendsView/components/OrgUnitLevelSpecificTargetView.js +7 -31
  6. package/dist/components/ScorecardLegendsView/components/OrgUnitLevelSpecificTargetView.js.map +1 -1
  7. package/dist/components/ScorecardLegendsView/components/OrgUnitSpecificTargetView.js +16 -26
  8. package/dist/components/ScorecardLegendsView/components/OrgUnitSpecificTargetView.js.map +1 -1
  9. package/dist/components/ScorecardLegendsView/components/PeriodSpecificTargetView.js +4 -22
  10. package/dist/components/ScorecardLegendsView/components/PeriodSpecificTargetView.js.map +1 -1
  11. package/dist/components/ScorecardPrint/components/ScorecardDownloadButton.js +6 -13
  12. package/dist/components/ScorecardPrint/components/ScorecardDownloadButton.js.map +1 -1
  13. package/dist/components/ScorecardTable/FurtherAnalysisVisualization.js +6 -6
  14. package/dist/components/ScorecardTable/FurtherAnalysisVisualization.js.map +1 -1
  15. package/dist/components/ScorecardTable/components/AverageCell.js +2 -2
  16. package/dist/components/ScorecardTable/components/AverageCell.js.map +1 -1
  17. package/dist/components/ScorecardTable/components/AverageFooterCell.js +10 -32
  18. package/dist/components/ScorecardTable/components/AverageFooterCell.js.map +1 -1
  19. package/dist/components/ScorecardTable/components/DataContainer.js +4 -1
  20. package/dist/components/ScorecardTable/components/DataContainer.js.map +1 -1
  21. package/dist/components/ScorecardTable/components/DataFooterCell.js +35 -71
  22. package/dist/components/ScorecardTable/components/DataFooterCell.js.map +1 -1
  23. package/dist/components/ScorecardTable/components/FurtherAnalysisMenu.js +45 -0
  24. package/dist/components/ScorecardTable/components/FurtherAnalysisMenu.js.map +1 -1
  25. package/dist/components/ScorecardTable/components/FurtherAnalysisModal.js.map +1 -1
  26. package/dist/components/ScorecardTable/components/TableHeader/components/DataHeaderCell.js +37 -2
  27. package/dist/components/ScorecardTable/components/TableHeader/components/DataHeaderCell.js.map +1 -1
  28. package/dist/components/ScorecardTable/components/TableHeader/components/DataHeaderLegendView.js +78 -0
  29. package/dist/components/ScorecardTable/components/TableHeader/components/DataHeaderLegendView.js.map +1 -0
  30. package/dist/esm/components/LoadingIndicator.js +2 -4
  31. package/dist/esm/components/LoadingIndicator.js.map +1 -1
  32. package/dist/esm/components/ScorecardLegendsView/components/LegendView.js +86 -52
  33. package/dist/esm/components/ScorecardLegendsView/components/LegendView.js.map +1 -1
  34. package/dist/esm/components/ScorecardLegendsView/components/OrgUnitLevelSpecificTargetView.js +7 -27
  35. package/dist/esm/components/ScorecardLegendsView/components/OrgUnitLevelSpecificTargetView.js.map +1 -1
  36. package/dist/esm/components/ScorecardLegendsView/components/OrgUnitSpecificTargetView.js +16 -22
  37. package/dist/esm/components/ScorecardLegendsView/components/OrgUnitSpecificTargetView.js.map +1 -1
  38. package/dist/esm/components/ScorecardLegendsView/components/PeriodSpecificTargetView.js +4 -18
  39. package/dist/esm/components/ScorecardLegendsView/components/PeriodSpecificTargetView.js.map +1 -1
  40. package/dist/esm/components/ScorecardPrint/components/ScorecardDownloadButton.js +4 -11
  41. package/dist/esm/components/ScorecardPrint/components/ScorecardDownloadButton.js.map +1 -1
  42. package/dist/esm/components/ScorecardTable/FurtherAnalysisVisualization.js +6 -6
  43. package/dist/esm/components/ScorecardTable/FurtherAnalysisVisualization.js.map +1 -1
  44. package/dist/esm/components/ScorecardTable/components/AverageCell.js +2 -2
  45. package/dist/esm/components/ScorecardTable/components/AverageCell.js.map +1 -1
  46. package/dist/esm/components/ScorecardTable/components/AverageFooterCell.js +11 -33
  47. package/dist/esm/components/ScorecardTable/components/AverageFooterCell.js.map +1 -1
  48. package/dist/esm/components/ScorecardTable/components/DataContainer.js +4 -1
  49. package/dist/esm/components/ScorecardTable/components/DataContainer.js.map +1 -1
  50. package/dist/esm/components/ScorecardTable/components/DataFooterCell.js +36 -72
  51. package/dist/esm/components/ScorecardTable/components/DataFooterCell.js.map +1 -1
  52. package/dist/esm/components/ScorecardTable/components/FurtherAnalysisMenu.js +45 -0
  53. package/dist/esm/components/ScorecardTable/components/FurtherAnalysisMenu.js.map +1 -1
  54. package/dist/esm/components/ScorecardTable/components/FurtherAnalysisModal.js.map +1 -1
  55. package/dist/esm/components/ScorecardTable/components/TableHeader/components/DataHeaderCell.js +39 -4
  56. package/dist/esm/components/ScorecardTable/components/TableHeader/components/DataHeaderCell.js.map +1 -1
  57. package/dist/esm/components/ScorecardTable/components/TableHeader/components/DataHeaderLegendView.js +72 -0
  58. package/dist/esm/components/ScorecardTable/components/TableHeader/components/DataHeaderLegendView.js.map +1 -0
  59. package/dist/esm/hooks/completed.js +13 -0
  60. package/dist/esm/hooks/completed.js.map +1 -0
  61. package/dist/esm/hooks/table.js +35 -45
  62. package/dist/esm/hooks/table.js.map +1 -1
  63. package/dist/esm/hooks/value.js +51 -101
  64. package/dist/esm/hooks/value.js.map +1 -1
  65. package/dist/esm/schemas/config.js +4 -0
  66. package/dist/esm/schemas/config.js.map +1 -1
  67. package/dist/esm/utils/columns.js +15 -5
  68. package/dist/esm/utils/columns.js.map +1 -1
  69. package/dist/esm/utils/dataEngine.js +128 -83
  70. package/dist/esm/utils/dataEngine.js.map +1 -1
  71. package/dist/hooks/completed.js +15 -0
  72. package/dist/hooks/completed.js.map +1 -0
  73. package/dist/hooks/table.js +43 -53
  74. package/dist/hooks/table.js.map +1 -1
  75. package/dist/hooks/value.js +49 -98
  76. package/dist/hooks/value.js.map +1 -1
  77. package/dist/schemas/config.js +4 -0
  78. package/dist/schemas/config.js.map +1 -1
  79. package/dist/types/components/LoadingIndicator.d.ts.map +1 -1
  80. package/dist/types/components/ScorecardLegendsView/components/LegendView.d.ts +1 -1
  81. package/dist/types/components/ScorecardLegendsView/components/LegendView.d.ts.map +1 -1
  82. package/dist/types/components/ScorecardLegendsView/components/OrgUnitLevelSpecificTargetView.d.ts.map +1 -1
  83. package/dist/types/components/ScorecardLegendsView/components/OrgUnitSpecificTargetView.d.ts.map +1 -1
  84. package/dist/types/components/ScorecardLegendsView/components/PeriodSpecificTargetView.d.ts.map +1 -1
  85. package/dist/types/components/ScorecardPrint/components/ScorecardDownloadButton.d.ts.map +1 -1
  86. package/dist/types/components/ScorecardTable/FurtherAnalysisVisualization.d.ts.map +1 -1
  87. package/dist/types/components/ScorecardTable/components/AverageFooterCell.d.ts.map +1 -1
  88. package/dist/types/components/ScorecardTable/components/DataContainer.d.ts.map +1 -1
  89. package/dist/types/components/ScorecardTable/components/DataFooterCell.d.ts.map +1 -1
  90. package/dist/types/components/ScorecardTable/components/FurtherAnalysisMenu.d.ts.map +1 -1
  91. package/dist/types/components/ScorecardTable/components/FurtherAnalysisModal.d.ts +10 -0
  92. package/dist/types/components/ScorecardTable/components/FurtherAnalysisModal.d.ts.map +1 -1
  93. package/dist/types/components/ScorecardTable/components/TableHeader/components/DataHeaderCell.d.ts.map +1 -1
  94. package/dist/types/components/ScorecardTable/components/TableHeader/components/DataHeaderLegendView.d.ts +13 -0
  95. package/dist/types/components/ScorecardTable/components/TableHeader/components/DataHeaderLegendView.d.ts.map +1 -0
  96. package/dist/types/hooks/completed.d.ts +2 -0
  97. package/dist/types/hooks/completed.d.ts.map +1 -0
  98. package/dist/types/hooks/table.d.ts.map +1 -1
  99. package/dist/types/hooks/value.d.ts +9 -3
  100. package/dist/types/hooks/value.d.ts.map +1 -1
  101. package/dist/types/schemas/config.d.ts +18 -0
  102. package/dist/types/schemas/config.d.ts.map +1 -1
  103. package/dist/types/utils/columns.d.ts.map +1 -1
  104. package/dist/types/utils/dataEngine.d.ts +16 -12
  105. package/dist/types/utils/dataEngine.d.ts.map +1 -1
  106. package/dist/utils/columns.js +15 -5
  107. package/dist/utils/columns.js.map +1 -1
  108. package/dist/utils/dataEngine.js +127 -82
  109. package/dist/utils/dataEngine.js.map +1 -1
  110. package/package.json +5 -5
@@ -1,171 +1,216 @@
1
1
  import { queue, asyncify } from 'async-es';
2
- import { maxBy, chunk } from 'lodash';
2
+ import { flattenDeep, compact, isEmpty, maxBy, chunk } from 'lodash';
3
3
 
4
4
  const chunkSize = 5;
5
5
  function createScorecardDataEngine() {
6
+ const data = /* @__PURE__ */ new Map();
7
+ const mappedData = /* @__PURE__ */ new Map();
8
+ const generalListeners = /* @__PURE__ */ new Set();
9
+ const progressListeners = /* @__PURE__ */ new Set();
10
+ const onCompleteListeners = /* @__PURE__ */ new Set();
11
+ let dataQueryQueue = queue(async () => Promise.resolve([]));
12
+ const keyListeners = /* @__PURE__ */ new Map();
13
+ let totalRequests = 0;
14
+ let completedRequests = 0;
15
+ let isDone = false;
16
+ let initialized = false;
17
+ let dimensions = {
18
+ orgUnits: [],
19
+ periods: [],
20
+ dataItems: []
21
+ };
22
+ function getSnapshot(config) {
23
+ return function() {
24
+ const keys = flattenDeep(
25
+ config.dx.map(
26
+ (dx) => config.ou.map(
27
+ (ou) => config.pe.map((pe) => `${ou}-${dx}-${pe}`)
28
+ )
29
+ )
30
+ );
31
+ const dataKey = keys.join("-");
32
+ if (mappedData.get(dataKey)) {
33
+ return mappedData.get(dataKey);
34
+ }
35
+ const datum = compact(keys.map((key) => data.get(key)));
36
+ if (!isEmpty(datum)) {
37
+ mappedData.set(dataKey, datum);
38
+ }
39
+ return mappedData.get(dataKey);
40
+ };
41
+ }
42
+ function getIsCompleteSnapshot() {
43
+ return isDone;
44
+ }
45
+ function complete() {
46
+ isDone = true;
47
+ for (const listener of onCompleteListeners) {
48
+ listener();
49
+ }
50
+ }
6
51
  return {
7
- queue: queue(async () => Promise.resolve([])),
8
- data: [],
9
- totalRequests: 0,
10
- completedRequests: 0,
11
- isDone: false,
12
- initialized: false,
52
+ queue: dataQueryQueue,
53
+ getSnapshot,
54
+ getIsCompleteSnapshot,
55
+ data,
56
+ isDone: getIsCompleteSnapshot(),
57
+ initialized,
13
58
  dataListeners: [],
14
- onCompleteListeners: [],
15
- progressListeners: [],
16
- dimensions: {
17
- orgUnits: [],
18
- periods: [],
19
- dataItems: []
20
- },
59
+ onCompleteListeners,
60
+ progressListeners,
61
+ dimensions,
21
62
  updateProgress() {
22
- const progress = this.completedRequests / this.totalRequests;
63
+ const progress = completedRequests / totalRequests;
23
64
  for (const listener of this.progressListeners) {
24
65
  listener(progress);
25
66
  }
26
67
  },
27
68
  updateTotalRequests(value) {
28
- this.totalRequests = value;
69
+ totalRequests = value;
29
70
  this.updateProgress();
30
71
  },
31
72
  updateCompleteRequests(value) {
32
- this.completedRequests = value;
73
+ completedRequests = value;
33
74
  this.updateProgress();
34
75
  },
35
- addDataListener(listener) {
36
- this.dataListeners.push(listener);
76
+ addDataListener(key, listener) {
77
+ keyListeners.get(key)?.add(listener);
37
78
  return () => {
38
- this.dataListeners.filter((l) => l !== listener);
79
+ keyListeners.get(key)?.delete(listener);
80
+ };
81
+ },
82
+ addGeneralListener(listener) {
83
+ generalListeners.add(listener);
84
+ return () => {
85
+ generalListeners.delete(listener);
39
86
  };
40
87
  },
41
88
  addOnCompleteListener(listener) {
42
- this.onCompleteListeners.push(listener);
89
+ onCompleteListeners.add(listener);
43
90
  return () => {
44
- this.onCompleteListeners.filter((l) => l !== listener);
91
+ onCompleteListeners.delete(listener);
45
92
  };
46
93
  },
47
94
  addProgressListener(listener) {
48
- this.progressListeners.push(listener);
95
+ progressListeners.add(listener);
49
96
  return () => {
50
- this.progressListeners.filter((l) => l !== listener);
97
+ progressListeners.delete(listener);
51
98
  };
52
99
  },
53
- removeListener(listener) {
54
- return this.dataListeners.filter((l) => l !== listener);
100
+ removeListener(key, listener) {
101
+ return keyListeners.get(key)?.delete(listener);
55
102
  },
56
- updateData(data) {
57
- this.data = [...this.data, ...data];
58
- for (const listener of this.dataListeners) {
59
- listener(this.data);
103
+ updateData(downloadedData) {
104
+ for (const dataItem of downloadedData) {
105
+ const { ou, dx, pe } = dataItem;
106
+ data.set(`${ou}-${dx}-${pe}`, dataItem);
60
107
  }
61
- },
62
- complete() {
63
- this.isDone = true;
64
- for (const listener of this.onCompleteListeners) {
65
- listener(this.isDone);
108
+ for (const listener of generalListeners) {
109
+ listener();
66
110
  }
67
111
  },
68
112
  clear() {
69
- this.data = [];
70
- this.isDone = false;
71
- this.initialized = false;
113
+ data.clear();
114
+ mappedData.clear();
115
+ isDone = false;
116
+ initialized = false;
72
117
  },
73
118
  setupDataFetch() {
74
119
  const getTheLongestDimension = () => {
75
- const dimensions = [
120
+ const updatedDimensions = [
76
121
  {
77
122
  dimension: "pe",
78
- length: this.dimensions.periods.length
123
+ length: dimensions.periods.length
79
124
  },
80
125
  {
81
126
  dimension: "dx",
82
- length: this.dimensions.dataItems.length
127
+ length: dimensions.dataItems.length
83
128
  },
84
129
  {
85
130
  dimension: "ou",
86
- length: this.dimensions.orgUnits.length
131
+ length: dimensions.orgUnits.length
87
132
  }
88
133
  ];
89
- return maxBy(dimensions, "length").dimension;
134
+ return maxBy(updatedDimensions, "length").dimension;
90
135
  };
91
136
  const getChunkedData = async (maxItem) => {
92
137
  switch (maxItem) {
93
138
  case "dx":
94
139
  const dataItemChunks = chunk(
95
- this.dimensions.dataItems,
140
+ dimensions.dataItems,
96
141
  chunkSize
97
142
  );
98
143
  this.updateTotalRequests(dataItemChunks.length);
99
144
  for (const dataItemChunk of dataItemChunks) {
100
- this.queue.push({
101
- periods: this.dimensions.periods,
145
+ dataQueryQueue.push({
146
+ periods: dimensions.periods,
102
147
  dataItems: dataItemChunk,
103
- orgUnits: this.dimensions.orgUnits
104
- }).then((data) => {
105
- this.updateData(data);
106
- }).then((data) => {
148
+ orgUnits: dimensions.orgUnits
149
+ }).then((data2) => {
150
+ this.updateData(data2);
151
+ }).then((data2) => {
107
152
  this.updateCompleteRequests(
108
- this.completedRequests + 1
153
+ completedRequests + 1
109
154
  );
110
- return data;
155
+ return data2;
111
156
  });
112
157
  }
113
158
  break;
114
159
  case "pe":
115
160
  const periodChunks = chunk(
116
- this.dimensions.periods,
161
+ dimensions.periods,
117
162
  chunkSize
118
163
  );
119
164
  this.updateTotalRequests(periodChunks.length);
120
165
  for (const periodChunk of periodChunks) {
121
- this.queue.push({
166
+ dataQueryQueue.push({
122
167
  periods: periodChunk,
123
- dataItems: this.dimensions.dataItems,
124
- orgUnits: this.dimensions.orgUnits
125
- }).then((data) => {
126
- this.updateData(data);
127
- }).then((data) => {
168
+ dataItems: dimensions.dataItems,
169
+ orgUnits: dimensions.orgUnits
170
+ }).then((data2) => {
171
+ this.updateData(data2);
172
+ }).then((data2) => {
128
173
  this.updateCompleteRequests(
129
- this.completedRequests + 1
174
+ completedRequests + 1
130
175
  );
131
- return data;
176
+ return data2;
132
177
  });
133
178
  }
134
179
  break;
135
180
  case "ou":
136
181
  const orgUnitChunks = chunk(
137
- this.dimensions.orgUnits,
182
+ dimensions.orgUnits,
138
183
  chunkSize
139
184
  );
140
185
  this.updateTotalRequests(orgUnitChunks.length);
141
186
  for (const orgUnitChunk of orgUnitChunks) {
142
- this.queue.push({
143
- periods: this.dimensions.periods,
144
- dataItems: this.dimensions.dataItems,
187
+ dataQueryQueue.push({
188
+ periods: dimensions.periods,
189
+ dataItems: dimensions.dataItems,
145
190
  orgUnits: orgUnitChunk
146
- }).then((data) => {
147
- this.updateData(data);
148
- }).then((data) => {
191
+ }).then((data2) => {
192
+ this.updateData(data2);
193
+ }).then((data2) => {
149
194
  this.updateCompleteRequests(
150
- this.completedRequests + 1
195
+ completedRequests + 1
151
196
  );
152
- return data;
197
+ return data2;
153
198
  });
154
199
  }
155
200
  break;
156
201
  }
157
202
  };
158
- this.queue.remove(() => true);
159
- if (this.dimensions.periods.length < 5 && this.dimensions.dataItems.length < 5 && this.dimensions.orgUnits.length < 5) {
160
- const { orgUnits, periods, dataItems } = this.dimensions;
203
+ dataQueryQueue.remove(() => true);
204
+ if (dimensions.periods.length < 5 && dimensions.dataItems.length < 5 && dimensions.orgUnits.length < 5) {
205
+ const { orgUnits, periods, dataItems } = dimensions;
161
206
  this.updateTotalRequests(1);
162
207
  this.updateCompleteRequests(0);
163
- this.queue.push({
208
+ dataQueryQueue.push({
164
209
  periods,
165
210
  orgUnits,
166
211
  dataItems
167
- }).then((data) => {
168
- this.updateData(data);
212
+ }).then((data2) => {
213
+ this.updateData(data2);
169
214
  this.updateCompleteRequests(1);
170
215
  });
171
216
  return;
@@ -174,15 +219,15 @@ function createScorecardDataEngine() {
174
219
  getChunkedData(dimensionWithMaxItems);
175
220
  },
176
221
  initialize(fetch, {
177
- dimensions
222
+ dimensions: appliedDimensions
178
223
  }) {
179
- this.dimensions = dimensions;
180
- this.queue = queue(asyncify(fetch));
181
- this.queue.drain(() => {
182
- this.complete();
183
- });
184
- this.initialized = true;
185
224
  this.clear();
225
+ dimensions = appliedDimensions;
226
+ dataQueryQueue = queue(asyncify(fetch));
227
+ dataQueryQueue.drain(() => {
228
+ complete();
229
+ });
230
+ initialized = true;
186
231
  this.setupDataFetch();
187
232
  }
188
233
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/dataEngine.ts"],"names":[],"mappings":"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","file":"dataEngine.js","sourcesContent":["import type { AnalyticsData } from \"./data\";\nimport { asyncify, queue } from \"async-es\";\nimport { chunk, maxBy } from \"lodash\";\nimport type { QueueObject } from \"async\";\n\nexport type RemoveListener = () => void;\nexport type DataEngineListener = (data: AnalyticsData[]) => void;\nexport type OnCompleteDataEngineListener = (completed: boolean) => void;\nexport type ProgressListeners = (progress: number) => void;\n\nconst chunkSize = 5;\n\nexport type ScorecardDataEngine = ReturnType<typeof createScorecardDataEngine>;\n\nexport function createScorecardDataEngine() {\n\treturn {\n\t\tqueue: queue(async () => Promise.resolve([])) as QueueObject<{\n\t\t\tperiods: string[];\n\t\t\torgUnits: string[];\n\t\t\tdataItems: string[];\n\t\t}>,\n\t\tdata: [] as AnalyticsData[],\n\t\ttotalRequests: 0,\n\t\tcompletedRequests: 0,\n\t\tisDone: false,\n\t\tinitialized: false,\n\t\tdataListeners: [] as DataEngineListener[],\n\t\tonCompleteListeners: [] as OnCompleteDataEngineListener[],\n\t\tprogressListeners: [] as ProgressListeners[],\n\t\tdimensions: {\n\t\t\torgUnits: [] as string[],\n\t\t\tperiods: [] as string[],\n\t\t\tdataItems: [] as string[],\n\t\t},\n\t\tupdateProgress() {\n\t\t\tconst progress = this.completedRequests / this.totalRequests;\n\t\t\tfor (const listener of this.progressListeners) {\n\t\t\t\tlistener(progress);\n\t\t\t}\n\t\t},\n\t\tupdateTotalRequests(value: number) {\n\t\t\tthis.totalRequests = value;\n\t\t\tthis.updateProgress();\n\t\t},\n\t\tupdateCompleteRequests(value: number) {\n\t\t\tthis.completedRequests = value;\n\t\t\tthis.updateProgress();\n\t\t},\n\t\taddDataListener(listener: DataEngineListener): RemoveListener {\n\t\t\tthis.dataListeners.push(listener);\n\t\t\treturn () => {\n\t\t\t\tthis.dataListeners.filter((l) => l !== listener);\n\t\t\t};\n\t\t},\n\t\taddOnCompleteListener(\n\t\t\tlistener: OnCompleteDataEngineListener,\n\t\t): RemoveListener {\n\t\t\tthis.onCompleteListeners.push(listener);\n\t\t\treturn () => {\n\t\t\t\tthis.onCompleteListeners.filter((l) => l !== listener);\n\t\t\t};\n\t\t},\n\t\taddProgressListener(listener: ProgressListeners): RemoveListener {\n\t\t\tthis.progressListeners.push(listener);\n\t\t\treturn () => {\n\t\t\t\tthis.progressListeners.filter((l) => l !== listener);\n\t\t\t};\n\t\t},\n\t\tremoveListener(listener: DataEngineListener) {\n\t\t\treturn this.dataListeners.filter((l) => l !== listener);\n\t\t},\n\t\tupdateData(data: AnalyticsData[]) {\n\t\t\tthis.data = [...this.data, ...data];\n\t\t\tfor (const listener of this.dataListeners) {\n\t\t\t\tlistener(this.data);\n\t\t\t}\n\t\t},\n\t\tcomplete() {\n\t\t\tthis.isDone = true;\n\t\t\tfor (const listener of this.onCompleteListeners) {\n\t\t\t\tlistener(this.isDone);\n\t\t\t}\n\t\t},\n\t\tclear() {\n\t\t\tthis.data = [];\n\t\t\tthis.isDone = false;\n\t\t\tthis.initialized = false;\n\t\t},\n\t\tsetupDataFetch() {\n\t\t\tconst getTheLongestDimension = () => {\n\t\t\t\tconst dimensions = [\n\t\t\t\t\t{\n\t\t\t\t\t\tdimension: \"pe\",\n\t\t\t\t\t\tlength: this.dimensions.periods.length,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdimension: \"dx\",\n\t\t\t\t\t\tlength: this.dimensions.dataItems.length,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdimension: \"ou\",\n\t\t\t\t\t\tlength: this.dimensions.orgUnits.length,\n\t\t\t\t\t},\n\t\t\t\t] as const;\n\n\t\t\t\treturn maxBy(dimensions, \"length\")!.dimension;\n\t\t\t};\n\t\t\tconst getChunkedData = async (maxItem: \"dx\" | \"pe\" | \"ou\") => {\n\t\t\t\tswitch (maxItem) {\n\t\t\t\t\tcase \"dx\":\n\t\t\t\t\t\tconst dataItemChunks = chunk(\n\t\t\t\t\t\t\tthis.dimensions.dataItems,\n\t\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.updateTotalRequests(dataItemChunks.length);\n\t\t\t\t\t\tfor (const dataItemChunk of dataItemChunks) {\n\t\t\t\t\t\t\tthis.queue\n\t\t\t\t\t\t\t\t.push({\n\t\t\t\t\t\t\t\t\tperiods: this.dimensions.periods,\n\t\t\t\t\t\t\t\t\tdataItems: dataItemChunk,\n\t\t\t\t\t\t\t\t\torgUnits: this.dimensions.orgUnits,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateCompleteRequests(\n\t\t\t\t\t\t\t\t\t\tthis.completedRequests + 1,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"pe\":\n\t\t\t\t\t\tconst periodChunks = chunk(\n\t\t\t\t\t\t\tthis.dimensions.periods,\n\t\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.updateTotalRequests(periodChunks.length);\n\t\t\t\t\t\tfor (const periodChunk of periodChunks) {\n\t\t\t\t\t\t\tthis.queue\n\t\t\t\t\t\t\t\t.push({\n\t\t\t\t\t\t\t\t\tperiods: periodChunk,\n\t\t\t\t\t\t\t\t\tdataItems: this.dimensions.dataItems,\n\t\t\t\t\t\t\t\t\torgUnits: this.dimensions.orgUnits,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateCompleteRequests(\n\t\t\t\t\t\t\t\t\t\tthis.completedRequests + 1,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"ou\":\n\t\t\t\t\t\tconst orgUnitChunks = chunk(\n\t\t\t\t\t\t\tthis.dimensions.orgUnits,\n\t\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.updateTotalRequests(orgUnitChunks.length);\n\t\t\t\t\t\tfor (const orgUnitChunk of orgUnitChunks) {\n\t\t\t\t\t\t\tthis.queue\n\t\t\t\t\t\t\t\t.push({\n\t\t\t\t\t\t\t\t\tperiods: this.dimensions.periods,\n\t\t\t\t\t\t\t\t\tdataItems: this.dimensions.dataItems,\n\t\t\t\t\t\t\t\t\torgUnits: orgUnitChunk,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateCompleteRequests(\n\t\t\t\t\t\t\t\t\t\tthis.completedRequests + 1,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.queue.remove(() => true);\n\t\t\tif (\n\t\t\t\tthis.dimensions.periods.length < 5 &&\n\t\t\t\tthis.dimensions.dataItems.length < 5 &&\n\t\t\t\tthis.dimensions.orgUnits.length < 5\n\t\t\t) {\n\t\t\t\tconst { orgUnits, periods, dataItems } = this.dimensions;\n\t\t\t\tthis.updateTotalRequests(1);\n\t\t\t\tthis.updateCompleteRequests(0);\n\t\t\t\tthis.queue\n\t\t\t\t\t.push({\n\t\t\t\t\t\tperiods,\n\t\t\t\t\t\torgUnits,\n\t\t\t\t\t\tdataItems,\n\t\t\t\t\t})\n\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\tthis.updateCompleteRequests(1);\n\t\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst dimensionWithMaxItems = getTheLongestDimension();\n\t\t\tgetChunkedData(dimensionWithMaxItems);\n\t\t},\n\t\tinitialize(\n\t\t\tfetch: (dimensions: {\n\t\t\t\tperiods: string[];\n\t\t\t\torgUnits: string[];\n\t\t\t\tdataItems: string[];\n\t\t\t}) => Promise<AnalyticsData[]>,\n\t\t\t{\n\t\t\t\tdimensions,\n\t\t\t}: {\n\t\t\t\tdimensions: {\n\t\t\t\t\tdataItems: string[];\n\t\t\t\t\torgUnits: string[];\n\t\t\t\t\tperiods: string[];\n\t\t\t\t};\n\t\t\t},\n\t\t) {\n\t\t\tthis.dimensions = dimensions;\n\t\t\tthis.queue = queue(asyncify(fetch));\n\t\t\tthis.queue.drain(() => {\n\t\t\t\tthis.complete();\n\t\t\t});\n\t\t\tthis.initialized = true;\n\t\t\tthis.clear();\n\t\t\tthis.setupDataFetch();\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"sources":["../../../src/utils/dataEngine.ts"],"names":["data"],"mappings":"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","file":"dataEngine.js","sourcesContent":["import type { AnalyticsData } from \"./data\";\nimport { asyncify, queue } from \"async-es\";\nimport { chunk, compact, flattenDeep, isEmpty, map, maxBy, uniq } from \"lodash\";\nimport type { QueueObject } from \"async\";\n\nexport type RemoveListener = () => void;\nexport type DataEngineListener = () => void;\nexport type OnCompleteDataEngineListener = () => void;\nexport type ProgressListeners = (progress: number) => void;\n\nconst chunkSize = 5;\n\nexport type ScorecardDataEngine = ReturnType<typeof createScorecardDataEngine>;\n\nexport function createScorecardDataEngine() {\n\tconst data = new Map<string, AnalyticsData>();\n\tconst mappedData = new Map<string, AnalyticsData[]>();\n\tconst generalListeners = new Set<DataEngineListener>();\n\tconst progressListeners = new Set<ProgressListeners>();\n\tconst onCompleteListeners = new Set<OnCompleteDataEngineListener>();\n\tlet dataQueryQueue = queue(async () => Promise.resolve([])) as QueueObject<{\n\t\tperiods: string[];\n\t\torgUnits: string[];\n\t\tdataItems: string[];\n\t}>;\n\tconst keyListeners = new Map<string, Set<DataEngineListener>>();\n\n\tlet totalRequests = 0;\n\tlet completedRequests = 0;\n\tlet isDone = false;\n\tlet initialized = false;\n\tlet dimensions: {\n\t\torgUnits: string[];\n\t\tperiods: string[];\n\t\tdataItems: string[];\n\t} = {\n\t\torgUnits: [] as string[],\n\t\tperiods: [] as string[],\n\t\tdataItems: [] as string[],\n\t};\n\n\tfunction getSnapshot(config: { dx: string[]; pe: string[]; ou: string[] }) {\n\t\treturn function () {\n\t\t\tconst keys = flattenDeep(\n\t\t\t\tconfig.dx.map((dx) =>\n\t\t\t\t\tconfig.ou.map((ou) =>\n\t\t\t\t\t\tconfig.pe.map((pe) => `${ou}-${dx}-${pe}`),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst dataKey = keys.join(\"-\");\n\t\t\tif (mappedData.get(dataKey)) {\n\t\t\t\treturn mappedData.get(dataKey);\n\t\t\t}\n\t\t\tconst datum = compact(keys.map((key) => data.get(key)));\n\t\t\tif (!isEmpty(datum)) {\n\t\t\t\tmappedData.set(dataKey, datum);\n\t\t\t}\n\t\t\treturn mappedData.get(dataKey);\n\t\t};\n\t}\n\n\tfunction getIsCompleteSnapshot() {\n\t\treturn isDone;\n\t}\n\n\tfunction complete() {\n\t\tisDone = true;\n\t\tfor (const listener of onCompleteListeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue: dataQueryQueue,\n\t\tgetSnapshot,\n\t\tgetIsCompleteSnapshot,\n\t\tdata,\n\t\tisDone: getIsCompleteSnapshot(),\n\t\tinitialized,\n\t\tdataListeners: [] as DataEngineListener[],\n\t\tonCompleteListeners,\n\t\tprogressListeners,\n\t\tdimensions,\n\t\tupdateProgress() {\n\t\t\tconst progress = completedRequests / totalRequests;\n\t\t\tfor (const listener of this.progressListeners) {\n\t\t\t\tlistener(progress);\n\t\t\t}\n\t\t},\n\t\tupdateTotalRequests(value: number) {\n\t\t\ttotalRequests = value;\n\t\t\tthis.updateProgress();\n\t\t},\n\t\tupdateCompleteRequests(value: number) {\n\t\t\tcompletedRequests = value;\n\t\t\tthis.updateProgress();\n\t\t},\n\t\taddDataListener(\n\t\t\tkey: string,\n\t\t\tlistener: DataEngineListener,\n\t\t): RemoveListener {\n\t\t\tkeyListeners.get(key)?.add(listener);\n\t\t\treturn () => {\n\t\t\t\tkeyListeners.get(key)?.delete(listener);\n\t\t\t};\n\t\t},\n\t\taddGeneralListener(listener: DataEngineListener): RemoveListener {\n\t\t\tgeneralListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tgeneralListeners.delete(listener);\n\t\t\t};\n\t\t},\n\t\taddOnCompleteListener(\n\t\t\tlistener: OnCompleteDataEngineListener,\n\t\t): RemoveListener {\n\t\t\tonCompleteListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tonCompleteListeners.delete(listener);\n\t\t\t};\n\t\t},\n\t\taddProgressListener(listener: ProgressListeners): RemoveListener {\n\t\t\tprogressListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tprogressListeners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tremoveListener(key: string, listener: DataEngineListener) {\n\t\t\treturn keyListeners.get(key)?.delete(listener);\n\t\t},\n\t\tupdateData(downloadedData: AnalyticsData[]) {\n\t\t\tfor (const dataItem of downloadedData) {\n\t\t\t\tconst { ou, dx, pe } = dataItem;\n\t\t\t\tdata.set(`${ou}-${dx}-${pe}`, dataItem);\n\t\t\t}\n\t\t\tfor (const listener of generalListeners) {\n\t\t\t\tlistener();\n\t\t\t}\n\t\t},\n\t\tclear() {\n\t\t\tdata.clear();\n\t\t\tmappedData.clear();\n\t\t\tisDone = false;\n\t\t\tinitialized = false;\n\t\t},\n\t\tsetupDataFetch() {\n\t\t\tconst getTheLongestDimension = () => {\n\t\t\t\tconst updatedDimensions = [\n\t\t\t\t\t{\n\t\t\t\t\t\tdimension: \"pe\",\n\t\t\t\t\t\tlength: dimensions.periods.length,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdimension: \"dx\",\n\t\t\t\t\t\tlength: dimensions.dataItems.length,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdimension: \"ou\",\n\t\t\t\t\t\tlength: dimensions.orgUnits.length,\n\t\t\t\t\t},\n\t\t\t\t] as const;\n\n\t\t\t\treturn maxBy(updatedDimensions, \"length\")!.dimension;\n\t\t\t};\n\t\t\tconst getChunkedData = async (maxItem: \"dx\" | \"pe\" | \"ou\") => {\n\t\t\t\tswitch (maxItem) {\n\t\t\t\t\tcase \"dx\":\n\t\t\t\t\t\tconst dataItemChunks = chunk(\n\t\t\t\t\t\t\tdimensions.dataItems,\n\t\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.updateTotalRequests(dataItemChunks.length);\n\t\t\t\t\t\tfor (const dataItemChunk of dataItemChunks) {\n\t\t\t\t\t\t\tdataQueryQueue\n\t\t\t\t\t\t\t\t.push({\n\t\t\t\t\t\t\t\t\tperiods: dimensions.periods,\n\t\t\t\t\t\t\t\t\tdataItems: dataItemChunk,\n\t\t\t\t\t\t\t\t\torgUnits: dimensions.orgUnits,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateCompleteRequests(\n\t\t\t\t\t\t\t\t\t\tcompletedRequests + 1,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"pe\":\n\t\t\t\t\t\tconst periodChunks = chunk(\n\t\t\t\t\t\t\tdimensions.periods,\n\t\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.updateTotalRequests(periodChunks.length);\n\t\t\t\t\t\tfor (const periodChunk of periodChunks) {\n\t\t\t\t\t\t\tdataQueryQueue\n\t\t\t\t\t\t\t\t.push({\n\t\t\t\t\t\t\t\t\tperiods: periodChunk,\n\t\t\t\t\t\t\t\t\tdataItems: dimensions.dataItems,\n\t\t\t\t\t\t\t\t\torgUnits: dimensions.orgUnits,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateCompleteRequests(\n\t\t\t\t\t\t\t\t\t\tcompletedRequests + 1,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"ou\":\n\t\t\t\t\t\tconst orgUnitChunks = chunk(\n\t\t\t\t\t\t\tdimensions.orgUnits,\n\t\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.updateTotalRequests(orgUnitChunks.length);\n\t\t\t\t\t\tfor (const orgUnitChunk of orgUnitChunks) {\n\t\t\t\t\t\t\tdataQueryQueue\n\t\t\t\t\t\t\t\t.push({\n\t\t\t\t\t\t\t\t\tperiods: dimensions.periods,\n\t\t\t\t\t\t\t\t\tdataItems: dimensions.dataItems,\n\t\t\t\t\t\t\t\t\torgUnits: orgUnitChunk,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\t\t\t\tthis.updateCompleteRequests(\n\t\t\t\t\t\t\t\t\t\tcompletedRequests + 1,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t};\n\t\t\tdataQueryQueue.remove(() => true);\n\t\t\tif (\n\t\t\t\tdimensions.periods.length < 5 &&\n\t\t\t\tdimensions.dataItems.length < 5 &&\n\t\t\t\tdimensions.orgUnits.length < 5\n\t\t\t) {\n\t\t\t\tconst { orgUnits, periods, dataItems } = dimensions;\n\t\t\t\tthis.updateTotalRequests(1);\n\t\t\t\tthis.updateCompleteRequests(0);\n\t\t\t\tdataQueryQueue\n\t\t\t\t\t.push({\n\t\t\t\t\t\tperiods,\n\t\t\t\t\t\torgUnits,\n\t\t\t\t\t\tdataItems,\n\t\t\t\t\t})\n\t\t\t\t\t.then((data) => {\n\t\t\t\t\t\tthis.updateData(data as AnalyticsData[]);\n\t\t\t\t\t\tthis.updateCompleteRequests(1);\n\t\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst dimensionWithMaxItems = getTheLongestDimension();\n\t\t\tgetChunkedData(dimensionWithMaxItems);\n\t\t},\n\t\tinitialize(\n\t\t\tfetch: (dimensions: {\n\t\t\t\tperiods: string[];\n\t\t\t\torgUnits: string[];\n\t\t\t\tdataItems: string[];\n\t\t\t}) => Promise<AnalyticsData[]>,\n\t\t\t{\n\t\t\t\tdimensions: appliedDimensions,\n\t\t\t}: {\n\t\t\t\tdimensions: {\n\t\t\t\t\tdataItems: string[];\n\t\t\t\t\torgUnits: string[];\n\t\t\t\t\tperiods: string[];\n\t\t\t\t};\n\t\t\t},\n\t\t) {\n\t\t\tthis.clear();\n\t\t\tdimensions = appliedDimensions;\n\t\t\tdataQueryQueue = queue(asyncify(fetch));\n\t\t\tdataQueryQueue.drain(() => {\n\t\t\t\tcomplete();\n\t\t\t});\n\t\t\tinitialized = true;\n\t\t\tthis.setupDataFetch();\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var components = require('../components');
5
+
6
+ function useScorecardLoadingCompleted() {
7
+ const { data: dataEngine } = components.useScorecardData();
8
+ return react.useSyncExternalStore(dataEngine.addOnCompleteListener, () => {
9
+ return dataEngine.getIsCompleteSnapshot();
10
+ });
11
+ }
12
+
13
+ exports.useScorecardLoadingCompleted = useScorecardLoadingCompleted;
14
+ //# sourceMappingURL=completed.js.map
15
+ //# sourceMappingURL=completed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/completed.ts"],"names":["useScorecardData","useSyncExternalStore"],"mappings":";;;;;AAGO,SAAS,4BAAA,GAA+B;AAC9C,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAIA,2BAAA,EAAiB;AAC9C,EAAA,OAAOC,0BAAA,CAAqB,UAAA,CAAW,qBAAA,EAAuB,MAAM;AACnE,IAAA,OAAO,WAAW,qBAAA,EAAsB;AAAA,EACzC,CAAC,CAAA;AACF","file":"completed.js","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { useScorecardData } from \"../components\";\n\nexport function useScorecardLoadingCompleted() {\n\tconst { data: dataEngine } = useScorecardData();\n\treturn useSyncExternalStore(dataEngine.addOnCompleteListener, () => {\n\t\treturn dataEngine.getIsCompleteSnapshot();\n\t});\n}\n"]}
@@ -7,7 +7,8 @@ var components = require('../components');
7
7
  var data = require('../utils/data');
8
8
  var lodash = require('lodash');
9
9
  var columns = require('../utils/columns');
10
- var viewState = require('../utils/viewState');
10
+ var utils = require('../utils');
11
+ var completed = require('./completed');
11
12
 
12
13
  function getRowValues({
13
14
  data,
@@ -29,14 +30,11 @@ function filterRows({
29
30
  averageDisplayType,
30
31
  meta
31
32
  }) {
32
- if (!dataEngine.isDone) {
33
- return [];
34
- }
35
33
  const hiddenRows = [];
36
34
  const rowsWithDataValues = rows.map((row, index) => {
37
35
  const values = getRowValues({
38
36
  row,
39
- data: dataEngine.data,
37
+ data: Array.from(dataEngine.data.values()),
40
38
  showDataInRows
41
39
  });
42
40
  const average = lodash.meanBy(values, ({ value }) => parseFloat(value));
@@ -53,7 +51,7 @@ function filterRows({
53
51
  }
54
52
  if (averageDisplayType !== "ALL") {
55
53
  const average = columns.getAverageValue({
56
- dataValues: dataEngine.data,
54
+ dataValues: Array.from(dataEngine.data.values()),
57
55
  meta
58
56
  });
59
57
  if (averageDisplayType === "BELOW_AVERAGE") {
@@ -69,62 +67,54 @@ function filterRows({
69
67
  function useTableRows() {
70
68
  const meta = components.useScorecardMeta();
71
69
  const { data: dataEngine } = components.useScorecardData();
72
- const showDataInRows = viewState.useScorecardViewStateValue("showDataInRows") ?? false;
73
- const emptyRows = viewState.useScorecardViewStateValue("emptyRows");
74
- const averageDisplayType = viewState.useScorecardViewStateValue(
70
+ const showDataInRows = utils.useScorecardViewStateValue("showDataInRows") ?? false;
71
+ const emptyRows = utils.useScorecardViewStateValue("emptyRows");
72
+ const averageDisplayType = utils.useScorecardViewStateValue(
75
73
  "averageDisplayType"
76
74
  );
75
+ const completed$1 = completed.useScorecardLoadingCompleted();
77
76
  const config = components.useScorecardConfig();
78
- const [hiddenRowIndexes, setHiddenRowIndexes] = react.useState([]);
79
- if (meta == null) return [];
80
- const rows = react.useMemo(() => {
81
- const rows2 = data.getRowsFromMeta({
77
+ const allRows = react.useMemo(() => {
78
+ return data.getRowsFromMeta({
82
79
  meta,
83
80
  showDataInRows,
84
81
  config
85
82
  });
86
- if (lodash.isEmpty(hiddenRowIndexes)) {
87
- return rows2;
83
+ }, [meta, showDataInRows, config]);
84
+ const hiddenRowIndexes = react.useMemo(() => {
85
+ if (!completed$1) {
86
+ return [];
88
87
  }
89
- return rows2.filter((_, index) => !hiddenRowIndexes.includes(index));
90
- }, [meta, showDataInRows, config, hiddenRowIndexes]);
91
- react.useEffect(() => {
92
- const listener = (completed) => {
93
- if (completed) {
94
- setHiddenRowIndexes(
95
- filterRows({
96
- meta,
97
- dataEngine,
98
- showDataInRows,
99
- rows,
100
- averageDisplayType,
101
- emptyRows
102
- })
103
- );
104
- }
105
- };
106
- if (dataEngine.isDone) {
107
- setHiddenRowIndexes(
108
- filterRows({
109
- meta,
110
- dataEngine,
111
- showDataInRows,
112
- rows,
113
- averageDisplayType,
114
- emptyRows
115
- })
116
- );
117
- } else {
118
- return dataEngine.addOnCompleteListener(listener);
88
+ return filterRows({
89
+ meta,
90
+ dataEngine,
91
+ showDataInRows,
92
+ rows: allRows,
93
+ averageDisplayType,
94
+ emptyRows
95
+ });
96
+ }, [
97
+ completed$1,
98
+ meta,
99
+ dataEngine,
100
+ showDataInRows,
101
+ averageDisplayType,
102
+ emptyRows
103
+ ]);
104
+ if (meta == null) return [];
105
+ return react.useMemo(() => {
106
+ const rows = allRows;
107
+ if (lodash.isEmpty(hiddenRowIndexes)) {
108
+ return rows;
119
109
  }
120
- }, [averageDisplayType, emptyRows, showDataInRows]);
121
- return rows;
110
+ return rows.filter((_, index) => !hiddenRowIndexes.includes(index));
111
+ }, [allRows, hiddenRowIndexes]);
122
112
  }
123
113
  function useColumnVisibility() {
124
- const showAverageColumn = viewState.useScorecardViewStateValue("averageColumn") ?? false;
125
- const showItemNumber = viewState.useScorecardViewStateValue("itemNumber") ?? false;
126
- const showDataInRows = viewState.useScorecardViewStateValue("showDataInRows");
127
- const disableExpanding = viewState.useScorecardViewStateValue("disableExpanding") ?? false;
114
+ const showAverageColumn = utils.useScorecardViewStateValue("averageColumn") ?? false;
115
+ const showItemNumber = utils.useScorecardViewStateValue("itemNumber") ?? false;
116
+ const showDataInRows = utils.useScorecardViewStateValue("showDataInRows");
117
+ const disableExpanding = utils.useScorecardViewStateValue("disableExpanding") ?? false;
128
118
  const [columnVisibility, setColumnVisibility] = react.useState({
129
119
  average: showAverageColumn,
130
120
  count: showItemNumber,
@@ -144,7 +134,7 @@ function useColumnVisibility() {
144
134
  }
145
135
  function useRowExpanding() {
146
136
  const [expanded, setExpanded] = react.useState({});
147
- const disableExpanding = viewState.useScorecardViewStateValue("disableExpanding") ?? false;
137
+ const disableExpanding = utils.useScorecardViewStateValue("disableExpanding") ?? false;
148
138
  const getRowCanExpand = react.useCallback((row) => {
149
139
  const expandCell = row.getVisibleCells().find(({ id }) => id.includes("expand"));
150
140
  if (!expandCell) return false;
@@ -158,7 +148,7 @@ function useRowExpanding() {
158
148
  }
159
149
  function useTableSetup() {
160
150
  const [columnFilters, setColumnFilters] = react.useState([]);
161
- const disablePagination = viewState.useScorecardViewStateValue("disablePagination");
151
+ const disablePagination = utils.useScorecardViewStateValue("disablePagination");
162
152
  const [pagination, setPagination] = react.useState({
163
153
  pageSize: 50,
164
154
  pageIndex: 0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/table.ts"],"names":["meanBy","emptyRows","isEmpty","getAverageValue","useScorecardMeta","useScorecardData","useScorecardViewStateValue","useScorecardConfig","useState","useMemo","rows","getRowsFromMeta","useEffect","useCallback","useTableColumns","getCoreRowModel","getFilteredRowModel","getExpandedRowModel","getPaginationRowModel","getSortedRowModel"],"mappings":";;;;;;;;;;;AAgCO,SAAS,YAAA,CAAa;AAAA,EAC5B,IAAA;AAAA,EACA,cAAA;AAAA,EACA;AACD,CAAA,EAIoB;AACnB,EAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU;AAC7B,IAAA,IAAI,cAAA,EAAgB;AACnB,MAAA,OAAO,GAAA,CACL,UAAA,CAAY,WAAA,CAAY,GAAA,CAAI,CAAC,EAAE,EAAA,EAAG,KAAM,EAAE,CAAA,CAC1C,QAAA,CAAS,KAAA,CAAM,EAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,KAAA,CAAM,EAAA,KAAO,GAAA,CAAI,OAAA,CAAS,GAAA;AAAA,EAClC,CAAC,CAAA;AACF;AAEO,SAAS,UAAA,CAAW;AAAA,EAC1B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACD,CAAA,EAOG;AACF,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACvB,IAAA,OAAO,EAAC;AAAA,EACT;AACA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AACnD,IAAA,MAAM,SAAS,YAAA,CAAa;AAAA,MAC3B,GAAA;AAAA,MACA,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB;AAAA,KACA,CAAA;AACD,IAAA,MAAM,OAAA,GAAUA,cAAO,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAM,KAAM,UAAA,CAAW,KAAM,CAAC,CAAA;AAChE,IAAA,OAAO;AAAA,MACN,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD;AAAA,EACD,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,SAAA,EAAW;AAEf,IAAA,MAAMC,aAAY,kBAAA,CAChB,MAAA,CAAO,CAAC,EAAE,QAAO,KAAMC,cAAA,CAAQ,MAAM,CAAC,EACtC,GAAA,CAAI,CAAC,EAAE,KAAA,OAAY,KAAK,CAAA;AAC1B,IAAA,UAAA,CAAW,IAAA,CAAK,GAAGD,UAAS,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,uBAAuB,KAAA,EAAO;AACjC,IAAA,MAAM,UAAUE,uBAAA,CAAgB;AAAA,MAC/B,YAAY,UAAA,CAAW,IAAA;AAAA,MACvB;AAAA,KACA,CAAA;AACD,IAAA,IAAI,uBAAuB,eAAA,EAAiB;AAC3C,MAAA,MAAM,mBAAmB,kBAAA,CACvB,MAAA,CAAO,CAAC,EAAE,SAAS,UAAA,EAAW,KAAM,UAAA,GAAa,OAAO,EACxD,GAAA,CAAI,CAAC,EAAE,KAAA,OAAY,KAAK,CAAA;AAC1B,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,IACpC,CAAA,MAAO;AACN,MAAA,MAAM,mBAAmB,kBAAA,CACvB,MAAA,CAAO,CAAC,EAAE,SAAS,UAAA,EAAW,KAAM,UAAA,GAAa,OAAO,EACxD,GAAA,CAAI,CAAC,EAAE,KAAA,OAAY,KAAK,CAAA;AAC1B,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,IACpC;AAAA,EACD;AAEA,EAAA,OAAO,UAAA;AACR;AAEO,SAAS,YAAA,GAAqC;AACpD,EAAA,MAAM,OAAOC,2BAAA,EAAiB;AAC9B,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAIC,2BAAA,EAAiB;AAC9C,EAAA,MAAM,cAAA,GACLC,oCAAA,CAAoC,gBAAgB,CAAA,IAAK,KAAA;AAC1D,EAAA,MAAM,SAAA,GAAYA,qCAAoC,WAAW,CAAA;AACjE,EAAA,MAAM,kBAAA,GACLA,oCAAA;AAAA,IACC;AAAA,GACD;AAED,EAAA,MAAM,SAASC,6BAAA,EAAmB;AAElC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIC,cAAA,CAAmB,EAAE,CAAA;AAErE,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,EAAC;AAE1B,EAAA,MAAM,IAAA,GAAOC,cAAQ,MAAM;AAC1B,IAAA,MAAMC,QAAOC,oBAAA,CAAgB;AAAA,MAC5B,IAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACA,CAAA;AAED,IAAA,IAAIT,cAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC9B,MAAA,OAAOQ,KAAAA;AAAA,IACR;AAEA,IAAA,OAAOA,KAAAA,CAAK,OAAO,CAAC,CAAA,EAAG,UAAU,CAAC,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACnE,GAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAEnD,EAAAE,eAAA,CAAU,MAAM;AACf,IAAA,MAAM,QAAA,GAAW,CAAC,SAAA,KAAuB;AACxC,MAAA,IAAI,SAAA,EAAW;AACd,QAAA,mBAAA;AAAA,UACC,UAAA,CAAW;AAAA,YACV,IAAA;AAAA,YACA,UAAA;AAAA,YACA,cAAA;AAAA,YACA,IAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACA;AAAA,SACF;AAAA,MACD;AAAA,IACD,CAAA;AACA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACtB,MAAA,mBAAA;AAAA,QACC,UAAA,CAAW;AAAA,UACV,IAAA;AAAA,UACA,UAAA;AAAA,UACA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACA;AAAA,OACF;AAAA,IACD,CAAA,MAAO;AACN,MAAA,OAAO,UAAA,CAAW,sBAAsB,QAAQ,CAAA;AAAA,IACjD;AAAA,EACD,CAAA,EAAG,CAAC,kBAAA,EAAoB,SAAA,EAAW,cAAc,CAAC,CAAA;AAElD,EAAA,OAAO,IAAA;AACR;AAEO,SAAS,mBAAA,GAAsB;AACrC,EAAA,MAAM,iBAAA,GACLN,oCAAA,CAAoC,eAAe,CAAA,IAAK,KAAA;AACzD,EAAA,MAAM,cAAA,GACLA,oCAAA,CAAoC,YAAY,CAAA,IAAK,KAAA;AACtD,EAAA,MAAM,cAAA,GACLA,qCAAoC,gBAAgB,CAAA;AAErD,EAAA,MAAM,gBAAA,GACLA,oCAAA,CAAoC,kBAAkB,CAAA,IAAK,KAAA;AAE5D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIE,cAAA,CAA0B;AAAA,IACzE,OAAA,EAAS,iBAAA;AAAA,IACT,KAAA,EAAO,cAAA;AAAA,IACP,QAAQ,CAAC;AAAA,GACT,CAAA;AAED,EAAAI,eAAA,CAAU,MAAM;AACf,IAAA,mBAAA,CAAoB;AAAA,MACnB,OAAA,EAAS,iBAAA;AAAA,MACT,KAAA,EAAO,cAAA;AAAA,MACP,MAAA,EAAQ,CAAC,gBAAA,IAAoB,CAAC;AAAA,KAC9B,CAAA;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,cAAA,EAAgB,gBAAA,EAAkB,cAAc,CAAC,CAAA;AAExE,EAAA,OAAO;AAAA,IACN,gBAAA;AAAA,IACA;AAAA,GACD;AACD;AAEO,SAAS,eAAA,GAAkB;AACjC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIJ,cAAA,CAAwB,EAAE,CAAA;AAC1D,EAAA,MAAM,gBAAA,GACLF,oCAAA,CAAoC,kBAAkB,CAAA,IAAK,KAAA;AAE5D,EAAA,MAAM,eAAA,GAAkBO,iBAAA,CAAY,CAAC,GAAA,KAAiC;AACrE,IAAA,MAAM,UAAA,GAAa,GAAA,CACjB,eAAA,EAAgB,CAChB,IAAA,CAAK,CAAC,EAAE,EAAA,EAAG,KAAM,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAC,CAAA;AAExC,IAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,IAAA,OAAO,WAAW,QAAA,EAAS;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACN,QAAA;AAAA,IACA,gBAAA,EAAkB,mBAAmB,MAAA,GAAY,WAAA;AAAA,IACjD;AAAA,GACD;AACD;AAEO,SAAS,aAAA,GAAkD;AACjE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIL,cAAA,CAA6B,EAAE,CAAA;AACzE,EAAA,MAAM,iBAAA,GACLF,qCAAoC,mBAAmB,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIE,cAAA,CAA0B;AAAA,IAC7D,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACX,CAAA;AAED,EAAA,MAAM,EAAE,gBAAA,EAAkB,mBAAA,EAAoB,GAAI,mBAAA,EAAoB;AACtE,EAAA,MAAM,EAAE,QAAA,EAAU,gBAAA,EAAkB,eAAA,KAAoB,eAAA,EAAgB;AAExE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAA,CAAuB,EAAE,CAAA;AACvD,EAAA,MAAM,UAAUM,yBAAA,EAAgB;AAChC,EAAA,MAAM,OAAO,YAAA,EAAa;AAE1B,EAAA,OAAOL,aAAA;AAAA,IACN,OAAO;AAAA,MACN,OAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACN,aAAA;AAAA,QACA,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,iBAAA,GAAoB,EAAC,GAAI,EAAE,UAAA;AAAW,OAC3C;AAAA,MACA,IAAA,EAAM;AAAA,QACL;AAAA,OACD;AAAA,MACA,kBAAA,EAAoB,IAAA;AAAA,MACpB,gBAAA;AAAA,MACA,UAAU,IAAA,CAAK,MAAA;AAAA,MACf,eAAA;AAAA,MACA,qBAAA,EAAuB,gBAAA;AAAA,MACvB,eAAA,EAAiB,UAAA;AAAA,MACjB,iBAAiBM,0BAAA,EAAgB;AAAA,MACjC,qBAAqBC,8BAAA,EAAoB;AAAA,MACzC,qBAAqBC,8BAAA,EAAoB;AAAA,MACzC,qBAAA,EAAuB,iBAAA,GACpB,MAAA,GACAC,gCAAA,EAAsB;AAAA,MACzB,mBAAmBC,4BAAA,EAAkB;AAAA,MACrC,wBAAA,EAA0B,mBAAA;AAAA,MAC1B,kBAAA,EAAoB,oBAAoB,MAAA,GAAY;AAAA,KACrD,CAAA;AAAA,IACA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,aAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA;AACD,GACD;AACD","file":"table.js","sourcesContent":["import {\n\ttype ColumnFiltersState,\n\ttype ExpandedState,\n\tgetCoreRowModel,\n\tgetExpandedRowModel,\n\tgetFilteredRowModel,\n\tgetPaginationRowModel,\n\tgetSortedRowModel,\n\ttype PaginationState,\n\ttype Row,\n\ttype SortingState,\n\ttype TableOptions,\n\ttype VisibilityState,\n} from \"@tanstack/react-table\";\nimport { useTableColumns } from \"./columns\";\nimport type {\n\tScorecardTableData,\n\tScorecardViewOptions,\n} from \"../schemas/config\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n\ttype ScorecardMeta,\n\tuseScorecardConfig,\n\tuseScorecardData,\n\tuseScorecardMeta,\n} from \"../components\";\nimport { type AnalyticsData, getRowsFromMeta } from \"../utils/data\";\nimport { isEmpty, meanBy } from \"lodash\";\nimport type { ScorecardDataEngine } from \"../utils/dataEngine\";\nimport { getAverageValue } from \"../utils/columns\";\nimport { useScorecardViewStateValue } from \"../utils/viewState\";\n\nexport function getRowValues({\n\tdata,\n\tshowDataInRows,\n\trow,\n}: {\n\trow: ScorecardTableData;\n\tdata: AnalyticsData[];\n\tshowDataInRows: boolean;\n}): AnalyticsData[] {\n\treturn data.filter((datum) => {\n\t\tif (showDataInRows) {\n\t\t\treturn row\n\t\t\t\t.dataHolder!.dataSources.map(({ id }) => id)\n\t\t\t\t.includes(datum.dx!);\n\t\t}\n\t\treturn datum.ou === row.orgUnit!.uid;\n\t});\n}\n\nexport function filterRows({\n\trows,\n\temptyRows,\n\tdataEngine,\n\tshowDataInRows,\n\taverageDisplayType,\n\tmeta,\n}: {\n\temptyRows: ScorecardViewOptions[\"emptyRows\"];\n\tshowDataInRows: boolean;\n\taverageDisplayType: ScorecardViewOptions[\"averageDisplayType\"];\n\tdataEngine: ScorecardDataEngine;\n\trows: ScorecardTableData[];\n\tmeta: ScorecardMeta;\n}) {\n\tif (!dataEngine.isDone) {\n\t\treturn [];\n\t}\n\tconst hiddenRows: number[] = [];\n\tconst rowsWithDataValues = rows.map((row, index) => {\n\t\tconst values = getRowValues({\n\t\t\trow,\n\t\t\tdata: dataEngine.data,\n\t\t\tshowDataInRows,\n\t\t});\n\t\tconst average = meanBy(values, ({ value }) => parseFloat(value!));\n\t\treturn {\n\t\t\trow,\n\t\t\tindex,\n\t\t\tvalues,\n\t\t\taverage,\n\t\t};\n\t});\n\tif (!emptyRows) {\n\t\t//Filter out all e\n\t\tconst emptyRows = rowsWithDataValues\n\t\t\t.filter(({ values }) => isEmpty(values))\n\t\t\t.map(({ index }) => index);\n\t\thiddenRows.push(...emptyRows);\n\t}\n\n\tif (averageDisplayType !== \"ALL\") {\n\t\tconst average = getAverageValue({\n\t\t\tdataValues: dataEngine.data,\n\t\t\tmeta,\n\t\t});\n\t\tif (averageDisplayType === \"BELOW_AVERAGE\") {\n\t\t\tconst aboveAverageRows = rowsWithDataValues\n\t\t\t\t.filter(({ average: rowAverage }) => rowAverage > average)\n\t\t\t\t.map(({ index }) => index);\n\t\t\thiddenRows.push(...aboveAverageRows);\n\t\t} else {\n\t\t\tconst belowAverageRows = rowsWithDataValues\n\t\t\t\t.filter(({ average: rowAverage }) => rowAverage < average)\n\t\t\t\t.map(({ index }) => index);\n\t\t\thiddenRows.push(...belowAverageRows);\n\t\t}\n\t}\n\n\treturn hiddenRows;\n}\n\nexport function useTableRows(): ScorecardTableData[] {\n\tconst meta = useScorecardMeta();\n\tconst { data: dataEngine } = useScorecardData();\n\tconst showDataInRows =\n\t\tuseScorecardViewStateValue<boolean>(\"showDataInRows\") ?? false;\n\tconst emptyRows = useScorecardViewStateValue<boolean>(\"emptyRows\");\n\tconst averageDisplayType =\n\t\tuseScorecardViewStateValue<ScorecardViewOptions[\"averageDisplayType\"]>(\n\t\t\t\"averageDisplayType\",\n\t\t);\n\n\tconst config = useScorecardConfig();\n\n\tconst [hiddenRowIndexes, setHiddenRowIndexes] = useState<number[]>([]);\n\n\tif (meta == null) return [];\n\n\tconst rows = useMemo(() => {\n\t\tconst rows = getRowsFromMeta({\n\t\t\tmeta,\n\t\t\tshowDataInRows,\n\t\t\tconfig,\n\t\t});\n\n\t\tif (isEmpty(hiddenRowIndexes)) {\n\t\t\treturn rows;\n\t\t}\n\n\t\treturn rows.filter((_, index) => !hiddenRowIndexes.includes(index));\n\t}, [meta, showDataInRows, config, hiddenRowIndexes]);\n\n\tuseEffect(() => {\n\t\tconst listener = (completed: boolean) => {\n\t\t\tif (completed) {\n\t\t\t\tsetHiddenRowIndexes(\n\t\t\t\t\tfilterRows({\n\t\t\t\t\t\tmeta,\n\t\t\t\t\t\tdataEngine,\n\t\t\t\t\t\tshowDataInRows,\n\t\t\t\t\t\trows,\n\t\t\t\t\t\taverageDisplayType,\n\t\t\t\t\t\temptyRows,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\tif (dataEngine.isDone) {\n\t\t\tsetHiddenRowIndexes(\n\t\t\t\tfilterRows({\n\t\t\t\t\tmeta,\n\t\t\t\t\tdataEngine,\n\t\t\t\t\tshowDataInRows,\n\t\t\t\t\trows,\n\t\t\t\t\taverageDisplayType,\n\t\t\t\t\temptyRows,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\treturn dataEngine.addOnCompleteListener(listener);\n\t\t}\n\t}, [averageDisplayType, emptyRows, showDataInRows]);\n\n\treturn rows;\n}\n\nexport function useColumnVisibility() {\n\tconst showAverageColumn =\n\t\tuseScorecardViewStateValue<boolean>(\"averageColumn\") ?? false;\n\tconst showItemNumber =\n\t\tuseScorecardViewStateValue<boolean>(\"itemNumber\") ?? false;\n\tconst showDataInRows =\n\t\tuseScorecardViewStateValue<boolean>(\"showDataInRows\");\n\n\tconst disableExpanding =\n\t\tuseScorecardViewStateValue<boolean>(\"disableExpanding\") ?? false;\n\n\tconst [columnVisibility, setColumnVisibility] = useState<VisibilityState>({\n\t\taverage: showAverageColumn,\n\t\tcount: showItemNumber,\n\t\texpand: !disableExpanding,\n\t});\n\n\tuseEffect(() => {\n\t\tsetColumnVisibility({\n\t\t\taverage: showAverageColumn,\n\t\t\tcount: showItemNumber,\n\t\t\texpand: !disableExpanding && !showDataInRows,\n\t\t});\n\t}, [showAverageColumn, showItemNumber, disableExpanding, showDataInRows]);\n\n\treturn {\n\t\tcolumnVisibility,\n\t\tsetColumnVisibility,\n\t};\n}\n\nexport function useRowExpanding() {\n\tconst [expanded, setExpanded] = useState<ExpandedState>({});\n\tconst disableExpanding =\n\t\tuseScorecardViewStateValue<boolean>(\"disableExpanding\") ?? false;\n\n\tconst getRowCanExpand = useCallback((row: Row<ScorecardTableData>) => {\n\t\tconst expandCell = row\n\t\t\t.getVisibleCells()\n\t\t\t.find(({ id }) => id.includes(\"expand\"));\n\n\t\tif (!expandCell) return false;\n\t\treturn expandCell.getValue() as boolean;\n\t}, []);\n\n\treturn {\n\t\texpanded,\n\t\tonExpandedChange: disableExpanding ? undefined : setExpanded,\n\t\tgetRowCanExpand,\n\t};\n}\n\nexport function useTableSetup(): TableOptions<ScorecardTableData> {\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\tconst disablePagination =\n\t\tuseScorecardViewStateValue<boolean>(\"disablePagination\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageSize: 50,\n\t\tpageIndex: 0,\n\t});\n\n\tconst { columnVisibility, setColumnVisibility } = useColumnVisibility();\n\tconst { expanded, onExpandedChange, getRowCanExpand } = useRowExpanding();\n\n\tconst [sorting, setSorting] = useState<SortingState>([]);\n\tconst columns = useTableColumns();\n\tconst data = useTableRows();\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tcolumns,\n\t\t\tdata,\n\t\t\tstate: {\n\t\t\t\tcolumnFilters,\n\t\t\t\tsorting,\n\t\t\t\tcolumnVisibility,\n\t\t\t\texpanded,\n\t\t\t\t...(disablePagination ? {} : { pagination }),\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tdisablePagination,\n\t\t\t},\n\t\t\tautoResetPageIndex: true,\n\t\t\tonExpandedChange: onExpandedChange,\n\t\t\trowCount: data.length,\n\t\t\tgetRowCanExpand,\n\t\t\tonColumnFiltersChange: setColumnFilters,\n\t\t\tonSortingChange: setSorting,\n\t\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t\tgetFilteredRowModel: getFilteredRowModel(),\n\t\t\tgetExpandedRowModel: getExpandedRowModel(),\n\t\t\tgetPaginationRowModel: disablePagination\n\t\t\t\t? undefined\n\t\t\t\t: getPaginationRowModel(),\n\t\t\tgetSortedRowModel: getSortedRowModel(),\n\t\t\tonColumnVisibilityChange: setColumnVisibility,\n\t\t\tonPaginationChange: disablePagination ? undefined : setPagination,\n\t\t}),\n\t\t[\n\t\t\tcolumns,\n\t\t\tdata,\n\t\t\tcolumnFilters,\n\t\t\tsorting,\n\t\t\tcolumnVisibility,\n\t\t\tpagination,\n\t\t\tgetRowCanExpand,\n\t\t\texpanded,\n\t\t],\n\t);\n}\n"]}
1
+ {"version":3,"sources":["../../src/hooks/table.ts"],"names":["meanBy","emptyRows","isEmpty","getAverageValue","useScorecardMeta","useScorecardData","useScorecardViewStateValue","completed","useScorecardLoadingCompleted","useScorecardConfig","useMemo","getRowsFromMeta","useState","useEffect","useCallback","useTableColumns","getCoreRowModel","getFilteredRowModel","getExpandedRowModel","getPaginationRowModel","getSortedRowModel"],"mappings":"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","file":"table.js","sourcesContent":["import {\n\ttype ColumnFiltersState,\n\ttype ExpandedState,\n\tgetCoreRowModel,\n\tgetExpandedRowModel,\n\tgetFilteredRowModel,\n\tgetPaginationRowModel,\n\tgetSortedRowModel,\n\ttype PaginationState,\n\ttype Row,\n\ttype SortingState,\n\ttype TableOptions,\n\ttype VisibilityState,\n} from \"@tanstack/react-table\";\nimport { useTableColumns } from \"./columns\";\nimport type {\n\tScorecardTableData,\n\tScorecardViewOptions,\n} from \"../schemas/config\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n\ttype ScorecardMeta,\n\tuseScorecardConfig,\n\tuseScorecardData,\n\tuseScorecardMeta,\n} from \"../components\";\nimport { type AnalyticsData, getRowsFromMeta } from \"../utils/data\";\nimport { isEmpty, meanBy } from \"lodash\";\nimport type { ScorecardDataEngine } from \"../utils/dataEngine\";\nimport { getAverageValue } from \"../utils/columns\";\nimport { useScorecardViewStateValue } from \"../utils\";\nimport { useScorecardLoadingCompleted } from \"./completed\";\n\nexport function getRowValues({\n\tdata,\n\tshowDataInRows,\n\trow,\n}: {\n\trow: ScorecardTableData;\n\tdata: AnalyticsData[];\n\tshowDataInRows: boolean;\n}): AnalyticsData[] {\n\treturn data.filter((datum) => {\n\t\tif (showDataInRows) {\n\t\t\treturn row\n\t\t\t\t.dataHolder!.dataSources.map(({ id }) => id)\n\t\t\t\t.includes(datum.dx!);\n\t\t}\n\t\treturn datum.ou === row.orgUnit!.uid;\n\t});\n}\n\nexport function filterRows({\n\trows,\n\temptyRows,\n\tdataEngine,\n\tshowDataInRows,\n\taverageDisplayType,\n\tmeta,\n}: {\n\temptyRows: ScorecardViewOptions[\"emptyRows\"];\n\tshowDataInRows: boolean;\n\taverageDisplayType: ScorecardViewOptions[\"averageDisplayType\"];\n\tdataEngine: ScorecardDataEngine;\n\trows: ScorecardTableData[];\n\tmeta: ScorecardMeta;\n}) {\n\tconst hiddenRows: number[] = [];\n\tconst rowsWithDataValues = rows.map((row, index) => {\n\t\tconst values = getRowValues({\n\t\t\trow,\n\t\t\tdata: Array.from(dataEngine.data.values()),\n\t\t\tshowDataInRows,\n\t\t});\n\t\tconst average = meanBy(values, ({ value }) => parseFloat(value!));\n\t\treturn {\n\t\t\trow,\n\t\t\tindex,\n\t\t\tvalues,\n\t\t\taverage,\n\t\t};\n\t});\n\tif (!emptyRows) {\n\t\t//Filter out all e\n\t\tconst emptyRows = rowsWithDataValues\n\t\t\t.filter(({ values }) => isEmpty(values))\n\t\t\t.map(({ index }) => index);\n\t\thiddenRows.push(...emptyRows);\n\t}\n\n\tif (averageDisplayType !== \"ALL\") {\n\t\tconst average = getAverageValue({\n\t\t\tdataValues: Array.from(dataEngine.data.values()),\n\t\t\tmeta,\n\t\t});\n\t\tif (averageDisplayType === \"BELOW_AVERAGE\") {\n\t\t\tconst aboveAverageRows = rowsWithDataValues\n\t\t\t\t.filter(({ average: rowAverage }) => rowAverage > average)\n\t\t\t\t.map(({ index }) => index);\n\t\t\thiddenRows.push(...aboveAverageRows);\n\t\t} else {\n\t\t\tconst belowAverageRows = rowsWithDataValues\n\t\t\t\t.filter(({ average: rowAverage }) => rowAverage < average)\n\t\t\t\t.map(({ index }) => index);\n\t\t\thiddenRows.push(...belowAverageRows);\n\t\t}\n\t}\n\n\treturn hiddenRows;\n}\n\nexport function useTableRows(): ScorecardTableData[] {\n\tconst meta = useScorecardMeta();\n\tconst { data: dataEngine } = useScorecardData();\n\tconst showDataInRows =\n\t\tuseScorecardViewStateValue<boolean>(\"showDataInRows\") ?? false;\n\tconst emptyRows = useScorecardViewStateValue<boolean>(\"emptyRows\");\n\tconst averageDisplayType =\n\t\tuseScorecardViewStateValue<ScorecardViewOptions[\"averageDisplayType\"]>(\n\t\t\t\"averageDisplayType\",\n\t\t);\n\tconst completed = useScorecardLoadingCompleted();\n\n\tconst config = useScorecardConfig();\n\n\tconst allRows = useMemo(() => {\n\t\treturn getRowsFromMeta({\n\t\t\tmeta: meta!,\n\t\t\tshowDataInRows,\n\t\t\tconfig,\n\t\t});\n\t}, [meta, showDataInRows, config]);\n\n\tconst hiddenRowIndexes: number[] = useMemo(() => {\n\t\tif (!completed) {\n\t\t\treturn [];\n\t\t}\n\t\treturn filterRows({\n\t\t\tmeta: meta!,\n\t\t\tdataEngine,\n\t\t\tshowDataInRows,\n\t\t\trows: allRows,\n\t\t\taverageDisplayType,\n\t\t\temptyRows,\n\t\t});\n\t}, [\n\t\tcompleted,\n\t\tmeta,\n\t\tdataEngine,\n\t\tshowDataInRows,\n\t\taverageDisplayType,\n\t\temptyRows,\n\t]);\n\n\tif (meta == null) return [];\n\n\treturn useMemo(() => {\n\t\tconst rows = allRows;\n\n\t\tif (isEmpty(hiddenRowIndexes)) {\n\t\t\treturn rows;\n\t\t}\n\n\t\treturn rows.filter((_, index) => !hiddenRowIndexes.includes(index));\n\t}, [allRows, hiddenRowIndexes]);\n}\n\nexport function useColumnVisibility() {\n\tconst showAverageColumn =\n\t\tuseScorecardViewStateValue<boolean>(\"averageColumn\") ?? false;\n\tconst showItemNumber =\n\t\tuseScorecardViewStateValue<boolean>(\"itemNumber\") ?? false;\n\tconst showDataInRows =\n\t\tuseScorecardViewStateValue<boolean>(\"showDataInRows\");\n\n\tconst disableExpanding =\n\t\tuseScorecardViewStateValue<boolean>(\"disableExpanding\") ?? false;\n\n\tconst [columnVisibility, setColumnVisibility] = useState<VisibilityState>({\n\t\taverage: showAverageColumn,\n\t\tcount: showItemNumber,\n\t\texpand: !disableExpanding,\n\t});\n\n\tuseEffect(() => {\n\t\tsetColumnVisibility({\n\t\t\taverage: showAverageColumn,\n\t\t\tcount: showItemNumber,\n\t\t\texpand: !disableExpanding && !showDataInRows,\n\t\t});\n\t}, [showAverageColumn, showItemNumber, disableExpanding, showDataInRows]);\n\n\treturn {\n\t\tcolumnVisibility,\n\t\tsetColumnVisibility,\n\t};\n}\n\nexport function useRowExpanding() {\n\tconst [expanded, setExpanded] = useState<ExpandedState>({});\n\tconst disableExpanding =\n\t\tuseScorecardViewStateValue<boolean>(\"disableExpanding\") ?? false;\n\n\tconst getRowCanExpand = useCallback((row: Row<ScorecardTableData>) => {\n\t\tconst expandCell = row\n\t\t\t.getVisibleCells()\n\t\t\t.find(({ id }) => id.includes(\"expand\"));\n\n\t\tif (!expandCell) return false;\n\t\treturn expandCell.getValue() as boolean;\n\t}, []);\n\n\treturn {\n\t\texpanded,\n\t\tonExpandedChange: disableExpanding ? undefined : setExpanded,\n\t\tgetRowCanExpand,\n\t};\n}\n\nexport function useTableSetup(): TableOptions<ScorecardTableData> {\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\tconst disablePagination =\n\t\tuseScorecardViewStateValue<boolean>(\"disablePagination\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageSize: 50,\n\t\tpageIndex: 0,\n\t});\n\n\tconst { columnVisibility, setColumnVisibility } = useColumnVisibility();\n\tconst { expanded, onExpandedChange, getRowCanExpand } = useRowExpanding();\n\n\tconst [sorting, setSorting] = useState<SortingState>([]);\n\tconst columns = useTableColumns();\n\tconst data = useTableRows();\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tcolumns,\n\t\t\tdata,\n\t\t\tstate: {\n\t\t\t\tcolumnFilters,\n\t\t\t\tsorting,\n\t\t\t\tcolumnVisibility,\n\t\t\t\texpanded,\n\t\t\t\t...(disablePagination ? {} : { pagination }),\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tdisablePagination,\n\t\t\t},\n\t\t\tautoResetPageIndex: true,\n\t\t\tonExpandedChange: onExpandedChange,\n\t\t\trowCount: data.length,\n\t\t\tgetRowCanExpand,\n\t\t\tonColumnFiltersChange: setColumnFilters,\n\t\t\tonSortingChange: setSorting,\n\t\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t\tgetFilteredRowModel: getFilteredRowModel(),\n\t\t\tgetExpandedRowModel: getExpandedRowModel(),\n\t\t\tgetPaginationRowModel: disablePagination\n\t\t\t\t? undefined\n\t\t\t\t: getPaginationRowModel(),\n\t\t\tgetSortedRowModel: getSortedRowModel(),\n\t\t\tonColumnVisibilityChange: setColumnVisibility,\n\t\t\tonPaginationChange: disablePagination ? undefined : setPagination,\n\t\t}),\n\t\t[\n\t\t\tcolumns,\n\t\t\tdata,\n\t\t\tcolumnFilters,\n\t\t\tsorting,\n\t\t\tcolumnVisibility,\n\t\t\tpagination,\n\t\t\tgetRowCanExpand,\n\t\t\texpanded,\n\t\t],\n\t);\n}\n"]}