class MaterialRaingular.d3.Directives.MrD3HorizontalBarChartModel extends AngularDirectiveModel
@inject('$timeout','$element','$attrs') initialize: -> @options = @$scope.$eval(@$attrs.mrD3Options || '{}') @options.margins = Object.merge({top: 20,right: 20, left: 70, bottom: 50},@options.margins || {}) @options.minSize ?= 100 @svg = d3.select(@$element[0]) @holder = @svg.select('g') @holder.attr('transform',"translate(#{@options.margins.left},#{@options.margins.right})") @$scope.$watch @height.bind(@), @setAxis.bind(@) @$scope.$watch @width.bind(@), @setAxis.bind(@) @setAxis() setAxis: -> @yAxis = d3.scaleBand().rangeRound([0,@height()]).padding(0.1) @xAxis = d3.scaleLinear().range([0,@width()]) if @_xAxis || @_yAxis @_xAxis?.adjustAxis(true) @_yAxis?.adjustAxis(true) else @adjustBars() indexOf: (bar) -> @bars().nodes().indexOf(bar) bars: -> nodes = @holder.selectAll('svg > g > rect').nodes() d3.selectAll(nodes.concat(@holder.selectAll('g.stacked').nodes())) adjustBars: -> @yDomain = [] for bar in @bars().nodes() rect = d3.select(bar) @yDomain[@indexOf(bar)] = rect.attr('label') width = (rect.attr('raw-size') / @maxValue()) * @width() rect.attr('width',width || 0) @yAxis.domain(angular.copy(@yDomain).reverse()) for rect in @bars().nodes() d3.select(rect).attr('height',@yAxis.bandwidth()) d3.select(rect).attr('y',@yAxis(@yDomain[@indexOf(rect)])) @_yAxis?.axis.call(d3.axisLeft(@yAxis)) height: -> [@$element[0].parentElement.clientHeight, @options.minSize].max() - @options.margins.top - @options.margins.bottom width: -> [@$element[0].parentElement.clientWidth, @options.minSize].max() - @options.margins.left - @options.margins.right maxValue: -> val = @xAxis?.domain().max() val ||= (@bars().nodes().map (rect) -> d3.select(rect).attr('raw-size')).max() val