Skip to content

Commit ae7d624

Browse files
authored
Merge pull request #383 from afzal273/issue-374-progress-bar
Adding progress bar component
2 parents b5b0664 + 9d6fb3c commit ae7d624

File tree

14 files changed

+326
-106
lines changed

14 files changed

+326
-106
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ jobs:
2222
- name: Check out a copy of the repo
2323
uses: actions/checkout@v2
2424

25+
- uses: mansona/npm-lockfile-version@v1
26+
2527
- name: Use Node.js ${{ env.NODE_VERSION }}
2628
uses: actions/setup-node@v2-beta
2729
with:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@
2626
/package.json.ember-try
2727

2828
.vscode
29+
.idea
2930
.changelog

addon/components/es-progress-bar.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import Component from '@glimmer/component';
2+
import { inject as service } from '@ember/service';
3+
4+
export default class EsProgressBarComponent extends Component {
5+
@service progress;
6+
}

addon/services/progress.js

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import Service, { inject as service } from '@ember/service';
2+
import { htmlSafe } from '@ember/string';
3+
import { tracked } from '@glimmer/tracking';
4+
import { action } from '@ember/object';
5+
6+
import { rawTimeout, task, timeout } from 'ember-concurrency';
7+
import { buildWaiter } from 'ember-test-waiters';
8+
9+
const SPEED = 200;
10+
11+
let waiter = buildWaiter('progress-bar');
12+
13+
export default class ProgressService extends Service {
14+
@service router;
15+
16+
count = 0;
17+
progress = 0;
18+
19+
@tracked _style = '';
20+
21+
constructor() {
22+
super(...arguments);
23+
24+
this.router.on('routeWillChange', this.onRouteWillChange);
25+
}
26+
27+
willDestroy() {
28+
this.router.off('routeWillChange', this.onRouteWillChange);
29+
30+
super.willDestroy(...arguments);
31+
}
32+
33+
get style() {
34+
return htmlSafe(this._style);
35+
}
36+
37+
@action
38+
async onRouteWillChange(transition) {
39+
this.counterTask.perform(transition.promise);
40+
}
41+
42+
increaseCounter() {
43+
this.count += 1;
44+
this.updateTask.perform();
45+
}
46+
47+
decreaseCounter() {
48+
this.count -= 1;
49+
}
50+
51+
@task(function* (promise) {
52+
// if the promise resolves on the next tick, we don't show the loading bar
53+
let resolved = false;
54+
promise.then(() => {
55+
resolved = true;
56+
});
57+
yield timeout(0);
58+
59+
if (!resolved) {
60+
try {
61+
this.increaseCounter();
62+
yield promise;
63+
} finally {
64+
this.decreaseCounter();
65+
}
66+
}
67+
})
68+
counterTask;
69+
70+
@(task(function* () {
71+
let token = waiter.beginAsync();
72+
73+
this.progress = 0;
74+
this._style = `width: 0%`;
75+
76+
while (this.count !== 0) {
77+
yield rawTimeout(SPEED);
78+
79+
let currentAmount;
80+
if (this.progress >= 0 && this.progress < 0.2) {
81+
currentAmount = 0.1;
82+
} else if (this.progress >= 0.2 && this.progress < 0.5) {
83+
currentAmount = 0.04;
84+
} else if (this.progress >= 0.5 && this.progress < 0.8) {
85+
currentAmount = 0.02;
86+
} else if (this.progress >= 0.8 && this.progress < 0.99) {
87+
currentAmount = 0.005;
88+
} else {
89+
currentAmount = 0;
90+
}
91+
92+
this.progress += currentAmount;
93+
if (this.progress > 0.998) {
94+
this.progress = 0.998;
95+
}
96+
97+
this._style = `transition: width ${SPEED}ms linear; width: ${
98+
this.progress * 100
99+
}%`;
100+
}
101+
102+
this._style = `transition: width ${SPEED}ms linear; width: 100%`;
103+
yield rawTimeout(SPEED);
104+
this._style = `transition: opacity ${
105+
SPEED * 2
106+
}ms linear; width: 100%; opacity: 0`;
107+
108+
waiter.endAsync(token);
109+
}).drop())
110+
updateTask;
111+
}

addon/styles/addon.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@
2525
@import 'components/es-header.css';
2626
@import 'components/es-note.css';
2727
@import 'components/es-sidebar.css';
28+
@import 'components/es-progress-bar.css';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.progress-bar {
2+
position: fixed;
3+
left: 0;
4+
top: 0;
5+
height: 3px;
6+
box-shadow: 0 0 10px rgba(0, 13, 41, 0.6);
7+
background: var(--color-brand) !important;
8+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div class="progress-bar" aria-hidden style={{this.progress.style}} ...attributes></div>

app/components/es-progress-bar.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from 'ember-styleguide/components/es-progress-bar';

app/services/progress.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from 'ember-styleguide/services/progress';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from 'ember-styleguide/templates/components/es-progress-bar';

0 commit comments

Comments
 (0)