hyper-vis 1.0.0.lap34 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,7 +14,7 @@ module Hyperloop
14
14
  @_dom_node = dom_node
15
15
  end
16
16
 
17
- def data
17
+ def vis_data
18
18
  @_data
19
19
  end
20
20
 
@@ -0,0 +1,16 @@
1
+ module Hyperloop
2
+ module Vis
3
+ module Timeline
4
+ class Component
5
+ include Hyperloop::Vis::Timeline::Mixin
6
+ def self.inherited(base)
7
+ base.class_eval do
8
+ param items: nil
9
+ param groups: nil
10
+ param options: nil
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,89 @@
1
+ require 'react/component'
2
+
3
+ module Hyperloop
4
+ module Vis
5
+ module Timeline
6
+ module Mixin
7
+ def self.included(base)
8
+ base.include(Hyperloop::Component::Mixin)
9
+ base.class_eval do
10
+ param items: nil
11
+ param groups: nil
12
+ param options: nil
13
+
14
+ def _set_dom_node(dom_node)
15
+ @_dom_node = dom_node
16
+ end
17
+
18
+ def items
19
+ @_items
20
+ end
21
+
22
+ def groups
23
+ @_groups
24
+ end
25
+
26
+ def document
27
+ `window.document`
28
+ end
29
+
30
+ def options
31
+ @_options
32
+ end
33
+
34
+ def automatic_refresh
35
+ true
36
+ end
37
+
38
+ def self.automatic_refresh(value)
39
+ define_method(:automatic_refresh) do
40
+ value
41
+ end
42
+ end
43
+
44
+ def self.render_with_dom_node(tag = 'DIV', &block)
45
+ render do
46
+ @_vis_render_block = block
47
+ @_items = params.items
48
+ @_groups = params.groups
49
+ @_options = params.options
50
+ send(tag, ref: method(:_set_dom_node).to_proc)
51
+ end
52
+ end
53
+
54
+ def should_component_update?
55
+ `false`
56
+ end
57
+
58
+ after_mount do
59
+ if @_dom_node && @_vis_render_block
60
+ instance_exec(@_dom_node, @_items, @_groups, @_options, &@_vis_render_block)
61
+ end
62
+ end
63
+
64
+ before_receive_props do |new_props|
65
+ if automatic_refresh && @_dom_node && @_vis_render_block
66
+ changed = false
67
+ if new_props[:items] != @_items
68
+ @_items = new_props[:items]
69
+ changed = true
70
+ end
71
+ if new_props[:groups] != @_groups
72
+ @_items = new_props[:groups]
73
+ changed = true
74
+ end
75
+ if new_props[:options] != @_options
76
+ @_options = new_props[:options]
77
+ changed = true
78
+ end
79
+ if changed
80
+ instance_exec(@_dom_node, @_items, @_groups, @_options, &@_vis_render_block)
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,5 +1,5 @@
1
1
  module Hyperloop
2
2
  module Vis
3
- VERSION = '1.0.0.lap34'
3
+ VERSION = '1.0.1'
4
4
  end
5
5
  end
data/lib/vis.rb CHANGED
@@ -6,4 +6,7 @@ require 'vis/event_support'
6
6
  require 'vis/data_common'
7
7
  require 'vis/data_set'
8
8
  require 'vis/data_view'
9
- require 'vis/network'
9
+ require 'vis/graph2d'
10
+ require 'vis/graph3d'
11
+ require 'vis/network'
12
+ require 'vis/timeline'
@@ -19,5 +19,51 @@ module Vis
19
19
  def get_ids(options)
20
20
  @native.JS.getIds(options_to_native(options))
21
21
  end
22
+
23
+ # events
24
+
25
+ def off(event, event_handler_id)
26
+ event = lower_camelize(event)
27
+ handler = @event_handlers[event][event_handler_id]
28
+ `self["native"].off(event, handler)`
29
+ @event_handlers[event].delete(event_handler_id)
30
+ end
31
+
32
+ def on(event, &block)
33
+ event = lower_camelize(event)
34
+ @event_handlers[event] = {} unless @event_handlers[event]
35
+ event_handler_id = `Math.random().toString(36).substring(6)`
36
+ handler = %x{
37
+ function(event, properties, sender_id) {
38
+ return block.$call(Opal.Hash.$new(event),Opal.Hash.$new(properties), sender_id);
39
+ }
40
+ }
41
+ @event_handlers[event][event_handler_id] = handler
42
+ `self["native"].on(event, handler);`
43
+ event_handler_id
44
+ end
45
+
46
+ # options
47
+
48
+ def options_to_native(options)
49
+ return unless options
50
+ new_opts = {}.merge!(options)
51
+
52
+ if new_opts.has_key?(:filter)
53
+ block = new_opts[:filter]
54
+ if `typeof block === "function"`
55
+ unless new_opts[:filter].JS[:hyper_wrapped]
56
+ new_opts[:filter] = %x{
57
+ function(item) {
58
+ return #{block.call(`Opal.Hash.$new(item)`)};
59
+ }
60
+ }
61
+ new_opts[:filter].JS[:hyper_wrapped] = true
62
+ end
63
+ end
64
+ end
65
+
66
+ lower_camelize_hash(new_opts).to_n
67
+ end
22
68
  end
23
69
  end
@@ -11,6 +11,12 @@ module Vis
11
11
 
12
12
  attr_reader :event_handlers
13
13
 
14
+ def self.wrap(native)
15
+ instance = allocate
16
+ instance.instance_variable_set(:@native, native)
17
+ instance
18
+ end
19
+
14
20
  def initialize(*args)
15
21
  if args[0] && `Opal.is_a(args[0], Opal.Hash)`
16
22
  hash_array = []
@@ -86,6 +92,5 @@ module Vis
86
92
  end
87
93
  `self["native"].update.apply(self["native"], Opal.to_a(args))`
88
94
  end
89
-
90
95
  end
91
96
  end
@@ -0,0 +1,145 @@
1
+ module Vis
2
+ class Graph2d
3
+ include Native
4
+ include Vis::Utilities
5
+
6
+ aliases_native %i[
7
+ addCustomTime
8
+ destroy
9
+ fit
10
+ getCurrentTime
11
+ getCustomTime
12
+ isGroupVisible
13
+ redraw
14
+ removeCustomTime
15
+ setCurrentTime
16
+ setCustomTime
17
+ setWindow
18
+ ]
19
+
20
+ def initialize(native_container, item_dataset, group_dataset = nil, options = {})
21
+ native_item_data = item_dataset.to_n
22
+ if group_dataset.is_a?(Hash) && options == {}
23
+ options = group_dataset
24
+ group_dataset = nil
25
+ end
26
+ native_options = options_to_native(options)
27
+ @event_handlers = {}
28
+ if group_dataset.nil?
29
+ @native = `new vis.Graph2d(native_container, native_item_data, native_options)`
30
+ else
31
+ native_group_data = group_dataset.to_n
32
+ @native = `new vis.Graph2d(native_container, native_item_data, native_group_data, native_options)`
33
+ end
34
+ end
35
+
36
+ def off(event, event_handler_id)
37
+ event = lower_camelize(event)
38
+ handler = @event_handlers[event][event_handler_id]
39
+ `self["native"].off(event, handler)`
40
+ @event_handlers[event].delete(event_handler_id)
41
+ end
42
+
43
+ EVENTS_NO_PARAM = %i[currentTimeTick changed]
44
+
45
+ def on(event, &block)
46
+ event = lower_camelize(event)
47
+ @event_handlers[event] = {} unless @event_handlers[event]
48
+ event_handler_id = `Math.random().toString(36).substring(6)`
49
+ handler = if EVENTS_NO_PARAM.include?(event)
50
+ `function() { block.$call(); }`
51
+ else
52
+ `function(event_info) { block.$call(Opal.Hash.$new(event_info)); }`
53
+ end
54
+ @event_handlers[event][event_handler_id] = handler
55
+ `self["native"].on(event, handler)`
56
+ event_handler_id
57
+ end
58
+
59
+ def set_groups(dataset)
60
+ @native.JS.setGroups(dataset.to_n)
61
+ end
62
+
63
+ def set_items(dataset)
64
+ @native.JS.setItems(dataset.to_n)
65
+ end
66
+
67
+ def set_options(options)
68
+ @native.JS.setOptions(options_to_native(options))
69
+ end
70
+
71
+ def get_data_range
72
+ res = @native.JS.getDataRange()
73
+ `Opal.Hash.$new(res)`
74
+ end
75
+
76
+ def get_event_properties(event)
77
+ res = @native.JS.getEventProperties(event.to_n)
78
+ `Opal.Hash.$new(res)`
79
+ end
80
+
81
+ def get_legend(group_id, icon_width, icon_height)
82
+ res = @native.JS.getLegend(group_id, icon_width, icon_height)
83
+ `Opal.Hash.$new(res)`
84
+ end
85
+
86
+ def get_window
87
+ res = @native.JS.getWindow()
88
+ `Opal.Hash.$new(res)`
89
+ end
90
+
91
+ def move_to(time, options = {})
92
+ @native.JS.moveTo(time, options_to_native(options))
93
+ end
94
+
95
+ def options_to_native(options)
96
+ return unless options
97
+ # options must be duplicated, so callbacks dont get wrapped twice
98
+ new_opts = {}.merge!(options)
99
+
100
+ if new_opts.has_key?(:configure)
101
+ block = new_opts[:configure]
102
+ if `typeof block === "function"`
103
+ unless new_opts[:configure].JS[:hyper_wrapped]
104
+ new_opts[:configure] = %x{
105
+ function(option, path) {
106
+ return block.$call(option, path);
107
+ }
108
+ }
109
+ new_opts[:configure].JS[:hyper_wrapped] = true
110
+ end
111
+ end
112
+ end
113
+
114
+ if new_opts.has_key?(:draw_points)
115
+ block = new_opts[:draw_points]
116
+ if `typeof block === "function"`
117
+ unless new_opts[:draw_points].JS[:hyper_wrapped]
118
+ new_opts[:draw_points] = %x{
119
+ function(item, group) {
120
+ return block.$call(Opal.Hash.$new(item), Opal.Hash.$new(group));
121
+ }
122
+ }
123
+ new_opts[:draw_points].JS[:hyper_wrapped] = true
124
+ end
125
+ end
126
+ end
127
+
128
+ if new_opts.has_key?(:moment)
129
+ block = new_opts[:moment]
130
+ if `typeof block === "function"`
131
+ unless new_opts[:moment].JS[:hyper_wrapped]
132
+ new_opts[:moment] = %x{
133
+ function(native_date) {
134
+ return block.$call(native_date);
135
+ }
136
+ }
137
+ new_opts[:moment].JS[:hyper_wrapped] = true
138
+ end
139
+ end
140
+ end
141
+
142
+ lower_camelize_hash(new_opts).to_n
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,135 @@
1
+ module Vis
2
+ class Graph3d
3
+ include Native
4
+ include Vis::Utilities
5
+
6
+ aliases_native %i[
7
+ animationStart
8
+ animationStop
9
+ redraw
10
+ setSize
11
+ ]
12
+
13
+ def initialize(native_container, dataset, options = {})
14
+ native_options = options_to_native(options)
15
+ native_data = dataset.to_n
16
+ @event_handlers = {}
17
+ @native = `new vis.Graph3d(native_container, native_data, native_options)`
18
+ end
19
+
20
+ def off(event, event_handler_id)
21
+ event = lower_camelize(event)
22
+ handler = @event_handlers[event][event_handler_id]
23
+ `self["native"].off(event, handler)`
24
+ @event_handlers[event].delete(event_handler_id)
25
+ end
26
+
27
+ def on(event, &block)
28
+ event = lower_camelize(event)
29
+ @event_handlers[event] = {} unless @event_handlers[event]
30
+ event_handler_id = `Math.random().toString(36).substring(6)`
31
+ handler = `function(event_info) { block.$call(Opal.Hash.$new(event_info)); }`
32
+ @event_handlers[event][event_handler_id] = handler
33
+ `self["native"].on(event, handler)`
34
+ event_handler_id
35
+ end
36
+
37
+ def set_data(dataset)
38
+ native_data = dataset.to_n
39
+ @native.JS.setData(native_data)
40
+ end
41
+
42
+ def set_options(options)
43
+ native_options = options_to_native(options)
44
+ @native.JS.setOptions(native_options)
45
+ end
46
+
47
+ def get_camera_position
48
+ res = @native.JS.getCameraPosition()
49
+ `Opal.Hash.$new(res)`
50
+ end
51
+
52
+ def set_camera_position(dis_hor_ver)
53
+ res = @native.JS.setCameraPosition(dis_hor_ver.to_n)
54
+ `Opal.Hash.$new(res)`
55
+ end
56
+
57
+ def options_to_native(options)
58
+ return unless options
59
+ # options must be duplicated, so callbacks dont get wrapped twice
60
+ new_opts = {}.merge!(options)
61
+
62
+ if new_opts.has_key?(:onclick)
63
+ block = new_opts[:onclick]
64
+ if `typeof block === "function"`
65
+ unless new_opts[:onclick].JS[:hyper_wrapped]
66
+ new_opts[:onclick] = %x{
67
+ function(point) {
68
+ return #{block.call(`Opal.Hash.$new(point)`)};
69
+ }
70
+ }
71
+ new_opts[:onclick].JS[:hyper_wrapped] = true
72
+ end
73
+ end
74
+ end
75
+
76
+ if new_opts.has_key?(:tooltip)
77
+ block = new_opts[:tooltip]
78
+ if `typeof block === "function"`
79
+ unless new_opts[:tooltip].JS[:hyper_wrapped]
80
+ new_opts[:tooltip] = %x{
81
+ function(item) {
82
+ return #{block.call(`Opal.Hash.$new(item)`)};
83
+ }
84
+ }
85
+ new_opts[:tooltip].JS[:hyper_wrapped] = true
86
+ end
87
+ end
88
+ end
89
+
90
+ if new_opts.has_key?(:x_value_label)
91
+ block = new_opts[:x_value_label]
92
+ if `typeof block === "function"`
93
+ unless new_opts[:x_value_label].JS[:hyper_wrapped]
94
+ new_opts[:x_value_label] = %x{
95
+ function(value) {
96
+ return #{block.call(value)};
97
+ }
98
+ }
99
+ new_opts[:x_value_label].JS[:hyper_wrapped] = true
100
+ end
101
+ end
102
+ end
103
+
104
+ if new_opts.has_key?(:y_value_label)
105
+ block = new_opts[:y_value_label]
106
+ if `typeof block === "function"`
107
+ unless new_opts[:y_value_label].JS[:hyper_wrapped]
108
+ new_opts[:y_value_label] = %x{
109
+ function(value) {
110
+ return #{block.call(value)};
111
+ }
112
+ }
113
+ new_opts[:y_value_label].JS[:hyper_wrapped] = true
114
+ end
115
+ end
116
+ end
117
+
118
+ if new_opts.has_key?(:z_value_label)
119
+ block = new_opts[:z_value_label]
120
+ if `typeof block === "function"`
121
+ unless new_opts[:z_value_label].JS[:hyper_wrapped]
122
+ new_opts[:z_value_label] = %x{
123
+ function(value) {
124
+ return #{block.call(value)};
125
+ }
126
+ }
127
+ new_opts[:z_value_label].JS[:hyper_wrapped] = true
128
+ end
129
+ end
130
+ end
131
+
132
+ lower_camelize_hash(new_opts).to_n
133
+ end
134
+ end
135
+ end