Commit 88434dec27a5c318701fdbce4d17af4b7e041a19
Committed by
Andrew Shvayka
1 parent
c84a8a5e
Improvement alarms widget limit (#2257)
* Add support import label * Add chunk size * Refactoring and add template to max limit * Add max number load alarms
Showing
8 changed files
with
120 additions
and
36 deletions
@@ -183,7 +183,7 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | @@ -183,7 +183,7 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | ||
183 | return deferred.promise; | 183 | return deferred.promise; |
184 | } | 184 | } |
185 | 185 | ||
186 | - function fetchAlarms(alarmsQuery, pageLink, deferred, alarmsList) { | 186 | + function fetchAlarms(alarmsQuery, pageLink, deferred, leftToLoad, alarmsList) { |
187 | getAlarms(alarmsQuery.entityType, alarmsQuery.entityId, | 187 | getAlarms(alarmsQuery.entityType, alarmsQuery.entityId, |
188 | pageLink, alarmsQuery.alarmSearchStatus, alarmsQuery.alarmStatus, | 188 | pageLink, alarmsQuery.alarmSearchStatus, alarmsQuery.alarmStatus, |
189 | alarmsQuery.fetchOriginator, false, {ignoreLoading: true}).then( | 189 | alarmsQuery.fetchOriginator, false, {ignoreLoading: true}).then( |
@@ -192,8 +192,19 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | @@ -192,8 +192,19 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | ||
192 | alarmsList = []; | 192 | alarmsList = []; |
193 | } | 193 | } |
194 | alarmsList = alarmsList.concat(alarms.data); | 194 | alarmsList = alarmsList.concat(alarms.data); |
195 | + if (angular.isDefined(leftToLoad)) { | ||
196 | + leftToLoad -= pageLink.limit; | ||
197 | + if (leftToLoad === 0) { | ||
198 | + alarmsList = $filter('orderBy')(alarmsList, ['-createdTime']); | ||
199 | + deferred.resolve(alarmsList); | ||
200 | + return; | ||
201 | + } | ||
202 | + if (leftToLoad < pageLink.limit) { | ||
203 | + alarms.nextPageLink.limit = leftToLoad; | ||
204 | + } | ||
205 | + } | ||
195 | if (alarms.hasNext && !alarmsQuery.limit) { | 206 | if (alarms.hasNext && !alarmsQuery.limit) { |
196 | - fetchAlarms(alarmsQuery, alarms.nextPageLink, deferred, alarmsList); | 207 | + fetchAlarms(alarmsQuery, alarms.nextPageLink, deferred, leftToLoad, alarmsList); |
197 | } else { | 208 | } else { |
198 | alarmsList = $filter('orderBy')(alarmsList, ['-createdTime']); | 209 | alarmsList = $filter('orderBy')(alarmsList, ['-createdTime']); |
199 | deferred.resolve(alarmsList); | 210 | deferred.resolve(alarmsList); |
@@ -209,26 +220,34 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | @@ -209,26 +220,34 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | ||
209 | var deferred = $q.defer(); | 220 | var deferred = $q.defer(); |
210 | var time = Date.now(); | 221 | var time = Date.now(); |
211 | var pageLink; | 222 | var pageLink; |
223 | + var leftToLoad; | ||
212 | if (alarmsQuery.limit) { | 224 | if (alarmsQuery.limit) { |
213 | pageLink = { | 225 | pageLink = { |
214 | limit: alarmsQuery.limit | 226 | limit: alarmsQuery.limit |
215 | }; | 227 | }; |
216 | } else if (alarmsQuery.interval) { | 228 | } else if (alarmsQuery.interval) { |
217 | pageLink = { | 229 | pageLink = { |
218 | - limit: 100, | 230 | + limit: alarmsQuery.alarmsFetchSize || 100, |
219 | startTime: time - alarmsQuery.interval | 231 | startTime: time - alarmsQuery.interval |
220 | }; | 232 | }; |
221 | } else if (alarmsQuery.startTime) { | 233 | } else if (alarmsQuery.startTime) { |
222 | pageLink = { | 234 | pageLink = { |
223 | - limit: 100, | 235 | + limit: alarmsQuery.alarmsFetchSize || 100, |
224 | startTime: Math.round(alarmsQuery.startTime) | 236 | startTime: Math.round(alarmsQuery.startTime) |
225 | - } | 237 | + }; |
226 | if (alarmsQuery.endTime) { | 238 | if (alarmsQuery.endTime) { |
227 | pageLink.endTime = Math.round(alarmsQuery.endTime); | 239 | pageLink.endTime = Math.round(alarmsQuery.endTime); |
228 | } | 240 | } |
229 | } | 241 | } |
230 | 242 | ||
231 | - fetchAlarms(alarmsQuery, pageLink, deferred); | 243 | + if (angular.isDefined(alarmsQuery.alarmsMaxCountLoad) && alarmsQuery.alarmsMaxCountLoad !== 0) { |
244 | + leftToLoad = alarmsQuery.alarmsMaxCountLoad; | ||
245 | + if (leftToLoad < pageLink.limit) { | ||
246 | + pageLink.limit = leftToLoad; | ||
247 | + } | ||
248 | + } | ||
249 | + | ||
250 | + fetchAlarms(alarmsQuery, pageLink, deferred, leftToLoad); | ||
232 | return deferred.promise; | 251 | return deferred.promise; |
233 | } | 252 | } |
234 | 253 | ||
@@ -276,8 +295,10 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | @@ -276,8 +295,10 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { | ||
276 | entityType: alarmSource.entityType, | 295 | entityType: alarmSource.entityType, |
277 | entityId: alarmSource.entityId, | 296 | entityId: alarmSource.entityId, |
278 | alarmSearchStatus: alarmSourceListener.alarmSearchStatus, | 297 | alarmSearchStatus: alarmSourceListener.alarmSearchStatus, |
279 | - alarmStatus: null | ||
280 | - } | 298 | + alarmStatus: null, |
299 | + alarmsMaxCountLoad: alarmSourceListener.alarmsMaxCountLoad, | ||
300 | + alarmsFetchSize: alarmSourceListener.alarmsFetchSize | ||
301 | + }; | ||
281 | var originatorKeys = $filter('filter')(alarmSource.dataKeys, {name: 'originator'}); | 302 | var originatorKeys = $filter('filter')(alarmSource.dataKeys, {name: 'originator'}); |
282 | if (originatorKeys && originatorKeys.length) { | 303 | if (originatorKeys && originatorKeys.length) { |
283 | alarmSourceListener.alarmsQuery.fetchOriginator = true; | 304 | alarmSourceListener.alarmsQuery.fetchOriginator = true; |
@@ -75,6 +75,10 @@ export default class Subscription { | @@ -75,6 +75,10 @@ export default class Subscription { | ||
75 | options.alarmSearchStatus : this.ctx.types.alarmSearchStatus.any; | 75 | options.alarmSearchStatus : this.ctx.types.alarmSearchStatus.any; |
76 | this.alarmsPollingInterval = angular.isDefined(options.alarmsPollingInterval) ? | 76 | this.alarmsPollingInterval = angular.isDefined(options.alarmsPollingInterval) ? |
77 | options.alarmsPollingInterval : 5000; | 77 | options.alarmsPollingInterval : 5000; |
78 | + this.alarmsMaxCountLoad = angular.isDefined(options.alarmsMaxCountLoad) ? | ||
79 | + options.alarmsMaxCountLoad : 0; | ||
80 | + this.alarmsFetchSize = angular.isDefined(options.alarmsFetchSize) ? | ||
81 | + options.alarmsFetchSize : 100; | ||
78 | 82 | ||
79 | this.alarmSourceListener = null; | 83 | this.alarmSourceListener = null; |
80 | this.alarms = []; | 84 | this.alarms = []; |
@@ -915,6 +919,8 @@ export default class Subscription { | @@ -915,6 +919,8 @@ export default class Subscription { | ||
915 | alarmSource: this.alarmSource, | 919 | alarmSource: this.alarmSource, |
916 | alarmSearchStatus: this.alarmSearchStatus, | 920 | alarmSearchStatus: this.alarmSearchStatus, |
917 | alarmsPollingInterval: this.alarmsPollingInterval, | 921 | alarmsPollingInterval: this.alarmsPollingInterval, |
922 | + alarmsMaxCountLoad: this.alarmsMaxCountLoad, | ||
923 | + alarmsFetchSize: this.alarmsFetchSize, | ||
918 | alarmsUpdated: function(alarms, apply) { | 924 | alarmsUpdated: function(alarms, apply) { |
919 | subscription.alarmsUpdated(alarms, apply); | 925 | subscription.alarmsUpdated(alarms, apply); |
920 | } | 926 | } |
@@ -173,6 +173,10 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout | @@ -173,6 +173,10 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout | ||
173 | config.alarmSearchStatus : types.alarmSearchStatus.any; | 173 | config.alarmSearchStatus : types.alarmSearchStatus.any; |
174 | scope.alarmsPollingInterval = angular.isDefined(config.alarmsPollingInterval) ? | 174 | scope.alarmsPollingInterval = angular.isDefined(config.alarmsPollingInterval) ? |
175 | config.alarmsPollingInterval : 5; | 175 | config.alarmsPollingInterval : 5; |
176 | + scope.alarmsMaxCountLoad = angular.isDefined(config.alarmsMaxCountLoad) ? | ||
177 | + config.alarmsMaxCountLoad : 0; | ||
178 | + scope.alarmsFetchSize = angular.isDefined(config.alarmsFetchSize) ? | ||
179 | + config.alarmsFetchSize : 100; | ||
176 | if (config.alarmSource) { | 180 | if (config.alarmSource) { |
177 | scope.alarmSource.value = config.alarmSource; | 181 | scope.alarmSource.value = config.alarmSource; |
178 | } else { | 182 | } else { |
@@ -243,7 +247,7 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout | @@ -243,7 +247,7 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout | ||
243 | 247 | ||
244 | scope.$watch('title + showTitleIcon + titleIcon + iconColor + iconSize + titleTooltip + showTitle + dropShadow + enableFullscreen + backgroundColor + ' + | 248 | scope.$watch('title + showTitleIcon + titleIcon + iconColor + iconSize + titleTooltip + showTitle + dropShadow + enableFullscreen + backgroundColor + ' + |
245 | 'color + padding + margin + widgetStyle + titleStyle + mobileOrder + mobileHeight + units + decimals + useDashboardTimewindow + ' + | 249 | 'color + padding + margin + widgetStyle + titleStyle + mobileOrder + mobileHeight + units + decimals + useDashboardTimewindow + ' + |
246 | - 'displayTimewindow + alarmSearchStatus + alarmsPollingInterval + showLegend', function () { | 250 | + 'displayTimewindow + alarmSearchStatus + alarmsPollingInterval + alarmsMaxCountLoad + alarmsFetchSize + showLegend', function () { |
247 | if (ngModelCtrl.$viewValue) { | 251 | if (ngModelCtrl.$viewValue) { |
248 | var value = ngModelCtrl.$viewValue; | 252 | var value = ngModelCtrl.$viewValue; |
249 | if (value.config) { | 253 | if (value.config) { |
@@ -277,6 +281,8 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout | @@ -277,6 +281,8 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout | ||
277 | config.displayTimewindow = scope.displayTimewindow; | 281 | config.displayTimewindow = scope.displayTimewindow; |
278 | config.alarmSearchStatus = scope.alarmSearchStatus; | 282 | config.alarmSearchStatus = scope.alarmSearchStatus; |
279 | config.alarmsPollingInterval = scope.alarmsPollingInterval; | 283 | config.alarmsPollingInterval = scope.alarmsPollingInterval; |
284 | + config.alarmsMaxCountLoad = scope.alarmsMaxCountLoad; | ||
285 | + config.alarmsFetchSize = scope.alarmsFetchSize; | ||
280 | config.showLegend = scope.showLegend; | 286 | config.showLegend = scope.showLegend; |
281 | } | 287 | } |
282 | if (value.layout) { | 288 | if (value.layout) { |
@@ -37,29 +37,58 @@ | @@ -37,29 +37,58 @@ | ||
37 | is-edit="true" flex ng-model="timewindow"></tb-timewindow> | 37 | is-edit="true" flex ng-model="timewindow"></tb-timewindow> |
38 | </section> | 38 | </section> |
39 | </div> | 39 | </div> |
40 | - <div ng-show="widgetType === types.widgetType.alarm.value" layout='column' layout-align="center" | ||
41 | - layout-gt-sm='row' layout-align-gt-sm="start center"> | ||
42 | - <md-input-container class="md-block" flex> | ||
43 | - <label translate>alarm.alarm-status</label> | ||
44 | - <md-select ng-model="alarmSearchStatus" style="padding-bottom: 24px;"> | ||
45 | - <md-option ng-repeat="searchStatus in types.alarmSearchStatus" ng-value="searchStatus"> | ||
46 | - {{ ('alarm.search-status.' + searchStatus) | translate }} | ||
47 | - </md-option> | ||
48 | - </md-select> | ||
49 | - </md-input-container> | ||
50 | - <md-input-container flex class="md-block"> | ||
51 | - <label translate>alarm.polling-interval</label> | ||
52 | - <input ng-required="widgetType === types.widgetType.alarm.value" | ||
53 | - type="number" | ||
54 | - step="1" | ||
55 | - min="1" | ||
56 | - name="alarmsPollingInterval" | ||
57 | - ng-model="alarmsPollingInterval"/> | ||
58 | - <div ng-messages="theForm.alarmsPollingInterval.$error" multiple md-auto-hide="false"> | ||
59 | - <div ng-message="required" translate>alarm.polling-interval-required</div> | ||
60 | - <div ng-message="min" translate>alarm.min-polling-interval-message</div> | ||
61 | - </div> | ||
62 | - </md-input-container> | 40 | + <div ng-show="widgetType === types.widgetType.alarm.value" layout='column' layout-align="center"> |
41 | + <div layout-gt-sm='row' layout-align-gt-sm="start center"> | ||
42 | + <md-input-container class="md-block" flex> | ||
43 | + <label translate>alarm.alarm-status</label> | ||
44 | + <md-select ng-model="alarmSearchStatus" style="padding-bottom: 24px;"> | ||
45 | + <md-option ng-repeat="searchStatus in types.alarmSearchStatus" ng-value="searchStatus"> | ||
46 | + {{ ('alarm.search-status.' + searchStatus) | translate }} | ||
47 | + </md-option> | ||
48 | + </md-select> | ||
49 | + </md-input-container> | ||
50 | + <md-input-container flex class="md-block"> | ||
51 | + <label translate>alarm.polling-interval</label> | ||
52 | + <input ng-required="widgetType === types.widgetType.alarm.value" | ||
53 | + type="number" | ||
54 | + step="1" | ||
55 | + min="1" | ||
56 | + name="alarmsPollingInterval" | ||
57 | + ng-model="alarmsPollingInterval"/> | ||
58 | + <div ng-messages="theForm.alarmsPollingInterval.$error" multiple md-auto-hide="false"> | ||
59 | + <div ng-message="required" translate>alarm.polling-interval-required</div> | ||
60 | + <div ng-message="min" translate>alarm.min-polling-interval-message</div> | ||
61 | + </div> | ||
62 | + </md-input-container> | ||
63 | + </div> | ||
64 | + <div layout-gt-sm='row' layout-align-gt-sm="start center"> | ||
65 | + <md-input-container flex class="md-block"> | ||
66 | + <label translate>alarm.max-count-load</label> | ||
67 | + <input ng-required="widgetType === types.widgetType.alarm.value" | ||
68 | + type="number" | ||
69 | + step="1" | ||
70 | + min="0" | ||
71 | + name="alarmsMaxCountLoad" | ||
72 | + ng-model="alarmsMaxCountLoad"/> | ||
73 | + <div ng-messages="theForm.alarmsMaxCountLoad.$error" multiple md-auto-hide="false"> | ||
74 | + <div ng-message="required" translate>alarm.max-count-load-required</div> | ||
75 | + <div ng-message="min" translate>alarm.max-count-load-error-min</div> | ||
76 | + </div> | ||
77 | + </md-input-container> | ||
78 | + <md-input-container flex class="md-block"> | ||
79 | + <label translate>alarm.fetch-size</label> | ||
80 | + <input ng-required="widgetType === types.widgetType.alarm.value" | ||
81 | + type="number" | ||
82 | + step="1" | ||
83 | + min="10" | ||
84 | + name="alarmsFetchSize" | ||
85 | + ng-model="alarmsFetchSize"/> | ||
86 | + <div ng-messages="theForm.alarmsFetchSize.$error" multiple md-auto-hide="false"> | ||
87 | + <div ng-message="required" translate>alarm.fetch-size-required</div> | ||
88 | + <div ng-message="min" translate>alarm.fetch-size-error-min</div> | ||
89 | + </div> | ||
90 | + </md-input-container> | ||
91 | + </div> | ||
63 | </div> | 92 | </div> |
64 | <v-accordion id="datasources-accordion" control="datasourcesAccordion" class="vAccordion--default" | 93 | <v-accordion id="datasources-accordion" control="datasourcesAccordion" class="vAccordion--default" |
65 | ng-show="widgetType !== types.widgetType.rpc.value | 94 | ng-show="widgetType !== types.widgetType.rpc.value |
@@ -367,6 +367,10 @@ export default function WidgetController($scope, $state, $timeout, $window, $ocL | @@ -367,6 +367,10 @@ export default function WidgetController($scope, $state, $timeout, $window, $ocL | ||
367 | widget.config.alarmSearchStatus : types.alarmSearchStatus.any; | 367 | widget.config.alarmSearchStatus : types.alarmSearchStatus.any; |
368 | options.alarmsPollingInterval = angular.isDefined(widget.config.alarmsPollingInterval) ? | 368 | options.alarmsPollingInterval = angular.isDefined(widget.config.alarmsPollingInterval) ? |
369 | widget.config.alarmsPollingInterval * 1000 : 5000; | 369 | widget.config.alarmsPollingInterval * 1000 : 5000; |
370 | + options.alarmsMaxCountLoad = angular.isDefined(widget.config.alarmsMaxCountLoad) ? | ||
371 | + widget.config.alarmsMaxCountLoad : 0; | ||
372 | + options.alarmsFetchSize = angular.isDefined(widget.config.alarmsFetchSize) ? | ||
373 | + widget.config.alarmsFetchSize : 100; | ||
370 | } else { | 374 | } else { |
371 | options.datasources = angular.copy(widget.config.datasources) | 375 | options.datasources = angular.copy(widget.config.datasources) |
372 | } | 376 | } |
@@ -162,7 +162,13 @@ | @@ -162,7 +162,13 @@ | ||
162 | "clear-alarms-text": "Are you sure you want to clear { count, plural, 1 {1 alarm} other {# alarms} }?", | 162 | "clear-alarms-text": "Are you sure you want to clear { count, plural, 1 {1 alarm} other {# alarms} }?", |
163 | "clear-alarm-title": "Clear Alarm", | 163 | "clear-alarm-title": "Clear Alarm", |
164 | "clear-alarm-text": "Are you sure you want to clear Alarm?", | 164 | "clear-alarm-text": "Are you sure you want to clear Alarm?", |
165 | - "alarm-status-filter": "Alarm Status Filter" | 165 | + "alarm-status-filter": "Alarm Status Filter", |
166 | + "max-count-load": "Maximum number of alarms to load (0 - unlimited)", | ||
167 | + "max-count-load-required": "Maximum number of alarms to load is required.", | ||
168 | + "max-count-load-error-min": "Minimum value is 0.", | ||
169 | + "fetch-size": "Fetch size", | ||
170 | + "fetch-size-required": "Fetch size is required.", | ||
171 | + "fetch-size-error-min": "Minimum value is 10." | ||
166 | }, | 172 | }, |
167 | "alias": { | 173 | "alias": { |
168 | "add": "Add alias", | 174 | "add": "Add alias", |
@@ -162,7 +162,13 @@ | @@ -162,7 +162,13 @@ | ||
162 | "clear-alarms-text": "Вы точно хотите сбросить { count, plural, 1 {1 оповещение} other {# оповещений} }?", | 162 | "clear-alarms-text": "Вы точно хотите сбросить { count, plural, 1 {1 оповещение} other {# оповещений} }?", |
163 | "clear-alarm-title": "Сбросить оповещение", | 163 | "clear-alarm-title": "Сбросить оповещение", |
164 | "clear-alarm-text": "Вы точно хотите сбросить оповещение?", | 164 | "clear-alarm-text": "Вы точно хотите сбросить оповещение?", |
165 | - "alarm-status-filter": "Фильтр оповещений" | 165 | + "alarm-status-filter": "Фильтр оповещений", |
166 | + "max-count-load": "Максимальное количество оповещений для загрузки (0 - неограниченно)", | ||
167 | + "max-count-load-required": "Максимальное количество оповещений для загрузки обязателен.", | ||
168 | + "max-count-load-error-min": "Минимальное значение 0.", | ||
169 | + "fetch-size": "Размер пакета для загрузки", | ||
170 | + "fetch-size-required": "Размер пакета для загрузки обязателен.", | ||
171 | + "fetch-size-error-min": "Минимальное значение 10." | ||
166 | }, | 172 | }, |
167 | "alias": { | 173 | "alias": { |
168 | "add": "Добавить псевдоним", | 174 | "add": "Добавить псевдоним", |
@@ -178,7 +178,13 @@ | @@ -178,7 +178,13 @@ | ||
178 | "clear-alarms-text": "Ви впевнені, що хочете деактивувати { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }?", | 178 | "clear-alarms-text": "Ви впевнені, що хочете деактивувати { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }?", |
179 | "clear-alarm-title": "Деактивувати сигнал тривоги", | 179 | "clear-alarm-title": "Деактивувати сигнал тривоги", |
180 | "clear-alarm-text": "Ви впевнені, що хочете деактивувати сигнал тривоги?", | 180 | "clear-alarm-text": "Ви впевнені, що хочете деактивувати сигнал тривоги?", |
181 | - "alarm-status-filter": "Фільтр статусу сигналу тривоги" | 181 | + "alarm-status-filter": "Фільтр статусу сигналу тривоги", |
182 | + "max-count-load": "Максимальна кількість сигналів тривоги для завантаження (0 - необмежено)", | ||
183 | + "max-count-load-required": "Необхідно задати максимальну кількість сигналів тривоги для завантаження.", | ||
184 | + "max-count-load-error-min": "Мінімальне значення 0.", | ||
185 | + "fetch-size": "Розмір пакету для завантаження", | ||
186 | + "fetch-size-required": "Необхідно задати розмір пакету для завантаження.", | ||
187 | + "fetch-size-error-min": "Мінімальне значення 10." | ||
182 | }, | 188 | }, |
183 | "alias": { | 189 | "alias": { |
184 | "add": "Додати псевдонім ", | 190 | "add": "Додати псевдонім ", |
@@ -2386,4 +2392,4 @@ | @@ -2386,4 +2392,4 @@ | ||
2386 | "el_GR": "Грецька" | 2392 | "el_GR": "Грецька" |
2387 | } | 2393 | } |
2388 | } | 2394 | } |
2389 | -} | ||
2395 | +} |