Skip to content

Commit

Permalink
Merge pull request #3640 from spalger/bindconfigvars
Browse files Browse the repository at this point in the history
[config] added simple $bind helper
  • Loading branch information
rashidkpc committed Apr 28, 2015
2 parents 87299c5 + d95b99b commit 5ab0d3d
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 100 deletions.
6 changes: 3 additions & 3 deletions src/kibana/components/config/_delayed_updater.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ define(function (require) {
queue.forEach(function (q) { q.reject(err); });
})
.finally(function () {
$rootScope.$emit('change:config', updated.concat(deleted));
$rootScope.$broadcast('change:config', updated.concat(deleted));
});
};

Expand All @@ -70,7 +70,7 @@ define(function (require) {
var defer = Promise.defer();
queue.push(defer);
notify.log('config change: ' + key + ': ' + oldVal + ' -> ' + newVal);
$rootScope.$emit('change:config.' + key, newVal, oldVal);
$rootScope.$broadcast('change:config.' + key, newVal, oldVal);

// reset the fire timer
clearTimeout(timer);
Expand All @@ -80,4 +80,4 @@ define(function (require) {
};

};
});
});
25 changes: 24 additions & 1 deletion src/kibana/components/config/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ define(function (require) {

var angular = require('angular');
var _ = require('lodash');
var defaults = require('components/config/defaults');
var defaults = Private(require('components/config/defaults'));
var DelayedUpdater = Private(require('components/config/_delayed_updater'));
var vals = Private(require('components/config/_vals'));

Expand Down Expand Up @@ -123,6 +123,29 @@ define(function (require) {
if (updater) updater.fire();
};

/**
* A little helper for binding config variables to $scopes
*
* @param {Scope} $scope - an angular $scope object
* @param {string} key - the config key to bind to
* @param {string} [property] - optional property name where the value should
* be stored. Defaults to the config key
* @return {function} - an unbind function
*/
config.$bind = function ($scope, key, property) {
if (!property) property = key;

var update = function () {
$scope[property] = config.get(key);
};

update();
return _.partial(_.invoke, [
$scope.$on('change:config.' + key, update),
$scope.$on('init:config', update)
], 'call');
};

/*****
* PRIVATE API
*****/
Expand Down
176 changes: 89 additions & 87 deletions src/kibana/components/config/defaults.js
Original file line number Diff line number Diff line change
@@ -1,91 +1,93 @@
define(function (require) {
var _ = require('lodash');
return function () {
var _ = require('lodash');

return {
'query:queryString:options': {
value: '{ "analyze_wildcard": true }',
description: 'Options for the lucene query string parser',
type: 'json'
},
'dateFormat': {
value: 'MMMM Do YYYY, HH:mm:ss.SSS',
description: 'When displaying a pretty formatted date, use this format',
},
'dateFormat:scaled': {
type: 'json',
value:
'[\n' +
' ["", "hh:mm:ss.SSS"],\n' +
' ["PT1S", "HH:mm:ss"],\n' +
' ["PT1M", "HH:mm"],\n' +
' ["PT1H",\n' +
' "YYYY-MM-DD HH:mm"],\n' +
' ["P1DT", "YYYY-MM-DD"],\n' +
' ["P1YT", "YYYY"]\n' +
']',
description: 'Values that define the format used in situations where timebased' +
' data is rendered in order, and formatted timestamps should adapt to the' +
' interval between measurements. Keys are ISO 8601 intervals:' +
' http://en.wikipedia.org/wiki/ISO_8601#Time_intervals'
},
'defaultIndex': {
value: null,
description: 'The index to access if no index is set',
},
'metaFields': {
value: ['_source', '_id', '_type', '_index'],
description: 'Fields that exist outside of _source to merge into our document when displaying it',
},
'discover:sampleSize': {
value: 500,
description: 'The number of rows to show in the table',
},
'fields:popularLimit': {
value: 10,
description: 'The top N most popular fields to show',
},
'format:numberPrecision': {
value: 3,
description: 'Round numbers to this many decimal places',
},
'histogram:barTarget': {
value: 50,
description: 'Attempt to generate around this many bar when using "auto" interval in date histograms',
},
'histogram:maxBars': {
value: 100,
description: 'Never show more than this many bar in date histograms, scale values if needed',
},
'visualization:tileMap:maxPrecision': {
value: 7,
description: 'The maximum geoHash precision displayed on tile maps: 7 is high, 10 is very high, ' +
'12 is the max. Explanation of cell dimensions: http://www.elastic.co/guide/en/elasticsearch/reference/current/' +
'search-aggregations-bucket-geohashgrid-aggregation.html#_cell_dimensions_at_the_equator',
},
'csv:separator': {
value: ',',
description: 'Separate exported values with this string',
},
'csv:quoteValues': {
value: true,
description: 'Should values be quoted in csv exports?',
},
'history:limit': {
value: 10,
description: 'In fields that have history (e.g. query inputs), show this many recent values',
},
'shortDots:enable': {
value: false,
description: 'Shorten long fields, for example, instead of foo.bar.baz, show f.b.baz',
},
'truncate:maxHeight': {
value: 115,
description: 'The maximum height that a cell in a table should occupy. Set to 0 to disable truncation.'
},
'indexPattern:fieldMapping:lookBack': {
value: 5,
description: 'For index patterns containing timestamps in their names, look for this many recent matching ' +
'patterns from which to query the field mapping.'
}
return {
'query:queryString:options': {
value: '{ "analyze_wildcard": true }',
description: 'Options for the lucene query string parser',
type: 'json'
},
'dateFormat': {
value: 'MMMM Do YYYY, HH:mm:ss.SSS',
description: 'When displaying a pretty formatted date, use this format',
},
'dateFormat:scaled': {
type: 'json',
value:
'[\n' +
' ["", "hh:mm:ss.SSS"],\n' +
' ["PT1S", "HH:mm:ss"],\n' +
' ["PT1M", "HH:mm"],\n' +
' ["PT1H",\n' +
' "YYYY-MM-DD HH:mm"],\n' +
' ["P1DT", "YYYY-MM-DD"],\n' +
' ["P1YT", "YYYY"]\n' +
']',
description: 'Values that define the format used in situations where timebased' +
' data is rendered in order, and formatted timestamps should adapt to the' +
' interval between measurements. Keys are ISO 8601 intervals:' +
' http://en.wikipedia.org/wiki/ISO_8601#Time_intervals'
},
'defaultIndex': {
value: null,
description: 'The index to access if no index is set',
},
'metaFields': {
value: ['_source', '_id', '_type', '_index'],
description: 'Fields that exist outside of _source to merge into our document when displaying it',
},
'discover:sampleSize': {
value: 500,
description: 'The number of rows to show in the table',
},
'fields:popularLimit': {
value: 10,
description: 'The top N most popular fields to show',
},
'format:numberPrecision': {
value: 3,
description: 'Round numbers to this many decimal places',
},
'histogram:barTarget': {
value: 50,
description: 'Attempt to generate around this many bar when using "auto" interval in date histograms',
},
'histogram:maxBars': {
value: 100,
description: 'Never show more than this many bar in date histograms, scale values if needed',
},
'visualization:tileMap:maxPrecision': {
value: 7,
description: 'The maximum geoHash precision displayed on tile maps: 7 is high, 10 is very high, ' +
'12 is the max. Explanation of cell dimensions: http://www.elastic.co/guide/en/elasticsearch/reference/current/' +
'search-aggregations-bucket-geohashgrid-aggregation.html#_cell_dimensions_at_the_equator',
},
'csv:separator': {
value: ',',
description: 'Separate exported values with this string',
},
'csv:quoteValues': {
value: true,
description: 'Should values be quoted in csv exports?',
},
'history:limit': {
value: 10,
description: 'In fields that have history (e.g. query inputs), show this many recent values',
},
'shortDots:enable': {
value: false,
description: 'Shorten long fields, for example, instead of foo.bar.baz, show f.b.baz',
},
'truncate:maxHeight': {
value: 115,
description: 'The maximum height that a cell in a table should occupy. Set to 0 to disable truncation.'
},
'indexPattern:fieldMapping:lookBack': {
value: 5,
description: 'For index patterns containing timestamps in their names, look for this many recent matching ' +
'patterns from which to query the field mapping.'
}
};
};
});
4 changes: 2 additions & 2 deletions src/kibana/plugins/settings/sections/advanced/advanced_row.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
define(function (require) {
var _ = require('lodash');
var configDefaults = require('components/config/defaults');

require('modules').get('apps/settings')
.directive('advancedRow', function (config, Notifier, Private) {
Expand All @@ -13,6 +12,7 @@ define(function (require) {
configs: '='
},
link: function ($scope) {
var configDefaults = Private(require('components/config/defaults'));
var notify = new Notifier();
var keyCodes = {
ESC: 27
Expand Down Expand Up @@ -66,4 +66,4 @@ define(function (require) {
}
};
});
});
});
4 changes: 2 additions & 2 deletions src/kibana/plugins/settings/sections/advanced/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
define(function (require) {
var _ = require('lodash');
var configDefaults = require('components/config/defaults');
var getValType = require('plugins/settings/sections/advanced/lib/get_val_type');


Expand All @@ -16,6 +15,7 @@ define(function (require) {
return {
restrict: 'E',
link: function ($scope) {
var configDefaults = Private(require('components/config/defaults'));
var keyCodes = {
ESC: 27
};
Expand Down Expand Up @@ -70,4 +70,4 @@ define(function (require) {
display: 'Advanced',
url: '#/settings/advanced'
};
});
});
7 changes: 2 additions & 5 deletions src/kibana/plugins/settings/sections/indices/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,8 @@ define(function (require) {
template: require('text!plugins/settings/sections/indices/index.html'),
link: function ($scope) {
$scope.edittingId = $route.current.params.id;
$scope.defaultIndex = config.get('defaultIndex');
$rootScope.$on('change:config.defaultIndex', function () {
$scope.defaultIndex = config.get('defaultIndex');
});

config.$bind($scope, 'defaultIndex');
$scope.$watch('defaultIndex', function (defaultIndex) {
$scope.indexPatternList = _($route.current.locals.indexPatternIds)
.map(function (id) {
Expand All @@ -50,4 +47,4 @@ define(function (require) {
display: 'Indices',
url: '#/settings/indices',
};
});
});
74 changes: 74 additions & 0 deletions test/unit/specs/components/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
define(function (require) {
describe('config component', function () {
var $scope;
var config;
var defaults;
var configFile;

beforeEach(module('kibana'));
beforeEach(inject(function ($injector, Private) {
config = $injector.get('config');
$scope = $injector.get('$rootScope');
configFile = $injector.get('configFile');
defaults = Private(require('components/config/defaults'));
}));

it('exposes the configFile', function () {
expect(config.file).to.be(configFile);
});

describe('#get', function () {

it('gives access to config values', function () {
expect(config.get('dateFormat')).to.be.a('string');
});

it('reads from the defaults', function () {
var initial = config.get('dateFormat');
var newDefault = initial + '- new';
defaults.dateFormat.value = newDefault;
expect(config.get('dateFormat')).to.be(newDefault);
});

});

describe('#set', function () {

it('stores a value in the config val set', function () {
var initial = config.get('dateFormat');
config.set('dateFormat', 'notaformat');
expect(config.get('dateFormat')).to.be('notaformat');
});

});

describe('#$bind', function () {

it('binds a config key to a $scope property', function () {
var dateFormat = config.get('dateFormat');
config.$bind($scope, 'dateFormat');
expect($scope).to.have.property('dateFormat', dateFormat);
});

it('alows overriding the property name', function () {
var dateFormat = config.get('dateFormat');
config.$bind($scope, 'dateFormat', 'defaultDateFormat');
expect($scope).to.not.have.property('dateFormat');
expect($scope).to.have.property('defaultDateFormat', dateFormat);
});

it('keeps the property up to date', function () {
var dateFormat = config.get('dateFormat');
var newDateFormat = dateFormat + ' NEW NEW NEW!';
config.$bind($scope, 'dateFormat');

expect($scope).to.have.property('dateFormat', dateFormat);
config.set('dateFormat', newDateFormat);
expect($scope).to.have.property('dateFormat', newDateFormat);

});

});

});
});

0 comments on commit 5ab0d3d

Please sign in to comment.