-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbootstrap-4-notifications-sample.js
246 lines (199 loc) · 6.89 KB
/
bootstrap-4-notifications-sample.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
$(function () {
var count = 6;
var lastCount = 0;
// Pour la maquette
var notifications = new Array();
notifications.push({
href: "#",
image: "Modification",
texte: "Votre incident " + makeBadge("17-0253") + " a été modifié",
date: "Mercredi 10 Mai, à 9h53"
});
notifications.push({
href: "#",
image: "Horloge",
texte: "Vous avez " + makeBadge("13") + " incidents en retards",
date: "Mercredi 10 Mai, à 8h00"
});
notifications.push({
href: "#",
image: "Visible",
texte: "Un nouvel incident dans votre groupe " + makeBadge("réseau"),
date: "Mardi 9 Mai, à 18h12"
});
notifications.push({
href: "#",
image: "Ajout",
texte: "Ouverture du problème " + makeBadge("17-0008"),
date: "Mardi 9 Mai, à 15h23"
});
notifications.push({
href: "#",
image: "Annulation",
texte: "Clotûre du problème " + makeBadge("17-0007"),
date: "Mardi 9 Mai, à 12h16"
});
notifications.push({
href: "#",
image: "Recherche",
texte: "Ouverture de l'incident " + makeBadge("17-1234") + " depuis le portail web",
date: "Mardi 9 Mai, à 10h14"
});
function makeBadge(texte) {
return "<span class=\"badge badge-default\">" + texte + "</span>";
}
appNotifications = {
// Initialisation
init: function () {
// On masque les éléments
$("#notificationsBadge").hide();
$("#notificationAucune").hide();
// On bind le clic sur les notifications
$("#notifications-dropdown").on('click', function () {
var open = $("#notifications-dropdown").attr("aria-expanded");
// Vérification si le menu est ouvert au moment du clic
if (open === "false") {
appNotifications.loadAll();
}
});
// On charge les notifications
appNotifications.loadAll();
// Polling
// Toutes les 3 minutes on vérifie si il n'y a pas de nouvelles notifications
setInterval(function () {
appNotifications.loadNumber();
}, 180000);
// Binding de marquage comme lue desktop
$('.notification-read-desktop').on('click', function (event) {
appNotifications.markAsReadDesktop(event, $(this));
});
},
// Déclenche le chargement du nombre et des notifs
loadAll: function () {
// On ne charge les notifs que si il y a une différence
// Ou si il n'y a aucune notifs
if (count !== lastCount || count === 0) {
appNotifications.load();
}
appNotifications.loadNumber();
},
// Masque de chargement pour l'icône et le badge
badgeLoadingMask: function (show) {
if (show === true) {
$("#notificationsBadge").html(appNotifications.badgeSpinner);
$("#notificationsBadge").show();
// Mobile
$("#notificationsBadgeMobile").html(count);
$("#notificationsBadgeMobile").show();
}
else {
$("#notificationsBadge").html(count);
if (count > 0) {
$("#notificationsIcon").removeClass("fa-bell-o");
$("#notificationsIcon").addClass("fa-bell");
$("#notificationsBadge").show();
// Mobile
$("#notificationsIconMobile").removeClass("fa-bell-o");
$("#notificationsIconMobile").addClass("fa-bell");
$("#notificationsBadgeMobile").show();
}
else {
$("#notificationsIcon").addClass("fa-bell-o");
$("#notificationsBadge").hide();
// Mobile
$("#notificationsIconMobile").addClass("fa-bell-o");
$("#notificationsBadgeMobile").hide();
}
}
},
// Indique si chargement des notifications
loadingMask: function (show) {
if (show === true) {
$("#notificationAucune").hide();
$("#notificationsLoader").show();
} else {
$("#notificationsLoader").hide();
if (count > 0) {
$("#notificationAucune").hide();
}
else {
$("#notificationAucune").show();
}
}
},
// Chargement du nombre de notifications
loadNumber: function () {
appNotifications.badgeLoadingMask(true);
// TODO : API Call pour récupérer le nombre
// TEMP : pour le template
setTimeout(function () {
$("#notificationsBadge").html(count);
appNotifications.badgeLoadingMask(false);
}, 1000);
},
// Chargement de notifications
load: function () {
appNotifications.loadingMask(true);
// On vide les notifs
$('#notificationsContainer').html("");
// Sauvegarde du nombre de notifs
lastCount = count;
// TEMP : pour le template
setTimeout(function () {
// TEMP : pour le template
for (i = 0; i < count; i++) {
var template = $('#notificationTemplate').html();
template = template.replace("{{href}}", notifications[i].href);
template = template.replace("{{image}}", notifications[i].image);
template = template.replace("{{texte}}", notifications[i].texte);
template = template.replace("{{date}}", notifications[i].date);
$('#notificationsContainer').append(template);
}
// On bind le marquage comme lue
$('.notification-read').on('click', function (event) {
appNotifications.markAsRead(event, $(this));
});
// On arrête le chargement
appNotifications.loadingMask(false);
// On réactive le bouton
$("#notifications-dropdown").prop("disabled", false);
}, 1000);
},
// Marquer une notification comme lue
markAsRead: function (event, elem) {
// Permet de garde la liste ouverte
event.preventDefault();
event.stopPropagation();
// Suppression de la notification
elem.parent('.dropdown-notification').remove();
// TEMP : pour le template
count--;
// Mise à jour du nombre
appNotifications.loadAll();
},
// Marquer une notification comme lue version bureau
markAsReadDesktop: function (event, elem) {
// Permet de ne pas change de page
event.preventDefault();
event.stopPropagation();
// Suppression de la notification
elem.parent('.dropdown-notification').removeClass("notification-unread");
elem.remove();
// On supprime le focus
if (document.activeElement) {
document.activeElement.blur();
}
// TEMP : pour le template
count--;
// Mise à jour du nombre
appNotifications.loadAll();
},
add: function () {
lastCount = count;
count++;
},
// Template du badge
badgeSpinner: '<i class="fa fa-spinner fa-pulse fa-fw" aria-hidden="true"></i>'
};
appNotifications.init();
});