Skip to content

Commit

Permalink
Merge pull request #6150 from deutschebank/db-contrib/waltz-6098-asse…
Browse files Browse the repository at this point in the history
…ssment-ratings-into-groups

Db contrib/waltz 6098 assessment ratings into groups
davidwatkins73 authored Jul 26, 2022
2 parents 72f6db9 + 87ce214 commit 996a4f0
Showing 22 changed files with 671 additions and 86 deletions.
1 change: 1 addition & 0 deletions waltz-data/src/main/ddl/liquibase/db.changelog-1.43.xml
Original file line number Diff line number Diff line change
@@ -157,4 +157,5 @@
<column name="user_selectable" valueBoolean="true"/>
</insert>
</changeSet>

</databaseChangeLog>
Original file line number Diff line number Diff line change
@@ -65,6 +65,7 @@ public class AssessmentDefinitionDao {
.isReadOnly(record.getIsReadonly())
.provenance(record.getProvenance())
.visibility(AssessmentVisibility.valueOf(record.getVisibility()))
.definitionGroup(record.getDefinitionGroup())
.qualifierReference(maybeReadRef(
record,
ASSESSMENT_DEFINITION.QUALIFIER_KIND,
@@ -114,6 +115,7 @@ public Collection<AssessmentDefinition> findByEntityKindAndQualifier(EntityKind
/**
* Saves the given assessment definition. Either updating or inserting.
* Returns the identifier for the record.
*
* @param def the definition to save
* @return the identifier for the record
*/
@@ -138,15 +140,16 @@ public Long save(AssessmentDefinition def) {
r.setLastUpdatedAt(Timestamp.valueOf(def.lastUpdatedAt()));
r.setLastUpdatedBy(def.lastUpdatedBy());
r.setProvenance(StringUtilities.ifEmpty(def.provenance(), "waltz"));
r.setDefinitionGroup(r.getDefinitionGroup());

def.qualifierReference()
.ifPresent(qualifier -> {
r.setQualifierId(qualifier.id());
r.setQualifierKind(qualifier.kind().name());
});
.ifPresent(qualifier -> {
r.setQualifierId(qualifier.id());
r.setQualifierKind(qualifier.kind().name());
});

def.id()
.ifPresent(r::setId);
.ifPresent(r::setId);

if (r.getId() == null) {
r.insert();
Original file line number Diff line number Diff line change
@@ -47,6 +47,11 @@ public abstract class AssessmentDefinition implements

public abstract AssessmentVisibility visibility();

@Value.Default
public String definitionGroup() {
return "Uncategorized";
}

@Value.Default
public EntityKind kind() {
return EntityKind.ASSESSMENT_DEFINITION;
15 changes: 15 additions & 0 deletions waltz-ng/client/assessments/assessment-utils.js
Original file line number Diff line number Diff line change
@@ -230,4 +230,19 @@ function loadAssessments($q, serviceBroker, kind, ratingsPromise, primaryOnly =
assessmentsByEntityId: enrichedByEntityId // assessmentsByEntityId: entity id -> assessment def external id -> assessment
};
});
}


export function isFavourite(favouriteDefinitionIds, id) {
return _.includes(favouriteDefinitionIds, id);
}


export function getIdsFromString(includedFavouritesString) {
return _.isNil(includedFavouritesString)
? []
: _.chain(includedFavouritesString.value)
.split(",")
.map(idString => _.toNumber(idString))
.value();
}
Original file line number Diff line number Diff line change
@@ -4,7 +4,10 @@
import Markdown from "../../../common/svelte/Markdown.svelte";
import Icon from "../../../common/svelte/Icon.svelte";
import {fade} from 'svelte/transition';
export let assessment;
$: console.log({assessment});
</script>


Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@
import {initialiseData} from "../../../common";
import _ from "lodash";
import template from "./assessment-rating-favourites-list.html";
import {mkAssessmentDefinitionsIdsKey} from "../../../user";
import {mkAssessmentDefinitionsIdsBaseKey} from "../../../user";
import {CORE_API} from "../../../common/services/core-api-utils";


@@ -82,7 +82,7 @@ function controller(serviceBroker) {
serviceBroker
.loadAppData(CORE_API.UserPreferenceStore.findAllForUser, [], {force: true})
.then(r => vm.favouriteAssessmentDefnIds = getFavouriteAssessmentDefnIds(
mkAssessmentDefinitionsIdsKey(vm.parentEntityRef),
mkAssessmentDefinitionsIdsBaseKey(vm.parentEntityRef),
r.data,
vm.defaultPrimaryList))
.then(() => filterAssessments());
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<script>
import Markdown from "../../../common/svelte/Markdown.svelte";
import Icon from "../../../common/svelte/Icon.svelte";
export let definition;
</script>


<h4>
{definition.name}
<span class="text-muted small">({definition.externalId})</span>
</h4>
<Markdown class="force-wrap" text={definition.description}/>

{#if definition.isReadOnly}
<div class="help-block small">
<Icon name="lock"/>
Assessments relating to this definition are read-only and cannot be edited.
</div>
{/if}
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
<script>
import _ from "lodash";
import {userPreferenceStore} from "../../../svelte-stores/user-preference-store";
import {onMount} from "svelte";
import {createStores} from "./assessment-rating-store";
import AssessmentRatingListGroup from "./AssessmentRatingListGroup.svelte";
import Icon from "../../../common/svelte/Icon.svelte";
let elem;
let stores = null;
let defaultPrimaryList;
let favouriteIncludedIds;
let favouriteExcludedIds;
let favouriteIds;
let setFromPreferences;
let userPreferenceCall = userPreferenceStore.findAllForUser();
export let assessments = [];
export let primaryEntityRef = [];
export let onSelect = (d) => console.log("selected", d);
onMount(() => {
userPreferenceCall = userPreferenceStore.findAllForUser();
})
function toggleGroup(group) {
expansions = _.includes(expansions, group.groupName)
? _.without(expansions, group.groupName)
: _.concat(expansions, group.groupName);
}
function selectAssessment(evt) {
onSelect(evt.detail);
}
function toggleFavourite(row) {
const isExplicitlyIncluded = _.includes($favouriteIncludedIds, row.definition.id);
const isExplicitlyExcluded = _.includes($favouriteExcludedIds, row.definition.id);
const isDefault = _.includes($defaultPrimaryList, row.definition.id);
let message;
if (isExplicitlyIncluded) {
message = "Removing from favourite assessments"
$favouriteIncludedIds = _.without($favouriteIncludedIds, row.definition.id);
} else if (isExplicitlyExcluded) {
message = "Adding to favourite assessments"
$favouriteExcludedIds = _.without($favouriteExcludedIds, row.definition.id);
} else if (isDefault) {
message = "Removing from favourite assessments"
$favouriteExcludedIds = _.concat($favouriteExcludedIds, row.definition.id);
} else {
message = "Adding to favourite assessments"
$favouriteIncludedIds = _.concat($favouriteIncludedIds, row.definition.id);
}
}
$: {
if (primaryEntityRef) {
stores = createStores(primaryEntityRef);
defaultPrimaryList = stores.defaultPrimaryList
favouriteIncludedIds = stores.favouriteIncludedIds,
favouriteExcludedIds = stores.favouriteExcludedIds,
favouriteIds = stores.favouriteIds,
setFromPreferences = stores.setFromPreferences
}
}
$: userPreferences = $userPreferenceCall.data;
$: {
if (userPreferences && stores) {
setFromPreferences(userPreferences)
}
}
$: expansions = _
.chain(assessments)
.filter(d => _.includes($favouriteIds, d.definition.id))
.map(d => d.definition.definitionGroup)
.uniq()
.value();
$: groupedAssessments = _.chain(assessments)
.groupBy(d => d.definition?.definitionGroup)
.map((v, k) => {
const [notProvided, provided] = _
.chain(v)
.orderBy(d => d.definition.name)
.partition(d => d.rating == null)
.value()
return {
groupName: k,
notProvided,
provided
}
})
.orderBy([d => d.groupName === "Uncategorized", d => d.groupName])
.value();
$: {
if (stores) {
$defaultPrimaryList = _
.chain(assessments)
.filter(a => a.definition.visibility === "PRIMARY")
.map(r => r.definition.id)
.value();
}
}
</script>
<div class="row">
<div class="col-sm-12">
<table class="table table-hover table-condensed">
<colgroup>
<col width="10%"/>
<col width="50%"/>
<col width="40%"/>
</colgroup>
{#each groupedAssessments as group}
<tbody>
<tr style="background-color: #eee">
<td>
<button class="btn btn-skinny"
on:click={() => toggleGroup(group)}>
<Icon size="lg"
name={_.includes(expansions, group.groupName) ? "caret-down" : "caret-right"}/>
</button>
</td>
<td colspan="2">
<strong>
<span>{group.groupName}</span>
</strong>
</td>
</tr>
{#if _.includes(expansions, group.groupName)}
<AssessmentRatingListGroup group={group}
on:select={selectAssessment}
toggleFavourite={toggleFavourite}
favouriteIds={favouriteIds}/>
{/if}
</tbody>
{/each}
</table>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<script>
import {fade} from "svelte/transition";
import Icon from "../../../common/svelte/Icon.svelte";
import Tooltip from "./../../../common/svelte/Tooltip.svelte";
import {createEventDispatcher} from "svelte";
import _ from "lodash";
import RatingIndicatorCell from "../../../ratings/components/rating-indicator-cell/RatingIndicatorCell.svelte";
import AssessmentDefinitionTooltipContent from "./AssessmentDefinitionTooltipContent.svelte"
import AssessmentRatingTooltipContent from "./AssessmentRatingTooltipContent.svelte"
export let group;
export let toggleFavourite
export let favouriteIds
let notProvidedCollapsed = true;
const dispatch = createEventDispatcher();
function selectAssessment(row) {
dispatch("select", row);
}
function mkRatingTooltipProps(row) {
return {
rating: row.rating,
ratingItem: row.ratingItem
}
}
function mkDefinitionTooltipProps(row) {
return {
definition: row.definition
}
}
</script>

{#each group.provided as row}
<tr transition:fade
on:click={() => selectAssessment(row)}>
<td>
<button class="btn btn-skinny"
on:click={() => toggleFavourite(row)}>
<Icon size="lg"
name={_.includes($favouriteIds, row.definition.id) ? "star" : "star-o"}/>
</button>
</td>
<td>
<Tooltip content={AssessmentDefinitionTooltipContent}
props={mkDefinitionTooltipProps(row)}>
<svelte:fragment slot="target">
<span>
<Icon name={row.definition.isReadOnly ? "lock" : "fw"}/>
{row.definition.name}
</span>
</svelte:fragment>
</Tooltip>
</td>
<td>
<Tooltip content={AssessmentRatingTooltipContent}
props={mkRatingTooltipProps(row)}>
<svelte:fragment slot="target">
<RatingIndicatorCell {...row.ratingItem}
show-name="true"/>
{#if row.rating.comment}
<Icon name="sticky-note-o"/>
{/if}
</svelte:fragment>
</Tooltip>
</td>
</tr>
{/each}
{#if !_.isEmpty(group.notProvided)}
{#if notProvidedCollapsed}
<tr transition:fade>
<td>
<button class="btn btn-skinny"
on:click={() => notProvidedCollapsed = false}>
<Icon size="lg"
name="caret-right"/>
</button>
</td>
<td>
<strong>Not Rated</strong>
</td>
<td class="force-wrap">
<ul class="list-inline">
{#each group.notProvided as row}
{#if row.definition.isReadOnly}
<li class="force-wrap">
<span class="text-muted">
<Icon name="lock"/>{row.definition.name}
</span>
</li>
{:else}
<li class="force-wrap">
<a class="clickable"
on:click={() => selectAssessment(row)}>
{row.definition.name}
</a>
</li>
{/if}
{/each}
</ul>
</td>
</tr>
{:else}
<tr transition:fade>
<td>
<button class="btn btn-skinny"
on:click={() => notProvidedCollapsed = true}>
<Icon size="lg"
name="caret-down"/>
</button>
</td>
<td colspan="2">
<strong>Not Rated</strong>
</td>
</tr>
{#each group.notProvided as row}
<tr transition:fade>
<td>
<button class="btn btn-skinny"
on:click={() => toggleFavourite(row)}>
<Icon size="lg"
name={_.includes($favouriteIds, row.definition.id) ? "star" : "star-o"}/>
</button>
</td>
<td>
<Tooltip content={AssessmentDefinitionTooltipContent}
props={mkDefinitionTooltipProps(row)}>
<svelte:fragment slot="target">
<span>
<Icon name={row.definition.isReadOnly ? "lock" : "fw"}/>
{row.definition.name}
</span>
</svelte:fragment>
</Tooltip>
</td>
<td>
<span class="text-muted italics">Not Provided</span>
</td>
</tr>
{/each}
{/if}
{/if}


<style>
ul {
padding: 0.1em 0 0 0;
margin: 0 0 0 0;
list-style: none;
}
li::after {
content: ", ";
}
li:last-child::after {
content: "";
}
li {
padding-top: 0.1em;
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<script>
import Markdown from "../../../common/svelte/Markdown.svelte";
import Icon from "../../../common/svelte/Icon.svelte";
import LastEdited from "../../../common/svelte/LastEdited.svelte";
export let rating;
export let ratingItem;
</script>


<h4>{ratingItem.name}</h4>
<div>
{ratingItem.description}
</div>
{#if rating.comment}
<hr>
<span>
<Icon name="sticky-note-o"/>
<Markdown inline={true}
text={rating.comment}/>
</span>
{/if}
<div class="small">
Last Modified:
<LastEdited entity={rating}/>
</div>
Original file line number Diff line number Diff line change
@@ -19,10 +19,11 @@
import {initialiseData} from "../../../common";
import _ from "lodash";
import template from "./assessment-rating-list.html";
import {mkAssessmentDefinitionsIdsKey} from "../../../user";
import {mkAssessmentDefinitionsIdsBaseKey} from "../../../user";
import {CORE_API} from "../../../common/services/core-api-utils";
import {displayError} from "../../../common/error-utils";
import toasts from "../../../svelte-stores/toast-store";
import {isFavourite} from "../../assessment-utils";

const bindings = {
assessments: "<",
@@ -53,16 +54,13 @@ function getFavouriteAssessmentDefnIds(key, preferences, defaultList = []) {
function controller(serviceBroker) {
const vm = initialiseData(this, initialState);

function isFavourite(id) {
return _.includes(vm.favouriteAssessmentDefnIds, id);
}

const partitionAssessments = () => {
if (vm.assessments) {
const [notProvided, provided] = _
.chain(vm.assessments)
.sortBy(d => d.definition.name)
.map(a => Object.assign({}, a, { isFavourite: isFavourite(a.definition.id)}))
.map(a => Object.assign({}, a, {isFavourite: isFavourite(vm.favouriteAssessmentDefnIds, a.definition.id)}))
.partition(assessment => _.isNil(assessment.rating))
.value();

@@ -72,7 +70,7 @@ function controller(serviceBroker) {
};

vm.$onInit = () => {
vm.favouritesKey = mkAssessmentDefinitionsIdsKey(vm.parentEntityRef);
vm.favouritesKey = mkAssessmentDefinitionsIdsBaseKey(vm.parentEntityRef);
};

vm.$onChanges = () => {
@@ -90,7 +88,7 @@ function controller(serviceBroker) {

vm.toggleFavourite = (assessmentRatingId) => {

const alreadyFavourite = isFavourite(assessmentRatingId);
const alreadyFavourite = isFavourite(vm.favouriteAssessmentDefnIds, assessmentRatingId);

const newFavouritesList = (alreadyFavourite)
? _.without(vm.favouriteAssessmentDefnIds, assessmentRatingId)
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import {derived, writable} from "svelte/store";
import _ from "lodash";
import {mkAssessmentDefinitionsIdsBaseKey} from "../../../user";
import {userPreferenceStore} from "../../../svelte-stores/user-preference-store";
import {getIdsFromString} from "../../assessment-utils";

function writePreference(favouriteIncludedKey, $favouriteIncludedIds) {
const userPreference = {key: favouriteIncludedKey, value: $favouriteIncludedIds.toString()};
userPreferenceStore.saveForUser(userPreference);
}

export function createStores(primaryEntityRef) {

const baseKey = mkAssessmentDefinitionsIdsBaseKey(primaryEntityRef);
const favouriteIncludedKey = `${baseKey}.included`;
const favouriteExcludedKey = `${baseKey}.excluded`;

const defaultPrimaryList = writable([]);
const favouriteExcludedIds = writable([]);
const favouriteIncludedIds = writable([]);

const favouriteIds = derived(
[defaultPrimaryList, favouriteExcludedIds, favouriteIncludedIds],

([$defaultPrimaryList, $favouriteExcludedIds, $favouriteIncludedIds]) => {
return _.reject(
_.concat($defaultPrimaryList, $favouriteIncludedIds),
d => _.includes($favouriteExcludedIds, d));
})

favouriteIds.subscribe(() => {
})

derived([favouriteIncludedIds], ($favouriteIncludedIds) => {
writePreference(favouriteIncludedKey, $favouriteIncludedIds);
}).subscribe(() => {
});

derived([favouriteExcludedIds], ($favouriteExcludedIds) => {
writePreference(favouriteExcludedKey, $favouriteExcludedIds);
}).subscribe(() => {
});

function setFromPreferences(userPreferences) {

const includedFavouritesString = _.find(userPreferences, d => d.key === favouriteIncludedKey)
const excludedFavouritesString = _.find(userPreferences, d => d.key === favouriteExcludedKey)

favouriteIncludedIds.set(getIdsFromString(includedFavouritesString));
favouriteExcludedIds.set(getIdsFromString(excludedFavouritesString));
}

return {
defaultPrimaryList,
favouriteIncludedIds,
favouriteExcludedIds,
favouriteIds,
setFromPreferences
}
}
Original file line number Diff line number Diff line change
@@ -18,39 +18,40 @@


<div class="row">
<div class="col-sm-12" style="padding: 5px 0">
<div class="col-sm-6">
<waltz-assessment-rating-list assessments="$ctrl.assessments"
parent-entity-ref="$ctrl.parentEntityRef"
on-select="$ctrl.onSelect">
</waltz-assessment-rating-list>
<p class="help-block"
style="padding-top: 1em">
Assessments associated to this:
<span ng-bind="$ctrl.parentEntityRef.kind | toDisplayName:'entity'"></span>.
Click the stars in the first column to configure which assessments appear at the top of the screen for all
<span ng-bind="$ctrl.parentEntityRef.kind | toDisplayName:'entity'"></span>
pages.

</p>
<div class="col-sm-6">
<waltz-svelte-component ng-if="$ctrl.assessments"
component="$ctrl.AssessmentList"
primary-entity-ref="$ctrl.parentEntityRef"
assessments="$ctrl.assessments"
on-select="$ctrl.onSelect">
</waltz-svelte-component>
<p class="help-block"
style="padding-top: 1em">
Assessments associated to this:
<span ng-bind="$ctrl.parentEntityRef.kind | toDisplayName:'entity'"></span>.
Click the stars in the first column to configure which assessments appear at the top of the screen for all
<span ng-bind="$ctrl.parentEntityRef.kind | toDisplayName:'entity'"></span>
pages.

</p>
</div>
<div class="col-sm-6">
<div class="text-muted"
ng-if="$ctrl.assessments.length > 0 && !$ctrl.selectedAssessment">
<waltz-icon name="info-circle"></waltz-icon>
Select a rating for more information or to edit
</div>
<div class="col-sm-6">
<div class="text-muted"
ng-if="$ctrl.assessments.length > 0 && !$ctrl.selectedAssessment">
<waltz-icon name="info-circle"></waltz-icon>
Select a rating for more information or to edit
</div>
<div ng-if="$ctrl.selectedAssessment">
<waltz-svelte-component component="$ctrl.AssessmentEditor"
assessment="$ctrl.selectedAssessment"
on-close="$ctrl.onClose"
do-remove="$ctrl.onRemove"
do-save="$ctrl.onSave"
do-lock="$ctrl.onLock"
do-unlock="$ctrl.onUnlock"
permissions="$ctrl.permissions">
</waltz-svelte-component>
</div>
<div ng-if="$ctrl.selectedAssessment">
<waltz-svelte-component component="$ctrl.AssessmentEditor"
assessment="$ctrl.selectedAssessment"
on-close="$ctrl.onClose"
do-remove="$ctrl.onRemove"
do-save="$ctrl.onSave"
do-lock="$ctrl.onLock"
do-unlock="$ctrl.onUnlock"
permissions="$ctrl.permissions">
</waltz-svelte-component>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@ import {resolveResponses} from "../../../common/promise-utils";
import _ from "lodash";
import toasts from "../../../svelte-stores/toast-store";
import AssessmentEditor from "../editor/AssessmentEditor.svelte";
import AssessmentList from "../list/AssessmentRatingList.svelte";

const bindings = {
parentEntityRef: "<",
@@ -34,6 +35,7 @@ const bindings = {

const initialState = {
AssessmentEditor,
AssessmentList,
permissions: []
};

44 changes: 44 additions & 0 deletions waltz-ng/client/common/svelte/Tooltip.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<script>
import tippy from "tippy.js";
import 'tippy.js/dist/tippy.css';
import 'tippy.js/themes/light-border.css';
let elem;
let contentElem;
let open = false;
export let content;
export let props
$: {
if (elem && content) {
tippy(elem, {
content: "loading",
arrow: true,
interactive: true,
trigger: 'mouseenter click',
theme: "light-border",
onShow(instance) {
open = true;
setTimeout(() => instance.setContent(contentElem), 100);
}
});
}
}
</script>

<span bind:this={elem}>
<slot name="target"></slot>
</span>

<div style="display: none">
<div bind:this={contentElem}>
{#if open}
<svelte:component this={content} {...props}/>
{/if}
</div>
</div>
14 changes: 7 additions & 7 deletions waltz-ng/client/dynamic-section/dynamic-section-definitions.js
Original file line number Diff line number Diff line change
@@ -562,13 +562,13 @@ const orgUnitSections = [

const measurableSections = [
pack(appsSection,
[
appCostsSummarySection,
appComplexitySummarySection,
entityStatisticSummarySection,
reportGridViewSection,
technologySummarySection
]),
[
appCostsSummarySection,
appComplexitySummarySection,
entityStatisticSummarySection,
reportGridViewSection,
technologySummarySection
]),
bookmarksSection,
assessmentRatingSection,
changeSetSection,
46 changes: 46 additions & 0 deletions waltz-ng/client/svelte-stores/user-preference-store.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Waltz - Enterprise Architecture
* Copyright (C) 2016, 2017, 2018, 2019 Waltz open source project
* See README.md for more information
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific
*
*/

import {remote} from "./remote";

export function mkUserPreferenceStore() {

const findAllForUser = (force) => {
return remote
.fetchViewList(
"GET",
"api/user-preference",
[],
{force});
};

const saveForUser = (preference) => {
return remote
.execute(
"POST",
"api/user-preference/save",
preference);
};

return {
findAllForUser,
saveForUser
};
}

export const userPreferenceStore = mkUserPreferenceStore();
Original file line number Diff line number Diff line change
@@ -5,7 +5,12 @@
import {ratingSchemeStore} from "../../../svelte-stores/rating-schemes";
import {assessmentRatingStore} from "../../../svelte-stores/assessment-rating";
import {getRequiredFields, possibleVisibility, possibleEntityKinds, selectedDefinition} from "./assessment-definition-utils";
import {
getRequiredFields,
possibleVisibility,
possibleEntityKinds,
selectedDefinition
} from "./assessment-definition-utils";
import MeasurableCategoryPicker from "./MeasurableCategoryPicker.svelte";
export let doCancel;
@@ -101,7 +106,7 @@
disabled={hasRatings}
bind:value={$selectedDefinition.entityKind}>

{#each possibleEntityKinds as k}
{#each possibleEntityKinds as k}
<option value={k.value}>
{k.name}
</option>
@@ -132,7 +137,8 @@
{#if hasRatings}
<br>
<Icon name="warning"/>
The associated category qualifier for this definition cannot be changed as ratings already exist.
The associated category qualifier for this definition cannot be changed as ratings
already exist.
{/if}
</svelte:fragment>
</MeasurableCategoryPicker>
Original file line number Diff line number Diff line change
@@ -149,12 +149,12 @@
<table class="table table-condensed table-striped table-hover"
style="table-layout: fixed">
<thead>
<tr>
<th style="width:25%">Name</th>
<th style="width:25%">Rating Scheme</th>
<th style="width:20%">Applicable Kind</th>
<th style="width:30%">Operations</th>
</tr>
<tr>
<th style="width:25%">Name</th>
<th style="width:25%">Rating Scheme</th>
<th style="width:20%">Applicable Kind</th>
<th style="width:30%">Operations</th>
</tr>
</thead>
<tbody>
{#each definitionList as def}
4 changes: 2 additions & 2 deletions waltz-ng/client/user/index.js
Original file line number Diff line number Diff line change
@@ -39,9 +39,9 @@ export const groupLogicalFlowFilterExcludedTagIdsKey = "main.group-views.logical
export const favouriteAssessmentDefinitionIdsKey = "main.app-view.assessment-rating.favouriteAssessmentDefnIds";
export const lastViewedFlowTabKey = "main.app-view.data-flows.lastTab";

export function mkAssessmentDefinitionsIdsKey(entityReference) {
export function mkAssessmentDefinitionsIdsBaseKey(entityReference) {
checkIsEntityRef(entityReference);
return favouriteAssessmentDefinitionIdsKey + _.camelCase(entityReference.kind);
return `${favouriteAssessmentDefinitionIdsKey}.${_.camelCase(entityReference.kind)}`;
}

export default () => {
13 changes: 13 additions & 0 deletions waltz-ng/package-lock.json
47 changes: 24 additions & 23 deletions waltz-ng/package.json
Original file line number Diff line number Diff line change
@@ -42,29 +42,30 @@
"d3-ease": "1.0.7",
"d3-force": "1.0.6",
"d3-format": "1.0.2",
"d3-interpolate": "1.1.6",
"d3-path": "1.0.9",
"d3-sankey": "0.12.3",
"d3-scale": "1.0.7",
"d3-selection": "1.0.6",
"d3-selection-multi": "1.0.1",
"d3-shape": "1.0.6",
"d3-time-format": "2.0.5",
"d3-transition": "1.0.4",
"d3-zoom": "1.8.3",
"font-awesome": "4.7.0",
"html2canvas": "^1.4.1",
"json-stable-stringify": "1.0.1",
"lodash": "4.17.21",
"moment": "2.29.1",
"ng-showdown": "1.1.0",
"ng-tags-input": "3.2.0",
"patch-package": "6.4.7",
"satellizer": "0.15.5",
"svelte-flatpickr": "3.2.4",
"ui-select": "0.19.8",
"whatwg-fetch": "3.6.2",
"xlsx": "0.17.3"
"d3-interpolate": "1.1.6",
"d3-path": "1.0.9",
"d3-sankey": "0.12.3",
"d3-scale": "1.0.7",
"d3-selection": "1.0.6",
"d3-selection-multi": "1.0.1",
"d3-shape": "1.0.6",
"d3-time-format": "2.0.5",
"d3-transition": "1.0.4",
"d3-zoom": "1.8.3",
"font-awesome": "4.7.0",
"html2canvas": "^1.4.1",
"json-stable-stringify": "1.0.1",
"lodash": "4.17.21",
"moment": "2.29.1",
"ng-showdown": "1.1.0",
"ng-tags-input": "3.2.0",
"patch-package": "6.4.7",
"satellizer": "0.15.5",
"svelte-flatpickr": "3.2.4",
"tippy.js": "^6.3.7",
"ui-select": "0.19.8",
"whatwg-fetch": "3.6.2",
"xlsx": "0.17.3"
},
"devDependencies": {
"@babel/core": "7.16.0",

0 comments on commit 996a4f0

Please sign in to comment.