VizBar.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. "use strict";
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: Cognos Analytics
  5. * Copyright IBM Corp. 2015, 2017
  6. * US Government Users Restricted Rights - Use, duplication or disclosure
  7. * restricted by GSA ADP Schedule Contract with IBM Corp.
  8. */
  9. define(['underscore', 'jquery', 'rave2', 'bi/admin/nls/StringResource', 'bi/admin/common/visualizations/VizControl'], function (_, $, rave, StringResource, VizControl) {
  10. 'use strict'; //NOSONAR: meant to be strict
  11. var VizBar = VizControl.extend({
  12. margin: {
  13. top: 10,
  14. right: 20,
  15. bottom: 10,
  16. left: 100
  17. },
  18. barHeight: 40,
  19. barGap: 10,
  20. textOffset: 10,
  21. init: function init(options) {
  22. VizBar.inherited('init', this, arguments);
  23. },
  24. tipHtml: function tipHtml(row) {
  25. var data = row.data;
  26. var html = data.name + '=' + data.value;
  27. return html;
  28. },
  29. _draw: function _draw(data) {
  30. //NOSONAR
  31. var height = this.barHeight * data.length;
  32. var maxValue = Math.max(15, rave.max(data, function (row) {
  33. return row.value;
  34. }) * 1.2);
  35. var isMirrored = document.dir === 'rtl';
  36. var types = _.map(data, function (row) {
  37. return StringResource.get(row.name);
  38. });
  39. types.push('');
  40. var y = rave.scale.ordinal().domain(types).rangePoints([0, height]);
  41. var yAxis = rave.svg.axis().scale(y).tickSize(0).orient('left');
  42. if (isMirrored) {
  43. this.svg.attr('transform', 'scale(-1, 1)');
  44. }
  45. this.svg.append('g').call(yAxis).selectAll('text').attr('class', 'ellipses');
  46. var maxLabelWidth = 0;
  47. var $ellipses = $(this.svg[0]).find('.ellipses');
  48. $ellipses.each(function () {
  49. maxLabelWidth = Math.max(maxLabelWidth, this.getBBox().width);
  50. });
  51. maxLabelWidth += 20;
  52. $(this.svg[0]).empty();
  53. var x = rave.scale.linear().domain([0, maxValue]).range([0, this.svgWidth - maxLabelWidth]);
  54. var xAxis = rave.svg.axis().scale(x).orient('bottom');
  55. var bar = this.svg.selectAll('g').data(data).enter().append('g').style('fill', function (row) {
  56. return this._colorScale(row.name);
  57. }.bind(this)).attr('transform', function (d, i) {
  58. return 'translate(' + maxLabelWidth + ', ' + (i * this.barHeight + this.margin.top) + ')';
  59. }.bind(this));
  60. var rects = bar.append('rect').attr('width', 0).attr('height', this.barHeight - this.barGap);
  61. rects.transition().duration(500).attr('width', function (row) {
  62. return x(row.value);
  63. });
  64. rects.on('mouseover', function () {
  65. var rect = rave.select(this);
  66. var color = rect.style('fill') || '#ddd';
  67. var rgb = rave.rgb(color).darker();
  68. rect.style('fill', rgb.toString());
  69. }).on('mouseout', function () {
  70. rave.select(this).style('fill', null);
  71. });
  72. bar.append('text').attr('x', this.textOffset).attr('y', this.barHeight / 2 - 3).attr('dy', '.35em').attr('class', 'bi-chart-innertext').text(function (row) {
  73. return row.value;
  74. }).transition().duration(500).attr('x', function (row) {
  75. return isMirrored ? -(x(row.value) + this.textOffset) : x(row.value) + this.textOffset;
  76. }.bind(this));
  77. this.svg.append('g').attr('class', 'bi-chart-axis x-axis').attr('transform', 'translate(' + maxLabelWidth + ',' + (height + 5) + ')').call(xAxis);
  78. this.svg.append('g').attr('class', 'bi-chart-axis y-axis').attr('transform', 'translate(' + maxLabelWidth + ',' + (this.margin.top - 5) + ')').call(yAxis).selectAll('text').attr('class', 'ellipses').attr('y', this.barHeight / 2).attr('x', isMirrored ? 10 : -10);
  79. if (isMirrored && this.svg) {
  80. var texts = this.svg.node().getElementsByTagName('text');
  81. for (var i = 0; i < texts.length; i++) {
  82. texts[i].setAttribute('transform', 'scale(-1,1)');
  83. }
  84. }
  85. }
  86. });
  87. return VizBar;
  88. });