Skip to content

Commit 446e6e9

Browse files
Adding ratings explorer to app-group page
#199
1 parent 93fb64b commit 446e6e9

10 files changed

Lines changed: 38 additions & 182 deletions

File tree

waltz-ng/client/app-capabilities/services/app-capability-store.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ const service = (http, root) => {
5353
.then(result => result.data);
5454

5555

56+
const findByCapabilityIds = ids =>
57+
http.post(`${BASE}/capability`, ids)
58+
.then(result => result.data);
59+
60+
5661
const countByCapabilityId = () =>
5762
http.get(`${BASE}/count-by/capability`)
5863
.then(result => result.data);
@@ -91,6 +96,7 @@ const service = (http, root) => {
9196
findAssociatedApplicationCapabilitiesByCapabilityId,
9297
findAssociatedCapabilitiesByApplicationId,
9398
findApplicationCapabilitiesByAppIdSelector,
99+
findByCapabilityIds,
94100
countByCapabilityId,
95101
removeCapability,
96102
addCapability,

waltz-ng/client/app-groups/app-group-view.html

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -71,36 +71,13 @@
7171
</waltz-section>
7272

7373

74-
<!-- CAPABILITY RATINGS -->
75-
<waltz-section name='Capability Ratings'
76-
small="{{ ctrl.ratingColorStrategy.name }}"
77-
ng-init="ctrl.capabilitySelectorVisible = false">
78-
<waltz-section-actions>
79-
<a ng-click='ctrl.capabilitySelectorVisible = !ctrl.capabilitySelectorVisible'
80-
class="btn btn-xs btn-primary">
81-
<waltz-icon name="cogs"></waltz-icon>
82-
Configure
83-
</a>
84-
<button class="btn btn-xs waltz-btn-transparent"
85-
ng-click="ctrl.visibility.capabilityRatingOverlay = ! ctrl.visibility.capabilityRatingOverlay">
86-
<waltz-icon name="map-signs"></waltz-icon>
87-
</button>
88-
</waltz-section-actions>
89-
90-
<waltz-source-data-overlay visible="ctrl.visibility.capabilityRatingOverlay"
91-
ratings="ctrl.sourceDataRatings"
92-
entities="['APP_RATING', 'APP_CAPABILITY']">
93-
</waltz-source-data-overlay>
94-
95-
<waltz-multi-app-rating-viewer applications="ctrl.applications"
96-
capabilities="ctrl.capabilities"
97-
ratings="ctrl.ratings"
98-
color-strategy="ctrl.ratingColorStrategy"
99-
capability-selector-visible="ctrl.capabilitySelectorVisible"
100-
initially-selected-ids="ctrl.initiallySelectedIds"
101-
explicit-capability-ids="ctrl.explicitCapabilityIds">
102-
</waltz-multi-app-rating-viewer>
103-
</waltz-section>
74+
<!-- CAPABILITIES -->
75+
<waltz-rating-explorer-section applications="ctrl.applications"
76+
app-capabilities="ctrl.appCapabilities"
77+
capabilities="ctrl.capabilities"
78+
ratings="ctrl.ratings"
79+
source-data-ratings="ctrl.sourceDataRatings">
80+
</waltz-rating-explorer-section>
10481

10582

10683
<!-- FLOWS -->

waltz-ng/client/app-groups/app-group-view.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ function controller($scope,
198198
}
199199

200200

201-
202201
controller.$inject = [
203202
'$scope',
204203
'$q',

waltz-ng/client/capabilities/capability-view.html

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
</waltz-page-header>
1212

1313

14-
15-
1614
<!-- SUMMARY -->
1715
<waltz-capability-summary capability="ctrl.capability"
1816
applications="ctrl.apps"

waltz-ng/client/capabilities/capability-view.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const initialState = {
2828
groupedApps: null,
2929
processes: [],
3030
ratings: null,
31+
rawRatings: [],
3132
sourceDataRatings: [],
3233
techStats: null,
3334
traitInfo: null,
@@ -165,16 +166,25 @@ function controller($q,
165166
return _.map(apps, 'id');
166167
};
167168

169+
const appIdSelector = {
170+
entityReference: {
171+
kind: 'CAPABILITY',
172+
id: capId
173+
},
174+
scope: 'CHILDREN'
175+
};
176+
177+
168178
processStore
169179
.findForCapability(capId)
170180
.then(ps => vm.processes = ps);
171181

172182
appCapabilityStore.findApplicationsByCapabilityId(capability.id)
173183
.then(processApps)
174-
.then(appIds => {
184+
.then(() => {
175185
$q.all([
176186
perspectiveStore.findByCode('BUSINESS'),
177-
ratingStore.findByAppIds(appIds),
187+
ratingStore.findByAppIdSelector(appIdSelector),
178188
dataFlowViewService.initialise(capability.id, 'CAPABILITY', 'CHILDREN'),
179189
complexityStore.findBySelector(capability.id, 'CAPABILITY', 'CHILDREN'),
180190
assetCostViewService.initialise(capability.id, 'CAPABILITY', 'CHILDREN', 2015),
@@ -189,6 +199,7 @@ function controller($q,
189199
techStats,
190200
sourceDataRatings
191201
]) => {
202+
vm.rawRatings = ratings;
192203
vm.ratings = {
193204
group: prepareGroupData(capability, vm.apps, perspective, ratings),
194205
tweakers
@@ -203,7 +214,7 @@ function controller($q,
203214

204215
});
205216

206-
217+
207218
appCapabilityStore.findAssociatedApplicationCapabilitiesByCapabilityId(capability.id)
208219
.then(assocAppCaps => {
209220
const associatedAppIds = _.map(assocAppCaps, 'applicationId');

waltz-ng/client/org-units/unit-view.js

Lines changed: 0 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -10,144 +10,10 @@
1010
* You must not remove this notice, or any other, from this software.
1111
*
1212
*/
13-
import _ from "lodash";
14-
import d3 from "d3";
1513
import EventDispatcher from "../common/EventDispatcher";
16-
import {perhaps} from "../common/index";
17-
import {calculateGroupSummary} from "../ratings/directives/common";
18-
19-
20-
function indexCapabilities(appCapabilities) {
21-
return _.chain(appCapabilities)
22-
.map('capability')
23-
.keyBy('id')
24-
.value();
25-
}
26-
27-
28-
function calculateGroupData(apps, appCapabilities, measurables, allRatings) {
29-
const appsById = _.keyBy(apps, 'id');
30-
31-
const capabilitiesById = indexCapabilities(appCapabilities);
32-
33-
const byCapabilityThenAppThenMeasurable = d3.nest()
34-
.key(r => r.capability.id)
35-
.key(r => r.parent.id)
36-
.key(r => r.measurable.code)
37-
.map(allRatings);
38-
39-
const mkRatings = (appId, rawRatings, capabilityId) => {
40-
const ratings = _.map(
41-
measurables,
42-
m => {
43-
const ragRating = perhaps(() => rawRatings[m.code][0].ragRating, 'Z');
44-
return { current: ragRating, measurable: m.code || m.id };
45-
}
46-
);
47-
return {
48-
subject: appsById[appId],
49-
capabilityId,
50-
ratings
51-
};
52-
};
53-
54-
const mkGroup = (capabilityId) => {
55-
const capabilityGroup = byCapabilityThenAppThenMeasurable[capabilityId];
56-
57-
const raw = _.chain(capabilityGroup)
58-
.keys()
59-
.map(appId => mkRatings(appId, capabilityGroup[appId], capabilityId))
60-
.sortBy('subject.name')
61-
.value();
62-
63-
return {
64-
groupRef: capabilitiesById[capabilityId],
65-
raw,
66-
measurables,
67-
summaries: calculateGroupSummary(raw),
68-
collapsed: true
69-
};
70-
};
71-
72-
return _.chain(byCapabilityThenAppThenMeasurable)
73-
.keys()
74-
.map(mkGroup)
75-
.sortBy('groupRef.name')
76-
.value();
77-
}
78-
79-
80-
function calculateCapabilityRatings(orgUnitId, apps, appCapabilities, perspective, allRatings, $state) {
81-
82-
const measurables = perspective.measurables;
83-
const groups = calculateGroupData(apps, appCapabilities, measurables, allRatings);
84-
85-
function isPrimary(app, capabilityId) {
86-
const c = _.find(appCapabilities, ac => ac.capability.id === Number(capabilityId));
87-
if (!c) return false;
88-
const a = _.find(c.applications, { id: app.id });
89-
if (!a) return false;
90-
return a.primary;
91-
}
92-
93-
const data = {
94-
groups,
95-
tweakers: {
96-
subjectLabel: {
97-
enter: selection =>
98-
selection
99-
.on('click.go', d => $state.go('main.app.view', { id: d.subject.id }))
100-
.attr('font-style', d => d.subject.organisationalUnitId === orgUnitId ? 'none' : 'italic')
101-
.text(d => isPrimary(d.subject, d.capabilityId)
102-
? '\u2605 ' + _.truncate(d.subject.name, 24)
103-
: _.truncate(d.subject.name, 26))
104-
105-
},
106-
ratingRow: {
107-
enter: selection =>
108-
selection.attr('opacity', d => d.subject.organisationalUnitId === orgUnitId ? 1 : 0.6)
109-
}
110-
},
111-
measurables
112-
};
113-
114-
function showDirectsOnly() {
115-
const directApps = _.filter(apps, { organisationalUnitId: orgUnitId });
116-
const directAppIds = _.map(directApps, 'id');
117-
118-
data.groups = calculateGroupData(
119-
directApps,
120-
appCapabilities,
121-
measurables,
122-
_.filter(allRatings, r => _.includes(directAppIds, r.parent.id)));
123-
}
124-
125-
function showAll() {
126-
data.groups = calculateGroupData(apps, appCapabilities, measurables, allRatings);
127-
}
128-
129-
function expandAll() {
130-
_.map(data.groups, g => g.collapsed = false);
131-
}
132-
133-
function collapseAll() {
134-
_.map(data.groups, g => g.collapsed = true);
135-
}
136-
137-
data.actions = {
138-
expandAll,
139-
collapseAll,
140-
showDirectsOnly,
141-
showAll
142-
};
143-
144-
145-
return data;
146-
}
14714

14815

14916
function controller($stateParams,
150-
$state,
15117
$scope,
15218
viewDataService,
15319
viewOptions,
@@ -163,13 +29,6 @@ function controller($stateParams,
16329
historyStore.put(orgUnit.name, 'ORG_UNIT', 'main.org-unit.view', { id: orgUnit.id });
16430

16531
vm.viewData = viewOptions.filter(vm.rawViewData);
166-
vm.ratings = calculateCapabilityRatings(
167-
id,
168-
vm.viewData.apps,
169-
vm.viewData.appCapabilities,
170-
vm.viewData.perspective,
171-
vm.viewData.capabilityRatings,
172-
$state);
17332
};
17433

17534
$scope.$watch(
@@ -181,8 +40,6 @@ function controller($stateParams,
18140

18241
vm.eventDispatcher = new EventDispatcher();
18342

184-
const getAppIds = () => _.map(vm.rawViewData.apps, "id");
185-
18643
viewDataService
18744
.loadAll(id)
18845
.then(data => vm.rawViewData = data)
@@ -197,7 +54,6 @@ function controller($stateParams,
19754

19855
controller.$inject = [
19956
'$stateParams',
200-
'$state',
20157
'$scope',
20258
'OrgUnitViewDataService',
20359
'OrgUnitViewOptionsService',

waltz-ng/client/playpen/rating-explorer-section.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@ function controller($scope) {
259259

260260
vm.removeCapability = (cap) => {
261261
vm.selectedCapabilities = _.reject(vm.selectedCapabilities, c => c.id === cap.id);
262+
if (vm.focusedCapability && cap.id === vm.focusedCapability.id) {
263+
vm.focusedCapability = null;
264+
vm.focusedApps = null;
265+
vm.focusedScore = null;
266+
vm.visibility.appList = false;
267+
}
262268
};
263269

264270
vm.focusOnCapability = (cap, desiredScore /* optional */) => {

waltz-ng/client/playpen/simple-stack-chart.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ function calculateLayoutData(values = [], xScale) {
1313
return _.map(values, v => {
1414
const d = {
1515
x: last,
16-
width: xScale(v)
16+
width: xScale(v || 0)
1717
};
1818
last += d.width;
1919
return d;

waltz-service/src/main/java/com/khartec/waltz/service/app_capability/AppCapabilityService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ public List<ApplicationCapability> findByCapabilityIds(List<Long> capIds) {
135135
return time(
136136
"ACS.findByCapabilityIds",
137137
() -> dao.findByCapabilityIds(capIds));
138-
139138
}
140139

141140

waltz-web/src/main/java/com/khartec/waltz/web/endpoints/api/AppCapabilityEndpoint.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ public void register() {
8989
ListRoute<ApplicationCapability> findAppCapabilitiesForAppIdSelectorRoute = (request, response)
9090
-> appCapabilityDao.findByAppIdSelector(readOptionsFromBody(request));
9191

92+
ListRoute<ApplicationCapability> findByCapabilityIdsRoute = (request, response)
93+
-> appCapabilityDao.findByCapabilityIds(readIdsFromBody(request));
94+
9295
DatumRoute<Integer> updateRoute = (request, response) -> {
9396

9497
UpdateAppCapabilitiesAction action = readBody(request, UpdateAppCapabilitiesAction.class);
@@ -140,6 +143,7 @@ public void register() {
140143
getForList(mkPath(BASE_URL, "capability", ":capabilityId", "associated"), findAssociatedAppCapabilitiesRoute);
141144
getForList(mkPath(BASE_URL, "application", ":id", "associated"), findAssociatedCapabilitiesByApplicationRoute);
142145
postForList(mkPath(BASE_URL, "selector"), findAppCapabilitiesForAppIdSelectorRoute);
146+
postForList(mkPath(BASE_URL, "capability"), findByCapabilityIdsRoute);
143147
postForDatum(mkPath(BASE_URL, "application", ":id"), updateRoute);
144148
delete(mkPath(BASE_URL, "application", ":id", ":capabilityId"), deleteRoute);
145149
postForDatum(mkPath(BASE_URL, "application", ":id", ":capabilityId"), additionRoute);

0 commit comments

Comments
 (0)