Skip to content

Commit

Permalink
Measurable rating isPrimary editor
Browse files Browse the repository at this point in the history
- pulled out non angular code from the ratings browser

finos#6635
  • Loading branch information
davidwatkins73 committed Jun 16, 2023
1 parent b6b130a commit 8254965
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 102 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import _ from "lodash";
import {buildHierarchies} from "../../../common/hierarchy-utils";


function combineRatingTallies(r1, r2) {
return _.mergeWith(
{}, r1, r2,
(v1, v2) => (v1 || 0) + (v2 || 0));
}


function toRatingsSummaryObj(ratings = []) {

const counts = _.chain(ratings)
.groupBy(r => r.rating)
.mapValues(r => {

const countsForRating = _.map(_.values(r), r => r.count);
return _.sum(countsForRating);
})
.value();

const total = _.sum(_.values(counts));
return Object.assign({}, counts, { total });
}


function initialiseRatingTalliesMap(ratingTallies = [], measurables = []) {
const talliesById = _.groupBy(ratingTallies, "id");

const reducer = (acc, m) => {
const talliesForMeasurable = talliesById[m.id];
const summaryObj = talliesForMeasurable
? toRatingsSummaryObj(talliesForMeasurable)
: {};

acc[m.id] = {
direct: _.clone(summaryObj),
compound: _.clone(summaryObj),
};
return acc;
};
return _.reduce(measurables, reducer, {});
}


export function prepareTreeData(data = []) {
return buildHierarchies(data, false);
}


export function prepareTabs(categories = [], measurables = [], ratingSchemesById = {}) {
const measurablesByCategory = _.groupBy(measurables, "categoryId");
return _
.chain(categories)
.filter(category => _.get(measurablesByCategory, category.id, []).length > 0)
.map(category => {
const measurablesForCategory = measurablesByCategory[category.id];
const treeData = prepareTreeData(measurablesForCategory);
const maxSize = _.chain(treeData)
.map("totalRatings.total")
.max()
.value();

return {
category,
ratingScheme: ratingSchemesById[category.ratingSchemeId],
treeData,
maxSize,
expandedNodes: []
};
})
.sortBy(d => d.category.position, d => d.category.name)
.value();
}


export function findFirstNonEmptyTab(tabs = []) {
const firstNonEmptyTab = _.find(tabs, t => t.treeData.length > 0);
return firstNonEmptyTab || tabs[0];
}


export function mkRatingTalliesMap(ratingTallies = [], measurables = []) {
const measurablesById = _.keyBy(measurables, "id");
const talliesMap = initialiseRatingTalliesMap(ratingTallies, measurables);
_.each(measurables, m => {
const rs = talliesMap[m.id];

while (m.parentId) {
const parent = measurablesById[m.parentId];
if (! parent) break;
const parentRating = talliesMap[m.parentId];
parentRating.compound = combineRatingTallies(parentRating.compound, rs.direct);
m = parent;
}
});

return talliesMap;
}


export function findMaxTotal(ratingsMap) {
return _.max(
_.flatMap(
_.values(ratingsMap),
r => _.get(r, ["compound", "total"], [0])))
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
ng-class="{ 'wt-active': tab.category.id == $ctrl.visibility.tab }"
class="wt-tab">
<br>
<h1 ng-if="tab.category.allowPrimaryRatings">Primaries!</h1>
<div ng-class="$ctrl.containerClass">
<treecontrol class="tree-light"
tree-model="tab.treeData"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {buildHierarchies} from "../../../common/hierarchy-utils";
import {CORE_API} from "../../../common/services/core-api-utils";
import {distinctRatingCodes, indexRatingSchemes} from "../../../ratings/rating-utils";
import template from "./measurable-ratings-browser.html";
import {findFirstNonEmptyTab, findMaxTotal, mkRatingTalliesMap, prepareTabs} from "./measurable-ratings-browser-utils";


/**
Expand Down Expand Up @@ -67,104 +68,6 @@ const initialState = {
};


function combineRatingTallies(r1, r2) {
return _.mergeWith(
{}, r1, r2,
(v1, v2) => (v1 || 0) + (v2 || 0));
}


function toRatingsSummaryObj(ratings = []) {

const counts = _.chain(ratings)
.groupBy(r => r.rating)
.mapValues(r => {

const countsForRating = _.map(_.values(r), r => r.count);
return _.sum(countsForRating);
})
.value();

const total = _.sum(_.values(counts));
return Object.assign({}, counts, { total });
}


function prepareTreeData(data = []) {
return buildHierarchies(data, false);
}


function prepareTabs(categories = [], measurables = [], ratingSchemesById = {}) {
const measurablesByCategory = _.groupBy(measurables, "categoryId");
return _
.chain(categories)
.filter(category => _.get(measurablesByCategory, category.id, []).length > 0)
.map(category => {
const measurablesForCategory = measurablesByCategory[category.id];
const treeData = prepareTreeData(measurablesForCategory);
const maxSize = _.chain(treeData)
.map("totalRatings.total")
.max()
.value();

return {
category,
ratingScheme: ratingSchemesById[category.ratingSchemeId],
treeData,
maxSize,
expandedNodes: []
};
})
.sortBy(d => d.category.position, d => d.category.name)
.value();
}


function findFirstNonEmptyTab(tabs = []) {
const firstNonEmptyTab = _.find(tabs, t => t.treeData.length > 0);
return firstNonEmptyTab || tabs[0];
}


function initialiseRatingTalliesMap(ratingTallies = [], measurables = []) {
const talliesById = _.groupBy(ratingTallies, "id");

const reducer = (acc, m) => {
const talliesForMeasurable = talliesById[m.id];
const summaryObj = talliesForMeasurable
? toRatingsSummaryObj(talliesForMeasurable)
: {};

acc[m.id] = {
direct: _.clone(summaryObj),
compound: _.clone(summaryObj),
};
return acc;
};
return _.reduce(measurables, reducer, {});
}


function mkRatingTalliesMap(ratingTallies = [], measurables = []) {
const measurablesById = _.keyBy(measurables, "id");
const talliesMap = initialiseRatingTalliesMap(ratingTallies, measurables);
_.each(measurables, m => {
const rs = talliesMap[m.id];

while (m.parentId) {
const parent = measurablesById[m.parentId];
if (! parent) break;
const parentRating = talliesMap[m.parentId];
parentRating.compound = combineRatingTallies(parentRating.compound, rs.direct);
m = parent;
}
});

return talliesMap;
}


function controller(serviceBroker) {
const vm = initialiseData(this, initialState);

Expand All @@ -185,10 +88,7 @@ function controller(serviceBroker) {
vm.tabs = tabs;

vm.ratingsMap = mkRatingTalliesMap(vm.ratingTallies, vm.measurables);
vm.maxTotal = _.max(
_.flatMap(
_.values(vm.ratingsMap),
r => _.get(r, ["compound", "total"], [0])));
vm.maxTotal = findMaxTotal(vm.ratingsMap);

if (!vm.visibility.tab) {
// no tab selected, select the first
Expand Down

0 comments on commit 8254965

Please sign in to comment.