From 65b867d1b08ee53f89d8b7e53040443e4914f282 Mon Sep 17 00:00:00 2001 From: Leonardo Campos Date: Mon, 16 Jan 2017 23:54:30 -0200 Subject: [PATCH] LT-92: Grouping non-conformities to make it faster to read on measurementTableRow view --- .../measurementTableRow.js | 20 ++++----- .../client/conformance/ConformanceCriteria.js | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/Packages/ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.js b/Packages/ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.js index 969112bc4..942e9246c 100644 --- a/Packages/ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.js +++ b/Packages/ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.js @@ -25,20 +25,14 @@ const keys = { Template.measurementTableRow.helpers({ hasWarnings() { const toolsGroupsMap = this.measurementApi.toolsGroupsMap; - const nonConformities = this.conformanceCriteria.nonConformities.get(); - const foundNonConformity = _.find(nonConformities, nonConformity => { - const measurement = _.find(nonConformity.measurements, measurement => { - if(toolsGroupsMap[measurement.toolType] !== this.rowItem.measurementTypeId) { - return false; - } + const measurementTypeId = this.rowItem.measurementTypeId; + const measurementNumber = this.rowItem.measurementNumber; + const groupedNonConformities = this.conformanceCriteria.groupedNonConformities.get() || {}; + const nonConformitiesByMeasurementTypeId = groupedNonConformities[measurementTypeId] || {}; + const nonConformitiesByMeasurementNumbers = nonConformitiesByMeasurementTypeId.measurementNumbers || {}; + const nonConformitiesByMeasurementNumber = nonConformitiesByMeasurementNumbers[measurementNumber] || {}; - return measurement.measurementNumber === parseInt(this.rowItem.measurementNumber, 10); - }); - - return !!measurement; - }); - - return !!foundNonConformity; + return nonConformitiesByMeasurementNumber.messages && nonConformitiesByMeasurementNumber.messages.length; } }); diff --git a/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js b/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js index c9bf24d97..0cb646b68 100644 --- a/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js +++ b/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js @@ -9,6 +9,7 @@ class ConformanceCriteria { this.measurementApi = measurementApi; this.timepointApi = timepointApi; this.nonConformities = new ReactiveVar(); + this.groupedNonConformities = new ReactiveVar(); const validate = _.debounce(trialCriteriaType => { this.validate(trialCriteriaType); @@ -33,12 +34,53 @@ class ConformanceCriteria { const resultBaseline = this.validateTimepoint('baseline', trialCriteriaType, baselineData); const resultFollowup = this.validateTimepoint('followup', trialCriteriaType, followupData); const nonConformities = resultBaseline.concat(resultFollowup).concat(resultBoth); + const groupedNonConformities = this.groupNonConformities(nonConformities); + // Keep both? Group the data only on viewer/measurementTable views? + // Work with not grouped data (worse lookup performance on measurementTableRow)? this.nonConformities.set(nonConformities); + this.groupedNonConformities.set(groupedNonConformities); return nonConformities; } + groupNonConformities(nonConformities) { + const groups = {}; + const toolsGroupsMap = this.measurementApi.toolsGroupsMap; + + nonConformities.forEach(nonConformity => { + if(nonConformity.isGlobal) { + groups.globals = groups.globals || { messages: [] }; + groups.globals.messages.push(nonConformity.message); + + return; + } + + nonConformity.measurements.forEach(measurement => { + const groupName = toolsGroupsMap[measurement.toolType]; + groups[groupName] = groups[groupName] || { measurementNumbers: {} }; + + const group = groups[groupName]; + const measureNumber = measurement.measurementNumber; + let measurementNumbers = group.measurementNumbers[measureNumber]; + + if(!measurementNumbers) { + measurementNumbers = group.measurementNumbers[measureNumber] = { + messages: [], + measurements: [] + } + } + + measurementNumbers.messages.push(nonConformity.message); + measurementNumbers.measurements.push(measurement); + }); + }); + + console.log('>>>>> groups: ', groups); + + return groups; + } + validateTimepoint(timepointId, trialCriteriaType, data) { const evaluators = this.getEvaluators(timepointId, trialCriteriaType); let nonConformities = [];