-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBarchartBindingHandler.js
126 lines (102 loc) · 3.48 KB
/
BarchartBindingHandler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
ko.bindingHandlers.barchart = (function (){
var self = {},
margin = { top: 20, right: 20, bottom: 150, left: 50 },
width = 300,
height = 300,
svg,
x,
y,
data,
xAttr,
yAttr,
xAxis,
yAxis;
var getObservableData = function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (!value || !value.data || !value.x || !value.y) {
return;
}
data = ko.utils.unwrapObservable(value.data),
xAttr = value.x,
yAttr = value.y;
if (value.width) {
width = ko.utils.unwrapObservable(value.width);
}
if (value.height) {
height = ko.utils.unwrapObservable(value.height);
}
};
var getXValue = function (dataItem) {
return ko.utils.unwrapObservable(dataItem[xAttr]);
};
var getYValue = function (dataItem) {
return ko.utils.unwrapObservable(dataItem[yAttr]) / 100;
};
var plot = function () {
svg.selectAll(".bar").remove();
svg.selectAll("g.y.axis").remove();
svg.selectAll("g.x.axis").remove();
x.domain(data.map(function (d) {
return getXValue(d);
}));
y.domain([0, d3.max(data, function (d) {
return getYValue(d);
})]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("dx", "-.8em")
.attr("dy", ".15em")
.attr("transform", function (d) {
return "rotate(-65)"
});;
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Stock %");
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function (d) {
return x(getXValue(d));
})
.attr("width", x.rangeBand())
.attr("y", function (d) { return y(getYValue(d)); })
.attr("height", function (d) {
return height - y(getYValue(d));
});
};
self.init = function (element, valueAccessor, allBindingsAccessor) {
getObservableData(element, valueAccessor, allBindingsAccessor);
x = d3.scale.ordinal().rangeRoundBands([0, width], 0.1);
y = d3.scale.linear().range([height, 0]);
xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.ticks(10, "%");
svg = d3.select(element).append('svg')
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
.append('g')
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
plot();
};
self.update = function (element, valueAccessor, allBindingsAccessor) {
getObservableData(element, valueAccessor, allBindingsAccessor);
plot();
};
return self;
})();