UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

117 lines 15.5 kB
import { core } from './core'; import { observableArray } from './observable-array'; import { BreezeEvent } from './event'; let complexArrayMixin = { // complexArray will have the following props // parent // propertyPath // parentProperty // addedItems - only if modified // removedItems - only if modified // each complexAspect of any entity within a complexArray // will have its own _complexState = "A/M"; /** Complex arrays are not actually classes, they are objects that mimic arrays. A complex array is collection of complexTypes associated with a data property on a single entity or other complex object. i.e. customer.orders or order.orderDetails. This collection looks like an array in that the basic methods on arrays such as 'push', 'pop', 'shift', 'unshift', 'splice' are all provided as well as several special purpose methods. @class {complexArray} **/ /** An [[Event]] that fires whenever the contents of this array changed. This event is fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection. Adds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual collections are collected into a single notification event for each relation array. @example // assume order is an order entity attached to an EntityManager. orders.arrayChanged.subscribe( function (arrayChangedArgs) { var addedEntities = arrayChangedArgs.added; var removedEntities = arrayChanged.removed; }); @event arrayChanged @param added {Array of Entity} An array of all of the entities added to this collection. @param removed {Array of Entity} An array of all of the removed from this collection. @readOnly **/ // virtual impls _getGoodAdds: function (adds) { return getGoodAdds(this, adds); }, _beforeChange: function () { observableArray.updateEntityState(this); }, _processAdds: function (adds) { processAdds(this, adds); }, _processRemoves: function (removes) { processRemoves(this, removes); }, _rejectChanges: function () { if (!this._origValues) return; let that = this; this.forEach(function (co) { clearAspect(co, that); }); this.length = 0; this._origValues.forEach(function (co) { that.push(co); }); }, _acceptChanges: function () { this._origValues = null; } }; // local functions function getGoodAdds(complexArray, adds) { // remove any that are already added here return adds.filter(function (a) { // return a.parent !== complexArray.parent; // TODO: check if this is actually a bug in original breezejs ??? return a.complexAspect == null || a.complexAspect.parent !== complexArray.parent; }); } function processAdds(complexArray, adds) { adds.forEach(function (a) { // if (a.parent != null) { // TODO: check if this is actually a bug in original breezejs ??? if (a.complexAspect && a.complexAspect.parent != null) { throw new Error("The complexObject is already attached. Either clone it or remove it from its current owner"); } setAspect(a, complexArray); }); } function processRemoves(complexArray, removes) { removes.forEach(function (a) { clearAspect(a, complexArray); }); } function clearAspect(co, arr) { let coAspect = co.complexAspect; // if not already attached - exit if (coAspect.parent !== arr.parent) return null; coAspect.parent = undefined; coAspect.parentProperty = undefined; return coAspect; } function setAspect(co, arr) { let coAspect = co.complexAspect; // if already attached - exit if (coAspect.parent === arr.parent) return null; coAspect.parent = arr.parent; coAspect.parentProperty = arr.parentProperty; return coAspect; } /** For use by breeze plugin authors only. The class is for use in building a [[IModelLibraryAdapter]] implementation. @adapter (see [[IModelLibraryAdapter]]) @hidden */ export function makeComplexArray(arr, parent, parentProperty) { let arrX = arr; observableArray.initializeParent(arrX, parent, parentProperty); arrX.arrayChanged = new BreezeEvent("arrayChanged", arrX); core.extend(arrX, observableArray.mixin); return core.extend(arrX, complexArrayMixin); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleC1hcnJheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wbGV4LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUcsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBWXRDLElBQUksaUJBQWlCLEdBQUc7SUFFdEIsNkNBQTZDO0lBQzdDLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLG9DQUFvQztJQUNwQyxzQ0FBc0M7SUFDdEMsMERBQTBEO0lBQzFELDRDQUE0QztJQUU1Qzs7Ozs7O1FBTUk7SUFFSjs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUVELGdCQUFnQjtJQUNsQixZQUFZLEVBQUUsVUFBUyxJQUFXO1FBQ2hDLE9BQU8sV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsYUFBYSxFQUFFO1FBQ2IsZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxZQUFZLEVBQUUsVUFBUyxJQUFXO1FBQ2hDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGVBQWUsRUFBRSxVQUFTLE9BQWM7UUFDdEMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsY0FBYyxFQUFFO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUM5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQWlCO1lBQ3RDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEIs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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlICB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGVBcnJheSwgb2JzZXJ2YWJsZUFycmF5IH0gZnJvbSAnLi9vYnNlcnZhYmxlLWFycmF5JztcclxuaW1wb3J0IHsgQnJlZXplRXZlbnQgfSBmcm9tICcuL2V2ZW50JztcclxuaW1wb3J0IHsgQ29tcGxleE9iamVjdCwgU3RydWN0dXJhbE9iamVjdCB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IERhdGFQcm9wZXJ0eSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuXHJcbi8vIFRPRE86IG1peGluIGltcGwgaXMgbm90IHZlcnkgdHlwZXNhZmVcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxleEFycmF5IGV4dGVuZHMgT2JzZXJ2YWJsZUFycmF5IHtcclxuICBbaW5kZXg6IG51bWJlcl06IENvbXBsZXhPYmplY3Q7XHJcbiAgcGFyZW50PzogU3RydWN0dXJhbE9iamVjdDtcclxuICBwYXJlbnRQcm9wZXJ0eT86IERhdGFQcm9wZXJ0eTtcclxufVxyXG5cclxubGV0IGNvbXBsZXhBcnJheU1peGluID0ge1xyXG5cclxuICAvLyBjb21wbGV4QXJyYXkgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcHNcclxuICAvLyAgICBwYXJlbnRcclxuICAvLyAgICBwcm9wZXJ0eVBhdGhcclxuICAvLyAgICBwYXJlbnRQcm9wZXJ0eVxyXG4gIC8vICAgIGFkZGVkSXRlbXMgIC0gb25seSBpZiBtb2RpZmllZFxyXG4gIC8vICAgIHJlbW92ZWRJdGVtcyAgLSBvbmx5IGlmIG1vZGlmaWVkXHJcbiAgLy8gIGVhY2ggY29tcGxleEFzcGVjdCBvZiBhbnkgZW50aXR5IHdpdGhpbiBhIGNvbXBsZXhBcnJheVxyXG4gIC8vICB3aWxsIGhhdmUgaXRzIG93biBfY29tcGxleFN0YXRlID0gXCJBL01cIjtcclxuXHJcbiAgLyoqXHJcbiAgIENvbXBsZXggYXJyYXlzIGFyZSBub3QgYWN0dWFsbHkgY2xhc3NlcywgdGhleSBhcmUgb2JqZWN0cyB0aGF0IG1pbWljIGFycmF5cy4gQSBjb21wbGV4IGFycmF5IGlzIGNvbGxlY3Rpb24gb2ZcclxuICAgY29tcGxleFR5cGVzIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGEgcHJvcGVydHkgb24gYSBzaW5nbGUgZW50aXR5IG9yIG90aGVyIGNvbXBsZXggb2JqZWN0LiBpLmUuIGN1c3RvbWVyLm9yZGVycyBvciBvcmRlci5vcmRlckRldGFpbHMuXHJcbiAgIFRoaXMgY29sbGVjdGlvbiBsb29rcyBsaWtlIGFuIGFycmF5IGluIHRoYXQgdGhlIGJhc2ljIG1ldGhvZHMgb24gYXJyYXlzIHN1Y2ggYXMgJ3B1c2gnLCAncG9wJywgJ3NoaWZ0JywgJ3Vuc2hpZnQnLCAnc3BsaWNlJ1xyXG4gICBhcmUgYWxsIHByb3ZpZGVkIGFzIHdlbGwgYXMgc2V2ZXJhbCBzcGVjaWFsIHB1cnBvc2UgbWV0aG9kcy5cclxuICAgQGNsYXNzIHtjb21wbGV4QXJyYXl9XHJcbiAgICoqL1xyXG5cclxuICAvKipcclxuICBBbiBbW0V2ZW50XV0gdGhhdCBmaXJlcyB3aGVuZXZlciB0aGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBjaGFuZ2VkLiAgVGhpcyBldmVudFxyXG4gIGlzIGZpcmVkIGFueSB0aW1lIGEgbmV3IGVudGl0eSBpcyBhdHRhY2hlZCBvciBhZGRlZCB0byB0aGUgRW50aXR5TWFuYWdlciBhbmQgaGFwcGVucyB0byBiZWxvbmcgdG8gdGhpcyBjb2xsZWN0aW9uLlxyXG4gIEFkZHMgdGhhdCBvY2N1ciBhcyBhIHJlc3VsdCBvZiBxdWVyeSBvciBpbXBvcnQgb3BlcmF0aW9ucyBhcmUgYmF0Y2hlZCBzbyB0aGF0IGFsbCBvZiB0aGUgYWRkcyBvciByZW1vdmVzIHRvIGFueSBpbmRpdmlkdWFsXHJcbiAgY29sbGVjdGlvbnMgYXJlIGNvbGxlY3RlZCBpbnRvIGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBldmVudCBmb3IgZWFjaCByZWxhdGlvbiBhcnJheS5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIG9yZGVycy5hcnJheUNoYW5nZWQuc3Vic2NyaWJlKFxyXG4gICAgICBmdW5jdGlvbiAoYXJyYXlDaGFuZ2VkQXJncykge1xyXG4gICAgICAgICAgdmFyIGFkZGVkRW50aXRpZXMgPSBhcnJheUNoYW5nZWRBcmdzLmFkZGVkO1xyXG4gICAgICAgICAgdmFyIHJlbW92ZWRFbnRpdGllcyA9IGFycmF5Q2hhbmdlZC5yZW1vdmVkO1xyXG4gICAgICB9KTtcclxuICBAZXZlbnQgYXJyYXlDaGFuZ2VkXHJcbiAgQHBhcmFtIGFkZGVkIHtBcnJheSBvZiBFbnRpdHl9IEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgZW50aXRpZXMgYWRkZWQgdG8gdGhpcyBjb2xsZWN0aW9uLlxyXG4gIEBwYXJhbSByZW1vdmVkIHtBcnJheSBvZiBFbnRpdHl9IEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgcmVtb3ZlZCBmcm9tIHRoaXMgY29sbGVjdGlvbi5cclxuICBAcmVhZE9ubHlcclxuICAqKi9cclxuXHJcbiAgICAvLyB2aXJ0dWFsIGltcGxzXHJcbiAgX2dldEdvb2RBZGRzOiBmdW5jdGlvbihhZGRzOiBhbnlbXSkge1xyXG4gICAgcmV0dXJuIGdldEdvb2RBZGRzKHRoaXMsIGFkZHMpO1xyXG4gIH0sXHJcblxyXG4gIF9iZWZvcmVDaGFuZ2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgb2JzZXJ2YWJsZUFycmF5LnVwZGF0ZUVudGl0eVN0YXRlKHRoaXMpO1xyXG4gIH0sXHJcblxyXG4gIF9wcm9jZXNzQWRkczogZnVuY3Rpb24oYWRkczogYW55W10pIHtcclxuICAgIHByb2Nlc3NBZGRzKHRoaXMsIGFkZHMpO1xyXG4gIH0sXHJcblxyXG4gIF9wcm9jZXNzUmVtb3ZlczogZnVuY3Rpb24ocmVtb3ZlczogYW55W10pIHtcclxuICAgIHByb2Nlc3NSZW1vdmVzKHRoaXMsIHJlbW92ZXMpO1xyXG4gIH0sXHJcblxyXG4gIF9yZWplY3RDaGFuZ2VzOiBmdW5jdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5fb3JpZ1ZhbHVlcykgcmV0dXJuO1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChjbzogQ29tcGxleE9iamVjdCkge1xyXG4gICAgICBjbGVhckFzcGVjdChjbywgdGhhdCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX29yaWdWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoY286IENvbXBsZXhPYmplY3QpIHtcclxuICAgICAgdGhhdC5wdXNoKGNvKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcblxyXG4gIF9hY2NlcHRDaGFuZ2VzOiBmdW5jdGlvbigpIHtcclxuICAgIHRoaXMuX29yaWdWYWx1ZXMgPSBudWxsO1xyXG4gIH1cclxufTtcclxuXHJcbi8vIGxvY2FsIGZ1bmN0aW9uc1xyXG5cclxuXHJcbmZ1bmN0aW9uIGdldEdvb2RBZGRzKGNvbXBsZXhBcnJheTogQ29tcGxleEFycmF5LCBhZGRzOiBDb21wbGV4T2JqZWN0W10pIHtcclxuICAvLyByZW1vdmUgYW55IHRoYXQgYXJlIGFscmVhZHkgYWRkZWQgaGVyZVxyXG4gIHJldHVybiBhZGRzLmZpbHRlcihmdW5jdGlvbiAoYSkge1xyXG4gICAgLy8gcmV0dXJuIGEucGFyZW50ICE9PSBjb21wbGV4QXJyYXkucGFyZW50OyAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyBpcyBhY3R1YWxseSBhIGJ1ZyBpbiBvcmlnaW5hbCBicmVlemVqcyA/Pz9cclxuICAgIHJldHVybiBhLmNvbXBsZXhBc3BlY3QgPT0gbnVsbCB8fCBhLmNvbXBsZXhBc3BlY3QucGFyZW50ICE9PSBjb21wbGV4QXJyYXkucGFyZW50O1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzQWRkcyhjb21wbGV4QXJyYXk6IENvbXBsZXhBcnJheSwgYWRkczogQ29tcGxleE9iamVjdFtdKSB7XHJcbiAgYWRkcy5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7XHJcbiAgICAvLyBpZiAoYS5wYXJlbnQgIT0gbnVsbCkgeyAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIGlzIGFjdHVhbGx5IGEgYnVnIGluIG9yaWdpbmFsIGJyZWV6ZWpzID8/P1xyXG4gICAgaWYgKGEuY29tcGxleEFzcGVjdCAmJiBhLmNvbXBsZXhBc3BlY3QucGFyZW50ICE9IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNvbXBsZXhPYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZC4gRWl0aGVyIGNsb25lIGl0IG9yIHJlbW92ZSBpdCBmcm9tIGl0cyBjdXJyZW50IG93bmVyXCIpO1xyXG4gICAgfVxyXG4gICAgc2V0QXNwZWN0KGEsIGNvbXBsZXhBcnJheSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NSZW1vdmVzKGNvbXBsZXhBcnJheTogQ29tcGxleEFycmF5LCByZW1vdmVzOiBDb21wbGV4T2JqZWN0W10pIHtcclxuICByZW1vdmVzLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcclxuICAgIGNsZWFyQXNwZWN0KGEsIGNvbXBsZXhBcnJheSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsZWFyQXNwZWN0KGNvOiBDb21wbGV4T2JqZWN0LCBhcnI6IENvbXBsZXhBcnJheSkge1xyXG4gIGxldCBjb0FzcGVjdCA9IGNvLmNvbXBsZXhBc3BlY3Q7XHJcbiAgLy8gaWYgbm90IGFscmVhZHkgYXR0YWNoZWQgLSBleGl0XHJcbiAgaWYgKGNvQXNwZWN0LnBhcmVudCAhPT0gYXJyLnBhcmVudCkgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvQXNwZWN0LnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICBjb0FzcGVjdC5wYXJlbnRQcm9wZXJ0eSA9IHVuZGVmaW5lZDtcclxuICByZXR1cm4gY29Bc3BlY3Q7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldEFzcGVjdChjbzogQ29tcGxleE9iamVjdCwgYXJyOiBDb21wbGV4QXJyYXkpIHtcclxuICBsZXQgY29Bc3BlY3QgPSBjby5jb21wbGV4QXNwZWN0O1xyXG4gIC8vIGlmIGFscmVhZHkgYXR0YWNoZWQgLSBleGl0XHJcbiAgaWYgKGNvQXNwZWN0LnBhcmVudCA9PT0gYXJyLnBhcmVudCkgcmV0dXJuIG51bGw7XHJcbiAgY29Bc3BlY3QucGFyZW50ID0gYXJyLnBhcmVudDtcclxuICBjb0FzcGVjdC5wYXJlbnRQcm9wZXJ0eSA9IGFyci5wYXJlbnRQcm9wZXJ0eTtcclxuXHJcbiAgcmV0dXJuIGNvQXNwZWN0O1xyXG59XHJcblxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJTW9kZWxMaWJyYXJ5QWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lNb2RlbExpYnJhcnlBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbXBsZXhBcnJheShhcnI6IGFueVtdLCBwYXJlbnQ6IFN0cnVjdHVyYWxPYmplY3QsIHBhcmVudFByb3BlcnR5OiBEYXRhUHJvcGVydHkpIHtcclxuICBsZXQgYXJyWCA9IGFyciBhcyBhbnk7XHJcbiAgb2JzZXJ2YWJsZUFycmF5LmluaXRpYWxpemVQYXJlbnQoYXJyWCwgcGFyZW50LCBwYXJlbnRQcm9wZXJ0eSk7XHJcbiAgYXJyWC5hcnJheUNoYW5nZWQgPSBuZXcgQnJlZXplRXZlbnQoXCJhcnJheUNoYW5nZWRcIiwgYXJyWCk7XHJcbiAgY29yZS5leHRlbmQoYXJyWCwgb2JzZXJ2YWJsZUFycmF5Lm1peGluKTtcclxuICByZXR1cm4gY29yZS5leHRlbmQoYXJyWCwgY29tcGxleEFycmF5TWl4aW4pIGFzIENvbXBsZXhBcnJheTtcclxufVxyXG5cclxuIl19