From 12eb0bf60ed00a21651602bebb937d9d1563bd5a Mon Sep 17 00:00:00 2001 From: ir73 Date: Fri, 20 Dec 2019 15:32:12 +0200 Subject: [PATCH] Threshold alert (#333) --- pom.xml | 2 +- .../bi/service/NotificationsGrpcService.java | 4 + .../bi/service/dto/scheduler/ReportDTO.java | 29 ++- .../service/dto/scheduler/SchedulerDTO.java | 8 +- .../scheduler/SchedulerNotificationDTO.java | 1 + .../flair/bi/web/rest/SchedulerResource.java | 7 +- .../filter/filter-element-grpc.component.js | 9 +- .../filter/filter-parameters.service.js | 60 ++++-- .../scheduler/scheduler-dialog.controller.js | 176 +++++++++++++++--- .../flair-bi/scheduler/scheduler-dialog.html | 44 ++++- 10 files changed, 283 insertions(+), 57 deletions(-) diff --git a/pom.xml b/pom.xml index 5a61d31ee..90945ea23 100644 --- a/pom.xml +++ b/pom.xml @@ -166,7 +166,7 @@ com.project.bi flair-messages - 0.0.32 + 0.0.34 com.project.bi diff --git a/src/main/java/com/flair/bi/service/NotificationsGrpcService.java b/src/main/java/com/flair/bi/service/NotificationsGrpcService.java index 8ef71ff49..0e8f055dc 100644 --- a/src/main/java/com/flair/bi/service/NotificationsGrpcService.java +++ b/src/main/java/com/flair/bi/service/NotificationsGrpcService.java @@ -208,6 +208,7 @@ private ScheduleReport toReportProto(SchedulerNotificationDTO dto) { .setUserid(orEmpty(dto.getReport().getUserid())) .setDashboardName(orEmpty(dto.getReport().getDashboard_name())) .setViewName(orEmpty(dto.getReport().getView_name())) + .setViewId(orEmpty(String.valueOf(dto.getReport().getView_id()))) .setShareLink(orEmpty(dto.getReport().getShare_link())) .setBuildUrl(orEmpty(dto.getReport().getBuild_url())) .setMailBody(orEmpty(dto.getReport().getMail_body())) @@ -250,6 +251,7 @@ private ScheduleReport toReportProto(SchedulerNotificationDTO dto) { .build() ) .setQuery(dto.getQuery()) + .setConstraints(orEmpty(dto.getConstraints())) .build(); } @@ -272,6 +274,7 @@ private SchedulerNotificationDTO createSchedulerNotificationDTO(ScheduleReport s report.setTitle_name(scheduleReport.getReport().getTitleName()); report.setUserid(scheduleReport.getReport().getUserid()); report.setView_name(scheduleReport.getReport().getViewName()); + report.setView_id(Long.valueOf(scheduleReport.getReport().getViewId())); report.setThresholdAlert(scheduleReport.getReport().getThresholdAlert()); responseDTO.setReport(report); ReportLineItem reportLineItem = new ReportLineItem(); @@ -299,6 +302,7 @@ private SchedulerNotificationDTO createSchedulerNotificationDTO(ScheduleReport s schedule.setStart_date(scheduleReport.getSchedule().getStartDate()); schedule.setTimezone(scheduleReport.getSchedule().getTimezone()); responseDTO.setSchedule(schedule); + responseDTO.setConstraints(scheduleReport.getConstraints()); return responseDTO; } diff --git a/src/main/java/com/flair/bi/service/dto/scheduler/ReportDTO.java b/src/main/java/com/flair/bi/service/dto/scheduler/ReportDTO.java index 85727873f..569b13074 100644 --- a/src/main/java/com/flair/bi/service/dto/scheduler/ReportDTO.java +++ b/src/main/java/com/flair/bi/service/dto/scheduler/ReportDTO.java @@ -1,5 +1,8 @@ package com.flair.bi.service.dto.scheduler; +import lombok.Getter; +import lombok.Setter; + public class ReportDTO { private String userid; @@ -9,6 +12,8 @@ public class ReportDTO { private String title_name; private String dashboard_name; private String view_name; +@Getter @Setter +private Long view_id; private String share_link; private String build_url; private boolean thresholdAlert; @@ -96,12 +101,22 @@ public void setThresholdAlert(boolean thresholdAlert) { this.thresholdAlert = thresholdAlert; } -@Override -public String toString() { - return "ReportDTO [userid=" + userid + ", mail_body=" + mail_body + ", subject=" + subject + ", report_name=" - + report_name + ", title_name=" + title_name + ", dashboard_name=" + dashboard_name + ", view_name=" - + view_name + ", share_link=" + share_link + ", build_url=" + build_url + ", thresholdAlert=" - + thresholdAlert + "]"; -} + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ReportDTO{"); + sb.append("userid='").append(userid).append('\''); + sb.append(", mail_body='").append(mail_body).append('\''); + sb.append(", subject='").append(subject).append('\''); + sb.append(", report_name='").append(report_name).append('\''); + sb.append(", title_name='").append(title_name).append('\''); + sb.append(", dashboard_name='").append(dashboard_name).append('\''); + sb.append(", view_name='").append(view_name).append('\''); + sb.append(", view_id=").append(view_id); + sb.append(", share_link='").append(share_link).append('\''); + sb.append(", build_url='").append(build_url).append('\''); + sb.append(", thresholdAlert=").append(thresholdAlert); + sb.append('}'); + return sb.toString(); + } } diff --git a/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerDTO.java b/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerDTO.java index 8049c072e..d21918a12 100644 --- a/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerDTO.java +++ b/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerDTO.java @@ -1,6 +1,8 @@ package com.flair.bi.service.dto.scheduler; import com.project.bi.query.dto.QueryDTO; +import lombok.Getter; +import lombok.Setter; public class SchedulerDTO { @@ -10,6 +12,8 @@ public class SchedulerDTO { private ReportLineItem report_line_item; private AssignReport assign_report; private Schedule schedule; + @Getter @Setter + private String constraints; private QueryDTO queryDTO; private boolean putcall; private boolean emailReporter; @@ -17,12 +21,14 @@ public class SchedulerDTO { public SchedulerDTO(){} public SchedulerDTO(long datasourceid, ReportDTO report, ReportLineItem report_line_item, - AssignReport assign_report, Schedule schedule, QueryDTO queryDTO, boolean putcall, boolean emailReporter) { + AssignReport assign_report, Schedule schedule, QueryDTO queryDTO, boolean putcall, boolean emailReporter, + String constraints) { super(); this.datasourceid = datasourceid; this.report = report; this.report_line_item = report_line_item; this.assign_report = assign_report; + this.constraints = constraints; this.schedule = schedule; this.queryDTO = queryDTO; this.putcall = putcall; diff --git a/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerNotificationDTO.java b/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerNotificationDTO.java index 057ad6cc3..066e10d88 100644 --- a/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerNotificationDTO.java +++ b/src/main/java/com/flair/bi/service/dto/scheduler/SchedulerNotificationDTO.java @@ -17,4 +17,5 @@ public class SchedulerNotificationDTO { private AssignReport assign_report; private Schedule schedule; private String query; + private String constraints; } diff --git a/src/main/java/com/flair/bi/web/rest/SchedulerResource.java b/src/main/java/com/flair/bi/web/rest/SchedulerResource.java index 9ccef70d6..f1466990f 100644 --- a/src/main/java/com/flair/bi/web/rest/SchedulerResource.java +++ b/src/main/java/com/flair/bi/web/rest/SchedulerResource.java @@ -90,7 +90,12 @@ public ResponseEntity scheduleReport(@Valid @RequestBody Sche schedulerDTO.getReport().setTitle_name(visualMetadata.getTitleProperties().getTitleText()); schedulerDTO.getReport_line_item().setVisualization(visualMetadata.getMetadataVisual().getName()); String query=schedulerService.buildQuery(schedulerDTO.getQueryDTO(),visualMetadata, datasource, schedulerDTO.getReport_line_item().getVisualizationid(), schedulerDTO.getReport().getUserid()); - SchedulerNotificationDTO schedulerNotificationDTO= new SchedulerNotificationDTO(schedulerDTO.getReport(),schedulerDTO.getReport_line_item(),schedulerDTO.getAssign_report(),schedulerDTO.getSchedule(),query); + SchedulerNotificationDTO schedulerNotificationDTO= new SchedulerNotificationDTO(schedulerDTO.getReport(), + schedulerDTO.getReport_line_item(), + schedulerDTO.getAssign_report(), + schedulerDTO.getSchedule(), + query, + schedulerDTO.getConstraints()); schedulerService.setChannelCredentials(schedulerNotificationDTO); log.info("Sending schedule report {}", schedulerNotificationDTO); diff --git a/src/main/webapp/app/entities/flair-bi/filter/filter-element-grpc.component.js b/src/main/webapp/app/entities/flair-bi/filter/filter-element-grpc.component.js index bd5399d98..72bca00d4 100644 --- a/src/main/webapp/app/entities/flair-bi/filter/filter-element-grpc.component.js +++ b/src/main/webapp/app/entities/flair-bi/filter/filter-element-grpc.component.js @@ -42,14 +42,12 @@ } function resetTimezone(startDate) { - var date = new Date(startDate); - date.setMinutes(date.getMinutes() - date.getTimezoneOffset()); - return date; + return startDate; } function endOfDay(startDate) { var date = new Date(startDate); - date.setHours(23, 59 - date.getTimezoneOffset(), 59); + date.setHours(23, 59, 59); return date; } @@ -231,7 +229,8 @@ } filterParameters[vm.dimension.name].push(tag['text']); filterParameters[vm.dimension.name]._meta = { - dataType: vm.dimension.type + dataType: vm.dimension.type, + valueType: 'valueType' }; filterParametersService.saveSelectedFilter(filterParameters); } diff --git a/src/main/webapp/app/entities/flair-bi/filter/filter-parameters.service.js b/src/main/webapp/app/entities/flair-bi/filter/filter-parameters.service.js index 1676435ed..21c521c7a 100644 --- a/src/main/webapp/app/entities/flair-bi/filter/filter-parameters.service.js +++ b/src/main/webapp/app/entities/flair-bi/filter/filter-parameters.service.js @@ -86,36 +86,72 @@ '@type': 'Compare', comparatorType: 'GTE', value: value, - valueType: {value: value, type: dataType, '@type': 'valueType'}, + valueType: { + '@type': 'valueType', + value: value, + type: dataType + }, + featureName: featureName + }; + } + + function createCompareExpressionBodyForInterval(value, featureName, interval, operator) { + return { + '@type': 'Compare', + comparatorType: 'GTE', + valueType: { + '@type': 'intervalValueType', + operator: operator, + interval: interval, + value: value + }, featureName: featureName }; } function createBodyExpr(values, name) { var meta = values._meta || {}; - var dataType = meta.dataType || ''; + var valueType = meta.valueType || ''; if (name.lastIndexOf(dateRangePrefix, 0) === 0) { - setDatesInRightSideFilters(changeDateFormat(values[0]),changeDateFormat(values[1])); + values = [changeDateFormat(values[0]), changeDateFormat(values[1])]; + name = name.split('|')[1]; + setDatesInRightSideFilters(values[0], values[1]); + } + if (valueType === 'valueType') { + var dataType = meta.dataType || ''; + console.log('value type values', values); if (values.length === 2) { - return createBetweenExpressionBody(changeDateFormat(values[0]),changeDateFormat(values[1]),name.split('|')[1]); + return createBetweenExpressionBody(values[0], values[1], name, dataType); } else { return createCompareExpressionBody(values[0], name, dataType); } - }else { - return createContainsExpressionBody(values, name); + } else if (valueType === 'intervalValueType') { + var operator = meta.operator; + var initialValue = meta.initialValue; + var value = values[0]; + console.log('interval value type value', value, 'operator', operator, 'initialValue', initialValue); + return createCompareExpressionBodyForInterval(initialValue, name, value, operator); } + return createContainsExpressionBody(values, name); } - function getConditionExpression() { + function getConditionExpression(additionalFeaturesArray) { var body; var condition = { expression: null }; - for (var name in paramObject) { - if (paramObject.hasOwnProperty(name) - && paramObject[name] - && paramObject[name].length > 0) { - var values = paramObject[name]; + var finalParams = Object.assign({}, paramObject); + if (additionalFeaturesArray) { + for (var i in additionalFeaturesArray) { + var additionalFeaturesItem = additionalFeaturesArray[i]; + finalParams = Object.assign(additionalFeaturesItem, finalParams); + } + } + for (var name in finalParams) { + if (finalParams.hasOwnProperty(name) + && finalParams[name] + && finalParams[name].length > 0) { + var values = finalParams[name]; if (!condition.expression) { body = createBodyExpr(values, name); condition = new ConditionExpression(CryptoService.UUIDv4, body); diff --git a/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.controller.js b/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.controller.js index 7f362b562..2488e3cdf 100644 --- a/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.controller.js +++ b/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.controller.js @@ -14,6 +14,8 @@ }; $scope.isCronDisabled = false; + var TIME_UNIT = [{value: 'hours', title: 'Hours'}, {value: 'days', title: 'Days'}]; + var TIME_DATA_TYPES = ['timestamp', 'date', 'datetime']; var vm = this; vm.cronConfig = {quartz: false}; vm.clear = clear; @@ -21,6 +23,7 @@ vm.timezoneGroups = TIMEZONES; vm.channels=scheduler_channels; vm.COMPARISIONS=COMPARISIONS; + vm.TIME_UNIT = TIME_UNIT; vm.datePickerOpenStatus = {}; vm.openCalendar = openCalendar; vm.loadUsers=loadUsers; @@ -37,7 +40,9 @@ vm.thresholdAlert=thresholdAlert; vm.modalTitle=thresholdAlert?'Schedule Threshold Alert Report':'Schedule Report' vm.condition={}; + vm.timeConditions={}; vm.features=[]; + vm.timeCompatibleDimensions=[]; vm.vizIdPrefix='threshold_alert_:'; vm.scheduleObj={ "datasourceid":0, @@ -50,6 +55,7 @@ "mail_body":null, "dashboard_name":"", "view_name":"", + "view_id":null, "share_link":null, "build_url":"", "thresholdAlert":thresholdAlert @@ -72,6 +78,7 @@ "start_date": new Date(), "end_date": new Date() }, + "constraints":"", "putcall":false, "emailReporter":false }; @@ -82,28 +89,38 @@ function activate() { vm.datePickerOpenStatus.startDate = false; vm.datePickerOpenStatus.endDate = false; - var cronstrue = window.cronstrue; vm.scheduleObj.schedule.end_date.setDate(vm.scheduleObj.schedule.start_date.getDate()+1); if(visualMetaData){ vm.visualMetaData = visualMetaData; vm.dashboard=dashboard; vm.view=view; - getScheduleReport(visualMetaData.id); - getThresholdMeasureList(visualMetaData.fields); - vm.datasource= datasource; - if($rootScope.isThresholdAlert){ - vm.scheduleObj.report.thresholdAlert=true; - vm.condition.value=$rootScope.ThresholdViz.measureValue; - vm.condition.featureName=$rootScope.ThresholdViz.measure; - } - buildScheduleObject(vm.visualMetaData,vm.datasource,vm.dashboard,vm.view); + initFeatures(view.id) + .then(function () { + vm.datasource= datasource; + getScheduleReport(visualMetaData.id); + getThresholdMeasureList(visualMetaData.fields); + if($rootScope.isThresholdAlert){ + vm.scheduleObj.report.thresholdAlert=true; + vm.condition.value=$rootScope.ThresholdViz.measureValue; + vm.condition.featureName=$rootScope.ThresholdViz.measure; + } + buildScheduleObject(vm.visualMetaData,vm.datasource,vm.dashboard,vm.view); + }); }else{ vm.scheduleObj.emailReporter=true; vm.users=User.query(); if(scheduledObj){ vm.emailReporterEdit=true; - getVisualmetadata(scheduledObj); - updateScheduledObj(scheduledObj); + getVisualmetadata(scheduledObj) + .then(function (value) { + return initFeatures(scheduledObj.report.view_id); + }) + .then(function () { + return buildScheduledObject(scheduledObj, vm.visualMetaData); + }) + .then(function () { + return updateScheduledObj(scheduledObj); + }); }else{ loadDashboards(); } @@ -111,14 +128,42 @@ } } + function initFeatures(visualId) { + return Features.query({view: visualId}) + .$promise + .then(function (features) { + initTimeDimensions(features); + }) + .catch(function(error) { + $rootScope.showErrorSingleToast({ + text: error.data.message, + title: "Error" + }); + }); + } + + function initTimeDimensions(features) { + vm.timeCompatibleDimensions = features + .filter(function (feature) { + return feature.featureType === "DIMENSION"; + }) + .filter(function (feature) { + return isTimeType(feature); + }); + } + + function isTimeType(feature) { + var type = feature && feature.type; + return TIME_DATA_TYPES.indexOf(type.toLowerCase()) > -1; + } + function getVisualmetadata(scheduledObj){ - Visualmetadata.get({ + return Visualmetadata.get({ id: removePrefix(scheduledObj.report_line_item.visualizationid) },function(result){ vm.visualMetaData = new VisualWrap(result); getThresholdMeasureList(vm.visualMetaData.fields); - buildScheduledObject(scheduledObj,vm.visualMetaData); - }); + }).$promise; } function getScheduleReport(visualizationid) { @@ -138,6 +183,18 @@ } ); } + function setTimeConditions(timeConditions) { + if (timeConditions) { + vm.timeConditions.feature = vm.timeCompatibleDimensions.find(function (item) { + return item.definition === timeConditions.featureName; + }); + vm.timeConditions.value = timeConditions.value; + vm.timeConditions.unit = vm.TIME_UNIT.find(function (unit) { + return unit.value === timeConditions.unit; + }); + } + } + function updateScheduledObj(data){ vm.scheduleObj.assign_report.channel=data.assign_report.channel; $scope.cronExpression=data.schedule.cron_exp; @@ -146,8 +203,13 @@ vm.scheduleObj.report.mail_body=data.report.mail_body; vm.scheduleObj.putcall=true; vm.scheduleObj.report.thresholdAlert=data.report.thresholdAlert; - if(vm.scheduleObj.report.thresholdAlert) + vm.scheduleObj.constraints=data.constraints; + if (vm.scheduleObj.report.thresholdAlert) { setHavingDTO(JSON.parse(data.query)); + } + if (vm.scheduleObj.constraints) { + setTimeConditions(JSON.parse(vm.scheduleObj.constraints).time); + } if(vm.scheduleObj.emailReporter){ vm.scheduleObj.assign_report.email_list=data.assign_report.email_list; addEmailList(data.assign_report.email_list); @@ -177,15 +239,32 @@ }); } + function assignTimeConditionsToScheduledObj() { + if (!vm.timeConditions.feature) { + return; + } + var constraints = { + time: { + featureName: vm.timeConditions.feature.definition, + value: vm.timeConditions.value, + unit: vm.timeConditions.unit.value + } + }; + + vm.scheduleObj.constraints = JSON.stringify(constraints); + } + function buildScheduledObject(scheduledObj,visualMetaData){ vm.scheduleObj.report.dashboard_name=scheduledObj.report.dashboard_name; vm.scheduleObj.report.view_name=scheduledObj.report.view_name; + vm.scheduleObj.report.view_id=scheduledObj.report.view_id; vm.scheduleObj.report.build_url=scheduledObj.report.build_url; vm.scheduleObj.report.share_link=scheduledObj.report.share_link; vm.scheduleObj.datasourceid=getDatasourceId(scheduledObj.report.share_link); vm.scheduleObj.report.report_name=getReportName(visualMetaData); vm.scheduleObj.report_line_item.visualizationid=visualMetaData.id; vm.scheduleObj.queryDTO=buildQueryDTO(visualMetaData); + assignTimeConditionsToScheduledObj(); setDimentionsAndMeasures(visualMetaData.fields); } @@ -193,14 +272,16 @@ function buildScheduleObject(visualMetaData,datasource,dashboard,view){ vm.scheduleObj.report.dashboard_name=dashboard.dashboardName; vm.scheduleObj.report.view_name=view.viewName; + vm.scheduleObj.report.view_id=view.id; vm.scheduleObj.report.build_url=builUrl(dashboard,view); vm.scheduleObj.report.share_link=getShareLink(visualMetaData,datasource); vm.scheduleObj.datasourceid=datasource.id; vm.scheduleObj.report.report_name=getReportName(visualMetaData); vm.scheduleObj.report_line_item.visualizationid=visualMetaData.id; vm.scheduleObj.queryDTO=buildQueryDTO(visualMetaData); + assignTimeConditionsToScheduledObj(); setDimentionsAndMeasures(visualMetaData.fields); - + } function getShareLink(visualMetaData,datasource) { @@ -237,29 +318,62 @@ return vId+":"+connectionId; } + function getAdditionalConditionalExpressions() { + var additionalFeatures = []; + if (vm.timeConditions.feature) { + var featureData = {}; + var featureDefinition = vm.timeConditions.feature.definition; + featureData[featureDefinition] = [ + vm.timeConditions.value + ' ' + vm.timeConditions.unit.value + ]; + featureData[featureDefinition]._meta = { + operator: '-', + initialValue: 'NOW()', + valueType: 'intervalValueType' + }; + additionalFeatures.push(featureData); + } + return additionalFeatures; + } + function buildQueryDTO(visualMetaData){ - return visualMetaData.getQueryParameters(filterParametersService.get(), filterParametersService.getConditionExpression()); + return visualMetaData.getQueryParameters( + filterParametersService.get(), + filterParametersService.getConditionExpression(getAdditionalConditionalExpressions()) + ); } function schedule() { + if (!vm.visualMetaData) { + getVisualmetadata(scheduledObj) + .then(function () { + continueSchedule(); + }); + } else { + continueSchedule(); + } + } + + function continueSchedule() { + vm.scheduleObj.queryDTO = buildQueryDTO(vm.visualMetaData); if(validateAndSetHaving()){ vm.isSaving = true; setScheduledData(); schedulerService.scheduleReport(vm.scheduleObj).then(function (success) { vm.isSaving = false; if (success.data.message) { - $rootScope.showErrorSingleToast({ - text: success.data.message, - title: "Error" - }); + $rootScope.showErrorSingleToast({ + text: success.data.message, + title: "Error" + }); } else { - $uibModalInstance.close(vm.scheduleObj); + $uibModalInstance.close(vm.scheduleObj); } }).catch(function (error) { vm.isSaving = false; $rootScope.showErrorSingleToast({ - text: error.data.message, - title: "Error" + text: error.data.message, + title: "Error" }); }); }else{ @@ -278,6 +392,7 @@ function validateAndSetHaving(){ var flag=true; + assignTimeConditionsToScheduledObj(); if(vm.scheduleObj.report.thresholdAlert){ vm.scheduleObj.queryDTO.having=getHavingDTO(); vm.scheduleObj.queryDTO.having[0].featureName?flag=true:flag=false; @@ -323,7 +438,7 @@ } $rootScope.showSuccessToast(info); vm.clear(); - }).catch(function (error) { + }).catch(function (error) { var info = { text: error.data.message, title: "Error" @@ -370,9 +485,12 @@ function changeVisualization(visualMetaData){ vm.visualMetaData = new VisualWrap(visualMetaData); vm.datasource=vm.dashboard.dashboardDatasource; - getScheduleReport(visualMetaData.id); - getThresholdMeasureList(visualMetaData.fields); - buildScheduleObject(vm.visualMetaData,vm.datasource,vm.dashboard,vm.view); + initFeatures(vm.view.id) + .then(function () { + getScheduleReport(visualMetaData.id); + getThresholdMeasureList(visualMetaData.fields); + buildScheduleObject(vm.visualMetaData, vm.datasource, vm.dashboard, vm.view); + }); } function getHavingDTO(){ diff --git a/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.html b/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.html index 5ec3f039c..34f787ad3 100644 --- a/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.html +++ b/src/main/webapp/app/entities/flair-bi/scheduler/scheduler-dialog.html @@ -137,6 +137,48 @@ +
+
+ + + + {{vm.timeConditions.feature.definition}} + + +
+
+
+
+
+ + + + {{vm.timeConditions.unit.title}} + + + {{unit.title}} + + +
+
+ + +
+

@@ -210,4 +252,4 @@
-
\ No newline at end of file +