Commit 88434dec27a5c318701fdbce4d17af4b7e041a19

Authored by Vladyslav
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
@@ -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 +}