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 }); |