Skip to content

Commit 2d88775

Browse files
committed
Merge pull request #267 from huboard/discorick/beef_up_the_flash_component
Implements Sticky and Progress flashes
2 parents 3ee05bd + 929dea1 commit 2d88775

5 files changed

Lines changed: 106 additions & 10 deletions

File tree

app/assets/stylesheets/components/_flash-message.scss

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,35 @@
88

99
.message {
1010
position: relative;
11-
background: $hb-purple-dark;
1211
color: white;
1312
font-size: 13px;
1413
text-align: center;
1514
padding: 8px;
1615
margin-bottom: 4px;
1716
box-shadow: -1px 2px 2px rgba(0,0,0,0.5);
17+
18+
.ui-icon-x-thin {
19+
position: relative;
20+
bottom: 5px;
21+
float: right;
22+
font-size: 8px;
23+
margin-left: -16px;
24+
margin-right: -8px;
25+
}
26+
}
27+
28+
.info {
29+
background: $hb-purple-dark;
30+
}
31+
32+
.warning {
33+
background: $hb-red;
34+
}
35+
36+
.hb-spinner {
37+
position: relative;
38+
float: right;
39+
right: 28px;
40+
bottom: 4px;
1841
}
1942
}

ember-app/app/components/flash/hb-flash-message.js

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
11
import Ember from 'ember';
22

3+
//##Usage Info:
4+
//
5+
//Inject the `flashMessages: Ember.inject.service()` into the
6+
//target Ember Class
7+
//
8+
//##Standard Info Toast:
9+
//
10+
//`this.get('flashMessages').info('Some Message');
11+
//
12+
//##Sticky Toast:
13+
//
14+
//`this.get('flashMessages').add({
15+
// message: 'Some Message',
16+
// sticky: true,
17+
// type: 'info|warning'
18+
//})`
19+
//
20+
//##Progress Toast:
21+
//
22+
//(Note: the callback uses the context of the flash-message component)
23+
//
24+
//`var progress = {
25+
// status: true,
26+
// callback: function(){
27+
// this.set('message', 'completed!');
28+
// this.get('flash')._setTimer('timer', 'destroyMessage', 2000)
29+
// }
30+
//}`
31+
//
32+
//`setTimeout(function(){
33+
// Ember.set(progress, 'status', false);
34+
//}, 10000)`
35+
//
36+
//`this.get('flashMessages').add({
37+
// message: 'Some Message',
38+
// sticky: true,
39+
// progress: progress,
40+
// type: 'info|warning'
41+
//})`
42+
343
var HbFlashMessageComponent = Ember.Component.extend({
444
classNames: ['hb-flash-message'],
545
flashMessages: Ember.inject.service(),
@@ -19,10 +59,11 @@ var HbFlashMessageComponent = Ember.Component.extend({
1959
} else if(index > max) {
2060
_self.resetTimer(flash, this.get('timer') * 2);
2161
}
22-
})
62+
});
2363
}.observes('flashMessages.queue.[]', 'currentFlash.[]'),
2464
addToQueue: function(flash, current){
2565
var _self = this;
66+
flash.id = _.uniqueId('flash');
2667
flash.on('didDestroyMessage', ()=>{
2768
_self.scheduleRemove(flash);
2869
});
@@ -31,10 +72,10 @@ var HbFlashMessageComponent = Ember.Component.extend({
3172
if(first && !first.isDestroying){
3273
this.resetTimer(first, this.get('timer') / 2);
3374
}
34-
if(!flash.get('sticky')){
35-
this.resetTimer(flash, this.get('timer'));
36-
}
37-
current.unshiftObject(flash);
75+
this.resetTimer(flash, this.get('timer'));
76+
77+
var index = this.determineIndex(flash);
78+
current.insertAt(index, flash);
3879
},
3980
scheduleRemove: function(flash){
4081
var current = this.get('currentFlash');
@@ -51,20 +92,29 @@ var HbFlashMessageComponent = Ember.Component.extend({
5192
},
5293
removeFlash: function(flash, callback){
5394
this.set("removingFlash", true);
54-
if(this.get("currentFlash").length === 1){
95+
if(this.get("currentFlash").indexOf(flash) === 0){
5596
return this.$(".message").first().animate({
5697
'top': '-=38px'
5798
}, 400, callback);
5899
}
59-
this.$(".message").last().animate({
100+
this.$(`.message.${flash.id}`).first().animate({
60101
'top': '+=8px',
61102
'opacity': 'hide'
62103
}, 400, callback);
63104
},
64105
resetTimer: function(flash, time){
106+
if(flash.get('sticky')){ return; }
65107
flash._cancelTimer("timer");
66108
flash._cancelTimer("exitTimer");
67109
flash._setTimer("timer", "destroyMessage", time);
110+
},
111+
determineIndex: function(flash){
112+
var current = this.get('currentFlash');
113+
var sticky = current.find((f)=> {return f.sticky});
114+
if(sticky){
115+
return current.indexOf(sticky) + 1;
116+
}
117+
return 0;
68118
}
69119
});
70120

ember-app/app/components/flash/hb-message.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ import Ember from 'ember';
22

33
var HbFlashComponent = Ember.Component.extend({
44
classNames: ['message'],
5+
classNameBindings: ['flash.id'],
6+
progress: Ember.computed.alias('flash.progress.status'),
7+
8+
click: function(){
9+
if(this.get('progress')){return;}
10+
var flash = this.get('flash');
11+
flash._setTimer("timer", "destroyMessage", 0);
12+
},
513

614
setMessage: function(){
715
var message = this.get('flash.message');
@@ -14,7 +22,13 @@ var HbFlashComponent = Ember.Component.extend({
1422
'top': '+=38px',
1523
'margin-bottom': '+=42px'
1624
}, 400);
17-
}
25+
},
26+
observeProgress: function(){
27+
var flash = this.get('flash');
28+
if(!flash.progress.status && flash.progress.callback){
29+
flash.progress.callback.call(this);
30+
}
31+
}.observes('progress')
1832
});
1933

2034
export default HbFlashComponent;

ember-app/app/templates/components/flash/hb-flash-message.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
{{
33
flash/hb-message
44
flash=flash
5+
class=flash.type
56
}}
67
{{/each}}
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
{{truncate message 50}}
1+
{{#if flash.sticky}}
2+
<i class='ui-icon ui-icon-x-thin'></i>
3+
{{/if}}
4+
5+
<div class='message-copy'>{{truncate message 50}}</div>
6+
7+
{{#if progress}}
8+
{{hb-spinner}}
9+
{{/if}}

0 commit comments

Comments
 (0)