Skip to content

Commit 76b7c04

Browse files
Merge pull request #6850 from davidwatkins73/waltz-6830-fcr-table-assessments
Flow Classification Rule table to show assessments
2 parents 126fb44 + 86ecb3e commit 76b7c04

13 files changed

Lines changed: 293 additions & 43 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.finos.waltz.data.measurable_rating;
2+
3+
import org.finos.waltz.data.JooqUtilities;
4+
import org.finos.waltz.model.EntityKind;
5+
import org.finos.waltz.model.EntityReference;
6+
import org.finos.waltz.model.measurable_rating.ImmutablePrimaryRatingViewItem;
7+
import org.finos.waltz.model.measurable_rating.PrimaryRatingViewItem;
8+
import org.finos.waltz.schema.Tables;
9+
import org.finos.waltz.schema.tables.Measurable;
10+
import org.finos.waltz.schema.tables.MeasurableCategory;
11+
import org.finos.waltz.schema.tables.MeasurableRating;
12+
import org.finos.waltz.schema.tables.RatingSchemeItem;
13+
import org.jooq.DSLContext;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.stereotype.Repository;
16+
17+
import java.util.Set;
18+
19+
import static org.finos.waltz.model.EntityReference.mkRef;
20+
import static org.finos.waltz.schema.Tables.*;
21+
22+
@Repository
23+
public class MeasurableRatingViewDao {
24+
25+
private static final MeasurableRating mr = MEASURABLE_RATING;
26+
private static final Measurable m = MEASURABLE;
27+
private static final RatingSchemeItem rsi = RATING_SCHEME_ITEM;
28+
private static final MeasurableCategory mc = MEASURABLE_CATEGORY;
29+
30+
private final DSLContext dsl;
31+
32+
@Autowired
33+
public MeasurableRatingViewDao(DSLContext dsl) {
34+
this.dsl = dsl;
35+
}
36+
37+
38+
/**
39+
* Given an application id will return a set of primary ratings.
40+
* The {@link PrimaryRatingViewItem} is a lightweight object with
41+
* just enough data for display purposes.
42+
*
43+
* @param appId the identifier of the app to return primary ratings
44+
* @return a set of primary ratings, the set will be empty if there are no ratings or the app cannot be found
45+
*/
46+
public Set<PrimaryRatingViewItem> findPrimaryRatingsForApp(long appId) {
47+
return dsl
48+
.select(mc.ID,
49+
mc.NAME,
50+
mc.DESCRIPTION,
51+
m.ID,
52+
m.NAME,
53+
m.DESCRIPTION,
54+
rsi.NAME,
55+
rsi.DESCRIPTION,
56+
rsi.COLOR)
57+
.from(mr)
58+
.innerJoin(m).on(m.ID.eq(mr.MEASURABLE_ID))
59+
.innerJoin(mc).on(mc.ID.eq(m.MEASURABLE_CATEGORY_ID))
60+
.innerJoin(rsi).on(mr.RATING.eq(rsi.CODE)
61+
.and(rsi.SCHEME_ID.eq(mc.RATING_SCHEME_ID)))
62+
.where(mr.ENTITY_KIND.eq(EntityKind.APPLICATION.name())
63+
.and(mr.ENTITY_ID.eq(appId)))
64+
.fetchSet(r -> ImmutablePrimaryRatingViewItem
65+
.builder()
66+
.measurableCategory(mkRef(
67+
EntityKind.MEASURABLE_CATEGORY,
68+
r.get(mc.ID),
69+
r.get(mc.NAME),
70+
r.get(mc.DESCRIPTION)))
71+
.measurable(mkRef(
72+
EntityKind.MEASURABLE,
73+
r.get(m.ID),
74+
r.get(m.NAME),
75+
r.get(m.DESCRIPTION)))
76+
.ratingName(r.get(rsi.NAME))
77+
.ratingDescription(r.get(rsi.DESCRIPTION))
78+
.ratingColor(r.get(rsi.COLOR))
79+
.build());
80+
}
81+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.finos.waltz.model.flow_classification_rule;
2+
3+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
4+
import org.finos.waltz.model.assessment_definition.AssessmentDefinition;
5+
import org.finos.waltz.model.assessment_rating.AssessmentRating;
6+
import org.finos.waltz.model.rating.RatingSchemeItem;
7+
import org.immutables.value.Value;
8+
9+
import java.util.Set;
10+
11+
@Value.Immutable
12+
@JsonSerialize(as = ImmutableFlowClassificationRuleView.class)
13+
public abstract class FlowClassificationRuleView {
14+
15+
public abstract Set<FlowClassificationRule> flowClassificationRules();
16+
17+
public abstract Set<AssessmentRating> assessmentRatings();
18+
19+
public abstract Set<AssessmentDefinition> primaryAssessmentDefinitions();
20+
21+
public abstract Set<RatingSchemeItem> ratingSchemeItems();
22+
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.finos.waltz.model.measurable_rating;
2+
3+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
4+
import org.finos.waltz.model.EntityReference;
5+
import org.finos.waltz.model.rating.RatingSchemeItem;
6+
import org.immutables.value.Value;
7+
8+
@Value.Immutable
9+
@JsonSerialize(as = ImmutablePrimaryRatingViewItem.class)
10+
public abstract class PrimaryRatingViewItem {
11+
12+
public abstract EntityReference measurableCategory();
13+
public abstract EntityReference measurable();
14+
public abstract String ratingName();
15+
public abstract String ratingDescription();
16+
public abstract String ratingColor();
17+
18+
}

waltz-ng/client/data-flow/components/data-flow-section/data-flow-section.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ function controller(serviceBroker) {
133133

134134
serviceBroker
135135
.loadViewData(
136-
CORE_API.FlowClassificationRuleStore.findByApp,
137-
[ vm.parentEntityRef.id ], {force: true})
136+
CORE_API.FlowClassificationRuleStore.view,
137+
[ mkSelectionOptions(vm.parentEntityRef) ], {force: true})
138138
.then(r => {
139139
vm.flowClassificationRules = r.data;
140140
});

waltz-ng/client/flow-classification-rule/components/section/flow-classification-rules-section.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
id="wass-sources-tab-content">
9191
<div class="waltz-panel-content">
9292

93-
<div ng-if="$ctrl.classificationRules.length > 0">
93+
<div ng-if="$ctrl.classificationRules.flowClassificationRules.length > 0">
9494
<waltz-flow-classification-rules-table rules="$ctrl.classificationRules"
9595
parent-entity-ref="$ctrl.parentEntityRef">
9696
</waltz-flow-classification-rules-table>

waltz-ng/client/flow-classification-rule/components/section/flow-classification-rules-section.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,12 @@ function controller(serviceBroker) {
9393

9494
const loadFlowClassificationRules = () => {
9595
vm.selectionOptions = mkSelector();
96-
const selector = mkSelector();
9796
serviceBroker
9897
.loadViewData(
99-
CORE_API.FlowClassificationRuleStore.findFlowClassificationRulesBySelector,
100-
[selector])
98+
CORE_API.FlowClassificationRuleStore.view,
99+
[vm.selectionOptions])
101100
.then(r => {
102-
vm.classificationRules = r.data;
101+
vm.classificationRules = r.data;
103102
});
104103
};
105104

waltz-ng/client/flow-classification-rule/components/summary-list/flow-classification-rule-summary-list.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
</waltz-static-panels>
1818
<br>
1919

20-
<div ng-if="$ctrl.viewMode==='LIST'">
21-
<waltz-flow-classification-rules-table rules="$ctrl.classificationRules"
20+
<div ng-if="$ctrl.viewMode === 'LIST'">
21+
<waltz-flow-classification-rules-table rules="$ctrl.flowClassificationRules"
2222
on-select="$ctrl.onSelectRule">
2323
</waltz-flow-classification-rules-table>
2424
</div>
2525

2626

27-
<div ng-if="$ctrl.viewMode==='DETAIL'">
27+
<div ng-if="$ctrl.viewMode === 'DETAIL'">
2828
<waltz-svelte-component component="$ctrl.FlowClassificationRuleDetail"
2929
primary-entity-ref="$ctrl.parentEntityRef"
3030
can-edit="$ctrl.canEdit"

waltz-ng/client/flow-classification-rule/components/summary-list/flow-classification-rule-summary-list.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,28 @@ import FlowClassificationRuleDetail from "./FlowClassificationRuleDetail.svelte"
55
import FlowClassificationRuleEditor from "./FlowClassificationRuleEditor.svelte";
66
import {mode, selectedClassificationRule} from "./editingFlowClassificationRulesState";
77
import roles from "../../../user/system-roles";
8+
import {mkRef} from "../../../common/entity-utils";
9+
import {mkSelectionOptions} from "../../../common/selector-utils";
810

911
const bindings = {}
1012

1113
const initialState = {
1214
viewMode: "LIST",
1315
FlowClassificationRuleDetail,
1416
FlowClassificationRuleEditor,
15-
canEdit: false
17+
canEdit: false,
18+
view: null
1619
};
1720

1821
function controller(serviceBroker, userService, $scope){
1922

2023
const loadFlowClassificationRules = () => {
2124
serviceBroker
22-
.loadViewData(CORE_API.FlowClassificationRuleStore.findAll, [], {force: true})
23-
.then(r => vm.classificationRules = r.data);
25+
.loadViewData(
26+
CORE_API.FlowClassificationRuleStore.view,
27+
[mkSelectionOptions(mkRef("ALL", 1))],
28+
{force: true})
29+
.then(r => vm.flowClassificationRules = r.data);
2430
};
2531

2632
const vm = initialiseData(this, initialState);

waltz-ng/client/flow-classification-rule/components/table/flow-classification-rules-table.js

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import template from "./flow-classification-rules-table.html";
2525

2626
const bindings = {
2727
parentEntityRef: "<",
28-
rules: "<",
28+
rules: "<?",
2929
onSelect: "<?"
3030
};
3131

@@ -45,7 +45,7 @@ function shouldShowConsumers(parentRef) {
4545
}
4646

4747

48-
function mkColumnDefs(parentRef) {
48+
function mkColumnDefs(parentRef, assessmentDefinitions = []) {
4949
const consumerCell = shouldShowConsumers(parentRef)
5050
? {
5151
field: "consumers",
@@ -103,12 +103,28 @@ function mkColumnDefs(parentRef) {
103103
</div>`
104104
};
105105

106+
const definitionCells = _.map(assessmentDefinitions, def => {
107+
return {
108+
field: `assessmentRatings.${def.id}`,
109+
displayName: def.name,
110+
toSearchTerm: d => _.get(d, ["assessmentRatings", def.id, "ratingSchemeItem", "name"], ""),
111+
cellTemplate: `
112+
<div class="ui-grid-cell-contents" ng-style="{'background-color': COL_FIELD.ratingSchemeItem.color}">
113+
<span ng-bind="COL_FIELD.ratingSchemeItem.name"
114+
title="{{COL_FIELD.rating.comment}}">
115+
</span>
116+
</div>
117+
`
118+
};
119+
});
120+
106121
return _.compact([
107122
mkEntityLabelGridCell("Data Type", "dataType", "none", "right"),
108123
mkEntityLabelGridCell("Scope", "vantagePointReference", "left"),
109124
mkEntityLabelGridCell("Subject", "subjectReference", "left", "right"),
110125
consumerCell,
111126
classificationCell,
127+
...definitionCells,
112128
notesCell
113129
]);
114130
}
@@ -142,8 +158,14 @@ function controller($q, $state, serviceBroker) {
142158
function mkGridData() {
143159
const dataTypesById = _.keyBy(vm.dataTypes, "id");
144160

145-
vm.columnDefs = mkColumnDefs(vm.parentEntityRef);
146-
vm.gridData = _.map(vm.rules, d => {
161+
const ratingSchemeItemsById = _.keyBy(vm.rules.ratingSchemeItems, d => d.id);
162+
const ratingsByEntityId = _.chain(vm.rules.assessmentRatings)
163+
.map(r => Object.assign({}, {rating: r, ratingSchemeItem: ratingSchemeItemsById[r.ratingId]}))
164+
.groupBy(d => d.rating.entityReference.id)
165+
.value();
166+
167+
vm.columnDefs = mkColumnDefs(vm.parentEntityRef, vm.rules.primaryAssessmentDefinitions);
168+
vm.gridData = _.map(vm.rules.flowClassificationRules, d => {
147169
return {
148170
id: d.id,
149171
subjectReference: d.subjectReference,
@@ -153,7 +175,8 @@ function controller($q, $state, serviceBroker) {
153175
description: d.description,
154176
classification: vm.classificationsById[d.classificationId],
155177
consumers: vm.consumersByAuthSourceId[d.id] || [],
156-
isReadonly: d.isReadonly
178+
isReadonly: d.isReadonly,
179+
assessmentRatings: _.keyBy(ratingsByEntityId[d.id] || [], r => r.rating.assessmentDefinitionId)
157180
};
158181
});
159182
}
@@ -181,10 +204,6 @@ function controller($q, $state, serviceBroker) {
181204
.then(mkGridData);
182205
}
183206

184-
vm.$onInit = () => {
185-
loadAll();
186-
};
187-
188207
vm.$onChanges = () => {
189208
if(vm.rules) {
190209
loadAll();
@@ -194,8 +213,6 @@ function controller($q, $state, serviceBroker) {
194213
vm.onSelect = (d) => $state.go(
195214
"main.flow-classification-rule.view",
196215
{ id: d.id });
197-
198-
199216
}
200217

201218

waltz-ng/client/flow-classification-rule/services/flow-classification-rule-store.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ export function store($http, root) {
100100
.get(`${BASE}/cleanup-orphans`)
101101
.then(r => r.data);
102102

103+
const view = (selector) =>
104+
$http
105+
.post(`${BASE}/view`, selector)
106+
.then(r => r.data);
107+
103108
return {
104109
calculateConsumersForDataTypeIdSelector,
105110
findByReference,
@@ -112,7 +117,8 @@ export function store($http, root) {
112117
remove,
113118
findDiscouragedSources,
114119
findFlowClassificationRulesBySelector,
115-
cleanupOrphans
120+
cleanupOrphans,
121+
view
116122
};
117123

118124
}
@@ -187,4 +193,9 @@ export const FlowClassificationRuleStore_API = {
187193
serviceFnName: "cleanupOrphans",
188194
description: "cleanupOrphans"
189195
},
196+
view: {
197+
serviceName,
198+
serviceFnName: "view",
199+
description: "gets all rules as a view object"
200+
}
190201
};

0 commit comments

Comments
 (0)