vis-rails 2.0.0 → 2.0.1
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/lib/vis/rails/version.rb +1 -1
- data/vendor/assets/javascripts/vis.js +26 -26
- metadata +16 -85
- data/vendor/assets/vis/DataSet.js +0 -926
- data/vendor/assets/vis/DataView.js +0 -283
- data/vendor/assets/vis/graph/Edge.js +0 -957
- data/vendor/assets/vis/graph/Graph.js +0 -2291
- data/vendor/assets/vis/graph/Groups.js +0 -80
- data/vendor/assets/vis/graph/Images.js +0 -41
- data/vendor/assets/vis/graph/Node.js +0 -966
- data/vendor/assets/vis/graph/Popup.js +0 -132
- data/vendor/assets/vis/graph/css/graph-manipulation.css +0 -128
- data/vendor/assets/vis/graph/css/graph-navigation.css +0 -66
- data/vendor/assets/vis/graph/dotparser.js +0 -829
- data/vendor/assets/vis/graph/graphMixins/ClusterMixin.js +0 -1143
- data/vendor/assets/vis/graph/graphMixins/HierarchicalLayoutMixin.js +0 -311
- data/vendor/assets/vis/graph/graphMixins/ManipulationMixin.js +0 -576
- data/vendor/assets/vis/graph/graphMixins/MixinLoader.js +0 -199
- data/vendor/assets/vis/graph/graphMixins/NavigationMixin.js +0 -205
- data/vendor/assets/vis/graph/graphMixins/SectorsMixin.js +0 -552
- data/vendor/assets/vis/graph/graphMixins/SelectionMixin.js +0 -648
- data/vendor/assets/vis/graph/graphMixins/physics/BarnesHut.js +0 -398
- data/vendor/assets/vis/graph/graphMixins/physics/HierarchialRepulsion.js +0 -64
- data/vendor/assets/vis/graph/graphMixins/physics/PhysicsMixin.js +0 -697
- data/vendor/assets/vis/graph/graphMixins/physics/Repulsion.js +0 -66
- data/vendor/assets/vis/graph/img/acceptDeleteIcon.png +0 -0
- data/vendor/assets/vis/graph/img/addNodeIcon.png +0 -0
- data/vendor/assets/vis/graph/img/backIcon.png +0 -0
- data/vendor/assets/vis/graph/img/connectIcon.png +0 -0
- data/vendor/assets/vis/graph/img/cross.png +0 -0
- data/vendor/assets/vis/graph/img/cross2.png +0 -0
- data/vendor/assets/vis/graph/img/deleteIcon.png +0 -0
- data/vendor/assets/vis/graph/img/downArrow.png +0 -0
- data/vendor/assets/vis/graph/img/editIcon.png +0 -0
- data/vendor/assets/vis/graph/img/leftArrow.png +0 -0
- data/vendor/assets/vis/graph/img/minus.png +0 -0
- data/vendor/assets/vis/graph/img/plus.png +0 -0
- data/vendor/assets/vis/graph/img/rightArrow.png +0 -0
- data/vendor/assets/vis/graph/img/upArrow.png +0 -0
- data/vendor/assets/vis/graph/img/zoomExtends.png +0 -0
- data/vendor/assets/vis/graph/shapes.js +0 -225
- data/vendor/assets/vis/graph3d/Graph3d.js +0 -3306
- data/vendor/assets/vis/module/exports.js +0 -65
- data/vendor/assets/vis/module/header.js +0 -24
- data/vendor/assets/vis/module/imports.js +0 -31
- data/vendor/assets/vis/shim.js +0 -252
- data/vendor/assets/vis/timeline/Range.js +0 -532
- data/vendor/assets/vis/timeline/TimeStep.js +0 -466
- data/vendor/assets/vis/timeline/Timeline.js +0 -851
- data/vendor/assets/vis/timeline/component/Component.js +0 -52
- data/vendor/assets/vis/timeline/component/CurrentTime.js +0 -128
- data/vendor/assets/vis/timeline/component/CustomTime.js +0 -182
- data/vendor/assets/vis/timeline/component/Group.js +0 -470
- data/vendor/assets/vis/timeline/component/ItemSet.js +0 -1332
- data/vendor/assets/vis/timeline/component/TimeAxis.js +0 -389
- data/vendor/assets/vis/timeline/component/css/animation.css +0 -33
- data/vendor/assets/vis/timeline/component/css/currenttime.css +0 -5
- data/vendor/assets/vis/timeline/component/css/customtime.css +0 -6
- data/vendor/assets/vis/timeline/component/css/item.css +0 -107
- data/vendor/assets/vis/timeline/component/css/itemset.css +0 -33
- data/vendor/assets/vis/timeline/component/css/labelset.css +0 -36
- data/vendor/assets/vis/timeline/component/css/panel.css +0 -71
- data/vendor/assets/vis/timeline/component/css/timeaxis.css +0 -48
- data/vendor/assets/vis/timeline/component/css/timeline.css +0 -2
- data/vendor/assets/vis/timeline/component/item/Item.js +0 -139
- data/vendor/assets/vis/timeline/component/item/ItemBox.js +0 -230
- data/vendor/assets/vis/timeline/component/item/ItemPoint.js +0 -190
- data/vendor/assets/vis/timeline/component/item/ItemRange.js +0 -262
- data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +0 -57
- data/vendor/assets/vis/timeline/img/delete.png +0 -0
- data/vendor/assets/vis/timeline/stack.js +0 -112
- data/vendor/assets/vis/util.js +0 -990
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e26e8d73439c435c7cb51f91ae5d907817ddc96
|
4
|
+
data.tar.gz: df482a44d381096b3da2d69080253274dd1b0a70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5aca05a594565f770285fd032a79c43f92e737eb25ae1603d55a5ff283c86033672cdecf312bff6cac2baa11e1f9243439386f77972a0385874b6ddf0a6c5d1
|
7
|
+
data.tar.gz: a4bca7252c6657758993f574fd400ab468a781bcdb8e36031664a49ba525dfdae08df623839b33710eb0cf21232907246aceecf43ce0a460b6a6a05510dd6ed4
|
data/lib/vis/rails/version.rb
CHANGED
@@ -1,35 +1,35 @@
|
|
1
|
-
//=
|
1
|
+
//= require_relative ../vis/module/header
|
2
2
|
//= require moment
|
3
3
|
//= require hammer
|
4
|
-
//=
|
4
|
+
//= require_relative ../component/emitter
|
5
5
|
|
6
|
-
//=
|
7
|
-
//=
|
8
|
-
//=
|
9
|
-
//=
|
6
|
+
//= require_relative ../vis/shim
|
7
|
+
//= require_relative ../vis/util
|
8
|
+
//= require_relative ../vis/DataSet
|
9
|
+
//= require_relative ../vis/DataView
|
10
10
|
|
11
|
-
//=
|
12
|
-
//=
|
13
|
-
//=
|
14
|
-
//=
|
15
|
-
//=
|
16
|
-
//=
|
17
|
-
//=
|
11
|
+
//= require_relative ../vis/timeline/stack
|
12
|
+
//= require_relative ../vis/timeline/TimeStep
|
13
|
+
//= require_relative ../vis/timeline/component/Component
|
14
|
+
//= require_relative ../vis/timeline/Range
|
15
|
+
//= require_relative ../vis/timeline/component/TimeAxis
|
16
|
+
//= require_relative ../vis/timeline/component/CurrentTime
|
17
|
+
//= require_relative ../vis/timeline/component/CustomTime
|
18
18
|
//= require_tree ../vis/timeline/component/item
|
19
|
-
//=
|
20
|
-
//=
|
21
|
-
//=
|
19
|
+
//= require_relative ../vis/timeline/component/ItemSet
|
20
|
+
//= require_relative ../vis/timeline/component/Group
|
21
|
+
//= require_relative ../vis/timeline/Timeline
|
22
22
|
|
23
|
-
//=
|
24
|
-
//=
|
25
|
-
//=
|
26
|
-
//=
|
27
|
-
//=
|
28
|
-
//=
|
29
|
-
//=
|
23
|
+
//= require_relative ../vis/graph/dotparser
|
24
|
+
//= require_relative ../vis/graph/shapes
|
25
|
+
//= require_relative ../vis/graph/Node
|
26
|
+
//= require_relative ../vis/graph/Edge
|
27
|
+
//= require_relative ../vis/graph/Popup
|
28
|
+
//= require_relative ../vis/graph/Groups
|
29
|
+
//= require_relative ../vis/graph/Images
|
30
30
|
//= require_tree ../vis/graph/graphMixins
|
31
|
-
//=
|
31
|
+
//= require_relative ../vis/graph/Graph
|
32
32
|
|
33
|
-
//=
|
33
|
+
//= require_relative ../vis/graph3d/Graph3d
|
34
34
|
|
35
|
-
//=
|
35
|
+
//= require_relative ../vis/module/exports
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vis-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AlexVangelov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: momentjs-rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: hammerjs-rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: This gem provides Rails driver for http://visjs.org browser-based visualization
|
@@ -74,9 +74,9 @@ executables: []
|
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
-
- .gitignore
|
78
|
-
- .gitmodules
|
79
|
-
- .project
|
77
|
+
- ".gitignore"
|
78
|
+
- ".gitmodules"
|
79
|
+
- ".project"
|
80
80
|
- CHANGELOG.md
|
81
81
|
- Gemfile
|
82
82
|
- LICENSE
|
@@ -92,75 +92,6 @@ files:
|
|
92
92
|
- vendor/assets/javascripts/vis.js
|
93
93
|
- vendor/assets/stylesheets/vis-only-timeline.css
|
94
94
|
- vendor/assets/stylesheets/vis.css
|
95
|
-
- vendor/assets/vis/DataSet.js
|
96
|
-
- vendor/assets/vis/DataView.js
|
97
|
-
- vendor/assets/vis/graph/Edge.js
|
98
|
-
- vendor/assets/vis/graph/Graph.js
|
99
|
-
- vendor/assets/vis/graph/Groups.js
|
100
|
-
- vendor/assets/vis/graph/Images.js
|
101
|
-
- vendor/assets/vis/graph/Node.js
|
102
|
-
- vendor/assets/vis/graph/Popup.js
|
103
|
-
- vendor/assets/vis/graph/css/graph-manipulation.css
|
104
|
-
- vendor/assets/vis/graph/css/graph-navigation.css
|
105
|
-
- vendor/assets/vis/graph/dotparser.js
|
106
|
-
- vendor/assets/vis/graph/graphMixins/ClusterMixin.js
|
107
|
-
- vendor/assets/vis/graph/graphMixins/HierarchicalLayoutMixin.js
|
108
|
-
- vendor/assets/vis/graph/graphMixins/ManipulationMixin.js
|
109
|
-
- vendor/assets/vis/graph/graphMixins/MixinLoader.js
|
110
|
-
- vendor/assets/vis/graph/graphMixins/NavigationMixin.js
|
111
|
-
- vendor/assets/vis/graph/graphMixins/SectorsMixin.js
|
112
|
-
- vendor/assets/vis/graph/graphMixins/SelectionMixin.js
|
113
|
-
- vendor/assets/vis/graph/graphMixins/physics/BarnesHut.js
|
114
|
-
- vendor/assets/vis/graph/graphMixins/physics/HierarchialRepulsion.js
|
115
|
-
- vendor/assets/vis/graph/graphMixins/physics/PhysicsMixin.js
|
116
|
-
- vendor/assets/vis/graph/graphMixins/physics/Repulsion.js
|
117
|
-
- vendor/assets/vis/graph/img/acceptDeleteIcon.png
|
118
|
-
- vendor/assets/vis/graph/img/addNodeIcon.png
|
119
|
-
- vendor/assets/vis/graph/img/backIcon.png
|
120
|
-
- vendor/assets/vis/graph/img/connectIcon.png
|
121
|
-
- vendor/assets/vis/graph/img/cross.png
|
122
|
-
- vendor/assets/vis/graph/img/cross2.png
|
123
|
-
- vendor/assets/vis/graph/img/deleteIcon.png
|
124
|
-
- vendor/assets/vis/graph/img/downArrow.png
|
125
|
-
- vendor/assets/vis/graph/img/editIcon.png
|
126
|
-
- vendor/assets/vis/graph/img/leftArrow.png
|
127
|
-
- vendor/assets/vis/graph/img/minus.png
|
128
|
-
- vendor/assets/vis/graph/img/plus.png
|
129
|
-
- vendor/assets/vis/graph/img/rightArrow.png
|
130
|
-
- vendor/assets/vis/graph/img/upArrow.png
|
131
|
-
- vendor/assets/vis/graph/img/zoomExtends.png
|
132
|
-
- vendor/assets/vis/graph/shapes.js
|
133
|
-
- vendor/assets/vis/graph3d/Graph3d.js
|
134
|
-
- vendor/assets/vis/module/exports.js
|
135
|
-
- vendor/assets/vis/module/header.js
|
136
|
-
- vendor/assets/vis/module/imports.js
|
137
|
-
- vendor/assets/vis/shim.js
|
138
|
-
- vendor/assets/vis/timeline/Range.js
|
139
|
-
- vendor/assets/vis/timeline/TimeStep.js
|
140
|
-
- vendor/assets/vis/timeline/Timeline.js
|
141
|
-
- vendor/assets/vis/timeline/component/Component.js
|
142
|
-
- vendor/assets/vis/timeline/component/CurrentTime.js
|
143
|
-
- vendor/assets/vis/timeline/component/CustomTime.js
|
144
|
-
- vendor/assets/vis/timeline/component/Group.js
|
145
|
-
- vendor/assets/vis/timeline/component/ItemSet.js
|
146
|
-
- vendor/assets/vis/timeline/component/TimeAxis.js
|
147
|
-
- vendor/assets/vis/timeline/component/css/animation.css
|
148
|
-
- vendor/assets/vis/timeline/component/css/currenttime.css
|
149
|
-
- vendor/assets/vis/timeline/component/css/customtime.css
|
150
|
-
- vendor/assets/vis/timeline/component/css/item.css
|
151
|
-
- vendor/assets/vis/timeline/component/css/itemset.css
|
152
|
-
- vendor/assets/vis/timeline/component/css/labelset.css
|
153
|
-
- vendor/assets/vis/timeline/component/css/panel.css
|
154
|
-
- vendor/assets/vis/timeline/component/css/timeaxis.css
|
155
|
-
- vendor/assets/vis/timeline/component/css/timeline.css
|
156
|
-
- vendor/assets/vis/timeline/component/item/Item.js
|
157
|
-
- vendor/assets/vis/timeline/component/item/ItemBox.js
|
158
|
-
- vendor/assets/vis/timeline/component/item/ItemPoint.js
|
159
|
-
- vendor/assets/vis/timeline/component/item/ItemRange.js
|
160
|
-
- vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js
|
161
|
-
- vendor/assets/vis/timeline/img/delete.png
|
162
|
-
- vendor/assets/vis/timeline/stack.js
|
163
|
-
- vendor/assets/vis/util.js
|
164
95
|
- vis-rails.gemspec
|
165
96
|
homepage: https://github.com/AlexVangelov/vis-rails
|
166
97
|
licenses:
|
@@ -172,17 +103,17 @@ require_paths:
|
|
172
103
|
- lib
|
173
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
174
105
|
requirements:
|
175
|
-
- -
|
106
|
+
- - ">="
|
176
107
|
- !ruby/object:Gem::Version
|
177
108
|
version: '0'
|
178
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
110
|
requirements:
|
180
|
-
- -
|
111
|
+
- - ">="
|
181
112
|
- !ruby/object:Gem::Version
|
182
113
|
version: '0'
|
183
114
|
requirements: []
|
184
115
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.
|
116
|
+
rubygems_version: 2.4.6
|
186
117
|
signing_key:
|
187
118
|
specification_version: 4
|
188
119
|
summary: Using http://visjs.org visualization library with Rails
|
@@ -1,926 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* DataSet
|
3
|
-
*
|
4
|
-
* Usage:
|
5
|
-
* var dataSet = new DataSet({
|
6
|
-
* fieldId: '_id',
|
7
|
-
* type: {
|
8
|
-
* // ...
|
9
|
-
* }
|
10
|
-
* });
|
11
|
-
*
|
12
|
-
* dataSet.add(item);
|
13
|
-
* dataSet.add(data);
|
14
|
-
* dataSet.update(item);
|
15
|
-
* dataSet.update(data);
|
16
|
-
* dataSet.remove(id);
|
17
|
-
* dataSet.remove(ids);
|
18
|
-
* var data = dataSet.get();
|
19
|
-
* var data = dataSet.get(id);
|
20
|
-
* var data = dataSet.get(ids);
|
21
|
-
* var data = dataSet.get(ids, options, data);
|
22
|
-
* dataSet.clear();
|
23
|
-
*
|
24
|
-
* A data set can:
|
25
|
-
* - add/remove/update data
|
26
|
-
* - gives triggers upon changes in the data
|
27
|
-
* - can import/export data in various data formats
|
28
|
-
*
|
29
|
-
* @param {Array | DataTable} [data] Optional array with initial data
|
30
|
-
* @param {Object} [options] Available options:
|
31
|
-
* {String} fieldId Field name of the id in the
|
32
|
-
* items, 'id' by default.
|
33
|
-
* {Object.<String, String} type
|
34
|
-
* A map with field names as key,
|
35
|
-
* and the field type as value.
|
36
|
-
* @constructor DataSet
|
37
|
-
*/
|
38
|
-
// TODO: add a DataSet constructor DataSet(data, options)
|
39
|
-
function DataSet (data, options) {
|
40
|
-
// correctly read optional arguments
|
41
|
-
if (data && !Array.isArray(data) && !util.isDataTable(data)) {
|
42
|
-
options = data;
|
43
|
-
data = null;
|
44
|
-
}
|
45
|
-
|
46
|
-
this._options = options || {};
|
47
|
-
this._data = {}; // map with data indexed by id
|
48
|
-
this._fieldId = this._options.fieldId || 'id'; // name of the field containing id
|
49
|
-
this._type = {}; // internal field types (NOTE: this can differ from this._options.type)
|
50
|
-
|
51
|
-
// all variants of a Date are internally stored as Date, so we can convert
|
52
|
-
// from everything to everything (also from ISODate to Number for example)
|
53
|
-
if (this._options.type) {
|
54
|
-
for (var field in this._options.type) {
|
55
|
-
if (this._options.type.hasOwnProperty(field)) {
|
56
|
-
var value = this._options.type[field];
|
57
|
-
if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') {
|
58
|
-
this._type[field] = 'Date';
|
59
|
-
}
|
60
|
-
else {
|
61
|
-
this._type[field] = value;
|
62
|
-
}
|
63
|
-
}
|
64
|
-
}
|
65
|
-
}
|
66
|
-
|
67
|
-
// TODO: deprecated since version 1.1.1 (or 2.0.0?)
|
68
|
-
if (this._options.convert) {
|
69
|
-
throw new Error('Option "convert" is deprecated. Use "type" instead.');
|
70
|
-
}
|
71
|
-
|
72
|
-
this._subscribers = {}; // event subscribers
|
73
|
-
|
74
|
-
// add initial data when provided
|
75
|
-
if (data) {
|
76
|
-
this.add(data);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
/**
|
81
|
-
* Subscribe to an event, add an event listener
|
82
|
-
* @param {String} event Event name. Available events: 'put', 'update',
|
83
|
-
* 'remove'
|
84
|
-
* @param {function} callback Callback method. Called with three parameters:
|
85
|
-
* {String} event
|
86
|
-
* {Object | null} params
|
87
|
-
* {String | Number} senderId
|
88
|
-
*/
|
89
|
-
DataSet.prototype.on = function(event, callback) {
|
90
|
-
var subscribers = this._subscribers[event];
|
91
|
-
if (!subscribers) {
|
92
|
-
subscribers = [];
|
93
|
-
this._subscribers[event] = subscribers;
|
94
|
-
}
|
95
|
-
|
96
|
-
subscribers.push({
|
97
|
-
callback: callback
|
98
|
-
});
|
99
|
-
};
|
100
|
-
|
101
|
-
// TODO: make this function deprecated (replaced with `on` since version 0.5)
|
102
|
-
DataSet.prototype.subscribe = DataSet.prototype.on;
|
103
|
-
|
104
|
-
/**
|
105
|
-
* Unsubscribe from an event, remove an event listener
|
106
|
-
* @param {String} event
|
107
|
-
* @param {function} callback
|
108
|
-
*/
|
109
|
-
DataSet.prototype.off = function(event, callback) {
|
110
|
-
var subscribers = this._subscribers[event];
|
111
|
-
if (subscribers) {
|
112
|
-
this._subscribers[event] = subscribers.filter(function (listener) {
|
113
|
-
return (listener.callback != callback);
|
114
|
-
});
|
115
|
-
}
|
116
|
-
};
|
117
|
-
|
118
|
-
// TODO: make this function deprecated (replaced with `on` since version 0.5)
|
119
|
-
DataSet.prototype.unsubscribe = DataSet.prototype.off;
|
120
|
-
|
121
|
-
/**
|
122
|
-
* Trigger an event
|
123
|
-
* @param {String} event
|
124
|
-
* @param {Object | null} params
|
125
|
-
* @param {String} [senderId] Optional id of the sender.
|
126
|
-
* @private
|
127
|
-
*/
|
128
|
-
DataSet.prototype._trigger = function (event, params, senderId) {
|
129
|
-
if (event == '*') {
|
130
|
-
throw new Error('Cannot trigger event *');
|
131
|
-
}
|
132
|
-
|
133
|
-
var subscribers = [];
|
134
|
-
if (event in this._subscribers) {
|
135
|
-
subscribers = subscribers.concat(this._subscribers[event]);
|
136
|
-
}
|
137
|
-
if ('*' in this._subscribers) {
|
138
|
-
subscribers = subscribers.concat(this._subscribers['*']);
|
139
|
-
}
|
140
|
-
|
141
|
-
for (var i = 0; i < subscribers.length; i++) {
|
142
|
-
var subscriber = subscribers[i];
|
143
|
-
if (subscriber.callback) {
|
144
|
-
subscriber.callback(event, params, senderId || null);
|
145
|
-
}
|
146
|
-
}
|
147
|
-
};
|
148
|
-
|
149
|
-
/**
|
150
|
-
* Add data.
|
151
|
-
* Adding an item will fail when there already is an item with the same id.
|
152
|
-
* @param {Object | Array | DataTable} data
|
153
|
-
* @param {String} [senderId] Optional sender id
|
154
|
-
* @return {Array} addedIds Array with the ids of the added items
|
155
|
-
*/
|
156
|
-
DataSet.prototype.add = function (data, senderId) {
|
157
|
-
var addedIds = [],
|
158
|
-
id,
|
159
|
-
me = this;
|
160
|
-
|
161
|
-
if (Array.isArray(data)) {
|
162
|
-
// Array
|
163
|
-
for (var i = 0, len = data.length; i < len; i++) {
|
164
|
-
id = me._addItem(data[i]);
|
165
|
-
addedIds.push(id);
|
166
|
-
}
|
167
|
-
}
|
168
|
-
else if (util.isDataTable(data)) {
|
169
|
-
// Google DataTable
|
170
|
-
var columns = this._getColumnNames(data);
|
171
|
-
for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) {
|
172
|
-
var item = {};
|
173
|
-
for (var col = 0, cols = columns.length; col < cols; col++) {
|
174
|
-
var field = columns[col];
|
175
|
-
item[field] = data.getValue(row, col);
|
176
|
-
}
|
177
|
-
|
178
|
-
id = me._addItem(item);
|
179
|
-
addedIds.push(id);
|
180
|
-
}
|
181
|
-
}
|
182
|
-
else if (data instanceof Object) {
|
183
|
-
// Single item
|
184
|
-
id = me._addItem(data);
|
185
|
-
addedIds.push(id);
|
186
|
-
}
|
187
|
-
else {
|
188
|
-
throw new Error('Unknown dataType');
|
189
|
-
}
|
190
|
-
|
191
|
-
if (addedIds.length) {
|
192
|
-
this._trigger('add', {items: addedIds}, senderId);
|
193
|
-
}
|
194
|
-
|
195
|
-
return addedIds;
|
196
|
-
};
|
197
|
-
|
198
|
-
/**
|
199
|
-
* Update existing items. When an item does not exist, it will be created
|
200
|
-
* @param {Object | Array | DataTable} data
|
201
|
-
* @param {String} [senderId] Optional sender id
|
202
|
-
* @return {Array} updatedIds The ids of the added or updated items
|
203
|
-
*/
|
204
|
-
DataSet.prototype.update = function (data, senderId) {
|
205
|
-
var addedIds = [],
|
206
|
-
updatedIds = [],
|
207
|
-
me = this,
|
208
|
-
fieldId = me._fieldId;
|
209
|
-
|
210
|
-
var addOrUpdate = function (item) {
|
211
|
-
var id = item[fieldId];
|
212
|
-
if (me._data[id]) {
|
213
|
-
// update item
|
214
|
-
id = me._updateItem(item);
|
215
|
-
updatedIds.push(id);
|
216
|
-
}
|
217
|
-
else {
|
218
|
-
// add new item
|
219
|
-
id = me._addItem(item);
|
220
|
-
addedIds.push(id);
|
221
|
-
}
|
222
|
-
};
|
223
|
-
|
224
|
-
if (Array.isArray(data)) {
|
225
|
-
// Array
|
226
|
-
for (var i = 0, len = data.length; i < len; i++) {
|
227
|
-
addOrUpdate(data[i]);
|
228
|
-
}
|
229
|
-
}
|
230
|
-
else if (util.isDataTable(data)) {
|
231
|
-
// Google DataTable
|
232
|
-
var columns = this._getColumnNames(data);
|
233
|
-
for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) {
|
234
|
-
var item = {};
|
235
|
-
for (var col = 0, cols = columns.length; col < cols; col++) {
|
236
|
-
var field = columns[col];
|
237
|
-
item[field] = data.getValue(row, col);
|
238
|
-
}
|
239
|
-
|
240
|
-
addOrUpdate(item);
|
241
|
-
}
|
242
|
-
}
|
243
|
-
else if (data instanceof Object) {
|
244
|
-
// Single item
|
245
|
-
addOrUpdate(data);
|
246
|
-
}
|
247
|
-
else {
|
248
|
-
throw new Error('Unknown dataType');
|
249
|
-
}
|
250
|
-
|
251
|
-
if (addedIds.length) {
|
252
|
-
this._trigger('add', {items: addedIds}, senderId);
|
253
|
-
}
|
254
|
-
if (updatedIds.length) {
|
255
|
-
this._trigger('update', {items: updatedIds}, senderId);
|
256
|
-
}
|
257
|
-
|
258
|
-
return addedIds.concat(updatedIds);
|
259
|
-
};
|
260
|
-
|
261
|
-
/**
|
262
|
-
* Get a data item or multiple items.
|
263
|
-
*
|
264
|
-
* Usage:
|
265
|
-
*
|
266
|
-
* get()
|
267
|
-
* get(options: Object)
|
268
|
-
* get(options: Object, data: Array | DataTable)
|
269
|
-
*
|
270
|
-
* get(id: Number | String)
|
271
|
-
* get(id: Number | String, options: Object)
|
272
|
-
* get(id: Number | String, options: Object, data: Array | DataTable)
|
273
|
-
*
|
274
|
-
* get(ids: Number[] | String[])
|
275
|
-
* get(ids: Number[] | String[], options: Object)
|
276
|
-
* get(ids: Number[] | String[], options: Object, data: Array | DataTable)
|
277
|
-
*
|
278
|
-
* Where:
|
279
|
-
*
|
280
|
-
* {Number | String} id The id of an item
|
281
|
-
* {Number[] | String{}} ids An array with ids of items
|
282
|
-
* {Object} options An Object with options. Available options:
|
283
|
-
* {String} [returnType] Type of data to be
|
284
|
-
* returned. Can be 'DataTable' or 'Array' (default)
|
285
|
-
* {Object.<String, String>} [type]
|
286
|
-
* {String[]} [fields] field names to be returned
|
287
|
-
* {function} [filter] filter items
|
288
|
-
* {String | function} [order] Order the items by
|
289
|
-
* a field name or custom sort function.
|
290
|
-
* {Array | DataTable} [data] If provided, items will be appended to this
|
291
|
-
* array or table. Required in case of Google
|
292
|
-
* DataTable.
|
293
|
-
*
|
294
|
-
* @throws Error
|
295
|
-
*/
|
296
|
-
DataSet.prototype.get = function (args) {
|
297
|
-
var me = this;
|
298
|
-
|
299
|
-
// parse the arguments
|
300
|
-
var id, ids, options, data;
|
301
|
-
var firstType = util.getType(arguments[0]);
|
302
|
-
if (firstType == 'String' || firstType == 'Number') {
|
303
|
-
// get(id [, options] [, data])
|
304
|
-
id = arguments[0];
|
305
|
-
options = arguments[1];
|
306
|
-
data = arguments[2];
|
307
|
-
}
|
308
|
-
else if (firstType == 'Array') {
|
309
|
-
// get(ids [, options] [, data])
|
310
|
-
ids = arguments[0];
|
311
|
-
options = arguments[1];
|
312
|
-
data = arguments[2];
|
313
|
-
}
|
314
|
-
else {
|
315
|
-
// get([, options] [, data])
|
316
|
-
options = arguments[0];
|
317
|
-
data = arguments[1];
|
318
|
-
}
|
319
|
-
|
320
|
-
// determine the return type
|
321
|
-
var returnType;
|
322
|
-
if (options && options.returnType) {
|
323
|
-
returnType = (options.returnType == 'DataTable') ? 'DataTable' : 'Array';
|
324
|
-
|
325
|
-
if (data && (returnType != util.getType(data))) {
|
326
|
-
throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' +
|
327
|
-
'does not correspond with specified options.type (' + options.type + ')');
|
328
|
-
}
|
329
|
-
if (returnType == 'DataTable' && !util.isDataTable(data)) {
|
330
|
-
throw new Error('Parameter "data" must be a DataTable ' +
|
331
|
-
'when options.type is "DataTable"');
|
332
|
-
}
|
333
|
-
}
|
334
|
-
else if (data) {
|
335
|
-
returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array';
|
336
|
-
}
|
337
|
-
else {
|
338
|
-
returnType = 'Array';
|
339
|
-
}
|
340
|
-
|
341
|
-
// build options
|
342
|
-
var type = options && options.type || this._options.type;
|
343
|
-
var filter = options && options.filter;
|
344
|
-
var items = [], item, itemId, i, len;
|
345
|
-
|
346
|
-
// convert items
|
347
|
-
if (id != undefined) {
|
348
|
-
// return a single item
|
349
|
-
item = me._getItem(id, type);
|
350
|
-
if (filter && !filter(item)) {
|
351
|
-
item = null;
|
352
|
-
}
|
353
|
-
}
|
354
|
-
else if (ids != undefined) {
|
355
|
-
// return a subset of items
|
356
|
-
for (i = 0, len = ids.length; i < len; i++) {
|
357
|
-
item = me._getItem(ids[i], type);
|
358
|
-
if (!filter || filter(item)) {
|
359
|
-
items.push(item);
|
360
|
-
}
|
361
|
-
}
|
362
|
-
}
|
363
|
-
else {
|
364
|
-
// return all items
|
365
|
-
for (itemId in this._data) {
|
366
|
-
if (this._data.hasOwnProperty(itemId)) {
|
367
|
-
item = me._getItem(itemId, type);
|
368
|
-
if (!filter || filter(item)) {
|
369
|
-
items.push(item);
|
370
|
-
}
|
371
|
-
}
|
372
|
-
}
|
373
|
-
}
|
374
|
-
|
375
|
-
// order the results
|
376
|
-
if (options && options.order && id == undefined) {
|
377
|
-
this._sort(items, options.order);
|
378
|
-
}
|
379
|
-
|
380
|
-
// filter fields of the items
|
381
|
-
if (options && options.fields) {
|
382
|
-
var fields = options.fields;
|
383
|
-
if (id != undefined) {
|
384
|
-
item = this._filterFields(item, fields);
|
385
|
-
}
|
386
|
-
else {
|
387
|
-
for (i = 0, len = items.length; i < len; i++) {
|
388
|
-
items[i] = this._filterFields(items[i], fields);
|
389
|
-
}
|
390
|
-
}
|
391
|
-
}
|
392
|
-
|
393
|
-
// return the results
|
394
|
-
if (returnType == 'DataTable') {
|
395
|
-
var columns = this._getColumnNames(data);
|
396
|
-
if (id != undefined) {
|
397
|
-
// append a single item to the data table
|
398
|
-
me._appendRow(data, columns, item);
|
399
|
-
}
|
400
|
-
else {
|
401
|
-
// copy the items to the provided data table
|
402
|
-
for (i = 0, len = items.length; i < len; i++) {
|
403
|
-
me._appendRow(data, columns, items[i]);
|
404
|
-
}
|
405
|
-
}
|
406
|
-
return data;
|
407
|
-
}
|
408
|
-
else {
|
409
|
-
// return an array
|
410
|
-
if (id != undefined) {
|
411
|
-
// a single item
|
412
|
-
return item;
|
413
|
-
}
|
414
|
-
else {
|
415
|
-
// multiple items
|
416
|
-
if (data) {
|
417
|
-
// copy the items to the provided array
|
418
|
-
for (i = 0, len = items.length; i < len; i++) {
|
419
|
-
data.push(items[i]);
|
420
|
-
}
|
421
|
-
return data;
|
422
|
-
}
|
423
|
-
else {
|
424
|
-
// just return our array
|
425
|
-
return items;
|
426
|
-
}
|
427
|
-
}
|
428
|
-
}
|
429
|
-
};
|
430
|
-
|
431
|
-
/**
|
432
|
-
* Get ids of all items or from a filtered set of items.
|
433
|
-
* @param {Object} [options] An Object with options. Available options:
|
434
|
-
* {function} [filter] filter items
|
435
|
-
* {String | function} [order] Order the items by
|
436
|
-
* a field name or custom sort function.
|
437
|
-
* @return {Array} ids
|
438
|
-
*/
|
439
|
-
DataSet.prototype.getIds = function (options) {
|
440
|
-
var data = this._data,
|
441
|
-
filter = options && options.filter,
|
442
|
-
order = options && options.order,
|
443
|
-
type = options && options.type || this._options.type,
|
444
|
-
i,
|
445
|
-
len,
|
446
|
-
id,
|
447
|
-
item,
|
448
|
-
items,
|
449
|
-
ids = [];
|
450
|
-
|
451
|
-
if (filter) {
|
452
|
-
// get filtered items
|
453
|
-
if (order) {
|
454
|
-
// create ordered list
|
455
|
-
items = [];
|
456
|
-
for (id in data) {
|
457
|
-
if (data.hasOwnProperty(id)) {
|
458
|
-
item = this._getItem(id, type);
|
459
|
-
if (filter(item)) {
|
460
|
-
items.push(item);
|
461
|
-
}
|
462
|
-
}
|
463
|
-
}
|
464
|
-
|
465
|
-
this._sort(items, order);
|
466
|
-
|
467
|
-
for (i = 0, len = items.length; i < len; i++) {
|
468
|
-
ids[i] = items[i][this._fieldId];
|
469
|
-
}
|
470
|
-
}
|
471
|
-
else {
|
472
|
-
// create unordered list
|
473
|
-
for (id in data) {
|
474
|
-
if (data.hasOwnProperty(id)) {
|
475
|
-
item = this._getItem(id, type);
|
476
|
-
if (filter(item)) {
|
477
|
-
ids.push(item[this._fieldId]);
|
478
|
-
}
|
479
|
-
}
|
480
|
-
}
|
481
|
-
}
|
482
|
-
}
|
483
|
-
else {
|
484
|
-
// get all items
|
485
|
-
if (order) {
|
486
|
-
// create an ordered list
|
487
|
-
items = [];
|
488
|
-
for (id in data) {
|
489
|
-
if (data.hasOwnProperty(id)) {
|
490
|
-
items.push(data[id]);
|
491
|
-
}
|
492
|
-
}
|
493
|
-
|
494
|
-
this._sort(items, order);
|
495
|
-
|
496
|
-
for (i = 0, len = items.length; i < len; i++) {
|
497
|
-
ids[i] = items[i][this._fieldId];
|
498
|
-
}
|
499
|
-
}
|
500
|
-
else {
|
501
|
-
// create unordered list
|
502
|
-
for (id in data) {
|
503
|
-
if (data.hasOwnProperty(id)) {
|
504
|
-
item = data[id];
|
505
|
-
ids.push(item[this._fieldId]);
|
506
|
-
}
|
507
|
-
}
|
508
|
-
}
|
509
|
-
}
|
510
|
-
|
511
|
-
return ids;
|
512
|
-
};
|
513
|
-
|
514
|
-
/**
|
515
|
-
* Execute a callback function for every item in the dataset.
|
516
|
-
* @param {function} callback
|
517
|
-
* @param {Object} [options] Available options:
|
518
|
-
* {Object.<String, String>} [type]
|
519
|
-
* {String[]} [fields] filter fields
|
520
|
-
* {function} [filter] filter items
|
521
|
-
* {String | function} [order] Order the items by
|
522
|
-
* a field name or custom sort function.
|
523
|
-
*/
|
524
|
-
DataSet.prototype.forEach = function (callback, options) {
|
525
|
-
var filter = options && options.filter,
|
526
|
-
type = options && options.type || this._options.type,
|
527
|
-
data = this._data,
|
528
|
-
item,
|
529
|
-
id;
|
530
|
-
|
531
|
-
if (options && options.order) {
|
532
|
-
// execute forEach on ordered list
|
533
|
-
var items = this.get(options);
|
534
|
-
|
535
|
-
for (var i = 0, len = items.length; i < len; i++) {
|
536
|
-
item = items[i];
|
537
|
-
id = item[this._fieldId];
|
538
|
-
callback(item, id);
|
539
|
-
}
|
540
|
-
}
|
541
|
-
else {
|
542
|
-
// unordered
|
543
|
-
for (id in data) {
|
544
|
-
if (data.hasOwnProperty(id)) {
|
545
|
-
item = this._getItem(id, type);
|
546
|
-
if (!filter || filter(item)) {
|
547
|
-
callback(item, id);
|
548
|
-
}
|
549
|
-
}
|
550
|
-
}
|
551
|
-
}
|
552
|
-
};
|
553
|
-
|
554
|
-
/**
|
555
|
-
* Map every item in the dataset.
|
556
|
-
* @param {function} callback
|
557
|
-
* @param {Object} [options] Available options:
|
558
|
-
* {Object.<String, String>} [type]
|
559
|
-
* {String[]} [fields] filter fields
|
560
|
-
* {function} [filter] filter items
|
561
|
-
* {String | function} [order] Order the items by
|
562
|
-
* a field name or custom sort function.
|
563
|
-
* @return {Object[]} mappedItems
|
564
|
-
*/
|
565
|
-
DataSet.prototype.map = function (callback, options) {
|
566
|
-
var filter = options && options.filter,
|
567
|
-
type = options && options.type || this._options.type,
|
568
|
-
mappedItems = [],
|
569
|
-
data = this._data,
|
570
|
-
item;
|
571
|
-
|
572
|
-
// convert and filter items
|
573
|
-
for (var id in data) {
|
574
|
-
if (data.hasOwnProperty(id)) {
|
575
|
-
item = this._getItem(id, type);
|
576
|
-
if (!filter || filter(item)) {
|
577
|
-
mappedItems.push(callback(item, id));
|
578
|
-
}
|
579
|
-
}
|
580
|
-
}
|
581
|
-
|
582
|
-
// order items
|
583
|
-
if (options && options.order) {
|
584
|
-
this._sort(mappedItems, options.order);
|
585
|
-
}
|
586
|
-
|
587
|
-
return mappedItems;
|
588
|
-
};
|
589
|
-
|
590
|
-
/**
|
591
|
-
* Filter the fields of an item
|
592
|
-
* @param {Object} item
|
593
|
-
* @param {String[]} fields Field names
|
594
|
-
* @return {Object} filteredItem
|
595
|
-
* @private
|
596
|
-
*/
|
597
|
-
DataSet.prototype._filterFields = function (item, fields) {
|
598
|
-
var filteredItem = {};
|
599
|
-
|
600
|
-
for (var field in item) {
|
601
|
-
if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) {
|
602
|
-
filteredItem[field] = item[field];
|
603
|
-
}
|
604
|
-
}
|
605
|
-
|
606
|
-
return filteredItem;
|
607
|
-
};
|
608
|
-
|
609
|
-
/**
|
610
|
-
* Sort the provided array with items
|
611
|
-
* @param {Object[]} items
|
612
|
-
* @param {String | function} order A field name or custom sort function.
|
613
|
-
* @private
|
614
|
-
*/
|
615
|
-
DataSet.prototype._sort = function (items, order) {
|
616
|
-
if (util.isString(order)) {
|
617
|
-
// order by provided field name
|
618
|
-
var name = order; // field name
|
619
|
-
items.sort(function (a, b) {
|
620
|
-
var av = a[name];
|
621
|
-
var bv = b[name];
|
622
|
-
return (av > bv) ? 1 : ((av < bv) ? -1 : 0);
|
623
|
-
});
|
624
|
-
}
|
625
|
-
else if (typeof order === 'function') {
|
626
|
-
// order by sort function
|
627
|
-
items.sort(order);
|
628
|
-
}
|
629
|
-
// TODO: extend order by an Object {field:String, direction:String}
|
630
|
-
// where direction can be 'asc' or 'desc'
|
631
|
-
else {
|
632
|
-
throw new TypeError('Order must be a function or a string');
|
633
|
-
}
|
634
|
-
};
|
635
|
-
|
636
|
-
/**
|
637
|
-
* Remove an object by pointer or by id
|
638
|
-
* @param {String | Number | Object | Array} id Object or id, or an array with
|
639
|
-
* objects or ids to be removed
|
640
|
-
* @param {String} [senderId] Optional sender id
|
641
|
-
* @return {Array} removedIds
|
642
|
-
*/
|
643
|
-
DataSet.prototype.remove = function (id, senderId) {
|
644
|
-
var removedIds = [],
|
645
|
-
i, len, removedId;
|
646
|
-
|
647
|
-
if (Array.isArray(id)) {
|
648
|
-
for (i = 0, len = id.length; i < len; i++) {
|
649
|
-
removedId = this._remove(id[i]);
|
650
|
-
if (removedId != null) {
|
651
|
-
removedIds.push(removedId);
|
652
|
-
}
|
653
|
-
}
|
654
|
-
}
|
655
|
-
else {
|
656
|
-
removedId = this._remove(id);
|
657
|
-
if (removedId != null) {
|
658
|
-
removedIds.push(removedId);
|
659
|
-
}
|
660
|
-
}
|
661
|
-
|
662
|
-
if (removedIds.length) {
|
663
|
-
this._trigger('remove', {items: removedIds}, senderId);
|
664
|
-
}
|
665
|
-
|
666
|
-
return removedIds;
|
667
|
-
};
|
668
|
-
|
669
|
-
/**
|
670
|
-
* Remove an item by its id
|
671
|
-
* @param {Number | String | Object} id id or item
|
672
|
-
* @returns {Number | String | null} id
|
673
|
-
* @private
|
674
|
-
*/
|
675
|
-
DataSet.prototype._remove = function (id) {
|
676
|
-
if (util.isNumber(id) || util.isString(id)) {
|
677
|
-
if (this._data[id]) {
|
678
|
-
delete this._data[id];
|
679
|
-
return id;
|
680
|
-
}
|
681
|
-
}
|
682
|
-
else if (id instanceof Object) {
|
683
|
-
var itemId = id[this._fieldId];
|
684
|
-
if (itemId && this._data[itemId]) {
|
685
|
-
delete this._data[itemId];
|
686
|
-
return itemId;
|
687
|
-
}
|
688
|
-
}
|
689
|
-
return null;
|
690
|
-
};
|
691
|
-
|
692
|
-
/**
|
693
|
-
* Clear the data
|
694
|
-
* @param {String} [senderId] Optional sender id
|
695
|
-
* @return {Array} removedIds The ids of all removed items
|
696
|
-
*/
|
697
|
-
DataSet.prototype.clear = function (senderId) {
|
698
|
-
var ids = Object.keys(this._data);
|
699
|
-
|
700
|
-
this._data = {};
|
701
|
-
|
702
|
-
this._trigger('remove', {items: ids}, senderId);
|
703
|
-
|
704
|
-
return ids;
|
705
|
-
};
|
706
|
-
|
707
|
-
/**
|
708
|
-
* Find the item with maximum value of a specified field
|
709
|
-
* @param {String} field
|
710
|
-
* @return {Object | null} item Item containing max value, or null if no items
|
711
|
-
*/
|
712
|
-
DataSet.prototype.max = function (field) {
|
713
|
-
var data = this._data,
|
714
|
-
max = null,
|
715
|
-
maxField = null;
|
716
|
-
|
717
|
-
for (var id in data) {
|
718
|
-
if (data.hasOwnProperty(id)) {
|
719
|
-
var item = data[id];
|
720
|
-
var itemField = item[field];
|
721
|
-
if (itemField != null && (!max || itemField > maxField)) {
|
722
|
-
max = item;
|
723
|
-
maxField = itemField;
|
724
|
-
}
|
725
|
-
}
|
726
|
-
}
|
727
|
-
|
728
|
-
return max;
|
729
|
-
};
|
730
|
-
|
731
|
-
/**
|
732
|
-
* Find the item with minimum value of a specified field
|
733
|
-
* @param {String} field
|
734
|
-
* @return {Object | null} item Item containing max value, or null if no items
|
735
|
-
*/
|
736
|
-
DataSet.prototype.min = function (field) {
|
737
|
-
var data = this._data,
|
738
|
-
min = null,
|
739
|
-
minField = null;
|
740
|
-
|
741
|
-
for (var id in data) {
|
742
|
-
if (data.hasOwnProperty(id)) {
|
743
|
-
var item = data[id];
|
744
|
-
var itemField = item[field];
|
745
|
-
if (itemField != null && (!min || itemField < minField)) {
|
746
|
-
min = item;
|
747
|
-
minField = itemField;
|
748
|
-
}
|
749
|
-
}
|
750
|
-
}
|
751
|
-
|
752
|
-
return min;
|
753
|
-
};
|
754
|
-
|
755
|
-
/**
|
756
|
-
* Find all distinct values of a specified field
|
757
|
-
* @param {String} field
|
758
|
-
* @return {Array} values Array containing all distinct values. If data items
|
759
|
-
* do not contain the specified field are ignored.
|
760
|
-
* The returned array is unordered.
|
761
|
-
*/
|
762
|
-
DataSet.prototype.distinct = function (field) {
|
763
|
-
var data = this._data;
|
764
|
-
var values = [];
|
765
|
-
var fieldType = this._options.type && this._options.type[field] || null;
|
766
|
-
var count = 0;
|
767
|
-
var i;
|
768
|
-
|
769
|
-
for (var prop in data) {
|
770
|
-
if (data.hasOwnProperty(prop)) {
|
771
|
-
var item = data[prop];
|
772
|
-
var value = item[field];
|
773
|
-
var exists = false;
|
774
|
-
for (i = 0; i < count; i++) {
|
775
|
-
if (values[i] == value) {
|
776
|
-
exists = true;
|
777
|
-
break;
|
778
|
-
}
|
779
|
-
}
|
780
|
-
if (!exists && (value !== undefined)) {
|
781
|
-
values[count] = value;
|
782
|
-
count++;
|
783
|
-
}
|
784
|
-
}
|
785
|
-
}
|
786
|
-
|
787
|
-
if (fieldType) {
|
788
|
-
for (i = 0; i < values.length; i++) {
|
789
|
-
values[i] = util.convert(values[i], fieldType);
|
790
|
-
}
|
791
|
-
}
|
792
|
-
|
793
|
-
return values;
|
794
|
-
};
|
795
|
-
|
796
|
-
/**
|
797
|
-
* Add a single item. Will fail when an item with the same id already exists.
|
798
|
-
* @param {Object} item
|
799
|
-
* @return {String} id
|
800
|
-
* @private
|
801
|
-
*/
|
802
|
-
DataSet.prototype._addItem = function (item) {
|
803
|
-
var id = item[this._fieldId];
|
804
|
-
|
805
|
-
if (id != undefined) {
|
806
|
-
// check whether this id is already taken
|
807
|
-
if (this._data[id]) {
|
808
|
-
// item already exists
|
809
|
-
throw new Error('Cannot add item: item with id ' + id + ' already exists');
|
810
|
-
}
|
811
|
-
}
|
812
|
-
else {
|
813
|
-
// generate an id
|
814
|
-
id = util.randomUUID();
|
815
|
-
item[this._fieldId] = id;
|
816
|
-
}
|
817
|
-
|
818
|
-
var d = {};
|
819
|
-
for (var field in item) {
|
820
|
-
if (item.hasOwnProperty(field)) {
|
821
|
-
var fieldType = this._type[field]; // type may be undefined
|
822
|
-
d[field] = util.convert(item[field], fieldType);
|
823
|
-
}
|
824
|
-
}
|
825
|
-
this._data[id] = d;
|
826
|
-
|
827
|
-
return id;
|
828
|
-
};
|
829
|
-
|
830
|
-
/**
|
831
|
-
* Get an item. Fields can be converted to a specific type
|
832
|
-
* @param {String} id
|
833
|
-
* @param {Object.<String, String>} [types] field types to convert
|
834
|
-
* @return {Object | null} item
|
835
|
-
* @private
|
836
|
-
*/
|
837
|
-
DataSet.prototype._getItem = function (id, types) {
|
838
|
-
var field, value;
|
839
|
-
|
840
|
-
// get the item from the dataset
|
841
|
-
var raw = this._data[id];
|
842
|
-
if (!raw) {
|
843
|
-
return null;
|
844
|
-
}
|
845
|
-
|
846
|
-
// convert the items field types
|
847
|
-
var converted = {};
|
848
|
-
if (types) {
|
849
|
-
for (field in raw) {
|
850
|
-
if (raw.hasOwnProperty(field)) {
|
851
|
-
value = raw[field];
|
852
|
-
converted[field] = util.convert(value, types[field]);
|
853
|
-
}
|
854
|
-
}
|
855
|
-
}
|
856
|
-
else {
|
857
|
-
// no field types specified, no converting needed
|
858
|
-
for (field in raw) {
|
859
|
-
if (raw.hasOwnProperty(field)) {
|
860
|
-
value = raw[field];
|
861
|
-
converted[field] = value;
|
862
|
-
}
|
863
|
-
}
|
864
|
-
}
|
865
|
-
return converted;
|
866
|
-
};
|
867
|
-
|
868
|
-
/**
|
869
|
-
* Update a single item: merge with existing item.
|
870
|
-
* Will fail when the item has no id, or when there does not exist an item
|
871
|
-
* with the same id.
|
872
|
-
* @param {Object} item
|
873
|
-
* @return {String} id
|
874
|
-
* @private
|
875
|
-
*/
|
876
|
-
DataSet.prototype._updateItem = function (item) {
|
877
|
-
var id = item[this._fieldId];
|
878
|
-
if (id == undefined) {
|
879
|
-
throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')');
|
880
|
-
}
|
881
|
-
var d = this._data[id];
|
882
|
-
if (!d) {
|
883
|
-
// item doesn't exist
|
884
|
-
throw new Error('Cannot update item: no item with id ' + id + ' found');
|
885
|
-
}
|
886
|
-
|
887
|
-
// merge with current item
|
888
|
-
for (var field in item) {
|
889
|
-
if (item.hasOwnProperty(field)) {
|
890
|
-
var fieldType = this._type[field]; // type may be undefined
|
891
|
-
d[field] = util.convert(item[field], fieldType);
|
892
|
-
}
|
893
|
-
}
|
894
|
-
|
895
|
-
return id;
|
896
|
-
};
|
897
|
-
|
898
|
-
/**
|
899
|
-
* Get an array with the column names of a Google DataTable
|
900
|
-
* @param {DataTable} dataTable
|
901
|
-
* @return {String[]} columnNames
|
902
|
-
* @private
|
903
|
-
*/
|
904
|
-
DataSet.prototype._getColumnNames = function (dataTable) {
|
905
|
-
var columns = [];
|
906
|
-
for (var col = 0, cols = dataTable.getNumberOfColumns(); col < cols; col++) {
|
907
|
-
columns[col] = dataTable.getColumnId(col) || dataTable.getColumnLabel(col);
|
908
|
-
}
|
909
|
-
return columns;
|
910
|
-
};
|
911
|
-
|
912
|
-
/**
|
913
|
-
* Append an item as a row to the dataTable
|
914
|
-
* @param dataTable
|
915
|
-
* @param columns
|
916
|
-
* @param item
|
917
|
-
* @private
|
918
|
-
*/
|
919
|
-
DataSet.prototype._appendRow = function (dataTable, columns, item) {
|
920
|
-
var row = dataTable.addRow();
|
921
|
-
|
922
|
-
for (var col = 0, cols = columns.length; col < cols; col++) {
|
923
|
-
var field = columns[col];
|
924
|
-
dataTable.setValue(row, col, item[field]);
|
925
|
-
}
|
926
|
-
};
|