kibana-123
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
97 lines (80 loc) • 2.72 kB
JavaScript
import d3 from 'd3';
import _ from 'lodash';
import ErrorHandlerProvider from './_error_handler';
import TooltipProvider from 'ui/vis/components/tooltip';
export default function ChartTitleFactory(Private) {
const ErrorHandler = Private(ErrorHandlerProvider);
const Tooltip = Private(TooltipProvider);
class ChartTitle extends ErrorHandler {
constructor(visConfig) {
super();
this.el = visConfig.get('el');
this.tooltip = new Tooltip('chart-title', this.el, function (d) {
return '<p>' + _.escape(d.label) + '</p>';
});
}
render() {
const el = d3.select(this.el).select('.chart-title').node();
const width = el ? el.clientWidth : 0;
const height = el ? el.clientHeight : 0;
return d3.select(this.el).selectAll('.chart-title').call(this.draw(width, height));
};
truncate(size) {
const self = this;
return function (selection) {
selection.each(function () {
const text = d3.select(this);
const n = text[0].length;
const maxWidth = size / n * 0.9;
const length = this.getComputedTextLength();
let str;
let avg;
let end;
if (length > maxWidth) {
str = text.text();
avg = length / str.length;
end = Math.floor(maxWidth / avg) - 5;
str = str.substr(0, end) + '...';
self.addMouseEvents(text);
return text.text(str);
}
return text.text();
});
};
};
addMouseEvents(target) {
if (this.tooltip) {
return target.call(this.tooltip.render());
}
};
draw(width, height) {
const self = this;
return function (selection) {
selection.each(function () {
const div = d3.select(this);
const dataType = this.parentNode.__data__.rows ? 'rows' : 'columns';
const size = dataType === 'rows' ? height : width;
const txtHtOffset = 11;
self.validateWidthandHeight(width, height);
div.append('svg')
.attr('width', width)
.attr('height', height)
.append('text')
.attr('transform', function () {
if (dataType === 'rows') {
return 'translate(' + txtHtOffset + ',' + height / 2 + ')rotate(270)';
}
return 'translate(' + width / 2 + ',' + txtHtOffset + ')';
})
.attr('text-anchor', 'middle')
.text(function (d) {
return d.label;
});
// truncate long chart titles
div.selectAll('text').call(self.truncate(size));
});
};
};
}
return ChartTitle;
};