comparison src/implab/components/_ActivatableMixin.js @ 34:27e8e9e38e07 default tip

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