Skip to content

Commit 6656527

Browse files
authored
Merge pull request #770 from VEuPathDB/issue-676
More sophisticated showMissing behaviour and reused more entity counts
2 parents 708f71b + be5c55c commit 6656527

13 files changed

+268
-138
lines changed

src/lib/core/components/VariableCoverageTable.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { CompleteCasesTable } from '../api/DataClient';
2+
import { EntityCounts } from '../hooks/entityCounts';
3+
import { PromiseHookState } from '../hooks/promise';
24
import { useVariableCoverageTableRows } from '../hooks/variableCoverage';
3-
import { Filter } from '../types/filter';
45
import { VariableDescriptor } from '../types/variable';
56

67
export interface Props {
78
containerClassName?: string;
89
completeCases?: CompleteCasesTable;
9-
filters?: Filter[];
10+
filteredCounts: PromiseHookState<EntityCounts>;
1011
variableSpecs: VariableSpec[];
1112
outputEntityId?: string;
1213
}
@@ -42,13 +43,13 @@ export interface VariableCoverageTableRow {
4243
export function VariableCoverageTable({
4344
containerClassName,
4445
completeCases,
45-
filters,
46+
filteredCounts,
4647
outputEntityId,
4748
variableSpecs,
4849
}: Props) {
4950
const rows = useVariableCoverageTableRows(
5051
variableSpecs,
51-
filters,
52+
filteredCounts,
5253
completeCases,
5354
outputEntityId
5455
);

src/lib/core/components/computations/PassThroughComputation.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ import { scatterplotVisualization } from '../visualizations/implementations/Scat
1818
import { barplotVisualization } from '../visualizations/implementations/BarplotVisualization';
1919
import { boxplotVisualization } from '../visualizations/implementations/BoxplotVisualization';
2020
import { EntityCounts } from '../../hooks/entityCounts';
21+
import { PromiseHookState } from '../../hooks/promise';
2122

2223
interface Props {
2324
analysisState: AnalysisState;
2425
computationAppOverview: ComputationAppOverview;
25-
totalCounts: EntityCounts | undefined;
26-
filteredCounts: EntityCounts | undefined;
26+
totalCounts: PromiseHookState<EntityCounts>;
27+
filteredCounts: PromiseHookState<EntityCounts>;
2728
}
2829

2930
/**

src/lib/core/components/visualizations/VisualizationTypes.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { EntityCounts } from '../../hooks/entityCounts';
2+
import { PromiseHookState } from '../../hooks/promise';
23
import { Filter } from '../../types/filter';
34
import { VariableDescriptor } from '../../types/variable';
45
import {
@@ -21,8 +22,8 @@ export interface VisualizationProps {
2122
filters?: Filter[];
2223
starredVariables: VariableDescriptor[];
2324
toggleStarredVariable: (targetVariableId: VariableDescriptor) => void;
24-
totalCounts: EntityCounts | undefined;
25-
filteredCounts: EntityCounts | undefined;
25+
totalCounts: PromiseHookState<EntityCounts>;
26+
filteredCounts: PromiseHookState<EntityCounts>;
2627
}
2728

2829
export type SelectorProps = VisualizationOverview;

src/lib/core/components/visualizations/VisualizationsContainer.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import PlaceholderIcon from './PlaceholderIcon';
2727
import { Tooltip } from '@material-ui/core';
2828
import { isEqual } from 'lodash';
2929
import { EntityCounts } from '../../hooks/entityCounts';
30+
import { PromiseHookState } from '../../hooks/promise';
3031

3132
const cx = makeClassNameHelper('VisualizationsContainer');
3233

@@ -42,8 +43,8 @@ interface Props {
4243
filters: Filter[];
4344
starredVariables: VariableDescriptor[];
4445
toggleStarredVariable: (targetVariable: VariableDescriptor) => void;
45-
totalCounts: EntityCounts | undefined;
46-
filteredCounts: EntityCounts | undefined;
46+
totalCounts: PromiseHookState<EntityCounts>;
47+
filteredCounts: PromiseHookState<EntityCounts>;
4748
}
4849

4950
/**

src/lib/core/components/visualizations/implementations/BarplotVisualization.tsx

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ import {
4747
fixLabelForNumberVariables,
4848
fixLabelsForNumberVariables,
4949
grayOutLastSeries,
50-
omitEmptyNoDataSeries,
5150
vocabularyWithMissingData,
5251
variablesAreUnique,
5352
nonUniqueWarning,
53+
hasIncompleteCases,
5454
} from '../../../utils/visualization';
5555
import { VariablesByInputName } from '../../../utils/data-element-constraints';
5656
// use lodash instead of Math.min/max
@@ -208,15 +208,24 @@ function BarplotViz(props: VisualizationProps) {
208208
);
209209

210210
const findEntityAndVariable = useFindEntityAndVariable(entities);
211-
const { variable, entity, overlayVariable, facetVariable } = useMemo(() => {
211+
const {
212+
variable,
213+
entity,
214+
overlayVariable,
215+
overlayEntity,
216+
facetVariable,
217+
facetEntity,
218+
} = useMemo(() => {
212219
const xAxisVariable = findEntityAndVariable(vizConfig.xAxisVariable);
213220
const overlayVariable = findEntityAndVariable(vizConfig.overlayVariable);
214221
const facetVariable = findEntityAndVariable(vizConfig.facetVariable);
215222
return {
216223
variable: xAxisVariable?.variable,
217224
entity: xAxisVariable?.entity,
218225
overlayVariable: overlayVariable?.variable,
226+
overlayEntity: overlayVariable?.entity,
219227
facetVariable: facetVariable?.variable,
228+
facetEntity: facetVariable?.entity,
220229
};
221230
}, [
222231
findEntityAndVariable,
@@ -227,23 +236,45 @@ function BarplotViz(props: VisualizationProps) {
227236

228237
const data = usePromise(
229238
useCallback(async (): Promise<BarplotDataWithStatistics | undefined> => {
230-
if (variable == null) return undefined;
239+
if (
240+
variable == null ||
241+
entity == null ||
242+
filteredCounts.pending ||
243+
filteredCounts.value == null
244+
)
245+
return undefined;
231246

232247
if (!variablesAreUnique([variable, overlayVariable, facetVariable]))
233248
throw new Error(nonUniqueWarning);
234249

235250
const params = getRequestParams(studyId, filters ?? [], vizConfig);
236251

237-
const response = dataClient.getBarplot(
252+
const response = await dataClient.getBarplot(
238253
computation.descriptor.type,
239254
params as BarplotRequestParams
240255
);
241256

242-
const showMissing =
243-
vizConfig.showMissingness &&
244-
(overlayVariable != null || facetVariable != null);
257+
// figure out if we need to show the missing data for the stratification variables
258+
// if it has no incomplete cases we don't have to
245259
const showMissingOverlay =
246-
vizConfig.showMissingness && overlayVariable != null;
260+
vizConfig.showMissingness &&
261+
hasIncompleteCases(
262+
overlayEntity,
263+
overlayVariable,
264+
entity,
265+
filteredCounts.value,
266+
response.completeCasesTable
267+
);
268+
const showMissingFacet =
269+
vizConfig.showMissingness &&
270+
hasIncompleteCases(
271+
facetEntity,
272+
facetVariable,
273+
entity,
274+
filteredCounts.value,
275+
response.completeCasesTable
276+
);
277+
247278
const vocabulary = fixLabelsForNumberVariables(
248279
variable?.vocabulary,
249280
variable
@@ -257,34 +288,33 @@ function BarplotViz(props: VisualizationProps) {
257288
facetVariable
258289
);
259290

260-
return omitEmptyNoDataSeries(
261-
grayOutLastSeries(
262-
reorderData(
263-
barplotResponseToData(
264-
await response,
265-
variable,
266-
overlayVariable,
267-
facetVariable
268-
),
269-
vocabulary,
270-
vocabularyWithMissingData(overlayVocabulary, showMissing),
271-
vocabularyWithMissingData(facetVocabulary, showMissing)
291+
return grayOutLastSeries(
292+
reorderData(
293+
barplotResponseToData(
294+
response,
295+
variable,
296+
overlayVariable,
297+
facetVariable
272298
),
273-
showMissingOverlay
299+
vocabulary,
300+
vocabularyWithMissingData(overlayVocabulary, showMissingOverlay),
301+
vocabularyWithMissingData(facetVocabulary, showMissingFacet)
274302
),
275-
showMissing
303+
showMissingOverlay
276304
);
277305
}, [
278306
// using vizConfig only causes issue with onCheckedLegendItemsChange
279307
studyId,
280308
filters,
309+
filteredCounts,
281310
dataClient,
282311
vizConfig.xAxisVariable,
283312
vizConfig.overlayVariable,
284313
vizConfig.facetVariable,
285314
vizConfig.valueSpec,
286315
vizConfig.showMissingness,
287316
variable,
317+
entity,
288318
overlayVariable,
289319
computation.descriptor.type,
290320
])
@@ -401,7 +431,7 @@ function BarplotViz(props: VisualizationProps) {
401431
vizConfig.valueSpec === 'count' ? 'Count' : 'Proportion',
402432
legendTitle: overlayVariable?.displayName,
403433
interactive: true,
404-
showSpinner: data.pending,
434+
showSpinner: data.pending || filteredCounts.pending,
405435
dependentAxisLogScale: vizConfig.dependentAxisLogScale,
406436
// set dependent axis range for log scale
407437
dependentAxisRange: dependentAxisRange,
@@ -473,12 +503,12 @@ function BarplotViz(props: VisualizationProps) {
473503
outputEntity={entity}
474504
stratificationIsActive={overlayVariable != null}
475505
enableSpinner={vizConfig.xAxisVariable != null && !data.error}
476-
totalCounts={totalCounts}
477-
filteredCounts={filteredCounts}
506+
totalCounts={totalCounts.value}
507+
filteredCounts={filteredCounts.value}
478508
/>
479509
<VariableCoverageTable
480510
completeCases={data.pending ? undefined : data.value?.completeCases}
481-
filters={filters}
511+
filteredCounts={filteredCounts}
482512
outputEntityId={vizConfig.xAxisVariable?.entityId}
483513
variableSpecs={[
484514
{

0 commit comments

Comments
 (0)