diff --git a/waltz-data/src/main/java/com/khartec/waltz/data/report_grid/ReportGridDao.java b/waltz-data/src/main/java/com/khartec/waltz/data/report_grid/ReportGridDao.java index f99161c838..12a8154961 100644 --- a/waltz-data/src/main/java/com/khartec/waltz/data/report_grid/ReportGridDao.java +++ b/waltz-data/src/main/java/com/khartec/waltz/data/report_grid/ReportGridDao.java @@ -16,6 +16,8 @@ import static com.khartec.waltz.common.DateTimeUtilities.toLocalDateTime; import static com.khartec.waltz.model.EntityReference.mkRef; import static com.khartec.waltz.schema.Tables.*; +import static org.jooq.impl.DSL.name; +import static org.jooq.impl.DSL.select; @Repository public class ReportGridDao { @@ -144,7 +146,7 @@ private Set findCellDataByGridCondition(Condition gridCond Condition condition = app.ID.in(appSelector) .and(gridCondition); - SelectConditionStep> measurableData = dsl + SelectConditionStep> exactMeasurableData = dsl .select(app.ID, rgcd.COLUMN_ENTITY_ID, DSL.value(EntityKind.MEASURABLE.name()).as("kind"), @@ -156,7 +158,8 @@ private Set findCellDataByGridCondition(Condition gridCond .innerJoin(rgcd).on(rgcd.COLUMN_ENTITY_ID.eq(m.ID)).and(rgcd.COLUMN_ENTITY_KIND.eq(DSL.val(EntityKind.MEASURABLE.name()))) .innerJoin(rg).on(rg.ID.eq(rgcd.REPORT_GRID_ID)) .innerJoin(rsi).on(rsi.CODE.eq(mr.RATING)).and(rsi.SCHEME_ID.eq(mc.RATING_SCHEME_ID)) - .where(dsl.renderInlined(condition)); // jOOQ seems very slow when using simple `condition` (esp. for complex conditions). Inlined seems a lot faster + .where(dsl.renderInlined(condition)) + .and(rgcd.DISPLAY_NAME.ne("agg")); // jOOQ seems very slow when using simple `condition` (esp. for complex conditions). Inlined seems a lot faster SelectConditionStep> assessmentData = dsl .select(app.ID, @@ -171,17 +174,55 @@ private Set findCellDataByGridCondition(Condition gridCond .innerJoin(rsi).on(rsi.ID.eq(ar.RATING_ID)) .where(dsl.renderInlined(condition)); // jOOQ seems very slow when using simple `condition` (esp. for complex conditions). Inlined seems a lot faster - return measurableData + SelectConditionStep> selectRatings = select( + MEASURABLE.ID, + MEASURABLE_RATING.ENTITY_ID, + RATING_SCHEME_ITEM.ID, + RATING_SCHEME_ITEM.POSITION) + .from(MEASURABLE) + .innerJoin(ENTITY_HIERARCHY).on(ENTITY_HIERARCHY.ANCESTOR_ID.eq(MEASURABLE.ID) + .and(ENTITY_HIERARCHY.KIND.eq(EntityKind.MEASURABLE.name()))) + .innerJoin(MEASURABLE_RATING).on(MEASURABLE_RATING.MEASURABLE_ID.eq(ENTITY_HIERARCHY.ID)) + .innerJoin(MEASURABLE_CATEGORY).on(MEASURABLE.MEASURABLE_CATEGORY_ID.eq(MEASURABLE_CATEGORY.ID)) + .innerJoin(RATING_SCHEME_ITEM).on(MEASURABLE_RATING.RATING.eq(RATING_SCHEME_ITEM.CODE) + .and(RATING_SCHEME_ITEM.SCHEME_ID.eq(MEASURABLE_CATEGORY.RATING_SCHEME_ID))) + .where(MEASURABLE_RATING.ENTITY_KIND.eq(EntityKind.APPLICATION.name())); + + CommonTableExpression> ratings = name("rating") + .fields("smid", "eid", "rid", "rp") + .as(selectRatings); + + Table> r1 = ratings.as("r1"); + Table> r2 = ratings.as("r2"); + + SelectConditionStep> aggregatedMeasurableData = dsl + .with(ratings) + .selectDistinct( + r1.field("eid", Long.class), + r1.field("smid", Long.class), + DSL.val(EntityKind.MEASURABLE.name()), + r1.field("rid", Long.class)) + .from(r1) + .leftJoin(r2).on(r1.field("eid", Long.class).eq(r2.field("eid", Long.class)) + .and(r1.field("smid", Long.class).eq(r2.field("smid", Long.class)) + .and(r1.field("rp", Integer.class).gt(r2.field("rp", Integer.class))))) + .innerJoin(rgcd).on(rgcd.COLUMN_ENTITY_ID.eq(r1.field("smid", Long.class)) + .and(rgcd.COLUMN_ENTITY_KIND.eq(DSL.val(EntityKind.MEASURABLE.name())) + .and(rgcd.DISPLAY_NAME.eq("agg")))) + .innerJoin(rg).on(rg.ID.eq(rgcd.REPORT_GRID_ID)) + .where(r2.field("rid", Long.class).isNull() + .and(r1.field("eid", Long.class).in(appSelector))); + + return aggregatedMeasurableData .unionAll(assessmentData) + .unionAll(exactMeasurableData) .fetchSet(r -> ImmutableReportGridRatingCell .builder() - .applicationId(r.get(app.ID)) - .columnEntityId(r.get(rgcd.COLUMN_ENTITY_ID)) - .columnEntityKind(EntityKind.valueOf(r.get("kind", String.class))) - .ratingId(r.get(rsi.ID)) + .applicationId(r.get(0, Long.class)) + .columnEntityId(r.get(1, Long.class)) + .columnEntityKind(EntityKind.valueOf(r.get(2, String.class))) + .ratingId(r.get(3, Long.class)) .build()); } - - } diff --git a/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.html b/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.html index 4095a366ec..cb67e56770 100644 --- a/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.html +++ b/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.html @@ -1,11 +1,11 @@ - diff --git a/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.js b/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.js index e245464253..42221de2f6 100644 --- a/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.js +++ b/waltz-ng/client/report-grid/components/grid-view-section/report-grid-view-section.js @@ -1,26 +1,50 @@ import template from "./report-grid-view-section.html"; import {initialiseData} from "../../../common"; +import {CORE_API} from "../../../common/services/core-api-utils"; +import * as _ from "lodash"; const bindings = { parentEntityRef: "<" }; const initData = { - gridId: 1, showPicker: false }; -function controller(serviceBroker) { +const localStorageKey = "waltz-report-grid-view-section-last-id"; + +function controller(serviceBroker, localStorageService) { const vm = initialiseData(this, initData); + vm.$onChanges = () => { + const lastUsedGridId = localStorageService.get(localStorageKey); + + if (_.isNil(lastUsedGridId)){ + vm.showPicker = true; + } else { + serviceBroker + .loadViewData(CORE_API.ReportGridStore.findAll) + .then(r => { + vm.selectedGrid = _.find(r.data, d => d.id === lastUsedGridId); + if (!vm.selectedGrid){ + vm.showPicker = true; + } + }) + } + }; + vm.onGridSelect = (grid) => { + localStorageService.set(localStorageKey, grid.id); vm.selectedGrid = grid; vm.showPicker = false; }; } -controller.$inject = ["ServiceBroker"]; +controller.$inject = [ + "ServiceBroker", + "localStorageService" +]; const component = { controller, diff --git a/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.html b/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.html index e39819a11d..083f08f7bd 100644 --- a/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.html +++ b/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.html @@ -4,7 +4,7 @@ class="col-sm-6"> - You have no report grids. + There are no report grids diff --git a/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.js b/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.js index 4e6705d0b6..1b1ec899f4 100644 --- a/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.js +++ b/waltz-ng/client/report-grid/components/report-grid-picker/report-grid-picker.js @@ -16,7 +16,7 @@ function controller(serviceBroker) { vm.$onChanges = () => { serviceBroker - .loadAppData(CORE_API.ReportGridStore.findAll) + .loadViewData(CORE_API.ReportGridStore.findAll) .then(r => vm.grids = r.data); }; diff --git a/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.html b/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.html index 2b3a092a2b..71487cc30d 100644 --- a/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.html +++ b/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.html @@ -1,80 +1,88 @@
- - - - No summaries selected -

- There are no active summaries. To add one select the - 'Add to summary' option in the column drop down menu. - Once added you can select summary rows to quickly filter - the report. -

-
-
+ + - -

- Select a value in the summary tables to quickly filter the data. - Select the row again to clear the filter. - You can add more summaries using the column menu ('Add to summary'). -

+
+ + + + No summaries selected +

+ There are no active summaries. To add one select the + 'Add to summary' option in the column drop down menu. + Once added you can select summary rows to quickly filter + the report. +

+
+
- -
-
-
- - - - -
- - - - + + + + + + + + + +
-
-
- + + +

+ Select a value in the summary tables to quickly filter the data. + Select the row again to clear the filter. + You can add more summaries using the column menu ('Add to summary'). +

+ + + +
+
+
+ + + + +
+ + + + - - - - - - - - - -
+
+
+ -
- Total - - -
+
+ Total + + +
+
-
- - - + + + +
diff --git a/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.js b/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.js index cb9df465be..fb3f277075 100644 --- a/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.js +++ b/waltz-ng/client/report-grid/components/report-grid-view-panel/report-grid-view-panel.js @@ -159,11 +159,14 @@ function controller(serviceBroker) { vm.$onChanges = () => { if (! vm.parentEntityRef) return; + + vm.loading = true; serviceBroker .loadViewData( CORE_API.ReportGridStore.getViewById, [vm.gridId, mkSelectionOptions(vm.parentEntityRef)]) .then(r => { + vm.loading = false; vm.rawGridData = r.data; vm.allTableData = prepareTableData(vm.rawGridData); vm.allColumnDefs = prepareColumnDefs(vm.rawGridData);