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