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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3435cbb14a10dac4910fb98669c8e005483e3c4462a6f40b353a8a7baecf9d76
4
- data.tar.gz: e367bc3fe824f0ff2595b21b4b7907a2b0f84b1359db98f5ea30636fee21286b
3
+ metadata.gz: a8b7330654c04a70b036a7c1fa3d32b1bfb5fc5c338516a031ef8daa1ff2e125
4
+ data.tar.gz: 45241374d63e213eb3d881a8031e71a4f901dfbf32fa637b186c1b1db8955a96
5
5
  SHA512:
6
- metadata.gz: 2f75184cfda5413e8cebe56e3b66c7b79314a81d71411b04519547151e44d0ddf24bd41324f29289145643df11f287e3ad612030eeda98ab1d17229369abd4bd
7
- data.tar.gz: 0a38dbe8513c5eb45b32ffbee20f59ca0b0108e3acd830527c21c3a78f0f92e62a35bcb6f90bc504dbfcc576b9cbec38407b93ad663480ac6b12d76c19e3bd3c
6
+ metadata.gz: 2ac9706a1521c635d9867a58eaa83e6db898693d5e6ea1db2446828b7398dfcf5b288da4c6d7139287a1a12e7458b76781e38e093dbc1194fc1385366e99a249
7
+ data.tar.gz: '09fbdf2b037a43e8014f8fa1f4bd1c0ece333bb6b64012823832b332d884cb6243cb1d6a6c1e9ffbf633e1811d1dc595254a61e74608e0dcdb7485943232c040'
data/README.md CHANGED
@@ -1,48 +1,116 @@
1
1
  # hyper-vis
2
2
 
3
- A Opal Ruby wraper for (Vis.js)[visjs.org] with a Ruby-Hyperloop Component.
4
- Currently supports the complete API for:
5
- - Vis Dataset
6
- - Vis Dataview
7
- - Vis Network
3
+ A [Opal](http://opalrb.com) Ruby wrapper for [Vis.js](http://visjs.org) with a [Ruby-Hyperloop](http://ruby-hyperloop.org) Component.
4
+ Implements the complete API for:
5
+ - [Vis Dataset](http://visjs.org/docs/data/dataset.html)
6
+ - [Vis Dataview](http://visjs.org/docs/data/dataview.html)
7
+ - [Vis Graph2d](http://visjs.org/docs/graph2d/)
8
+ - [Vis Graph3d](http://visjs.org/docs/graph3d/)
9
+ - [Vis Network](http://visjs.org/docs/network/)
10
+ - [Vis Timeline](http://visjs.org/docs/timeline/)
8
11
 
9
- ### Installation
10
- for a rails app:
12
+ Includes vis.js version 4.21.0
13
+
14
+ ## Demo
15
+
16
+ Reactive hyper-vis in action:
17
+
18
+ [![Reactivity Demo](http://img.youtube.com/vi/fPSpESBbeMQ/0.jpg)](http://www.youtube.com/watch?v=fPSpESBbeMQ "Reactivity Demo")
19
+
20
+ ## Quality
21
+ [![Build Status](https://semaphoreci.com/api/v1/janbiedermann/hyper-vis/branches/master/shields_badge.svg)](https://semaphoreci.com/janbiedermann/hyper-vis)
22
+ [![GitHub issues](https://img.shields.io/github/issues/janbiedermann/hyper-vis.svg)](https://github.com/janbiedermann/hyper-vis/issues)
23
+ [![Percentage of issues still open](http://isitmaintained.com/badge/open/janbiedermann/hyper-vis.svg)](http://isitmaintained.com/project/janbiedermann/hyper-vis "Percentage of issues still open")
24
+ [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/janbiedermann/hyper-vis.svg)](http://isitmaintained.com/project/janbiedermann/hyper-vis "Average time to resolve an issue")
25
+ [![Pending Pull-Requests](http://githubbadges.herokuapp.com/janbiedermann/hyper-vis/pulls.svg)](https://github.com/janbiedermann/hyper-vis/pulls)
26
+
27
+ #### Tests
11
28
  ```
12
- gem 'hyper-vis'
29
+ Finished in 2 minutes 39.7 seconds (files took 3.18 seconds to load)
30
+ 132 examples, 0 failures, 15 pending
31
+ ```
32
+ #### To run Tests
33
+ Clone repo, then:
34
+ ```bash
35
+ bundle update
36
+ cd spec/test_app
37
+ bundle update
38
+ cd ../..
39
+ bundle exec rspec
13
40
  ```
14
- and `bundle update`
15
- hyper-vis depends on `hyper-component` from (ruby-hyperloop)[http://ruby-hyperloop.org]
16
41
 
17
- vis.js is automatically imported. If you use webpacker, you may need to cancel the import in your config/intializers/hyperloop.rb
42
+ ## Installation
43
+ for a Rails app:
44
+ ```ruby
45
+ gem 'hyper-vis'
18
46
  ```
47
+ and `bundle update`.
48
+
49
+ hyper-vis depends on `hyper-component` from Ruby-Hyperloop but can be used without it.
50
+
51
+ vis.js is automatically imported for Ruby-Hyperloop. If you get vis.js with webpacker, you may need to cancel the import in your config/intializers/hyperloop.rb
52
+ ```ruby
19
53
  config.cancel_import 'vis/source/vis.js'
20
54
  ```
21
- The wrapper expects a global `vis' (not `Vis`) to be availabe in javascript.
22
- stylesheets are includes in 'vis/source/vis.css', images are there too.
55
+ The wrapper expects a global `vis` (not `Vis`) to be availabe in javascript.
56
+ For Vis to function as expected the stylesheets must be included.
57
+ For a Rails app, the asset path is automatically added.
58
+ In your `application.css` add:
59
+ ```
60
+ *= require vis.css
61
+ ```
62
+ For other frameworks vis.js, stylesheets and images are available in the gems `lib/vis/source/` directory.
23
63
 
24
- ### Usage
64
+ ## Usage
25
65
 
26
- #### The Vis part
27
- ```
66
+ The wrapper follows vis 1 to 1, conforming to ruby standards, instead of `setSize` in javascript, you would use `set_size`. Also see specs in the `specs` directory for usage or the vis documentation (linked above).
67
+ All arguments or return values are 'rubyfied' as much as possible, so you can just use ruby.
68
+
69
+ ### The Vis part
70
+ ```ruby
28
71
  dataset = Vis::DataSet.new([{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, {id: 3, name: 'pub'}])
29
72
  edge_dataset = Vis::DataSet.new([{from: 1, to: 2}, {from: 2, to: 3}])
30
73
  dom_node = Vis::Network.test_container
31
74
  net = Vis::Network.new(dom_node, {nodes: dataset, edges: edge_dataset})
32
75
  xy = net.canvas_to_dom({x: 10, y: 10})
33
76
  ```
34
- #### The Component part
35
- The Component takes care about all the things necessary to make Vis.js play nice with React.
36
- The Component also provides a helper to access the document.
77
+ ### The Component part
78
+ The Components takes care about all the things necessary to make Vis.js play nice with React.
79
+ The Components also provide a helper to access the document: `document`.
80
+
81
+ #### Vis::Network::Mixin
37
82
  Vis::Network can be used within the render_with_dom_node.
38
- ```
83
+ ```ruby
39
84
  class MyVisNetworkComponent
40
85
  include Hyperloop::Vis::Network::Mixin
41
86
 
42
- render_with_dom_node do |dom_node, data, options|
87
+ # the component automatically calls the render_with_dom_node block every
88
+ # time new data or options are received
89
+
90
+ # however
91
+ # setting automatic_refresh false turns that off ...
92
+ # (default is true, so this is optional):
93
+ automatic_refresh false
94
+
95
+ # ... and with automatic_refresh false refresh can
96
+ # be handled in the before_receive_props callback
97
+ # for example (this is also optional):
98
+ before_receive_props do |new_props|
99
+ # data can be accessed using the helper vis_data
100
+ if new_props[:vis_data] != vis_data
101
+ @net.set_data(new_props[:vis_data])
102
+ end
103
+ end
43
104
 
44
- net = Vis::Network.new(dom_node, data, options)
105
+ render_with_dom_node do |dom_node, data, options|
106
+ # its important to use the data as passed in as 'data' argument
107
+ # to get the latests passed data for each new render
108
+ @net = Vis::Network.new(dom_node, data, options)
109
+
110
+ # data is also atomatically saved and available using the helper
111
+ vis_data
45
112
 
113
+ # example of using the document helper
46
114
  canvas = document.JS.querySelector('canvas')
47
115
  end
48
116
  end
@@ -51,13 +119,76 @@ class AOuterComponent < Hyperloop::Component
51
119
  render do
52
120
  received_data = []
53
121
 
122
+ # example of using a callback in the options
54
123
  options = { manipulation: {
55
124
  edit_node: proc { |node_data, callback| received_data << node_data }
56
125
  }}
57
126
 
127
+ # initialize a dataset
58
128
  data = Vis::DataSet.new([{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, {id: 3, name: 'pub'}])
59
129
 
130
+ # call the component
60
131
  DIV { MyVisNetworkComponent(vis_data: data, otions: options)}
61
132
  end
62
133
  end
63
- ```
134
+ ```
135
+ #### Vis::Graph3d::Mixin
136
+ Works the same as Vis::Network::Mixin
137
+
138
+ #### Vis::Timeline::Mixin
139
+ Similar to Vis::Network, mostly params and helpers are different:
140
+ ```ruby
141
+ class MyVisTimelineComponent
142
+ include Hyperloop::Vis::Timeline::Mixin
143
+
144
+ # the component automatically calls the render_with_dom_node block every
145
+ # time new data or options are received
146
+
147
+ # however
148
+ # setting automatic_refresh false turns that off ...
149
+ # (default is true, so this is optional):
150
+ automatic_refresh false
151
+
152
+ # ... and with automatic_refresh false refresh can
153
+ # be handled in the before_receive_props callback
154
+ # for example (this is also optional):
155
+ before_receive_props do |new_props|
156
+ # data can be accessed using the helpers:
157
+ items
158
+ groups
159
+ options
160
+ end
161
+
162
+ render_with_dom_node do |dom_node, items, groups, options|
163
+ # its important to use the data as passed in as 'data' argument
164
+ # to get the latests passed data for each new render
165
+ @net = Vis::Timeline.new(dom_node, items, groups, options)
166
+
167
+ # data is also atomatically saved and available using the helpers
168
+ items
169
+ groups
170
+ options
171
+ end
172
+ end
173
+
174
+ class AOuterComponent < Hyperloop::Component
175
+ render do
176
+ options = { align: 'left' }
177
+
178
+ # initialize a dataset
179
+ data = Vis::DataSet.new([
180
+ {id: 1, content: 'item 1', start: '2013-04-20'},
181
+ {id: 2, content: 'item 2', start: '2013-04-14'},
182
+ {id: 3, content: 'item 3', start: '2013-04-18'},
183
+ {id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'},
184
+ {id: 5, content: 'item 5', start: '2013-04-25'},
185
+ {id: 6, content: 'item 6', start: '2013-04-27'}
186
+ ])
187
+
188
+ # call the component
189
+ DIV { MyVisTimelineComponent(items: data, otions: options)}
190
+ end
191
+ end
192
+ ```
193
+ #### Vis::Graph2d::Mixin
194
+ Works the same as Vis::Timeline::Mixin
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.author = "Jan Biedermann"
7
7
  s.email = "jan@kursator.de"
8
8
  s.homepage = "https://github.com/janbiedermann/hyper-vis"
9
- s.summary = "Ruby bindings for Vis as a Ruby Hyperloop Component"
9
+ s.summary = "A Opal Ruby wraper for Vis.js with a Ruby-Hyperloop Component."
10
10
  s.description = "Write React Components in ruby to show graphics created with Vis.js in the ruby way"
11
11
 
12
12
  s.files = `git ls-files`.split("\n")
@@ -16,10 +16,10 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_runtime_dependency "opal", "~> 0.11.0"
18
18
  s.add_runtime_dependency "opal-activesupport", "~> 0.3.1"
19
- s.add_runtime_dependency "hyper-component", "~> 1.0.0.lap23"
20
- s.add_runtime_dependency "hyperloop-config", "~> 1.0.0.lap23"
21
- s.add_development_dependency "hyperloop", "~> 1.0.0.lap23"
22
- s.add_development_dependency "hyper-spec", "~> 1.0.0.lap23"
19
+ s.add_runtime_dependency "hyper-component", "~> 1.0.0.lap27"
20
+ s.add_runtime_dependency "hyperloop-config", "~> 1.0.0.lap27"
21
+ s.add_development_dependency "hyperloop", "~> 1.0.0.lap27"
22
+ s.add_development_dependency "hyper-spec", "~> 1.0.0.lap27"
23
23
  s.add_development_dependency "listen"
24
24
  s.add_development_dependency "rake", ">= 11.3.0"
25
25
  s.add_development_dependency "rails", ">= 5.1.0"
@@ -8,8 +8,15 @@ require 'hyperloop/vis/version'
8
8
  if RUBY_ENGINE == 'opal'
9
9
  require 'vis'
10
10
  require 'hyper-component'
11
+ require 'hyperloop/vis/graph2d/mixin'
12
+ require 'hyperloop/vis/graph2d/component'
13
+ require 'hyperloop/vis/graph3d/mixin'
14
+ require 'hyperloop/vis/graph3d/component'
11
15
  require 'hyperloop/vis/network/mixin'
12
16
  require 'hyperloop/vis/network/component'
17
+ require 'hyperloop/vis/timeline/mixin'
18
+ require 'hyperloop/vis/timeline/component'
13
19
  else
20
+ require 'vis/railtie' if defined?(Rails)
14
21
  Opal.append_path __dir__.untaint
15
22
  end
@@ -0,0 +1,16 @@
1
+ module Hyperloop
2
+ module Vis
3
+ module Graph2d
4
+ class Component
5
+ include Hyperloop::Vis::Graph2d::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 Graph2d
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
@@ -0,0 +1,15 @@
1
+ module Hyperloop
2
+ module Vis
3
+ module Graph3d
4
+ class Component
5
+ include Hyperloop::Vis::Graph3d::Mixin
6
+ def self.inherited(base)
7
+ base.class_eval do
8
+ param vis_data: nil
9
+ param options: nil
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,79 @@
1
+ require 'react/component'
2
+
3
+ module Hyperloop
4
+ module Vis
5
+ module Graph3d
6
+ module Mixin
7
+ def self.included(base)
8
+ base.include(Hyperloop::Component::Mixin)
9
+ base.class_eval do
10
+ param vis_data: nil
11
+ param options: nil
12
+
13
+ def _set_dom_node(dom_node)
14
+ @_dom_node = dom_node
15
+ end
16
+
17
+ def vis_data
18
+ @_data
19
+ end
20
+
21
+ def document
22
+ `window.document`
23
+ end
24
+
25
+ def options
26
+ @_options
27
+ end
28
+
29
+ def automatic_refresh
30
+ true
31
+ end
32
+
33
+ def self.automatic_refresh(value)
34
+ define_method(:automatic_refresh) do
35
+ value
36
+ end
37
+ end
38
+
39
+ def self.render_with_dom_node(tag = 'DIV', &block)
40
+ render do
41
+ @_vis_render_block = block
42
+ @_data = params.vis_data
43
+ @_options = params.options
44
+ send(tag, ref: method(:_set_dom_node).to_proc)
45
+ end
46
+ end
47
+
48
+ def should_component_update?
49
+ `false`
50
+ end
51
+
52
+ after_mount do
53
+ if @_dom_node && @_vis_render_block
54
+ instance_exec(@_dom_node, @_data, @_options, &@_vis_render_block)
55
+ end
56
+ end
57
+
58
+ before_receive_props do |new_props|
59
+ if automatic_refresh && @_dom_node && @_vis_render_block
60
+ changed = false
61
+ if new_props[:vis_data] != @_data
62
+ @_data = new_props[:vis_data]
63
+ changed = true
64
+ end
65
+ if new_props[:options] != @_options
66
+ @_options = new_props[:options]
67
+ changed = true
68
+ end
69
+ if changed
70
+ instance_exec(@_dom_node, @_data, @_options, &@_vis_render_block)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end