vis-rails 1.0.2 → 2.0.0
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/CHANGELOG.md +1 -1
- data/README.md +2 -0
- data/lib/vis/rails/version.rb +1 -1
- data/vendor/assets/javascripts/module/exports-only-timeline.js +55 -0
- data/vendor/assets/javascripts/vis-only-timeline.js +23 -0
- data/vendor/assets/javascripts/vis.js +3 -3
- data/vendor/assets/stylesheets/vis-only-timeline.css +3 -0
- data/vendor/assets/vis/DataSet.js +106 -130
- data/vendor/assets/vis/DataView.js +35 -37
- data/vendor/assets/vis/graph/Edge.js +225 -45
- data/vendor/assets/vis/graph/Graph.js +120 -24
- data/vendor/assets/vis/graph/Node.js +16 -16
- data/vendor/assets/vis/graph/graphMixins/HierarchicalLayoutMixin.js +1 -1
- data/vendor/assets/vis/graph/graphMixins/ManipulationMixin.js +143 -0
- data/vendor/assets/vis/graph/graphMixins/SelectionMixin.js +81 -3
- data/vendor/assets/vis/graph3d/Graph3d.js +3306 -0
- data/vendor/assets/vis/module/exports.js +2 -3
- data/vendor/assets/vis/timeline/Range.js +93 -80
- data/vendor/assets/vis/timeline/Timeline.js +525 -428
- data/vendor/assets/vis/timeline/component/Component.js +19 -53
- data/vendor/assets/vis/timeline/component/CurrentTime.js +57 -25
- data/vendor/assets/vis/timeline/component/CustomTime.js +55 -19
- data/vendor/assets/vis/timeline/component/Group.js +47 -50
- data/vendor/assets/vis/timeline/component/ItemSet.js +402 -206
- data/vendor/assets/vis/timeline/component/TimeAxis.js +112 -169
- data/vendor/assets/vis/timeline/component/css/animation.css +33 -0
- data/vendor/assets/vis/timeline/component/css/currenttime.css +1 -1
- data/vendor/assets/vis/timeline/component/css/customtime.css +1 -1
- data/vendor/assets/vis/timeline/component/css/item.css +1 -11
- data/vendor/assets/vis/timeline/component/css/itemset.css +13 -18
- data/vendor/assets/vis/timeline/component/css/labelset.css +8 -6
- data/vendor/assets/vis/timeline/component/css/panel.css +56 -13
- data/vendor/assets/vis/timeline/component/css/timeaxis.css +15 -8
- data/vendor/assets/vis/timeline/component/item/Item.js +16 -15
- data/vendor/assets/vis/timeline/component/item/ItemBox.js +30 -30
- data/vendor/assets/vis/timeline/component/item/ItemPoint.js +20 -21
- data/vendor/assets/vis/timeline/component/item/ItemRange.js +23 -24
- data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +10 -10
- data/vendor/assets/vis/timeline/stack.js +5 -5
- data/vendor/assets/vis/util.js +81 -35
- metadata +7 -4
- data/vendor/assets/vis/timeline/component/Panel.js +0 -170
- data/vendor/assets/vis/timeline/component/RootPanel.js +0 -176
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1002e56b0744e4169ce63ab556d257a94cac683c
|
4
|
+
data.tar.gz: e3012aa0301eef513c00f21af009a1c2ff257108
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff7655bf5bc3ba371b9ee010a5de16f3de2181c4bdc658b552ab91e18108ab6c9868329a41ec50abdfb6d4a52816498c9257c23ddd3785a5a0e0e4801a3a3d1f
|
7
|
+
data.tar.gz: a70b60516ac5cd314bb23cc4ced33125bd0663d0471d849d347e24e995679f6f5d842c7bb8a866c2930b565f1a2e43fae1042546bf245dffc70ce4f8ff3adc23
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
data/lib/vis/rails/version.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
/**
|
2
|
+
* vis.js module exports
|
3
|
+
*/
|
4
|
+
var vis = {
|
5
|
+
util: util,
|
6
|
+
moment: moment,
|
7
|
+
|
8
|
+
DataSet: DataSet,
|
9
|
+
DataView: DataView,
|
10
|
+
Range: Range,
|
11
|
+
stack: stack,
|
12
|
+
TimeStep: TimeStep,
|
13
|
+
|
14
|
+
components: {
|
15
|
+
items: {
|
16
|
+
Item: Item,
|
17
|
+
ItemBox: ItemBox,
|
18
|
+
ItemPoint: ItemPoint,
|
19
|
+
ItemRange: ItemRange
|
20
|
+
},
|
21
|
+
|
22
|
+
Component: Component,
|
23
|
+
ItemSet: ItemSet,
|
24
|
+
TimeAxis: TimeAxis
|
25
|
+
},
|
26
|
+
|
27
|
+
Timeline: Timeline
|
28
|
+
};
|
29
|
+
|
30
|
+
/**
|
31
|
+
* CommonJS module exports
|
32
|
+
*/
|
33
|
+
if (typeof exports !== 'undefined') {
|
34
|
+
exports = vis;
|
35
|
+
}
|
36
|
+
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
|
37
|
+
module.exports = vis;
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* AMD module exports
|
42
|
+
*/
|
43
|
+
if (typeof(define) === 'function') {
|
44
|
+
define(function () {
|
45
|
+
return vis;
|
46
|
+
});
|
47
|
+
}
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Window exports
|
51
|
+
*/
|
52
|
+
if (typeof window !== 'undefined') {
|
53
|
+
// attach the module to the window, load as a regular javascript file
|
54
|
+
window['vis'] = vis;
|
55
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
//= require ../vis/module/header
|
2
|
+
//= require moment
|
3
|
+
//= require hammer
|
4
|
+
//= require ../component/emitter
|
5
|
+
|
6
|
+
//= require ../vis/shim
|
7
|
+
//= require ../vis/util
|
8
|
+
//= require ../vis/DataSet
|
9
|
+
//= require ../vis/DataView
|
10
|
+
|
11
|
+
//= require ../vis/timeline/stack
|
12
|
+
//= require ../vis/timeline/TimeStep
|
13
|
+
//= require ../vis/timeline/component/Component
|
14
|
+
//= require ../vis/timeline/Range
|
15
|
+
//= require ../vis/timeline/component/TimeAxis
|
16
|
+
//= require ../vis/timeline/component/CurrentTime
|
17
|
+
//= require ../vis/timeline/component/CustomTime
|
18
|
+
//= require_tree ../vis/timeline/component/item
|
19
|
+
//= require ../vis/timeline/component/ItemSet
|
20
|
+
//= require ../vis/timeline/component/Group
|
21
|
+
//= require ../vis/timeline/Timeline
|
22
|
+
|
23
|
+
//= require ./module/exports-only-timeline
|
@@ -10,10 +10,8 @@
|
|
10
10
|
|
11
11
|
//= require ../vis/timeline/stack
|
12
12
|
//= require ../vis/timeline/TimeStep
|
13
|
-
//= require ../vis/timeline/Range
|
14
13
|
//= require ../vis/timeline/component/Component
|
15
|
-
//= require ../vis/timeline/
|
16
|
-
//= require ../vis/timeline/component/RootPanel
|
14
|
+
//= require ../vis/timeline/Range
|
17
15
|
//= require ../vis/timeline/component/TimeAxis
|
18
16
|
//= require ../vis/timeline/component/CurrentTime
|
19
17
|
//= require ../vis/timeline/component/CustomTime
|
@@ -32,4 +30,6 @@
|
|
32
30
|
//= require_tree ../vis/graph/graphMixins
|
33
31
|
//= require ../vis/graph/Graph
|
34
32
|
|
33
|
+
//= require ../vis/graph3d/Graph3d
|
34
|
+
|
35
35
|
//= require ../vis/module/exports
|
@@ -4,7 +4,7 @@
|
|
4
4
|
* Usage:
|
5
5
|
* var dataSet = new DataSet({
|
6
6
|
* fieldId: '_id',
|
7
|
-
*
|
7
|
+
* type: {
|
8
8
|
* // ...
|
9
9
|
* }
|
10
10
|
* });
|
@@ -30,43 +30,46 @@
|
|
30
30
|
* @param {Object} [options] Available options:
|
31
31
|
* {String} fieldId Field name of the id in the
|
32
32
|
* items, 'id' by default.
|
33
|
-
* {Object.<String, String}
|
33
|
+
* {Object.<String, String} type
|
34
34
|
* A map with field names as key,
|
35
35
|
* and the field type as value.
|
36
36
|
* @constructor DataSet
|
37
37
|
*/
|
38
38
|
// TODO: add a DataSet constructor DataSet(data, options)
|
39
39
|
function DataSet (data, options) {
|
40
|
-
this.id = util.randomUUID();
|
41
|
-
|
42
40
|
// correctly read optional arguments
|
43
41
|
if (data && !Array.isArray(data) && !util.isDataTable(data)) {
|
44
42
|
options = data;
|
45
43
|
data = null;
|
46
44
|
}
|
47
45
|
|
48
|
-
this.
|
49
|
-
this.
|
50
|
-
this.
|
51
|
-
this.
|
52
|
-
this.showInternalIds = this.options.showInternalIds || false; // show internal ids with the get function
|
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)
|
53
50
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
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];
|
58
57
|
if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') {
|
59
|
-
this.
|
58
|
+
this._type[field] = 'Date';
|
60
59
|
}
|
61
60
|
else {
|
62
|
-
this.
|
61
|
+
this._type[field] = value;
|
63
62
|
}
|
64
63
|
}
|
65
64
|
}
|
66
65
|
}
|
67
66
|
|
68
|
-
|
69
|
-
this.
|
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
|
70
73
|
|
71
74
|
// add initial data when provided
|
72
75
|
if (data) {
|
@@ -83,11 +86,11 @@ function DataSet (data, options) {
|
|
83
86
|
* {Object | null} params
|
84
87
|
* {String | Number} senderId
|
85
88
|
*/
|
86
|
-
DataSet.prototype.on = function
|
87
|
-
var subscribers = this.
|
89
|
+
DataSet.prototype.on = function(event, callback) {
|
90
|
+
var subscribers = this._subscribers[event];
|
88
91
|
if (!subscribers) {
|
89
92
|
subscribers = [];
|
90
|
-
this.
|
93
|
+
this._subscribers[event] = subscribers;
|
91
94
|
}
|
92
95
|
|
93
96
|
subscribers.push({
|
@@ -103,10 +106,10 @@ DataSet.prototype.subscribe = DataSet.prototype.on;
|
|
103
106
|
* @param {String} event
|
104
107
|
* @param {function} callback
|
105
108
|
*/
|
106
|
-
DataSet.prototype.off = function
|
107
|
-
var subscribers = this.
|
109
|
+
DataSet.prototype.off = function(event, callback) {
|
110
|
+
var subscribers = this._subscribers[event];
|
108
111
|
if (subscribers) {
|
109
|
-
this.
|
112
|
+
this._subscribers[event] = subscribers.filter(function (listener) {
|
110
113
|
return (listener.callback != callback);
|
111
114
|
});
|
112
115
|
}
|
@@ -128,11 +131,11 @@ DataSet.prototype._trigger = function (event, params, senderId) {
|
|
128
131
|
}
|
129
132
|
|
130
133
|
var subscribers = [];
|
131
|
-
if (event in this.
|
132
|
-
subscribers = subscribers.concat(this.
|
134
|
+
if (event in this._subscribers) {
|
135
|
+
subscribers = subscribers.concat(this._subscribers[event]);
|
133
136
|
}
|
134
|
-
if ('*' in this.
|
135
|
-
subscribers = subscribers.concat(this.
|
137
|
+
if ('*' in this._subscribers) {
|
138
|
+
subscribers = subscribers.concat(this._subscribers['*']);
|
136
139
|
}
|
137
140
|
|
138
141
|
for (var i = 0; i < subscribers.length; i++) {
|
@@ -155,7 +158,7 @@ DataSet.prototype.add = function (data, senderId) {
|
|
155
158
|
id,
|
156
159
|
me = this;
|
157
160
|
|
158
|
-
if (data
|
161
|
+
if (Array.isArray(data)) {
|
159
162
|
// Array
|
160
163
|
for (var i = 0, len = data.length; i < len; i++) {
|
161
164
|
id = me._addItem(data[i]);
|
@@ -202,11 +205,11 @@ DataSet.prototype.update = function (data, senderId) {
|
|
202
205
|
var addedIds = [],
|
203
206
|
updatedIds = [],
|
204
207
|
me = this,
|
205
|
-
fieldId = me.
|
208
|
+
fieldId = me._fieldId;
|
206
209
|
|
207
210
|
var addOrUpdate = function (item) {
|
208
211
|
var id = item[fieldId];
|
209
|
-
if (me.
|
212
|
+
if (me._data[id]) {
|
210
213
|
// update item
|
211
214
|
id = me._updateItem(item);
|
212
215
|
updatedIds.push(id);
|
@@ -218,7 +221,7 @@ DataSet.prototype.update = function (data, senderId) {
|
|
218
221
|
}
|
219
222
|
};
|
220
223
|
|
221
|
-
if (data
|
224
|
+
if (Array.isArray(data)) {
|
222
225
|
// Array
|
223
226
|
for (var i = 0, len = data.length; i < len; i++) {
|
224
227
|
addOrUpdate(data[i]);
|
@@ -277,9 +280,9 @@ DataSet.prototype.update = function (data, senderId) {
|
|
277
280
|
* {Number | String} id The id of an item
|
278
281
|
* {Number[] | String{}} ids An array with ids of items
|
279
282
|
* {Object} options An Object with options. Available options:
|
280
|
-
* {String} [
|
281
|
-
*
|
282
|
-
* {Object.<String, String>} [
|
283
|
+
* {String} [returnType] Type of data to be
|
284
|
+
* returned. Can be 'DataTable' or 'Array' (default)
|
285
|
+
* {Object.<String, String>} [type]
|
283
286
|
* {String[]} [fields] field names to be returned
|
284
287
|
* {function} [filter] filter items
|
285
288
|
* {String | function} [order] Order the items by
|
@@ -292,7 +295,6 @@ DataSet.prototype.update = function (data, senderId) {
|
|
292
295
|
*/
|
293
296
|
DataSet.prototype.get = function (args) {
|
294
297
|
var me = this;
|
295
|
-
var globalShowInternalIds = this.showInternalIds;
|
296
298
|
|
297
299
|
// parse the arguments
|
298
300
|
var id, ids, options, data;
|
@@ -316,42 +318,35 @@ DataSet.prototype.get = function (args) {
|
|
316
318
|
}
|
317
319
|
|
318
320
|
// determine the return type
|
319
|
-
var
|
320
|
-
if (options && options.
|
321
|
-
|
321
|
+
var returnType;
|
322
|
+
if (options && options.returnType) {
|
323
|
+
returnType = (options.returnType == 'DataTable') ? 'DataTable' : 'Array';
|
322
324
|
|
323
|
-
if (data && (
|
325
|
+
if (data && (returnType != util.getType(data))) {
|
324
326
|
throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' +
|
325
327
|
'does not correspond with specified options.type (' + options.type + ')');
|
326
328
|
}
|
327
|
-
if (
|
329
|
+
if (returnType == 'DataTable' && !util.isDataTable(data)) {
|
328
330
|
throw new Error('Parameter "data" must be a DataTable ' +
|
329
331
|
'when options.type is "DataTable"');
|
330
332
|
}
|
331
333
|
}
|
332
334
|
else if (data) {
|
333
|
-
|
335
|
+
returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array';
|
334
336
|
}
|
335
337
|
else {
|
336
|
-
|
337
|
-
}
|
338
|
-
|
339
|
-
// we allow the setting of this value for a single get request.
|
340
|
-
if (options != undefined) {
|
341
|
-
if (options.showInternalIds != undefined) {
|
342
|
-
this.showInternalIds = options.showInternalIds;
|
343
|
-
}
|
338
|
+
returnType = 'Array';
|
344
339
|
}
|
345
340
|
|
346
341
|
// build options
|
347
|
-
var
|
342
|
+
var type = options && options.type || this._options.type;
|
348
343
|
var filter = options && options.filter;
|
349
344
|
var items = [], item, itemId, i, len;
|
350
345
|
|
351
346
|
// convert items
|
352
347
|
if (id != undefined) {
|
353
348
|
// return a single item
|
354
|
-
item = me._getItem(id,
|
349
|
+
item = me._getItem(id, type);
|
355
350
|
if (filter && !filter(item)) {
|
356
351
|
item = null;
|
357
352
|
}
|
@@ -359,7 +354,7 @@ DataSet.prototype.get = function (args) {
|
|
359
354
|
else if (ids != undefined) {
|
360
355
|
// return a subset of items
|
361
356
|
for (i = 0, len = ids.length; i < len; i++) {
|
362
|
-
item = me._getItem(ids[i],
|
357
|
+
item = me._getItem(ids[i], type);
|
363
358
|
if (!filter || filter(item)) {
|
364
359
|
items.push(item);
|
365
360
|
}
|
@@ -367,9 +362,9 @@ DataSet.prototype.get = function (args) {
|
|
367
362
|
}
|
368
363
|
else {
|
369
364
|
// return all items
|
370
|
-
for (itemId in this.
|
371
|
-
if (this.
|
372
|
-
item = me._getItem(itemId,
|
365
|
+
for (itemId in this._data) {
|
366
|
+
if (this._data.hasOwnProperty(itemId)) {
|
367
|
+
item = me._getItem(itemId, type);
|
373
368
|
if (!filter || filter(item)) {
|
374
369
|
items.push(item);
|
375
370
|
}
|
@@ -377,9 +372,6 @@ DataSet.prototype.get = function (args) {
|
|
377
372
|
}
|
378
373
|
}
|
379
374
|
|
380
|
-
// restore the global value of showInternalIds
|
381
|
-
this.showInternalIds = globalShowInternalIds;
|
382
|
-
|
383
375
|
// order the results
|
384
376
|
if (options && options.order && id == undefined) {
|
385
377
|
this._sort(items, options.order);
|
@@ -399,7 +391,7 @@ DataSet.prototype.get = function (args) {
|
|
399
391
|
}
|
400
392
|
|
401
393
|
// return the results
|
402
|
-
if (
|
394
|
+
if (returnType == 'DataTable') {
|
403
395
|
var columns = this._getColumnNames(data);
|
404
396
|
if (id != undefined) {
|
405
397
|
// append a single item to the data table
|
@@ -445,10 +437,10 @@ DataSet.prototype.get = function (args) {
|
|
445
437
|
* @return {Array} ids
|
446
438
|
*/
|
447
439
|
DataSet.prototype.getIds = function (options) {
|
448
|
-
var data = this.
|
440
|
+
var data = this._data,
|
449
441
|
filter = options && options.filter,
|
450
442
|
order = options && options.order,
|
451
|
-
|
443
|
+
type = options && options.type || this._options.type,
|
452
444
|
i,
|
453
445
|
len,
|
454
446
|
id,
|
@@ -463,7 +455,7 @@ DataSet.prototype.getIds = function (options) {
|
|
463
455
|
items = [];
|
464
456
|
for (id in data) {
|
465
457
|
if (data.hasOwnProperty(id)) {
|
466
|
-
item = this._getItem(id,
|
458
|
+
item = this._getItem(id, type);
|
467
459
|
if (filter(item)) {
|
468
460
|
items.push(item);
|
469
461
|
}
|
@@ -473,16 +465,16 @@ DataSet.prototype.getIds = function (options) {
|
|
473
465
|
this._sort(items, order);
|
474
466
|
|
475
467
|
for (i = 0, len = items.length; i < len; i++) {
|
476
|
-
ids[i] = items[i][this.
|
468
|
+
ids[i] = items[i][this._fieldId];
|
477
469
|
}
|
478
470
|
}
|
479
471
|
else {
|
480
472
|
// create unordered list
|
481
473
|
for (id in data) {
|
482
474
|
if (data.hasOwnProperty(id)) {
|
483
|
-
item = this._getItem(id,
|
475
|
+
item = this._getItem(id, type);
|
484
476
|
if (filter(item)) {
|
485
|
-
ids.push(item[this.
|
477
|
+
ids.push(item[this._fieldId]);
|
486
478
|
}
|
487
479
|
}
|
488
480
|
}
|
@@ -502,7 +494,7 @@ DataSet.prototype.getIds = function (options) {
|
|
502
494
|
this._sort(items, order);
|
503
495
|
|
504
496
|
for (i = 0, len = items.length; i < len; i++) {
|
505
|
-
ids[i] = items[i][this.
|
497
|
+
ids[i] = items[i][this._fieldId];
|
506
498
|
}
|
507
499
|
}
|
508
500
|
else {
|
@@ -510,7 +502,7 @@ DataSet.prototype.getIds = function (options) {
|
|
510
502
|
for (id in data) {
|
511
503
|
if (data.hasOwnProperty(id)) {
|
512
504
|
item = data[id];
|
513
|
-
ids.push(item[this.
|
505
|
+
ids.push(item[this._fieldId]);
|
514
506
|
}
|
515
507
|
}
|
516
508
|
}
|
@@ -523,7 +515,7 @@ DataSet.prototype.getIds = function (options) {
|
|
523
515
|
* Execute a callback function for every item in the dataset.
|
524
516
|
* @param {function} callback
|
525
517
|
* @param {Object} [options] Available options:
|
526
|
-
* {Object.<String, String>} [
|
518
|
+
* {Object.<String, String>} [type]
|
527
519
|
* {String[]} [fields] filter fields
|
528
520
|
* {function} [filter] filter items
|
529
521
|
* {String | function} [order] Order the items by
|
@@ -531,8 +523,8 @@ DataSet.prototype.getIds = function (options) {
|
|
531
523
|
*/
|
532
524
|
DataSet.prototype.forEach = function (callback, options) {
|
533
525
|
var filter = options && options.filter,
|
534
|
-
|
535
|
-
data = this.
|
526
|
+
type = options && options.type || this._options.type,
|
527
|
+
data = this._data,
|
536
528
|
item,
|
537
529
|
id;
|
538
530
|
|
@@ -542,7 +534,7 @@ DataSet.prototype.forEach = function (callback, options) {
|
|
542
534
|
|
543
535
|
for (var i = 0, len = items.length; i < len; i++) {
|
544
536
|
item = items[i];
|
545
|
-
id = item[this.
|
537
|
+
id = item[this._fieldId];
|
546
538
|
callback(item, id);
|
547
539
|
}
|
548
540
|
}
|
@@ -550,7 +542,7 @@ DataSet.prototype.forEach = function (callback, options) {
|
|
550
542
|
// unordered
|
551
543
|
for (id in data) {
|
552
544
|
if (data.hasOwnProperty(id)) {
|
553
|
-
item = this._getItem(id,
|
545
|
+
item = this._getItem(id, type);
|
554
546
|
if (!filter || filter(item)) {
|
555
547
|
callback(item, id);
|
556
548
|
}
|
@@ -563,7 +555,7 @@ DataSet.prototype.forEach = function (callback, options) {
|
|
563
555
|
* Map every item in the dataset.
|
564
556
|
* @param {function} callback
|
565
557
|
* @param {Object} [options] Available options:
|
566
|
-
* {Object.<String, String>} [
|
558
|
+
* {Object.<String, String>} [type]
|
567
559
|
* {String[]} [fields] filter fields
|
568
560
|
* {function} [filter] filter items
|
569
561
|
* {String | function} [order] Order the items by
|
@@ -572,15 +564,15 @@ DataSet.prototype.forEach = function (callback, options) {
|
|
572
564
|
*/
|
573
565
|
DataSet.prototype.map = function (callback, options) {
|
574
566
|
var filter = options && options.filter,
|
575
|
-
|
567
|
+
type = options && options.type || this._options.type,
|
576
568
|
mappedItems = [],
|
577
|
-
data = this.
|
569
|
+
data = this._data,
|
578
570
|
item;
|
579
571
|
|
580
572
|
// convert and filter items
|
581
573
|
for (var id in data) {
|
582
574
|
if (data.hasOwnProperty(id)) {
|
583
|
-
item = this._getItem(id,
|
575
|
+
item = this._getItem(id, type);
|
584
576
|
if (!filter || filter(item)) {
|
585
577
|
mappedItems.push(callback(item, id));
|
586
578
|
}
|
@@ -652,7 +644,7 @@ DataSet.prototype.remove = function (id, senderId) {
|
|
652
644
|
var removedIds = [],
|
653
645
|
i, len, removedId;
|
654
646
|
|
655
|
-
if (id
|
647
|
+
if (Array.isArray(id)) {
|
656
648
|
for (i = 0, len = id.length; i < len; i++) {
|
657
649
|
removedId = this._remove(id[i]);
|
658
650
|
if (removedId != null) {
|
@@ -682,17 +674,15 @@ DataSet.prototype.remove = function (id, senderId) {
|
|
682
674
|
*/
|
683
675
|
DataSet.prototype._remove = function (id) {
|
684
676
|
if (util.isNumber(id) || util.isString(id)) {
|
685
|
-
if (this.
|
686
|
-
delete this.
|
687
|
-
delete this.internalIds[id];
|
677
|
+
if (this._data[id]) {
|
678
|
+
delete this._data[id];
|
688
679
|
return id;
|
689
680
|
}
|
690
681
|
}
|
691
682
|
else if (id instanceof Object) {
|
692
|
-
var itemId = id[this.
|
693
|
-
if (itemId && this.
|
694
|
-
delete this.
|
695
|
-
delete this.internalIds[itemId];
|
683
|
+
var itemId = id[this._fieldId];
|
684
|
+
if (itemId && this._data[itemId]) {
|
685
|
+
delete this._data[itemId];
|
696
686
|
return itemId;
|
697
687
|
}
|
698
688
|
}
|
@@ -705,10 +695,9 @@ DataSet.prototype._remove = function (id) {
|
|
705
695
|
* @return {Array} removedIds The ids of all removed items
|
706
696
|
*/
|
707
697
|
DataSet.prototype.clear = function (senderId) {
|
708
|
-
var ids = Object.keys(this.
|
698
|
+
var ids = Object.keys(this._data);
|
709
699
|
|
710
|
-
this.
|
711
|
-
this.internalIds = {};
|
700
|
+
this._data = {};
|
712
701
|
|
713
702
|
this._trigger('remove', {items: ids}, senderId);
|
714
703
|
|
@@ -721,7 +710,7 @@ DataSet.prototype.clear = function (senderId) {
|
|
721
710
|
* @return {Object | null} item Item containing max value, or null if no items
|
722
711
|
*/
|
723
712
|
DataSet.prototype.max = function (field) {
|
724
|
-
var data = this.
|
713
|
+
var data = this._data,
|
725
714
|
max = null,
|
726
715
|
maxField = null;
|
727
716
|
|
@@ -745,7 +734,7 @@ DataSet.prototype.max = function (field) {
|
|
745
734
|
* @return {Object | null} item Item containing max value, or null if no items
|
746
735
|
*/
|
747
736
|
DataSet.prototype.min = function (field) {
|
748
|
-
var data = this.
|
737
|
+
var data = this._data,
|
749
738
|
min = null,
|
750
739
|
minField = null;
|
751
740
|
|
@@ -771,17 +760,18 @@ DataSet.prototype.min = function (field) {
|
|
771
760
|
* The returned array is unordered.
|
772
761
|
*/
|
773
762
|
DataSet.prototype.distinct = function (field) {
|
774
|
-
var data = this.
|
775
|
-
|
776
|
-
|
777
|
-
|
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;
|
778
768
|
|
779
769
|
for (var prop in data) {
|
780
770
|
if (data.hasOwnProperty(prop)) {
|
781
771
|
var item = data[prop];
|
782
|
-
var value =
|
772
|
+
var value = item[field];
|
783
773
|
var exists = false;
|
784
|
-
for (
|
774
|
+
for (i = 0; i < count; i++) {
|
785
775
|
if (values[i] == value) {
|
786
776
|
exists = true;
|
787
777
|
break;
|
@@ -794,6 +784,12 @@ DataSet.prototype.distinct = function (field) {
|
|
794
784
|
}
|
795
785
|
}
|
796
786
|
|
787
|
+
if (fieldType) {
|
788
|
+
for (i = 0; i < values.length; i++) {
|
789
|
+
values[i] = util.convert(values[i], fieldType);
|
790
|
+
}
|
791
|
+
}
|
792
|
+
|
797
793
|
return values;
|
798
794
|
};
|
799
795
|
|
@@ -804,11 +800,11 @@ DataSet.prototype.distinct = function (field) {
|
|
804
800
|
* @private
|
805
801
|
*/
|
806
802
|
DataSet.prototype._addItem = function (item) {
|
807
|
-
var id = item[this.
|
803
|
+
var id = item[this._fieldId];
|
808
804
|
|
809
805
|
if (id != undefined) {
|
810
806
|
// check whether this id is already taken
|
811
|
-
if (this.
|
807
|
+
if (this._data[id]) {
|
812
808
|
// item already exists
|
813
809
|
throw new Error('Cannot add item: item with id ' + id + ' already exists');
|
814
810
|
}
|
@@ -816,18 +812,17 @@ DataSet.prototype._addItem = function (item) {
|
|
816
812
|
else {
|
817
813
|
// generate an id
|
818
814
|
id = util.randomUUID();
|
819
|
-
item[this.
|
820
|
-
this.internalIds[id] = item;
|
815
|
+
item[this._fieldId] = id;
|
821
816
|
}
|
822
817
|
|
823
818
|
var d = {};
|
824
819
|
for (var field in item) {
|
825
820
|
if (item.hasOwnProperty(field)) {
|
826
|
-
var fieldType = this.
|
821
|
+
var fieldType = this._type[field]; // type may be undefined
|
827
822
|
d[field] = util.convert(item[field], fieldType);
|
828
823
|
}
|
829
824
|
}
|
830
|
-
this.
|
825
|
+
this._data[id] = d;
|
831
826
|
|
832
827
|
return id;
|
833
828
|
};
|
@@ -835,31 +830,26 @@ DataSet.prototype._addItem = function (item) {
|
|
835
830
|
/**
|
836
831
|
* Get an item. Fields can be converted to a specific type
|
837
832
|
* @param {String} id
|
838
|
-
* @param {Object.<String, String>} [
|
833
|
+
* @param {Object.<String, String>} [types] field types to convert
|
839
834
|
* @return {Object | null} item
|
840
835
|
* @private
|
841
836
|
*/
|
842
|
-
DataSet.prototype._getItem = function (id,
|
837
|
+
DataSet.prototype._getItem = function (id, types) {
|
843
838
|
var field, value;
|
844
839
|
|
845
840
|
// get the item from the dataset
|
846
|
-
var raw = this.
|
841
|
+
var raw = this._data[id];
|
847
842
|
if (!raw) {
|
848
843
|
return null;
|
849
844
|
}
|
850
845
|
|
851
846
|
// convert the items field types
|
852
|
-
var converted = {}
|
853
|
-
|
854
|
-
internalIds = this.internalIds;
|
855
|
-
if (convert) {
|
847
|
+
var converted = {};
|
848
|
+
if (types) {
|
856
849
|
for (field in raw) {
|
857
850
|
if (raw.hasOwnProperty(field)) {
|
858
851
|
value = raw[field];
|
859
|
-
|
860
|
-
if ((field != fieldId) || (!(value in internalIds) || this.showInternalIds)) {
|
861
|
-
converted[field] = util.convert(value, convert[field]);
|
862
|
-
}
|
852
|
+
converted[field] = util.convert(value, types[field]);
|
863
853
|
}
|
864
854
|
}
|
865
855
|
}
|
@@ -868,10 +858,7 @@ DataSet.prototype._getItem = function (id, convert) {
|
|
868
858
|
for (field in raw) {
|
869
859
|
if (raw.hasOwnProperty(field)) {
|
870
860
|
value = raw[field];
|
871
|
-
|
872
|
-
if ((field != fieldId) || (!(value in internalIds) || this.showInternalIds)) {
|
873
|
-
converted[field] = value;
|
874
|
-
}
|
861
|
+
converted[field] = value;
|
875
862
|
}
|
876
863
|
}
|
877
864
|
}
|
@@ -887,11 +874,11 @@ DataSet.prototype._getItem = function (id, convert) {
|
|
887
874
|
* @private
|
888
875
|
*/
|
889
876
|
DataSet.prototype._updateItem = function (item) {
|
890
|
-
var id = item[this.
|
877
|
+
var id = item[this._fieldId];
|
891
878
|
if (id == undefined) {
|
892
879
|
throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')');
|
893
880
|
}
|
894
|
-
var d = this.
|
881
|
+
var d = this._data[id];
|
895
882
|
if (!d) {
|
896
883
|
// item doesn't exist
|
897
884
|
throw new Error('Cannot update item: no item with id ' + id + ' found');
|
@@ -900,7 +887,7 @@ DataSet.prototype._updateItem = function (item) {
|
|
900
887
|
// merge with current item
|
901
888
|
for (var field in item) {
|
902
889
|
if (item.hasOwnProperty(field)) {
|
903
|
-
var fieldType = this.
|
890
|
+
var fieldType = this._type[field]; // type may be undefined
|
904
891
|
d[field] = util.convert(item[field], fieldType);
|
905
892
|
}
|
906
893
|
}
|
@@ -908,17 +895,6 @@ DataSet.prototype._updateItem = function (item) {
|
|
908
895
|
return id;
|
909
896
|
};
|
910
897
|
|
911
|
-
/**
|
912
|
-
* check if an id is an internal or external id
|
913
|
-
* @param id
|
914
|
-
* @returns {boolean}
|
915
|
-
* @private
|
916
|
-
*/
|
917
|
-
DataSet.prototype.isInternalId = function(id) {
|
918
|
-
return (id in this.internalIds);
|
919
|
-
};
|
920
|
-
|
921
|
-
|
922
898
|
/**
|
923
899
|
* Get an array with the column names of a Google DataTable
|
924
900
|
* @param {DataTable} dataTable
|