Mercurial > pub > ImplabJs
comparison src/implab/components/_ActivatableMixin.js @ 0:fc2517695ee1
Initial commit, draft import of existing work
| author | cin |
|---|---|
| date | Thu, 01 Jun 2017 13:20:03 +0300 |
| parents | |
| children | 7d7059d2a810 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:fc2517695ee1 |
|---|---|
| 1 define([ "dojo/_base/declare", "./guard", "./StateMachine", "./_LogMixin", ], | |
| 2 | |
| 3 function(declare, guard, StateMachine, _LogMixin) { | |
| 4 | |
| 5 var states = { | |
| 6 inactive : { | |
| 7 activate : "activating" | |
| 8 }, | |
| 9 activating : { | |
| 10 success : "active", | |
| 11 failed : "inactive" | |
| 12 }, | |
| 13 active : { | |
| 14 deactivate : "deactivating" | |
| 15 }, | |
| 16 deactivating : { | |
| 17 success : "inactive", | |
| 18 failed : "active" | |
| 19 } | |
| 20 }; | |
| 21 | |
| 22 return declare([ _LogMixin ], { | |
| 23 _controller : null, | |
| 24 | |
| 25 _active : null, | |
| 26 | |
| 27 constructor : function() { | |
| 28 this._active = new StateMachine({ | |
| 29 states : states, | |
| 30 initial : "inactive" | |
| 31 }); | |
| 32 }, | |
| 33 | |
| 34 /** | |
| 35 * @returns {Object} контроллер для активации текущей компоненты | |
| 36 */ | |
| 37 getController : function() { | |
| 38 return this._controller; | |
| 39 }, | |
| 40 | |
| 41 /** | |
| 42 * @param {Object} | |
| 43 * v Контроллер для активации текущей компоненты | |
| 44 */ | |
| 45 setController : function(v) { | |
| 46 this._controller = v; | |
| 47 }, | |
| 48 | |
| 49 /** | |
| 50 * @returns {Boolean} текущая компонента активна | |
| 51 */ | |
| 52 isActive : function() { | |
| 53 return this._active.current == "active"; | |
| 54 }, | |
| 55 | |
| 56 assertActive : function() { | |
| 57 if (!this.isActive()) | |
| 58 throw new Error("The object must be active to perform the operation"); | |
| 59 }, | |
| 60 | |
| 61 /** | |
| 62 * Активирует текущую компоненту, если у текущей компоненты задан | |
| 63 * контроллер, то активация будет осуществляться через него | |
| 64 * | |
| 65 * @async | |
| 66 * @param{Boolean} | |
| 67 * direct вызов должен осуществится напрямую, без участия | |
| 68 * контроллера. | |
| 69 * @return{Boolean} успешно/неуспешно | |
| 70 */ | |
| 71 activate : function(direct) { | |
| 72 var me = this; | |
| 73 if (!direct && this._controller) | |
| 74 return me._controller.activate(me).then(function() { | |
| 75 me.onActivated(); | |
| 76 }); | |
| 77 | |
| 78 me._active.move("activate"); | |
| 79 return guard(me, "onActivating").then(function() { | |
| 80 me.log("Activated"); | |
| 81 me._active.move("success"); | |
| 82 if (!me._controller) | |
| 83 me.onActivated(); | |
| 84 }, function(err) { | |
| 85 console.error(err); | |
| 86 me.error("Activation failed: {0}", err); | |
| 87 me._active.move("failed"); | |
| 88 throw err; | |
| 89 }); | |
| 90 }, | |
| 91 | |
| 92 /** | |
| 93 * Деактивирует текущую компоненту, если у компоненты задан контроллер, | |
| 94 * то деактивация будет осуществляться через него. | |
| 95 * | |
| 96 * @async | |
| 97 * @param{Boolean} direct вызов должен осуществится напрямую, без | |
| 98 * участия контроллера. | |
| 99 * | |
| 100 */ | |
| 101 deactivate : function(direct) { | |
| 102 var me = this; | |
| 103 if (!direct && me._controller) | |
| 104 return me._controller.deactivate(me).then(function() { | |
| 105 me.onDeactivated(); | |
| 106 }); | |
| 107 | |
| 108 me._active.move("deactivate"); | |
| 109 return guard(me, "onDeactivating").then(function() { | |
| 110 me.log("Deactivated"); | |
| 111 me._active.move("success"); | |
| 112 if (!me._controller) | |
| 113 me.onDeactivated(); | |
| 114 }, function(err) { | |
| 115 console.error(err); | |
| 116 me.error("Deactivation failed: {0}", err); | |
| 117 me.move("failed"); | |
| 118 throw err; | |
| 119 }); | |
| 120 | |
| 121 }, | |
| 122 | |
| 123 toogleActive : function() { | |
| 124 var me = this; | |
| 125 return (me.isActive() ? me.deactivate() : me.activate()).then(function() { | |
| 126 return me.isActive(); | |
| 127 }); | |
| 128 }, | |
| 129 | |
| 130 /** | |
| 131 * Событие вызывается перед активацией текущей компоненты | |
| 132 * | |
| 133 * @returns{Boolean|undefined} если false - активация будет отменена | |
| 134 */ | |
| 135 onActivating : function() { | |
| 136 }, | |
| 137 | |
| 138 /** | |
| 139 * Событие вызывается перед деактивацией текущей компоненты | |
| 140 * | |
| 141 * @returns {Boolean|undefined} если false - деактивация будет отменена | |
| 142 */ | |
| 143 onDeactivating : function() { | |
| 144 }, | |
| 145 | |
| 146 /** | |
| 147 * Событие вызывается после активации текущей компоненты | |
| 148 */ | |
| 149 onActivated : function() { | |
| 150 }, | |
| 151 | |
| 152 /** | |
| 153 * Событие вызывается после деактивации текущей компоненты | |
| 154 */ | |
| 155 onDeactivated : function() { | |
| 156 } | |
| 157 | |
| 158 }); | |
| 159 }); |
