diff --git a/bower.json b/bower.json index 0fa7e67..5ecc7a5 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "anglue", - "version": "1.0.0", + "version": "1.0.1", "authors": [ "Tommy Maintz " ], diff --git a/dist/amd/anglue.js b/dist/amd/anglue.js new file mode 100644 index 0000000..07096fa --- /dev/null +++ b/dist/amd/anglue.js @@ -0,0 +1,28 @@ +define(['exports', './annotation', './annotations', './utils', './application', './actions', './component', './store', './behaviors'], function (exports, _annotation, _annotations, _utils, _application, _actions, _component, _store, _behaviors) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + function _interopExportWildcard(obj, defaults) { var newObj = defaults({}, obj); delete newObj['default']; return newObj; } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + _defaults(exports, _interopExportWildcard(_annotation, _defaults)); + + _defaults(exports, _interopExportWildcard(_annotations, _defaults)); + + _defaults(exports, _interopExportWildcard(_utils, _defaults)); + + _defaults(exports, _interopExportWildcard(_application, _defaults)); + + _defaults(exports, _interopExportWildcard(_actions, _defaults)); + + _defaults(exports, _interopExportWildcard(_component, _defaults)); + + _defaults(exports, _interopExportWildcard(_store, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviors, _defaults)); +}); +//# sourceMappingURL=anglue.js.map diff --git a/dist/amd/anglue.js.map b/dist/amd/anglue.js.map new file mode 100644 index 0000000..aca59cf --- /dev/null +++ b/dist/amd/anglue.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"anglue.js","sourcesContent":[]} \ No newline at end of file diff --git a/dist/amd/annotation.js b/dist/amd/annotation.js index bb8b3fb..86967b9 100644 --- a/dist/amd/annotation.js +++ b/dist/amd/annotation.js @@ -40,7 +40,6 @@ define(['exports'], function (exports) { * This method can be overridden by child classes to * configure the angular module after it is created * @param {module} module The created angular module - * @returns {undefined} */ value: function configure() /*module*/{} @@ -51,7 +50,6 @@ define(['exports'], function (exports) { * wants the bindings * @param {Array} injected An array with the injected * instances that we will apply on the class instance - * @returns {undefined} */ }, { key: 'applyInjectionBindings', @@ -70,7 +68,6 @@ define(['exports'], function (exports) { * targetCls decorators * @deprecated * @param {Object} instance The created instance to be decorated - * @returns {undefined} */ }, { key: 'applyDecorators', @@ -109,7 +106,6 @@ define(['exports'], function (exports) { * This method decorates the class with all the targetCls decorators * @deprecated * @param {Object} targetCls The targetCls to be decorated - * @returns {undefined} */ }, { key: 'applyClassDecorators', diff --git a/dist/amd/annotation.js.map b/dist/amd/annotation.js.map index 3ee5b92..3f5e673 100644 --- a/dist/amd/annotation.js.map +++ b/dist/amd/annotation.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/annotation.js"],"names":[],"mappings":";;;;;;;;;;;MAAa,UAAU;AACV,aADA,UAAU,CACT,IAAI,EAAE,SAAS,EAAE;4BADlB,UAAU;;AAEnB,UAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,UAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;;;AAI3B,UAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;KACtC;;iBARU,UAAU;;aAUH,8BAAG;AACnB,YAAM,MAAM,GAAG,EAAE,CAAC;AAClB,YAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AACnC,cAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAA,OAAO,EAAI;AACzC,gBAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;SAClC,CAAC,CAAC;AACH,eAAO,MAAM,CAAC;OACf;;;;;;;;;;;;aAqBQ,+BAAa,EAAE;;;;;;;;;;;;;aAWF,gCAAC,QAAQ,EAAE,QAAQ,EAAE;AACzC,YAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;AAEnC,cAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAC,OAAO,EAAE,KAAK,EAAK;AAClD,iBAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC;SACrE,CAAC,CAAC;;AAEH,eAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;OAChE;;;;;;;;;;;aASc,yBAAC,QAAQ,EAAE;AACxB,YAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;;;;;;AAEnC,+BAAwB,UAAU,8HAAE;gBAAzB,SAAS;;AAClB,gBAAI,SAAS,CAAC,QAAQ,YAAY,QAAQ,EAAE;AAC1C,uBAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aAC9B;WACF;;;;;;;;;;;;;;;OACF;;;;;;;;;;aAQmB,8BAAC,SAAS,EAAE;AAC9B,YAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;;;;;;AAEnC,gCAAwB,UAAU,mIAAE;gBAAzB,SAAS;;AAClB,gBAAI,SAAS,CAAC,aAAa,YAAY,QAAQ,EAAE;AAC/C,uBAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;aACpC;WACF;;;;;;;;;;;;;;;OACF;;;;;;;;;WAtEa,eAAG;AACf,eAAO,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;OACxC;;;WAEa,eAAG;AACf,eAAO,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;OACxC;;;WAEe,eAAG;AACjB,eAAO,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,EAAE,CAAC;OAC1C;;;aAmEoB,0BAAe;YAAd,OAAO,yDAAG,EAAE;;AAChC,YAAM,KAAK,GAAG,EAAE,CAAC;;;;;;;AAEjB,gCAAkB,OAAO,mIAAE;gBAAhB,GAAG;;AACZ,gBAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;AAClC,gBAAI,UAAU,EAAE;AACd,mBAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACpC;WACF;;;;;;;;;;;;;;;;AAED,eAAO,KAAK,CAAC;OACd;;;aAE+B,qCAAe;YAAd,OAAO,yDAAG,EAAE;;AAC3C,YAAM,KAAK,GAAG,EAAE,CAAC;;;;;;;AAEjB,gCAAkB,OAAO,mIAAE;gBAAhB,GAAG;;AACZ,gBAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;AAClC,gBAAI,UAAU,EAAE;AACd,mBAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;aACpC;WACF;;;;;;;;;;;;;;;;AAED,eAAO,KAAK,CAAC;OACd;;;WAzHU,UAAU;;;;uBA2HR,UAAU","file":"annotation.js","sourcesContent":["export class Annotation {\n constructor(name, targetCls) {\n this.name = name;\n this.targetCls = targetCls;\n\n // We allow the decorators to decorate the targetCls\n // before we create and configure the module\n this.applyClassDecorators(targetCls);\n }\n\n getInjectionTokens() {\n const tokens = [];\n const injections = this.injections;\n Object.keys(injections).forEach(binding => {\n tokens.push(injections[binding]);\n });\n return tokens;\n }\n\n //noinspection InfiniteRecursionJS\n get injections() {\n return this.targetCls.injections || {};\n }\n\n get decorators() {\n return this.targetCls.decorators || [];\n }\n\n get dependencies() {\n return this.targetCls.dependencies || [];\n }\n\n /**\n * This method can be overridden by child classes to\n * configure the angular module after it is created\n * @param {module} module The created angular module\n * @returns {undefined}\n */\n configure(/*module*/) {}\n\n /**\n * This method applies all the requested injection bindings\n * from the targetCls to the created instance\n * @param {Object} instance The created instance that\n * wants the bindings\n * @param {Array} injected An array with the injected\n * instances that we will apply on the class instance\n * @returns {undefined}\n */\n applyInjectionBindings(instance, injected) {\n const injections = this.injections;\n\n Object.keys(injections).forEach((binding, index) => {\n Reflect.defineProperty(instance, binding, {value: injected[index]});\n });\n\n Reflect.defineProperty(instance, '_annotation', {value: this});\n }\n\n /**\n * This method decorates the created instance with all the\n * targetCls decorators\n * @deprecated\n * @param {Object} instance The created instance to be decorated\n * @returns {undefined}\n */\n applyDecorators(instance) {\n const decorators = this.decorators;\n\n for (const decorator of decorators) {\n if (decorator.decorate instanceof Function) {\n decorator.decorate(instance);\n }\n }\n }\n\n /**\n * This method decorates the class with all the targetCls decorators\n * @deprecated\n * @param {Object} targetCls The targetCls to be decorated\n * @returns {undefined}\n */\n applyClassDecorators(targetCls) {\n const decorators = this.decorators;\n\n for (const decorator of decorators) {\n if (decorator.decorateClass instanceof Function) {\n decorator.decorateClass(targetCls);\n }\n }\n }\n\n /**\n * Returns all the angular module names for an array of classes\n * @param {Array} classes An array of classes you want to module names for\n * @return {Array} The name of the angular modules for these classes\n */\n static getModuleNames(classes = []) {\n const names = [];\n\n for (const cls of classes) {\n const annotation = cls.annotation;\n if (annotation) {\n names.push(annotation.module.name);\n }\n }\n\n return names;\n }\n\n static getAnnotationServiceNames(classes = []) {\n const names = [];\n\n for (const cls of classes) {\n const annotation = cls.annotation;\n if (annotation) {\n names.push(annotation.serviceName);\n }\n }\n\n return names;\n }\n}\nexport default Annotation;\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/annotation.js"],"names":[],"mappings":"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","file":"annotation.js","sourcesContent":["export class Annotation {\n constructor(name, targetCls) {\n this.name = name;\n this.targetCls = targetCls;\n\n // We allow the decorators to decorate the targetCls\n // before we create and configure the module\n this.applyClassDecorators(targetCls);\n }\n\n getInjectionTokens() {\n const tokens = [];\n const injections = this.injections;\n Object.keys(injections).forEach(binding => {\n tokens.push(injections[binding]);\n });\n return tokens;\n }\n\n //noinspection InfiniteRecursionJS\n get injections() {\n return this.targetCls.injections || {};\n }\n\n get decorators() {\n return this.targetCls.decorators || [];\n }\n\n get dependencies() {\n return this.targetCls.dependencies || [];\n }\n\n /**\n * This method can be overridden by child classes to\n * configure the angular module after it is created\n * @param {module} module The created angular module\n */\n configure(/*module*/) {}\n\n /**\n * This method applies all the requested injection bindings\n * from the targetCls to the created instance\n * @param {Object} instance The created instance that\n * wants the bindings\n * @param {Array} injected An array with the injected\n * instances that we will apply on the class instance\n */\n applyInjectionBindings(instance, injected) {\n const injections = this.injections;\n\n Object.keys(injections).forEach((binding, index) => {\n Reflect.defineProperty(instance, binding, {value: injected[index]});\n });\n\n Reflect.defineProperty(instance, '_annotation', {value: this});\n }\n\n /**\n * This method decorates the created instance with all the\n * targetCls decorators\n * @deprecated\n * @param {Object} instance The created instance to be decorated\n */\n applyDecorators(instance) {\n const decorators = this.decorators;\n\n for (const decorator of decorators) {\n if (decorator.decorate instanceof Function) {\n decorator.decorate(instance);\n }\n }\n }\n\n /**\n * This method decorates the class with all the targetCls decorators\n * @deprecated\n * @param {Object} targetCls The targetCls to be decorated\n */\n applyClassDecorators(targetCls) {\n const decorators = this.decorators;\n\n for (const decorator of decorators) {\n if (decorator.decorateClass instanceof Function) {\n decorator.decorateClass(targetCls);\n }\n }\n }\n\n /**\n * Returns all the angular module names for an array of classes\n * @param {Array} classes An array of classes you want to module names for\n * @return {Array} The name of the angular modules for these classes\n */\n static getModuleNames(classes = []) {\n const names = [];\n\n for (const cls of classes) {\n const annotation = cls.annotation;\n if (annotation) {\n names.push(annotation.module.name);\n }\n }\n\n return names;\n }\n\n static getAnnotationServiceNames(classes = []) {\n const names = [];\n\n for (const cls of classes) {\n const annotation = cls.annotation;\n if (annotation) {\n names.push(annotation.serviceName);\n }\n }\n\n return names;\n }\n}\nexport default Annotation;\n"]} \ No newline at end of file diff --git a/dist/amd/annotations.js b/dist/amd/annotations.js index 71e28ca..588d6c0 100644 --- a/dist/amd/annotations.js +++ b/dist/amd/annotations.js @@ -9,38 +9,68 @@ define(['exports', './application', './component', './store', './actions'], func function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var AnnotationsFactory = (function () { - function AnnotationsFactory() { - _classCallCheck(this, AnnotationsFactory); + var AnnotationsCache = (function () { + function AnnotationsCache() { + _classCallCheck(this, AnnotationsCache); + + this.clear(); } - _createClass(AnnotationsFactory, [{ + _createClass(AnnotationsCache, [{ + key: 'clear', + value: function clear() { + this.actions = new Map(); + this.applications = new Map(); + this.components = new Map(); + this.stores = new Map(); + } + }, { + key: 'getActions', + value: function getActions(name, targetCls) { + var actions = this.actions.get(name); + if (!actions) { + actions = new _actions.ActionsAnnotation(name, targetCls); + this.actions.set(name, actions); + } + return actions; + } + }, { key: 'getApplication', value: function getApplication(name, targetCls) { - return new _application.ApplicationAnnotation(name, targetCls); + var application = this.applications.get(name); + if (!application) { + application = new _application.ApplicationAnnotation(name, targetCls); + this.applications.set(name, application); + } + return application; } }, { key: 'getComponent', value: function getComponent(name, targetCls) { - return new _component.ComponentAnnotation(name, targetCls); + var component = this.components.get(name); + if (!component) { + component = new _component.ComponentAnnotation(name, targetCls); + this.components.set(name, component); + } + return component; } }, { key: 'getStore', value: function getStore(name, targetCls) { - return new _store.StoreAnnotation(name, targetCls); - } - }, { - key: 'getActions', - value: function getActions(name, targetCls) { - return new _actions.ActionsAnnotation(name, targetCls); + var store = this.stores.get(name); + if (!store) { + store = new _store.StoreAnnotation(name, targetCls); + this.stores.set(name, store); + } + return store; } }]); - return AnnotationsFactory; + return AnnotationsCache; })(); - exports.AnnotationsFactory = AnnotationsFactory; - var Annotations = new AnnotationsFactory(); + exports.AnnotationsCache = AnnotationsCache; + var Annotations = new AnnotationsCache(); exports.Annotations = Annotations; exports['default'] = Annotations; }); diff --git a/dist/amd/annotations.js.map b/dist/amd/annotations.js.map index bf71fda..4aeaece 100644 --- a/dist/amd/annotations.js.map +++ b/dist/amd/annotations.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/annotations.js"],"names":[],"mappings":";;;;;;;;;;;MAKa,kBAAkB;aAAlB,kBAAkB;4BAAlB,kBAAkB;;;iBAAlB,kBAAkB;;aACf,wBAAC,IAAI,EAAE,SAAS,EAAE;AAC9B,eAAO,iBAPH,qBAAqB,CAOQ,IAAI,EAAE,SAAS,CAAC,CAAC;OACnD;;;aAEW,sBAAC,IAAI,EAAE,SAAS,EAAE;AAC5B,eAAO,eAVH,mBAAmB,CAUQ,IAAI,EAAE,SAAS,CAAC,CAAC;OACjD;;;aAEO,kBAAC,IAAI,EAAE,SAAS,EAAE;AACxB,eAAO,WAbH,eAAe,CAaQ,IAAI,EAAE,SAAS,CAAC,CAAC;OAC7C;;;aAES,oBAAC,IAAI,EAAE,SAAS,EAAE;AAC1B,eAAO,aAhBH,iBAAiB,CAgBQ,IAAI,EAAE,SAAS,CAAC,CAAC;OAC/C;;;WAfU,kBAAkB;;;;AAkBxB,MAAM,WAAW,GAAG,IAAI,kBAAkB,EAAE,CAAC;;uBACrC,WAAW","file":"annotations.js","sourcesContent":["import {ApplicationAnnotation} from './application';\nimport {ComponentAnnotation} from './component';\nimport {StoreAnnotation} from './store';\nimport {ActionsAnnotation} from './actions';\n\nexport class AnnotationsFactory {\n getApplication(name, targetCls) {\n return new ApplicationAnnotation(name, targetCls);\n }\n\n getComponent(name, targetCls) {\n return new ComponentAnnotation(name, targetCls);\n }\n\n getStore(name, targetCls) {\n return new StoreAnnotation(name, targetCls);\n }\n\n getActions(name, targetCls) {\n return new ActionsAnnotation(name, targetCls);\n }\n}\n\nexport const Annotations = new AnnotationsFactory();\nexport default Annotations;\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/annotations.js"],"names":[],"mappings":";;;;;;;;;;;MAKa,gBAAgB;AAChB,aADA,gBAAgB,GACb;4BADH,gBAAgB;;AAEzB,UAAI,CAAC,KAAK,EAAE,CAAC;KACd;;iBAHU,gBAAgB;;aAKtB,iBAAG;AACN,YAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;AACzB,YAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;AAC9B,YAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,YAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;OACzB;;;aAES,oBAAC,IAAI,EAAE,SAAS,EAAE;AAC1B,YAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,YAAI,CAAC,OAAO,EAAE;AACZ,iBAAO,GAAG,aAjBR,iBAAiB,CAiBa,IAAI,EAAE,SAAS,CAAC,CAAC;AACjD,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACjC;AACD,eAAO,OAAO,CAAC;OAChB;;;aAEa,wBAAC,IAAI,EAAE,SAAS,EAAE;AAC9B,YAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9C,YAAI,CAAC,WAAW,EAAE;AAChB,qBAAW,GAAG,iBA7BZ,qBAAqB,CA6BiB,IAAI,EAAE,SAAS,CAAC,CAAC;AACzD,cAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;SAC1C;AACD,eAAO,WAAW,CAAC;OACpB;;;aAEW,sBAAC,IAAI,EAAE,SAAS,EAAE;AAC5B,YAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1C,YAAI,CAAC,SAAS,EAAE;AACd,mBAAS,GAAG,eArCV,mBAAmB,CAqCe,IAAI,EAAE,SAAS,CAAC,CAAC;AACrD,cAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SACtC;AACD,eAAO,SAAS,CAAC;OAClB;;;aAEO,kBAAC,IAAI,EAAE,SAAS,EAAE;AACxB,YAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,YAAI,CAAC,KAAK,EAAE;AACV,eAAK,GAAG,WA7CN,eAAe,CA6CW,IAAI,EAAE,SAAS,CAAC,CAAC;AAC7C,cAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SAC9B;AACD,eAAO,KAAK,CAAC;OACd;;;WA9CU,gBAAgB;;;;AAgDtB,MAAM,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAC;;uBACnC,WAAW","file":"annotations.js","sourcesContent":["import {ApplicationAnnotation} from './application';\nimport {ComponentAnnotation} from './component';\nimport {StoreAnnotation} from './store';\nimport {ActionsAnnotation} from './actions';\n\nexport class AnnotationsCache {\n constructor() {\n this.clear();\n }\n\n clear() {\n this.actions = new Map();\n this.applications = new Map();\n this.components = new Map();\n this.stores = new Map();\n }\n\n getActions(name, targetCls) {\n let actions = this.actions.get(name);\n if (!actions) {\n actions = new ActionsAnnotation(name, targetCls);\n this.actions.set(name, actions);\n }\n return actions;\n }\n\n getApplication(name, targetCls) {\n let application = this.applications.get(name);\n if (!application) {\n application = new ApplicationAnnotation(name, targetCls);\n this.applications.set(name, application);\n }\n return application;\n }\n\n getComponent(name, targetCls) {\n let component = this.components.get(name);\n if (!component) {\n component = new ComponentAnnotation(name, targetCls);\n this.components.set(name, component);\n }\n return component;\n }\n\n getStore(name, targetCls) {\n let store = this.stores.get(name);\n if (!store) {\n store = new StoreAnnotation(name, targetCls);\n this.stores.set(name, store);\n }\n return store;\n }\n}\nexport const Annotations = new AnnotationsCache();\nexport default Annotations;\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors.js b/dist/amd/behaviors.js new file mode 100644 index 0000000..3fd488e --- /dev/null +++ b/dist/amd/behaviors.js @@ -0,0 +1,28 @@ +define(['exports', './behaviors/behavior', './behaviors/event-emitter', './behaviors/entity-store', './behaviors/sortable-store', './behaviors/sortable-component', './behaviors/paginatable-store', './behaviors/paginatable-component', './behaviors/transformable'], function (exports, _behaviorsBehavior, _behaviorsEventEmitter, _behaviorsEntityStore, _behaviorsSortableStore, _behaviorsSortableComponent, _behaviorsPaginatableStore, _behaviorsPaginatableComponent, _behaviorsTransformable) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + function _interopExportWildcard(obj, defaults) { var newObj = defaults({}, obj); delete newObj['default']; return newObj; } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + _defaults(exports, _interopExportWildcard(_behaviorsBehavior, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsEventEmitter, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsEntityStore, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsSortableStore, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsSortableComponent, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsPaginatableStore, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsPaginatableComponent, _defaults)); + + _defaults(exports, _interopExportWildcard(_behaviorsTransformable, _defaults)); +}); +//# sourceMappingURL=behaviors.js.map diff --git a/dist/amd/behaviors.js.map b/dist/amd/behaviors.js.map new file mode 100644 index 0000000..8b110d3 --- /dev/null +++ b/dist/amd/behaviors.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"behaviors.js","sourcesContent":[]} \ No newline at end of file diff --git a/dist/amd/behaviors/behavior.js b/dist/amd/behaviors/behavior.js new file mode 100644 index 0000000..1c87263 --- /dev/null +++ b/dist/amd/behaviors/behavior.js @@ -0,0 +1,22 @@ +define(["exports"], function (exports) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var Behavior = function Behavior() { + var instance = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + var config = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + _classCallCheck(this, Behavior); + + this.instance = instance; + this.config = config; + }; + + exports.Behavior = Behavior; +}); +//# sourceMappingURL=behavior.js.map diff --git a/dist/amd/behaviors/behavior.js.map b/dist/amd/behaviors/behavior.js.map new file mode 100644 index 0000000..77c66f7 --- /dev/null +++ b/dist/amd/behaviors/behavior.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/behavior.js"],"names":[],"mappings":";;;;;;;;;MAAa,QAAQ,GACR,SADA,QAAQ,GACuB;QAA9B,QAAQ,yDAAG,IAAI;QAAE,MAAM,yDAAG,EAAE;;0BAD7B,QAAQ;;AAEjB,QAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAI,CAAC,MAAM,GAAG,MAAM,CAAC;GACtB","file":"behavior.js","sourcesContent":["export class Behavior {\n constructor(instance = null, config = {}) {\n this.instance = instance;\n this.config = config;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/entity-store.js b/dist/amd/behaviors/entity-store.js new file mode 100644 index 0000000..e6678ad --- /dev/null +++ b/dist/amd/behaviors/entity-store.js @@ -0,0 +1,391 @@ +define(['exports', 'angular', './behavior', '../store', './transformable', '../utils'], function (exports, _angular, _behavior, _store, _transformable, _utils) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + var _slice = Array.prototype.slice; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_again) { var object = _x3, property = _x4, receiver = _x5; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x3 = parent; _x4 = property; _x5 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + exports.EntityStore = EntityStore; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } + + var _angular2 = _interopRequireDefault(_angular); + + var EntityStoreBehavior = (function (_Behavior) { + _inherits(EntityStoreBehavior, _Behavior); + + function EntityStoreBehavior(instance) { + var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var idProperty = _ref.idProperty; + var collection = _ref.collection; + + _classCallCheck(this, EntityStoreBehavior); + + _get(Object.getPrototypeOf(EntityStoreBehavior.prototype), 'constructor', this).apply(this, arguments); + + this.isLoading = false; + this.isCreating = false; + this.isReading = false; + this.isUpdating = false; + this.isDeleting = false; + this.isSet = false; + this.hasDetailSet = new Set(); + this.idProperty = idProperty || 'id'; + this.collection = collection || 'items'; + this.reset(); + } + + _createClass(EntityStoreBehavior, [{ + key: 'reset', + value: function reset() { + this.loadDeferred = this.createNewDeferred(); + this.createDeferred = this.createNewDeferred(); + this.readDeferred = this.createNewDeferred(); + this.updateDeferred = this.createNewDeferred(); + this.deleteDeferred = this.createNewDeferred(); + + this.isSet = false; + this.items = []; + this.hasDetailSet.clear(); + } + }, { + key: 'createNewDeferred', + value: function createNewDeferred() { + return this.instance.$q.defer(); + } + }, { + key: 'onChanged', + value: function onChanged() { + var _instance; + + this.instance.transformables[this.collection].refresh(); + (_instance = this.instance).emit.apply(_instance, ['changed'].concat(_slice.call(arguments))); + } + }, { + key: 'onError', + value: function onError() { + var _instance2; + + (_instance2 = this.instance).emit.apply(_instance2, ['error'].concat(_slice.call(arguments))); + } + }, { + key: 'getById', + value: function getById(entityId) { + var _this = this; + + return this.items.find(function (entity) { + return entity[_this.idProperty] === entityId; + }) || null; + } + }, { + key: 'hasDetails', + value: function hasDetails(entityId) { + return this.hasDetailSet.has(entityId); + } + }, { + key: 'onLoadStarted', + value: function onLoadStarted() { + this.isLoading = true; + this.loadDeferred = this.createNewDeferred(); + } + }, { + key: 'onLoadCompleted', + value: function onLoadCompleted(entities) { + var items = this.items; + + this.isSet = true; + this.isLoading = false; + this.hasDetailSet.clear(); + + if (entities && entities.length) { + items.splice(0, items.length); + items.splice.apply(items, [0, 0].concat(_toConsumableArray(entities))); + } + + this.onChanged('load', entities); + + this.loadDeferred.resolve(entities); + } + }, { + key: 'onLoadFailed', + value: function onLoadFailed(error) { + this.isLoading = false; + + this.onError('load', error); + + this.loadDeferred.reject(error); + } + }, { + key: 'onCreateStarted', + value: function onCreateStarted() { + this.isCreating = true; + this.createDeferred = this.createNewDeferred(); + } + }, { + key: 'onCreateCompleted', + value: function onCreateCompleted(entity) { + var entityId = entity[this.idProperty]; + var currentEntity = this.getById(entityId); + + if (currentEntity) { + Object.assign(currentEntity, entity); + } else { + this.items.push(entity); + currentEntity = entity; + } + + this.isSet = true; + this.isCreating = false; + this.hasDetailSet.add(entityId); + + this.onChanged('create', currentEntity); + + this.createDeferred.resolve(currentEntity); + } + }, { + key: 'onCreateFailed', + value: function onCreateFailed(error) { + this.isCreating = false; + + this.onError('create', error); + + this.createDeferred.reject(error); + } + }, { + key: 'onReadStarted', + value: function onReadStarted() { + this.isReading = true; + this.readDeferred = this.createNewDeferred(); + } + }, { + key: 'onReadCompleted', + value: function onReadCompleted(entity) { + var entityId = entity[this.idProperty]; + var currentEntity = this.getById(entityId); + + if (currentEntity) { + Object.assign(currentEntity, entity); + } else { + this.items.push(entity); + currentEntity = entity; + } + + this.isSet = true; + this.isReading = false; + this.hasDetailSet.add(entityId); + + this.onChanged('read', currentEntity); + + this.readDeferred.resolve(entity); + } + }, { + key: 'onReadFailed', + value: function onReadFailed(error) { + this.isReading = false; + + this.onError('read', error); + + this.readDeferred.reject(error); + } + }, { + key: 'onUpdateStarted', + value: function onUpdateStarted() { + this.isUpdating = true; + this.updateDeferred = this.createNewDeferred(); + } + }, { + key: 'onUpdateCompleted', + value: function onUpdateCompleted(entity) { + var entityId = entity[this.idProperty]; + var currentEntity = this.getById(entityId); + + this.isUpdating = false; + + if (!currentEntity) { + this.updateDeferred.reject('Updated entity that is not in this store...', entity); + return; + } + + Object.assign(currentEntity, entity); + this.hasDetailSet.add(entityId); + + this.onChanged('update', currentEntity); + + this.updateDeferred.resolve(entity); + } + }, { + key: 'onUpdateFailed', + value: function onUpdateFailed(error) { + this.isUpdating = false; + + this.onError('update', error); + + this.updateDeferred.reject(error); + } + }, { + key: 'onDeleteStarted', + value: function onDeleteStarted() { + this.isDeleting = true; + this.deleteDeferred = this.createNewDeferred(); + } + }, { + key: 'onDeleteCompleted', + value: function onDeleteCompleted(entity) { + var entityId = entity[this.idProperty]; + var currentEntity = this.getById(entityId); + + this.isDeleting = false; + + if (!currentEntity) { + this.deleteDeferred.reject('Deleting entity that is not in this store...', entity); + return; + } + + this.items.splice(this.items.indexOf(currentEntity), 1); + this.hasDetailSet.add(entityId); + + this.onChanged('delete', currentEntity); + + this.deleteDeferred.resolve(entity); + } + }, { + key: 'onDeleteFailed', + value: function onDeleteFailed(error) { + this.isDeleting = false; + + this.onError('delete', error); + + this.deleteDeferred.reject(error); + } + }, { + key: 'items', + get: function get() { + return this.instance.transformables[this.collection].data; + }, + set: function set(items) { + this.instance.transformables[this.collection].data = items; + } + }, { + key: 'isEmpty', + get: function get() { + return this.isSet && !this.items.length; + } + }, { + key: 'isBusy', + get: function get() { + return Boolean(this.isLoading || this.isCreating || this.isReading || this.isUpdating || this.isDeleting); + } + }, { + key: 'loadPromise', + get: function get() { + return this.loadDeferred.promise; + } + }, { + key: 'createPromise', + get: function get() { + return this.createDeferred.promise; + } + }, { + key: 'readPromise', + get: function get() { + return this.readDeferred.promise; + } + }, { + key: 'updatePromise', + get: function get() { + return this.updateDeferred.promise; + } + }, { + key: 'deletePromise', + get: function get() { + return this.deleteDeferred.promise; + } + }]); + + return EntityStoreBehavior; + })(_behavior.Behavior); + + exports.EntityStoreBehavior = EntityStoreBehavior; + + function EntityStore() { + var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + return function (cls) { + var preparedConfig = config; + if (_angular2['default'].isString(config)) { + preparedConfig = { entity: config }; + } + + preparedConfig = Object.assign({ + actions: ['load', 'create', 'read', 'update', 'delete'], + collection: 'items', + entity: cls.name.replace(/store$/i, ''), + idProperty: 'id' + }, preparedConfig); + preparedConfig.entity = (0, _utils.camelcase)(preparedConfig.entity); + + (0, _utils.Inject)()(cls.prototype, '$q'); + (0, _transformable.Transformable)()(cls.prototype, preparedConfig.collection); + + var actionHandlers = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = preparedConfig.actions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var action = _step.value; + + var actionName = (0, _utils.camelcase)(action); + var entityAction = 'on' + preparedConfig.entity + actionName; + var startedAction = entityAction + 'Started'; + var completedAction = entityAction + 'Completed'; + var failedAction = entityAction + 'Failed'; + + actionHandlers.push(startedAction + ':on' + actionName + 'Started'); + actionHandlers.push(completedAction + ':on' + actionName + 'Completed'); + actionHandlers.push(failedAction + ':on' + actionName + 'Failed'); + + var handlerDecorate = (0, _store.Handler)(null, false); + handlerDecorate(cls.prototype, startedAction); + handlerDecorate(cls.prototype, completedAction); + handlerDecorate(cls.prototype, failedAction); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator['return']) { + _iterator['return'](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + (0, _utils.addBehavior)(cls, EntityStoreBehavior, { + property: 'entityStore', + config: preparedConfig, + proxy: ['isSet', 'isEmpty', 'isBusy', 'loadPromise', 'createPromise', 'readPromise', 'updatePromise', 'deletePromise', 'isLoading', 'isCreating', 'isReading', 'isUpdating', 'isDeleting', 'reset', 'hasDetails', 'getById'].concat(actionHandlers) + }); + }; + } +}); +//# sourceMappingURL=entity-store.js.map diff --git a/dist/amd/behaviors/entity-store.js.map b/dist/amd/behaviors/entity-store.js.map new file mode 100644 index 0000000..1a80167 --- /dev/null +++ b/dist/amd/behaviors/entity-store.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/entity-store.js"],"names":[],"mappings":"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","file":"entity-store.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {Handler as handlerDecorator} from '../store';\nimport {Transformable as transformableDecorator} from './transformable';\nimport {\n addBehavior,\n camelcase,\n Inject as injectDecorator\n} from '../utils';\n\nexport class EntityStoreBehavior extends Behavior {\n isLoading = false;\n isCreating = false;\n isReading = false;\n isUpdating = false;\n isDeleting = false;\n isSet = false;\n hasDetailSet = new Set();\n\n constructor(instance, {idProperty, collection} = {}) {\n super(...arguments);\n\n this.idProperty = idProperty || 'id';\n this.collection = collection || 'items';\n this.reset();\n }\n\n reset() {\n this.loadDeferred = this.createNewDeferred();\n this.createDeferred = this.createNewDeferred();\n this.readDeferred = this.createNewDeferred();\n this.updateDeferred = this.createNewDeferred();\n this.deleteDeferred = this.createNewDeferred();\n\n this.isSet = false;\n this.items = [];\n this.hasDetailSet.clear();\n }\n\n get items() {\n return this.instance.transformables[this.collection].data;\n }\n\n set items(items) {\n this.instance.transformables[this.collection].data = items;\n }\n\n get isEmpty() {\n return this.isSet && !this.items.length;\n }\n\n get isBusy() {\n return Boolean(this.isLoading ||\n this.isCreating ||\n this.isReading ||\n this.isUpdating ||\n this.isDeleting);\n }\n\n get loadPromise() {\n return this.loadDeferred.promise;\n }\n\n get createPromise() {\n return this.createDeferred.promise;\n }\n\n get readPromise() {\n return this.readDeferred.promise;\n }\n\n get updatePromise() {\n return this.updateDeferred.promise;\n }\n\n get deletePromise() {\n return this.deleteDeferred.promise;\n }\n\n createNewDeferred() {\n return this.instance.$q.defer();\n }\n\n onChanged() {\n this.instance.transformables[this.collection].refresh();\n this.instance.emit('changed', ...arguments);\n }\n\n onError() {\n this.instance.emit('error', ...arguments);\n }\n\n getById(entityId) {\n return this.items.find(entity => entity[this.idProperty] === entityId) || null;\n }\n\n hasDetails(entityId) {\n return this.hasDetailSet.has(entityId);\n }\n\n onLoadStarted() {\n this.isLoading = true;\n this.loadDeferred = this.createNewDeferred();\n }\n\n onLoadCompleted(entities) {\n const items = this.items;\n\n this.isSet = true;\n this.isLoading = false;\n this.hasDetailSet.clear();\n\n if (entities && entities.length) {\n items.splice(0, items.length);\n items.splice(0, 0, ...entities);\n }\n\n this.onChanged('load', entities);\n\n this.loadDeferred.resolve(entities);\n }\n\n onLoadFailed(error) {\n this.isLoading = false;\n\n this.onError('load', error);\n\n this.loadDeferred.reject(error);\n }\n\n onCreateStarted() {\n this.isCreating = true;\n this.createDeferred = this.createNewDeferred();\n }\n\n onCreateCompleted(entity) {\n const entityId = entity[this.idProperty];\n let currentEntity = this.getById(entityId);\n\n if (currentEntity) {\n Object.assign(currentEntity, entity);\n } else {\n this.items.push(entity);\n currentEntity = entity;\n }\n\n this.isSet = true;\n this.isCreating = false;\n this.hasDetailSet.add(entityId);\n\n this.onChanged('create', currentEntity);\n\n this.createDeferred.resolve(currentEntity);\n }\n\n onCreateFailed(error) {\n this.isCreating = false;\n\n this.onError('create', error);\n\n this.createDeferred.reject(error);\n }\n\n onReadStarted() {\n this.isReading = true;\n this.readDeferred = this.createNewDeferred();\n }\n\n onReadCompleted(entity) {\n const entityId = entity[this.idProperty];\n let currentEntity = this.getById(entityId);\n\n if (currentEntity) {\n Object.assign(currentEntity, entity);\n } else {\n this.items.push(entity);\n currentEntity = entity;\n }\n\n this.isSet = true;\n this.isReading = false;\n this.hasDetailSet.add(entityId);\n\n this.onChanged('read', currentEntity);\n\n this.readDeferred.resolve(entity);\n }\n\n onReadFailed(error) {\n this.isReading = false;\n\n this.onError('read', error);\n\n this.readDeferred.reject(error);\n }\n\n onUpdateStarted() {\n this.isUpdating = true;\n this.updateDeferred = this.createNewDeferred();\n }\n\n onUpdateCompleted(entity) {\n const entityId = entity[this.idProperty];\n const currentEntity = this.getById(entityId);\n\n this.isUpdating = false;\n\n if (!currentEntity) {\n this.updateDeferred.reject('Updated entity that is not in this store...', entity);\n return;\n }\n\n Object.assign(currentEntity, entity);\n this.hasDetailSet.add(entityId);\n\n this.onChanged('update', currentEntity);\n\n this.updateDeferred.resolve(entity);\n }\n\n onUpdateFailed(error) {\n this.isUpdating = false;\n\n this.onError('update', error);\n\n this.updateDeferred.reject(error);\n }\n\n onDeleteStarted() {\n this.isDeleting = true;\n this.deleteDeferred = this.createNewDeferred();\n }\n\n onDeleteCompleted(entity) {\n const entityId = entity[this.idProperty];\n const currentEntity = this.getById(entityId);\n\n this.isDeleting = false;\n\n if (!currentEntity) {\n this.deleteDeferred.reject('Deleting entity that is not in this store...', entity);\n return;\n }\n\n this.items.splice(this.items.indexOf(currentEntity), 1);\n this.hasDetailSet.add(entityId);\n\n this.onChanged('delete', currentEntity);\n\n this.deleteDeferred.resolve(entity);\n }\n\n onDeleteFailed(error) {\n this.isDeleting = false;\n\n this.onError('delete', error);\n\n this.deleteDeferred.reject(error);\n }\n}\n\nexport function EntityStore(config = {}) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {entity: config};\n }\n\n preparedConfig = Object.assign({\n actions: ['load', 'create', 'read', 'update', 'delete'],\n collection: 'items',\n entity: cls.name.replace(/store$/i, ''),\n idProperty: 'id'\n }, preparedConfig);\n preparedConfig.entity = camelcase(preparedConfig.entity);\n\n injectDecorator()(cls.prototype, '$q');\n transformableDecorator()(cls.prototype, preparedConfig.collection);\n\n const actionHandlers = [];\n for (const action of preparedConfig.actions) {\n const actionName = camelcase(action);\n const entityAction = `on${preparedConfig.entity}${actionName}`;\n const startedAction = `${entityAction}Started`;\n const completedAction = `${entityAction}Completed`;\n const failedAction = `${entityAction}Failed`;\n\n actionHandlers.push(`${startedAction}:on${actionName}Started`);\n actionHandlers.push(`${completedAction}:on${actionName}Completed`);\n actionHandlers.push(`${failedAction}:on${actionName}Failed`);\n\n const handlerDecorate = handlerDecorator(null, false);\n handlerDecorate(cls.prototype, startedAction);\n handlerDecorate(cls.prototype, completedAction);\n handlerDecorate(cls.prototype, failedAction);\n }\n\n addBehavior(cls, EntityStoreBehavior, {\n property: 'entityStore',\n config: preparedConfig,\n proxy: [\n 'isSet',\n 'isEmpty',\n 'isBusy',\n\n 'loadPromise',\n 'createPromise',\n 'readPromise',\n 'updatePromise',\n 'deletePromise',\n\n 'isLoading',\n 'isCreating',\n 'isReading',\n 'isUpdating',\n 'isDeleting',\n\n 'reset',\n 'hasDetails',\n 'getById'\n ].concat(actionHandlers)\n });\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/event-emitter.js b/dist/amd/behaviors/event-emitter.js new file mode 100644 index 0000000..1e83ad6 --- /dev/null +++ b/dist/amd/behaviors/event-emitter.js @@ -0,0 +1,117 @@ +define(['exports', './behavior', '../utils'], function (exports, _behavior, _utils) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + exports.EventEmitter = EventEmitter; + + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } + + var EventEmitterBehavior = (function (_Behavior) { + _inherits(EventEmitterBehavior, _Behavior); + + function EventEmitterBehavior() { + _classCallCheck(this, EventEmitterBehavior); + + _get(Object.getPrototypeOf(EventEmitterBehavior.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(EventEmitterBehavior, [{ + key: 'addListener', + value: function addListener(event, handler) { + var _this = this; + + var events = this.events; + if (!events.has(event)) { + events.set(event, new Set()); + } + events.get(event).add(handler); + return function () { + _this.removeListener(event, handler); + }; + } + }, { + key: 'removeListener', + value: function removeListener(event, handler) { + var events = this.events; + var eventSet = events.get(event); + if (!eventSet || !eventSet.has(handler)) { + return; + } + eventSet['delete'](handler); + if (!eventSet.size) { + events['delete'](event); + } + } + }, { + key: 'emit', + value: function emit(event) { + var events = this.events; + if (!events.has(event)) { + return; + } + + var args = Array.from(arguments).slice(1); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = events.get(event)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var handler = _step.value; + + handler.apply(undefined, _toConsumableArray(args)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator['return']) { + _iterator['return'](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + }, { + key: 'events', + get: function get() { + if (!this._events) { + this._events = new Map(); + } + return this._events; + } + }]); + + return EventEmitterBehavior; + })(_behavior.Behavior); + + exports.EventEmitterBehavior = EventEmitterBehavior; + + function EventEmitter(config) { + return function (cls) { + (0, _utils.addBehavior)(cls, EventEmitterBehavior, { + config: config, + property: 'eventEmitter', + proxy: ['on:addListener', 'off:removeListener', 'addListener', 'removeListener', 'emit'] + }); + }; + } +}); +//# sourceMappingURL=event-emitter.js.map diff --git a/dist/amd/behaviors/event-emitter.js.map b/dist/amd/behaviors/event-emitter.js.map new file mode 100644 index 0000000..0840fca --- /dev/null +++ b/dist/amd/behaviors/event-emitter.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/event-emitter.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;MAGa,oBAAoB;cAApB,oBAAoB;;aAApB,oBAAoB;4BAApB,oBAAoB;;iCAApB,oBAAoB;;;iBAApB,oBAAoB;;aAQpB,qBAAC,KAAK,EAAE,OAAO,EAAE;;;AAC1B,YAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,YAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACtB,gBAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;SAC9B;AACD,cAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/B,eAAO,YAAM;AACX,gBAAK,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SACrC,CAAC;OACH;;;aAEa,wBAAC,KAAK,EAAE,OAAO,EAAE;AAC7B,YAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,YAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,YAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACvC,iBAAO;SACR;AACD,gBAAQ,UAAO,CAAC,OAAO,CAAC,CAAC;AACzB,YAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClB,gBAAM,UAAO,CAAC,KAAK,CAAC,CAAC;SACtB;OACF;;;aAEG,cAAC,KAAK,EAAE;AACV,YAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,YAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACtB,iBAAO;SACR;;AAED,YAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;;;;;AAC5C,+BAAsB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,8HAAE;gBAA9B,OAAO;;AAChB,mBAAO,qCAAI,IAAI,EAAC,CAAC;WAClB;;;;;;;;;;;;;;;OACF;;;WAxCS,eAAG;AACX,YAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,cAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;SAC1B;AACD,eAAO,IAAI,CAAC,OAAO,CAAC;OACrB;;;WANU,oBAAoB;eAHzB,QAAQ;;;;AA+CT,WAAS,YAAY,CAAC,MAAM,EAAE;AACnC,WAAO,UAAA,GAAG,EAAI;AACZ,iBAhDI,WAAW,EAgDH,GAAG,EAAE,oBAAoB,EAAE;AACrC,cAAM,EAAN,MAAM;AACN,gBAAQ,EAAE,cAAc;AACxB,aAAK,EAAE,CACL,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,MAAM,CACP;OACF,CAAC,CAAC;KACJ,CAAC;GACH","file":"event-emitter.js","sourcesContent":["import {Behavior} from './behavior';\nimport {addBehavior} from '../utils';\n\nexport class EventEmitterBehavior extends Behavior {\n get events() {\n if (!this._events) {\n this._events = new Map();\n }\n return this._events;\n }\n\n addListener(event, handler) {\n const events = this.events;\n if (!events.has(event)) {\n events.set(event, new Set());\n }\n events.get(event).add(handler);\n return () => {\n this.removeListener(event, handler);\n };\n }\n\n removeListener(event, handler) {\n const events = this.events;\n const eventSet = events.get(event);\n if (!eventSet || !eventSet.has(handler)) {\n return;\n }\n eventSet.delete(handler);\n if (!eventSet.size) {\n events.delete(event);\n }\n }\n\n emit(event) {\n const events = this.events;\n if (!events.has(event)) {\n return;\n }\n\n const args = Array.from(arguments).slice(1);\n for (const handler of events.get(event)) {\n handler(...args);\n }\n }\n}\n\nexport function EventEmitter(config) {\n return cls => {\n addBehavior(cls, EventEmitterBehavior, {\n config,\n property: 'eventEmitter',\n proxy: [\n 'on:addListener',\n 'off:removeListener',\n 'addListener',\n 'removeListener',\n 'emit'\n ]\n });\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/paginatable-component.js b/dist/amd/behaviors/paginatable-component.js new file mode 100644 index 0000000..f88c61e --- /dev/null +++ b/dist/amd/behaviors/paginatable-component.js @@ -0,0 +1,124 @@ +define(['exports', 'angular', './behavior', '../utils', '../component'], function (exports, _angular, _behavior, _utils, _component) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_again) { var object = _x3, property = _x4, receiver = _x5; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x3 = parent; _x4 = property; _x5 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + exports.PaginatableComponent = PaginatableComponent; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } + + var _angular2 = _interopRequireDefault(_angular); + + var PaginatableComponentBehavior = (function (_Behavior) { + _inherits(PaginatableComponentBehavior, _Behavior); + + function PaginatableComponentBehavior(instance) { + var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var actions = _ref.actions; + var store = _ref.store; + var initialPage = _ref.initialPage; + var initialLimit = _ref.initialLimit; + + _classCallCheck(this, PaginatableComponentBehavior); + + _get(Object.getPrototypeOf(PaginatableComponentBehavior.prototype), 'constructor', this).apply(this, arguments); + + this.actions = actions; + this.store = store; + + var className = Reflect.getPrototypeOf(instance).constructor.name; + if (!this.actionsRef) { + throw new Error('PaginatableComponentBehavior: actionsRef \'' + actions + '\' not found on ' + className); + } + if (!this.storeRef) { + throw new Error('PaginatableComponentBehavior: storeRef \'' + store + '\' not found on ' + className); + } else if (!this.storeRef.paginatableStore) { + throw new Error('PaginatableComponentBehavior: storeRef \'' + store + '\' on ' + className + ' is not paginatable'); + } + + this.page = initialPage === undefined ? 1 : initialPage; + this.limit = initialLimit === undefined ? 25 : initialLimit; + } + + _createClass(PaginatableComponentBehavior, [{ + key: 'actionsRef', + get: function get() { + return this.instance[this.actions]; + } + }, { + key: 'storeRef', + get: function get() { + return this.instance[this.store]; + } + }, { + key: 'page', + set: function set(page) { + if (page !== this.page) { + this.actionsRef.pageChange(page); + } + }, + get: function get() { + return this.storeRef.paginationState.page; + } + }, { + key: 'limit', + set: function set(limit) { + if (limit !== this.limit) { + this.actionsRef.limitChange(limit); + } + }, + get: function get() { + return this.storeRef.paginationState.limit; + } + }, { + key: 'total', + get: function get() { + return this.storeRef.paginationState.total; + } + }]); + + return PaginatableComponentBehavior; + })(_behavior.Behavior); + + exports.PaginatableComponentBehavior = PaginatableComponentBehavior; + + function PaginatableComponent() { + var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + return function (cls) { + var preparedConfig = config; + if (_angular2['default'].isString(config)) { + preparedConfig = { entity: config }; + } + + if (!preparedConfig.entity) { + preparedConfig.entity = cls.name.match(_component.COMPONENT_ENTITY_REGEX)[1].toLowerCase(); + } + if (!preparedConfig.actions) { + preparedConfig.actions = preparedConfig.entity + 'Actions'; + } + if (!preparedConfig.store) { + preparedConfig.store = preparedConfig.entity + 'Store'; + } + + (0, _utils.addBehavior)(cls, PaginatableComponentBehavior, { + property: 'pagination', + config: preparedConfig + }); + }; + } +}); +//# sourceMappingURL=paginatable-component.js.map diff --git a/dist/amd/behaviors/paginatable-component.js.map b/dist/amd/behaviors/paginatable-component.js.map new file mode 100644 index 0000000..4f984f3 --- /dev/null +++ b/dist/amd/behaviors/paginatable-component.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/paginatable-component.js"],"names":[],"mappings":"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","file":"paginatable-component.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {addBehavior} from '../utils';\nimport {COMPONENT_ENTITY_REGEX} from '../component';\n\nexport class PaginatableComponentBehavior extends Behavior {\n constructor(instance, {actions, store, initialPage, initialLimit} = {}) {\n super(...arguments);\n\n this.actions = actions;\n this.store = store;\n\n const className = Reflect.getPrototypeOf(instance).constructor.name;\n if (!this.actionsRef) {\n throw new Error(`PaginatableComponentBehavior: actionsRef '${actions}' not found on ${className}`);\n }\n if (!this.storeRef) {\n throw new Error(`PaginatableComponentBehavior: storeRef '${store}' not found on ${className}`);\n } else if (!this.storeRef.paginatableStore) {\n throw new Error(`PaginatableComponentBehavior: storeRef '${store}' on ${className} is not paginatable`);\n }\n\n this.page = initialPage === undefined ? 1 : initialPage;\n this.limit = initialLimit === undefined ? 25 : initialLimit;\n }\n\n get actionsRef() {\n return this.instance[this.actions];\n }\n get storeRef() {\n return this.instance[this.store];\n }\n\n set page(page) {\n if (page !== this.page) {\n this.actionsRef.pageChange(page);\n }\n }\n set limit(limit) {\n if (limit !== this.limit) {\n this.actionsRef.limitChange(limit);\n }\n }\n\n get page() {\n return this.storeRef.paginationState.page;\n }\n get limit() {\n return this.storeRef.paginationState.limit;\n }\n get total() {\n return this.storeRef.paginationState.total;\n }\n}\n\nexport function PaginatableComponent(config = {}) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {entity: config};\n }\n\n if (!preparedConfig.entity) {\n preparedConfig.entity = cls.name.match(COMPONENT_ENTITY_REGEX)[1].toLowerCase();\n }\n if (!preparedConfig.actions) {\n preparedConfig.actions = `${preparedConfig.entity}Actions`;\n }\n if (!preparedConfig.store) {\n preparedConfig.store = `${preparedConfig.entity}Store`;\n }\n\n addBehavior(cls, PaginatableComponentBehavior, {\n property: 'pagination',\n config: preparedConfig\n });\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/paginatable-store.js b/dist/amd/behaviors/paginatable-store.js new file mode 100644 index 0000000..14559fc --- /dev/null +++ b/dist/amd/behaviors/paginatable-store.js @@ -0,0 +1,155 @@ +define(['exports', 'angular', './behavior', '../store', './transformable', '../utils'], function (exports, _angular, _behavior, _store, _transformable, _utils) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_again) { var object = _x4, property = _x5, receiver = _x6; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x4 = parent; _x5 = property; _x6 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + exports.PaginatableStore = PaginatableStore; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _angular2 = _interopRequireDefault(_angular); + + var PaginationState = function PaginationState() { + var page = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0]; + var limit = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + _classCallCheck(this, PaginationState); + + this.total = 0; + + this.page = page; + this.limit = limit; + }; + + exports.PaginationState = PaginationState; + + var PaginatableStoreBehavior = (function (_Behavior) { + _inherits(PaginatableStoreBehavior, _Behavior); + + function PaginatableStoreBehavior(instance) { + var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var collection = _ref.collection; + var initialPage = _ref.initialPage; + var initialLimit = _ref.initialLimit; + + _classCallCheck(this, PaginatableStoreBehavior); + + _get(Object.getPrototypeOf(PaginatableStoreBehavior.prototype), 'constructor', this).apply(this, arguments); + + this.collection = collection || 'items'; + this.state = new PaginationState(initialPage, initialLimit); + + this.refresh(); + } + + _createClass(PaginatableStoreBehavior, [{ + key: 'refresh', + value: function refresh() { + var collection = this.transformableCollection; + var limit = this.state.limit; + + if (collection.transformers.indexOf(this.transformer) >= 0) { + if (limit === null) { + collection.removeTransformer(this.transformer); + } else { + collection.refresh(); + } + } else if (limit !== null) { + collection.addTransformer(this.transformer); + } + } + }, { + key: 'onPageChange', + value: function onPageChange(page) { + if (this.state.page !== page) { + this.state.page = Math.max(0, page); + this.refresh(); + } + } + }, { + key: 'onLimitChange', + value: function onLimitChange(limit) { + if (this.state.limit !== limit) { + this.state.limit = limit; + this.refresh(); + } + } + }, { + key: 'transformableCollection', + get: function get() { + return this.instance.transformables[this.collection]; + } + }, { + key: 'transformer', + get: function get() { + var _this = this; + + if (!this._transformer) { + (function () { + var state = _this.state; + _this._transformer = new _transformable.Transformer('paginatableStore', function (items) { + // We update the total based on the amount of items we get + // when this transformer is run. This means that if there is + // a filtering transformer before the pagination filter, those + // items will not count to the total property. + state.total = items.length; + + var limit = state.limit; + var start = (state.page - 1) * limit; + var end = Math.min(state.total, start + limit); + + return items.slice(start, end); + }); + })(); + } + + return this._transformer; + } + }]); + + return PaginatableStoreBehavior; + })(_behavior.Behavior); + + exports.PaginatableStoreBehavior = PaginatableStoreBehavior; + + function PaginatableStore(config) { + return function (cls) { + var preparedConfig = config; + if (_angular2['default'].isString(config)) { + preparedConfig = { entity: config }; + } + + preparedConfig = Object.assign({ + collection: 'items', + entity: cls.name.replace(/store$/i, '') + }, preparedConfig); + + (0, _transformable.Transformable)()(cls.prototype, preparedConfig.collection); + + var pageChangeHandlerName = 'on' + (0, _utils.camelcase)(preparedConfig.entity) + 'PageChange'; + var limitChangeHandlerName = 'on' + (0, _utils.camelcase)(preparedConfig.entity) + 'LimitChange'; + (0, _store.Handler)(null, false)(cls.prototype, pageChangeHandlerName); + (0, _store.Handler)(null, false)(cls.prototype, limitChangeHandlerName); + + (0, _utils.addBehavior)(cls, PaginatableStoreBehavior, { + property: 'paginatableStore', + config: preparedConfig, + proxy: [pageChangeHandlerName + ':onPageChange', limitChangeHandlerName + ':onLimitChange', 'paginationState:state'] + }); + }; + } +}); +//# sourceMappingURL=paginatable-store.js.map diff --git a/dist/amd/behaviors/paginatable-store.js.map b/dist/amd/behaviors/paginatable-store.js.map new file mode 100644 index 0000000..395b4be --- /dev/null +++ b/dist/amd/behaviors/paginatable-store.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/paginatable-store.js"],"names":[],"mappings":"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","file":"paginatable-store.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {Handler as handlerDecorator} from '../store';\n\nimport {\n Transformer,\n Transformable as transformableDecorator\n} from './transformable';\n\nimport {\n addBehavior,\n camelcase\n} from '../utils';\n\nexport class PaginationState {\n total = 0;\n constructor(page = 1, limit = null) {\n this.page = page;\n this.limit = limit;\n }\n}\n\nexport class PaginatableStoreBehavior extends Behavior {\n constructor(instance, {collection, initialPage, initialLimit} = {}) {\n super(...arguments);\n\n this.collection = collection || 'items';\n this.state = new PaginationState(initialPage, initialLimit);\n\n this.refresh();\n }\n\n get transformableCollection() {\n return this.instance.transformables[this.collection];\n }\n\n get transformer() {\n if (!this._transformer) {\n const state = this.state;\n this._transformer = new Transformer('paginatableStore', items => {\n // We update the total based on the amount of items we get\n // when this transformer is run. This means that if there is\n // a filtering transformer before the pagination filter, those\n // items will not count to the total property.\n state.total = items.length;\n\n const limit = state.limit;\n const start = (state.page - 1) * limit;\n const end = Math.min(state.total, start + limit);\n\n return items.slice(start, end);\n });\n }\n\n return this._transformer;\n }\n\n refresh() {\n const collection = this.transformableCollection;\n const limit = this.state.limit;\n\n if (collection.transformers.indexOf(this.transformer) >= 0) {\n if (limit === null) {\n collection.removeTransformer(this.transformer);\n } else {\n collection.refresh();\n }\n } else if (limit !== null) {\n collection.addTransformer(this.transformer);\n }\n }\n\n onPageChange(page) {\n if (this.state.page !== page) {\n this.state.page = Math.max(0, page);\n this.refresh();\n }\n }\n\n onLimitChange(limit) {\n if (this.state.limit !== limit) {\n this.state.limit = limit;\n this.refresh();\n }\n }\n}\n\nexport function PaginatableStore(config) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {entity: config};\n }\n\n preparedConfig = Object.assign({\n collection: 'items',\n entity: cls.name.replace(/store$/i, '')\n }, preparedConfig);\n\n transformableDecorator()(cls.prototype, preparedConfig.collection);\n\n const pageChangeHandlerName = `on${camelcase(preparedConfig.entity)}PageChange`;\n const limitChangeHandlerName = `on${camelcase(preparedConfig.entity)}LimitChange`;\n handlerDecorator(null, false)(cls.prototype, pageChangeHandlerName);\n handlerDecorator(null, false)(cls.prototype, limitChangeHandlerName);\n\n addBehavior(cls, PaginatableStoreBehavior, {\n property: 'paginatableStore',\n config: preparedConfig,\n proxy: [\n `${pageChangeHandlerName}:onPageChange`,\n `${limitChangeHandlerName}:onLimitChange`,\n `paginationState:state`\n ]\n });\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/sortable-component.js b/dist/amd/behaviors/sortable-component.js new file mode 100644 index 0000000..6e84ad8 --- /dev/null +++ b/dist/amd/behaviors/sortable-component.js @@ -0,0 +1,98 @@ +define(['exports', 'angular', './behavior', '../utils', '../component'], function (exports, _angular, _behavior, _utils, _component) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_again) { var object = _x3, property = _x4, receiver = _x5; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x3 = parent; _x4 = property; _x5 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + exports.SortableComponent = SortableComponent; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } + + var _angular2 = _interopRequireDefault(_angular); + + var SortableComponentBehavior = (function (_Behavior) { + _inherits(SortableComponentBehavior, _Behavior); + + function SortableComponentBehavior(instance) { + var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var actions = _ref.actions; + var initial = _ref.initial; + + _classCallCheck(this, SortableComponentBehavior); + + _get(Object.getPrototypeOf(SortableComponentBehavior.prototype), 'constructor', this).apply(this, arguments); + + this.actions = actions; + + if (!this.actionsRef) { + var className = Reflect.getPrototypeOf(instance).constructor.name; + throw new Error('SortableComponentBehavior: \'' + actions + '\' not found on ' + className); + } + + if (initial) { + this.sortExpression = initial; + } + } + + _createClass(SortableComponentBehavior, [{ + key: 'actionsRef', + get: function get() { + return this.instance[this.actions]; + } + }, { + key: 'sortExpression', + set: function set(sortExpression) { + this._sortExpression = sortExpression; + if (sortExpression === null) { + this.actionsRef.sortClear(); + } else { + this.actionsRef.sortChange(sortExpression); + } + }, + get: function get() { + return this._sortExpression || null; + } + }]); + + return SortableComponentBehavior; + })(_behavior.Behavior); + + exports.SortableComponentBehavior = SortableComponentBehavior; + + function SortableComponent() { + var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + return function (cls) { + var preparedConfig = config; + if (_angular2['default'].isString(config)) { + preparedConfig = { actions: config }; + } + + if (!preparedConfig.entity) { + preparedConfig.entity = cls.name.match(_component.COMPONENT_ENTITY_REGEX)[1].toLowerCase(); + } + if (!preparedConfig.actions) { + preparedConfig.actions = preparedConfig.entity.toLowerCase() + 'Actions'; + } + + (0, _utils.addBehavior)(cls, SortableComponentBehavior, { + property: 'sortableComponent', + config: preparedConfig, + proxy: ['sortExpression'] + }); + }; + } +}); +//# sourceMappingURL=sortable-component.js.map diff --git a/dist/amd/behaviors/sortable-component.js.map b/dist/amd/behaviors/sortable-component.js.map new file mode 100644 index 0000000..d4a2706 --- /dev/null +++ b/dist/amd/behaviors/sortable-component.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/sortable-component.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;MAKa,yBAAyB;cAAzB,yBAAyB;;AACzB,aADA,yBAAyB,CACxB,QAAQ,EAA2B;uEAAJ,EAAE;;UAAtB,OAAO,QAAP,OAAO;UAAE,OAAO,QAAP,OAAO;;4BAD5B,yBAAyB;;AAElC,iCAFS,yBAAyB,8CAEzB,SAAS,EAAE;;AAEpB,UAAI,CAAC,OAAO,GAAG,OAAO,CAAC;;AAEvB,UAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;AACpE,cAAM,IAAI,KAAK,mCAAgC,OAAO,wBAAkB,SAAS,CAAG,CAAC;OACtF;;AAED,UAAI,OAAO,EAAE;AACX,YAAI,CAAC,cAAc,GAAG,OAAO,CAAC;OAC/B;KACF;;iBAdU,yBAAyB;;WAgBtB,eAAG;AACf,eAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;OACpC;;;WAEiB,aAAC,cAAc,EAAE;AACjC,YAAI,CAAC,eAAe,GAAG,cAAc,CAAC;AACtC,YAAI,cAAc,KAAK,IAAI,EAAE;AAC3B,cAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;SAC7B,MAAM;AACL,cAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;SAC5C;OACF;WAEiB,eAAG;AACnB,eAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;OACrC;;;WA/BU,yBAAyB;eAJ9B,QAAQ;;;;AAsCT,WAAS,iBAAiB,GAAc;QAAb,MAAM,yDAAG,EAAE;;AAC3C,WAAO,UAAA,GAAG,EAAI;AACZ,UAAI,cAAc,GAAG,MAAM,CAAC;AAC5B,UAAI,qBAAQ,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC5B,sBAAc,GAAG,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC;OACpC;;AAED,UAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AAC1B,sBAAc,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,YA5CpC,sBAAsB,CA4CsC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;OACjF;AACD,UAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC3B,sBAAc,CAAC,OAAO,GAAM,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,YAAS,CAAC;OAC1E;;AAED,iBAnDI,WAAW,EAmDH,GAAG,EAAE,yBAAyB,EAAE;AAC1C,gBAAQ,EAAE,mBAAmB;AAC7B,cAAM,EAAE,cAAc;AACtB,aAAK,EAAE,CAAC,gBAAgB,CAAC;OAC1B,CAAC,CAAC;KACJ,CAAC;GACH","file":"sortable-component.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {addBehavior} from '../utils';\nimport {COMPONENT_ENTITY_REGEX} from '../component';\n\nexport class SortableComponentBehavior extends Behavior {\n constructor(instance, {actions, initial} = {}) {\n super(...arguments);\n\n this.actions = actions;\n\n if (!this.actionsRef) {\n const className = Reflect.getPrototypeOf(instance).constructor.name;\n throw new Error(`SortableComponentBehavior: '${actions}' not found on ${className}`);\n }\n\n if (initial) {\n this.sortExpression = initial;\n }\n }\n\n get actionsRef() {\n return this.instance[this.actions];\n }\n\n set sortExpression(sortExpression) {\n this._sortExpression = sortExpression;\n if (sortExpression === null) {\n this.actionsRef.sortClear();\n } else {\n this.actionsRef.sortChange(sortExpression);\n }\n }\n\n get sortExpression() {\n return this._sortExpression || null;\n }\n}\n\nexport function SortableComponent(config = {}) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {actions: config};\n }\n\n if (!preparedConfig.entity) {\n preparedConfig.entity = cls.name.match(COMPONENT_ENTITY_REGEX)[1].toLowerCase();\n }\n if (!preparedConfig.actions) {\n preparedConfig.actions = `${preparedConfig.entity.toLowerCase()}Actions`;\n }\n\n addBehavior(cls, SortableComponentBehavior, {\n property: 'sortableComponent',\n config: preparedConfig,\n proxy: ['sortExpression']\n });\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/sortable-store.js b/dist/amd/behaviors/sortable-store.js new file mode 100644 index 0000000..43896d0 --- /dev/null +++ b/dist/amd/behaviors/sortable-store.js @@ -0,0 +1,149 @@ +define(['exports', 'angular', './behavior', '../store', './transformable', '../utils'], function (exports, _angular, _behavior, _store, _transformable, _utils) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_again) { var object = _x3, property = _x4, receiver = _x5; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x3 = parent; _x4 = property; _x5 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + exports.SortableStore = SortableStore; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } + + var _angular2 = _interopRequireDefault(_angular); + + var SortableStoreBehavior = (function (_Behavior) { + _inherits(SortableStoreBehavior, _Behavior); + + function SortableStoreBehavior(instance) { + var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var collection = _ref.collection; + + _classCallCheck(this, SortableStoreBehavior); + + _get(Object.getPrototypeOf(SortableStoreBehavior.prototype), 'constructor', this).apply(this, arguments); + + this.collection = collection || 'items'; + } + + _createClass(SortableStoreBehavior, [{ + key: 'onSortChange', + + /** + * This is a handler proxy for the Store. It get's called with the payload of + * the ENTITY_SORT_CHANGE action. + * + * @param {String/Array/Boolean} expression + * This can be any valid angular orderBy $filter expression, or a reverse boolean + * if the collection we are sorting contains primitives. + * + * Valid angular orderBy $filter expressions are + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `===`, `>` operator. + * - `string`: An Angular expression. The result of this expression is used to compare elements + * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by + * 3 first characters of a property called `name`). The result of a constant expression + * is interpreted as a property name to be used in comparisons (for example `"special name"` + * to sort object by the value of their `special name` property). An expression can be + * optionally prefixed with `+` or `-` to control ascending or descending sort order + * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array + * element itself is used to compare where sorting. + * - `Array`: An array of string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + */ + value: function onSortChange() { + var _this = this; + + var expression = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0]; + + var collection = this.transformableCollection; + var transformer = this.transformer; + + var orderByExpression = expression; + if (typeof expression === 'boolean') { + orderByExpression = expression ? '-' : '+'; + } + + transformer.fn = function (items) { + return _this.$filter('orderBy')(items, orderByExpression); + }; + + if (collection.transformers.indexOf(transformer) >= 0) { + collection.refresh(); + } else { + collection.addTransformer(transformer); + } + } + }, { + key: 'onSortClear', + value: function onSortClear() { + this.transformableCollection.removeTransformer(this.transformer); + } + }, { + key: '$filter', + get: function get() { + return this.instance.$filter; + } + }, { + key: 'transformableCollection', + get: function get() { + return this.instance.transformables[this.collection]; + } + }, { + key: 'transformer', + get: function get() { + if (!this._transformer) { + this._transformer = new _transformable.Transformer('sortableStore', function (items) { + return items; + }); + } + return this._transformer; + } + }]); + + return SortableStoreBehavior; + })(_behavior.Behavior); + + exports.SortableStoreBehavior = SortableStoreBehavior; + + function SortableStore(config) { + return function (cls) { + var preparedConfig = config; + if (_angular2['default'].isString(config)) { + preparedConfig = { entity: config }; + } + + preparedConfig = Object.assign({ + collection: 'items', + entity: cls.name.replace(/store$/i, '') + }, preparedConfig); + preparedConfig.entity = (0, _utils.camelcase)(preparedConfig.entity); + + (0, _utils.Inject)()(cls.prototype, '$filter'); + (0, _transformable.Transformable)()(cls.prototype, preparedConfig.collection); + + var changeHandlerName = 'on' + preparedConfig.entity + 'SortChange'; + var clearHandlerName = 'on' + preparedConfig.entity + 'SortClear'; + (0, _store.Handler)(null, false)(cls.prototype, changeHandlerName); + (0, _store.Handler)(null, false)(cls.prototype, clearHandlerName); + + (0, _utils.addBehavior)(cls, SortableStoreBehavior, { + property: 'sortableStore', + config: preparedConfig, + proxy: [changeHandlerName + ':onSortChange', clearHandlerName + ':onSortClear'] + }); + }; + } +}); +//# sourceMappingURL=sortable-store.js.map diff --git a/dist/amd/behaviors/sortable-store.js.map b/dist/amd/behaviors/sortable-store.js.map new file mode 100644 index 0000000..74c4a77 --- /dev/null +++ b/dist/amd/behaviors/sortable-store.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/sortable-store.js"],"names":[],"mappings":"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","file":"sortable-store.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {Handler as handlerDecorator} from '../store';\n\nimport {\n Transformer,\n Transformable as transformableDecorator\n} from './transformable';\n\nimport {\n addBehavior,\n camelcase,\n Inject as injectDecorator\n} from '../utils';\n\nexport class SortableStoreBehavior extends Behavior {\n constructor(instance, {collection} = {}) {\n super(...arguments);\n\n this.collection = collection || 'items';\n }\n\n get $filter() {\n return this.instance.$filter;\n }\n\n get transformableCollection() {\n return this.instance.transformables[this.collection];\n }\n\n get transformer() {\n if (!this._transformer) {\n this._transformer = new Transformer('sortableStore', items => items);\n }\n return this._transformer;\n }\n\n /**\n * This is a handler proxy for the Store. It get's called with the payload of\n * the ENTITY_SORT_CHANGE action.\n *\n * @param {String/Array/Boolean} expression\n * This can be any valid angular orderBy $filter expression, or a reverse boolean\n * if the collection we are sorting contains primitives.\n *\n * Valid angular orderBy $filter expressions are\n *\n * - `function`: Getter function. The result of this function will be sorted using the\n * `<`, `===`, `>` operator.\n * - `string`: An Angular expression. The result of this expression is used to compare elements\n * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by\n * 3 first characters of a property called `name`). The result of a constant expression\n * is interpreted as a property name to be used in comparisons (for example `\"special name\"`\n * to sort object by the value of their `special name` property). An expression can be\n * optionally prefixed with `+` or `-` to control ascending or descending sort order\n * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array\n * element itself is used to compare where sorting.\n * - `Array`: An array of string predicates. The first predicate in the array\n * is used for sorting, but when two items are equivalent, the next predicate is used.\n */\n onSortChange(expression = false) {\n const collection = this.transformableCollection;\n const transformer = this.transformer;\n\n let orderByExpression = expression;\n if (typeof expression === 'boolean') {\n orderByExpression = expression ? '-' : '+';\n }\n\n transformer.fn = items => {\n return this.$filter('orderBy')(items, orderByExpression);\n };\n\n if (collection.transformers.indexOf(transformer) >= 0) {\n collection.refresh();\n } else {\n collection.addTransformer(transformer);\n }\n }\n\n onSortClear() {\n this.transformableCollection.removeTransformer(this.transformer);\n }\n}\n\nexport function SortableStore(config) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {entity: config};\n }\n\n preparedConfig = Object.assign({\n collection: 'items',\n entity: cls.name.replace(/store$/i, '')\n }, preparedConfig);\n preparedConfig.entity = camelcase(preparedConfig.entity);\n\n injectDecorator()(cls.prototype, '$filter');\n transformableDecorator()(cls.prototype, preparedConfig.collection);\n\n const changeHandlerName = `on${preparedConfig.entity}SortChange`;\n const clearHandlerName = `on${preparedConfig.entity}SortClear`;\n handlerDecorator(null, false)(cls.prototype, changeHandlerName);\n handlerDecorator(null, false)(cls.prototype, clearHandlerName);\n\n addBehavior(cls, SortableStoreBehavior, {\n property: 'sortableStore',\n config: preparedConfig,\n proxy: [\n `${changeHandlerName}:onSortChange`,\n `${clearHandlerName}:onSortClear`\n ]\n });\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/behaviors/transformable.js b/dist/amd/behaviors/transformable.js new file mode 100644 index 0000000..c4cc5f0 --- /dev/null +++ b/dist/amd/behaviors/transformable.js @@ -0,0 +1,176 @@ +define(['exports', '../utils'], function (exports, _utils) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + exports.Transformable = Transformable; + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var Transformer = (function () { + function Transformer(name, fn) { + _classCallCheck(this, Transformer); + + this.name = name; + this.fn = fn; + } + + _createClass(Transformer, [{ + key: 'exec', + value: function exec(value) { + return this.fn(value); + } + }]); + + return Transformer; + })(); + + exports.Transformer = Transformer; + + var TransformableCollection = (function () { + function TransformableCollection() { + _classCallCheck(this, TransformableCollection); + + this.transformed = []; + this.transformers = []; + } + + _createClass(TransformableCollection, [{ + key: 'addTransformer', + value: function addTransformer(transformer) { + this.insertTransformer(this.transformers.length, transformer); + } + }, { + key: 'insertTransformer', + value: function insertTransformer(index, transformer) { + if (this.transformers.indexOf(transformer) === -1) { + this.transformers.splice(index, 0, transformer); + this.refresh(); + } + } + }, { + key: 'removeTransformer', + value: function removeTransformer(transformer) { + var index = this.transformers.indexOf(transformer); + if (index >= 0) { + this.transformers.splice(index, 1); + this.refresh(); + } + } + }, { + key: 'clearTransformers', + value: function clearTransformers() { + this.transformers.splice(0, this.transformers.length); + this.refresh(); + } + }, { + key: 'refresh', + value: function refresh() { + var transformed = this.data.slice(); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this.transformers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var transformer = _step.value; + + transformed = transformer.exec(transformed); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator['return']) { + _iterator['return'](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + this.transformed = transformed; + } + }, { + key: 'data', + set: function set(data) { + this._data = data; + this.refresh(); + }, + get: function get() { + if (!this._data) { + this._data = []; + } + return this._data; + } + }]); + + return TransformableCollection; + })(); + + exports.TransformableCollection = TransformableCollection; + + function Transformable() { + return function (cls, propertyName) { + var transformableDescriptor = { + get: function get() { + return this.transformables[propertyName].transformed; + }, + set: function set(data) { + this.transformables[propertyName].data = data; + } + }; + + (0, _utils.addStaticGetterArrayMember)(cls.constructor, 'transformers', propertyName); + + if (!Reflect.getOwnPropertyDescriptor(cls, 'transformables')) { + Reflect.defineProperty(cls, 'transformables', { + get: function get() { + if (!this._transformables) { + this._transformables = {}; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = cls.constructor.transformers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var transformer = _step2.value; + + this._transformables[transformer] = new TransformableCollection(); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2['return']) { + _iterator2['return'](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + return this._transformables; + } + }); + } + + if (!Reflect.getOwnPropertyDescriptor(cls, propertyName)) { + Reflect.defineProperty(cls, propertyName, transformableDescriptor); + } + + return transformableDescriptor; + }; + } +}); +//# sourceMappingURL=transformable.js.map diff --git a/dist/amd/behaviors/transformable.js.map b/dist/amd/behaviors/transformable.js.map new file mode 100644 index 0000000..554017f --- /dev/null +++ b/dist/amd/behaviors/transformable.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/behaviors/transformable.js"],"names":[],"mappings":"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","file":"transformable.js","sourcesContent":["import {addStaticGetterArrayMember} from '../utils';\n\nexport class Transformer {\n constructor(name, fn) {\n this.name = name;\n this.fn = fn;\n }\n\n exec(value) {\n return this.fn(value);\n }\n}\n\nexport class TransformableCollection {\n transformed = [];\n transformers = [];\n\n set data(data) {\n this._data = data;\n this.refresh();\n }\n\n get data() {\n if (!this._data) {\n this._data = [];\n }\n return this._data;\n }\n\n addTransformer(transformer) {\n this.insertTransformer(this.transformers.length, transformer);\n }\n\n insertTransformer(index, transformer) {\n if (this.transformers.indexOf(transformer) === -1) {\n this.transformers.splice(index, 0, transformer);\n this.refresh();\n }\n }\n\n removeTransformer(transformer) {\n const index = this.transformers.indexOf(transformer);\n if (index >= 0) {\n this.transformers.splice(index, 1);\n this.refresh();\n }\n }\n\n clearTransformers() {\n this.transformers.splice(0, this.transformers.length);\n this.refresh();\n }\n\n refresh() {\n let transformed = this.data.slice();\n for (const transformer of this.transformers) {\n transformed = transformer.exec(transformed);\n }\n this.transformed = transformed;\n }\n}\n\nexport function Transformable() {\n return (cls, propertyName) => {\n const transformableDescriptor = {\n get() {\n return this.transformables[propertyName].transformed;\n },\n set(data) {\n this.transformables[propertyName].data = data;\n }\n };\n\n addStaticGetterArrayMember(cls.constructor, 'transformers', propertyName);\n\n if (!Reflect.getOwnPropertyDescriptor(cls, 'transformables')) {\n Reflect.defineProperty(cls, 'transformables', {\n get() {\n if (!this._transformables) {\n this._transformables = {};\n for (const transformer of cls.constructor.transformers) {\n this._transformables[transformer] = new TransformableCollection();\n }\n }\n return this._transformables;\n }\n });\n }\n\n if (!Reflect.getOwnPropertyDescriptor(cls, propertyName)) {\n Reflect.defineProperty(cls, propertyName, transformableDescriptor);\n }\n\n return transformableDescriptor;\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/component.js b/dist/amd/component.js index 0014cb4..9364edd 100644 --- a/dist/amd/component.js +++ b/dist/amd/component.js @@ -25,6 +25,10 @@ define(['exports', 'angular', './annotation', './annotations', './utils'], funct var _angular2 = _interopRequireDefault(_angular); + var COMPONENT_ENTITY_REGEX = /^([A-Z][a-z]*)/; + + exports.COMPONENT_ENTITY_REGEX = COMPONENT_ENTITY_REGEX; + var ComponentEvent = (function () { function ComponentEvent() { _classCallCheck(this, ComponentEvent); @@ -82,10 +86,10 @@ define(['exports', 'angular', './annotation', './annotations', './utils'], funct if (flags) { Object.keys(flags).forEach(function (flag) { - var flagBinding = '_' + flag + 'Flag'; + var property = '_' + flag + 'Flag'; Reflect.defineProperty(_this, flag, { get: function get() { - return _angular2['default'].isDefined(_this[flagBinding]) ? _this[flagBinding] !== 'false' : false; + return _angular2['default'].isDefined(_this[property]) ? _this[property] !== 'false' : false; } }); }); diff --git a/dist/amd/component.js.map b/dist/amd/component.js.map index 507187c..3e21c99 100644 --- a/dist/amd/component.js.map +++ b/dist/amd/component.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/component.js"],"names":[],"mappings":"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","file":"component.js","sourcesContent":["import angular from 'angular';\n\nimport {Annotation} from './annotation';\nimport {Annotations} from './annotations';\n\nimport {addStaticGetterObjectMember, addStaticGetter} from './utils';\n\nexport class ComponentEvent {\n expression = null;\n fire(locals) {\n this.expression(locals);\n }\n}\n\nexport class ComponentAnnotation extends Annotation {\n get controllerCls() {\n const annotation = this;\n const TargetCls = this.targetCls;\n const flags = this.flags;\n\n class ControllerCls extends TargetCls {\n constructor($scope, $log) {\n const injected = Array.from(arguments).slice(2);\n\n super(...injected);\n\n annotation.applyInjectionBindings(this, injected);\n annotation.applyDecorators(this);\n\n if (flags) {\n Object.keys(flags).forEach(flag => {\n const flagBinding = `_${flag}Flag`;\n Reflect.defineProperty(this, flag, {\n get: () => angular.isDefined(this[flagBinding]) ? this[flagBinding] !== 'false' : false\n });\n });\n }\n\n if (this.onDestroy instanceof Function) {\n $scope.$on('$destroy', this.onDestroy.bind(this));\n }\n\n if (this.activate instanceof Function) {\n this.activate();\n }\n\n this.fireComponentEvent = (event, locals) => {\n $log.warn(`\n Component.fireComponentEvent() has been deprecated in Anglue 1.x.\n Please use @Event() myEvent; in combination with this.myEvent.fire().\n `);\n if (this._eventHandlers && this._eventHandlers[event]) {\n Reflect.apply(this._eventHandlers[event], this, [locals]);\n }\n };\n }\n }\n\n return ControllerCls;\n }\n\n getInjectionTokens() {\n return ['$scope', '$log'].concat(super.getInjectionTokens());\n }\n\n get dependencies() {\n const targetCls = this.targetCls;\n return [].concat(\n targetCls.dependencies || [],\n Annotation.getModuleNames(targetCls.components)\n );\n }\n\n get template() {\n return this.targetCls.template || null;\n }\n\n get bindings() {\n return this.targetCls.bindings || null;\n }\n\n get events() {\n return this.targetCls.events || null;\n }\n\n get flags() {\n return this.targetCls.flags || null;\n }\n\n //noinspection InfiniteRecursionJS\n get getDirective() {\n return this.targetCls.getDirective || function(config) {\n return function() {\n return config;\n };\n };\n }\n\n get module() {\n if (!this._module) {\n const name = this.name;\n const template = this.template;\n const bindings = this.bindings;\n const events = this.events;\n\n this._module = angular.module(\n `components.${name}`,\n this.dependencies\n );\n\n const directiveConfig = {\n restrict: 'EA',\n controllerAs: name,\n bindToController: true,\n scope: true,\n controller: this.getInjectionTokens().concat([this.controllerCls])\n };\n\n if (template) {\n if (template.url) {\n directiveConfig.templateUrl = template.url;\n } else if (template.inline) {\n directiveConfig.template = template.inline;\n }\n if (template.replace) {\n directiveConfig.replace = true;\n }\n }\n\n if (bindings) {\n const scope = directiveConfig.scope = {};\n for (const binding of Object.keys(bindings)) {\n let attr = bindings[binding];\n if (!attr[0].match(/(&|=|@)/)) {\n attr = `=${attr}`;\n }\n scope[binding] = attr;\n }\n }\n\n if (events) {\n directiveConfig.link = (scope, el, attr, ctrl) => {\n if (events) {\n const eventHandlers = ctrl._eventHandlers = {};\n Object.keys(events).forEach(event => {\n if (attr[event]) {\n eventHandlers[events[event]] = locals => {\n scope.$parent.$eval(attr[event], locals);\n };\n const componentEventName = events[event];\n if (ctrl[componentEventName] instanceof ComponentEvent) {\n ctrl[componentEventName].expression = ctrl[`_${componentEventName}Expression`];\n }\n }\n });\n }\n };\n }\n\n this._module.directive(name, this.getDirective(directiveConfig));\n\n this.configure(this._module);\n }\n\n return this._module;\n }\n}\n\nexport default ComponentAnnotation;\n\nexport function Component(config) {\n return cls => {\n let componentName;\n const isConfigObject = angular.isObject(config);\n\n if (isConfigObject && config.name) {\n componentName = config.name;\n } else if (angular.isString(config)) {\n componentName = config;\n } else {\n const clsName = cls.name.replace(/component$/i, '');\n componentName = `${clsName[0].toLowerCase()}${clsName.slice(1)}`;\n }\n\n if (isConfigObject && config.dependencies) {\n addStaticGetter(cls, 'dependencies', () => config.dependencies);\n }\n addStaticGetter(cls, 'annotation', () => Annotations.getComponent(componentName, cls));\n };\n}\n\nexport function View(config) {\n return cls => {\n if (config.template) {\n addStaticGetter(cls, 'template', () => ({\n inline: config.template,\n replace: config.replace || false\n }));\n } else if (config.templateUrl) {\n addStaticGetter(cls, 'template', () => ({\n url: config.templateUrl,\n replace: config.replace || false\n }));\n }\n if (config.components) {\n addStaticGetter(cls, 'components', () => config.components);\n }\n };\n}\n\nexport function Binding(config) {\n return (cls, propertyName, descriptor) => {\n const isConfigObject = angular.isObject(config);\n let attribute = propertyName;\n\n if (isConfigObject && config.attribute) {\n attribute = config.attribute;\n } else if (angular.isString(config)) {\n attribute = config;\n }\n\n if (isConfigObject && config.expression === true) {\n attribute = `&${attribute}`;\n } else if (isConfigObject && config.string === true) {\n attribute = `@${attribute}`;\n } else {\n attribute = `=${attribute}`;\n }\n\n // For some reason these property initializers are called after\n // the bindings have already been set by angular. This causes\n // them to be set back to undefined again. Thus this override\n // to make sure we just return whatever the value was already.\n if (descriptor.initializer !== undefined) {\n descriptor.initializer = function() {\n return this[propertyName];\n };\n }\n\n addStaticGetterObjectMember(cls.constructor, 'bindings', propertyName, attribute);\n };\n}\n\nexport function Flag(config) {\n return (cls, propertyName) => {\n const attribute = config || propertyName;\n addStaticGetterObjectMember(cls.constructor, 'flags', propertyName, attribute);\n\n const propertyBinding = `_${propertyName}Flag`;\n const attributeBinding = `@${attribute}`;\n addStaticGetterObjectMember(cls.constructor, 'bindings', propertyBinding, attributeBinding);\n };\n}\n\nexport function Event() {\n return (cls, propertyName, descriptor) => {\n const attribute = `on${propertyName[0].toUpperCase()}${propertyName.slice(1)}`;\n if (!descriptor.initializer) {\n descriptor.initializer = () => {\n return new ComponentEvent();\n };\n }\n addStaticGetterObjectMember(cls.constructor, 'events', attribute, propertyName);\n addStaticGetterObjectMember(cls.constructor, 'bindings',\n `_${propertyName}Expression`, `&${attribute}`);\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/component.js"],"names":[],"mappings":"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","file":"component.js","sourcesContent":["import angular from 'angular';\n\nimport {Annotation} from './annotation';\nimport {Annotations} from './annotations';\n\nimport {addStaticGetterObjectMember, addStaticGetter} from './utils';\n\nexport const COMPONENT_ENTITY_REGEX = /^([A-Z][a-z]*)/;\n\nexport class ComponentEvent {\n expression = null;\n fire(locals) {\n this.expression(locals);\n }\n}\n\nexport class ComponentAnnotation extends Annotation {\n get controllerCls() {\n const annotation = this;\n const TargetCls = this.targetCls;\n const flags = this.flags;\n\n class ControllerCls extends TargetCls {\n constructor($scope, $log) {\n const injected = Array.from(arguments).slice(2);\n\n super(...injected);\n\n annotation.applyInjectionBindings(this, injected);\n annotation.applyDecorators(this);\n\n if (flags) {\n Object.keys(flags).forEach(flag => {\n const property = `_${flag}Flag`;\n Reflect.defineProperty(this, flag, {\n get: () => angular.isDefined(this[property]) ? this[property] !== 'false' : false\n });\n });\n }\n\n if (this.onDestroy instanceof Function) {\n $scope.$on('$destroy', this.onDestroy.bind(this));\n }\n\n if (this.activate instanceof Function) {\n this.activate();\n }\n\n this.fireComponentEvent = (event, locals) => {\n $log.warn(`\n Component.fireComponentEvent() has been deprecated in Anglue 1.x.\n Please use @Event() myEvent; in combination with this.myEvent.fire().\n `);\n if (this._eventHandlers && this._eventHandlers[event]) {\n Reflect.apply(this._eventHandlers[event], this, [locals]);\n }\n };\n }\n }\n\n return ControllerCls;\n }\n\n getInjectionTokens() {\n return ['$scope', '$log'].concat(super.getInjectionTokens());\n }\n\n get dependencies() {\n const targetCls = this.targetCls;\n return [].concat(\n targetCls.dependencies || [],\n Annotation.getModuleNames(targetCls.components)\n );\n }\n\n get template() {\n return this.targetCls.template || null;\n }\n\n get bindings() {\n return this.targetCls.bindings || null;\n }\n\n get events() {\n return this.targetCls.events || null;\n }\n\n get flags() {\n return this.targetCls.flags || null;\n }\n\n //noinspection InfiniteRecursionJS\n get getDirective() {\n return this.targetCls.getDirective || function(config) {\n return function() {\n return config;\n };\n };\n }\n\n get module() {\n if (!this._module) {\n const name = this.name;\n const template = this.template;\n const bindings = this.bindings;\n const events = this.events;\n\n this._module = angular.module(\n `components.${name}`,\n this.dependencies\n );\n\n const directiveConfig = {\n restrict: 'EA',\n controllerAs: name,\n bindToController: true,\n scope: true,\n controller: this.getInjectionTokens().concat([this.controllerCls])\n };\n\n if (template) {\n if (template.url) {\n directiveConfig.templateUrl = template.url;\n } else if (template.inline) {\n directiveConfig.template = template.inline;\n }\n if (template.replace) {\n directiveConfig.replace = true;\n }\n }\n\n if (bindings) {\n const scope = directiveConfig.scope = {};\n for (const binding of Object.keys(bindings)) {\n let attr = bindings[binding];\n if (!attr[0].match(/(&|=|@)/)) {\n attr = `=${attr}`;\n }\n scope[binding] = attr;\n }\n }\n\n if (events) {\n directiveConfig.link = (scope, el, attr, ctrl) => {\n if (events) {\n const eventHandlers = ctrl._eventHandlers = {};\n Object.keys(events).forEach(event => {\n if (attr[event]) {\n eventHandlers[events[event]] = locals => {\n scope.$parent.$eval(attr[event], locals);\n };\n const componentEventName = events[event];\n if (ctrl[componentEventName] instanceof ComponentEvent) {\n ctrl[componentEventName].expression = ctrl[`_${componentEventName}Expression`];\n }\n }\n });\n }\n };\n }\n\n this._module.directive(name, this.getDirective(directiveConfig));\n\n this.configure(this._module);\n }\n\n return this._module;\n }\n}\n\nexport default ComponentAnnotation;\n\nexport function Component(config) {\n return cls => {\n let componentName;\n const isConfigObject = angular.isObject(config);\n\n if (isConfigObject && config.name) {\n componentName = config.name;\n } else if (angular.isString(config)) {\n componentName = config;\n } else {\n const clsName = cls.name.replace(/component$/i, '');\n componentName = `${clsName[0].toLowerCase()}${clsName.slice(1)}`;\n }\n\n if (isConfigObject && config.dependencies) {\n addStaticGetter(cls, 'dependencies', () => config.dependencies);\n }\n addStaticGetter(cls, 'annotation', () => Annotations.getComponent(componentName, cls));\n };\n}\n\nexport function View(config) {\n return cls => {\n if (config.template) {\n addStaticGetter(cls, 'template', () => ({\n inline: config.template,\n replace: config.replace || false\n }));\n } else if (config.templateUrl) {\n addStaticGetter(cls, 'template', () => ({\n url: config.templateUrl,\n replace: config.replace || false\n }));\n }\n if (config.components) {\n addStaticGetter(cls, 'components', () => config.components);\n }\n };\n}\n\nexport function Binding(config) {\n return (cls, propertyName, descriptor) => {\n const isConfigObject = angular.isObject(config);\n let attribute = propertyName;\n\n if (isConfigObject && config.attribute) {\n attribute = config.attribute;\n } else if (angular.isString(config)) {\n attribute = config;\n }\n\n if (isConfigObject && config.expression === true) {\n attribute = `&${attribute}`;\n } else if (isConfigObject && config.string === true) {\n attribute = `@${attribute}`;\n } else {\n attribute = `=${attribute}`;\n }\n\n // For some reason these property initializers are called after\n // the bindings have already been set by angular. This causes\n // them to be set back to undefined again. Thus this override\n // to make sure we just return whatever the value was already.\n if (descriptor.initializer !== undefined) {\n descriptor.initializer = function() {\n return this[propertyName];\n };\n }\n\n addStaticGetterObjectMember(cls.constructor, 'bindings', propertyName, attribute);\n };\n}\n\nexport function Flag(config) {\n return (cls, propertyName) => {\n const attribute = config || propertyName;\n addStaticGetterObjectMember(cls.constructor, 'flags', propertyName, attribute);\n\n const propertyBinding = `_${propertyName}Flag`;\n const attributeBinding = `@${attribute}`;\n addStaticGetterObjectMember(cls.constructor, 'bindings', propertyBinding, attributeBinding);\n };\n}\n\nexport function Event() {\n return (cls, propertyName, descriptor) => {\n const attribute = `on${propertyName[0].toUpperCase()}${propertyName.slice(1)}`;\n if (!descriptor.initializer) {\n descriptor.initializer = () => {\n return new ComponentEvent();\n };\n }\n addStaticGetterObjectMember(cls.constructor, 'events', attribute, propertyName);\n addStaticGetterObjectMember(cls.constructor, 'bindings',\n `_${propertyName}Expression`, `&${attribute}`);\n };\n}\n"]} \ No newline at end of file diff --git a/dist/amd/store.js b/dist/amd/store.js index 1c3132d..5fa875a 100644 --- a/dist/amd/store.js +++ b/dist/amd/store.js @@ -8,7 +8,7 @@ define(['exports', 'angular', './annotation', './annotations', './behaviors/even var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; exports.Store = Store; exports.Handlers = Handlers; @@ -119,6 +119,8 @@ define(['exports', 'angular', './annotation', './annotations', './behaviors/even } function Handler(actionName) { + var override = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; + return function (cls, handlerName) { var action = actionName; if (!action) { @@ -126,7 +128,7 @@ define(['exports', 'angular', './annotation', './annotations', './behaviors/even return first.toLowerCase(); }).replace(/([A-Z])/g, '_$1').toUpperCase(); } - (0, _utils.addStaticGetterObjectMember)(cls.constructor, 'handlers', action, handlerName); + (0, _utils.addStaticGetterObjectMember)(cls.constructor, 'handlers', action, handlerName, override); }; } diff --git a/dist/amd/store.js.map b/dist/amd/store.js.map index 439ac13..9b1d293 100644 --- a/dist/amd/store.js.map +++ b/dist/amd/store.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/store.js"],"names":[],"mappings":"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","file":"store.js","sourcesContent":["import angular from 'angular';\n\nimport {Annotation} from './annotation';\nimport {Annotations} from './annotations';\nimport {EventEmitter as eventEmitterDecorator} from './behaviors/event-emitter';\n\nimport {addStaticGetterObjectMember, addStaticGetter} from './utils';\n\nexport class StoreAnnotation extends Annotation {\n get serviceName() {\n const name = this.name;\n return `${name[0].toUpperCase()}${name.slice(1)}Store`;\n }\n\n getInjectionTokens() {\n return [\n 'LuxyFlux',\n 'LuxyFluxStore',\n 'ApplicationDispatcher'\n ].concat(super.getInjectionTokens());\n }\n\n get factoryFn() {\n const TargetCls = this.targetCls;\n const annotation = this;\n\n return function(LuxyFlux, LuxyFluxStore, ApplicationDispatcher) {\n const injected = Array.from(arguments).slice(3);\n const instance = new TargetCls(...injected);\n\n annotation.applyInjectionBindings(instance, injected);\n annotation.applyDecorators(instance);\n\n return LuxyFlux.createStore({\n name: `store.${annotation.name}`,\n dispatcher: ApplicationDispatcher,\n handlers: TargetCls.handlers,\n decorate: instance\n }, LuxyFluxStore);\n };\n }\n\n get module() {\n if (!this._module) {\n this._module = angular.module(\n `stores.${this.name}`,\n this.dependencies\n );\n\n this._module.factory(\n this.serviceName,\n this.getInjectionTokens().concat([this.factoryFn])\n );\n\n this.configure(this._module);\n }\n return this._module;\n }\n}\n\nexport function Store(config) {\n return cls => {\n // Decorate a store with the EventEmitterBehavior\n eventEmitterDecorator()(cls);\n\n let storeName;\n const isConfigObject = angular.isObject(config);\n\n if (isConfigObject && config.name) {\n storeName = config.name;\n } else if (angular.isString(config)) {\n storeName = config;\n } else {\n const clsName = cls.name.replace(/store$/i, '');\n storeName = `${clsName[0].toLowerCase()}${clsName.slice(1)}`;\n }\n\n addStaticGetter(cls, 'annotation', () => Annotations.getStore(storeName, cls));\n };\n}\n\nexport function Handlers(handlers) {\n return cls => {\n Object.keys(handlers).forEach(actionName => {\n const handlerName = handlers[actionName];\n addStaticGetterObjectMember(cls, 'handlers', actionName, handlerName);\n });\n };\n}\n\nexport function Handler(actionName) {\n return (cls, handlerName) => {\n let action = actionName;\n if (!action) {\n action = handlerName\n .replace(/^on([A-Z])/, (match, first) => first.toLowerCase())\n .replace(/([A-Z])/g, '_$1').toUpperCase();\n }\n addStaticGetterObjectMember(cls.constructor, 'handlers', action, handlerName);\n };\n}\n\nexport default StoreAnnotation;\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/store.js"],"names":[],"mappings":"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","file":"store.js","sourcesContent":["import angular from 'angular';\n\nimport {Annotation} from './annotation';\nimport {Annotations} from './annotations';\nimport {EventEmitter as eventEmitterDecorator} from './behaviors/event-emitter';\n\nimport {addStaticGetterObjectMember, addStaticGetter} from './utils';\n\nexport class StoreAnnotation extends Annotation {\n get serviceName() {\n const name = this.name;\n return `${name[0].toUpperCase()}${name.slice(1)}Store`;\n }\n\n getInjectionTokens() {\n return [\n 'LuxyFlux',\n 'LuxyFluxStore',\n 'ApplicationDispatcher'\n ].concat(super.getInjectionTokens());\n }\n\n get factoryFn() {\n const TargetCls = this.targetCls;\n const annotation = this;\n\n return function(LuxyFlux, LuxyFluxStore, ApplicationDispatcher) {\n const injected = Array.from(arguments).slice(3);\n const instance = new TargetCls(...injected);\n\n annotation.applyInjectionBindings(instance, injected);\n annotation.applyDecorators(instance);\n\n return LuxyFlux.createStore({\n name: `store.${annotation.name}`,\n dispatcher: ApplicationDispatcher,\n handlers: TargetCls.handlers,\n decorate: instance\n }, LuxyFluxStore);\n };\n }\n\n get module() {\n if (!this._module) {\n this._module = angular.module(\n `stores.${this.name}`,\n this.dependencies\n );\n\n this._module.factory(\n this.serviceName,\n this.getInjectionTokens().concat([this.factoryFn])\n );\n\n this.configure(this._module);\n }\n return this._module;\n }\n}\n\nexport function Store(config) {\n return cls => {\n // Decorate a store with the EventEmitterBehavior\n eventEmitterDecorator()(cls);\n\n let storeName;\n const isConfigObject = angular.isObject(config);\n\n if (isConfigObject && config.name) {\n storeName = config.name;\n } else if (angular.isString(config)) {\n storeName = config;\n } else {\n const clsName = cls.name.replace(/store$/i, '');\n storeName = `${clsName[0].toLowerCase()}${clsName.slice(1)}`;\n }\n\n addStaticGetter(cls, 'annotation', () => Annotations.getStore(storeName, cls));\n };\n}\n\nexport function Handlers(handlers) {\n return cls => {\n Object.keys(handlers).forEach(actionName => {\n const handlerName = handlers[actionName];\n addStaticGetterObjectMember(cls, 'handlers', actionName, handlerName);\n });\n };\n}\n\nexport function Handler(actionName, override = true) {\n return (cls, handlerName) => {\n let action = actionName;\n if (!action) {\n action = handlerName\n .replace(/^on([A-Z])/, (match, first) => first.toLowerCase())\n .replace(/([A-Z])/g, '_$1').toUpperCase();\n }\n addStaticGetterObjectMember(cls.constructor, 'handlers', action, handlerName, override);\n };\n}\n\nexport default StoreAnnotation;\n"]} \ No newline at end of file diff --git a/dist/amd/utils.js b/dist/amd/utils.js new file mode 100644 index 0000000..2fd5349 --- /dev/null +++ b/dist/amd/utils.js @@ -0,0 +1,244 @@ +define(['exports', 'angular'], function (exports, _angular) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + exports.addStaticGetterObjectMember = addStaticGetterObjectMember; + exports.mergeStaticGetterObject = mergeStaticGetterObject; + exports.addStaticGetterArrayMember = addStaticGetterArrayMember; + exports.mergeStaticGetterArray = mergeStaticGetterArray; + exports.addStaticGetter = addStaticGetter; + exports.addBehavior = addBehavior; + exports.addProxies = addProxies; + exports.Inject = Inject; + exports.Decorators = Decorators; + exports.getCurrentDescriptorValue = getCurrentDescriptorValue; + exports.camelcase = camelcase; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + var _angular2 = _interopRequireDefault(_angular); + + // Static object members need to be overridden async since some keys + // need to be resolved AFTER the class has fully been defined. This is + // because some property decorators might rely on class decorator configs, + // and property decorators are called before class decorators. + + function addStaticGetterObjectMember(cls, propertyName, key, value) { + var override = arguments.length <= 4 || arguments[4] === undefined ? true : arguments[4]; + + var currentPropertyDescriptor = Reflect.getOwnPropertyDescriptor(cls, propertyName); + Reflect.defineProperty(cls, propertyName, { + configurable: true, + get: function get() { + var newObject = getCurrentDescriptorValue(currentPropertyDescriptor); + var resolvedKey = _angular2['default'].isFunction(key) ? key() : key; + if (override === true || !_angular2['default'].isDefined(newObject[resolvedKey])) { + newObject[resolvedKey] = value; + } + return newObject; + } + }); + } + + function mergeStaticGetterObject(cls, propertyName, values) { + var override = arguments.length <= 3 || arguments[3] === undefined ? true : arguments[3]; + + // Look at the explanation above addStaticGetterObjectMember to see + // why we do this override asynchronously... + var currentPropertyDescriptor = Reflect.getOwnPropertyDescriptor(cls, propertyName); + Reflect.defineProperty(cls, propertyName, { + configurable: true, + get: function get() { + return override ? Object.assign({}, getCurrentDescriptorValue(currentPropertyDescriptor), values) : Object.assign({}, values, getCurrentDescriptorValue(currentPropertyDescriptor)); + } + }); + } + + function addStaticGetterArrayMember(cls, propertyName, value) { + mergeStaticGetterArray(cls, propertyName, [value]); + } + + function mergeStaticGetterArray(cls, propertyName, values) { + var getterArray = cls[propertyName] || []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var value = _step.value; + + if (getterArray.indexOf(value) === -1) { + getterArray.push(value); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator['return']) { + _iterator['return'](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + Reflect.defineProperty(cls, propertyName, { + configurable: true, + get: function get() { + return getterArray; + } + }); + } + + function addStaticGetter(cls, property, getter) { + Reflect.defineProperty(cls, property, { configurable: true, get: getter }); + } + + function addBehavior(cls, BehaviorCls, _ref) { + var property = _ref.property; + var config = _ref.config; + var proxy = _ref.proxy; + + var internalProperty = '_' + property; + Reflect.defineProperty(cls.prototype, property, { + get: function get() { + if (!this[internalProperty]) { + this[internalProperty] = new BehaviorCls(this, config); + } + return this[internalProperty]; + } + }); + + if (proxy) { + addProxies(cls, BehaviorCls, property, proxy); + } + } + + function addProxies(cls, BehaviorCls, property, proxies) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = proxies[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var proxy = _step2.value; + + var parts = proxy.split(':'); + var localName = parts[0].trim(); + + // We don't want to override any methods that already exist in the prototype + // of the target cls. If the method already exists, its the class author's + // responsibility to call behavior methods. + /*eslint-disable no-loop-func */ + if (!Reflect.getOwnPropertyDescriptor(cls.prototype, localName)) { + (function () { + var externalName = parts[1] ? parts[1].trim() : localName; + var descriptor = Reflect.getOwnPropertyDescriptor(BehaviorCls.prototype, externalName); + + // This should be a simple property + if (_angular2['default'].isUndefined(descriptor) || _angular2['default'].isDefined(descriptor.get)) { + var proxyDescriptor = { + get: function get() { + return this[property][externalName]; + } + }; + + if (_angular2['default'].isDefined(descriptor) && _angular2['default'].isDefined(descriptor.set)) { + Object.assign(proxyDescriptor, { + set: function set(value) { + this[property][externalName] = value; + } + }); + } + + Reflect.defineProperty(cls.prototype, localName, proxyDescriptor); + } else if (_angular2['default'].isDefined(descriptor.value)) { + Reflect.defineProperty(cls.prototype, localName, { + value: function value() { + var _property; + + return (_property = this[property])[externalName].apply(_property, arguments); + } + }); + } + + /*eslint-enable no-loop-func */ + })(); + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2['return']) { + _iterator2['return'](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + + function Inject(injectionName) { + return function (cls, propertyName) { + var preparedInjectionName = injectionName; + if (!preparedInjectionName) { + preparedInjectionName = '' + propertyName[0].toUpperCase() + propertyName.slice(1); + } + addStaticGetterObjectMember(cls.constructor, 'injections', propertyName, preparedInjectionName); + }; + } + + function Decorators(decorators) { + return function (cls) { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = decorators[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var decorator = _step3.value; + + addStaticGetterArrayMember(cls, 'decorators', decorator); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3['return']) { + _iterator3['return'](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + }; + } + + function getCurrentDescriptorValue(propertyDescriptor) { + if (propertyDescriptor === undefined) { + return {}; + } else if (propertyDescriptor.get) { + return propertyDescriptor.get(); + } + return propertyDescriptor.value; + } + + function camelcase(name) { + return '' + name[0].toUpperCase() + name.slice(1); + } +}); +//# sourceMappingURL=utils.js.map diff --git a/dist/amd/utils.js.map b/dist/amd/utils.js.map new file mode 100644 index 0000000..e8c49a9 --- /dev/null +++ b/dist/amd/utils.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/utils.js"],"names":[],"mappings":"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","file":"utils.js","sourcesContent":["import angular from 'angular';\n\n// Static object members need to be overridden async since some keys\n// need to be resolved AFTER the class has fully been defined. This is\n// because some property decorators might rely on class decorator configs,\n// and property decorators are called before class decorators.\nexport function addStaticGetterObjectMember(cls, propertyName, key, value, override = true) {\n const currentPropertyDescriptor = Reflect.getOwnPropertyDescriptor(cls, propertyName);\n Reflect.defineProperty(cls, propertyName, {\n configurable: true,\n get: () => {\n const newObject = getCurrentDescriptorValue(currentPropertyDescriptor);\n const resolvedKey = angular.isFunction(key) ? key() : key;\n if (override === true || !angular.isDefined(newObject[resolvedKey])) {\n newObject[resolvedKey] = value;\n }\n return newObject;\n }\n });\n}\n\nexport function mergeStaticGetterObject(cls, propertyName, values, override = true) {\n // Look at the explanation above addStaticGetterObjectMember to see\n // why we do this override asynchronously...\n const currentPropertyDescriptor = Reflect.getOwnPropertyDescriptor(cls, propertyName);\n Reflect.defineProperty(cls, propertyName, {\n configurable: true,\n get: () => {\n return override\n ? Object.assign({}, getCurrentDescriptorValue(currentPropertyDescriptor), values)\n : Object.assign({}, values, getCurrentDescriptorValue(currentPropertyDescriptor));\n }\n });\n}\n\nexport function addStaticGetterArrayMember(cls, propertyName, value) {\n mergeStaticGetterArray(cls, propertyName, [value]);\n}\n\nexport function mergeStaticGetterArray(cls, propertyName, values) {\n const getterArray = cls[propertyName] || [];\n for (const value of values) {\n if (getterArray.indexOf(value) === -1) {\n getterArray.push(value);\n }\n }\n Reflect.defineProperty(cls, propertyName, {\n configurable: true,\n get: () => getterArray\n });\n}\n\nexport function addStaticGetter(cls, property, getter) {\n Reflect.defineProperty(cls, property, {configurable: true, get: getter});\n}\n\nexport function addBehavior(cls, BehaviorCls, {property, config, proxy}) {\n const internalProperty = `_${property}`;\n Reflect.defineProperty(cls.prototype, property, {\n get() {\n if (!this[internalProperty]) {\n this[internalProperty] = new BehaviorCls(this, config);\n }\n return this[internalProperty];\n }\n });\n\n if (proxy) {\n addProxies(cls, BehaviorCls, property, proxy);\n }\n}\n\nexport function addProxies(cls, BehaviorCls, property, proxies) {\n for (const proxy of proxies) {\n const parts = proxy.split(':');\n const localName = parts[0].trim();\n\n // We don't want to override any methods that already exist in the prototype\n // of the target cls. If the method already exists, its the class author's\n // responsibility to call behavior methods.\n /*eslint-disable no-loop-func */\n if (!Reflect.getOwnPropertyDescriptor(cls.prototype, localName)) {\n const externalName = parts[1] ? parts[1].trim() : localName;\n const descriptor = Reflect.getOwnPropertyDescriptor(BehaviorCls.prototype, externalName);\n\n // This should be a simple property\n if (angular.isUndefined(descriptor) || angular.isDefined(descriptor.get)) {\n const proxyDescriptor = {\n get() {\n return this[property][externalName];\n }\n };\n\n if (angular.isDefined(descriptor) && angular.isDefined(descriptor.set)) {\n Object.assign(proxyDescriptor, {\n set(value) {\n this[property][externalName] = value;\n }\n });\n }\n\n Reflect.defineProperty(cls.prototype, localName, proxyDescriptor);\n } else if (angular.isDefined(descriptor.value)) {\n Reflect.defineProperty(cls.prototype, localName, {\n value() {\n return this[property][externalName](...arguments);\n }\n });\n }\n\n /*eslint-enable no-loop-func */\n }\n }\n}\n\nexport function Inject(injectionName) {\n return (cls, propertyName) => {\n let preparedInjectionName = injectionName;\n if (!preparedInjectionName) {\n preparedInjectionName = `${propertyName[0].toUpperCase()}${propertyName.slice(1)}`;\n }\n addStaticGetterObjectMember(cls.constructor, 'injections',\n propertyName, preparedInjectionName);\n };\n}\n\nexport function Decorators(decorators) {\n return cls => {\n for (const decorator of decorators) {\n addStaticGetterArrayMember(cls, 'decorators', decorator);\n }\n };\n}\n\nexport function getCurrentDescriptorValue(propertyDescriptor) {\n if (propertyDescriptor === undefined) {\n return {};\n } else if (propertyDescriptor.get) {\n return propertyDescriptor.get();\n }\n return propertyDescriptor.value;\n}\n\nexport function camelcase(name) {\n return `${name[0].toUpperCase()}${name.slice(1)}`;\n}\n"]} \ No newline at end of file