ember-nav-stack 6.0.3 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +5 -0
- package/addon/components/nav-stack/component.js +3 -1
- package/addon/services/nav-stacks.js +35 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -25,6 +25,11 @@ Usage
|
|
|
25
25
|
|
|
26
26
|
[Longer description of how to use the addon in apps.]
|
|
27
27
|
|
|
28
|
+
Testing
|
|
29
|
+
------------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
`ember-nav-stack` registers waiters for stack recomputes and transition animations. Ember's built-in test helpers such as `visit` and `click` wait for these operations automatically, so downstream apps should not need custom "nav stack idle" helpers or manual `waitFor` calls.
|
|
32
|
+
|
|
28
33
|
|
|
29
34
|
Contributing
|
|
30
35
|
------------------------------------------------------------------------------
|
|
@@ -520,7 +520,6 @@ export default class NavStack extends Component {
|
|
|
520
520
|
this.parentHeaderElement,
|
|
521
521
|
this.currentHeaderElement,
|
|
522
522
|
);
|
|
523
|
-
run(this.args, this.args.back);
|
|
524
523
|
} else {
|
|
525
524
|
setTransform(this.containerElement, `translateX(${this.startingX}px)`);
|
|
526
525
|
styleHeaderElements(
|
|
@@ -544,6 +543,9 @@ export default class NavStack extends Component {
|
|
|
544
543
|
}
|
|
545
544
|
this.navStacksService.notifyTransitionEnd();
|
|
546
545
|
this._activeSpring = null;
|
|
546
|
+
if (shouldNavigateBack) {
|
|
547
|
+
run(this.args, this.args.back);
|
|
548
|
+
}
|
|
547
549
|
};
|
|
548
550
|
if (fromValue === toValue && initialVelocity === 0) {
|
|
549
551
|
finalize();
|
|
@@ -5,10 +5,13 @@ import EmberObject from '@ember/object';
|
|
|
5
5
|
import { Promise as EmberPromise } from 'rsvp';
|
|
6
6
|
import { buildWaiter } from '@ember/test-waiters';
|
|
7
7
|
import { set } from '@ember/object';
|
|
8
|
-
let
|
|
8
|
+
let transitionWaiter = buildWaiter('ember-nav-stack:transition');
|
|
9
|
+
let stackWaiter = buildWaiter('ember-nav-stack:stack-update');
|
|
9
10
|
|
|
10
11
|
export default class NavStacks extends Service {
|
|
11
|
-
|
|
12
|
+
transitionToken;
|
|
13
|
+
_stackUpdateToken;
|
|
14
|
+
_initialRenderToken;
|
|
12
15
|
|
|
13
16
|
constructor() {
|
|
14
17
|
super(...arguments);
|
|
@@ -18,6 +21,7 @@ export default class NavStacks extends Service {
|
|
|
18
21
|
this._counter = 1;
|
|
19
22
|
this._runningTransitions = 0;
|
|
20
23
|
this.isInitialRender = true;
|
|
24
|
+
this._initialRenderToken = stackWaiter.beginAsync();
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
pushItem(sourceId, layer, component, headerComponent) {
|
|
@@ -46,15 +50,20 @@ export default class NavStacks extends Service {
|
|
|
46
50
|
notifyTransitionStart() {
|
|
47
51
|
this._runningTransitions++;
|
|
48
52
|
if (this._runningTransitions === 1) {
|
|
49
|
-
this.
|
|
53
|
+
this.transitionToken = transitionWaiter.beginAsync();
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
notifyTransitionEnd() {
|
|
54
58
|
this._runningTransitions--;
|
|
59
|
+
if (this._runningTransitions < 0) {
|
|
60
|
+
this._runningTransitions = 0;
|
|
61
|
+
}
|
|
55
62
|
if (this._runningTransitions === 0) {
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
if (this.transitionToken) {
|
|
64
|
+
transitionWaiter.endAsync(this.transitionToken);
|
|
65
|
+
}
|
|
66
|
+
this.transitionToken = undefined;
|
|
58
67
|
}
|
|
59
68
|
next(() => {
|
|
60
69
|
this._maybeResolveIdle();
|
|
@@ -84,7 +93,12 @@ export default class NavStacks extends Service {
|
|
|
84
93
|
didUpdate() {} // hook
|
|
85
94
|
|
|
86
95
|
_maybeResolveIdle() {
|
|
87
|
-
if (
|
|
96
|
+
if (
|
|
97
|
+
this._runningTransitions === 0 &&
|
|
98
|
+
!this._stackUpdateToken &&
|
|
99
|
+
!this._initialRenderToken &&
|
|
100
|
+
this._resolveWaiting
|
|
101
|
+
) {
|
|
88
102
|
let resolveWaiting = this._resolveWaiting;
|
|
89
103
|
this._resolveWaiting = null;
|
|
90
104
|
this._waitingPromise = null;
|
|
@@ -93,12 +107,16 @@ export default class NavStacks extends Service {
|
|
|
93
107
|
}
|
|
94
108
|
|
|
95
109
|
_schedule() {
|
|
110
|
+
if (!this._stackUpdateToken) {
|
|
111
|
+
this._stackUpdateToken = stackWaiter.beginAsync();
|
|
112
|
+
}
|
|
96
113
|
scheduleOnce('afterRender', this, this._process);
|
|
97
114
|
}
|
|
98
115
|
|
|
99
116
|
_process() {
|
|
100
117
|
let newStacks = {};
|
|
101
118
|
let itemsById = this._itemsById;
|
|
119
|
+
let wasInitialRender = this.isInitialRender === true;
|
|
102
120
|
|
|
103
121
|
for (var sourceId in itemsById) {
|
|
104
122
|
let { layer, component, headerComponent, order } = itemsById[sourceId];
|
|
@@ -117,6 +135,17 @@ export default class NavStacks extends Service {
|
|
|
117
135
|
}
|
|
118
136
|
this._listeners.invoke('stackItemsDidChange');
|
|
119
137
|
this.didUpdate();
|
|
138
|
+
next(() => {
|
|
139
|
+
if (wasInitialRender && this._initialRenderToken) {
|
|
140
|
+
stackWaiter.endAsync(this._initialRenderToken);
|
|
141
|
+
this._initialRenderToken = undefined;
|
|
142
|
+
}
|
|
143
|
+
if (this._stackUpdateToken) {
|
|
144
|
+
stackWaiter.endAsync(this._stackUpdateToken);
|
|
145
|
+
this._stackUpdateToken = undefined;
|
|
146
|
+
}
|
|
147
|
+
this._maybeResolveIdle();
|
|
148
|
+
});
|
|
120
149
|
}
|
|
121
150
|
|
|
122
151
|
_clearIsInitialRender() {
|