Skip to content

Commit e878220

Browse files
committed
Merge branch 'waltz-6602-report-grid' of github.com:judofosu/waltz into waltz-6602-report-grid
2 parents e421a1f + 0e99c07 commit e878220

9 files changed

Lines changed: 388 additions & 102 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.finos.waltz.model.change_initiative;
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=ImmutableChangeInitiativeView.class)
13+
public abstract class ChangeInitiativeView {
14+
15+
public abstract Set<ChangeInitiative> changeInitiatives();
16+
public abstract Set<AssessmentDefinition> assessmentDefinitions();
17+
public abstract Set<RatingSchemeItem> ratingSchemeItems();
18+
public abstract Set<AssessmentRating> ratings();
19+
20+
}

waltz-ng/client/assessments/assessment-utils.js

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
*/
1818
import _ from "lodash";
1919
import { indexRatingSchemes } from "../ratings/rating-utils";
20-
import { nest } from "d3-collection";
21-
import { grey } from "../common/colors";
2220
import { refToString } from "../common/entity-utils";
2321
import {CORE_API} from "../common/services/core-api-utils";
2422
import {resolveResponses} from "../common/promise-utils";
@@ -70,48 +68,6 @@ export function mkEnrichedAssessmentDefinitions(definitions = [],
7068
}
7169

7270

73-
export function mkAssessmentSummaries(definitions = [], schemes = [], ratings = [], total = 0) {
74-
const indexedRatingSchemes = indexRatingSchemes(schemes);
75-
const definitionsById = _.keyBy(definitions, d => d.id);
76-
77-
const nestedRatings = nest()
78-
.key(d => d.assessmentDefinitionId)
79-
.key(d => d.ratingId)
80-
.rollup(xs => xs.length)
81-
.entries(ratings);
82-
83-
return _
84-
.chain(nestedRatings)
85-
.map(d => {
86-
const definition = definitionsById[Number(d.key)];
87-
const assignedTotal = _.sumBy(d.values, v => v.value);
88-
const values = _
89-
.chain(d.values)
90-
.map(v => {
91-
const propPath = [definition.ratingSchemeId, "ratingsById", v.key];
92-
const rating = _.get(indexedRatingSchemes, propPath);
93-
return Object.assign({}, v, { rating, count: v.value });
94-
})
95-
.concat([{
96-
key: "z",
97-
rating: {
98-
id: -1,
99-
name: "Not Provided",
100-
color: grey
101-
},
102-
count: _.max([0, total - assignedTotal])
103-
}])
104-
.filter(d => d.count > 0)
105-
.value();
106-
107-
const extension = { definition, values };
108-
return Object.assign({}, d , extension);
109-
})
110-
.orderBy(d => d.definition.name)
111-
.value();
112-
}
113-
114-
11571
/**
11672
* Given a list of entities, a list of assessment ratings and a desired
11773
* rating will filter the list of entities accordingly
@@ -154,6 +110,7 @@ export function filterByAssessmentRating(entities = [],
154110
* @param $q
155111
* @param serviceBroker
156112
* @param kind
113+
* @param options
157114
* @param primaryOnly
158115
* @returns {*}
159116
*/

waltz-ng/client/change-initiative/components/change-initiative-section/change-initiative-section.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,19 @@
1515
~ See the License for the specific
1616
~
1717
-->
18+
<style>
19+
.wcis-inactive-ci {
20+
color: #999;
21+
font-style: italic;
22+
}
1823

19-
<div>
24+
.wcis-inactive-ci a {
25+
color: #777;
26+
font-style: italic;
27+
}
28+
</style>
2029

30+
<div>
2131
<waltz-section-actions>
2232
<button class="btn btn-xs waltz-btn-transparent"
2333
ng-click="$ctrl.visibility.sourcesOverlay = ! $ctrl.visibility.sourcesOverlay">

waltz-ng/client/change-initiative/components/change-initiative-section/change-initiative-section.js

Lines changed: 106 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,18 @@
1818

1919
import _ from "lodash";
2020

21-
import { CORE_API } from "../../../common/services/core-api-utils";
22-
import { initialiseData } from "../../../common";
23-
import { mkSelectionOptions } from "../../../common/selector-utils";
21+
import {CORE_API} from "../../../common/services/core-api-utils";
22+
import {initialiseData} from "../../../common";
2423

2524
import template from "./change-initiative-section.html";
26-
import { changeInitiative } from "../../../common/services/enums/change-initiative";
27-
import { getEnumName } from "../../../common/services/enums";
25+
import {changeInitiative} from "../../../common/services/enums/change-initiative";
26+
import {getEnumName} from "../../../common/services/enums";
2827
import indexByKeyForType from "../../../enum-value/enum-value-utilities";
2928
import {isSameParentEntityRef} from "../../../common/entity-utils";
30-
import { fakeInitiative, fakeProgramme } from "../../change-initiative-utils";
31-
import { filterByAssessmentRating, mkAssessmentSummaries } from "../../../assessments/assessment-utils";
29+
import {fakeInitiative, fakeProgramme} from "../../change-initiative-utils";
30+
import {filterByAssessmentRating} from "../../../assessments/assessment-utils";
31+
import {nest} from "d3-collection";
32+
import {grey} from "../../../common/colors";
3233

3334
const bindings = {
3435
parentEntityRef: "<",
@@ -67,19 +68,34 @@ const initialState = {
6768
},
6869
filterHelpText: "Select an assessment category to filter the change initiatives",
6970
gridOptions: {
70-
columnDefs: [
71-
{ width: "15%", field: "kind", name: "Kind" },
72-
mkRefCol("initiative"),
73-
mkRefCol("programme"),
74-
mkRefCol("project"),
75-
{ width: "25%", field: "name", name: "Name" },
76-
{ width: "15%", field: "lifecyclePhase", name: "Phase" }
77-
],
71+
columnDefs: _.map(
72+
[
73+
{ width: "15%", field: "kind", name: "Kind" },
74+
mkRefCol("initiative"),
75+
mkRefCol("programme"),
76+
mkRefCol("project"),
77+
{ width: "25%", field: "name", name: "Name" },
78+
{ width: "15%", field: "lifecyclePhase", name: "Phase" }
79+
],
80+
enrichWithInactiveStyling),
7881
data: []
7982
}
8083
};
8184

8285

86+
function calcCellClass(grid, row, col, rowRenderIndex, colRenderIndex) {
87+
return row.entity.lifecyclePhase === "Retired"
88+
? "wcis-inactive-ci"
89+
: "";
90+
}
91+
92+
93+
function enrichWithInactiveStyling(col) {
94+
return Object.assign(
95+
{},
96+
col,
97+
{ cellClass: calcCellClass });}
98+
8399
function determineHierarchy(cisById = {}, ci) {
84100
const none = null;
85101

@@ -147,24 +163,76 @@ function mkTableData(changeInitiatives = [], lifecycleNamesByKey = {}) {
147163
kind: changeKind
148164
}
149165
})
150-
.orderBy(d => ["initiative.name", "programme.name", "project.name", "name"])
166+
.orderBy(d => ["initiative.externalId", "programme.externalId", "project.externalId", "name"])
167+
.value();
168+
}
169+
170+
171+
function mkAssessmentSummaries(definitions = [], schemeItems = [], ratings = [], total = 0) {
172+
const indexedRatingSchemes = indexRatingSchemeItems(schemeItems);
173+
const definitionsById = _.keyBy(definitions, d => d.id);
174+
175+
const nestedRatings = nest()
176+
.key(d => d.assessmentDefinitionId)
177+
.key(d => d.ratingId)
178+
.rollup(xs => xs.length)
179+
.entries(ratings);
180+
181+
return _
182+
.chain(nestedRatings)
183+
.map(d => {
184+
const definition = definitionsById[Number(d.key)];
185+
const assignedTotal = _.sumBy(d.values, v => v.value);
186+
const values = _
187+
.chain(d.values)
188+
.map(v => {
189+
const propPath = [definition.ratingSchemeId, "ratingsById", v.key];
190+
const rating = _.get(indexedRatingSchemes, propPath);
191+
return Object.assign({}, v, { rating, count: v.value });
192+
})
193+
.concat([{
194+
key: "z",
195+
rating: {
196+
id: -1,
197+
name: "Not Provided",
198+
color: grey
199+
},
200+
count: _.max([0, total - assignedTotal])
201+
}])
202+
.filter(d => d.count > 0)
203+
.value();
204+
205+
const extension = { definition, values };
206+
return Object.assign({}, d , extension);
207+
})
208+
.orderBy(d => d.definition.name)
209+
.value();
210+
}
211+
212+
/**
213+
* Given a flat list of rating schemes returns them indexed by their ids. Also each scheme has
214+
* an additional maps giving 'ratingsByCode' and 'ratingsById' .
215+
* @param schemes
216+
*/
217+
function indexRatingSchemeItems(schemeItems = []) {
218+
return _
219+
.chain(schemeItems)
220+
.groupBy(d => d.ratingSchemeId)
221+
.map((v,k) => Object.assign({}, {
222+
id: k,
223+
ratingsByCode: _.keyBy(v, d => d.rating),
224+
ratingsById: _.keyBy(v, d => d.id),
225+
}))
226+
.keyBy(d => d.id)
151227
.value();
152228
}
153229

154230

155231
function controller($q, serviceBroker) {
156232
const vm = initialiseData(this, initialState);
157233

158-
function init() {
159-
const schemesPromise = serviceBroker
160-
.loadAppData(CORE_API.RatingSchemeStore.findAll)
161-
.then(r => vm.ratingSchemes = r.data);
162-
163-
const assessmentDefinitionsPromise = serviceBroker
164-
.loadAppData(
165-
CORE_API.AssessmentDefinitionStore.findByKind,
166-
[ "CHANGE_INITIATIVE" ])
167-
.then(r => vm.assessmentDefinitions = r.data);
234+
vm.$onChanges = (changes) => {
235+
const sameParent = isSameParentEntityRef(changes);
168236

169237
const enumPromise = serviceBroker
170238
.loadAppData(CORE_API.EnumValueStore.findAll)
@@ -174,35 +242,25 @@ function controller($q, serviceBroker) {
174242
"changeInitiativeLifecyclePhase");
175243
});
176244

177-
return $q
178-
.all([schemesPromise, assessmentDefinitionsPromise, enumPromise]);
179-
}
180-
181-
182-
vm.$onChanges = (changes) => {
183-
const sameParent = isSameParentEntityRef(changes);
184-
185245
if (vm.parentEntityRef && !sameParent) {
186-
const selectionOptions = mkSelectionOptions(vm.parentEntityRef);
187-
const ciPromise = serviceBroker
188-
.loadViewData(
189-
CORE_API.ChangeInitiativeStore.findHierarchyBySelector,
190-
[ selectionOptions ])
191-
.then(r => vm.changeInitiatives = r.data);
192-
193-
const assessmentRatingsPromise = serviceBroker
246+
const viewPromise = serviceBroker
194247
.loadViewData(
195-
CORE_API.AssessmentRatingStore.findByTargetKindForRelatedSelector,
196-
[ "CHANGE_INITIATIVE", selectionOptions ])
197-
.then(r => vm.assessmentRatings = r.data);
248+
CORE_API.ChangeInitiativeViewStore.findByEntity,
249+
[vm.parentEntityRef])
250+
.then(r => {
251+
const d = r.data;
252+
vm.changeInitiatives = d.changeInitiatives;
253+
vm.assessmentRatings = d.ratings;
254+
vm.ratingSchemeItems = d.ratingSchemeItems;
255+
vm.assessmentDefinitions = d.assessmentDefinitions;
256+
});
198257

199-
$q.all([init(), ciPromise, assessmentRatingsPromise])
258+
$q.all([enumPromise, viewPromise])
200259
.then(() => applyFilters());
201260
}
202261
};
203262

204263
function applyFilters() {
205-
206264
const retiredCiFilter = vm.displayRetiredCis
207265
? () => true
208266
: ci => ci.lifecyclePhase !== "RETIRED";
@@ -226,14 +284,13 @@ function controller($q, serviceBroker) {
226284

227285
vm.assessmentSummaries = mkAssessmentSummaries(
228286
vm.assessmentDefinitions,
229-
vm.ratingSchemes,
287+
vm.ratingSchemeItems,
230288
inScopeRatings,
231289
inScopeCis.length);
232290

233291
vm.gridOptions.data = mkTableData(
234292
relevantCis,
235293
vm.changeInitiativeLifecyclePhaseByKey);
236-
237294
}
238295

239296
vm.onSelectAssessmentRating = d => {

waltz-ng/client/change-initiative/index.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818

1919
import angular from "angular";
2020

21-
import {registerComponents, registerStore} from "../common/module-utils";
21+
import {registerComponents, registerStores} from "../common/module-utils";
2222

2323
import changeInitiativeStore from "./services/change-initiative-store";
24+
import changeInitiativeViewStore from "./services/change-initiative-view-store";
2425
import changeInitiativeSelector from "./directives/change-initiative-selector";
25-
import BulkChangeInitiativeSelector from "./components/bulk-change-initiative-selector/bulk-change-initiative-selector";
2626

27+
import BulkChangeInitiativeSelector from "./components/bulk-change-initiative-selector/bulk-change-initiative-selector";
2728
import changeInitiativeSection from "./components/change-initiative-section/change-initiative-section";
28-
import changeInitiativeTree from "./components/tree/change-initiative-tree";
2929

30+
import changeInitiativeTree from "./components/tree/change-initiative-tree";
3031
import Routes from "./routes";
3132

3233

@@ -35,11 +36,14 @@ function setup() {
3536
module
3637
.config(Routes);
3738

38-
registerStore(module, changeInitiativeStore);
39+
registerStores(module, [
40+
changeInitiativeStore,
41+
changeInitiativeViewStore
42+
]);
3943

4044
module
4145
.directive("waltzChangeInitiativeSelector", changeInitiativeSelector);
42-
46+
4347
registerComponents(module, [
4448
changeInitiativeSection,
4549
changeInitiativeTree,

0 commit comments

Comments
 (0)