apexcharts 0.1.2 → 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.
- checksums.yaml +4 -4
- data/README.md +38 -12
- data/lib/apexcharts/charts/bar.rb +1 -1
- data/lib/apexcharts/charts/cartesian.rb +48 -7
- data/lib/apexcharts/charts/column.rb +1 -1
- data/lib/apexcharts/charts/{capabilities → features}/annotations.rb +12 -12
- data/lib/apexcharts/charts/mixed.rb +41 -10
- data/lib/apexcharts/charts/polar.rb +3 -3
- data/lib/apexcharts/charts/syncing.rb +14 -7
- data/lib/apexcharts/helper.rb +17 -24
- data/lib/apexcharts/options/root.rb +1 -0
- data/lib/apexcharts/options_builder.rb +28 -15
- data/lib/apexcharts/series/cartesian.rb +5 -0
- data/lib/apexcharts/series/polar.rb +5 -0
- data/lib/apexcharts/utils/date_time.rb +9 -6
- data/lib/apexcharts/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 911c4f7abf6adcf9da0230826af3f658b6281a6ed2e5a56079240c4a124e0e3d
|
4
|
+
data.tar.gz: 865dbe2ef98854e98c6a66af3c6e81195a1124dcfd85117a3d38cac5c5d39e32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70632205846e3a684dc892bb047fac617b92e9eba36173d53ac7da298e84c401d0b73dce3d628f451533aae024fd2972b89f120d6698e0d49a3d4cd915e19246
|
7
|
+
data.tar.gz: 17524c53370e02d38af478600d18455d979821d97cf6a45d01f6a2bb0ac3c0ead50f58e0264dadb9cf5ed0dbe55a9d9c3ea27ef2dc59b38749651d3b663537e1
|
data/README.md
CHANGED
@@ -9,11 +9,6 @@
|
|
9
9
|
</p>
|
10
10
|
|
11
11
|
|
12
|
-
<p align="center">Beautiful and interactive web charts for rubyist.</p>
|
13
|
-
|
14
|
-
|
15
|
-
<p align="center"><img src="https://apexcharts.com/media/apexcharts-banner.png"></p>
|
16
|
-
|
17
12
|
## Usage
|
18
13
|
|
19
14
|
### Cartesian Charts
|
@@ -42,6 +37,7 @@ and I'll get the data in this format:
|
|
42
37
|
..
|
43
38
|
}
|
44
39
|
```
|
40
|
+
PS: `Property` can be any model you have and `inactive` and `active` is just a normal scope.
|
45
41
|
|
46
42
|
Example options used for cartesian charts:
|
47
43
|
|
@@ -55,6 +51,7 @@ Example options used for cartesian charts:
|
|
55
51
|
} %>
|
56
52
|
```
|
57
53
|
|
54
|
+
|
58
55
|
#### Line Chart
|
59
56
|
|
60
57
|
```erb
|
@@ -63,6 +60,14 @@ Example options used for cartesian charts:
|
|
63
60
|

|
64
61
|
|
65
62
|
|
63
|
+
#### Stepline Chart
|
64
|
+
|
65
|
+
```erb
|
66
|
+
<%= line_chart(series, {**options, theme: 'palette7', curve: 'stepline'}) %>
|
67
|
+
```
|
68
|
+

|
69
|
+
|
70
|
+
|
66
71
|
#### Area Chart
|
67
72
|
|
68
73
|
```erb
|
@@ -102,18 +107,25 @@ Given that:
|
|
102
107
|
```ruby
|
103
108
|
@total_properties = Property.group_by_week(:created_at).count
|
104
109
|
```
|
110
|
+
and
|
111
|
+
```erb
|
112
|
+
<% total_series = {
|
113
|
+
name: "Total", data: @total_properties
|
114
|
+
} %>
|
115
|
+
```
|
105
116
|
you can do this:
|
106
117
|
```erb
|
107
118
|
<%= combo_chart({**options, theme: 'palette4', stacked: false, data_labels: false}) do %>
|
108
|
-
<% line_chart(
|
109
|
-
<% area_chart(
|
110
|
-
<% column_chart(
|
119
|
+
<% line_chart(total_series) %>
|
120
|
+
<% area_chart(series.last) %>
|
121
|
+
<% column_chart(series.first) %>
|
111
122
|
<% end %>
|
112
123
|
```
|
113
124
|

|
114
125
|
|
115
126
|
|
116
127
|
#### Syncing Chart
|
128
|
+
|
117
129
|
You can synchronize charts by using `syncing_chart` or `synchronized_chart` methods. For example:
|
118
130
|
```erb
|
119
131
|
<%= syncing_chart(chart: {toolbar: false}, height: 250, style: 'display: inline-block; width: 32%;') do %>
|
@@ -128,18 +140,32 @@ You can synchronize charts by using `syncing_chart` or `synchronized_chart` meth
|
|
128
140
|

|
129
141
|
|
130
142
|
|
143
|
+
#### Brush Chart
|
144
|
+
|
145
|
+
```erb
|
146
|
+
<%= area_chart(total_series, {
|
147
|
+
**options, chart_id: 'the-chart', xtitle: nil, theme: 'palette2'
|
148
|
+
}) %>
|
149
|
+
<%= mixed_chart(brush_target: 'the-chart', theme: 'palette7') do %>
|
150
|
+
<% column_chart(series.first) %>
|
151
|
+
<% line_chart(series.last) %>
|
152
|
+
<% end %>
|
153
|
+
```
|
154
|
+

|
155
|
+
|
156
|
+
|
131
157
|
#### Annotations
|
132
158
|
|
133
159
|
All cartesian charts can have annotations, for example:
|
134
160
|
|
135
161
|
```erb
|
136
|
-
<%=
|
162
|
+
<%= area_chart(series, {**options, theme: 'palette9'}) do %>
|
137
163
|
<% x_annotation(value: ('2019-01-06'..'2019-02-24'), text: "Busy Time", color: 'green') %>
|
138
164
|
<% y_annotation(value: 29, text: "Max Properties", color: 'blue') %>
|
139
165
|
<% point_annotation(value: ['2018-10-07', 24], text: "First Peak", color: 'magenta') %>
|
140
166
|
<% end %>
|
141
167
|
```
|
142
|
-

|
143
169
|
|
144
170
|
|
145
171
|
### Polar Charts
|
@@ -213,8 +239,8 @@ require("apexcharts")
|
|
213
239
|
## Objective
|
214
240
|
- To bring out as much apexcharts.js capabilities as possible but in ruby ways.
|
215
241
|
|
216
|
-
##
|
217
|
-
- Other charts (
|
242
|
+
## TODOs
|
243
|
+
- Other charts (radar, heatmap, candlestick, etc.)
|
218
244
|
- Support other ruby frameworks (sinatra, hanami, etc.)
|
219
245
|
- Render as Vue or React elements
|
220
246
|
|
@@ -1,11 +1,14 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'features/annotations'
|
2
2
|
|
3
3
|
module Apexcharts
|
4
4
|
class CartesianChart
|
5
5
|
include Annotations
|
6
6
|
|
7
|
-
def initialize data, options={}, &block
|
8
|
-
|
7
|
+
def initialize bindings, data, options={}, &block
|
8
|
+
@bindings = bindings
|
9
|
+
options = {**options, **more_options}
|
10
|
+
build_instance_variables if @bindings
|
11
|
+
|
9
12
|
instance_eval &block if block_given?
|
10
13
|
|
11
14
|
options[:annotations] = @annotations if @annotations
|
@@ -16,12 +19,14 @@ module Apexcharts
|
|
16
19
|
{**@series, chart: {type: chart_type}}.compact
|
17
20
|
)
|
18
21
|
)
|
22
|
+
|
23
|
+
get_selection_range if brush?
|
19
24
|
end
|
20
25
|
|
21
26
|
def chart_type
|
22
27
|
end
|
23
28
|
|
24
|
-
def
|
29
|
+
def more_options
|
25
30
|
{}
|
26
31
|
end
|
27
32
|
|
@@ -31,8 +36,8 @@ module Apexcharts
|
|
31
36
|
end
|
32
37
|
|
33
38
|
def render
|
34
|
-
attributes = @options.delete(:div)
|
35
|
-
variable = attributes.delete(:var)
|
39
|
+
attributes = @options.delete(:div) { {} }
|
40
|
+
variable = attributes.delete(:var) { "chart#{attributes[:id]&.[](/\d+/)}" }
|
36
41
|
element_id = attributes.delete(:id)
|
37
42
|
css_class = attributes.delete(:class)
|
38
43
|
height = "#{@options[:chart][:height].to_i}px"
|
@@ -46,14 +51,50 @@ module Apexcharts
|
|
46
51
|
HTML
|
47
52
|
end
|
48
53
|
|
54
|
+
def method_missing method, *args, &block
|
55
|
+
if @bindings
|
56
|
+
@bindings.send method, *args, &block
|
57
|
+
else
|
58
|
+
super
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
49
62
|
private
|
50
63
|
|
64
|
+
def build_instance_variables
|
65
|
+
(@bindings.instance_variables - instance_variables).each do |i|
|
66
|
+
instance_variable_set(i, @bindings.instance_variable_get(i))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
51
70
|
def sanitize_data(data)
|
52
71
|
Apexcharts::CartesianSeries.new(data).sanitized
|
53
72
|
end
|
54
73
|
|
55
74
|
def build_options(x_sample, options)
|
56
|
-
Apexcharts::OptionsBuilder.new(x_sample, options).
|
75
|
+
Apexcharts::OptionsBuilder.new(x_sample, options).build_options
|
76
|
+
end
|
77
|
+
|
78
|
+
def brush?
|
79
|
+
@options[:chart][:brush]&.[](:enabled) && \
|
80
|
+
!@options[:chart][:selection]&.[](:xaxis)
|
81
|
+
end
|
82
|
+
|
83
|
+
def get_selection_range
|
84
|
+
first_x = @series[:series].last[:data].first[:x]
|
85
|
+
last_x = @series[:series].last[:data].last[:x]
|
86
|
+
@options[:chart][:selection][:xaxis] = {
|
87
|
+
min: handle_time(twenty_percent_before_last_x(first_x, last_x)),
|
88
|
+
max: handle_time(last_x)
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
def twenty_percent_before_last_x(first, last)
|
93
|
+
last - (0.2 * (last - first))
|
94
|
+
end
|
95
|
+
|
96
|
+
def handle_time(input)
|
97
|
+
Utils::DateTime.convert(input)
|
57
98
|
end
|
58
99
|
end
|
59
100
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module Apexcharts
|
2
2
|
module Annotations
|
3
|
-
def annotation(
|
3
|
+
def annotation(axis, value:, text:, color: nil, **options)
|
4
4
|
@annotations ||= {}
|
5
5
|
|
6
|
-
unless [:xaxis, :yaxis, :points].include?
|
7
|
-
raise "unrecognized
|
6
|
+
unless [:xaxis, :yaxis, :points].include? axis
|
7
|
+
raise "unrecognized axis: #{axis}"
|
8
8
|
end
|
9
|
-
@annotations[
|
10
|
-
@annotations[
|
11
|
-
if
|
9
|
+
@annotations[axis] ||= []
|
10
|
+
@annotations[axis] << annotation_value(axis, value).merge(
|
11
|
+
if axis == :points
|
12
12
|
{marker: {size: 8, fillColor: 'white', strokeColor: color, radius: 2}, **options}
|
13
13
|
else
|
14
14
|
{borderColor: color, fillColor: color, opacity: 0.2}
|
@@ -32,27 +32,27 @@ module Apexcharts
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
def annotation_value
|
36
|
-
|
35
|
+
def annotation_value axis, value
|
36
|
+
axis = axis.to_s.delete_suffix('axis').to_sym
|
37
37
|
case value
|
38
38
|
when Range
|
39
39
|
value = Utils::DateTime.convert_range(value)
|
40
40
|
|
41
|
-
case
|
41
|
+
case axis
|
42
42
|
when :x
|
43
43
|
{x: value.first, x2: value.last}
|
44
44
|
when :y
|
45
45
|
{y: value.first, y2: value.last}
|
46
46
|
else
|
47
|
-
raise "
|
47
|
+
raise "axis :points doesn't accept value of type Range"
|
48
48
|
end
|
49
49
|
else
|
50
|
-
if
|
50
|
+
if axis == :points
|
51
51
|
value.map!{ |x| Utils::DateTime.convert(x) }
|
52
52
|
{x: value.first, y: value.last}
|
53
53
|
else
|
54
54
|
value = Utils::DateTime.convert(value)
|
55
|
-
{
|
55
|
+
{axis => value}
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -2,39 +2,48 @@ module Apexcharts
|
|
2
2
|
class MixedChart
|
3
3
|
include Annotations
|
4
4
|
|
5
|
-
def initialize options={},
|
5
|
+
def initialize bindings, options={}, &block
|
6
6
|
@bindings = bindings
|
7
|
-
@
|
7
|
+
@series = {series: []}
|
8
|
+
options[:id] ||= apexcharts_id
|
8
9
|
build_instance_variables
|
10
|
+
|
9
11
|
instance_eval &block
|
10
12
|
|
11
13
|
options[:annotations] = @annotations if @annotations
|
12
14
|
@options = Utils::Hash.camelize_keys(
|
13
15
|
Utils::Hash.deep_merge(
|
14
|
-
build_options(@
|
15
|
-
{chart: {type: 'area'}, **@
|
16
|
+
build_options(@series[:series][0][:data][0][:x], options),
|
17
|
+
{chart: {type: 'area'}, **@series}
|
16
18
|
)
|
17
19
|
)
|
20
|
+
|
21
|
+
get_selection_range if brush?
|
18
22
|
end
|
19
23
|
|
20
24
|
def line_chart data, options={}, &block
|
21
|
-
|
25
|
+
bindings = eval("self", block.binding) if block_given?
|
26
|
+
@series[:series] += LineChart.new(bindings, data, options, &block).mixed_series
|
22
27
|
end
|
23
28
|
|
24
29
|
def area_chart data, options={}, &block
|
25
|
-
|
30
|
+
bindings = eval("self", block.binding) if block_given?
|
31
|
+
@series[:series] += AreaChart.new(bindings, data, options, &block).mixed_series
|
26
32
|
end
|
27
33
|
|
28
34
|
def bar_chart data, options={}, &block
|
29
|
-
|
35
|
+
bindings = eval("self", block.binding) if block_given?
|
36
|
+
@series[:series] += BarChart.new(bindings, data, options, &block).mixed_series
|
30
37
|
end
|
31
38
|
|
32
39
|
def column_chart data, options={}, &block
|
33
|
-
|
40
|
+
bindings = eval("self", block.binding) if block_given?
|
41
|
+
@series[:series] += ColumnChart.new(bindings, data, options, &block).mixed_series
|
34
42
|
end
|
35
43
|
|
36
44
|
def scatter_chart data, options={}, &block
|
37
|
-
|
45
|
+
bindings = eval("self", block.binding) if block_given?
|
46
|
+
@series[:series] += ScatterChart.new(bindings, data, options, &block).mixed_series
|
38
47
|
end
|
39
48
|
|
40
49
|
def render
|
@@ -66,7 +75,29 @@ module Apexcharts
|
|
66
75
|
end
|
67
76
|
|
68
77
|
def build_options(x_sample, options)
|
69
|
-
Apexcharts::OptionsBuilder.new(x_sample, options).
|
78
|
+
Apexcharts::OptionsBuilder.new(x_sample, options).build_options
|
79
|
+
end
|
80
|
+
|
81
|
+
def brush?
|
82
|
+
@options[:chart][:brush]&.[](:enabled) && \
|
83
|
+
!@options[:chart][:selection]&.[](:xaxis)
|
84
|
+
end
|
85
|
+
|
86
|
+
def get_selection_range
|
87
|
+
first_x = @series[:series].last[:data].first[:x]
|
88
|
+
last_x = @series[:series].last[:data].last[:x]
|
89
|
+
@options[:chart][:selection][:xaxis] = {
|
90
|
+
min: handle_time(twenty_percent_before_last_x(first_x, last_x)),
|
91
|
+
max: handle_time(last_x)
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
def twenty_percent_before_last_x(first, last)
|
96
|
+
last - (0.2 * (last - first))
|
97
|
+
end
|
98
|
+
|
99
|
+
def handle_time(input)
|
100
|
+
Utils::DateTime.convert(input)
|
70
101
|
end
|
71
102
|
end
|
72
103
|
end
|
@@ -14,8 +14,8 @@ module Apexcharts
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def render
|
17
|
-
attributes = @options.delete(:div)
|
18
|
-
variable = attributes.delete(:var)
|
17
|
+
attributes = @options.delete(:div) { {} }
|
18
|
+
variable = attributes.delete(:var) { "chart#{attributes[:id]&.[](/\d+/)}" }
|
19
19
|
element_id = attributes.delete(:id)
|
20
20
|
css_class = attributes.delete(:class)
|
21
21
|
height = "#{@options[:chart][:height].to_i}px"
|
@@ -36,7 +36,7 @@ module Apexcharts
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def build_options(options)
|
39
|
-
Apexcharts::OptionsBuilder.new(nil, options).
|
39
|
+
Apexcharts::OptionsBuilder.new(nil, options).build_options
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
module Apexcharts
|
2
2
|
class SyncingChart
|
3
|
-
def initialize options={},
|
3
|
+
def initialize bindings, options={}, &block
|
4
4
|
@bindings = bindings
|
5
5
|
@html = ""
|
6
6
|
build_instance_variables
|
7
7
|
@options = options
|
8
|
+
@options[:group] ||= apexcharts_group
|
9
|
+
|
8
10
|
instance_eval &block
|
9
11
|
|
10
12
|
@options[:annotations] = @annotations if @annotations
|
@@ -12,33 +14,38 @@ module Apexcharts
|
|
12
14
|
|
13
15
|
def line_chart data, options={}, &block
|
14
16
|
options[:id] = apexcharts_id
|
15
|
-
|
17
|
+
bindings = eval("self", block.binding) if block_given?
|
18
|
+
@html += LineChart.new(bindings, data, @options.merge(options), &block).render
|
16
19
|
end
|
17
20
|
|
18
21
|
def area_chart data, options={}, &block
|
19
22
|
options[:id] = apexcharts_id
|
20
|
-
|
23
|
+
bindings = eval("self", block.binding) if block_given?
|
24
|
+
@html += AreaChart.new(bindings, data, @options.merge(options), &block).render
|
21
25
|
end
|
22
26
|
|
23
27
|
def bar_chart data, options={}, &block
|
24
28
|
options[:id] = apexcharts_id
|
25
|
-
|
29
|
+
bindings = eval("self", block.binding) if block_given?
|
30
|
+
@html += BarChart.new(bindings, data, @options.merge(options), &block).render
|
26
31
|
end
|
27
32
|
|
28
33
|
def column_chart data, options={}, &block
|
29
34
|
options[:id] = apexcharts_id
|
30
|
-
|
35
|
+
bindings = eval("self", block.binding) if block_given?
|
36
|
+
@html += ColumnChart.new(bindings, data, @options.merge(options), &block).render
|
31
37
|
end
|
32
38
|
|
33
39
|
def scatter_chart data, options={}, &block
|
34
40
|
options[:id] = apexcharts_id
|
35
|
-
|
41
|
+
bindings = eval("self", block.binding) if block_given?
|
42
|
+
@html += ScatterChart.new(bindings, data, @options.merge(options), &block).render
|
36
43
|
end
|
37
44
|
|
38
45
|
def mixed_chart options={}, &block
|
39
46
|
options[:id] = apexcharts_id
|
40
47
|
bindings = eval "self", block.binding
|
41
|
-
@html += MixedChart.new(@options.merge(options),
|
48
|
+
@html += MixedChart.new(bindings, @options.merge(options), &block).render
|
42
49
|
end
|
43
50
|
alias_method :combo_chart, :mixed_chart
|
44
51
|
|
data/lib/apexcharts/helper.rb
CHANGED
@@ -6,59 +6,52 @@ require_relative 'charts'
|
|
6
6
|
module Apexcharts
|
7
7
|
module Helper
|
8
8
|
def line_chart series, options={}, &block
|
9
|
-
|
10
|
-
draw_chart(LineChart.new(series, options, &block))
|
9
|
+
bindings = eval("self", block.binding) if block_given?
|
10
|
+
draw_chart(LineChart.new(bindings, *prepare_series_and_options(series, options), &block))
|
11
11
|
end
|
12
12
|
|
13
13
|
def area_chart series, options={}, &block
|
14
|
-
|
15
|
-
draw_chart(AreaChart.new(series, options, &block))
|
14
|
+
bindings = eval("self", block.binding) if block_given?
|
15
|
+
draw_chart(AreaChart.new(bindings, *prepare_series_and_options(series, options), &block))
|
16
16
|
end
|
17
17
|
|
18
18
|
def column_chart series, options={}, &block
|
19
|
-
|
20
|
-
draw_chart(ColumnChart.new(series, options, &block))
|
19
|
+
bindings = eval("self", block.binding) if block_given?
|
20
|
+
draw_chart(ColumnChart.new(bindings, *prepare_series_and_options(series, options), &block))
|
21
21
|
end
|
22
22
|
|
23
23
|
def bar_chart series, options={}, &block
|
24
|
-
|
25
|
-
draw_chart(BarChart.new(series, options, &block))
|
24
|
+
bindings = eval("self", block.binding) if block_given?
|
25
|
+
draw_chart(BarChart.new(bindings, *prepare_series_and_options(series, options), &block))
|
26
26
|
end
|
27
27
|
|
28
28
|
def scatter_chart series, options={}, &block
|
29
|
-
|
30
|
-
draw_chart(ScatterChart.new(series, options, &block))
|
29
|
+
bindings = eval("self", block.binding) if block_given?
|
30
|
+
draw_chart(ScatterChart.new(bindings, *prepare_series_and_options(series, options), &block))
|
31
31
|
end
|
32
32
|
|
33
33
|
def mixed_chart options={}, &block
|
34
|
-
|
35
|
-
options
|
36
|
-
bindings = eval "self", block.binding
|
37
|
-
draw_chart(MixedChart.new(options, bindings, &block))
|
34
|
+
bindings = eval("self", block.binding)
|
35
|
+
draw_chart(MixedChart.new(bindings, deep_copy(options), &block))
|
38
36
|
end
|
39
37
|
alias_method :combo_chart, :mixed_chart
|
40
38
|
|
41
39
|
def syncing_chart options={}, &block
|
42
|
-
|
43
|
-
options
|
44
|
-
bindings = eval "self", block.binding
|
45
|
-
draw_chart(SyncingChart.new(options, bindings, &block))
|
40
|
+
bindings = eval("self", block.binding)
|
41
|
+
draw_chart(SyncingChart.new(bindings, deep_copy(options), &block))
|
46
42
|
end
|
47
43
|
alias_method :synchronized_chart, :syncing_chart
|
48
44
|
|
49
45
|
def pie_chart series, options={}
|
50
|
-
|
51
|
-
draw_chart(PieChart.new(series, options))
|
46
|
+
draw_chart(PieChart.new(*prepare_series_and_options(series, options)))
|
52
47
|
end
|
53
48
|
|
54
49
|
def donut_chart series, options={}
|
55
|
-
|
56
|
-
draw_chart(DonutChart.new(series, options))
|
50
|
+
draw_chart(DonutChart.new(*prepare_series_and_options(series, options)))
|
57
51
|
end
|
58
52
|
|
59
53
|
def radial_bar_chart series, options={}
|
60
|
-
|
61
|
-
draw_chart(RadialBarChart.new(series, options))
|
54
|
+
draw_chart(RadialBarChart.new(*prepare_series_and_options(series, options)))
|
62
55
|
end
|
63
56
|
alias_method :circle_chart, :radial_bar_chart
|
64
57
|
|
@@ -30,8 +30,6 @@ module Apexcharts
|
|
30
30
|
@xtype = Utils::DateTime.type(x_sample)
|
31
31
|
end
|
32
32
|
@built = {}
|
33
|
-
build_options
|
34
|
-
@built.compact!
|
35
33
|
end
|
36
34
|
|
37
35
|
def build_options
|
@@ -57,6 +55,7 @@ module Apexcharts
|
|
57
55
|
build_tooltip
|
58
56
|
build_xaxis
|
59
57
|
build_yaxis
|
58
|
+
built.compact
|
60
59
|
end
|
61
60
|
|
62
61
|
def build_div
|
@@ -76,10 +75,24 @@ module Apexcharts
|
|
76
75
|
end
|
77
76
|
|
78
77
|
def build_chart
|
79
|
-
@built[:chart] =
|
78
|
+
@built[:chart] = if target = @options.delete(:brush_target)
|
79
|
+
{
|
80
|
+
brush: {
|
81
|
+
enabled: true,
|
82
|
+
target: target.to_s
|
83
|
+
},
|
84
|
+
selection: {
|
85
|
+
enabled: true
|
86
|
+
}
|
87
|
+
}
|
88
|
+
else
|
89
|
+
{}
|
90
|
+
end
|
91
|
+
|
92
|
+
@built[:chart].merge!({
|
80
93
|
id: @options[:chart_id] || @options[:id],
|
81
94
|
group: @options.delete(:group),
|
82
|
-
height: @options.delete(:height) { 400 },
|
95
|
+
height: @options.delete(:height) { target ? 180 : 400 },
|
83
96
|
width: @options.delete(:width),
|
84
97
|
stacked: @options.delete(:stacked),
|
85
98
|
animations: enabled(@options.delete(:animations)),
|
@@ -88,7 +101,7 @@ module Apexcharts
|
|
88
101
|
fore_color: @options.delete(:fore_color) do
|
89
102
|
@options.delete(:foreColor)
|
90
103
|
end
|
91
|
-
}.compact
|
104
|
+
}.compact)
|
92
105
|
|
93
106
|
chart = @options.delete :chart
|
94
107
|
if chart.is_a? Hash
|
@@ -103,8 +116,8 @@ module Apexcharts
|
|
103
116
|
return if data_labels.nil?
|
104
117
|
@built[:data_labels] = if [true, false].include? data_labels
|
105
118
|
{enabled: data_labels}
|
106
|
-
elsif
|
107
|
-
DataLabelsOptions.check
|
119
|
+
elsif data_labels.is_a? Hash
|
120
|
+
DataLabelsOptions.check data_labels.compact
|
108
121
|
end
|
109
122
|
end
|
110
123
|
|
@@ -185,14 +198,6 @@ module Apexcharts
|
|
185
198
|
end
|
186
199
|
|
187
200
|
def build_states
|
188
|
-
def filter_type_hash(state)
|
189
|
-
if state.is_a? String
|
190
|
-
{filter: {type: state}}
|
191
|
-
elsif state.is_a? Hash
|
192
|
-
state.compact
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
201
|
@built[:states] = {
|
197
202
|
normal: filter_type_hash(@options.delete :normal),
|
198
203
|
hover: filter_type_hash(@options.delete :hover),
|
@@ -322,5 +327,13 @@ module Apexcharts
|
|
322
327
|
options.compact
|
323
328
|
end
|
324
329
|
end
|
330
|
+
|
331
|
+
def filter_type_hash(state)
|
332
|
+
if state.is_a? String
|
333
|
+
{filter: {type: state}}
|
334
|
+
elsif state.is_a? Hash
|
335
|
+
state.compact
|
336
|
+
end
|
337
|
+
end
|
325
338
|
end
|
326
339
|
end
|
@@ -3,6 +3,7 @@ module Apexcharts
|
|
3
3
|
attr_reader :sanitized
|
4
4
|
|
5
5
|
def initialize(data)
|
6
|
+
data = deep_copy(data)
|
6
7
|
if data.is_a?(Array)
|
7
8
|
if (data.to_h rescue nil)
|
8
9
|
@sanitized = [data.to_h]
|
@@ -19,6 +20,10 @@ module Apexcharts
|
|
19
20
|
|
20
21
|
@sanitized = {series: sanitized.each {|a| a[:data] = a[:data].map{|k,v| {x: k, y: v} } } }
|
21
22
|
end
|
23
|
+
|
24
|
+
def deep_copy(data)
|
25
|
+
Marshal.load(Marshal.dump(data))
|
26
|
+
end
|
22
27
|
end
|
23
28
|
end
|
24
29
|
|
@@ -4,6 +4,7 @@ module Apexcharts
|
|
4
4
|
|
5
5
|
def initialize(data)
|
6
6
|
@labels = []
|
7
|
+
data = deep_copy(data)
|
7
8
|
if data.is_a? Array
|
8
9
|
if data.first.is_a? Numeric
|
9
10
|
@series = data
|
@@ -22,6 +23,10 @@ module Apexcharts
|
|
22
23
|
series: @series
|
23
24
|
}.compact
|
24
25
|
end
|
26
|
+
|
27
|
+
def deep_copy(data)
|
28
|
+
Marshal.load(Marshal.dump(data))
|
29
|
+
end
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'date'
|
2
2
|
|
3
3
|
module Apexcharts::Utils
|
4
|
-
|
5
|
-
def
|
4
|
+
module DateTime
|
5
|
+
def convert input
|
6
6
|
case input
|
7
7
|
when Time
|
8
8
|
(input.to_f * 1000).round
|
@@ -18,8 +18,9 @@ module Apexcharts::Utils
|
|
18
18
|
rescue
|
19
19
|
input
|
20
20
|
end
|
21
|
+
module_function :convert
|
21
22
|
|
22
|
-
def
|
23
|
+
def convert_range input
|
23
24
|
case input.first
|
24
25
|
when Time
|
25
26
|
((input.first.to_f * 1000).round..(input.last.to_f * 1000).round)
|
@@ -35,13 +36,14 @@ module Apexcharts::Utils
|
|
35
36
|
rescue
|
36
37
|
input
|
37
38
|
end
|
39
|
+
module_function :convert_range
|
38
40
|
|
39
|
-
def
|
41
|
+
def type input
|
40
42
|
case input
|
41
|
-
when Time, DateTime, Date
|
43
|
+
when Time, ::DateTime, Date
|
42
44
|
'datetime'
|
43
45
|
else
|
44
|
-
if DateTime.iso8601(input).iso8601 == input
|
46
|
+
if ::DateTime.iso8601(input).iso8601 == input
|
45
47
|
'datetime'
|
46
48
|
elsif Date.iso8601(input).iso8601 == input
|
47
49
|
'datetime'
|
@@ -52,5 +54,6 @@ module Apexcharts::Utils
|
|
52
54
|
rescue
|
53
55
|
'number'
|
54
56
|
end
|
57
|
+
module_function :type
|
55
58
|
end
|
56
59
|
end
|
data/lib/apexcharts/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apexcharts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Setyadi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: smart_kv
|
@@ -93,10 +93,10 @@ files:
|
|
93
93
|
- lib/apexcharts/charts.rb
|
94
94
|
- lib/apexcharts/charts/area.rb
|
95
95
|
- lib/apexcharts/charts/bar.rb
|
96
|
-
- lib/apexcharts/charts/capabilities/annotations.rb
|
97
96
|
- lib/apexcharts/charts/cartesian.rb
|
98
97
|
- lib/apexcharts/charts/column.rb
|
99
98
|
- lib/apexcharts/charts/donut.rb
|
99
|
+
- lib/apexcharts/charts/features/annotations.rb
|
100
100
|
- lib/apexcharts/charts/line.rb
|
101
101
|
- lib/apexcharts/charts/mixed.rb
|
102
102
|
- lib/apexcharts/charts/pie.rb
|