charting_ui 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ #= require ./charting_scatter
2
+ #= require ./charting_histogram
3
+
4
+ @charts = []
5
+
6
+ @create_new_canvas = (block, is_mobile, type) ->
7
+ chart = switch type
8
+ when "scatter" then new ChartEngine_HardCoded_Scatter(block)
9
+ when "histogram_model" then new ChartEngine_Histogram(block)
10
+ else null
11
+
12
+ if chart == null
13
+ console.log "Unknown type: " + type
14
+ return
15
+
16
+ charts.push(chart)
17
+ register_canvas_resize(is_mobile)
18
+ return chart
19
+
20
+ @register_canvas_resize = (is_mobile) ->
21
+ if is_mobile
22
+ window.addEventListener("orientationchange",
23
+ () ->
24
+ setTimeout(() ->
25
+ $.each(charts, (i, chart) ->
26
+ chart.canvas_resize()
27
+ )
28
+ , 150)
29
+ , false);
30
+ else
31
+ $(window).resize(
32
+ () ->
33
+ $.each(charts, (i, chart) ->
34
+ chart.canvas_resize()
35
+ )
36
+ )
37
+ $.each(charts, (i, chart) ->
38
+ chart.canvas_resize()
39
+ )
@@ -0,0 +1,254 @@
1
+ #= require ./charting_core
2
+
3
+ class window.ChartEngine_Histogram extends ChartEngine_Core
4
+
5
+ offset_bar: 5
6
+ alone: false
7
+ min_height: 3
8
+ is_dates: false
9
+
10
+ #########################################
11
+ ############### SETUP ###################
12
+ constructor: (block) ->
13
+ super(block)
14
+
15
+ $(@info_box).css('border-radius', '0px')
16
+ if @alone
17
+ $(@info_box).css('opacity', '1')
18
+ else
19
+ $(@info_box).css('opacity', '0.8')
20
+
21
+ if @is_dates
22
+ @create_extra_menu($(block).parent())
23
+
24
+ console.log "Chart histogram initialized!"
25
+
26
+ create_extra_menu: (container) ->
27
+ self = this
28
+ block = '<div class="charting_ui_date_range_pick">'
29
+ block += '<span>Date range: </span>'
30
+ block += '<select class="charting_ui_date_range_selector">'
31
+ block += '<option value="all" selected="selected">All</option>'
32
+ block += '<option value="day">per Days</option>'
33
+ block += '<option value="month">per Months</option>'
34
+ block += '<option value="year">per Years</option>'
35
+ block += '</select>'
36
+ block += '</div>'
37
+
38
+ container.append($(block))
39
+
40
+ $(container).on('change','.charting_ui_date_range_selector', (event) ->
41
+ self.load_source($(this).val())
42
+ self.redraw()
43
+ )
44
+
45
+ return block
46
+
47
+ get_info_box_content: () ->
48
+ return '<h3 class="charting_ui_info_main_title"></h3><ul class="charting_ui_info_container"></ul>'
49
+
50
+ create_info_info_box: (index, main_title, titles) ->
51
+ container = $(@info_box).find('ul.charting_ui_info_container')
52
+
53
+ block = '<li>'
54
+ if ! @alone
55
+ block += '<span class="charting_ui_info_title charting_ui_info_title_' + main_title + '" style="color:' + @colors[index] + '" >' + main_title + ':</span>&nbsp;'
56
+ block += '<ul style="display:inline-block;">'
57
+ $.each(titles, (i, t) ->
58
+ block += '<li style="display:inline-block;"><span class="charting_ui_info_sub_title charting_ui_info_sub_title_' + main_title + '_' + t.class_name + '" >' + t.name + ':</span>&nbsp;<span class="charting_ui_info_value charting_ui_info_box_value_' + main_title + '_' + t.class_name + '"></span>&nbsp;</li>'
59
+ )
60
+ block += '</ul></li>'
61
+ container.append($(block))
62
+
63
+
64
+ load_source: (date_scope = "all") ->
65
+ model = @data.model.name
66
+ key = @data.model.key
67
+ self = this
68
+ success = false
69
+
70
+ func_done = (data) ->
71
+ self.source = data.success
72
+ self.min_x = 0
73
+ self.max_x = self.source.length
74
+ self.min_y = 0
75
+ self.max_y = - Number.MAX_VALUE
76
+ total_value = {}
77
+ self.alone = self.source[0].values.length == 1
78
+
79
+ $.map(self.source, (v, k) ->
80
+ $.map(v.values, (v, k) ->
81
+ if k of total_value
82
+ total_value[k] += v.value
83
+ else
84
+ total_value[k] = v.value
85
+ )
86
+ )
87
+
88
+ $.map(self.source,(v, k) ->
89
+ type = v.key_type
90
+ if type == "date"
91
+ v.key = new Date(v.key)
92
+ self.is_dates = true
93
+
94
+ $.map(v.values, (v, k) ->
95
+ y = parseInt(v.value)
96
+ v.percent = self.round_up(v.value / total_value[k] * 1.0 * 100, 1)
97
+ if y > self.max_y
98
+ self.max_y = y
99
+ )
100
+ )
101
+
102
+ $(self.info_box).find('ul.charting_ui_info_container').empty()
103
+ $.map(self.source[0].values, (v, k) ->
104
+ self.create_info_info_box(k, v.serie, [{name: "Sum", class_name:"sum"}, {name: "%", class_name: "percent"}])
105
+ )
106
+
107
+ success = true
108
+
109
+ func_error = (data) ->
110
+ success = false
111
+ response = $.parseJSON data.responseText
112
+ console.log "ERROR: #" + data.status + ": " + response.error
113
+
114
+ func_always = (data) ->
115
+ console.log "Data fetched"
116
+
117
+ $.ajax({
118
+ url: '/charting_ui/fetch_data',
119
+ data: 'model_name=' + model + '&model_key=' + JSON.stringify(key) + "&date_scope=" + date_scope,
120
+ async: false,
121
+ method: 'post',
122
+ success: func_done,
123
+ done: func_done,
124
+ error: func_error,
125
+ fail: func_error,
126
+ complete: func_always,
127
+ always: func_always
128
+ })
129
+
130
+ console.log("MinX: " + @min_x + ", MaxX: " + @max_x)
131
+ console.log("MinY: " + @min_y + ", MaxY: " + @max_y)
132
+ return success
133
+
134
+
135
+ before_redraw: () ->
136
+
137
+ #########################################
138
+ ############ DRAW GLOBAL ################
139
+ getIndentation: () ->
140
+ return @source.length
141
+
142
+ draw_chart: () ->
143
+ self = this
144
+
145
+ $.each(@source, (i, p) ->
146
+ series = p.values.length
147
+ $.map(p.values, (v, index) ->
148
+ x_start = i + (1.0 / series * index)
149
+ x_end = i + (1.0 / series * (index + 1))
150
+ top_left = new Chart_Point(x_start, v.value)
151
+ bottom_right = new Chart_Point(x_end, self.min_y)
152
+ top_left = self.convert_unit_to_pixel(top_left)
153
+ if v.value == 0
154
+ top_left.y -= self.min_height
155
+
156
+ bottom_right = self.convert_unit_to_pixel(bottom_right)
157
+ if index == 0
158
+ top_left.x += self.offset_bar
159
+ if index == series - 1
160
+ bottom_right.x -= self.offset_bar
161
+
162
+
163
+ self.draw_rectangle(top_left, bottom_right, self.colors[index], "white", 0)
164
+ )
165
+ )
166
+
167
+ get_axe_text_x_pixel_position: (n, indent) ->
168
+ return @convert_unit_to_pixel_x(n + @indent_x / 2)
169
+
170
+ get_axe_text_x_text: (n) ->
171
+ if n >= @source.length
172
+ return null
173
+ return @source[n].key
174
+
175
+ #########################################
176
+ ######### UPDATE INTERACTIVE ############
177
+ update_user_interaction: (mouse_coordinate) ->
178
+ value_x = Math.ceil(@convert_pixel_to_unit_x(mouse_coordinate.x)) - 1
179
+ if value_x >= @source.length
180
+ return false
181
+ column = @source[value_x]
182
+
183
+ series = column.values.length
184
+ if series == 1
185
+ coordinate_x = value_x
186
+ coordinate_y = column.values[0].value
187
+
188
+ if mouse_coordinate.y < @convert_unit_to_pixel_y(coordinate_y) && coordinate_y > 0
189
+ return false
190
+
191
+ top_left = new Chart_Point(coordinate_x, coordinate_y)
192
+ bottom_right = new Chart_Point(coordinate_x + 1, @min_y)
193
+
194
+ top_left = @convert_unit_to_pixel(top_left)
195
+
196
+ if coordinate_y == 0
197
+ thickness = 1
198
+ top_left.y -= @min_height
199
+ else
200
+ thickness = 4
201
+
202
+ top_left.x += @offset_bar
203
+
204
+ bottom_right = @convert_unit_to_pixel(bottom_right)
205
+ bottom_right.x -= @offset_bar
206
+ bottom_right.y -= thickness / 2
207
+
208
+
209
+
210
+ @previous_drawn_region.push(@draw_rectangle_interactive(top_left, bottom_right, @default_cross_color, "black", thickness))
211
+ else
212
+ slice = 1.0 / series
213
+
214
+ return true
215
+
216
+ updateInfoBoxPosition: (mouse_coordinate) ->
217
+ value_x = Math.ceil(@convert_pixel_to_unit_x(mouse_coordinate.x)) - 1
218
+ column = @source[value_x]
219
+
220
+ coordinate_x = @convert_unit_to_pixel_x(value_x) + 1
221
+
222
+ if @alone
223
+ if column.values[0].value == 0
224
+ coordinate_y = @convert_unit_to_pixel_y(@max_y)
225
+ coordinate_x -= 2
226
+ else
227
+ coordinate_y = @convert_unit_to_pixel_y(column.values[0].value) + 1
228
+ else
229
+ coordinate_y = @convert_unit_to_pixel_y(@max_y)
230
+
231
+ if $(@info_box).outerWidth() > @canvas_width - coordinate_x - @offset_bar
232
+ coordinate_x = @convert_unit_to_pixel_x(value_x + 1) - 1
233
+ @info_box.css('left', (coordinate_x - $(@info_box).outerWidth() - @offset_bar) + 'px')
234
+ else
235
+ @info_box.css('left', (coordinate_x + @offset_bar) + 'px')
236
+
237
+ @info_box.css('top', (coordinate_y) + 'px')
238
+
239
+
240
+ update_info_box_content: (mouse_coordinate) ->
241
+ value_x = Math.ceil(@convert_pixel_to_unit_x(mouse_coordinate.x)) - 1
242
+ column = @source[value_x]
243
+ self = this
244
+ @info_box.find('.charting_ui_info_main_title').text(column.key)
245
+
246
+ $.map(column.values, (v, k) ->
247
+ serie = v.serie
248
+ self.info_box.find('.charting_ui_info_box_value_' + serie + '_sum').text(v.value)
249
+ self.info_box.find('.charting_ui_info_box_value_' + serie + '_percent').text(v.percent)
250
+ )
251
+ #@info_box.find('.charting_ui_info_box_y').text(column.values[0].value)
252
+ #@info_box.find('.charting_ui_info_box_extra').text(column.values[0].percent)
253
+
254
+ #########################################
@@ -0,0 +1,8 @@
1
+ class window.Chart_Point
2
+
3
+ constructor: (_x, _y) ->
4
+ @x = parseFloat(_x)
5
+ @y = parseFloat(_y)
6
+
7
+ to_s: () ->
8
+ return "(" + @x + ", " + @y + ")"
@@ -0,0 +1,72 @@
1
+ #= require ./charting_core
2
+
3
+ class window.ChartEngine_HardCoded_Scatter extends ChartEngine_Core
4
+
5
+ #########################################
6
+ ############### SETUP ###################
7
+ constructor: (block) ->
8
+ super(block)
9
+
10
+ console.log "Chart scatter initialized!"
11
+
12
+ get_info_box_content: () ->
13
+ return '<ul class="charting_ui_info_container">
14
+ <li><span class="charting_ui_info_title charting_ui_info_x_title" >x:</span>&nbsp;<span class="charting_ui_info_value charting_ui_info_box_x"></span></li>
15
+ <li><span class="charting_ui_info_title charting_ui_info_y_title" >y:</span>&nbsp;<span class="charting_ui_info_value charting_ui_info_box_y"></span></li>
16
+ </ul>'
17
+
18
+ load_source: () ->
19
+ @source = @data.collection
20
+ @min_x = 0
21
+ @max_x = @source.length
22
+ @min_y = Math.min.apply(null, @source)
23
+ @max_y = Math.max.apply(null, @source)
24
+ console.log("MinX: " + @min_x + ", MaxX: " + @max_x)
25
+ console.log("MinY: " + @min_y + ", MaxY: " + @max_y)
26
+ return true
27
+
28
+ #########################################
29
+ ############ DRAW GLOBAL ################
30
+ draw_chart: () ->
31
+ points = []
32
+ self = this
33
+ $.each(@source, (i, p) ->
34
+ points.push(self.convert_unit_to_pixel(new Chart_Point(i, p)))
35
+ )
36
+ @draw_lines(points, @default_line_color)
37
+
38
+ #########################################
39
+ ######### UPDATE INTERACTIVE ############
40
+ update_user_interaction: (mouse_coordinate) ->
41
+ value_x = Math.round(@convert_pixel_to_unit_x(mouse_coordinate.x))
42
+ if value_x >= @source.length
43
+ return false
44
+ value_y = @source[value_x]
45
+
46
+
47
+ mouse_coordinate.x = @convert_unit_to_pixel_x(value_x)
48
+ mouse_coordinate.y = @convert_unit_to_pixel_y(value_y)
49
+
50
+ @draw_line_interactive(new Chart_Point(@offset_left, mouse_coordinate.y), #new Chart_Point(mouse_coordinate.x - @default_font_size, mouse_coordinate.y),
51
+ new Chart_Point(@canvas_width - @offset_right, mouse_coordinate.y),#new Chart_Point(mouse_coordinate.x + @default_font_size, mouse_coordinate.y),
52
+ @default_cross_color, 1
53
+ )
54
+ @draw_line_interactive(new Chart_Point(mouse_coordinate.x, @offset_top), #new Chart_Point(mouse_coordinate.x, mouse_coordinate.y - @default_font_size),
55
+ new Chart_Point(mouse_coordinate.x, @canvas_height - @offset_bottom),#new Chart_Point(mouse_coordinate.x, mouse_coordinate.y + @default_font_size),
56
+ @default_cross_color, 1
57
+ )
58
+
59
+ #@previous_drawn_region.push(@draw_circle(@ctx_interactive, @convert_unit_to_pixel(new Chart_Point(value_x, value_y)), 5))
60
+ @draw_circle(@ctx_interactive, @convert_unit_to_pixel(new Chart_Point(value_x, value_y)), 5)
61
+
62
+ @previous_drawn_region.push([
63
+ 0,0#mouse_coordinate.x - @default_font_size, mouse_coordinate.y - @default_font_size,
64
+ @canvas_width, @canvas_height #mouse_coordinate.x + @default_font_size, mouse_coordinate.y + @default_font_size
65
+ ])
66
+ return true
67
+
68
+ update_info_box_content: (mouse_coordinate) ->
69
+ @info_box.find('.charting_ui_info_box_x').text(@round_up(@convert_pixel_to_unit_x(mouse_coordinate.x)))
70
+ @info_box.find('.charting_ui_info_box_y').text(@round_up(@convert_pixel_to_unit_y(mouse_coordinate.y)))
71
+
72
+ #########################################
@@ -0,0 +1,6 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require ./charting_point
4
+ //= require ./charting_core
5
+ //= require ./charting_scatter
6
+ //= require ./charting_engine
@@ -0,0 +1,77 @@
1
+ .charting_ui_area{
2
+ width: 100%;
3
+ display: block;
4
+ position: relative;
5
+
6
+ .charting_ui_date_range_pick{
7
+ display: block;
8
+ position: absolute;
9
+ top: 0px;
10
+ left: 0px;
11
+ }
12
+
13
+ &.charting_ui_bordered_area{
14
+ border: 1px lightgray solid;
15
+ }
16
+
17
+ .charting_ui_main_title{
18
+ text-align: center;
19
+ }
20
+
21
+ .charting_ui_canvas_area{
22
+ position: relative;
23
+ display: block;
24
+ width: 100%;
25
+
26
+ .charting_ui_data{
27
+ display: none;
28
+ }
29
+
30
+ .charting_ui_info_block{
31
+ position: absolute;
32
+ display: none;
33
+ background: white;
34
+ border: 1px solid black;
35
+ border-radius: 5px;
36
+ z-index: 2;
37
+ pointer-events:none;
38
+ padding: 5px;
39
+ opacity: 0.7;
40
+
41
+
42
+ h3{
43
+ font-size: 1.0em;
44
+ text-align: center;
45
+ font-weight: bold;
46
+ margin: 0px;
47
+ border-bottom: 1px solid darkgray
48
+ }
49
+
50
+ ul{
51
+ font-size: 0.9em;
52
+ -webkit-padding-start: 0px;
53
+ list-style-type: none;
54
+ -webkit-margin-before: 0px;
55
+ -webkit-margin-after: 0px;
56
+ text-align: center;
57
+
58
+ .charting_ui_info_title, .charting_ui_info_sub_title{
59
+ font-weight: bold;
60
+ text-transform: capitalize;
61
+ }
62
+ }
63
+ }
64
+
65
+ .charting_ui_chart_interactive{
66
+ position: absolute;
67
+ z-index: 1;
68
+ display: block;
69
+ }
70
+
71
+ .charting_ui_chart_fix{
72
+ position: absolute;
73
+ z-index: 0;
74
+ display: block;
75
+ }
76
+ }
77
+ }