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 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 +}
... ...