diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramPresetDao.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramPresetDao.java new file mode 100644 index 0000000000..bea895d04b --- /dev/null +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramPresetDao.java @@ -0,0 +1,73 @@ +package org.finos.waltz.data.aggregate_overlay_diagram; + +import org.finos.waltz.common.DateTimeUtilities; +import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagramPreset; +import org.finos.waltz.model.aggregate_overlay_diagram.ImmutableAggregateOverlayDiagramPreset; +import org.finos.waltz.model.aggregate_overlay_diagram.OverlayDiagramPresetCreateCommand; +import org.finos.waltz.schema.tables.records.AggregateOverlayDiagramPresetRecord; +import org.jooq.DSLContext; +import org.jooq.Record; +import org.jooq.RecordMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.Set; + +import static org.finos.waltz.common.DateTimeUtilities.toLocalDateTime; +import static org.finos.waltz.schema.Tables.AGGREGATE_OVERLAY_DIAGRAM_PRESET; + +@Repository +public class AggregateOverlayDiagramPresetDao { + + protected static final RecordMapper TO_DOMAIN_MAPPER = r -> { + AggregateOverlayDiagramPresetRecord record = r.into(AGGREGATE_OVERLAY_DIAGRAM_PRESET); + return ImmutableAggregateOverlayDiagramPreset.builder() + .id(record.getId()) + .name(record.getName()) + .diagramId(record.getDiagramId()) + .description(record.getDescription()) + .externalId(record.getExternalId()) + .overlayConfig(record.getOverlayConfig()) + .filterConfig(record.getFilterConfig()) + .lastUpdatedAt(toLocalDateTime(record.getLastUpdatedAt())) + .lastUpdatedBy(record.getLastUpdatedBy()) + .provenance(record.getProvenance()) + .build(); + }; + + private final DSLContext dsl; + + @Autowired + public AggregateOverlayDiagramPresetDao(DSLContext dsl) { + this.dsl = dsl; + } + + public Set findPresetsForDiagram(Long diagramId) { + return dsl + .select(AGGREGATE_OVERLAY_DIAGRAM_PRESET.fields()) + .from(AGGREGATE_OVERLAY_DIAGRAM_PRESET) + .where(AGGREGATE_OVERLAY_DIAGRAM_PRESET.DIAGRAM_ID.eq(diagramId)) + .fetchSet(TO_DOMAIN_MAPPER::map); + } + + public int create(OverlayDiagramPresetCreateCommand createCommand, String username) { + + AggregateOverlayDiagramPresetRecord record = dsl.newRecord(AGGREGATE_OVERLAY_DIAGRAM_PRESET); + + record.setDiagramId(createCommand.diagramId()); + record.setName(createCommand.name()); + record.setDescription(createCommand.description()); + record.setExternalId(createCommand.externalId()); + record.setOverlayConfig(createCommand.overlayConfig()); + record.setFilterConfig(createCommand.filterConfig()); + record.setLastUpdatedAt(DateTimeUtilities.nowUtcTimestamp()); + record.setLastUpdatedBy(username); + record.setProvenance("waltz"); + + return dsl + .insertInto(AGGREGATE_OVERLAY_DIAGRAM_PRESET) + .set(record) + .execute(); + } + +} diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramUtilities.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramUtilities.java index 6359555a10..9882fcc847 100644 --- a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramUtilities.java +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregateOverlayDiagramUtilities.java @@ -5,30 +5,59 @@ import org.finos.waltz.model.EntityReference; import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagram; import org.finos.waltz.model.aggregate_overlay_diagram.ImmutableAggregateOverlayDiagram; +import org.finos.waltz.schema.tables.Application; +import org.finos.waltz.schema.tables.MeasurableRating; +import org.finos.waltz.schema.tables.MeasurableRatingPlannedDecommission; +import org.finos.waltz.schema.tables.MeasurableRatingReplacement; import org.finos.waltz.schema.tables.records.AggregateOverlayDiagramRecord; -import org.jooq.*; +import org.jooq.DSLContext; +import org.jooq.Field; +import org.jooq.Record; +import org.jooq.Record1; +import org.jooq.Record2; +import org.jooq.Record3; +import org.jooq.RecordMapper; +import org.jooq.Select; +import org.jooq.SelectConditionStep; import org.jooq.impl.DSL; import org.jooq.lambda.tuple.Tuple2; +import java.sql.Date; +import java.time.LocalDate; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import static java.lang.String.format; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; -import static java.util.stream.Collectors.*; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.mapping; +import static java.util.stream.Collectors.toMap; +import static java.util.stream.Collectors.toSet; import static org.finos.waltz.common.DateTimeUtilities.toLocalDateTime; import static org.finos.waltz.common.MapUtilities.groupBy; import static org.finos.waltz.common.SetUtilities.fromCollection; import static org.finos.waltz.data.JooqUtilities.readRef; -import static org.finos.waltz.schema.Tables.*; +import static org.finos.waltz.schema.Tables.AGGREGATE_OVERLAY_DIAGRAM; +import static org.finos.waltz.schema.Tables.AGGREGATE_OVERLAY_DIAGRAM_CELL_DATA; +import static org.finos.waltz.schema.Tables.APPLICATION; +import static org.finos.waltz.schema.Tables.ENTITY_HIERARCHY; +import static org.finos.waltz.schema.Tables.MEASURABLE_RATING; +import static org.finos.waltz.schema.Tables.MEASURABLE_RATING_PLANNED_DECOMMISSION; +import static org.finos.waltz.schema.Tables.MEASURABLE_RATING_REPLACEMENT; import static org.finos.waltz.schema.tables.EntityRelationship.ENTITY_RELATIONSHIP; import static org.jooq.lambda.tuple.Tuple.tuple; public class AggregateOverlayDiagramUtilities { + private static final MeasurableRating mr = MEASURABLE_RATING; + private static final Application app = APPLICATION; + private static final MeasurableRatingPlannedDecommission mrpd = MEASURABLE_RATING_PLANNED_DECOMMISSION; + private static final MeasurableRatingReplacement mrp = MEASURABLE_RATING_REPLACEMENT; + protected static final RecordMapper TO_DOMAIN_MAPPER = r -> { AggregateOverlayDiagramRecord record = r.into(AGGREGATE_OVERLAY_DIAGRAM); return ImmutableAggregateOverlayDiagram.builder() @@ -83,7 +112,8 @@ protected static SelectConditionStep> selectCellMa protected static Map> loadCellExtIdToAggregatedEntities(DSLContext dsl, long diagramId, EntityKind aggregatedEntityKind, - Select> inScopeEntityIdSelector) { + Select> inScopeEntityIdSelector, + Optional targetStateDate) { Set> cellMappings = loadExpandedCellMappingsForDiagram(dsl, diagramId); @@ -103,7 +133,8 @@ protected static Map> loadCellExtIdToAggregatedEntities(DSLCon dsl, aggregatedEntityKind, inScopeEntityIdSelector, - backingMeasurableEntityIds); + backingMeasurableEntityIds, + targetStateDate); return cellBackingEntitiesByCellExtId .entrySet() @@ -135,11 +166,12 @@ protected static Map> loadCellExtIdToAggregatedEntities(DSLCon private static Map> findMeasurableIdToAggregatedEntityIdMap(DSLContext dsl, EntityKind aggregatedEntityKind, Select> inScopeEntityIdSelector, - Set backingEntityIds) { + Set backingEntityIds, + Optional targetStateDate) { switch (aggregatedEntityKind) { case APPLICATION: - return loadMeasurableToAppIdsMap(dsl, inScopeEntityIdSelector, backingEntityIds); + return loadMeasurableToAppIdsMap(dsl, inScopeEntityIdSelector, backingEntityIds, targetStateDate); case CHANGE_INITIATIVE: return loadMeasurableToCIIdsMap(dsl, inScopeEntityIdSelector, backingEntityIds); default: @@ -181,7 +213,71 @@ private static Map> loadMeasurableToCIIdsMap(DSLContext dsl, private static Map> loadMeasurableToAppIdsMap(DSLContext dsl, Select> inScopeEntityIdSelector, - Set backingEntityReferences) { + Set backingEntityReferences, + Optional targetStateDate) { + return targetStateDate + .map(targetDate -> loadMeasurableToAppIdsMapUsingTargetState( + dsl, + inScopeEntityIdSelector, + backingEntityReferences, + targetDate)) + .orElse(loadMeasurableToAppIdsMapIgnoringTargetDate( + dsl, + inScopeEntityIdSelector, + backingEntityReferences)); + } + + + private static Map> loadMeasurableToAppIdsMapUsingTargetState(DSLContext dsl, + Select> inScopeEntityIdSelector, + Set backingEntityReferences, + LocalDate targetStateDate) { + Date targetDate = targetStateDate == null + ? null + : Date.valueOf(targetStateDate); + + + Field decommDate = DSL.coalesce( + mrpd.PLANNED_DECOMMISSION_DATE, + app.PLANNED_RETIREMENT_DATE); + + + Field appIdCol = DSL + .when(decommDate.isNull().or(decommDate.gt(targetDate)), + mr.ENTITY_ID) + .when(mrp.PLANNED_COMMISSION_DATE.lt(targetDate), + mrp.ENTITY_ID) + .otherwise((Long) null); + + SelectConditionStep> qry = dsl + .select(mr.MEASURABLE_ID, + appIdCol) + .from(mr) + .innerJoin(app) + .on(mr.ENTITY_ID + .eq(app.ID) + .and(mr.ENTITY_KIND.eq(EntityKind.APPLICATION.name()))) + .leftJoin(mrpd) + .on(mr.ENTITY_ID + .eq(mrpd.ENTITY_ID) + .and(mr.ENTITY_KIND + .eq(mrpd.ENTITY_KIND) + .and(mr.MEASURABLE_ID.eq(mrpd.MEASURABLE_ID)))) + .leftJoin(mrp) + .on(mrp.DECOMMISSION_ID.eq(mrpd.ID)) + .where(mr.ENTITY_ID.in(inScopeEntityIdSelector)) + .and(mr.MEASURABLE_ID.in(backingEntityReferences)); + + return qry + .fetchGroups( + mr.MEASURABLE_ID, + appIdCol); + } + + + private static Map> loadMeasurableToAppIdsMapIgnoringTargetDate(DSLContext dsl, + Select> inScopeEntityIdSelector, + Set backingEntityReferences) { return dsl .selectDistinct(MEASURABLE_RATING.MEASURABLE_ID, MEASURABLE_RATING.ENTITY_ID) .from(MEASURABLE_RATING) diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregatedEntitiesWidgetDao.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregatedEntitiesWidgetDao.java index a0b00e66ba..89d3727e8a 100644 --- a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregatedEntitiesWidgetDao.java +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AggregatedEntitiesWidgetDao.java @@ -9,7 +9,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.Map; +import java.util.Optional; import java.util.Set; import static java.lang.String.format; @@ -31,13 +33,15 @@ public AggregatedEntitiesWidgetDao(DSLContext dsl) { public Set findWidgetData(long diagramId, EntityKind aggregatedEntityKind, - Select> inScopeEntityIdSelector) { + Select> inScopeEntityIdSelector, + Optional targetStateDate) { Map> cellExtIdsToAggregatedEntities = loadCellExtIdToAggregatedEntities( dsl, diagramId, aggregatedEntityKind, - inScopeEntityIdSelector); + inScopeEntityIdSelector, + targetStateDate); Map entityIdToNameMap = loadEntityIdToNameMap(aggregatedEntityKind, inScopeEntityIdSelector); diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCostWidgetDao.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCostWidgetDao.java index cb5ea8dbeb..023485b4a2 100644 --- a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCostWidgetDao.java +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCostWidgetDao.java @@ -15,8 +15,10 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDate; import java.util.Collection; import java.util.Map; +import java.util.Optional; import java.util.Set; import static java.util.Collections.emptySet; @@ -62,13 +64,15 @@ public AppCostWidgetDao(DSLContext dsl) { public Set findWidgetData(long diagramId, Set costKindIds, long allocationSchemeId, - Select> inScopeApplicationSelector) { + Select> inScopeApplicationSelector, + Optional targetStateDate) { Map> cellExtIdsToBackingEntities = loadCellExtIdToAggregatedEntities( dsl, diagramId, EntityKind.APPLICATION, - inScopeApplicationSelector); + inScopeApplicationSelector, + targetStateDate); Set costData = fetchCostData( dsl, diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCountWidgetDao.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCountWidgetDao.java index ffb9b1c09d..e3753179fe 100644 --- a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCountWidgetDao.java +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AppCountWidgetDao.java @@ -13,6 +13,7 @@ import java.time.LocalDate; import java.util.Collection; import java.util.Map; +import java.util.Optional; import java.util.Set; import static java.util.stream.Collectors.toSet; @@ -41,7 +42,8 @@ public Set findWidgetData(long diagramId, dsl, diagramId, EntityKind.APPLICATION, - inScopeApplicationSelector); + inScopeApplicationSelector, + Optional.empty()); Set appIds = cellExtIdsToAggregatedEntities.values() .stream() diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AssessmentRatingWidgetDao.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AssessmentRatingWidgetDao.java index bbb7969842..4f83e008d1 100644 --- a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AssessmentRatingWidgetDao.java +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/AssessmentRatingWidgetDao.java @@ -7,12 +7,12 @@ import org.finos.waltz.model.aggregate_overlay_diagram.overlay.AssessmentRatingsWidgetDatum; import org.finos.waltz.model.aggregate_overlay_diagram.overlay.ImmutableAssessmentRatingCount; import org.finos.waltz.model.aggregate_overlay_diagram.overlay.ImmutableAssessmentRatingsWidgetDatum; -import org.finos.waltz.model.utils.IdUtilities; import org.finos.waltz.schema.tables.AssessmentRating; import org.jooq.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -41,13 +41,15 @@ public AssessmentRatingWidgetDao(DSLContext dsl, public Set findWidgetData(long diagramId, EntityKind aggregatedEntityKind, Long assessmentId, - Select> inScopeEntityIdSelector) { + Select> inScopeEntityIdSelector, + Optional targetStateDate) { Map> cellExtIdsToAggregatedEntities = loadCellExtIdToAggregatedEntities( dsl, diagramId, aggregatedEntityKind, - inScopeEntityIdSelector); + inScopeEntityIdSelector, + targetStateDate); Set diagramEntityIds = cellExtIdsToAggregatedEntities.values() .stream() diff --git a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/TargetAppCostWidgetDao.java b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/TargetAppCostWidgetDao.java index ad5298b402..0a4228aa9d 100644 --- a/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/TargetAppCostWidgetDao.java +++ b/waltz-data/src/main/java/org/finos/waltz/data/aggregate_overlay_diagram/TargetAppCostWidgetDao.java @@ -14,6 +14,7 @@ import java.time.LocalDate; import java.util.Collection; import java.util.Map; +import java.util.Optional; import java.util.Set; import static java.util.stream.Collectors.toSet; @@ -42,7 +43,8 @@ public Set findWidgetData(long diagramId, dsl, diagramId, EntityKind.APPLICATION, - inScopeApplicationSelector); + inScopeApplicationSelector, + Optional.empty()); Set diagramAppIds = cellExtIdsToAggregatedEntities .values() diff --git a/waltz-jobs/src/main/java/org/finos/waltz/jobs/harness/AggregateWidgetCostHarness.java b/waltz-jobs/src/main/java/org/finos/waltz/jobs/harness/AggregateWidgetCostHarness.java index cd265e61e8..9ca8fa1389 100644 --- a/waltz-jobs/src/main/java/org/finos/waltz/jobs/harness/AggregateWidgetCostHarness.java +++ b/waltz-jobs/src/main/java/org/finos/waltz/jobs/harness/AggregateWidgetCostHarness.java @@ -49,10 +49,8 @@ public static void main(String[] args) throws ParseException { long schemeId = 1L; long allocationSchemeId = 1L; - ApplicationIdSelectorFactory selectorFactory = new ApplicationIdSelectorFactory(); + ApplicationIdSelectorFactory selectorFactory = new ApplicationIdSelectorFactory(); Select> appIds = selectorFactory.apply(selectionOptions); - Set widgetData = dao.findWidgetData(diagramId, SetUtilities.asSet(schemeId), allocationSchemeId, appIds); - System.out.println(widgetData); } diff --git a/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/AggregateOverlayDiagramPreset.java b/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/AggregateOverlayDiagramPreset.java new file mode 100644 index 0000000000..019e70b8c5 --- /dev/null +++ b/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/AggregateOverlayDiagramPreset.java @@ -0,0 +1,25 @@ +package org.finos.waltz.model.aggregate_overlay_diagram; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.finos.waltz.model.*; +import org.immutables.value.Value; + +@Value.Immutable +@JsonSerialize(as = ImmutableAggregateOverlayDiagramPreset.class) +@JsonDeserialize(as = ImmutableAggregateOverlayDiagramPreset.class) +public abstract class AggregateOverlayDiagramPreset implements IdProvider, + NameProvider, + DescriptionProvider, + LastUpdatedProvider, + ProvenanceProvider { + + public abstract Long diagramId(); + + public abstract String externalId(); + + public abstract String overlayConfig(); + + public abstract String filterConfig(); + +} diff --git a/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/OverlayDiagramPresetCreateCommand.java b/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/OverlayDiagramPresetCreateCommand.java new file mode 100644 index 0000000000..500b51464f --- /dev/null +++ b/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/OverlayDiagramPresetCreateCommand.java @@ -0,0 +1,24 @@ +package org.finos.waltz.model.aggregate_overlay_diagram; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.finos.waltz.model.DescriptionProvider; +import org.finos.waltz.model.EntityReference; +import org.finos.waltz.model.NameProvider; +import org.finos.waltz.model.command.Command; +import org.immutables.value.Value; + +@Value.Immutable +@JsonSerialize(as = ImmutableOverlayDiagramPresetCreateCommand.class) +@JsonDeserialize(as = ImmutableOverlayDiagramPresetCreateCommand.class) +public abstract class OverlayDiagramPresetCreateCommand implements NameProvider, DescriptionProvider, Command { + + public abstract Long diagramId(); + + public abstract String externalId(); + + public abstract String overlayConfig(); + + public abstract String filterConfig(); + +} diff --git a/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/overlay/widget_parameters/AssessmentWidgetParameters.java b/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/overlay/widget_parameters/AssessmentWidgetParameters.java index b9bc050660..4c22ab5e0e 100644 --- a/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/overlay/widget_parameters/AssessmentWidgetParameters.java +++ b/waltz-model/src/main/java/org/finos/waltz/model/aggregate_overlay_diagram/overlay/widget_parameters/AssessmentWidgetParameters.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +import java.time.LocalDate; +import java.util.Optional; + @Value.Immutable @JsonSerialize(as = ImmutableAssessmentWidgetParameters.class) @JsonDeserialize(as = ImmutableAssessmentWidgetParameters.class) @@ -11,4 +14,6 @@ public abstract class AssessmentWidgetParameters { public abstract Long assessmentDefinitionId(); + public abstract Optional targetDate(); + } diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/AggregateOverlayDiagram.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/AggregateOverlayDiagram.svelte index 324c2c4604..166b8a72b0 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/AggregateOverlayDiagram.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/AggregateOverlayDiagram.svelte @@ -11,7 +11,7 @@ let selectedInstance = getContext("selectedInstance"); let selectedDiagram = getContext("selectedDiagram"); let overlayData = getContext("overlayData"); - let widget = getContext("widget"); + let widget = getContext("focusWidget"); let callouts = getContext("callouts"); let selectedOverlay = getContext("selectedOverlay"); let svgDetail = getContext("svgDetail"); @@ -162,6 +162,7 @@ -
+
{@html svg}
diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/WidgetSelector.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/WidgetSelector.svelte index 4a5c9edde4..d04bb4c326 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/WidgetSelector.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/WidgetSelector.svelte @@ -1,18 +1,8 @@ + + +
+ + Creating a preset will save this overlay and the selected filters for reuse +
+ +
+ + +
+ Name of the Preset +
+ + +
+ Description of this preset +
+ + + + + +
\ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/presets/PresetSelector.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/presets/PresetSelector.svelte new file mode 100644 index 0000000000..0550c9896c --- /dev/null +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/presets/PresetSelector.svelte @@ -0,0 +1,72 @@ + + + +{#if _.isEmpty($diagramPresets)} + There are no presets for this diagram +{:else} + + + + + + + + + + + + + {#each $diagramPresets as preset} + selectPreset(preset)}> + + + + {/each} + +
Presets
+ + + {preset.description || "-"} +
+{/if} + + + \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/aggregated-entities/AggregatedEntitiesWidgetParameters.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/aggregated-entities/AggregatedEntitiesWidgetParameters.svelte index 309d9637d8..607ef02f2d 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/aggregated-entities/AggregatedEntitiesWidgetParameters.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/aggregated-entities/AggregatedEntitiesWidgetParameters.svelte @@ -1,45 +1,10 @@ -{#if $overlayDataCall?.status === 'loading'} -

- Loading - -

-{/if} \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/app-costs/AppCostWidgetParameters.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/app-costs/AppCostWidgetParameters.svelte index f4daf6caf2..7306ac391f 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/app-costs/AppCostWidgetParameters.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/app-costs/AppCostWidgetParameters.svelte @@ -1,23 +1,26 @@ + + + - - {fmt(futureDate)} - + max="120" + bind:value={$sliderVal}>
Use the slider to adjust how far in the future to application counts. This is calculated by incorporating app retirement dates and subtracting their associated apps from the current total.
- - -{#if $overlayDataCall?.status === 'loading'} -

- Loading - -

-{/if} \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentOverlayCell.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentOverlayCell.svelte index c3fa4049c6..6d474ee5c1 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentOverlayCell.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentOverlayCell.svelte @@ -1,61 +1,19 @@ - - - - {#each counts as r} - - {r.rating.name} - - - {r.rating.name || "?"} - {r.rating.name} - - {/each} - - +
+ +
diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentWidgetParameters.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentWidgetParameters.svelte index 9303067e15..d700512c36 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentWidgetParameters.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/AssessmentWidgetParameters.svelte @@ -1,74 +1,131 @@ + + -{#if $selectedAssessmentDefinition} -

Showing: {$selectedAssessmentDefinition.name}

+{#if $selectedDefinition} +
+ {$selectedDefinition.name} + +
- +
- + {:else} - $selectedDefinition = ad} selectionFilter={ad => ad.entityKind === $selectedDiagram.aggregatedEntityKind}/> {/if} -{#if $overlayDataCall?.status === 'loading'} -

- Loading - -

+ +{#if $selectedDefinition} +
+ +

Rendering Mode

+

+ Controls how the assessment data will be displayed. +

+ + + + +
+ +

Date

+

+ Calculate a future projected view of this assessment. + This is based upon app retirements and app/function decomms (and replacements). +

+ + + + + + {targetDate + ? fmt(targetDate) + : '-'} + {/if} + + \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/BarGraphCell.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/BarGraphCell.svelte new file mode 100644 index 0000000000..7f41702797 --- /dev/null +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/BarGraphCell.svelte @@ -0,0 +1,50 @@ + + + + + + {#each counts as r} + + {r.rating.name} + + + {r.rating.name || "?"} + {r.rating.name} + + {/each} + + \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/BoxGraphCell.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/BoxGraphCell.svelte new file mode 100644 index 0000000000..6147dbbf9f --- /dev/null +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/BoxGraphCell.svelte @@ -0,0 +1,60 @@ + + + + + + {#each rows as row, idx} + + {#each row as box, idx} + + + + {box.count} + + + {box.rating.name} + + + {/each} + + {/each} + + +
+
+ + {#each counts as row} + + + + {/each} +
+ + ({row.count}) +
\ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/store.js b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/store.js new file mode 100644 index 0000000000..568698f114 --- /dev/null +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/assessments/store.js @@ -0,0 +1,8 @@ +import {writable} from "svelte/store"; + +export const Modes = { + BAR: Symbol("BAR"), + BOX: Symbol("BOX") +}; + +export const renderMode = writable(Modes.BOX); \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/backing-entities/BackingEntitiesOverlayCell.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/backing-entities/BackingEntitiesOverlayCell.svelte index 169be7e28c..8591115067 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/backing-entities/BackingEntitiesOverlayCell.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/aggregate-overlay-diagram/widgets/backing-entities/BackingEntitiesOverlayCell.svelte @@ -39,8 +39,6 @@ \ No newline at end of file diff --git a/waltz-ng/client/aggregate-overlay-diagram/components/panel/AggregateOverlayDiagramPanel.svelte b/waltz-ng/client/aggregate-overlay-diagram/components/panel/AggregateOverlayDiagramPanel.svelte index 1f54372e30..593199b064 100644 --- a/waltz-ng/client/aggregate-overlay-diagram/components/panel/AggregateOverlayDiagramPanel.svelte +++ b/waltz-ng/client/aggregate-overlay-diagram/components/panel/AggregateOverlayDiagramPanel.svelte @@ -5,7 +5,11 @@ import {aggregateOverlayDiagramCalloutStore} from "../../../svelte-stores/aggregate-overlay-diagram-callout-store"; import DiagramSelector from "../diagram-selector/DiagramSelector.svelte"; import NoData from "../../../common/svelte/NoData.svelte"; - import {setupContextStores, determineWhichCellsAreLinkedByParent} from "../aggregate-overlay-diagram/aggregate-overlay-diagram-utils"; + import { + determineWhichCellsAreLinkedByParent, + setupContextStores, + widgets + } from "../aggregate-overlay-diagram/aggregate-overlay-diagram-utils"; import _ from "lodash"; import AggregateOverlayDiagramContextPanel from "../context-panel/AggregateOverlayDiagramContextPanel.svelte"; import Icon from "../../../common/svelte/Icon.svelte"; @@ -25,27 +29,21 @@ let diagramProportion = getContext("diagramProportion"); let cellIdsExplicitlyRelatedToParent = getContext("cellIdsExplicitlyRelatedToParent"); let focusWidget = getContext("focusWidget"); - let costSliderValue = getContext("costSliderValue"); - let appCountSliderValue = getContext("appCountSliderValue"); - let selectedCostKinds = getContext("selectedCostKinds"); - let selectedAllocationScheme = getContext("selectedAllocationScheme"); - let selectedAssessmentDefinition = getContext("selectedAssessmentDefinition"); + let diagramPresets = getContext("diagramPresets"); + let overlayDataCall = getContext("overlayDataCall"); + let loading = getContext("loading"); let svgCall; let calloutCall; let diagramsCall; let relatedEntitiesCall; + let presetsCall; function clearWidgetParameters() { $focusWidget = null; - $costSliderValue = 0; - $appCountSliderValue = 0; - $selectedCostKinds = []; - $selectedAllocationScheme = null; - $selectedAssessmentDefinition = null; + _.each(widgets, d => d.resetParameters ? d.resetParameters() : null); } - function selectDiagram(evt) { clearWidgetParameters(); $selectedInstance = null; @@ -65,6 +63,7 @@ if ($selectedDiagram) { svgCall = aggregateOverlayDiagramStore.getById($selectedDiagram.id); relatedEntitiesCall = measurableRelationshipStore.findByEntityReference(primaryEntityRef); + presetsCall = aggregateOverlayDiagramStore.findPresetsForDiagram($selectedDiagram.id); } } @@ -79,6 +78,7 @@ $: diagrams = $diagramsCall?.data || []; $: relatedEntities = $relatedEntitiesCall?.data; $: $cellIdsExplicitlyRelatedToParent = determineWhichCellsAreLinkedByParent(backingEntities, relatedEntities); + $: $diagramPresets = $presetsCall?.data; @@ -101,7 +101,15 @@
-
+
+ {#if $loading} +

+ Loading + +

+ {/if} +
+
+ +
- - + scheme={schemesById[selectedDefinition.ratingSchemeId]} + selectedRatings={selectedRatings}/> {/if} diff --git a/waltz-ng/client/common/svelte/RatingPicker.svelte b/waltz-ng/client/common/svelte/RatingPicker.svelte index 3f51ddbba7..40e3ab21d8 100644 --- a/waltz-ng/client/common/svelte/RatingPicker.svelte +++ b/waltz-ng/client/common/svelte/RatingPicker.svelte @@ -7,30 +7,31 @@ export let scheme; export let isMultiSelect = true; + export let selectedRatings = []; const dispatch = createEventDispatcher(); - let selectedItems = []; function onSelect(item) { if (isMultiSelect) { - const existing = selectedItems.indexOf(item) > -1; + const existing = _.find(selectedRatings, d => d.id === item.id); if (existing) { - selectedItems = _.without(selectedItems, item); + selectedRatings = _.reject(selectedRatings, d => d.id === item.id); } else { - selectedItems = _.concat(selectedItems, [item]) + selectedRatings = _.concat(selectedRatings, [item]); } } else { - selectedItems = [item]; + selectedRatings = [item]; } - dispatch("select", selectedItems); + dispatch("select", selectedRatings); } $: items = _ .chain(scheme?.ratings) .orderBy([d => d.position, d => d.name]) .value(); + @@ -48,12 +49,12 @@ {#each items as item} -1} + class:selected={_.find(selectedRatings, d => d.id === item.id)} on:click={() => onSelect(item)}> {#if isMultiSelect} -1 + name={_.find(selectedRatings, d => d.id === item.id) ? 'check-square-o' : 'square-o'}/> {/if} diff --git a/waltz-ng/client/playpen/3/builder/EntityGroupBox.svelte b/waltz-ng/client/playpen/3/builder/EntityGroupBox.svelte index d6a9e9713c..cac871b5c8 100644 --- a/waltz-ng/client/playpen/3/builder/EntityGroupBox.svelte +++ b/waltz-ng/client/playpen/3/builder/EntityGroupBox.svelte @@ -28,7 +28,7 @@ + fill={group.headerColor || '#0e2541'}> diff --git a/waltz-ng/client/playpen/3/builder/north-star.js b/waltz-ng/client/playpen/3/builder/north-star.js index 7b840c55f1..7227ad5abf 100644 --- a/waltz-ng/client/playpen/3/builder/north-star.js +++ b/waltz-ng/client/playpen/3/builder/north-star.js @@ -150,6 +150,8 @@ const cells = { const referenceData = { id: "REF_DATA", name: "Reference Data", + cellColor: "#a3b2c9", + headerColor: "#6a7485", rows: [ [ ns1("REFERENCE_DATA_MANAGEMENT", cells.REFERENCE_DATA_MANAGEMENT), @@ -162,6 +164,8 @@ const referenceData = { const transactionInitiation = { id: "TRANSACTION_INITIATION", name: "Transaction Initiation", + cellColor: "#abd5d5", + headerColor: "#6e8d8d", rows: [ ns("TRANSACTION_INITIATION", [cells.TRADING, cells.LENDING, cells.BANKING_MANAGEMENT, cells.TRADE_BANKING]), ns("TRANSACTION_INITIATION", [cells.SALES_AND_ADVISORY, cells.CLIENT_MANAGEMENT, cells.CLIENT_SERVICING, cells.PAYMENTS]) @@ -171,6 +175,8 @@ const transactionInitiation = { const coreProcessing = { id: "CORE_PROCESSING", name: "Core Processing", + cellColor: "#efdfc4", + headerColor: "#9d9179", rows: [ ns("CORE_PROCESSING", [cells.CLIENT_SERVICING, cells.CLIENT_MANAGEMENT, cells.CLIENT_AND_FUNDS_PORTFOLIO_MANAGEMENT, cells.SALES_AND_ADVISORY]), ns("CORE_PROCESSING", [cells.TRADING, cells.RISK_AND_VALUATION]), @@ -182,6 +188,8 @@ const coreProcessing = { const coreProcessingOperations = { id: "CORE_PROCESSING_OPERATIONS", name: "Core Processing (Operations)", + cellColor: "#efdfc4", + headerColor: "#9d9179", rows: [ ns("CORE_PROCESSING", [cells.MARKET_OPERATIONS, cells.CLEARING_AND_SETTLEMENT, cells.PAYMENTS]), ns("CORE_PROCESSING", [cells.COLLATERAL_AND_MARGIN, cells.POSITION_MANAGEMENT, cells.LENDING]), @@ -192,6 +200,8 @@ const coreProcessingOperations = { const coreProcessingFinance = { id: "CORE_PROCESSING_FINANCE", name: "Core Processing (Finance)", + cellColor: "#efdfc4", + headerColor: "#9d9179", rows: [ ns("CORE_PROCESSING", [cells.FINANCE_CONTROL, cells.FINANCIAL_RISK_CONTROL, cells.FINANCIAL_MANAGEMENT, cells.TRANSACTION_ACCOUNTING]), ns("CORE_PROCESSING", [cells.FINANCE_PERFORMANCE, cells.NON_FINANCIAL_RISK_CONTROL, cells.TREASURY, cells.TAX_MANAGEMENT]) @@ -210,6 +220,8 @@ function ns1(namespace, cell) { const analyticsAndReporting = { id: "ANALYTICS_REPORTING", name: "Analytics and Reporting", + cellColor: "#FECBC6", + headerColor: "#a87d7a", rows: [ ns("ANALYTICS_AND_REPORTING", [cells.RESEARCH, cells.COMPLIANCE, cells.FINANCE_CONTROL]), ns("ANALYTICS_AND_REPORTING", [cells.TREASURY, cells.TAX_MANAGEMENT]), diff --git a/waltz-ng/client/ratings/components/rating-indicator-cell/RatingIndicatorCell.svelte b/waltz-ng/client/ratings/components/rating-indicator-cell/RatingIndicatorCell.svelte index 281911b929..4981fe479c 100644 --- a/waltz-ng/client/ratings/components/rating-indicator-cell/RatingIndicatorCell.svelte +++ b/waltz-ng/client/ratings/components/rating-indicator-cell/RatingIndicatorCell.svelte @@ -20,15 +20,15 @@ \ No newline at end of file diff --git a/waltz-ng/client/svelte-stores/aggregate-overlay-diagram-store.js b/waltz-ng/client/svelte-stores/aggregate-overlay-diagram-store.js index 6ceae34ded..253e3d6246 100644 --- a/waltz-ng/client/svelte-stores/aggregate-overlay-diagram-store.js +++ b/waltz-ng/client/svelte-stores/aggregate-overlay-diagram-store.js @@ -76,6 +76,24 @@ export function mkOverlayDiagramStore() { {force}); }; + const findPresetsForDiagram = (diagramId, force = false) => { + return remote + .fetchViewList( + "GET", + `api/aggregate-overlay-diagram/diagram-id/${diagramId}/presets`, + null, + {force}); + }; + + const createPreset = (createCommand, force = false) => { + return remote + .execute( + "POST", + "api/aggregate-overlay-diagram/create-preset", + createCommand, + {force}); + }; + return { getById, findAll, @@ -84,7 +102,9 @@ export function mkOverlayDiagramStore() { findAppCostForDiagram, findAppAssessmentsForDiagram, findBackingEntitiesForDiagram, - findAggregatedEntitiesForDiagram + findAggregatedEntitiesForDiagram, + findPresetsForDiagram, + createPreset }; } diff --git a/waltz-ng/package-lock.json b/waltz-ng/package-lock.json index 38a7e3460a..046b5a832a 100644 --- a/waltz-ng/package-lock.json +++ b/waltz-ng/package-lock.json @@ -2452,6 +2452,11 @@ "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==", "dev": true }, + "base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -3430,6 +3435,14 @@ "randomfill": "^1.0.3" } }, + "css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "requires": { + "utrie": "^1.0.2" + } + }, "css-loader": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", @@ -6485,6 +6498,15 @@ } } }, + "html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "requires": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + } + }, "htmlparser2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", @@ -10617,6 +10639,14 @@ } } }, + "text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "requires": { + "utrie": "^1.0.2" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -11128,6 +11158,14 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "requires": { + "base64-arraybuffer": "^1.0.2" + } + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", diff --git a/waltz-ng/package.json b/waltz-ng/package.json index cdd597e4f0..e4beb19703 100644 --- a/waltz-ng/package.json +++ b/waltz-ng/package.json @@ -43,26 +43,27 @@ "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", - "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", + "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" }, "devDependencies": { diff --git a/waltz-service/src/main/java/org/finos/waltz/service/aggregate_overlay_diagram/AggregateOverlayDiagramService.java b/waltz-service/src/main/java/org/finos/waltz/service/aggregate_overlay_diagram/AggregateOverlayDiagramService.java index 53e9554467..db76d2ecbf 100644 --- a/waltz-service/src/main/java/org/finos/waltz/service/aggregate_overlay_diagram/AggregateOverlayDiagramService.java +++ b/waltz-service/src/main/java/org/finos/waltz/service/aggregate_overlay_diagram/AggregateOverlayDiagramService.java @@ -5,10 +5,7 @@ import org.finos.waltz.data.aggregate_overlay_diagram.*; import org.finos.waltz.model.AssessmentBasedSelectionFilter; import org.finos.waltz.model.IdSelectionOptions; -import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagram; -import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagramInfo; -import org.finos.waltz.model.aggregate_overlay_diagram.BackingEntity; -import org.finos.waltz.model.aggregate_overlay_diagram.ImmutableAggregateOverlayDiagramInfo; +import org.finos.waltz.model.aggregate_overlay_diagram.*; import org.finos.waltz.model.aggregate_overlay_diagram.overlay.*; import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.AppCostWidgetParameters; import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.AppCountWidgetParameters; @@ -35,6 +32,7 @@ public class AggregateOverlayDiagramService { private final AssessmentRatingWidgetDao appAssessmentWidgetDao; private final BackingEntityWidgetDao backingEntityWidgetDao; private final AggregatedEntitiesWidgetDao aggregatedEntitiesWidgetDao; + private final AggregateOverlayDiagramPresetDao aggregateOverlayDiagramPresetDao; private final GenericSelectorFactory genericSelectorFactory = new GenericSelectorFactory(); @@ -45,7 +43,8 @@ public AggregateOverlayDiagramService(AggregateOverlayDiagramDao aggregateOverla AssessmentRatingWidgetDao appAssessmentWidgetDao, BackingEntityWidgetDao backingEntityWidgetDao, AppCostWidgetDao appCostWidgetDao, - AggregatedEntitiesWidgetDao aggregatedEntitiesWidgetDao) { + AggregatedEntitiesWidgetDao aggregatedEntitiesWidgetDao, + AggregateOverlayDiagramPresetDao aggregateOverlayDiagramPresetDao) { this.aggregateOverlayDiagramDao = aggregateOverlayDiagramDao; this.appCountWidgetDao = appCountWidgetDao; this.targetAppCostWidgetDao = targetAppCostWidgetDao; @@ -53,6 +52,7 @@ public AggregateOverlayDiagramService(AggregateOverlayDiagramDao aggregateOverla this.appAssessmentWidgetDao = appAssessmentWidgetDao; this.backingEntityWidgetDao = backingEntityWidgetDao; this.aggregatedEntitiesWidgetDao = aggregatedEntitiesWidgetDao; + this.aggregateOverlayDiagramPresetDao = aggregateOverlayDiagramPresetDao; } @@ -114,7 +114,8 @@ public Set findAppCostWidgetData(Long diagramId, diagramId, appCostWidgetParameters.costKindIds(), appCostWidgetParameters.allocationSchemeId(), - entityIdSelector); + entityIdSelector, + Optional.empty()); } @@ -124,7 +125,7 @@ public Set findAppAssessmentWidgetData(Long diagra AssessmentWidgetParameters assessmentWidgetParameters) { AggregateOverlayDiagram diagram = aggregateOverlayDiagramDao.getById(diagramId); - ; + GenericSelector genericSelector = genericSelectorFactory.applyForKind(diagram.aggregatedEntityKind(), appSelectionOptions); Select> entityIdSelector = applyFilterToSelector(genericSelector, filterParams); @@ -132,7 +133,8 @@ public Set findAppAssessmentWidgetData(Long diagra diagramId, diagram.aggregatedEntityKind(), assessmentWidgetParameters.assessmentDefinitionId(), - entityIdSelector); + entityIdSelector, + assessmentWidgetParameters.targetDate()); } @@ -148,7 +150,8 @@ public Set findAggregatedEntitiesWidgetData(Long return aggregatedEntitiesWidgetDao.findWidgetData( diagramId, diagram.aggregatedEntityKind(), - entityIdSelector); + entityIdSelector, + Optional.empty()); } @@ -157,4 +160,13 @@ public Set findBackingEntityWidgetData(Long diagramId) } + public Set findPresetsForDiagram(Long diagramId) { + return aggregateOverlayDiagramPresetDao.findPresetsForDiagram(diagramId); + } + + public int createPreset(OverlayDiagramPresetCreateCommand createCommand, String username) { + return aggregateOverlayDiagramPresetDao.create(createCommand, username); + } + + } diff --git a/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/AggregateOverlayDiagramEndpoint.java b/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/AggregateOverlayDiagramEndpoint.java index 3e054aafed..fa00c4720f 100644 --- a/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/AggregateOverlayDiagramEndpoint.java +++ b/waltz-web/src/main/java/org/finos/waltz/web/endpoints/api/AggregateOverlayDiagramEndpoint.java @@ -20,22 +20,44 @@ import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagram; import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagramInfo; -import org.finos.waltz.model.aggregate_overlay_diagram.overlay.*; -import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.*; +import org.finos.waltz.model.aggregate_overlay_diagram.AggregateOverlayDiagramPreset; +import org.finos.waltz.model.aggregate_overlay_diagram.OverlayDiagramPresetCreateCommand; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.AggregatedEntitiesWidgetDatum; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.AssessmentRatingsWidgetDatum; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.BackingEntityWidgetDatum; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.CostWidgetDatum; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.CountWidgetDatum; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.TargetCostWidgetDatum; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.AggregatedEntitiesWidgetParameters; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.AppCostWidgetParameters; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.AppCountWidgetParameters; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.AssessmentWidgetParameters; +import org.finos.waltz.model.aggregate_overlay_diagram.overlay.widget_parameters.TargetAppCostWidgetParameters; import org.finos.waltz.service.aggregate_overlay_diagram.AggregateOverlayDiagramService; import org.finos.waltz.web.DatumRoute; import org.finos.waltz.web.ListRoute; import org.finos.waltz.web.WebUtilities; import org.finos.waltz.web.endpoints.Endpoint; -import org.finos.waltz.web.json.*; +import org.finos.waltz.web.json.OverlayDiagramAggregatedEntitiesWidgetInfo; +import org.finos.waltz.web.json.OverlayDiagramAppCostWidgetInfo; +import org.finos.waltz.web.json.OverlayDiagramAppCountWidgetInfo; +import org.finos.waltz.web.json.OverlayDiagramAssessmentWidgetInfo; +import org.finos.waltz.web.json.OverlayDiagramTargetAppCostWidgetInfo; +import org.finos.waltz.web.json.OverlayDiagramWidgetInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import static org.finos.waltz.common.Checks.checkNotNull; -import static org.finos.waltz.web.WebUtilities.*; -import static org.finos.waltz.web.endpoints.EndpointUtilities.*; +import static org.finos.waltz.web.WebUtilities.getId; +import static org.finos.waltz.web.WebUtilities.getUsername; +import static org.finos.waltz.web.WebUtilities.mkPath; +import static org.finos.waltz.web.WebUtilities.readBody; +import static org.finos.waltz.web.endpoints.EndpointUtilities.getForDatum; +import static org.finos.waltz.web.endpoints.EndpointUtilities.getForList; +import static org.finos.waltz.web.endpoints.EndpointUtilities.postForDatum; +import static org.finos.waltz.web.endpoints.EndpointUtilities.postForList; @Service public class AggregateOverlayDiagramEndpoint implements Endpoint { @@ -65,6 +87,8 @@ public void register() { String findAppAssessmentWidgetDataPath = mkPath(BASE_URL, "diagram-id", ":id", "app-assessment-widget"); String findAggregatedEntitiesWidgetDataPath = mkPath(BASE_URL, "diagram-id", ":id", "aggregated-entities-widget"); String findBackingEntityWidgetDataPath = mkPath(BASE_URL, "diagram-id", ":id", "backing-entity-widget"); + String findPresetsForDiagramPath = mkPath(BASE_URL, "diagram-id", ":id", "presets"); + String createPresetPath = mkPath(BASE_URL, "create-preset"); DatumRoute getByIdRoute = (request, response) -> { return aggregateOverlayDiagramService.getById(getId(request)); @@ -145,14 +169,27 @@ public void register() { }; + ListRoute findPresetsForDiagramRoute = (request, response) -> { + long diagramId = getId(request); + return aggregateOverlayDiagramService.findPresetsForDiagram(diagramId); + }; + + + DatumRoute createPresetRoute = (request, response) -> { + return aggregateOverlayDiagramService.createPreset(readBody(request, OverlayDiagramPresetCreateCommand.class), getUsername(request)); + }; + + getForDatum(getByIdPath, getByIdRoute); getForList(findAllPath, findAllRoute); getForList(findBackingEntityWidgetDataPath, findBackingEntityWidgetDataRoute); + getForList(findPresetsForDiagramPath, findPresetsForDiagramRoute); postForList(findAppCountWidgetDataPath, findAppCountWidgetDataRoute); postForList(findTargetAppCostWidgetDataPath, findTargetAppCostWidgetDataRoute); postForList(findAppCostWidgetDataPath, findAppCostWidgetDataRoute); postForList(findAppAssessmentWidgetDataPath, findAppAssessmentWidgetDataRoute); postForList(findAggregatedEntitiesWidgetDataPath, findAggregatedEntitiesWidgetDataRoute); + postForDatum(createPresetPath, createPresetRoute); } }