Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
A
AngularJS-Toaster
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Custom Issue Tracker
Custom Issue Tracker
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
angularjs
AngularJS-Toaster
Commits
ec88edac
Commit
ec88edac
authored
Aug 03, 2018
by
bingchuan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[dev]version 0.4.10
parents
Pipeline
#58
failed with stages
Changes
3
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
538 additions
and
0 deletions
+538
-0
bower.json
bower.json
+17
-0
toaster.css
toaster.css
+240
-0
toaster.js
toaster.js
+281
-0
No files found.
bower.json
0 → 100644
View file @
ec88edac
{
"name"
:
"AngularJS-Toaster"
,
"version"
:
"0.4.10"
,
"main"
:
[
"toaster.js"
,
"toaster.css"
],
"ignore"
:
[
"**/.*"
,
"node_modules"
,
"components"
],
"dependencies"
:
{
"angular"
:
">1.2.6"
,
"angular-animate"
:
">1.2.8"
}
}
toaster.css
0 → 100644
View file @
ec88edac
/*
* Toastr
* Version 2.0.1
* Copyright 2012 John Papa and Hans Fjällemark.
* All Rights Reserved.
* Use, reproduction, distribution, and modification of this code is subject to the terms and
* conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
*
* Author: John Papa and Hans Fjällemark
* Project: https://github.com/CodeSeven/toastr
*/
.toast-title
{
font-weight
:
bold
;
}
.toast-message
{
-ms-word-wrap
:
break-word
;
word-wrap
:
break-word
;
}
.toast-message
a
,
.toast-message
label
{
color
:
#ffffff
;
}
.toast-message
a
:hover
{
color
:
#cccccc
;
text-decoration
:
none
;
}
.toast-close-button
{
position
:
relative
;
right
:
-0.3em
;
top
:
-0.3em
;
float
:
right
;
font-size
:
20px
;
font-weight
:
bold
;
color
:
#ffffff
;
-webkit-text-shadow
:
0
1px
0
#ffffff
;
text-shadow
:
0
1px
0
#ffffff
;
opacity
:
0.8
;
-ms-filter
:
progid
:
DXImageTransform
.
Microsoft
.
Alpha
(
Opacity
=
80
);
filter
:
alpha
(
opacity
=
80
);
}
.toast-close-button
:hover
,
.toast-close-button
:focus
{
color
:
#000000
;
text-decoration
:
none
;
cursor
:
pointer
;
opacity
:
0.4
;
-ms-filter
:
progid
:
DXImageTransform
.
Microsoft
.
Alpha
(
Opacity
=
40
);
filter
:
alpha
(
opacity
=
40
);
}
/*Additional properties for button version
iOS requires the button element instead of an anchor tag.
If you want the anchor version, it requires `href="#"`.*/
button
.toast-close-button
{
padding
:
0
;
cursor
:
pointer
;
background
:
transparent
;
border
:
0
;
-webkit-appearance
:
none
;
}
.toast-top-full-width
{
top
:
0
;
right
:
0
;
width
:
100%
;
}
.toast-bottom-full-width
{
bottom
:
0
;
right
:
0
;
width
:
100%
;
}
.toast-top-left
{
top
:
12px
;
left
:
12px
;
}
.toast-top-center
{
top
:
12px
;
}
.toast-top-right
{
top
:
12px
;
right
:
12px
;
}
.toast-bottom-right
{
right
:
12px
;
bottom
:
12px
;
}
.toast-bottom-center
{
bottom
:
12px
;
}
.toast-bottom-left
{
bottom
:
12px
;
left
:
12px
;
}
.toast-center
{
top
:
45%
;
}
#toast-container
{
position
:
fixed
;
z-index
:
999999
;
/*overrides*/
}
#toast-container
.toast-center
,
#toast-container
.toast-top-center
,
#toast-container
.toast-bottom-center
{
width
:
100%
;
pointer-events
:
none
;
}
#toast-container
.toast-center
>
div
,
#toast-container
.toast-top-center
>
div
,
#toast-container
.toast-bottom-center
>
div
{
margin
:
auto
;
pointer-events
:
auto
;
}
#toast-container
.toast-center
>
button
,
#toast-container
.toast-top-cente
>
button
,
#toast-container
.toast-bottom-center
>
button
{
pointer-events
:
auto
;
}
#toast-container
*
{
-moz-box-sizing
:
border-box
;
-webkit-box-sizing
:
border-box
;
box-sizing
:
border-box
;
}
#toast-container
>
div
{
margin
:
0
0
6px
;
padding
:
15px
15px
15px
50px
;
width
:
300px
;
-moz-border-radius
:
3px
3px
3px
3px
;
-webkit-border-radius
:
3px
3px
3px
3px
;
border-radius
:
3px
3px
3px
3px
;
background-position
:
15px
center
;
background-repeat
:
no-repeat
;
-moz-box-shadow
:
0
0
12px
#999999
;
-webkit-box-shadow
:
0
0
12px
#999999
;
box-shadow
:
0
0
12px
#999999
;
color
:
#ffffff
;
opacity
:
0.8
;
-ms-filter
:
progid
:
DXImageTransform
.
Microsoft
.
Alpha
(
Opacity
=
80
);
filter
:
alpha
(
opacity
=
80
);
}
#toast-container
>
:hover
{
-moz-box-shadow
:
0
0
12px
#000000
;
-webkit-box-shadow
:
0
0
12px
#000000
;
box-shadow
:
0
0
12px
#000000
;
opacity
:
1
;
-ms-filter
:
progid
:
DXImageTransform
.
Microsoft
.
Alpha
(
Opacity
=
100
);
filter
:
alpha
(
opacity
=
100
);
cursor
:
pointer
;
}
#toast-container
>
.toast-info
{
background-image
:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=")
!important
;
}
#toast-container
>
.toast-wait
{
background-image
:
url("data:image/gif;base64,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")
!important
;
}
#toast-container
>
.toast-error
{
background-image
:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=")
!important
;
}
#toast-container
>
.toast-success
{
background-image
:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==")
!important
;
}
#toast-container
>
.toast-warning
{
background-image
:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=")
!important
;
}
#toast-container
.toast-top-full-width
>
div
,
#toast-container
.toast-bottom-full-width
>
div
{
width
:
96%
;
margin
:
auto
;
}
.toast
{
background-color
:
#030303
;
}
.toast-success
{
background-color
:
#51a351
;
}
.toast-error
{
background-color
:
#bd362f
;
}
.toast-info
{
background-color
:
#2f96b4
;
}
.toast-wait
{
background-color
:
#2f96b4
;
}
.toast-warning
{
background-color
:
#f89406
;
}
/*Responsive Design*/
@media
all
and
(
max-width
:
240px
)
{
#toast-container
>
div
{
padding
:
8px
8px
8px
50px
;
width
:
11em
;
}
#toast-container
.toast-close-button
{
right
:
-0.2em
;
top
:
-0.2em
;
}
}
@media
all
and
(
min-width
:
241px
)
and
(
max-width
:
480px
)
{
#toast-container
>
div
{
padding
:
8px
8px
8px
50px
;
width
:
18em
;
}
#toast-container
.toast-close-button
{
right
:
-0.2em
;
top
:
-0.2em
;
}
}
@media
all
and
(
min-width
:
481px
)
and
(
max-width
:
768px
)
{
#toast-container
>
div
{
padding
:
15px
15px
15px
50px
;
width
:
25em
;
}
}
/*
* AngularJS-Toaster
* Version 0.3
*/
:not
(
.no-enter
)
#toast-container
>
div
.ng-enter
,
:not
(
.no-leave
)
#toast-container
>
div
.ng-leave
{
-webkit-transition
:
1000ms
cubic-bezier
(
0.250
,
0.250
,
0.750
,
0.750
)
all
;
-moz-transition
:
1000ms
cubic-bezier
(
0.250
,
0.250
,
0.750
,
0.750
)
all
;
-ms-transition
:
1000ms
cubic-bezier
(
0.250
,
0.250
,
0.750
,
0.750
)
all
;
-o-transition
:
1000ms
cubic-bezier
(
0.250
,
0.250
,
0.750
,
0.750
)
all
;
transition
:
1000ms
cubic-bezier
(
0.250
,
0.250
,
0.750
,
0.750
)
all
;
}
:not
(
.no-enter
)
#toast-container
>
div
.ng-enter.ng-enter-active
,
:not
(
.no-leave
)
#toast-container
>
div
.ng-leave
{
opacity
:
0.8
;
}
:not
(
.no-leave
)
#toast-container
>
div
.ng-leave.ng-leave-active
,
:not
(
.no-enter
)
#toast-container
>
div
.ng-enter
{
opacity
:
0
;
}
\ No newline at end of file
toaster.js
0 → 100644
View file @
ec88edac
(
function
()
{
'use strict'
;
/*
* AngularJS Toaster
* Version: 0.4.10
*
* Copyright 2013 Jiri Kavulak.
* All Rights Reserved.
* Use, reproduction, distribution, and modification of this code is subject to the terms and
* conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
*
* Author: Jiri Kavulak
* Related to project of John Papa and Hans Fjällemark
*/
angular
.
module
(
'toaster'
,
[
'ngAnimate'
])
.
constant
(
'toasterConfig'
,
{
'limit'
:
0
,
// limits max number of toasts
'tap-to-dismiss'
:
true
,
'close-button'
:
false
,
'newest-on-top'
:
true
,
//'fade-in': 1000, // done in css
//'on-fade-in': undefined, // not implemented
//'fade-out': 1000, // done in css
// 'on-fade-out': undefined, // not implemented
//'extended-time-out': 1000, // not implemented
'time-out'
:
5000
,
// Set timeOut and extendedTimeout to 0 to make it sticky
'icon-classes'
:
{
error
:
'toast-error'
,
info
:
'toast-info'
,
wait
:
'toast-wait'
,
success
:
'toast-success'
,
warning
:
'toast-warning'
},
'body-output-type'
:
''
,
// Options: '', 'trustedHtml', 'template', 'templateWithData'
'body-template'
:
'toasterBodyTmpl.html'
,
'icon-class'
:
'toast-info'
,
'position-class'
:
'toast-top-right'
,
'title-class'
:
'toast-title'
,
'message-class'
:
'toast-message'
,
'mouseover-timer-stop'
:
true
// stop timeout on mouseover and restart timer on mouseout
})
.
service
(
'toaster'
,
[
'$rootScope'
,
'toasterConfig'
,
function
(
$rootScope
,
toasterConfig
)
{
this
.
pop
=
function
(
type
,
title
,
body
,
timeout
,
bodyOutputType
,
clickHandler
)
{
if
(
angular
.
isObject
(
type
))
{
var
params
=
type
;
// NOTE: anable parameters as pop argument
this
.
toast
=
{
type
:
params
.
type
,
title
:
params
.
title
,
body
:
params
.
body
,
timeout
:
params
.
timeout
,
bodyOutputType
:
params
.
bodyOutputType
,
clickHandler
:
params
.
clickHandler
};
}
else
{
this
.
toast
=
{
type
:
type
,
title
:
title
,
body
:
body
,
timeout
:
timeout
,
bodyOutputType
:
bodyOutputType
,
clickHandler
:
clickHandler
};
}
$rootScope
.
$emit
(
'toaster-newToast'
);
};
this
.
clear
=
function
()
{
$rootScope
.
$emit
(
'toaster-clearToasts'
);
};
for
(
var
type
in
toasterConfig
[
'icon-classes'
])
{
this
[
type
]
=
(
function
(
toasterType
){
return
function
(
title
,
body
,
timeout
,
bodyOutputType
,
clickHandler
)
{
if
(
angular
.
isString
(
title
))
this
.
pop
(
toasterType
,
title
,
body
,
timeout
,
bodyOutputType
,
clickHandler
);
else
this
.
pop
(
angular
.
extend
(
title
,
{
type
:
toasterType
}));
}
})(
type
);
}
}])
.
factory
(
'toasterRegisterEvents'
,
function
()
{
var
toasterFactory
=
{
_NewToastEvent
:
false
,
_ClearAllToastsEvent
:
false
,
registerNewToastEvent
:
function
(){
this
.
_NewToastEvent
=
true
;
},
registerClearAllToastsEvent
:
function
(){
this
.
_ClearAllToastsEvent
=
true
;
},
isRegisteredNewToastEvent
:
function
(){
return
this
.
_NewToastEvent
;
},
isRegisteredClearAllToastsEvent
:
function
(){
return
this
.
_ClearAllToastsEvent
;
}
}
return
{
registerNewToastEvent
:
toasterFactory
.
registerNewToastEvent
,
registerClearAllToastsEvent
:
toasterFactory
.
registerClearAllToastsEvent
,
isRegisteredNewToastEvent
:
toasterFactory
.
isRegisteredNewToastEvent
,
isRegisteredClearAllToastsEvent
:
toasterFactory
.
isRegisteredClearAllToastsEvent
}
})
.
directive
(
'toasterContainer'
,
[
'$parse'
,
'$rootScope'
,
'$interval'
,
'$sce'
,
'toasterConfig'
,
'toaster'
,
'toasterRegisterEvents'
,
function
(
$parse
,
$rootScope
,
$interval
,
$sce
,
toasterConfig
,
toaster
,
toasterRegisterEvents
)
{
return
{
replace
:
true
,
restrict
:
'EA'
,
scope
:
true
,
// creates an internal scope for this directive
link
:
function
(
scope
,
elm
,
attrs
)
{
var
id
=
0
,
mergedConfig
;
mergedConfig
=
angular
.
extend
({},
toasterConfig
,
scope
.
$eval
(
attrs
.
toasterOptions
));
scope
.
config
=
{
position
:
mergedConfig
[
'position-class'
],
title
:
mergedConfig
[
'title-class'
],
message
:
mergedConfig
[
'message-class'
],
tap
:
mergedConfig
[
'tap-to-dismiss'
],
closeButton
:
mergedConfig
[
'close-button'
],
animation
:
mergedConfig
[
'animation-class'
],
mouseoverTimer
:
mergedConfig
[
'mouseover-timer-stop'
]
};
scope
.
deregClearToasts
=
null
;
scope
.
deregNewToast
=
null
;
scope
.
$on
(
"$destroy"
,
function
()
{
if
(
scope
.
deregClearToasts
)
scope
.
deregClearToasts
();
if
(
scope
.
deregNewToast
)
scope
.
deregNewToast
();
scope
.
deregClearToasts
=
null
;
scope
.
deregNewToast
=
null
;
});
scope
.
configureTimer
=
function
configureTimer
(
toast
)
{
var
timeout
=
typeof
(
toast
.
timeout
)
==
"number"
?
toast
.
timeout
:
mergedConfig
[
'time-out'
];
if
(
timeout
>
0
)
setTimeout
(
toast
,
timeout
);
};
function
addToast
(
toast
)
{
toast
.
type
=
mergedConfig
[
'icon-classes'
][
toast
.
type
];
if
(
!
toast
.
type
)
toast
.
type
=
mergedConfig
[
'icon-class'
];
id
++
;
angular
.
extend
(
toast
,
{
id
:
id
});
// Set the toast.bodyOutputType to the default if it isn't set
toast
.
bodyOutputType
=
toast
.
bodyOutputType
||
mergedConfig
[
'body-output-type'
];
switch
(
toast
.
bodyOutputType
)
{
case
'trustedHtml'
:
toast
.
html
=
$sce
.
trustAsHtml
(
toast
.
body
);
break
;
case
'template'
:
toast
.
bodyTemplate
=
toast
.
body
||
mergedConfig
[
'body-template'
];
break
;
case
'templateWithData'
:
var
fcGet
=
$parse
(
toast
.
body
||
mergedConfig
[
'body-template'
]);
var
templateWithData
=
fcGet
(
scope
);
toast
.
bodyTemplate
=
templateWithData
.
template
;
toast
.
data
=
templateWithData
.
data
;
break
;
}
scope
.
configureTimer
(
toast
);
if
(
mergedConfig
[
'newest-on-top'
]
===
true
)
{
scope
.
toasters
.
unshift
(
toast
);
if
(
mergedConfig
[
'limit'
]
>
0
&&
scope
.
toasters
.
length
>
mergedConfig
[
'limit'
])
{
scope
.
toasters
.
pop
();
}
}
else
{
scope
.
toasters
.
push
(
toast
);
if
(
mergedConfig
[
'limit'
]
>
0
&&
scope
.
toasters
.
length
>
mergedConfig
[
'limit'
])
{
scope
.
toasters
.
shift
();
}
}
toast
.
mouseover
=
false
;
}
function
setTimeout
(
toast
,
time
)
{
toast
.
timeout
=
$interval
(
function
()
{
if
(
!
toast
.
mouseover
)
scope
.
removeToast
(
toast
.
id
);
},
time
);
}
scope
.
toasters
=
[];
if
(
!
toasterRegisterEvents
.
isRegisteredNewToastEvent
()){
toasterRegisterEvents
.
registerNewToastEvent
();
scope
.
deregNewToast
=
$rootScope
.
$on
(
'toaster-newToast'
,
function
()
{
addToast
(
toaster
.
toast
);
});
}
if
(
!
toasterRegisterEvents
.
isRegisteredClearAllToastsEvent
()){
toasterRegisterEvents
.
registerClearAllToastsEvent
();
scope
.
deregClearToasts
=
$rootScope
.
$on
(
'toaster-clearToasts'
,
function
()
{
scope
.
toasters
.
splice
(
0
,
scope
.
toasters
.
length
);
});
}
},
controller
:
[
'$scope'
,
'$element'
,
'$attrs'
,
function
(
$scope
,
$element
,
$attrs
)
{
$scope
.
stopTimer
=
function
(
toast
)
{
toast
.
mouseover
=
true
;
if
(
$scope
.
config
.
mouseoverTimer
===
true
)
{
if
(
toast
.
timeout
)
{
$interval
.
cancel
(
toast
.
timeout
);
toast
.
timeout
=
null
;
}
}
};
$scope
.
restartTimer
=
function
(
toast
)
{
toast
.
mouseover
=
false
;
if
(
$scope
.
config
.
mouseoverTimer
===
true
)
{
if
(
!
toast
.
timeout
)
$scope
.
configureTimer
(
toast
);
}
else
if
(
toast
.
timeout
===
null
)
{
$scope
.
removeToast
(
toaster
.
id
);
}
};
$scope
.
removeToast
=
function
(
id
)
{
var
i
=
0
;
for
(
i
;
i
<
$scope
.
toasters
.
length
;
i
++
)
{
if
(
$scope
.
toasters
[
i
].
id
===
id
)
break
;
}
$scope
.
toasters
.
splice
(
i
,
1
);
};
$scope
.
click
=
function
(
toaster
,
isCloseButton
)
{
if
(
$scope
.
config
.
tap
===
true
||
isCloseButton
==
true
)
{
var
removeToast
=
true
;
if
(
toaster
.
clickHandler
)
{
if
(
angular
.
isFunction
(
toaster
.
clickHandler
))
{
removeToast
=
toaster
.
clickHandler
(
toaster
,
isCloseButton
);
}
else
if
(
angular
.
isFunction
(
$scope
.
$parent
.
$eval
(
toaster
.
clickHandler
)))
{
removeToast
=
$scope
.
$parent
.
$eval
(
toaster
.
clickHandler
)(
toaster
,
isCloseButton
);
}
else
{
console
.
log
(
"TOAST-NOTE: Your click handler is not inside a parent scope of toaster-container."
);
}
}
if
(
removeToast
)
{
$scope
.
removeToast
(
toaster
.
id
);
}
}
};
}],
template
:
'<div id="toast-container" ng-class="[config.position, config.animation]">'
+
'<div ng-repeat="toaster in toasters" class="toast" ng-class="toaster.type" ng-click="click(toaster)" ng-mouseover="stopTimer(toaster)" ng-mouseout="restartTimer(toaster)">'
+
'<button class="toast-close-button" ng-show="config.closeButton" ng-click="click(toaster, true)">×</button>'
+
'<div ng-class="config.title">{{toaster.title}}</div>'
+
'<div ng-class="config.message" ng-switch on="toaster.bodyOutputType">'
+
'<div ng-switch-when="trustedHtml" ng-bind-html="toaster.html"></div>'
+
'<div ng-switch-when="template"><div ng-include="toaster.bodyTemplate"></div></div>'
+
'<div ng-switch-when="templateWithData"><div ng-include="toaster.bodyTemplate"></div></div>'
+
'<div ng-switch-default >{{toaster.body}}</div>'
+
'</div>'
+
'</div>'
+
'</div>'
};
}]);
})(
window
,
document
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment