123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- var util = require('./util');
- var DataSet = require('./DataSet');
- function DataView (data, options) {
- this._data = null;
- this._ids = {};
- this.length = 0;
- this._options = options || {};
- this._fieldId = 'id';
- this._subscribers = {};
- var me = this;
- this.listener = function () {
- me._onEvent.apply(me, arguments);
- };
- this.setData(data);
- }
- DataView.prototype.setData = function (data) {
- var ids, id, i, len, items;
- if (this._data) {
-
- if (this._data.off) {
- this._data.off('*', this.listener);
- }
-
- ids = this._data.getIds({filter: this._options && this._options.filter});
- items = [];
- for (i = 0, len = ids.length; i < len; i++) {
- items.push(this._data._data[ids[i]]);
- }
- this._ids = {};
- this.length = 0;
- this._trigger('remove', {items: ids, oldData: items});
- }
- this._data = data;
- if (this._data) {
-
- this._fieldId = this._options.fieldId ||
- (this._data && this._data.options && this._data.options.fieldId) ||
- 'id';
-
- ids = this._data.getIds({filter: this._options && this._options.filter});
- for (i = 0, len = ids.length; i < len; i++) {
- id = ids[i];
- this._ids[id] = true;
- }
- this.length = ids.length;
- this._trigger('add', {items: ids});
-
- if (this._data.on) {
- this._data.on('*', this.listener);
- }
- }
- };
- DataView.prototype.refresh = function () {
- var id, i, len;
- var ids = this._data.getIds({filter: this._options && this._options.filter}),
- oldIds = Object.keys(this._ids),
- newIds = {},
- addedIds = [],
- removedIds = [],
- removedItems = [];
-
- for (i = 0, len = ids.length; i < len; i++) {
- id = ids[i];
- newIds[id] = true;
- if (!this._ids[id]) {
- addedIds.push(id);
- this._ids[id] = true;
- }
- }
-
- for (i = 0, len = oldIds.length; i < len; i++) {
- id = oldIds[i];
- if (!newIds[id]) {
- removedIds.push(id);
- removedItems.push(this._data._data[id]);
- delete this._ids[id];
- }
- }
- this.length += addedIds.length - removedIds.length;
-
- if (addedIds.length) {
- this._trigger('add', {items: addedIds});
- }
- if (removedIds.length) {
- this._trigger('remove', {items: removedIds, oldData: removedItems});
- }
- };
- DataView.prototype.get = function (args) {
- var me = this;
-
- var ids, options, data;
- var firstType = util.getType(arguments[0]);
- if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') {
-
- ids = arguments[0];
- options = arguments[1];
- data = arguments[2];
- }
- else {
-
- options = arguments[0];
- data = arguments[1];
- }
-
- var viewOptions = util.extend({}, this._options, options);
-
- if (this._options.filter && options && options.filter) {
- viewOptions.filter = function (item) {
- return me._options.filter(item) && options.filter(item);
- }
- }
-
- var getArguments = [];
- if (ids != undefined) {
- getArguments.push(ids);
- }
- getArguments.push(viewOptions);
- getArguments.push(data);
- return this._data && this._data.get.apply(this._data, getArguments);
- };
- DataView.prototype.getIds = function (options) {
- var ids;
- if (this._data) {
- var defaultFilter = this._options.filter;
- var filter;
- if (options && options.filter) {
- if (defaultFilter) {
- filter = function (item) {
- return defaultFilter(item) && options.filter(item);
- }
- }
- else {
- filter = options.filter;
- }
- }
- else {
- filter = defaultFilter;
- }
- ids = this._data.getIds({
- filter: filter,
- order: options && options.order
- });
- }
- else {
- ids = [];
- }
- return ids;
- };
- DataView.prototype.map = function (callback,options) {
- var mappedItems = [];
- if (this._data) {
- var defaultFilter = this._options.filter;
- var filter;
- if (options && options.filter) {
- if (defaultFilter) {
- filter = function (item) {
- return defaultFilter(item) && options.filter(item);
- }
- }
- else {
- filter = options.filter;
- }
- }
- else {
- filter = defaultFilter;
- }
- mappedItems = this._data.map(callback,{
- filter: filter,
- order: options && options.order
- });
- }
- else {
- mappedItems = [];
- }
- return mappedItems;
- };
- DataView.prototype.getDataSet = function () {
- var dataSet = this;
- while (dataSet instanceof DataView) {
- dataSet = dataSet._data;
- }
- return dataSet || null;
- };
- DataView.prototype._onEvent = function (event, params, senderId) {
- var i, len, id, item;
- var ids = params && params.items;
- var addedIds = [],
- updatedIds = [],
- removedIds = [],
- oldItems = [],
- updatedItems = [],
- removedItems = [];
- if (ids && this._data) {
- switch (event) {
- case 'add':
-
- for (i = 0, len = ids.length; i < len; i++) {
- id = ids[i];
- item = this.get(id);
- if (item) {
- this._ids[id] = true;
- addedIds.push(id);
- }
- }
- break;
- case 'update':
-
-
- for (i = 0, len = ids.length; i < len; i++) {
- id = ids[i];
- item = this.get(id);
- if (item) {
- if (this._ids[id]) {
- updatedIds.push(id);
- updatedItems.push(params.data[i]);
- oldItems.push(params.oldData[i]);
- }
- else {
- this._ids[id] = true;
- addedIds.push(id);
- }
- }
- else {
- if (this._ids[id]) {
- delete this._ids[id];
- removedIds.push(id);
- removedItems.push(params.oldData[i]);
- }
- else {
-
- }
- }
- }
- break;
- case 'remove':
-
- for (i = 0, len = ids.length; i < len; i++) {
- id = ids[i];
- if (this._ids[id]) {
- delete this._ids[id];
- removedIds.push(id);
- removedItems.push(params.oldData[i]);
- }
- }
- break;
- }
- this.length += addedIds.length - removedIds.length;
- if (addedIds.length) {
- this._trigger('add', {items: addedIds}, senderId);
- }
- if (updatedIds.length) {
- this._trigger('update', {items: updatedIds, oldData: oldItems, data: updatedItems}, senderId);
- }
- if (removedIds.length) {
- this._trigger('remove', {items: removedIds, oldData: removedItems}, senderId);
- }
- }
- };
- DataView.prototype.on = DataSet.prototype.on;
- DataView.prototype.off = DataSet.prototype.off;
- DataView.prototype._trigger = DataSet.prototype._trigger;
- DataView.prototype.subscribe = DataView.prototype.on;
- DataView.prototype.unsubscribe = DataView.prototype.off;
- module.exports = DataView;
|