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 | 183 | return deferred.promise; |
184 | 184 | } |
185 | 185 | |
186 | - function fetchAlarms(alarmsQuery, pageLink, deferred, alarmsList) { | |
186 | + function fetchAlarms(alarmsQuery, pageLink, deferred, leftToLoad, alarmsList) { | |
187 | 187 | getAlarms(alarmsQuery.entityType, alarmsQuery.entityId, |
188 | 188 | pageLink, alarmsQuery.alarmSearchStatus, alarmsQuery.alarmStatus, |
189 | 189 | alarmsQuery.fetchOriginator, false, {ignoreLoading: true}).then( |
... | ... | @@ -192,8 +192,19 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { |
192 | 192 | alarmsList = []; |
193 | 193 | } |
194 | 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 | 206 | if (alarms.hasNext && !alarmsQuery.limit) { |
196 | - fetchAlarms(alarmsQuery, alarms.nextPageLink, deferred, alarmsList); | |
207 | + fetchAlarms(alarmsQuery, alarms.nextPageLink, deferred, leftToLoad, alarmsList); | |
197 | 208 | } else { |
198 | 209 | alarmsList = $filter('orderBy')(alarmsList, ['-createdTime']); |
199 | 210 | deferred.resolve(alarmsList); |
... | ... | @@ -209,26 +220,34 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { |
209 | 220 | var deferred = $q.defer(); |
210 | 221 | var time = Date.now(); |
211 | 222 | var pageLink; |
223 | + var leftToLoad; | |
212 | 224 | if (alarmsQuery.limit) { |
213 | 225 | pageLink = { |
214 | 226 | limit: alarmsQuery.limit |
215 | 227 | }; |
216 | 228 | } else if (alarmsQuery.interval) { |
217 | 229 | pageLink = { |
218 | - limit: 100, | |
230 | + limit: alarmsQuery.alarmsFetchSize || 100, | |
219 | 231 | startTime: time - alarmsQuery.interval |
220 | 232 | }; |
221 | 233 | } else if (alarmsQuery.startTime) { |
222 | 234 | pageLink = { |
223 | - limit: 100, | |
235 | + limit: alarmsQuery.alarmsFetchSize || 100, | |
224 | 236 | startTime: Math.round(alarmsQuery.startTime) |
225 | - } | |
237 | + }; | |
226 | 238 | if (alarmsQuery.endTime) { |
227 | 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 | 251 | return deferred.promise; |
233 | 252 | } |
234 | 253 | |
... | ... | @@ -276,8 +295,10 @@ function AlarmService($http, $q, $interval, $filter, $timeout, utils, types) { |
276 | 295 | entityType: alarmSource.entityType, |
277 | 296 | entityId: alarmSource.entityId, |
278 | 297 | alarmSearchStatus: alarmSourceListener.alarmSearchStatus, |
279 | - alarmStatus: null | |
280 | - } | |
298 | + alarmStatus: null, | |
299 | + alarmsMaxCountLoad: alarmSourceListener.alarmsMaxCountLoad, | |
300 | + alarmsFetchSize: alarmSourceListener.alarmsFetchSize | |
301 | + }; | |
281 | 302 | var originatorKeys = $filter('filter')(alarmSource.dataKeys, {name: 'originator'}); |
282 | 303 | if (originatorKeys && originatorKeys.length) { |
283 | 304 | alarmSourceListener.alarmsQuery.fetchOriginator = true; | ... | ... |
... | ... | @@ -75,6 +75,10 @@ export default class Subscription { |
75 | 75 | options.alarmSearchStatus : this.ctx.types.alarmSearchStatus.any; |
76 | 76 | this.alarmsPollingInterval = angular.isDefined(options.alarmsPollingInterval) ? |
77 | 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 | 83 | this.alarmSourceListener = null; |
80 | 84 | this.alarms = []; |
... | ... | @@ -915,6 +919,8 @@ export default class Subscription { |
915 | 919 | alarmSource: this.alarmSource, |
916 | 920 | alarmSearchStatus: this.alarmSearchStatus, |
917 | 921 | alarmsPollingInterval: this.alarmsPollingInterval, |
922 | + alarmsMaxCountLoad: this.alarmsMaxCountLoad, | |
923 | + alarmsFetchSize: this.alarmsFetchSize, | |
918 | 924 | alarmsUpdated: function(alarms, apply) { |
919 | 925 | subscription.alarmsUpdated(alarms, apply); |
920 | 926 | } | ... | ... |
... | ... | @@ -173,6 +173,10 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout |
173 | 173 | config.alarmSearchStatus : types.alarmSearchStatus.any; |
174 | 174 | scope.alarmsPollingInterval = angular.isDefined(config.alarmsPollingInterval) ? |
175 | 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 | 180 | if (config.alarmSource) { |
177 | 181 | scope.alarmSource.value = config.alarmSource; |
178 | 182 | } else { |
... | ... | @@ -243,7 +247,7 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout |
243 | 247 | |
244 | 248 | scope.$watch('title + showTitleIcon + titleIcon + iconColor + iconSize + titleTooltip + showTitle + dropShadow + enableFullscreen + backgroundColor + ' + |
245 | 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 | 251 | if (ngModelCtrl.$viewValue) { |
248 | 252 | var value = ngModelCtrl.$viewValue; |
249 | 253 | if (value.config) { |
... | ... | @@ -277,6 +281,8 @@ function WidgetConfig($compile, $templateCache, $rootScope, $translate, $timeout |
277 | 281 | config.displayTimewindow = scope.displayTimewindow; |
278 | 282 | config.alarmSearchStatus = scope.alarmSearchStatus; |
279 | 283 | config.alarmsPollingInterval = scope.alarmsPollingInterval; |
284 | + config.alarmsMaxCountLoad = scope.alarmsMaxCountLoad; | |
285 | + config.alarmsFetchSize = scope.alarmsFetchSize; | |
280 | 286 | config.showLegend = scope.showLegend; |
281 | 287 | } |
282 | 288 | if (value.layout) { | ... | ... |
... | ... | @@ -37,29 +37,58 @@ |
37 | 37 | is-edit="true" flex ng-model="timewindow"></tb-timewindow> |
38 | 38 | </section> |
39 | 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 | 92 | </div> |
64 | 93 | <v-accordion id="datasources-accordion" control="datasourcesAccordion" class="vAccordion--default" |
65 | 94 | ng-show="widgetType !== types.widgetType.rpc.value | ... | ... |
... | ... | @@ -367,6 +367,10 @@ export default function WidgetController($scope, $state, $timeout, $window, $ocL |
367 | 367 | widget.config.alarmSearchStatus : types.alarmSearchStatus.any; |
368 | 368 | options.alarmsPollingInterval = angular.isDefined(widget.config.alarmsPollingInterval) ? |
369 | 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 | 374 | } else { |
371 | 375 | options.datasources = angular.copy(widget.config.datasources) |
372 | 376 | } | ... | ... |
... | ... | @@ -162,7 +162,13 @@ |
162 | 162 | "clear-alarms-text": "Are you sure you want to clear { count, plural, 1 {1 alarm} other {# alarms} }?", |
163 | 163 | "clear-alarm-title": "Clear Alarm", |
164 | 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 | 173 | "alias": { |
168 | 174 | "add": "Add alias", | ... | ... |
... | ... | @@ -162,7 +162,13 @@ |
162 | 162 | "clear-alarms-text": "Вы точно хотите сбросить { count, plural, 1 {1 оповещение} other {# оповещений} }?", |
163 | 163 | "clear-alarm-title": "Сбросить оповещение", |
164 | 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 | 173 | "alias": { |
168 | 174 | "add": "Добавить псевдоним", | ... | ... |
... | ... | @@ -178,7 +178,13 @@ |
178 | 178 | "clear-alarms-text": "Ви впевнені, що хочете деактивувати { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }?", |
179 | 179 | "clear-alarm-title": "Деактивувати сигнал тривоги", |
180 | 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 | 189 | "alias": { |
184 | 190 | "add": "Додати псевдонім ", |
... | ... | @@ -2386,4 +2392,4 @@ |
2386 | 2392 | "el_GR": "Грецька" |
2387 | 2393 | } |
2388 | 2394 | } |
2389 | -} | |
\ No newline at end of file | ||
2395 | +} | ... | ... |