From 770945b5cd36d946cab84c61dc2c5d1c432c7bb7 Mon Sep 17 00:00:00 2001 From: David Watkins Date: Sat, 2 Dec 2023 10:18:29 +0000 Subject: [PATCH 1/2] Filter based on flow classifications #6887 --- .../flow-detail-tab/FlowDetailPanel.svelte | 8 +- .../filters/FlowClassificationFilters.svelte | 95 +++++++++++++++++++ .../filters/FlowDetailFilters.svelte | 23 ++++- .../flow-detail-tab/filters/filter-utils.js | 24 ++++- 4 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/FlowClassificationFilters.svelte diff --git a/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/FlowDetailPanel.svelte b/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/FlowDetailPanel.svelte index 6b7b54a57d..8b1419a0e5 100644 --- a/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/FlowDetailPanel.svelte +++ b/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/FlowDetailPanel.svelte @@ -8,7 +8,7 @@ import {filters, resetFlowDetailsStore, selectedLogicalFlow, selectedPhysicalFlow} from "./flow-details-store"; import PhysicalFlowTable from "./PhysicalFlowTable.svelte"; import {mkFlowDetails} from "./flow-detail-utils"; - import {mkAssessmentFilters} from "./filters/filter-utils"; + import {getAssessmentFilters} from "./filters/filter-utils"; import SelectedFlowDetailPanel from "./SelectedFlowDetailPanel.svelte"; import {onMount} from "svelte"; import DataExtractLink from "../../../../common/svelte/DataExtractLink.svelte"; @@ -18,7 +18,6 @@ export let parentEntityRef; function filterFlows(allFlows, filters) { - console.log("ff", {allFlows, filters}) return _ .chain(allFlows) .map(d => Object.assign(d, {visible: _.every(filters, f => f.test(d))})) @@ -35,6 +34,8 @@ let mappedDataTypes = []; let assessmentFilters = []; let dataTypes = []; + let allDataTypes = []; + let flowClassifications = []; let allFlows = []; let physicalFlows = []; let logicalFlows = []; @@ -71,7 +72,7 @@ const mappedDataTypeIds = _.map(mappedDataTypes, d => d.dataTypeId); dataTypes = reduceToSelectedNodesOnly(allDataTypes, mappedDataTypeIds); - assessmentFilters = mkAssessmentFilters(flowView); + assessmentFilters = getAssessmentFilters(flowView); allFlows = mkFlowDetails(flowView, parentEntityRef); } } @@ -89,6 +90,7 @@
+ import { + mkClassificationFilterId, + mkClassificationFilter, + FilterKinds + } from "./filter-utils"; + import _ from "lodash"; + import {filters, updateFilters} from "../flow-details-store"; + import RatingIndicatorCell + from "../../../../../ratings/components/rating-indicator-cell/RatingIndicatorCell.svelte"; + + + export let flowClassifications = []; + + function selectClassification(classification) { + + const filterId = mkClassificationFilterId(); + + const existingFilter = _.find($filters, f => f.id === filterId); + + const existingClassifications = _.get(existingFilter, "classifications", []); + + const newClassifications = _.some(existingClassifications, r => _.isEqual(r, classification.code)) + ? _.filter(existingClassifications, d => !_.isEqual(d, classification.code)) + : _.concat(existingClassifications, [classification.code]); + + const newFilter = mkClassificationFilter(filterId, newClassifications) + + updateFilters(filterId, newFilter); + } + + + function isSelected(filters, fcCode){ + const classificationFilter = _.find( + filters, + f => f.id === mkClassificationFilterId()); + return _.some( + _.get(classificationFilter, "classifications", []), + selectedFcCode => fcCode === selectedFcCode); + } + + function onClearFilters() { + $filters = _.reject($filters, f => f.kind === FilterKinds.FLOW_CLASSIFICATION); + } + + $: hasFilters = _.some($filters, f => f.kind === FilterKinds.FLOW_CLASSIFICATION); + + + +
+ Filters the flows based upon their classification ratings. +
+
+ + + + + + + + + {#each _.orderBy(flowClassifications, d => d.name) as fc} + selectClassification(fc)}> + + + + {/each} + +
+ Flow Classification + + {#if hasFilters} + + {/if} +
+ + + {fc.description} +
+
+ + \ No newline at end of file diff --git a/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/FlowDetailFilters.svelte b/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/FlowDetailFilters.svelte index 70f7bcebd6..8112e6b0f3 100644 --- a/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/FlowDetailFilters.svelte +++ b/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/FlowDetailFilters.svelte @@ -8,10 +8,16 @@ import AssessmentFilters from "./AssessmentFilters.svelte"; import InboundOutboundFilters from "./InboundOutboundFilters.svelte"; import PhysicalFlowAttributeFilters from "./PhysicalFlowAttributeFilters.svelte"; import DataTypeFilters from "./DataTypeFilters.svelte"; +import FlowClassificationFilters from "./FlowClassificationFilters.svelte"; export let dataTypes = []; export let assessmentFilters = []; export let physicalFlows = []; +export let flowClassifications = []; + + +$: classificationFilter = _.find($filters, d => d.kind === FilterKinds.FLOW_CLASSIFICATION); +$: directionFilter = _.find($filters, d => d.kind === FilterKinds.DIRECTION); @@ -28,8 +34,8 @@ export let physicalFlows = [];
- Flow Direction & Classification - {#if _.some($filters, d => d.kind === FilterKinds.DIRECTION) && _.find($filters, d => d.kind === FilterKinds.DIRECTION).direction !== Directions.ALL} + Flow Direction + {#if !_.isEqual(_.get(directionFilter, ["direction"], Directions.ALL), Directions.ALL)} @@ -39,6 +45,19 @@ export let physicalFlows = [];
+
+ + Flow Classification + {#if !_.isEmpty(_.get(classificationFilter, ["classifications"], []))} + + + + {/if} + + +
+
Data Types diff --git a/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/filter-utils.js b/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/filter-utils.js index 089feee4fe..0b00910e42 100644 --- a/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/filter-utils.js +++ b/waltz-ng/client/data-flow/components/svelte/flow-detail-tab/filters/filter-utils.js @@ -6,10 +6,11 @@ export const FilterKinds = { DATA_TYPE: "DATA_TYPE", ASSESSMENT: "ASSESSMENT", PHYSICAL_FLOW_ATTRIBUTE: "PHYSICAL_FLOW_ATTRIBUTE", - SELECTED_LOGICAL: "SELECTED_LOGICAL" + SELECTED_LOGICAL: "SELECTED_LOGICAL", + FLOW_CLASSIFICATION: "FLOW_CLASSIFICATION" } -export function mkAssessmentFilters(flowView) { +export function getAssessmentFilters(flowView) { const ratingSchemeItemsById = _.keyBy(flowView.ratingSchemeItems, d => d.id); const definitions = _.compact(_.concat( @@ -57,6 +58,10 @@ export function mkDefinitionFilterId(definitionId) { return `ASSESSMENT_DEFINITION_${definitionId}`; } +export function mkClassificationFilterId() { + return `FLOW_CLASSIFICATION`; +} + export function mkDataTypeFilterId() { return "DATA_TYPE"; } @@ -134,3 +139,18 @@ export function mkDirectionFilter(id, direction) { : _.isEqual(r.direction, direction) }; } + +export function mkClassificationFilter(id, desiredClassificationRatings = []) { + return { + id, + kind: FilterKinds.FLOW_CLASSIFICATION, + classifications: desiredClassificationRatings, + test: flowRow => _.isEmpty(desiredClassificationRatings) + ? true + : _.some( + flowRow.dataTypesForLogicalFlow, + x => _.some( + desiredClassificationRatings, + d => _.isEqual(d, x.rating))) + } +} \ No newline at end of file From f568cac4a56f041032558a42ee8d01691f537d6b Mon Sep 17 00:00:00 2001 From: David Watkins Date: Mon, 4 Dec 2023 09:20:54 +0000 Subject: [PATCH 2/2] Filter based on flow classifications #6887 --- .../flow_classification_rule/FlowClassificationService.java | 4 ---- .../waltz/web/endpoints/api/FlowClassificationEndpoint.java | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/waltz-service/src/main/java/org/finos/waltz/service/flow_classification_rule/FlowClassificationService.java b/waltz-service/src/main/java/org/finos/waltz/service/flow_classification_rule/FlowClassificationService.java index 9ee7578ea0..5c27897734 100644 --- a/waltz-service/src/main/java/org/finos/waltz/service/flow_classification_rule/FlowClassificationService.java +++ b/waltz-service/src/main/java/org/finos/waltz/service/flow_classification_rule/FlowClassificationService.java @@ -20,8 +20,6 @@ import org.finos.waltz.data.flow_classification_rule.FlowClassificationDao; import org.finos.waltz.model.flow_classification.FlowClassification; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -33,8 +31,6 @@ @Service public class FlowClassificationService { - private static final Logger LOG = LoggerFactory.getLogger(FlowClassificationService.class); - private final FlowClassificationDao flowClassificationDao; @Autowired diff --git a/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/FlowClassificationEndpoint.java b/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/FlowClassificationEndpoint.java index b50d98ca5a..6145908e77 100644 --- a/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/FlowClassificationEndpoint.java +++ b/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/FlowClassificationEndpoint.java @@ -42,17 +42,13 @@ public class FlowClassificationEndpoint implements Endpoint { private static final String BASE_URL = WebUtilities.mkPath("api", "flow-classification"); private final FlowClassificationService flowClassificationService; - private final UserRoleService userRoleService; @Autowired - public FlowClassificationEndpoint(FlowClassificationService flowClassificationService, - UserRoleService userRoleService) { + public FlowClassificationEndpoint(FlowClassificationService flowClassificationService) { checkNotNull(flowClassificationService, "flowClassificationService must not be null"); - checkNotNull(userRoleService, "userRoleService cannot be null"); this.flowClassificationService = flowClassificationService; - this.userRoleService = userRoleService; }