README.md in hyper-vis-1.0.0.lap34 vs README.md in hyper-vis-1.0.1
- old
+ new
@@ -1,63 +1,194 @@
# hyper-vis
-A Opal Ruby wraper for (Vis.js)[visjs.org] with a Ruby-Hyperloop Component.
-Currently supports the complete API for:
-- Vis Dataset
-- Vis Dataview
-- Vis Network
+A [Opal](http://opalrb.com) Ruby wrapper for [Vis.js](http://visjs.org) with a [Ruby-Hyperloop](http://ruby-hyperloop.org) Component.
+Implements the complete API for:
+- [Vis Dataset](http://visjs.org/docs/data/dataset.html)
+- [Vis Dataview](http://visjs.org/docs/data/dataview.html)
+- [Vis Graph2d](http://visjs.org/docs/graph2d/)
+- [Vis Graph3d](http://visjs.org/docs/graph3d/)
+- [Vis Network](http://visjs.org/docs/network/)
+- [Vis Timeline](http://visjs.org/docs/timeline/)
-### Installation
-for a rails app:
+Includes vis.js version 4.21.0
+
+## Demo
+
+Reactive hyper-vis in action:
+
+[![Reactivity Demo](http://img.youtube.com/vi/fPSpESBbeMQ/0.jpg)](http://www.youtube.com/watch?v=fPSpESBbeMQ "Reactivity Demo")
+
+## Quality
+[![Build Status](https://semaphoreci.com/api/v1/janbiedermann/hyper-vis/branches/master/shields_badge.svg)](https://semaphoreci.com/janbiedermann/hyper-vis)
+[![GitHub issues](https://img.shields.io/github/issues/janbiedermann/hyper-vis.svg)](https://github.com/janbiedermann/hyper-vis/issues)
+[![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")
+[![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")
+[![Pending Pull-Requests](http://githubbadges.herokuapp.com/janbiedermann/hyper-vis/pulls.svg)](https://github.com/janbiedermann/hyper-vis/pulls)
+
+#### Tests
```
-gem 'hyper-vis'
+Finished in 2 minutes 39.7 seconds (files took 3.18 seconds to load)
+132 examples, 0 failures, 15 pending
```
-and `bundle update`
-hyper-vis depends on `hyper-component` from (ruby-hyperloop)[http://ruby-hyperloop.org]
+#### To run Tests
+Clone repo, then:
+```bash
+bundle update
+cd spec/test_app
+bundle update
+cd ../..
+bundle exec rspec
+```
-vis.js is automatically imported. If you use webpacker, you may need to cancel the import in your config/intializers/hyperloop.rb
+## Installation
+for a Rails app:
+```ruby
+gem 'hyper-vis'
```
+and `bundle update`.
+
+hyper-vis depends on `hyper-component` from Ruby-Hyperloop but can be used without it.
+
+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
+```ruby
config.cancel_import 'vis/source/vis.js'
```
-The wrapper expects a global `vis' (not `Vis`) to be availabe in javascript.
-stylesheets are includes in 'vis/source/vis.css', images are there too.
+The wrapper expects a global `vis` (not `Vis`) to be availabe in javascript.
+For Vis to function as expected the stylesheets must be included.
+For a Rails app, the asset path is automatically added.
+In your `application.css` add:
+```
+ *= require vis.css
+```
+For other frameworks vis.js, stylesheets and images are available in the gems `lib/vis/source/` directory.
-### Usage
+## Usage
-#### The Vis part
-```
+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).
+All arguments or return values are 'rubyfied' as much as possible, so you can just use ruby.
+
+### The Vis part
+```ruby
dataset = Vis::DataSet.new([{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, {id: 3, name: 'pub'}])
edge_dataset = Vis::DataSet.new([{from: 1, to: 2}, {from: 2, to: 3}])
dom_node = Vis::Network.test_container
net = Vis::Network.new(dom_node, {nodes: dataset, edges: edge_dataset})
xy = net.canvas_to_dom({x: 10, y: 10})
```
-#### The Component part
-The Component takes care about all the things necessary to make Vis.js play nice with React.
-The Component also provides a helper to access the document.
+### The Component part
+The Components takes care about all the things necessary to make Vis.js play nice with React.
+The Components also provide a helper to access the document: `document`.
+
+#### Vis::Network::Mixin
Vis::Network can be used within the render_with_dom_node.
-```
+```ruby
class MyVisNetworkComponent
include Hyperloop::Vis::Network::Mixin
- render_with_dom_node do |dom_node, data, options|
+ # the component automatically calls the render_with_dom_node block every
+ # time new data or options are received
- net = Vis::Network.new(dom_node, data, options)
+ # however
+ # setting automatic_refresh false turns that off ...
+ # (default is true, so this is optional):
+ automatic_refresh false
+ # ... and with automatic_refresh false refresh can
+ # be handled in the before_receive_props callback
+ # for example (this is also optional):
+ before_receive_props do |new_props|
+ # data can be accessed using the helper vis_data
+ if new_props[:vis_data] != vis_data
+ @net.set_data(new_props[:vis_data])
+ end
+ end
+
+ render_with_dom_node do |dom_node, data, options|
+ # its important to use the data as passed in as 'data' argument
+ # to get the latests passed data for each new render
+ @net = Vis::Network.new(dom_node, data, options)
+
+ # data is also atomatically saved and available using the helper
+ vis_data
+
+ # example of using the document helper
canvas = document.JS.querySelector('canvas')
end
end
class AOuterComponent < Hyperloop::Component
render do
received_data = []
+ # example of using a callback in the options
options = { manipulation: {
edit_node: proc { |node_data, callback| received_data << node_data }
}}
+ # initialize a dataset
data = Vis::DataSet.new([{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, {id: 3, name: 'pub'}])
+ # call the component
DIV { MyVisNetworkComponent(vis_data: data, otions: options)}
end
end
-```
\ No newline at end of file
+```
+#### Vis::Graph3d::Mixin
+Works the same as Vis::Network::Mixin
+
+#### Vis::Timeline::Mixin
+Similar to Vis::Network, mostly params and helpers are different:
+```ruby
+class MyVisTimelineComponent
+ include Hyperloop::Vis::Timeline::Mixin
+
+ # the component automatically calls the render_with_dom_node block every
+ # time new data or options are received
+
+ # however
+ # setting automatic_refresh false turns that off ...
+ # (default is true, so this is optional):
+ automatic_refresh false
+
+ # ... and with automatic_refresh false refresh can
+ # be handled in the before_receive_props callback
+ # for example (this is also optional):
+ before_receive_props do |new_props|
+ # data can be accessed using the helpers:
+ items
+ groups
+ options
+ end
+
+ render_with_dom_node do |dom_node, items, groups, options|
+ # its important to use the data as passed in as 'data' argument
+ # to get the latests passed data for each new render
+ @net = Vis::Timeline.new(dom_node, items, groups, options)
+
+ # data is also atomatically saved and available using the helpers
+ items
+ groups
+ options
+ end
+end
+
+class AOuterComponent < Hyperloop::Component
+ render do
+ options = { align: 'left' }
+
+ # initialize a dataset
+ data = Vis::DataSet.new([
+ {id: 1, content: 'item 1', start: '2013-04-20'},
+ {id: 2, content: 'item 2', start: '2013-04-14'},
+ {id: 3, content: 'item 3', start: '2013-04-18'},
+ {id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'},
+ {id: 5, content: 'item 5', start: '2013-04-25'},
+ {id: 6, content: 'item 6', start: '2013-04-27'}
+ ])
+
+ # call the component
+ DIV { MyVisTimelineComponent(items: data, otions: options)}
+ end
+end
+```
+#### Vis::Graph2d::Mixin
+Works the same as Vis::Timeline::Mixin