@spalger/kibana
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
109 lines (92 loc) • 3.01 kB
JavaScript
define(function (require) {
var _ = require('lodash');
var parseRange = require('ui/utils/range');
require('ui/number_list/number_list_input');
require('ui/modules')
.get('kibana')
.directive('kbnNumberList', function () {
return {
restrict: 'E',
template: require('ui/number_list/number_list.html'),
controllerAs: 'numberListCntr',
require: 'ngModel',
controller: function ($scope, $attrs, $parse) {
var self = this;
// Called from the pre-link function once we have the controllers
self.init = function (modelCntr) {
self.modelCntr = modelCntr;
self.getList = function () {
return self.modelCntr.$modelValue;
};
self.getUnitName = _.partial($parse($attrs.unit), $scope);
var defaultRange = self.range = parseRange('[0,Infinity)');
$scope.$watch(function () {
return $attrs.range;
}, function (range, prev) {
if (!range) {
self.range = defaultRange;
return;
}
try {
self.range = parseRange(range);
} catch (e) {
throw new TypeError('Unable to parse range: ' + e.message);
}
});
/**
* Remove an item from list by index
* @param {number} index
* @return {undefined}
*/
self.remove = function (index) {
var list = self.getList();
if (!list) return;
list.splice(index, 1);
};
/**
* Add an item to the end of the list
* @return {undefined}
*/
self.add = function () {
var list = self.getList();
if (!list) return;
list.push(_.last(list) + 1);
};
/**
* Check to see if the list is too short.
*
* @return {Boolean}
*/
self.tooShort = function () {
return _.size(self.getList()) < 1;
};
/**
* Check to see if the list is too short, but simply
* because the user hasn't interacted with it yet
*
* @return {Boolean}
*/
self.undefinedLength = function () {
return self.tooShort() && (self.modelCntr.$untouched && self.modelCntr.$pristine);
};
/**
* Check to see if the list is too short
*
* @return {Boolean}
*/
self.invalidLength = function () {
return self.tooShort() && !self.undefinedLength();
};
$scope.$watchCollection(self.getList, function () {
self.modelCntr.$setValidity('numberListLength', !self.tooShort());
});
};
},
link: {
pre: function ($scope, $el, attrs, ngModelCntr) {
$scope.numberListCntr.init(ngModelCntr);
}
},
};
});
});