Skip to content

Commit 996a4f0

Browse files
Merge pull request #6150 from deutschebank/db-contrib/waltz-6098-assessment-ratings-into-groups
Db contrib/waltz 6098 assessment ratings into groups
2 parents 72f6db9 + 87ce214 commit 996a4f0

File tree

22 files changed

+671
-86
lines changed

22 files changed

+671
-86
lines changed

waltz-data/src/main/ddl/liquibase/db.changelog-1.43.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,5 @@
157157
<column name="user_selectable" valueBoolean="true"/>
158158
</insert>
159159
</changeSet>
160+
160161
</databaseChangeLog>

waltz-data/src/main/java/org/finos/waltz/data/assessment_definition/AssessmentDefinitionDao.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public class AssessmentDefinitionDao {
6565
.isReadOnly(record.getIsReadonly())
6666
.provenance(record.getProvenance())
6767
.visibility(AssessmentVisibility.valueOf(record.getVisibility()))
68+
.definitionGroup(record.getDefinitionGroup())
6869
.qualifierReference(maybeReadRef(
6970
record,
7071
ASSESSMENT_DEFINITION.QUALIFIER_KIND,
@@ -114,6 +115,7 @@ public Collection<AssessmentDefinition> findByEntityKindAndQualifier(EntityKind
114115
/**
115116
* Saves the given assessment definition. Either updating or inserting.
116117
* Returns the identifier for the record.
118+
*
117119
* @param def the definition to save
118120
* @return the identifier for the record
119121
*/
@@ -138,15 +140,16 @@ public Long save(AssessmentDefinition def) {
138140
r.setLastUpdatedAt(Timestamp.valueOf(def.lastUpdatedAt()));
139141
r.setLastUpdatedBy(def.lastUpdatedBy());
140142
r.setProvenance(StringUtilities.ifEmpty(def.provenance(), "waltz"));
143+
r.setDefinitionGroup(r.getDefinitionGroup());
141144

142145
def.qualifierReference()
143-
.ifPresent(qualifier -> {
144-
r.setQualifierId(qualifier.id());
145-
r.setQualifierKind(qualifier.kind().name());
146-
});
146+
.ifPresent(qualifier -> {
147+
r.setQualifierId(qualifier.id());
148+
r.setQualifierKind(qualifier.kind().name());
149+
});
147150

148151
def.id()
149-
.ifPresent(r::setId);
152+
.ifPresent(r::setId);
150153

151154
if (r.getId() == null) {
152155
r.insert();

waltz-model/src/main/java/org/finos/waltz/model/assessment_definition/AssessmentDefinition.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public abstract class AssessmentDefinition implements
4747

4848
public abstract AssessmentVisibility visibility();
4949

50+
@Value.Default
51+
public String definitionGroup() {
52+
return "Uncategorized";
53+
}
54+
5055
@Value.Default
5156
public EntityKind kind() {
5257
return EntityKind.ASSESSMENT_DEFINITION;

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,19 @@ function loadAssessments($q, serviceBroker, kind, ratingsPromise, primaryOnly =
230230
assessmentsByEntityId: enrichedByEntityId // assessmentsByEntityId: entity id -> assessment def external id -> assessment
231231
};
232232
});
233+
}
234+
235+
236+
export function isFavourite(favouriteDefinitionIds, id) {
237+
return _.includes(favouriteDefinitionIds, id);
238+
}
239+
240+
241+
export function getIdsFromString(includedFavouritesString) {
242+
return _.isNil(includedFavouritesString)
243+
? []
244+
: _.chain(includedFavouritesString.value)
245+
.split(",")
246+
.map(idString => _.toNumber(idString))
247+
.value();
233248
}

waltz-ng/client/assessments/components/editor/AssessmentEditorView.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import Markdown from "../../../common/svelte/Markdown.svelte";
55
import Icon from "../../../common/svelte/Icon.svelte";
66
import {fade} from 'svelte/transition';
7+
78
export let assessment;
9+
10+
$: console.log({assessment});
811
</script>
912

1013

waltz-ng/client/assessments/components/favourites-list/assessment-rating-favourites-list.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import {initialiseData} from "../../../common";
2020
import _ from "lodash";
2121
import template from "./assessment-rating-favourites-list.html";
22-
import {mkAssessmentDefinitionsIdsKey} from "../../../user";
22+
import {mkAssessmentDefinitionsIdsBaseKey} from "../../../user";
2323
import {CORE_API} from "../../../common/services/core-api-utils";
2424

2525

@@ -82,7 +82,7 @@ function controller(serviceBroker) {
8282
serviceBroker
8383
.loadAppData(CORE_API.UserPreferenceStore.findAllForUser, [], {force: true})
8484
.then(r => vm.favouriteAssessmentDefnIds = getFavouriteAssessmentDefnIds(
85-
mkAssessmentDefinitionsIdsKey(vm.parentEntityRef),
85+
mkAssessmentDefinitionsIdsBaseKey(vm.parentEntityRef),
8686
r.data,
8787
vm.defaultPrimaryList))
8888
.then(() => filterAssessments());
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<script>
2+
3+
import Markdown from "../../../common/svelte/Markdown.svelte";
4+
import Icon from "../../../common/svelte/Icon.svelte";
5+
6+
export let definition;
7+
8+
</script>
9+
10+
11+
<h4>
12+
{definition.name}
13+
<span class="text-muted small">({definition.externalId})</span>
14+
</h4>
15+
<Markdown class="force-wrap" text={definition.description}/>
16+
17+
{#if definition.isReadOnly}
18+
<div class="help-block small">
19+
<Icon name="lock"/>
20+
Assessments relating to this definition are read-only and cannot be edited.
21+
</div>
22+
{/if}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
<script>
2+
3+
import _ from "lodash";
4+
import {userPreferenceStore} from "../../../svelte-stores/user-preference-store";
5+
import {onMount} from "svelte";
6+
import {createStores} from "./assessment-rating-store";
7+
import AssessmentRatingListGroup from "./AssessmentRatingListGroup.svelte";
8+
import Icon from "../../../common/svelte/Icon.svelte";
9+
10+
11+
let elem;
12+
let stores = null;
13+
let defaultPrimaryList;
14+
let favouriteIncludedIds;
15+
let favouriteExcludedIds;
16+
let favouriteIds;
17+
let setFromPreferences;
18+
19+
let userPreferenceCall = userPreferenceStore.findAllForUser();
20+
21+
export let assessments = [];
22+
export let primaryEntityRef = [];
23+
export let onSelect = (d) => console.log("selected", d);
24+
25+
onMount(() => {
26+
userPreferenceCall = userPreferenceStore.findAllForUser();
27+
})
28+
29+
30+
function toggleGroup(group) {
31+
expansions = _.includes(expansions, group.groupName)
32+
? _.without(expansions, group.groupName)
33+
: _.concat(expansions, group.groupName);
34+
}
35+
36+
37+
function selectAssessment(evt) {
38+
onSelect(evt.detail);
39+
}
40+
41+
42+
function toggleFavourite(row) {
43+
44+
const isExplicitlyIncluded = _.includes($favouriteIncludedIds, row.definition.id);
45+
const isExplicitlyExcluded = _.includes($favouriteExcludedIds, row.definition.id);
46+
const isDefault = _.includes($defaultPrimaryList, row.definition.id);
47+
48+
let message;
49+
50+
if (isExplicitlyIncluded) {
51+
message = "Removing from favourite assessments"
52+
$favouriteIncludedIds = _.without($favouriteIncludedIds, row.definition.id);
53+
} else if (isExplicitlyExcluded) {
54+
message = "Adding to favourite assessments"
55+
$favouriteExcludedIds = _.without($favouriteExcludedIds, row.definition.id);
56+
} else if (isDefault) {
57+
message = "Removing from favourite assessments"
58+
$favouriteExcludedIds = _.concat($favouriteExcludedIds, row.definition.id);
59+
} else {
60+
message = "Adding to favourite assessments"
61+
$favouriteIncludedIds = _.concat($favouriteIncludedIds, row.definition.id);
62+
}
63+
}
64+
65+
66+
$: {
67+
if (primaryEntityRef) {
68+
stores = createStores(primaryEntityRef);
69+
defaultPrimaryList = stores.defaultPrimaryList
70+
favouriteIncludedIds = stores.favouriteIncludedIds,
71+
favouriteExcludedIds = stores.favouriteExcludedIds,
72+
favouriteIds = stores.favouriteIds,
73+
setFromPreferences = stores.setFromPreferences
74+
}
75+
}
76+
77+
78+
$: userPreferences = $userPreferenceCall.data;
79+
80+
81+
$: {
82+
if (userPreferences && stores) {
83+
setFromPreferences(userPreferences)
84+
}
85+
}
86+
87+
88+
$: expansions = _
89+
.chain(assessments)
90+
.filter(d => _.includes($favouriteIds, d.definition.id))
91+
.map(d => d.definition.definitionGroup)
92+
.uniq()
93+
.value();
94+
95+
96+
$: groupedAssessments = _.chain(assessments)
97+
.groupBy(d => d.definition?.definitionGroup)
98+
.map((v, k) => {
99+
100+
const [notProvided, provided] = _
101+
.chain(v)
102+
.orderBy(d => d.definition.name)
103+
.partition(d => d.rating == null)
104+
.value()
105+
106+
return {
107+
groupName: k,
108+
notProvided,
109+
provided
110+
}
111+
})
112+
.orderBy([d => d.groupName === "Uncategorized", d => d.groupName])
113+
.value();
114+
115+
116+
$: {
117+
if (stores) {
118+
$defaultPrimaryList = _
119+
.chain(assessments)
120+
.filter(a => a.definition.visibility === "PRIMARY")
121+
.map(r => r.definition.id)
122+
.value();
123+
}
124+
}
125+
126+
</script>
127+
128+
129+
<div class="row">
130+
131+
<div class="col-sm-12">
132+
133+
<table class="table table-hover table-condensed">
134+
<colgroup>
135+
<col width="10%"/>
136+
<col width="50%"/>
137+
<col width="40%"/>
138+
</colgroup>
139+
{#each groupedAssessments as group}
140+
<tbody>
141+
<tr style="background-color: #eee">
142+
<td>
143+
<button class="btn btn-skinny"
144+
on:click={() => toggleGroup(group)}>
145+
<Icon size="lg"
146+
name={_.includes(expansions, group.groupName) ? "caret-down" : "caret-right"}/>
147+
</button>
148+
</td>
149+
<td colspan="2">
150+
<strong>
151+
<span>{group.groupName}</span>
152+
</strong>
153+
</td>
154+
</tr>
155+
{#if _.includes(expansions, group.groupName)}
156+
<AssessmentRatingListGroup group={group}
157+
on:select={selectAssessment}
158+
toggleFavourite={toggleFavourite}
159+
favouriteIds={favouriteIds}/>
160+
{/if}
161+
</tbody>
162+
{/each}
163+
</table>
164+
</div>
165+
166+
</div>
167+

0 commit comments

Comments
 (0)