blob: 6524f306269b569be6e5bb7e498932925e852e3d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
/**
* Option for "filter by state" drop down
* @typedef {object} categoryObject
* @property {string} value "all|warning|critical"
* @property {number} count number of items with <code>state</code> equal to <code>this.value</code>
* @property {string} labelPath key in the messages.js
* @property {string} label localized label
*/
var categoryObject = Em.Object.extend({
value: '',
count: 0,
labelPath: '',
label: function () {
return Em.I18n.t(this.get('labelPath')).format(this.get('count'));
}.property('count', 'labelPath')
});
App.AlertInstancesPopupView = App.TableView.extend(App.TableServerViewMixin, {
templateName: require('templates/main/alerts/alert_notifications_popup'),
updaterBinding: 'App.router.updateController',
controllerBinding: 'App.router.mainAlertInstancesController',
/**
* Number of all critical and warning alert instances
* @type {Boolean}
*/
alertsNumberBinding: 'App.router.mainAlertDefinitionsController.unhealthyAlertInstancesCount',
criticalNumberBinding: 'App.router.mainAlertDefinitionsController.criticalAlertInstancesCount',
warningNumberBinding: 'App.router.mainAlertDefinitionsController.warningAlertInstancesCount',
isPaginate: false,
willInsertElement: function () {
this._super();
this.updateAlertInstances();
},
didInsertElement: function () {
this.filter();
this.addObserver('filteringComplete', this, this.overlayObserver);
this.overlayObserver();
$(".notifications-body .filter-select ").click(function(event){
event.stopPropagation();
});
return this._super();
},
content: function () {
return this.get('controller.unhealthyAlertInstances');
}.property('controller.unhealthyAlertInstances.@each.state'),
isLoaded: Em.computed.bool('controller.unhealthyAlertInstances'),
isAlertEmptyList: Em.computed.or('isAlertContentEmptyList', 'isAlertFilterdEmptyList'),
isAlertContentEmptyList: Em.computed.empty('content'),
isAlertFilterdEmptyList: Em.computed.everyBy('content', 'isVisible', false),
displayLength: 100,
/**
* Update list of shown alert instances
* @method updateAlertInstances
*/
updateAlertInstances: function () {
var self = this,
displayLength = this.get('displayLength'),
startIndex = this.get('startIndex');
if (!displayLength) return; // wait while table-info is loaded
this.get('updater').set('queryParamsForUnhealthyAlertInstances', {
from: startIndex - 1,
page_size: displayLength
});
this.set('filteringComplete', false);
this.get('updater').updateUnhealthyAlertInstances(function() {
self.set('filteringComplete', true);
});
}.observes('displayLength', 'startIndex', 'alertsNumber'),
/**
* Show spinner when filter/sorting request is in processing
* @method overlayObserver
*/
overlayObserver: function() {
var $tbody = this.$('.table.alerts-table'),
$overlay = this.$('.table-overlay'),
$spinner = $($overlay).find('.spinner');
if (!this.get('filteringComplete')) {
if (!$tbody) return;
var tbodyPos = $tbody.position();
if (!tbodyPos) return;
$spinner.css('display', 'block');
$overlay.css({
top: tbodyPos.top + 1,
left: tbodyPos.left + 1,
width: $tbody.width() - 1,
height: $tbody.height() - 1
});
}
},
categories: function () {
var allCnt = this.get('alertsNumber');
var criticalCnt = this.get('criticalNumber');
var warningCnt = this.get('warningNumber');
return [
categoryObject.create({
value: 'all',
labelPath: 'alerts.dropdown.dialog.filters.all',
count: allCnt
}),
categoryObject.create({
value: 'alert-state-CRITICAL',
labelPath: 'alerts.dropdown.dialog.filters.critical',
count: criticalCnt
}),
categoryObject.create({
value: 'alert-state-WARNING',
labelPath: 'alerts.dropdown.dialog.filters.warning',
count: warningCnt
})
];
}.property('criticalNumber', 'warningNumber', 'alertsNumber'),
selectedCategory: null,
/**
* Filter notifications by state
* @method filter
*/
filter: function() {
var selectedState = this.get('selectedCategory.value');
var content = this.get('content');
if (selectedState == 'all') {
content.setEach("isVisible", true);
this.set('filteredContent', content);
} else {
this.set('filteredContent', content.filter(function (item) {
if (item.get('stateClass') == selectedState) {
item.set('isVisible', true);
return true;
} else {
item.set('isVisible', false);
return false;
}
}));
}
}.observes('content.length', 'selectedCategory'),
/**
* Router transition to alert definition details page
* @param event
*/
gotoAlertDetails: function (event) {
if (event && event.context) {
var definition = App.AlertDefinition.find().findProperty('id', event.context.get('definitionId'));
App.router.transitionTo('main.alerts.alertDetails', definition);
}
},
/**
* Router transition to alert definition page
*/
gotoAllAlerts: function () {
App.router.transitionTo('main.alerts.index');
}
});