|
@ -44,14 +44,17 @@ function DataSet (options) { |
|
|
this.fieldTypes = {}; // field types by field name
|
|
|
this.fieldTypes = {}; // field types by field name
|
|
|
|
|
|
|
|
|
if (this.options.fieldTypes) { |
|
|
if (this.options.fieldTypes) { |
|
|
util.forEach(this.options.fieldTypes, function (value, field) { |
|
|
|
|
|
if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { |
|
|
|
|
|
me.fieldTypes[field] = 'Date'; |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
me.fieldTypes[field] = value; |
|
|
|
|
|
|
|
|
for (var field in this.options.fieldTypes) { |
|
|
|
|
|
if (this.options.fieldTypes.hasOwnProperty(field)) { |
|
|
|
|
|
var value = this.options.fieldTypes[field]; |
|
|
|
|
|
if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { |
|
|
|
|
|
this.fieldTypes[field] = 'Date'; |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
this.fieldTypes[field] = value; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// event subscribers
|
|
|
// event subscribers
|
|
@ -118,11 +121,12 @@ DataSet.prototype._trigger = function (event, params, senderId) { |
|
|
subscribers = subscribers.concat(this.subscribers['*']); |
|
|
subscribers = subscribers.concat(this.subscribers['*']); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
subscribers.forEach(function (listener) { |
|
|
|
|
|
if (listener.callback) { |
|
|
|
|
|
listener.callback(event, params, senderId || null); |
|
|
|
|
|
|
|
|
for (var i = 0; i < subscribers.length; i++) { |
|
|
|
|
|
var subscriber = subscribers[i]; |
|
|
|
|
|
if (subscriber.callback) { |
|
|
|
|
|
subscriber.callback(event, params, senderId || null); |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -138,19 +142,21 @@ DataSet.prototype.add = function (data, senderId) { |
|
|
|
|
|
|
|
|
if (data instanceof Array) { |
|
|
if (data instanceof Array) { |
|
|
// Array
|
|
|
// Array
|
|
|
data.forEach(function (item) { |
|
|
|
|
|
var id = me._addItem(item); |
|
|
|
|
|
|
|
|
for (var i = 0, len = data.length; i < len; i++) { |
|
|
|
|
|
id = me._addItem(data[i]); |
|
|
addedItems.push(id); |
|
|
addedItems.push(id); |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
else if (util.isDataTable(data)) { |
|
|
else if (util.isDataTable(data)) { |
|
|
// Google DataTable
|
|
|
// Google DataTable
|
|
|
var columns = this._getColumnNames(data); |
|
|
var columns = this._getColumnNames(data); |
|
|
for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { |
|
|
for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { |
|
|
var item = {}; |
|
|
var item = {}; |
|
|
columns.forEach(function (field, col) { |
|
|
|
|
|
|
|
|
for (var col = 0, cols = columns.length; col < cols; col++) { |
|
|
|
|
|
var field = columns[col]; |
|
|
item[field] = data.getValue(row, col); |
|
|
item[field] = data.getValue(row, col); |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
id = me._addItem(item); |
|
|
id = me._addItem(item); |
|
|
addedItems.push(id); |
|
|
addedItems.push(id); |
|
|
} |
|
|
} |
|
@ -196,18 +202,20 @@ DataSet.prototype.update = function (data, senderId) { |
|
|
|
|
|
|
|
|
if (data instanceof Array) { |
|
|
if (data instanceof Array) { |
|
|
// Array
|
|
|
// Array
|
|
|
data.forEach(function (item) { |
|
|
|
|
|
addOrUpdate(item); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
for (var i = 0, len = data.length; i < len; i++) { |
|
|
|
|
|
addOrUpdate(data[i]); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
else if (util.isDataTable(data)) { |
|
|
else if (util.isDataTable(data)) { |
|
|
// Google DataTable
|
|
|
// Google DataTable
|
|
|
var columns = this._getColumnNames(data); |
|
|
var columns = this._getColumnNames(data); |
|
|
for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { |
|
|
for (var row = 0, rows = data.getNumberOfRows(); row < rows; row++) { |
|
|
var item = {}; |
|
|
var item = {}; |
|
|
columns.forEach(function (field, col) { |
|
|
|
|
|
|
|
|
for (var col = 0, cols = columns.length; col < cols; col++) { |
|
|
|
|
|
var field = columns[col]; |
|
|
item[field] = data.getValue(row, col); |
|
|
item[field] = data.getValue(row, col); |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
addOrUpdate(item); |
|
|
addOrUpdate(item); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -307,11 +315,7 @@ DataSet.prototype.get = function (args) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// build options
|
|
|
// build options
|
|
|
var itemOptions = { |
|
|
|
|
|
fieldTypes: this._mergeFieldTypes(options && options.fieldTypes), |
|
|
|
|
|
fields: options && options.fields, |
|
|
|
|
|
filter: options && options.filter |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
var itemOptions = this._composeItemOptions(options); |
|
|
|
|
|
|
|
|
var item, itemId, i, len; |
|
|
var item, itemId, i, len; |
|
|
if (type == 'DataTable') { |
|
|
if (type == 'DataTable') { |
|
@ -390,17 +394,18 @@ DataSet.prototype.get = function (args) { |
|
|
* {function} [filter] filter items |
|
|
* {function} [filter] filter items |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype.forEach = function (callback, options) { |
|
|
DataSet.prototype.forEach = function (callback, options) { |
|
|
var fieldTypes = this._mergeFieldTypes(options && options.fieldTypes); |
|
|
|
|
|
var fields = options && options.fields; |
|
|
|
|
|
var filter = options && options.filter; |
|
|
|
|
|
var me = this; |
|
|
|
|
|
|
|
|
var itemOptions = this._composeItemOptions(options), |
|
|
|
|
|
data = this.data, |
|
|
|
|
|
item; |
|
|
|
|
|
|
|
|
util.forEach(this.data, function (item, id) { |
|
|
|
|
|
var item = me._castItem(item, fieldTypes, fields); |
|
|
|
|
|
if (!filter || filter(item)) { |
|
|
|
|
|
callback(item, id); |
|
|
|
|
|
|
|
|
for (var id in data) { |
|
|
|
|
|
if (data.hasOwnProperty(id)) { |
|
|
|
|
|
item = this._getItem(id, itemOptions); |
|
|
|
|
|
if (item) { |
|
|
|
|
|
callback(item, id); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -414,47 +419,55 @@ DataSet.prototype.forEach = function (callback, options) { |
|
|
* @return {Object[]} mappedItems |
|
|
* @return {Object[]} mappedItems |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype.map = function (callback, options) { |
|
|
DataSet.prototype.map = function (callback, options) { |
|
|
var fieldTypes = this._mergeFieldTypes(options && options.fieldTypes); |
|
|
|
|
|
var fields = options && options.fields; |
|
|
|
|
|
var filter = options && options.filter; |
|
|
|
|
|
var me = this; |
|
|
|
|
|
var mappedItems = []; |
|
|
|
|
|
|
|
|
|
|
|
util.forEach(this.data, function (item, id) { |
|
|
|
|
|
var item = me._castItem(item, fieldTypes, fields); |
|
|
|
|
|
if (!filter || filter(item)) { |
|
|
|
|
|
var mappedItem = callback(item, id); |
|
|
|
|
|
mappedItems.push(mappedItem); |
|
|
|
|
|
|
|
|
var itemOptions = this._composeItemOptions(options), |
|
|
|
|
|
mappedItems = [], |
|
|
|
|
|
data = this.data, |
|
|
|
|
|
item; |
|
|
|
|
|
|
|
|
|
|
|
for (var id in data) { |
|
|
|
|
|
if (data.hasOwnProperty(id)) { |
|
|
|
|
|
item = this._getItem(id, itemOptions); |
|
|
|
|
|
if (item) { |
|
|
|
|
|
mappedItems.push(callback(item, id)); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return mappedItems; |
|
|
return mappedItems; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Merge the provided field types with the datasets fieldtypes |
|
|
|
|
|
* @param {Object} fieldTypes |
|
|
|
|
|
* @returns {Object} mergedFieldTypes |
|
|
|
|
|
|
|
|
* Build an option set for getting an item. Options will be merged by the |
|
|
|
|
|
* default options of the dataset. |
|
|
|
|
|
* @param {Object} options |
|
|
|
|
|
* @returns {Object} itemOptions |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype._mergeFieldTypes = function (fieldTypes) { |
|
|
|
|
|
var merged = {}; |
|
|
|
|
|
|
|
|
DataSet.prototype._composeItemOptions = function (options) { |
|
|
|
|
|
var itemOptions = {}, |
|
|
|
|
|
field; |
|
|
|
|
|
|
|
|
|
|
|
if (options) { |
|
|
|
|
|
// get the default field types
|
|
|
|
|
|
itemOptions.fieldTypes = {}; |
|
|
|
|
|
if (this.options && this.options.fieldTypes) { |
|
|
|
|
|
util.extend(itemOptions.fieldTypes, this.options.fieldTypes); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// extend with the datasets fieldTypes
|
|
|
|
|
|
if (this.options && this.options.fieldTypes) { |
|
|
|
|
|
util.forEach(this.options.fieldTypes, function (value, field) { |
|
|
|
|
|
merged[field] = value; |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// extend field types with provided types
|
|
|
|
|
|
if (options.fieldTypes) { |
|
|
|
|
|
util.extend(itemOptions.fieldTypes, options.fieldTypes); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// extend with provided fieldTypes
|
|
|
|
|
|
if (fieldTypes) { |
|
|
|
|
|
util.forEach(fieldTypes, function (value, field) { |
|
|
|
|
|
merged[field] = value; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
if (options.fields) { |
|
|
|
|
|
itemOptions.fields = options.fields; |
|
|
|
|
|
} |
|
|
|
|
|
if (options.filter) { |
|
|
|
|
|
itemOptions.filter = options.filter; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return merged; |
|
|
|
|
|
|
|
|
return itemOptions; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -465,7 +478,7 @@ DataSet.prototype._mergeFieldTypes = function (fieldTypes) { |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype.remove = function (id, senderId) { |
|
|
DataSet.prototype.remove = function (id, senderId) { |
|
|
var removedItems = [], |
|
|
var removedItems = [], |
|
|
me = this; |
|
|
|
|
|
|
|
|
i, len; |
|
|
|
|
|
|
|
|
if (util.isNumber(id) || util.isString(id)) { |
|
|
if (util.isNumber(id) || util.isString(id)) { |
|
|
delete this.data[id]; |
|
|
delete this.data[id]; |
|
@ -473,14 +486,14 @@ DataSet.prototype.remove = function (id, senderId) { |
|
|
removedItems.push(id); |
|
|
removedItems.push(id); |
|
|
} |
|
|
} |
|
|
else if (id instanceof Array) { |
|
|
else if (id instanceof Array) { |
|
|
id.forEach(function (id) { |
|
|
|
|
|
me.remove(id); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
for (i = 0, len = id.length; i < len; i++) { |
|
|
|
|
|
this.remove(id[i]); |
|
|
|
|
|
} |
|
|
removedItems = items.concat(id); |
|
|
removedItems = items.concat(id); |
|
|
} |
|
|
} |
|
|
else if (id instanceof Object) { |
|
|
else if (id instanceof Object) { |
|
|
// search for the object
|
|
|
// search for the object
|
|
|
for (var i in this.data) { |
|
|
|
|
|
|
|
|
for (i in this.data) { |
|
|
if (this.data.hasOwnProperty(i)) { |
|
|
if (this.data.hasOwnProperty(i)) { |
|
|
if (this.data[i] == id) { |
|
|
if (this.data[i] == id) { |
|
|
delete this.data[i]; |
|
|
delete this.data[i]; |
|
@ -516,18 +529,19 @@ DataSet.prototype.clear = function (senderId) { |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype.max = function (field) { |
|
|
DataSet.prototype.max = function (field) { |
|
|
var data = this.data, |
|
|
var data = this.data, |
|
|
ids = Object.keys(data); |
|
|
|
|
|
|
|
|
|
|
|
var max = null; |
|
|
|
|
|
var maxField = null; |
|
|
|
|
|
ids.forEach(function (id) { |
|
|
|
|
|
var item = data[id]; |
|
|
|
|
|
var itemField = item[field]; |
|
|
|
|
|
if (itemField != null && (!max || itemField > maxField)) { |
|
|
|
|
|
max = item; |
|
|
|
|
|
maxField = itemField; |
|
|
|
|
|
|
|
|
max = null, |
|
|
|
|
|
maxField = null; |
|
|
|
|
|
|
|
|
|
|
|
for (var id in data) { |
|
|
|
|
|
if (data.hasOwnProperty(id)) { |
|
|
|
|
|
var item = data[id]; |
|
|
|
|
|
var itemField = item[field]; |
|
|
|
|
|
if (itemField != null && (!max || itemField > maxField)) { |
|
|
|
|
|
max = item; |
|
|
|
|
|
maxField = itemField; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return max; |
|
|
return max; |
|
|
}; |
|
|
}; |
|
@ -539,18 +553,19 @@ DataSet.prototype.max = function (field) { |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype.min = function (field) { |
|
|
DataSet.prototype.min = function (field) { |
|
|
var data = this.data, |
|
|
var data = this.data, |
|
|
ids = Object.keys(data); |
|
|
|
|
|
|
|
|
|
|
|
var min = null; |
|
|
|
|
|
var minField = null; |
|
|
|
|
|
ids.forEach(function (id) { |
|
|
|
|
|
var item = data[id]; |
|
|
|
|
|
var itemField = item[field]; |
|
|
|
|
|
if (itemField != null && (!min || itemField < minField)) { |
|
|
|
|
|
min = item; |
|
|
|
|
|
minField = itemField; |
|
|
|
|
|
|
|
|
min = null, |
|
|
|
|
|
minField = null; |
|
|
|
|
|
|
|
|
|
|
|
for (var id in data) { |
|
|
|
|
|
if (data.hasOwnProperty(id)) { |
|
|
|
|
|
var item = data[id]; |
|
|
|
|
|
var itemField = item[field]; |
|
|
|
|
|
if (itemField != null && (!min || itemField < minField)) { |
|
|
|
|
|
min = item; |
|
|
|
|
|
minField = itemField; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return min; |
|
|
return min; |
|
|
}; |
|
|
}; |
|
@ -633,7 +648,7 @@ DataSet.prototype._addItem = function (item) { |
|
|
* {String[]} fields Filter fields |
|
|
* {String[]} fields Filter fields |
|
|
* {function} filter Filter item, returns null if |
|
|
* {function} filter Filter item, returns null if |
|
|
* item does not match the filter |
|
|
* item does not match the filter |
|
|
* @return {Object | null} castedItem |
|
|
|
|
|
|
|
|
* @return {Object | null} item |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype._getItem = function (id, options) { |
|
|
DataSet.prototype._getItem = function (id, options) { |
|
@ -728,7 +743,7 @@ DataSet.prototype._updateItem = function (item) { |
|
|
/** |
|
|
/** |
|
|
* Get an array with the column names of a Google DataTable |
|
|
* Get an array with the column names of a Google DataTable |
|
|
* @param {DataTable} dataTable |
|
|
* @param {DataTable} dataTable |
|
|
* @return {Array} columnNames |
|
|
|
|
|
|
|
|
* @return {String[]} columnNames |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype._getColumnNames = function (dataTable) { |
|
|
DataSet.prototype._getColumnNames = function (dataTable) { |
|
@ -748,7 +763,9 @@ DataSet.prototype._getColumnNames = function (dataTable) { |
|
|
*/ |
|
|
*/ |
|
|
DataSet.prototype._appendRow = function (dataTable, columns, item) { |
|
|
DataSet.prototype._appendRow = function (dataTable, columns, item) { |
|
|
var row = dataTable.addRow(); |
|
|
var row = dataTable.addRow(); |
|
|
columns.forEach(function (field, col) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var col = 0, cols = columns.length; col < cols; col++) { |
|
|
|
|
|
var field = columns[col]; |
|
|
dataTable.setValue(row, col, item[field]); |
|
|
dataTable.setValue(row, col, item[field]); |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
}; |
|
|
}; |